FINGER OF DOOM

전면 진단 보고서 · REPORT 001

시스템은 다 지었는데,
플레이어는 10층에서 멈춘다

Finger of Doom을 코드·화면·게임성·연출·기획·밸런스·아트·운영·시장의 10개 시선으로 각각 분해하고, 중대 지적은 반증을 시도해 살아남은 것만 남겼습니다.

DATE 2026-08-23 VERSION 0.1.1 DOMAINS 10 FINDINGS 139 CODE 15,670 LINES
01

한 장 요약

54 / 100
“완성된 알파가 아니라, 검증되지 않은 알파

로그라이크 한 판을 굴리는 시스템은 전부 서 있고, 데이터 파이프라인과 코드 규율은 인디 상위권입니다. 그런데 실기기에서 한 런을 끝까지 완주시켜 본 적이 없습니다. 그래서 최상위 보상인 피닉스 펫을 얻은 플레이어가 부활하는 순간 전투가 영구 정지하고, 펫 레벨은 재시작마다 초기화되며, 안드로이드 뒤로가기는 앱을 즉시 종료시킵니다.

99.4%GDScript 정적 타입 커버리지
715개 함수 중 4개 예외
0%스테이지 20 이후 생존율
프로젝트 자체 시뮬레이터 기준
35%GameConfig 튜닝 값 배선율
80개 중 28개만 런타임에 도달
156마지막 커밋 이후 경과일
2026-03-20 → 오늘
CORE 이 프로젝트에 부족한 것은 코드도 에셋도 아닙니다. 한 판을 끝까지 플레이해 본 사람입니다.
02

도메인 스코어카드

잘 지은 곳과 무너진 곳이 뚜렷하게 갈린다

0 25 50 75 100 AVG 48 아키텍처 62 코드 품질 56 UI · UX 54 기획 정합성 54 연출 · 게임필 52 게임 디자인 47 아트 디렉션 46 제품 · 시장 41 밸런스 34 운영 · 출시 31
도메인별 성숙도 점수 (0–100). 각 도메인 전문 에이전트가 코드·데이터를 직접 읽고 독립 산정.
  • 상위 — 아키텍처 · 코드 품질. 타입 규율, 데이터 리소스화, 로컬라이제이션은 실제로 지켜지고 있습니다. 문서에만 있는 규칙이 아닙니다.
  • 중위 — 화면 · 기획 · 연출 · 게임성 · 아트. 만들어졌지만 서로 연결되거나 다듬어지지 않았습니다.
  • 하위 — 밸런스 · 출시 준비. 이 둘이 지금 게임을 출시 불가 상태로 붙잡고 있는 병목입니다.
± 도메인 평균은 48이지만 최종 판정은 54입니다. 반증 검증에서 몇몇 지적이 과장으로 밝혀져 상향 조정됐습니다 — 그 교정 내역은 13번 슬라이드에 있습니다.
03

먼저, 지켜야 할 것

이건 진짜로 잘 되어 있다

아래 항목들은 인디 규모에서 흔치 않습니다. 앞으로의 개선이 이것들을 훼손하지 않아야 합니다.

CODE

타입 규율 99.4%

715개 함수 중 반환 타입이 없는 건 4개뿐. untyped_declaration 경고를 켜두고 실제로 지켰습니다.

DATA

데이터 주도 설계

13개 데이터 클래스 · @export 307개 · 문서 주석 322개 · .tres 105개. 기획자가 코드 없이 튜닝할 수 있는 구조가 실제로 섰습니다.

i18n

번역 누락 0건

키 316개 · tr() 191회 · 매칭 100%. 하드코딩 한글 UI는 단 1곳.

ART

반투명 픽셀 0%

몬스터 24장 · 아이템 아이콘 677장 전수 검사에서 anti-alias 픽셀 0개. AI 생성 픽셀아트가 가장 흔히 실패하는 지점을 통과했습니다.

