움직이지 않는 최종 보스 — NEONVOID 3막과 스팀 준비, 첫 공사 기록
P4 첫 공사 묶음이 끝났다. 3막 지도와 결말 판정, 최종 보스 코어와 과열 보스, 체험판·세이브·첫 10분이 들어갔다. 실제 게임 화면으로 정리한다.
결론부터
P4 계획을 승인하고 하루 만에 첫 공사 묶음이 끝났다. AI 에이전트 여섯이 나눠 맡아 아홉 단계를 마쳤다.
- 스팀 연동 시험, 세이브 파일화, 체험판(데모) 모드, 첫 10분 개편
- 3막 지도와 결말 판정, 3막 대본
- 최종 보스 네온보이드 코어, 변형 보스 2종, 결말 정지 장치
- 그림 3차, 막별 배경음악, 설정·키 배치·게임패드
결말 화면은 아직 없다. 지금은 코어 체력이 15%가 되면 자동으로 "재가동" 결말로 넘어간다. 결말 카드 화면, 3막 난이도와 경제, 업적, 스토어 그림은 오늘 시작한 두 번째 묶음에서 만든다.
이 글의 화면은 시안이 아니라 실제 게임 화면이다. 개발용 단축 경로로 3막을 바로 열어 찍었다.
3막 — 코어 중심부

3막은 한 번에 네 판이다. 외벽 중계(방어)를 지나면 이벤트 "코어의 질의"가 나온다. 그다음 갈림길에서 엘리트 섬멸, 호위, 숨은 미션 "기억 보관소" 중 하나를 간다. 마지막은 과열 보스와 네온보이드 코어다. 1막 4판과 2막 5판을 더하면 한 번 클리어에 13판이다.

1막에서는 코어의 신호를 듣거나, 추적하거나, 팔 수 있었다. 3막에서는 코어가 같은 질문을 직접 다시 한다.
- 대답한다: 코어 공명 +1. 숨은 미션 "기억 보관소"가 열린다.
- 방벽을 연다: 코어 체력 -15%.
- 좌표를 PULSE에게 판다: 샤드 +500.
결과는 버튼에 미리 적혀 있다. 공명이 2 이상 쌓이면 "공존" 결말이 열린다. 공명은 1막, 2막 A, 3막 이벤트에서 오른다. 2막에서 B 루트를 고른 사람은 최대 2까지만 모을 수 있다. 그래서 1막에서 "듣는다"를 골랐어야 공존에 닿는다. 처음 고른 선택이 결말까지 이어진다.
결말 세 가지가 모두 도달 가능한지는 손으로 확인하지 않는다. 2막 루트와 모든 이벤트 선택의 조합을 전수로 돌려 검사한다. 아무것도 바꾸지 않는 선택지가 하나라도 있으면 테스트가 실패한다.
고르지 않은 길의 보스가 과열돼 돌아온다

