게임 코드 첫 흔적에서 서명된 첫 AAB까지 딱 7일 걸렸습니다. 그런데 한 달 뒤, 스토어에 올라가 있던 빌드에 밸런스 수정이 빠져 있다는 걸 알게 됩니다.
progress.txt에
회차와 날짜로 직접 적어 뒀기 때문입니다. 그 앞 시기는 파일 수정 시각으로 채웠습니다.
남아 있는 가장 이른 파일은 조작 처리(input.js)입니다.
한 손으로 끌어서 움직이고 자동으로 발사하는 세로 슈팅이라,
조작이 게임의 첫 결정이었습니다.
월드 배경 6종(바다·도시·산·들판·우주·코어)을 이미지 생성으로 만들기로 하고, 프롬프트를 문서로 고정했습니다. 게임 배경은 조건이 까다롭습니다.
seamless tileable · top-down orthogonal · no shadows · no vignette · dark and low-contrast so bright ships and bullets pop on top
어두워야 총알과 기체가 보이고, 그림자가 없어야 하고, 무엇보다 가장자리가 이어져야 타일로 반복했을 때 경계선이 안 생깁니다. 그래서 문서에 검수 방법까지 적어 뒀습니다 — "생성 후 2×2로 이어붙여 경계선 확인 → 보이면 재생성".
기록이 가장 빽빽한 날입니다. 오후 4시 23분부터 5시 20분까지, 한 시간 안에 아이콘·스플래시·매니페스트·방침·스토어 문구·Capacitor 설정·키스토어·첫 AAB가 전부 나왔습니다.
appId com.fivesign.starassault.
키스토어를 잃어버리면 그 앱은 영원히 업데이트할 수 없습니다.
그래서 복구 정보를 따로 파일로 남겼습니다.
비공개 테스트용 빌드입니다. 이 시점의 상태가 체크리스트에 남아 있습니다.
로직 테스트 34/34 통과 · Android Lint 오류 0 · 세로 고정 · API 36 · 광고·결제·분석 SDK는 미연결 · 유료 상품은 "준비 중"으로 잠금
돈 받는 기능을 아예 잠그고 내보냈습니다. 게임이 재미있는지부터 확인하려던 것입니다.
처음부터 한국어와 영어를 같이 준비했습니다. (한 달쯤 뒤, 출시된 다른 두 게임에서는 한국어 등록정보가 빠져 있는 걸 발견하게 됩니다.)
비공개 테스트가 돌아가는 동안 난이도 문제가 드러났습니다. 루프 4에서 막힙니다.
원인은 구조적이었습니다 — 적은 무한히 강해지는데 플레이어의 성장에는 상한이 있었습니다. 업그레이드를 다 찍고 나면 더 강해질 방법이 없으니 언젠가 반드시 벽에 부딪힙니다.
해결책은 숫자 조정이 아니라 플레이어 쪽에 새로운 축을 만드는 것이었습니다. 화면을 정리하는 폭탄, 한 대를 버티는 실드, 탄환 관통.
문제는 그게 맞는지 확인할 방법이었습니다. 직접 해보면 안 됩니다. 만든 사람은 패턴을 다 알아서 필요 이상으로 잘하고, 한 판이 몇 분씩 걸리고, 무엇보다 한 번 이겼다고 그 설정이 적당한지는 알 수 없습니다.
로직을 고친 다음 1분 뒤 시뮬레이터 파일이 생겼습니다. 화면을 그리지 않고 게임 상태만 계산해서, 사람 없이 판을 돌립니다.
240초 × 7루프 × 3시드.
같은 설정으로 서로 다른 난수 시드 3개를 돌립니다. 한 번 통과한 것과 세 번 다 통과한 것은 다른 이야기이기 때문입니다.
| 구간 | 생존율 | 의도 |
|---|---|---|
| 루프 1~4 | 모든 시드 생존 | 여기서 죽으면 안 됨 |
| 루프 5~7 | 33~67% | 의도한 고난도 구간 |
이 표가 나온 뒤에야 "밸런스가 맞다"고 말할 수 있게 됐습니다. 그전까지는 제가 재미있게 했다는 것 말고는 근거가 없었습니다.
이날부터는 progress.txt에 회차별로 직접 기록했습니다.
첫 줄이 이렇게 적혀 있습니다 — 비공개 테스트에 올라간 versionCode 1 이후의 봄·실드·관통·고루프 밸런스 변경이 Android 자산에 동기화되지 않은 상태를 확인했다.
웹으로 만들고 Capacitor로 감싸는 구조라, 웹 파일을 고치면 안드로이드 자산으로 동기화해야 앱에 반영됩니다. 그 단계를 빼먹었습니다. 결과적으로 웹에서는 고쳐진 게임을, 스토어에서는 옛 게임을 서비스하고 있었습니다. 테스트해주신 분들은 벽에 부딪히는 버전을 하고 계셨던 겁니다.
같은 회차에서 시뮬레이션을 다시 돌리고, 봄·실드·관통·부활·경계 동작을 직접 검증하는 Node 테스트를 추가했습니다.
시뮬레이터는 로직만 검사합니다. 화면은 안 봅니다. 그래서 실제 브라우저에서 시작·폭탄 사용·상점 진입을 눌러봤습니다.
① 숨겨져야 할 폭탄 버튼이 시작 화면과 상점에 노출됐습니다. CSS 우선순위 문제였습니다.
로직은 "숨김"인데 화면은 보이고 있었습니다.
② 새로 넣은 업그레이드가 번역 키 그대로 표시됐습니다.
'탄환 관통', '봄 보유량'을 추가하면서 번역을 안 넣었습니다.
고친 뒤 재발을 막는 쪽으로 한 걸음 더 갔습니다 — 지원하는 모든 언어에서 번역 누락을 검사하는 테스트를 추가했습니다. 한국어·영어·일본어·중국어 번역도 함께 채웠습니다. 테스트는 9개가 됐습니다.
버전을 1.0.1(versionCode 2)로 올렸는데 Capacitor 동기화 명령이 실행되지 않았습니다.
Node 24 Windows 환경의 os.userInfo() 메모리 오류였습니다.
네이티브 의존성 변경은 없었으므로 바뀐 웹 자산 6개를 직접 복사하고 SHA-256 해시로 6개 전부 일치를 확인했습니다. 손으로 옮길 때는 눈으로 믿지 않고 해시로 믿습니다.
서명 검증까지 통과. SHA-256을 기록에 남겼습니다.
Google Play가 versionCode 2 / versionName 1.0.1 / target SDK 36으로 인식했고, 지원 기기 감소 0대를 확인했습니다. 난독화 파일 없음 경고 1개는 비차단 경고로 확인했습니다.
출시 노트: "폭탄·실드·관통 시스템을 추가하고 고난도 구간 밸런스와 상점 표시를 개선했습니다."
같은 기록에 프로덕션 조건도 적혀 있습니다 — 테스터 12명·13일 진행, 14일 조건까지 하루 남음.
첫 빌드에서 잠가 뒀던 것들이 이때 붙기 시작했습니다.
Star Assault는 아직 비공개 테스트 단계입니다. 브라우저에서는 지금 바로 해보실 수 있고, 웹 버전이 항상 최신입니다.