PERF

전투 화면 116노드

모바일 기준 매우 가벼운 씬 예산. 텍스처 필터도 전역·노드 양쪽에서 일관되게 Nearest.

TOOLS

자체 밸런스 시뮬레이터

수집 366줄 + 시뮬 597줄 파이프라인이 실제로 헤드리스 실행됩니다. 1인 팀에서는 이례적인 자산입니다.

NOTE 시뮬레이터는 이미 스테이지 20 붕괴를 정확히 예측해 두었습니다. 도구는 있었고, 그 출력을 아무도 읽지 않았을 뿐입니다.
04

치명적 발견 #1

두 곡선이 한 번도 만나지 않는다

몬스터 HP는 스테이지마다 복리로 오르고, 플레이어 성장은 덧셈입니다. 지수 대 선형이라 격차는 벌어지기만 합니다.

1 10 100 1K 10K 100K 1M 10 20 40 60 80 스테이지 ST.10 WALL 피격 261 vs HP 100 374,059 160 보스전 예상 누적 피격 플레이어 최대 HP
세로축 로그 스케일. 표시된 점은 밸런스 분석이 게임 코드를 그대로 재현해 산출한 값이며, 그 사이 구간은 직선 보간입니다.
1.06^s몬스터 HP 증가
20스테이지마다 ×3.2 (복리)
+0.5레벨당 ATK 증가
전사 기준 고정 가산
2,338x스테이지 80 격차
예상 피격 374,059 vs HP 160

정확히는 — 죽는 이유는 “느려서”가 아니라 “물러서”다

2차 분석에서 공식을 그대로 재현해 확인한 결과, TTK(처치 소요 시간)는 문제가 아니었습니다. 스테이지 40에서도 보스를 36초면 잡습니다. 문제는 그 36초를 버티지 못한다는 것입니다.

스테이지 1 → 40 변화배수성장 형태
플레이어 최대 HP (103 → 205)2.0배로그 — 레벨에 묶여 있음
보스전 1회에 받는 총 피해 (72 → 2,133)30배지수 — 스테이지에 묶여 있음

플레이어 HP가 로그로 자라는 이유는 레벨업 요구 경험치가 ×1.35 복리로 폭증하는데 스테이지당 획득 XP는 스케일이 아예 없기 때문입니다(xp = monster_data.gold — 30층 고블린도 4XP). 최대 HP는 90 + 5×(레벨−1) 이므로 레벨이 로그면 HP도 로그입니다.

의미 로그 대 지수는 상수를 어떻게 바꿔도 메울 수 없습니다. 보스 HP를 깎는 것으로는 해결되지 않고, 플레이어의 성장을 스테이지에 연동시키거나(XP 스케일링) 게임을 그 전에 끝내야 합니다. 실행 설계 보고서가 두 번째 길을 택한 이유입니다.
05

치명적 발견 #1 — 결과

스테이지 20부터는 이길 수 있는 사람이 없다

0% 25% 50% 75% 100% 1 10 20 30 40 50 ST.20 → 0% 이 지점 이후 전 구간 생존 0 스테이지 · 프로젝트 자체 시뮬레이터(마법사 기준)
출처: 프로젝트에 이미 존재하는 scripts/tools/balance_simulator.gd 의 산출물 data/balance/simulation_result.json (2026-02-01 생성, 이후 미조치).
ST.10런 중앙값 종료 지점
warrior 400런 재현
42.2s스테이지 10 보스 TTK
슬라임 킹
261그동안 받는 피해
플레이어 최대 HP는 100
70시뮬레이터가 이미 낸 경고
밸런스 스코어 0 / 100
06

치명적 발견 #2

만든 것의 대부분을 아무도 보지 못한다

