데이트 일정표를 부탁했더니 16비트 RPG가 나왔다

약속 두 시간 전에 Claude한테 일정표 웹페이지를 부탁했다. 깃허브 링크 하나를 더 던졌더니 픽셀 RPG 영상이 됐다. 36초 영상을 코드 1,262줄로 만든 과정과, 차가 막혀서 일정이 실시간으로 바뀐 이야기.

데이트 일정표를 부탁했더니 16비트 RPG가 나왔다

토요일 오후 2시 43분이었다. 약속은 5시. 볼링 치고, 인형 뽑고, 밥 먹고, 카페. 머릿속에 있는 순서를 그대로 쳤다.

간략하게 심플하게 디자인 잘해서 웹페이지로 하나 만들어서 버셀로 서빙해서 줄래?

5분도 안 돼서 링크가 왔다. 지도 링크까지 달린 깔끔한 일정표였다. 여기서 끝냈어야 했는데, 얼마 전에 본 깃허브 저장소가 생각났다.

lemo-opuscar. 영상 스타일 66개를 모아둔 스킬 모음이고, 스타일마다 코드만으로 만든 단편이 하나씩 붙어 있다. Opus 5.5에 맞춰 튜닝했다고 적혀 있다. 링크를 던지고 일정표를 영상으로 만들어보라고 했다.

45분 뒤에 내 손에는 같은 일정을 담은 세로 영상이 세 개 있었다.

일정표가 16비트 RPG 화면이 된 모습

실제 영상에는 이름과 장소가 들어 있어서, 블로그용으로 그 글자만 바꿔 다시 렌더링했다.


지하철 노선도를 만들었는데, 나는 차로 간다

처음 고른 스타일은 Transit Map이었다. 일정의 정거장을 노선도처럼 잇는 36초 영상. Claude는 지도 API로 실제 좌표를 찾고, 노선 공식 색까지 확인했다. 17분 만에 나왔는데 보자마자 문제를 알았다.

나는 차로 간다.

“지하철 노선도가 무의미한디. 차라리 네이버맵처럼 가는 게 나은디.” 그 말에 Claude는 영상을 통째로 다시 짰다. OpenStreetMap에서 실제 도로를 받아오고, 자동차 아이콘이 그 길을 따라 정거장마다 멈춘다. 네이버 로고나 화면을 베끼지는 않겠다는 말도 먼저 했다. 10분 걸렸다.

이 버전은 실제 지도가 그대로 나와서 여기에 못 싣는다.

중간에 욕심이 나서 물었다. 수노 로그인 토큰을 주면 네가 노래도 만들 수 있냐고. 거절당했다. 수노는 공식 API가 없고, 깃허브에 돌아다니는 건 브라우저 세션을 쓰는 방식이라 약관 위반이고 계정이 막힐 수 있다고 했다. 비밀번호나 토큰은 아예 받지 않는다고도 했다. 대신 제목, 장르, 가사까지 프롬프트를 써줬고, 곡은 그걸로 수노에서 따로 뽑았다.

픽셀 RPG는 일정표랑 궁합이 이상하게 좋다

세 번째가 16비트 픽셀 RPG였다. 시간이 걸리니까 Claude는 이걸 백그라운드 에이전트에게 넘기고 자기는 웹페이지를 고쳤다. 20분 뒤에 영상이 왔다.

스타일 문서에 이런 원칙이 있다. 게임의 시스템이 감정을 나르게 하라. 어떤 주제든 그 안에 숨은 게임 시스템을 찾으라는 얘기다. Claude가 찾아낸 건 이랬다.

실제 일정게임에서는
역에서 픽업PARTY +1 표시와 함께 동료 합류
볼링스트라이크 순간 화면이 3, 2, 1픽셀로 흔들림
인형뽑기유리 안으로 모자이크 줌, 아이템 획득
저녁창밖 팔레트만 노을에서 밤으로 바뀜
카페 갈까 드라이브 갈까2지선다 메뉴, 손가락 커서가 왔다 갔다 망설임
혹시 영화SIDE QUEST 보너스 스테이지

파티 합류, 저녁, 사이드 퀘스트, 엔딩 화면

구조를 정하는 메모가 제일 재밌었다. 후보가 셋 있었다. 지도 위를 걷는 월드맵, 세이브 파일 목록, 옆으로 쭉 걷는 횡스크롤. 세이브 파일은 예쁜데 탈락했다. 지나간 추억처럼 읽혀서 시제가 틀렸다는 이유다. 오늘 저녁 계획이니까 앞으로 걸어가야 한다는 거다. 나는 그런 걸 고민하라고 시킨 적이 없다.

이미지 모델을 한 번도 안 썼다

여기서부터가 내가 놀란 부분이다. 생성형 이미지도, 음악 모델도 안 썼다.

  • 화면은 가로 180, 세로 320 픽셀로 그리고 6배로 키워 1080×1920을 만든다
  • 두 캐릭터는 32픽셀 스프라이트를 코드로 조립한다
  • 음악은 numpy로 파형을 합성한 칩튠이다. C장조 120BPM으로 가다가, 밤 드라이브에서 D장조로 키가 올라간다
  • 효과음과 주변음도 전부 합성이다
  • 영상 코드는 1,262줄이다. 픽셀 버퍼와 폰트 코드는 스킬에 있던 걸 가져왔고, 나머지는 이 영상용으로 새로 썼다

저작권 쪽 규칙도 스타일 문서에 박혀 있다. 기존 게임의 이름, 캐릭터, 폰트, 멜로디는 쓰지 말고 문법만 배우라는 것. 크레딧 파일까지 같이 나온다.

검수도 돌아간다. 빌드에 화면 글자가 읽을 만큼 오래 떠 있는지 재는 단계가 있어서, 노선도 영상에서는 역 이름 일곱 개가 너무 빨리 지나간다고 걸렸다. 식당 이름이 0.2초 일찍 사라지는 버그도 여기서 나왔다. 픽셀 버전은 Claude가 프레임을 띠처럼 이어 붙인 이미지를 직접 보고 넘겼다.

그리고 나는 늦었다

영상 세 개를 슬라이드로 묶은 페이지까지 3시 29분에 끝났다. 시간이 넉넉할 줄 알았다.

약속 전까지의 작업 기록

3시 50분에 도착이 5시 20분으로 밀렸다. 일정표 시간을 다 밀었다. 그러고 5시 26분에 내비가 5시 40분을 찍었다. 먼저 와서 기다리는 사람이 있는데 볼링부터 치는 게 맞나 싶어서 순서를 바꿔봤다. 카페 먼저, 밥, 볼링. 그러다 다시 볼링장으로 직행하고 커피는 테이크아웃으로 정리했다.

그 와중에 한 줄 더 쳤다. “내가 트래픽 잼 걸린 모습도 좀 넣자. 그럼 재밌잖아.”

일정표 맨 위에 정체 카드가 생겼다. 모바일에서 스와이프하면 스크롤이 튀는 버그는 5시 33분까지 고쳤다. 마지막 수정이 5시 38분이다.

영상 속 QUEST 1/6의 시계는 17:00인데, 내비는 끝까지 17:40을 가리켰다.

해보고 싶다면

  1. lemo-opuscar를 클론하고 갤러리에서 스타일을 고른다
  2. Claude Code에서 그 폴더를 열고 영상으로 만들 내용과 길이, 세로 가로를 말한다
  3. 구조 후보를 먼저 보여달라고 하면 위에 쓴 것 같은 메모를 받을 수 있다

렌더링 시간 때문에 약속 직전에 시작하는 건 추천하지 않는다. 나는 그렇게 했다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.