픽셀 펫 제작기 03. 리얼타임 생애주기 구현 스프린트
전날 스펙이 35커밋으로 바뀌었다
전날 써둔 스펙과 계획서를 그대로 실행에 옮겼다. 하루 35커밋. 커밋 메시지마다 계획서의 §번호를 그대로 달아서 진행했더니 진척 추적이 명확했다.
시간 체계부터 비주얼까지, 여섯 갈래
시간 체계부터 손댔다. 데모용 타이밍 상수를 실시간 상수로 전환하고 수명 사망을 제거했다. 타이머 앵커 리셋, DEV_TIME_SCALE 누적 가속 시계와 세이브 스케일 재앵커도 넣었다. DEMO_DIV를 제거하면서 데모 시절 미사용 상수도 삭제했다(이름 섀도잉 제거).
수면·조명·치료는 스펙 순서대로 붙였다.
- 몬스터별 수면 창을 id 해시로 파생하는
sleepWindow() - 자동 취침/기상과 조명 상태 필드의 세이브 v2 반영
- LIGHT 전구 버튼 ON/OFF, 소등 렌더, 수면 페널티
- 주사기 HEAL 치료와 절레절레 거부 연출
진화·케어 시스템도 같은 날 들어갔다.
- 진화 조건 리얼타임 리스케일, 완전체 관문, 진화 지표 리셋, 전조 연출
- careMistake 반복 가산, 훈련 체중 부호 반전, 배틀 패배 발병
생애 기록·도감 쪽은 이렇게 채웠다.
deadAt, 생애 누계,lifeChain,generation, DEAD 카드, STATUS 나이 표시- 도감 미발견 실루엣
- 배틀 메뉴 2단 리팩터(BSEL → VSEL/FUSION)
테스트는 스펙의 수용 기준을 전수 검증했다.
- 진화 조건 전수 도달성
- SavedState v:3 마이그레이션
- 오프라인 경과 정산 catchUp 결정론 리플레이
- 완주 성장 곡선, 사망 직전 치료 생존, 케어 밴드 캘리브레이션(3체크인=양호, 2체크인=방치)
비주얼도 같이 갔다. 메뉴 아이콘 7개를 도트에서 SVG 벡터(Skia Path — Skia는 React Native용 2D 그래픽 라이브러리다)로 전환하고 볼드 실루엣으로 재디자인했다. 응가 스프라이트는 스월 모양에서 언덕형 무더기에 점 구름 냄새를 얹은 형태로 반복 재작도했다.
가속 시계가 애니메이션까지 가속시켰다
DEV_TIME_SCALE가 몬스터 이동과 애니메이션까지 가속시키는 문제를 만났다. 게임 시계와 연출 시계를 분리해야 한다. 가속 스케일은 시뮬레이션 시간에만 적용하고, 렌더와 연출은 실제 시간을 따라야 한다.
SVG 글리프 파싱이 네이티브 크래시를 냈다
SVG 글리프 파싱을 모듈 로드 시점에 했더니 네이티브 크래시가 났다. Skia가 준비되기 전에 Path 파싱이 실행된 것으로 보인다. useMemo로 파싱을 컴포넌트 렌더 시점으로 옮겨 해결했다.
구현을 복붙한 테스트는 아무것도 실패시키지 못한다
생애 누계 페어링 테스트가 구현 코드를 그대로 복붙해 검증하고 있었다. 동어반복 테스트다. 실경로(링크 배틀)로 다시 돌려서 의미 있는 테스트로 교체했다. "테스트가 뭘 실패시킬 수 있는가"를 항상 자문해야 한다.
환생 경로에서는 리셋 누락이 2건 나왔다. 생애 누계 카운터와 lastSeenAt이다. 상태 리셋류 기능은 "리셋되어야 할 필드 목록"을 스펙에 명시하고 테스트로 전수 검증하는 편이 안전하다.
테스트 커밋 7개가 구현 사이사이에 섞여 있었다. 배치 리뷰에서 잡힌 결함을 즉시 fix 커밋으로 반영하는 사이클이 잘 돌았다. 한편 아이콘·스프라이트 픽셀 아트는 이날부터 반복 수정이 시작됐다. 닭다리 아이콘만 이날 두 번 고쳤다. 비주얼은 수치 스펙처럼 한 번에 확정되지 않는다는 걸 인정하고 별도 트랙으로 관리할 필요가 있다. 다음 편에서는 아이콘 벡터화 마무리와 포커스 UX를 다룬다.