몬스터 24종 도달 가능성 — 5종만 밝게, 19종은 어둡게, 매니페스트 누락 보스 4종은 붉은 테두리
실제 게임 스프라이트 24종 전부입니다. 위 2줄은 일반·엘리트·미니보스, 아래 줄은 보스 8종(등장 순).
■ 금색 테두리 = 런 중앙값(스테이지 10)에서 실제로 조우하는 5종 · ■ 붉은 테두리 = 매니페스트 누락으로 모바일 빌드에서 아예 사라지는 보스 4종 · 나머지 어두운 것들은 만들어졌지만 도달할 수 없는 몬스터입니다.
제작된 몬스터 24 24종 전부 고유 스프라이트 완성 빌드에 포함 20 보스 4종이 매니페스트 누락 → 모바일 빌드에서 소실 한 런에서 조우 5 런 중앙값 종료 = 스테이지 10 실제로 이기는 몬스터 4 스테이지 10 보스는 클리어 확률 0% 만든 콘텐츠의 79%를 플레이어는 영원히 보지 못한다
몬스터 기준 도달률. 아이템·유물·이벤트·포션도 같은 구조로 잘려 나갑니다.
  • 보스 4종이 빌드에서 사라집니다. resource_manifest.tres가 47일 · 61커밋째 갱신되지 않아 boss_demon · boss_goblin_king · boss_skeleton_lord · boss_titan이 모바일 빌드에 포함되지 않습니다.
  • 미니보스 2종은 스폰 분기 자체가 없습니다. mini_golem · mini_troll은 데이터만 있고 등장하지 않습니다.
  • 해금 조건이 도달 불가입니다. 도적=스테이지 50, 마법사=스테이지 100, 요정=30. 실제 도달 중앙값은 10입니다.
  • 런당 유물 1~2개. Slay the Spire는 런당 15~25개를 줍니다. 빌드 조합이 성립할 수 없는 밀도입니다.
07

치명적 발견 #3

만들어 놓고 연결하지 않았다

이 프로젝트의 실패 양상은 “미구현”이 아니라 “미배선”입니다. 선언은 있는데 그것을 읽는 코드가 없습니다.

GameConfig 튜닝 값 런타임이 읽는 값 / 선언된 값 (검증 교정치) 28/80 시그널 API 구독자가 있는 시그널 / 선언된 시그널 4/12 VFX 설계 항목 완전 구현 / VFX_DESIGN.md 설계 12/39 몬스터 애니 프레임 다중 프레임 몬스터 / 전체 몬스터 0/24 아이템 아이콘 게임에서 쓰는 아이콘 / 보유 아이콘 42/677 터치 타깃 적합 버튼 44px 이상 버튼 / 전체 버튼 9/24
선언된 것 대비 실제로 런타임에 도달하는 것의 비율.
CRITICAL

한 줄의 조건문이 보스 밸런스 전체를 무효화한다

scripts/data/MonsterData.gd:229–233

if game_manager.has_method("get") == false: return game_manager.config — Godot 4에서 모든 Object는 get을 가지므로 이 조건은 항상 거짓이고, 함수는 언제나 null을 반환합니다. 그 결과 보스 전용 배율 7종이 통째로 무시되고 보스가 엘리트와 같은 곡선을 탑니다.

수정 — 조건절을 삭제하고 /root/GameManager를 직접 조회. 이 한 줄로 스테이지 50 보스 HP가 9,093 → 2,434로 내려갑니다.

HIGH

시그널 12개 중 8개는 구독자가 없다

scripts/autoload/GameManager.gd

monster_killed는 emit조차 되지 않습니다. 살아 있는 시그널은 player_died · level_up · pet_activated 4개뿐입니다.

08

발견 #4 · 이번 진단 중 직접 빌드해 검증

빌드의 79%가 아무도 쓰지 않는 파일이다

assets/_backup은 163MB(WAV 222개)이며 코드·씬·리소스 어디에서도 참조되지 않습니다. 그런데 6개 플랫폼 프리셋 전부가 exclude_filter가 비어 있어 모든 빌드에 실립니다.