3막 중간 보스는 2막에서 고르지 않은 루트의 보스다. 라이벌 다이버 OVERCLOCK이 그 보스를 개조해 끌고 온다. A 루트를 간 사람은 과열 리퍼를, B 루트를 간 사람은 과열 스웜마더를 만난다.
새 AI는 만들지 않았다. 기존 보스에서 데이터와 색만 바꿨다.
- 과열 리퍼: 회전 빔이 반대 방향으로 한 줄 더 나간다. 돌진이 끝난 자리마다 봄버를 떨군다.
- 과열 스웜마더: 작은 스워머 대신 봄버를 찍어 낸다. 나선 탄막 간격이 5초에서 3.5초로 짧아진다.
- 둘 다 흰 코어 빛과 자홍 테두리로 구별한다. 빨강은 쓰지 않았다. 이 게임에서 빨강은 위험 예고 전용이다.
2막에서 잔향을 판 플레이어에게는 그 대가가 돌아온다. OVERCLOCK이 그 잔향을 태워 오기 때문에 보스 체력이 15% 늘고, 무전 한 줄이 GHOST의 목소리로 나온다.
지난 글에서 쓴 원칙도 그대로 지켰다. 봇이 미리 읽는 빔은 화면에도 전부 그려져야 한다. 반대쪽 쌍둥이 빔도 예고선과 판정 쐐기가 둘 다 그려지는지 시점 네 곳에서 검사한다.
최종 보스는 움직이지 않는다 — 그래서 봇이 못 깼다
네온보이드 코어는 화면에 고정된 거대한 보스다. 처음 봇으로 돌렸을 때는 어떤 수치를 넣어도 클리어가 0이었다.
원인을 재 보니 봇이 전투의 98%를 코어에서 600px 밖에서 보냈다. 봇은 보스와 적당한 거리를 두려는 힘과 탄막을 피하려는 힘을 저울질한다. 보스가 쫓아오는 2막까지는 이게 문제가 되지 않았다. 코어는 쫓아오지 않으니 봇이 멀리서 맴돌기만 했다.
그래서 코어에만 "공성" 목표를 붙였다. 더 가까이(300px) 붙고, 목표 쪽으로 세 배 세게 당긴다. 이것만으로 시험 6판이 모두 클리어됐다. 다른 보스와 기존 스테이지에는 붙지 않게 해서 동결 기록은 그대로다.
결말은 코어 체력 15%에서 고른다. 체력이 15%에 닿으면 전투가 정확히 그 자리에서 멈춘다. 한 방에 큰 피해가 들어가도 15%를 건너뛰지 못한다. 멈춘 동안에는 시간도, 난수도, 위치도 변하지 않는다. 여기서 결말 카드를 고른다.
- 재가동: 전투가 다시 돈다. 남은 15%를 실제로 깎아야 끝나고, 탄속이 40% 빨라진다.
- 공존 · 해방: 탄막이 멎고 그 자리에서 끝난다. 조건이 맞아야 카드가 열린다.
카드 화면은 지금 만들고 있다.
스팀에 내기 위한 일들

체험판: Next Fest에 낼 데모는 1막 전체다. 정식판과 같은 코드이고 빌드 옵션 하나만 다르다. 1막 보스를 잡고 2막 루트를 고르면 "정식판에서 이어집니다" 화면과 위시리스트 버튼이 뜬다. 체험판은 정식판과 같은 저장 폴더를 쓰기 때문에, 정식판을 사면 그 진행에서 그대로 이어진다.
세이브: 지금까지 세이브는 브라우저 저장소(localStorage)에 있었다. 이것을 %APPDATA%/NEONVOID/saves의 파일로 옮겼다. 쓸 때는 임시 파일에 먼저 쓴 뒤 이름을 바꾸고, 이전 판은 .bak로 남긴다. 파일이 깨지면 백업에서 복구한다. 세이브가 파일이면 Steam Cloud가 별도 SDK 없이 동기화할 수 있다. 오류가 나면 버전·스테이지·시드를 담은 로그 파일을 남긴다. 외부로는 아무것도 보내지 않는다.
Steam 연동: steamworks.js 0.4.0이 지금 쓰는 Electron 38에서 로드되는지부터 시험했다. 2024년 8월에 나온 라이브러리라 안 될 수도 있었는데, 된다. 업적은 옛 20분 모드용 10개를 버리고 캠페인 16개와 무한 다이브 4개, 모두 20개로 다시 짰다.
첫 10분

예전에는 실행하면 글자 연출 8장이 지나가고 나서야 타이틀이 나왔다. 인트로를 3줄 이하로 줄이고 첫 브리핑으로 바로 넘겼다. 조작법은 첫 출격 무전이 알려 준다. 실행에서 첫 출격까지 한국어 30초, 영어 37초가 걸린다. 목표는 60초 이내였다. 첫 격납고에 들어가면 "강화" 버튼을 한 번 짚어 준다.
설정에는 음량 3단, 섬광 줄이기, 무전 표시 시간, 키 다시 배치를 넣었다. 게임패드로 전투와 메뉴 이동을 할 수 있다. 울트라와이드 화면에서는 16:9 화면 양옆에 네온 장식 패널을 둔다. 시야 자체를 넓히지 않은 이유는 적이 나오는 거리가 바뀌어 동결 기록이 전부 깨지기 때문이다. 넓은 시야는 출시 뒤로 미뤘다.
"AEGIS"가 "REGIS"로 읽혔다

