프로젝트 기획서 전체가 한 문장이었습니다: "미스터리 인터뷰물로 하자." 거기서 에이전트는 미스터리·라이트 호러 심문형 비주얼 노벨을 출시했습니다——세 명의 증인은 각각 세 가지 표정에 얼굴이 완전히 일치하고, 캐릭터마다 고유한 합성 보이스, 앰비언트 사운드트랙, 분기 다이얼로그, 그리고 브라우저에서 플레이 가능한 빌드까지. Floniks의 다섯 가지 능력——text-to-image, image-to-image, 배경 제거, TTS, text-to-music——이 하나의 파이프라인에서 돌아갔고, 에이전트가 엔드 투 엔드로 총괄했습니다. 사람이 쓴 프롬프트는 0개.
이 글은 2부작의 2부입니다. 1부 《스크린샷 한 장으로 퍼즐 게임 만들기》는 이 방법의 토대를 다룹니다.

한 문장이 들어가고, 게임 디자인이 나온다
"미스터리 인터뷰물로 하자"는 아래와 같이 전개되었습니다. 명시적으로 요구된 것은 하나도 없습니다:
| 사람이 말한 것 | 에이전트가 분해한 것 |
|---|---|
| "미스터리 인터뷰" | 설정: 명화 《The Gazer(응시자)》가 심야의 갤러리에서 도난; 세 증인을 심문하고 표정을 읽어 범인을 지목 |
| (말하지 않음) | 직업·성격·비밀을 가진 세 캐릭터: 테니스 코치, 회계사, 미술사 강사 |
| (말하지 않음) | 에셋 사양: 3캐릭터 × 3표정, 평범/섬뜩 두 가지 장면, 오프닝 보이스 3개, 앰비언트 루프 1곡 |
| (말하지 않음) | 타자기 자막과 표정 전환을 갖춘 분기 다이얼로그 엔진 |
| (말하지 않음) | Lua 예약어 지뢰(분기 필드명 goto)를 이름 변경으로 회피 |
초상화 파이프라인: 같은 얼굴, 네 단계
비주얼 노벨에서 가장 어려운 문제는 캐릭터 일관성——같은 얼굴이 평정·긴장·공포 세 상태를, 그것도 투명 배경으로 소화해야 합니다. 파이프라인은 전 과정 Floniks, MCP 경유입니다:

text-to-image 베이스 한 장이 얼굴·의상·분위기를 고정합니다. image-to-image가 그 베이스로부터 긴장과 공포 변형을 파생——같은 얼굴에서 표정만 움직입니다. 배경 제거가 최종 투명 스프라이트를 산출합니다. 섬뜩한 장면도 같은 방식: 깨끗한 갤러리 배경을 image-to-image로 "벽의 그림이 당신을 보고 있는" 변형으로.
보이스: 캐릭터마다 고정 음색, 계측기로 검증
사람의 요구는 한 줄이었습니다: 캐릭터마다 성별에 맞는 고유한 목소리를 고정할 것. 첫 번째 "수정 완료"는 그럴듯하게 들렸습니다——추가 질문 하나가 음향 분석을 촉발하기 전까지는: 세 목소리의 기본 주파수 실측값은 128, 122, 131 Hz. 사실상 같은 목소리였습니다. 전혀 고쳐지지 않았던 것입니다.
근본 원인은 잘못 적힌 파라미터 필드였습니다. 플랫폼이 기대한 것은 다른 형태의 voiceId였죠. 수정 후 재측정: 291, 202, 158 Hz——진짜로 서로 다른 세 목소리. 게임 데이터에 캐릭터별로 고정해 두어 재생성할 때마다 일관성이 유지됩니다.
이 교훈은 모든 AI 워크플로에 일반화됩니다: "고쳐졌다"에는 계측기 판독값이 필요하다. 인상으로는 부족하다.
스크린샷 한 장의 제보, 세 가지 근본 원인
출시 후 사람이 스크린샷 한 장을 보냈습니다: "소리는 나는데 아무도 잘려 있지 않아——셋 다 아직 배경이 붙어 있어." 에이전트의 처리 체인: 초상화 아홉 장을 전부 Floniks 배경 제거에 통과; 겸사겸사 웹 빌드의 무음 문제 수정(브라우저는 첫 상호작용까지 AudioContext를 서스펜드); 고친 그림이 여전히 안 보이자 세 번째 범인——브라우저 캐시를 특정하고 텍스처 이름을 바꿔 돌파.
증상 한 문장, 엔진 리팩터링 한 번
개발 후반, 사람이 보고한 것은 해결책이 아니라 증상이었습니다: "오디오 트랙 관리가 혼란스럽다——트랙이 겹치고 쌓인다; 체계적으로 해결해 줘." 에이전트는 엔진 오디오를 3채널로 재구축했습니다: 효과음은 겹칠 수 있지만 프레임 내 중복 제거; 같은 곡을 다시 요청해도 음악은 재시작하지 않음; 보이스 채널은 새 대사 전에 이전 대사를 멈춰 대화가 절대 겹치지 않음. 패치는 버그 하나를 고치고, 모델은 버그의 부류를 통째로 고칩니다. 컬렉션의 모든 게임이 이를 물려받았습니다.