현재 빌드 41.5 MB _backup 제외 후 8.6 MB index.pck (Web export) 참조 0건인 폴더 하나를 빼자 32.9MB 감소 (79%) 이번 진단에서 Web 빌드를 두 번 뽑아 측정. 검증팀이 .import 압축률로 독립 추정한 33MB와 일치.
이 사이트의 웹 플레이는 오른쪽(경량) 빌드로 서비스 중입니다 — 전송량 38MB → 16MB.
91.8%assets/ 중 죽은 데이터 비중
163MB / 178MB
2.0MB게임이 실제로 쓰는 이미지
PNG 724장
110MB.git 저장소 크기
클론마다 전송되는 용량
정정 처음 진단은 이것을 “Google Play 150MB 한도 초과 → 업로드 거부”라며 critical로 올렸지만, 검증 결과 WAV가 .import에서 QOA로 4.95배 압축되어 실제 패키지 기여분은 약 33MB이고 스토어 한도를 넘지 않습니다. 심각도는 medium으로 내렸습니다. 다만 웹 배포에서는 pck를 통째로 먼저 받아야 하므로 여전히 가장 아픈 곳이고, .gdignore 한 줄로 끝나는 문제라 우선순위는 유지합니다.
09

치명적 발견 #5

탭 게임인데 탭이 밋밋하다

처치 순간에는 히트스톱·화면 흔들림·플래시가 잘 들어가 있습니다. 문제는 그 전까지 반복되는 평범한 한 번의 탭입니다.

1 TAP = 11 POSSIBLE CHANNELS 몬스터 스쿼시 히트 플래시 데미지 숫자 tap.wav 햅틱 강약 구분 화면 흔들림 히트스톱 파티클 화면 플래시 탭 잔상/링 BGM 레이어 쿨다운으로 거부된 탭(초당 2회 초과분)은 11채널 전부 무반응 — 눌러도 아무 일이 없다
일반 몬스터를 한 번 탭했을 때 실제로 발화하는 피드백 채널. 처치·크리티컬 순간에는 더 많은 채널이 켜집니다.
0BGM 파일 수
play_bgm() 호출도 0회
0파티클 인스턴스
설계 문서에는 6종 프리셋
1몬스터 애니메이션 프레임
24/24종 전부 정지 이미지
WORST 쿨다운으로 거부된 탭(초당 2회 초과분)은 11개 채널 전부 무반응입니다. 연타 게임에서 누른 입력의 상당수가 아무 반응 없이 사라집니다 — 클리커 손맛의 근본 결함입니다.
10

구조 리스크

모든 길은 GameManager로 통한다

BattleScene 107 EventScene 61 HUD 34 SaveManager 27 Main 22 ShopScene 19 Monster 17 기타 7개 41 GameManager 1019 LINES 66함수 · 33상태 외부 참조 328회 / 14개 파일 — 선 굵기 = 참조 횟수
  • 1,019줄 · 66함수 · 33상태변수가 10개 책임군을 겸하고 있습니다. 그중 38개 함수는 즉시 분리 가능합니다.
  • SaveManager와 순환 참조(27 ↔ 10)를 형성했습니다. 나머지 7개 싱글톤은 단방향이라 건전합니다.
  • 몬스터 1마리 처치마다 디스크 쓰기 4회 이상. 웨이브(4마리)당 16회. 모바일 I/O로는 과합니다.
  • 저장 스키마 버저닝이 이름뿐입니다. SAVE_VERSION을 기록만 하고 로드 시 비교하지 않아 마이그레이션 경로가 0개입니다.
11

운영 리스크

개발은 9일이었고, 공백은 156일이다

