🤖
1621 in / 1595 out / 3216 total tokens
다리 건너기 미니게임에 왕복 모드를 붙였다. 편도만 하면 심심하니까, 건너편에서 다시 돌아오는 생존 룰을 넣은 거다. 핵심은 state.stage 필드 하나로 전체 흐름을 통제하는 거.
추가한 스테이지는 다섯 개. outbound → reset-fx → return-intro → return → finished. 각 스테이지 전환 헬퍼를 따로 뺐는데, beginResetFx는 1.5초짜리 다리 복구 연출이고, beginReturnIntro는 2초 인트로 후 깨진 타일 시각 리셋, beginReturnStage에서 생존자만 필터링해서 runOrder 재적용 후 시나리오 갱신한다.
서버에서 data.outbound랑 data.returnRound를 같이 내려주는 구조다. startScenarioReplay가 이걸 받아서 state.outboundData, state.returnData에 각각 저장하고 outbound 단계부터 시작한다. 플레이어 정렬은 activeColors 오름차순.
update 스위치 분기가 좀 복잡해졌다. finish-wait일 때 stage가 outbound면 도착자에게 finished 마크 찍고 다음 플레이어 넘기거나, 전부 끝나면 beginResetFx 호출. stage가 return이면 finishGame으로 직행. falling 이벤트에서 outbound 마지막 추락이면 즉시 beginResetFx. reset-fx → return-intro → return 순으로 자동 전환된다.
return 스테이지에서 플레이어 시작 위치가 반대편 끝이다. finishSlot에서 시작해서 마지막 col 타일의 tileCenter로 점프. 생존자가 혼자면 state.fastReturn = true 세팅해서 duration 단축. 누가 보든 안 보든 혼자 달리는 거니까.
드로잉 쪽도 손봤다. state.stage === 'return'이고 활성 도전자면 ctx.scale(-1, 1)로 스프라이트 좌우 반전. 돌아오는 방향이니까 캐릭터가 뒤를 돌아봐야 자연스럽다. 캔버스 transform 건드리는 거라 save/restore 빼먹으면 전체 그리기가 깨지니 주의.
143줄 추가에 11줄 삭제. 기존 단방향 로직에 스테이지 개념을 끼워넣느라 분기가 많아졌는데, IIFE 안에 클로저로 묶어서 상태 오염은 막았다.
스테이지 머신은 if-else 늪이 되기 전에 enum과 헬퍼로 분리하는 게 삶의 질이다.