다섯 가지 능력, 하나의 파이프라인
Floniks의 각 능력은 이미 기다리고 있던 엔진 계약 위에 착지합니다:
| 능력 | Floniks 쪽(MCP 경유 도구) | 엔진 쪽(데이터가 곧 계약) |
|---|---|---|
| 초상화 | text-to-image 베이스 + image-to-image 표정 | 텍스처는 파일명으로 로드; 호출 한 번으로 표정 전환 |
| 컷아웃 | 배경 제거 | 투명 PNG가 그대로 합성, 엔진 수정 제로 |
| 보이스 | 캐릭터별 고정 TTS | 전용 보이스 채널: 새 대사가 이전 대사를 멈춤, 겹침 없음 |
| 앰비언트 | text-to-music | 이중 재생하지 않는 뮤직 채널 |
| 스토리 | ——(에이전트가 분기 트리를 직접 작성; LLM이 곧 에디터) | 핫 리로드되는 Lua; 분기 데이터는 일반 텍스트로 diff 가능 |
1부와 같은 결론이 여기서는 더 날카롭습니다: 에이전트가 빠른 게 아니다——길에 관문이 없는 것이다. 각본, 초상화, 컷아웃, 보이스, 스코어, 테스트, 배포: 한 세션, 수동 파일 운반 제로.
완전한 크로스 플랫폼: 같은 스크립트가 네이티브에서도 브라우저에서도
이 게임은 컬렉션에서 요구 사항이 가장 까다롭습니다——초상화, 보이스, 음악, 분기 스토리——그리고 그 전부가 네이티브 macOS, 네이티브 iOS 120Hz, 브라우저 WebAssembly에서 바이트 단위로 동일한 하나의 Lua 스크립트로 구동됩니다. 브라우저 오디오 언락 같은 플랫폼 괴벽은 엔진 레이어가 흡수하고, 스크립트는 아무것도 모릅니다. 이 글의 두 스크린샷 모두 헤드리스 브라우저 안의 WASM 빌드를 라이브로 캡처한 것입니다.
질문과 답변
표정을 넘나드는 캐릭터 일관성은 어떻게 달성하나요?
캐릭터마다 text-to-image 베이스 한 장이 정체성을 고정합니다. 긴장과 공포 변형은 image-to-image로 그 베이스에서 파생되므로 변하는 것은 표정뿐입니다. 이후 배경 제거로 투명 스프라이트가 됩니다.
각 캐릭터의 목소리가 유지되는 것은 어떻게 보장하나요?
보이스 ID를 캐릭터 데이터에 고정해 TTS 생성 때마다 같은 음색을 재사용합니다——그리고 수정은 귀가 아니라 기본 주파수 측정(291 / 202 / 158 Hz)으로 검증했습니다.
첫 문장 이후 사람은 무엇을 기여했나요?
한 줄짜리 요구와 버그 제보 스크린샷뿐입니다. 조사, 분해, 생성, 디버깅, 오디오 엔진 리팩터링은 에이전트의 일이었습니다.
브라우저 버전이 정말 같은 게임을 돌리고 있나요?
네——동일한 Lua 스크립트가 바이트 단위로 네이티브와 WASM 빌드를 구동하며, 엔진이 동일 API 뒤에서 플랫폼별로 Lua VM을 교체합니다.
자신의 파이프라인은 Floniks MCP 서버로 연결하세요——이 방법의 출발점을 놓쳤다면 1부를 읽어 보세요.