52 COMMITS / 1 DAY 01-14 03-20 08-23 개발 66일 · 68커밋 공백 156일 · 커밋 0
68커밋 중 52커밋(76%)이 2026-03-19 하루에 몰려 있습니다. 실질 개발일은 9일입니다.
0자동화 테스트
15,670줄에 커버리지 0%
0CI 워크플로
.github/ 없음
0릴리스 태그
브랜치도 main 단독
0 / 9존재하는 빌드 스크립트
CLAUDE.md가 지정한 경로 자체가 없음
RISK CLAUDE.md는 ~/GodotProjects/scripts/의 빌드 스크립트 9종을 전제로 쓰여 있지만 디렉터리 자체가 존재하지 않습니다. 문서화된 릴리스 파이프라인 전체가 허구입니다. 출시 준비도는 24개 체크리스트 중 7개 = 29%.
12

전체 지적 사항

139건 · 도메인별 심각도 분포

CRITICAL HIGH MEDIUM LOW 아트 디렉션 6 3 3 1 운영 · 출시 5 4 4 1 UI · UX 4 5 5 1 기획 정합성 4 5 5 1 연출 · 게임필 3 6 4 2 코드 품질 3 6 3 2 밸런스 3 6 5 1 게임 디자인 3 5 6 2 제품 · 시장 3 4 3 0 아키텍처 2 6 3 1
36CRITICAL
50HIGH
41MEDIUM
12LOW

점수가 높은 아키텍처(62)에도 critical이 2건 있고, 점수가 낮은 운영(31)에는 5건이 있습니다. 점수는 “얼마나 잘 지었나”, 심각도는 “지금 무엇이 부서져 있나”를 각각 말합니다.

13

반증 검증

검증이 전문가를 교정한 지점

각 도메인의 critical·high 지적을 별도 검증관에게 넘겨 반증을 시도하게 했습니다. 그 결과 몇 건은 과장으로, 몇 건은 오진으로 드러났고 — 그 과정에서 아무도 못 본 결함이 새로 나왔습니다.

하향

163MB 백업 에셋 → “스토어 업로드 거부” 주장은 틀렸다

코드 품질 관점은 “150MB 한도 초과로 업로드 거부 확정”이라며 critical로 올렸습니다. 검증 결과 222개 WAV가 .import에서 QOA로 4.95배 압축되어 실제 패키지 기여분은 약 33MB, 한도 미만입니다.

결론 — critical → medium. 다만 이 진단에서 직접 빌드해 측정한 pck 차이가 32.9MB로 검증팀의 독립 추정치 33MB와 일치했습니다. 서로 다른 두 방법이 같은 숫자에 도달했습니다.

축소

“소프트락 3건” → 실제로는 1건

경로 카드 0장 · 몬스터 0마리 스폰은 도달 불가로 판명됐습니다. data/paths/에 8종이 모두 존재하고 min_stage=0이라 후보가 비지 않으며, 몬스터 쪽은 이미 폴백이 있습니다.

결론 — 확정 소프트락은 피닉스 부활 1건. 나머지 2건은 “방어 가드 부재로 인한 미래 회귀 취약점”으로 재분류했습니다.

반전

GameConfig 배선율 — 수치는 과장, 심각도는 오히려 상향

“78개 중 59개(75.6%) 미사용” 주장은 과장이었습니다. 가격 계열 18개는 get_base_price · get_inn_price 등을 통해 전부 살아 있고, 실제 미배선은 52/80(65%)입니다.

결론 — 그런데 검증 과정에서 더 나쁜 것이 나왔습니다. _get_game_config()가 항상 null을 반환해 보스 노브 6개가 통째로 무효인데, 원 주장은 이들을 “연결된 쪽”으로 분류했습니다. 정반대였습니다.

기각

“HUD가 매 프레임 폴링한다” · “ASPD 보상이 무효다”

HUD에는 _process가 아예 없습니다(grep 0건). 구조는 폴링이 아니라 BattleScene이 hud.update_*()를 호출하는 push 방식입니다. ASPD도 실제 보상 풀에 존재하지 않아 “체감 버그”가 성립하지 않습니다.