화면을 검수하다 무전 화자 이름 AEGIS가 REGIS로 읽힌다는 것을 발견했다. 게임 글꼴 Orbitron의 대문자 A는 윗변이 평평해서 R처럼 보인다. NOVA는 NOVR이 된다. 굵기, 크기, 자간을 바꿔 봐도 그대로였다.
글꼴을 통째로 바꾸지 않았다. 대문자 A 한 글자만 시스템 글꼴로 그리게 했다. 글꼴을 등록할 때 맡길 글자 범위에서 A 하나만 뺀 것이다. 나란히 놓고 보면 분위기는 거의 그대로이고 CAMPAIGN, HANGAR, LAUNCH가 다 읽힌다.
음악과 그림
배경음악은 막마다 따로 만들었다. 1막, 2막 A(공장, 금속 타격음), 2막 B(느린 박자, 낮은 패드), 3막(숨소리 모티프), 코어전, 결말, 격납고까지 7곡이다. 여기에 막의 색을 입힌 보스곡 3곡을 더했다. 화면이 바뀌면 0.7초 동안 교차 페이드한다. 음악과 효과음은 모두 코드로 합성한다. AI 음악 생성은 쓰지 않았다.
그림은 Codex로 3차를 그렸다. 코어, 기체 오버클럭, 3막 지도, 이벤트 그림, 결말 3장, 진화 아이콘 8개다. 쓰지 않는 원본 그림을 정리해서 그림 폴더는 30MB에서 16MB로 줄었다.
만드는 방식 — 여섯이 같은 폴더에서
이번에는 에이전트 여섯이 동시에 일했다. 스팀, 3막, 전투, 그림, 완성도, 오디오 담당이다. 담당마다 고칠 수 있는 파일을 표로 정했고, 남의 파일이 필요하면 리드에게 "파일 · 위치 · 바꿀 내용 · 이유"를 적어 요청했다.
그래도 사고가 났다.
- 같은 이름의 파일: 3막 담당과 스팀 담당이 테스트용 옛 세이브 파일을 각자 같은 이름(
p3_saves.json)으로 만들었다. 3막 담당의 생성 스크립트가 스팀 담당의 파일을 덮어썼다. 3막 담당이 바로 보고했고, 덮인 파일은 같은 생성기로 다시 만들어 되돌렸다. 3막 담당은 자기 파일을 다른 이름으로 옮기고, 생성 스크립트가 그 이름 말고는 쓰지 못하게 막았다. - 같은 이름의 로그: 임시 폴더를 모두가 같이 쓰다 보니
npmtest.log같은 흔한 이름이 다른 담당의 결과로 덮였다. 남의 실패를 내 것으로 읽을 뻔했다. 이번 묶음부터는 담당마다 하위 폴더를 따로 쓴다.
동결 기록 네 가지(옛 20분 모드 16판, 1막 39판, 새 미션 13판, 2막 62판)는 이번에도 그대로다. 첫 묶음이 끝난 뒤 테스트 48묶음이 전부 통과했다.
다음
두 번째 묶음은 오늘 시작했다.
- 결말 카드와 결말 화면, 크레딧, 결말을 본 뒤 열리는 무한 다이브
- 3막 난이도와 경제. 지금은 과열 스웜마더가 너무 쉽다. 서툰 봇도 10판 중 10판을 이겼다.
- 진화 8종 측정과 3막 상점
- 업적 마무리, 빌드 크기 줄이기, 스토어 페이지 문구
- 스토어 캡슐 그림, 업적 아이콘, 스크린샷 8장
스팀 쪽에는 나만 할 수 있는 일이 아직 남아 있다. Steamworks 가입과 세금 인터뷰다. 계획서에 잡아 둔 마감은 10월 23일이다. 이게 늦어지면 12월 스토어 공개와 2월 Next Fest 일정이 같은 만큼 밀린다.