실행 설계 · REPORT 002
벽을 허물지 말고,
결승선으로 만든다
진단 보고서가 찾아낸 스테이지 20의 벽 — 그것을 부수는 대신, 거기에 엔딩을 놓습니다. 8개 영역의 실행 설계를 적대적 검토에 통과시킨 결과입니다.
이 설계의 출발점
가장 큰 문제를 푸는 대신, 문제가 아니게 만든다
스테이지 20에서 생존율 0%
플레이어 HP는 로그로 자라는데 보스전에서 받는 피해는 지수로 자란다 (40스테이지 동안 각각 2.0배 vs 30배). 상수를 어떻게 바꿔도 메울 수 없다.
예상 공수: 수 주. 그리고 그 결과를 검증할 방법이 아직 없다.
스테이지 20을 엔딩으로 만든다
스테이지 1~20 구간의 생존 확률은 이미 0.47~0.92로 정상 범위입니다. 문제는 21층부터입니다. 그렇다면 20층 보스를 잡으면 클리어로 정의하면 됩니다.
예상 공수: 1일. 파워 커브 전면 재설계 작업 자체가 사라진다.
범위 확정
20분에 끝나는 완결 데모 하나
MVP가 답해야 할 질문은 단 하나입니다 — “이거 재미있나?” 그 질문에 답하지 않는 모든 작업은 8주 밖으로 밀어냅니다.
itch.io 비공개 URL부터
20층 보스 = 클리어 엔딩
“한 판 더” 가 성립하는 길이
일정
8주, 매주 금요일에 빌드를 올린다
설계 #0 · 밸런스
클리어 가능한 게임까지, 숫자 하나
이 프로젝트는 “미완성 게임”이 아닙니다. 19스테이지짜리 완성된 게임 + 그 뒤에 붙은 30스테이지짜리 죽은 콘텐츠입니다. 잘라낼 곳이 데이터에 이미 찍혀 있었습니다.
| 스테이지 20 보스전 | 현재 | 목표 | 계산 |
|---|---|---|---|
| 보스 HP (orc_chief) | 278 | 165 | −41% |
| TTK (처치 소요) | 20.9초 | 12.2초 | 플레이어 DPS 13.3 기준 |
| 그동안 받는 피격 | 19회 · 114 피해 | 11회 · 66 피해 | 플레이어 최대 HP는 95 |
| 생존 확률 | 0.00 | 0.55 ~ 0.65 | “아슬아슬한 최종 보스” |
설계 #1 · 코어 루프
탭 게임인데 절반이 관람 시간이다
승리 연출 1.85초 → 0.55초, 그리고 탭으로 즉시 스킵
BattleScene.gd:564의 tween_interval(0.8) 무조건 대기 한 줄이 초반 사이클의 13%입니다. 플레이어가 이미 아는 사실을 기다리게 하는 시간입니다.
int(atk) 절삭 — +0.5 ATK 보상의 절반이 사라진다
데미지 계산이 int()로 내림 처리되어 ATK 3.5는 항상 3의 데미지를 냅니다. 보상 카드로 얻는 +0.5 ATK의 실효율이 50%입니다.
수정 — 소수부를 확률로 처리해 기댓값을 보존합니다(3.5 → 3 또는 4). 실효율 50% → 100%.
설계 #2 · 차별화 축
이 게임의 시그니처 메카닉이 잠들어 있다
동시에 누를 수 있는 손가락 수가 늘어나는 성장 — 이건 다른 클리커에 없습니다. 그런데 지금은 도달 불가능한 레벨 뒤에 잠겨 있어 아무도 보지 못합니다.
- 설계상 — base_max_touches 1에서 시작해 touch_unlock_interval마다 +1, 최대 5슬롯. 슬롯마다 독립 쿨다운.
- 실제 — 첫 추가 슬롯이 레벨 11에 걸려 있는데, 실플레이 도달 레벨은 그보다 낮습니다. 게임 전체에서 손가락은 계속 하나입니다.
- 제안 — 레벨 게이트를 폐기하고 보스 처치 보상 전용으로 옮깁니다. 시작을 2슬롯으로 올리고, 20층까지 4개의 보스가 각각 슬롯을 하나씩 줍니다.
- 효과 — 이 게임의 유일한 곱셈 성장축이 생깁니다. 지금 모든 성장은 덧셈이라 후반에 무의미해지는데, 슬롯은 DPS를 배수로 올립니다.
설계 #3 · 타격감
새로 만들지 말고, 배선을 고쳐라
설계 문서는 파티클 6종 프리셋과 BGM 6곡을 요구합니다. 1.2인 팀에는 불가능합니다. 대신 이미 있는 채널의 오류를 고치고 파라미터를 쪼갭니다.
| 작업 | 위치 | 공수 | 효과 |
|---|---|---|---|
| 보스 사망 셰이크 인자 순서 교정 shake(0.35, 10.0) → shake(12.0, 0.35) |
Monster.gd:999 | 10분 | 게임 최대 클라이맥스에 흔들림이 돌아옴 (지금은 0) |
| Engine.time_scale 토큰화 | ScreenEffects.gd | 10분 | 히트스톱과 슬로모션이 겹칠 때 서로를 취소하던 버그 해소 |
| 거부된 탭에 4채널 부여 | BattleScene.gd 373–375 | 1시간 | 0채널 → 4채널. 입력이 씹히는 감각 제거 |
| 몬스터 idle 셰이더 1개로 24종 전부 살리기 | assets/shaders/ | 반나절 | 24종이 똑같이 위아래로 뜨던 tween을 개체별 호흡·흔들림으로 대체 |
| CPUParticles 1종 + 파라미터화 | scenes/battle/ | 반나절 | 타격·사망·골드·레벨업·힐을 색/개수/크기만 바꿔 전부 커버 |
| BGM 2트랙 레이어링 | assets/audio/ | 1일 | base+tension 2곡으로 전투·엘리트·보스·저체력 4상태 커버 |
설계 #4 · 출시
6개 플랫폼 중 4개는 오늘 빌드 자체가 불가능하다
프리셋 6개가 전부 runnable=true라 준비된 것처럼 보이지만, 이 머신에는 4개 플랫폼의 export 템플릿조차 없습니다. iOS Team ID는 여전히 "NOTSETYET0"입니다.
남긴다 — 2개
Web (itch.io) — 심사 0일, 링크 하나로 피드백 수집.
“재미있는가”라는 MVP 질문에 가장 빨리 답한다.
Android (AAB) — 빌드만 하고 itch.io 첨부로 배포. 스토어 등록은 MVP 이후.
삭제한다 — 4개
Windows · macOS · Linux · iOS 프리셋. export_presets.cfg 586줄 → 293줄, 미설정 아이콘 슬롯 22개 → 7개, 서명·공증 채널 4개 → 1개. iOS만 해도 아이콘 12 + 런치스크린 11 슬롯 + 연 $99 + Xcode가 딸려옵니다.
키스토어 평문 비밀번호 4곳 — 다행히 git 히스토리 유입은 0건
전수 스캔 결과 keystore/jks/p12 패턴이 2,445개 추적 파일 중 단 1건도 없습니다. 되돌릴 수 없는 사고는 피했습니다. 다만 keystores/를 막는 .gitignore 규칙이 아직 커밋되지 않아 다른 머신에는 방어선이 없습니다.
수정 — .gitignore를 먼저 커밋하고, 평문 비밀번호를 환경변수 또는 Keychain으로 옮깁니다. filter-repo는 불필요합니다.
지금 release 빌드를 돌리면 서명 실패로 APK가 안 나온다
export_presets.cfg:41 · :136
package/signed=true 인데 keystore 관련 줄이 파일 전체에 단 하나도 없습니다. 게다가 permissions/internet=false 라 나중에 텔레메트리를 붙여도 안드로이드에서는 통신 자체가 안 됩니다 — 그것도 “네트워크 실패는 조용히 버린다”는 설계라 아무도 눈치채지 못한 채 관측 기간이 끝납니다.
확인 방법 — 이 진단에서 export_templates/4.7.1.stable/ 를 직접 확인한 결과 android와 web 템플릿만 있습니다. Windows · macOS · Linux · iOS는 “전략적으로 미루는 것”이 아니라 애초에 빌드가 불가능한 상태입니다.
없는 빌드 스크립트 9종을 “복원”하지 마라 — 문서에서 지워라
CLAUDE.md가 지시하는 ~/GodotProjects/scripts/는 디렉터리 자체가 없습니다. 플랫폼 2개에는 저장소 안의 build_web.sh · build_android.sh 두 개면 충분합니다.
설계 #5 · 지속성
진짜 리스크는 코드가 아니라 리듬이다
이 패턴의 이름은 “검증 게이트 없는 AI 폭주 + 그 뒤의 무기한 정지”입니다. 해결책은 의지력이 아니라 세 개의 기계 장치입니다.
4초짜리 커밋 게이트
pre-commit 훅에서 godot --headless --quit를 돌려 부팅 불가 커밋을 물리적으로 막습니다. 실측: 콜드 상태 4초에 스크립트 오류 179건 검출, 캐시 후 0건.
하루 3태스크 상한
하루 52커밋이 만든 것은 진척이 아니라 문서-코드 괴리였습니다. 상한을 두면 폭주가 물리적으로 불가능해지고, 대신 매일 조금씩이 가능해집니다.
완료의 정의(DoD)
“오디오/VFX 100%”가 BGM 0곡·파티클 0개 상태에서 쓰였습니다. 검증 증거 없는 완료 보고를 금지하고, 진행률 퍼센트를 문서에서 없앱니다.
설계 #6 · 아트
재제작 0장으로 화풍을 하나로 묶는다
지금 한 화면에 세 개의 픽셀아트 방언이 공존합니다 — 아이템 아이콘 평균 11.8색, 몬스터 87.7색, 배경 1,286색. 100배 격차입니다. 해법은 새로 그리는 게 아니라 이미 정답인 것을 마스터로 승격하는 것입니다.
| 작업 | 공수 | 변경 |
|---|---|---|
| 폰트 안티에일리어싱 해제 | 10분 | 픽셀 폰트 Galmuri9가 안티에일리어싱 켜진 채 임포트되어 게임 전체 텍스트가 흐렸습니다. .import 4줄 수정으로 전 화면이 즉시 선명해집니다. |
| 메인 메뉴 응급 수술 | 10분 | 배경이 150×50 3색 타일을 세로로 12.8배 늘린 것이었습니다. 이미 있는 360×640 네이티브 배경으로 교체 — 파일 1개, 6줄. |
| 픽셀 그리드 복구 | 1시간 | 몬스터 24/24종이 0.8~0.9배 소수 배율로 렌더되어 1px 아웃라인이 끊기고 있습니다. 전부 1.0으로 되돌립니다 (캔버스 리사이즈 불필요). |
| 마스터 팔레트 40색 확정 | 1시간 | 아이템 아이콘 팩의 41색 고정 팔레트가 이미 스타일 가이드 기준을 만족합니다. 이것을 마스터로 삼고 몬스터는 그레이딩으로 당깁니다. 재제작 0장. |
| 캔버스 정규화 | 1시간 | 발 높이 편차가 23px입니다(bat 23 · boss_skeleton_lord 0). 무손실 크롭 + 재패딩으로 접지선을 맞춥니다. |
| 라이선스 표기 | 30분 | 외부 에셋(UI 번들 · 아이콘 677장 · SFX · Galmuri9) 출처 표기 파일이 0건입니다. 상용 배포 전 필수. |
설계 #7 · 수익화
광고 자리에, 아직은 무료 선물을 놓는다
지금 광고 SDK를 붙이는 것은 손해입니다. 하나 붙는 순간 인터넷 권한 · 데이터 수집 신고 · 개인정보처리방침 · 정책 심사가 통째로 따라옵니다. 그런데 붙일 자리를 미리 만들어 두는 것은 공짜입니다.
Monetization 오토로드
“광고를 보면 부활” 자리에 지금은 그냥 부활을 줍니다. API 5개(is_offer_available · request_offer · get_remaining_today · has_entitlement · grant_currency)와 일일 한도 카운터만 먼저 만들어 둡니다.
나중에 Provider 상수 한 줄만 바꾸면 진짜 광고가 켜집니다.
Telemetry 오토로드 · 이벤트 12종
현재 원격 텔레메트리 이벤트는 0건입니다. 세션 길이 · 사망 스테이지 분포 · 오퍼 수락률을 모르는 상태에서 가격을 정하는 것은 추측입니다. 수집은 Cloudflare Worker + D1로 운영비 $0에 가능합니다.
가장 중요한 슬라이드
8주 동안 하지 않기로 한 것들
1.2인 팀에서 계획이 무너지는 이유는 잘못된 일을 해서가 아니라 옳은 일을 너무 많이 해서입니다. 아래는 전부 “언젠가 해야 하지만 지금은 아닌” 것들입니다.
만들지 않는다
- 파워 커브 전면 재설계 — 20층 캡 안에서는 이미 정상 범위. 21층을 자르면 이 작업이 사라진다.
- 몬스터 384프레임 애니메이션 — 추정 40시간+. 셰이더 1개로 대체.
- 파티클 시스템 신규 구축 — CPUParticles 1종 + 파라미터화로 끝낸다.
- GitHub Actions CI — 실제 사고 2종은 4초짜리 로컬 훅으로 100% 커버된다.
- 테스트 프레임워크(GUT 등) — “테스트를 쓰기 위한 준비”라는 새 백로그가 생기고 그것이 다시 미완으로 남는다.
건드리지 않는다
- Android · iOS 스토어 출시 — MVP 질문에 아무 답도 주지 않으면서 8주를 먹는다.
- Steam · 데스크톱 3종 — 9:16 세로 UI의 가로 대응 전면 재작업이 딸려온다.
- 광고 · IAP · 크래시 SDK — 하나 붙는 순간 인터넷 권한 + 데이터 수집 신고 + 정책 심사가 따라온다.
- GameManager 분해 — 스탯 파이프라인 재설계를 동반한다. 검증 인프라 없이 착수하면 위험이 이득을 초과한다.
- 새 슬래시 커맨드 · 새 PM 도구 — 이미 24개 중 실제로 산출물이 남은 건 4개뿐이다.
적대적 검토
설계안 8개 중 8개가 “수정 필요” 판정을 받았다
각 설계안을 별도의 검토자에게 넘겨 “1.2인 팀이 156일 공백 후 재개한다”는 현실을 기준으로 공격하게 했습니다. 전원이 needs_revision 을 매겼고, 그 과정에서 설계자들이 못 본 것들이 나왔습니다 — 그리고 검토자가 틀린 것도 하나 나왔습니다.
“치트 모드가 켜진 채 커밋됐다” — 절반만 맞다
data/config/game_config.tres:7 · Main.gd:191 · GameManager.gd:178
검토자는 dev_mode_enabled = true 가 커밋된 것을 근거로 “ATK 100 · HP 999 · 크리티컬 80% 치트 플레이어로 시작한다”고 판정했습니다. 직접 확인한 결과 두 가지를 혼동한 것입니다.
실제로는 — 이 플래그가 하는 일은 메인 메뉴 좌측 하단에 [DEV] 초기화 버튼을 띄우는 것 하나뿐입니다(Main.gd:190–199). 문제의 치트 스탯은 start_tutorial_game() 의 것이고, 이 함수는 TutorialScene.gd:57 에서만 호출됩니다 — 튜토리얼의 의도된 전능 연출이지 유출이 아닙니다.
남는 진짜 문제 — 그래도 true 로 커밋된 것은 버그입니다. 플레이어에게 “모든 진행도 초기화” 버튼이 그대로 노출됩니다. 클래스 기본값은 false 이므로 .tres 한 줄을 되돌리면 끝입니다. 심각도는 critical이 아니라 medium입니다.
텔레메트리를 심자면서 인터넷 권한을 끄기로 했다
export_presets.cfg:136
permissions/internet=false 입니다. 수익화 설계는 텔레메트리 12종과 Cloudflare Worker 수집을 제안하면서 이 한 줄을 단 한 번도 언급하지 않았습니다. 더 나쁜 것은 “네트워크 실패는 조용히 버린다”는 설계라 아무도 눈치채지 못한 채 30일 관측이 끝난다는 점입니다.
제안한 셰이더는 이 프로젝트에서 동작하지 않는다
“발은 고정하고 몸통만 호흡”시키려면 피벗이 바닥이어야 하는데 Monster.tscn 의 Sprite2D는 centered 기본값이라 피벗이 중앙입니다. 원점 기준 스케일이므로 발이 지면을 뚫습니다.
시간 배율 토큰화가 원래 버그보다 나쁜 버그를 만든다
보스 슬로모션 중 크리티컬 히트스톱이 겹치면 time_scale 이 0으로 눌린 뒤 토큰이 남아 복원되지 않습니다. 게임이 멈춥니다.
“인간의 손이 한계”와 “탭 속도를 곱셈 축으로”는 양립 불가
시작 2슬롯 · 쿨다운 0.30초 = 초당 6.67탭인데, 설계 스스로 인용한 인간의 지속 탭 상한은 5~6회/초입니다. 스테이지 1부터 상한을 넘어 곱셈 축이 그 순간 죽습니다.
밸런스 재설계는 벽을 없앤 게 아니라 20스테이지 옮겼다
제안된 수치를 적용해도 실력자 기준 스테이지 40 승률 1%이고, 보스 8종 중 4종은 여전히 영구히 도달 불가합니다. MVP가 20층에서 자르기로 한 판단을 오히려 뒷받침합니다.
총괄
최종 방향성
BET
이 프로젝트에 없는 것은 코드가 아니라 ‘끝난 것’입니다. 15,670줄 · 68커밋 · 8개월인데 릴리스 태그 0개, 외부 플레이어 0명입니다. 밸런스·게임필·아트·릴리스 네 도메인의 진단은 전부 “피드백 루프가 단 한 번도 닫힌 적 없다”의 하위 증상입니다.
그리고 이 베팅의 비용은 낮다 — 이번 진단에서 직접 증명했다
진단 1차는 “빌드 파이프라인이 문서상으로만 존재한다”고 결론지었습니다. 웹에 한해서는 그 결론이 틀렸습니다. godot --headless --export-release "Web" 은 오늘 이 머신에서 그대로 성공합니다.
실제로 이 분석 중에 빌드를 뽑아 이 사이트에 올렸습니다 — 빌드 3분, 배포 1분, 전송량 15.5MB. 공개 URL까지의 거리는 몇 주가 아니라 몇 시간입니다.
손가락이 늘어나는 클리커 — 보스를 잡을 때마다 화면을 두드릴 손가락이 하나씩 늘고, 20스테이지 한 판이 10분 안에 끝나는 모바일 로그라이크.
대부분의 클리커에서 플레이어의 조작 능력은 상수이고 숫자만 커집니다. 여기서는 동시에 누를 수 있는 손가락 수가 성장축이라 후반에는 실제로 손을 다 써야 합니다. 그리고 이 축은 이미 코드에 완전히 구현되어 있습니다 (BattleScene.gd:76, :254–260) — 도달 불가능한 레벨 뒤에 잠겨 있어 한 번도 플레이어 앞에 나온 적이 없을 뿐입니다.
완벽하게 만들려는 시도
6플랫폼 · 캐릭터 3종 · 무한 스테이지 · 384프레임 애니메이션 · CI · 테스트 프레임워크. 전부 옳은 일이지만, 1.2인 팀이 동시에 들면 또 156일이 됩니다.
이미 잘 만든 것
타입 규율 99.4% · 데이터 주도 .tres 105개 · 번역 누락 0건 · 반투명 픽셀 0% · 자체 밸런스 시뮬레이터. 개선이 이것들을 훼손하면 안 됩니다.
파이프라인과 리듬
숫자를 바꾸면 게임이 바뀌는 상태, 그리고 매주 금요일에 무언가를 내보내는 리듬. 이 둘이 있으면 나머지는 시간 문제입니다.
두 보고서를 한 문장으로
진단
시스템은 전부 구현됐고 데이터 파이프라인은 인디 상위권인데, 실기기에서 한 런을 끝까지 완주시켜 본 적이 없어 ‘완성된 알파’가 아니라 ‘검증되지 않은 알파’다.
설계
스테이지 20의 벽을 부수는 대신 거기에 결승선을 그어 19스테이지짜리 완성된 게임을 8주 만에 세상에 내놓고, 그때 처음으로 재미를 측정한다.