결론 — 둘 다 low로 하향. 죽은 시그널 9줄 삭제만 남습니다.

신규 발견

펫 레벨이 저장되지 않는다 — 10개 도메인 전부가 놓쳤다

scripts/autoload/SaveManager.gd:267–288

save_meta_data()가 19개 필드를 직렬화하면서 pet_data 키를 빠뜨렸습니다. 킬마다 add_pet_exp()가 디스크 쓰기를 유발하는데 그 결과가 저장되지 않아 펫 레벨이 재시작마다 초기화됩니다.

수정"pet_data": meta_data.pet_data.duplicate(true) 한 줄 추가.

WHY 검증 단계가 없었다면 이 보고서는 “스토어 업로드 불가”와 “소프트락 3건”을 사실로 실었을 것이고, 정작 진짜 문제인 펫 저장 누락은 놓쳤을 것입니다. 위험의 총량은 비슷했지만 위치가 달랐습니다.
14

방향성

단 하나만 고른다면

THE
BET
끊긴 데이터 파이프라인을 다시 잇는다

이 프로젝트가 남들과 다른 유일한 자산은 게임 아이디어가 아니라 인프라입니다 — .tres 105개, @tool 데이터 클래스 13개, card_data_editor 애드온, 963줄 헤드리스 밸런스 시뮬레이터, 24종 고유 스프라이트. 1인 개발에서 이만한 콘텐츠 폭을 유지·확장할 수 있는 유일한 레버리지입니다.

그런데 지금 그 파이프라인은 세 군데에서 끊겨 있습니다.

끊긴 곳 1

노브가 돌지 않는다

GameConfig 80개 중 52개가 런타임에 도달하지 않고, _get_game_config()는 항상 null이라 보스 밸런싱이 통째로 무효입니다.

끊긴 곳 2

같은 값이 세 곳에 다르게

티어 확률·유물 드롭률이 런타임·시뮬레이터·에디터에 각각 다른 값으로 중복 정의되어 인스펙터에 보이는 값과 실행되는 값이 다릅니다.

끊긴 곳 3

시뮬레이터가 다른 게임을 본다

963줄짜리 시뮬레이터가 예측하는 곡선과 실제 게임 곡선이 어긋나 있어, 지금까지의 밸런싱은 존재하지 않는 게임을 대상으로 이뤄졌습니다.

이걸 고치면 성립하는 것

숫자를 바꾸면 게임이 바뀐다”가 성립합니다. 그때부터 콘텐츠 확장·밸런스 튜닝·난이도 조정이 코드 수정 없이 가능해집니다. 스테이지 20의 벽도 이 위에서만 제대로 허물 수 있습니다.

이걸 고치지 않고 하면 안 되는 것

몬스터를 24종에서 48종으로 늘리는 일. 지금 상태에서 콘텐츠를 두 배로 만들면 관리 불가능한 하드코딩 더미가 두 배가 될 뿐입니다. UI 리팩터링(Main.gd 씬화, BattleScene 분해)도 이보다 뒤입니다 — 그것들은 유지보수 비용이지 레버리지가 아닙니다.

확인법 GameConfigmonster_hp_exp_scale을 1.06 → 1.20으로 바꾸고 게임을 켰을 때 스테이지 10 몬스터의 HP가 실제로 변하는가. 지금은 변하지 않습니다. 이 한 가지가 변하기 시작하면 베팅이 성공한 것입니다.
15

약 8~10주 경로

여기서 어디로 가는가

각 단계는 게이트를 통과해야 다음으로 넘어갑니다. 게이트는 “느낌”이 아니라 실기기에서 확인 가능한 조건입니다.

PHASE 0 · 3~4일

출혈 정지 — 완주 가능한 빌드 만들기

실기기 안드로이드에서 소프트락·진행도 소실 없이 1런을 처음부터 끝(사망)까지 완주시킨다. 새 기능 0건, 리팩터링 0건.

  • 사망 처리 순서 재배치 — 부활 판정을 delete_save·add_souls 앞으로 (약 10줄 이동)
  • save_meta_data()pet_data 한 줄 추가
  • quit_on_go_back=false + 뒤로가기/일시정지 핸들러
  • assets/_backup/.gdignore + 매니페스트 재생성 (보스 4종 복귀)
GATE — 실기기에서 ① 피닉스 부활 후 전투 재개 ② 앱 재실행 후 펫 레벨 유지 ③ 뒤로가기로 일시정지 열림, 3개 시나리오 통과
PHASE 1 · 1.5~2주

신뢰 회복 — 자동 검증과 데이터 파이프라인 재연결

“숫자를 바꾸면 게임이 바뀐다”와 “깨뜨리면 자동으로 걸린다”, 두 명제를 성립시킨다. 이후 모든 리팩터링의 전제 조건이다.

  • scripts/tools/validate.gd — .tres 전량 로드 · 번역 키 · 스탯 키 · 저장/로드 키 집합 · GameConfig 참조 여부 5종 검사
  • _get_game_config() 조건절 수정 (1줄, 최대 ROI)
  • 하드코딩된 스케일링·확률을 GameConfig 참조로 치환
  • 시뮬레이터 곡선과 실게임 곡선 대조 후 밸런스 재조정
GATE — monster_hp_exp_scale을 바꾸면 게임 안 HP가 실제로 변한다 · validate.gd가 CI에서 통과
PHASE 2 · 2.5~3주

모바일 셸과 타격감 — 실기기 UX 확정

“모르는 사람에게 폰을 건네도 혼자 10분 플레이할 수 있는” 상태. 여기서부터 외부 플레이테스트가 가능해진다.

  • 터치 타깃 15개를 48px 이상으로. InfoButton(22×20)은 폐기하고 카드 롱프레스로 전환
  • 20:9 단말의 미설계 세로 영역 140px 대응
  • 1탭 = 5채널 원칙 — 쿨다운 거부 탭 피드백, 타격 파티클 1종, 보스 셰이크 버그
  • BGM 도입, 튜토리얼 스킵 버튼
GATE — 모르는 테스터 3명이 설명 없이 10분 플레이해 전원 튜토리얼·첫 보상·첫 경로를 스스로 수행 · 오탭으로 인한 원치 않은 선택 0건
PHASE 3 · 3~4주

구조 정리와 출시 준비

다음 콘텐츠 확장이 안전해지는 구조를 만들고, 스토어에 올릴 수 있는 상태로 마감한다.

  • BattleScene 1,432줄 분해 — 중복 20줄 추출 → 연출 230줄 → 카드 250줄 순
  • 세이브 마이그레이션 체인 + 원자적 쓰기
  • 스토어 자산 — 아이콘 17슬롯, 스크린샷, 피처 그래픽, 개인정보처리방침
  • 플랫폼을 Android + Web으로 좁히고 나머지는 Phase 2로 강등
GATE — 콜드 클론에서 수동 개입 없이 릴리스 빌드 성공 · 내부 테스터 5명 × 3런 이상 · BattleScene 600줄 이하
순서 이 순서를 바꾸면 안 됩니다. 검증 인프라(Phase 1) 없이 구조 리팩터링(Phase 3)에 착수하면 5개월 공백으로 코드 기억이 소실된 상태에서 무엇이 깨졌는지 알 방법이 없습니다. 이번 진단에서 나온 결함 중 3건은 Phase 1의 정적 검사만으로 자동 검출됩니다.
16

Phase 0 · 즉시 착수

이번 주에 끝낼 수 있는 것들

위에서부터 순서대로. 1–5번은 “플레이어의 진행이 파괴되는” 결함이라 다른 무엇보다 먼저입니다.

#작업위치공수효과
1사망 처리 순서 재배치 — 부활 판정을 delete_save 앞으로GameManager.gd
350–359
1시간확정 소프트락 해소. 소울 이중 지급·세이브 조기 삭제도 같이 사라짐
2save_meta_data()pet_data 추가SaveManager.gd
267–288
5분펫 레벨이 재시작 후에도 유지됨 (현재는 전부 소실)
3quit_on_go_back=false + 뒤로가기/일시정지 핸들러project.godot
+ 오토로드
반나절뒤로가기 한 번에 30분 런이 날아가는 경로 제거
4_get_game_config() 조건절 수정MonsterData.gd
229
10분보스 노브 6개 부활. 최대 ROI 항목 — 단, 직후 시뮬레이터 재실행 필수
5리소스 매니페스트 재생성generate_manifest.gd5분사라졌던 보스 4종이 모바일 빌드에 복귀
6assets/_backup/.gdignore + exclude_filterexport_presets.cfg10분pck 41.5MB → 8.6MB. 웹 배포에서 특히 큰 차이
7보스 사망 셰이크 인자 순서 교정
shake(0.35, 10.0) → shake(10.0, 0.35)
Monster.gd:99910분강도 0.35로 10초간 미세하게 떠는 대신, 제대로 된 한 방이 돌아옴. 다른 호출부는 전부 정상
8쿨다운 거부 탭에 피드백 추가BattleScene.gd
375
1시간“눌러도 아무 일 없음” 제거 — 클리커 손맛의 근본 수정
9죽은 시그널 9줄 · 죽은 타이머 변수 삭제GameManager.gd
BattleScene.gd
10분“이벤트 아키텍처가 있다”는 오독 제거
10docs/current-status.md 갱신docs/20분“스프라이트 3종” 등 5개월 묵은 거짓 정보 제거
ORDER 4번(_get_game_config)은 밸런스를 바꿉니다. 고친 직후 반드시 balance_simulator를 다시 돌려 새 곡선을 확인하십시오 — 안 그러면 “고쳤더니 더 어려워졌다”가 원인 불명으로 남습니다.
17

부록

이 보고서는 어떻게 만들어졌나

STEP 1

10개 도메인 병렬 분석

코드 아키텍처 · 코드 품질 · UI/UX · 게임 디자인 · 연출 · 기획 · 밸런스 · 아트 · 운영 · 시장. 각 에이전트는 서로를 모른 채 독립적으로 저장소를 읽었습니다.

STEP 2

근거 강제

모든 지적에 file:line을 요구했습니다. 문서와 코드가 다르면 코드를 진실로 삼았습니다. 실제로 current-status.md의 스프라이트 현황은 거짓으로 판명됐습니다.

STEP 3

반증 검증

critical·high 지적을 별도 검증관에게 넘겨 반증을 시도하게 했습니다. 불확실하면 기각 쪽으로 기울이도록 지시했고, 살아남은 것만 실었습니다.

직접 실행해 확인한 것

  • Godot Web 빌드를 두 번 뽑아 _backup 유무에 따른 pck 크기를 실측 (41.5MB / 8.6MB)
  • 밸런스 시뮬레이터 헤드리스 실행 및 산출 JSON 확인
  • assets/ 전수 스캔 — 파일 수 · 용량 · 팔레트 색 수 · 반투명 픽셀 비율
  • git 히스토리 전수 스캔 — 커밋 분포 · 키스토어 유입 여부

이 보고서의 한계

  • 실제 플레이 테스트는 포함되지 않았습니다. 수치는 코드 재현과 시뮬레이터 기반입니다.
  • 재미의 판단은 정량화하지 않았습니다. 구조적 결함만 다룹니다.
  • 시장 수치는 공개 자료 기반 추정이며 이 게임에 대한 예측이 아닙니다.
NEXT 다음 보고서는 실제 플레이 세션을 기반으로 작성되어야 합니다. 이 사이트의 웹 플레이가 그 첫 단계입니다.