Skip to content

곤충게임: 스토리 영상·연출, 나의 섬, 낮·밤·날씨, 챔피언의 꿈, 쉬운 본편·마을 이야기·전투 체감 (17커밋) - #3

Merged
kimsungsugit merged 17 commits into
mainfrom
feat/story-videos
Oct 5, 2026
Merged

kimsungsugit merged 17 commits into
mainfrom
feat/story-videos

Conversation

@kimsungsugit

@kimsungsugit kimsungsugit commented Oct 5, 2026 •

Copy link
Copy Markdown
Owner

요약

main(#2, 2026-09-09) 이후 feat/story-videos에 쌓인 17커밋이다. 스토리 영상 재생 경로로 시작해 연출·나의 섬·낮과 밤·첫 시작 연출을 거쳐, 마지막 커밋에서 본편을 초등 고학년이 읽을 수 있게 다시 쓰고 전투 체감과 그림책 영상 15편을 넣었다. 각 커밋 메시지에 그 시점의 검증 결과가 적혀 있고, 마지막 커밋 기준 PlayMode 2739/2739 통과다.

변경 규모: 767파일, +115,039 / −9,105(영상 mp4 15편 약 25MB 포함).

무엇이 들어 있나

마을 이야기 쉬운 말로 다시 쓰기 (1b28a5e)

  • 12마을 48장면을 본편과 같은 규칙으로 다시 썼다: 평균 42.4 → 26.0자, 최장 80 → 37자(글자 −33%). 이야기·보상·게이트·화자는 그대로다.
  • story_lint 검사 31·32가 이제 마을 이야기도 본다. 걸음 도구 -walkMode town 156걸음 PASS

스토리 쉽게 다시 쓰기 + 이야기 전투 + 전투 체감 + 그림책 영상 (2c7310f)

  • 진짜 치명타: 피해기마다 1/16 확률로 ×1.5다(명중과 다른 난수 줄기). 「CRITICAL」은 진짜 치명타일 때만 뜬다. 예전엔 최대 HP 25% 이상이면 표시만 해서 거의 매 타격에 떴다. 기대 피해 +3.1%를 상쇄하려고 RaidBossHpMultiplier를 4.5 → 4.65로 올렸다.
  • 본편 다시 쓰기: 605 → 496줄(평균 34 → 24자). 장마다 「지난 이야기」 카드, HUD 목표 둘째 줄에 「왜」를 넣었다.
  • 이야기 전투:
    • 간부 팀전(3·3·5마리)과 대사 직후 대결(duelAfter, 대화창 「승부!」)
    • 간부전은 본편 필수다(뒤 지역 잠금, 이미 연 지역은 유지).
    • 라온 8단계, 최종 보스 변신(66%·33%), 수문장 등장 배너
  • 전투 체감:
    • 등장 연출: 진입 쓸기, 「야생 ○○이 나타났다!」
    • 상성: 「아주 잘 통했다!」 표시와 화살표
    • 몸 연출: 상태이상 몸 표시, 계열별 공격 모션, 전용기 컷인
    • 승리: 승리 포즈와 보상 줄. 결과 화면은 눌러야 닫힌다.
    • 음악: 수문장·라온 전용곡
  • 그림책 영상 15편 + 소리:
    • 렌더러는 Tools/Video/storybook/이다.
    • 새 4편은 대사 앞에 튼다(introVideoId + StoryPreludeChain). 그 4장면 대사는 5줄로 줄였다.
    • 자막은 아이용(≤24자·36pt)이다. 저널에서 「▶ 영상」으로 다시 본다.
  • story_lint 36검사, 새 QA 시나리오 -battleScenario story-video

낮·밤·날씨 + 조건부 서브 퀘스트 + 꿈 도입 영상 (83ce1d6)

  • 하루 12분, 날씨 5종(눈 포함). 지역 기후에 따라 보이는 날씨가 다르다. 곤충 194종 성향표, 야생 전투 보정 ×1.10/×0.90, 밤의 습격.
  • 조건부 서브 퀘스트 20종(몸길이·속성·연승 등) + 외전 3편
  • 필드 HUD 겹침 정리(HudStage·HudFrame, 화면 18장 × 모든 쌍 테스트)

「챔피언의 꿈」 프롤로그 (f7925b5)

  • 새 계정 첫 연출: 챔피언전 → 꾸며진 섬 걷기 → 깨어남. 꿈 밖 기록은 바뀌지 않는다(DreamPrologueState, 통합 테스트로 전후 비교).

포획 미니게임 3종 + 도입부 개편 (0176879)

  • 살금살금·가두기·던지기를 무작위로 건다.
  • 스토리 체인을 14 → 9단계로 줄였다(창 열기 과제는 「둘러보기」 서브로 옮김).
  • 미리 세기: 차례가 오기 전에 한 포획·전투도 다음 스토리 퀘스트에 쌓인다.
  • 라온 내기, 확정 조우

나의 섬 + 포획·EXP·훈련 개편 (515acec, b17e60a)

  • 개인 섬 하우징: 방목 시간 보상, 꾸미기, 상점, 방문
  • 포획 레벨 제한(곤충이 캐릭터보다 5레벨 넘게 높으면 확률을 곱으로 깎는다), 캐릭터 EXP 레벨 차 배율, 훈련 가격식
  • 기기 보고 3건: 섬 안내 배너 가림, 상대 버프 이펙트 위치, 초원 울타리 통과

캐릭터·의상·필드 비주얼 (ed617bb, d18f746, ed5092d)

  • 캐릭터·의상 개편: 몸체·얼굴·머리, 의상 입체 형태, 조건 해금
  • 마을 이야기 12인과 지역 의뢰
  • 필드 개체군 영속: 시간이 지나면 다시 생긴다.
  • 리전 공통 희귀도표
  • 빌드 셰이더 변형(반투명·발광이 빌드에서 빠지던 것)

스토리·전투 연출 (ba6bd67, 344c318, 8accf36, 725a373, ea7d281, 52d1ee1)

  • 스토리 영상 재생 경로(StoryVideoDirector)를 새로 만들고 준비 시간·프리즈·BGM 더킹 audit을 했다.
  • 오프닝 영상, 대사 무대, 간부·수문장 컷인, 수문장 배지 13개
  • 전투 액션감: 히트스톱, 넉백, 연출 카메라, 외침, 합체공격
  • 본편 목표 ! 표식: 머리 위·지도·미니맵

기타

  • .gitignore: QA 캡처·로컬 압축본 제외(15225ab)

리뷰할 때 알아 둘 것

  • 섬 공유·친구·PvP는 운영에서 동작하지 않는다. socialPvpApi Cloud Function이 배포돼 있지 않다(2026-10-02 확인, 배포하지 않기로 결정). 「방문이 안 된다」는 버그가 아니라 이 상태다.
  • 영상 소리는 아무도 귀로 들어 보지 않았다. 음량 수치만 확인했다. 배치모드와 PlayMode 러너는 영상을 틀지 못해서 실제 재생은 Windows QA 빌드에서만 봤다.
  • 간부전이 본편 필수가 되었다. 이미 이긴 세이브는 자동 통과한다(재발화형 스파인).
  • 전투곡 6곡이 영구 캐시에 약 27MB를 쓴다. 줄일지는 아직 정하지 않았다.

테스트 계획

  • PlayMode 테스트 2739/2739 통과(-testPlatform PlayMode -testFilter InsectGame.Tests)
  • ci_check.py 통과(story_lint 36 · quest_lint 13 · blight_lint 20 · data/ui/subscription 등), verify_coverage OK
  • 스토리 걸음 도구 -walkMode campaign 통과 — 최종장 두 선택(-walkChoice last 포함), 대사 앞 영상 건너뛰기 경로
  • QA 빌드 story-video 가로·세로: 15/15 실제 재생, 저널 「▶ 영상」 → ESC PASS
  • 기기용 APK 빌드 성공(insect-game-dev_261005.apk, error CS 0건)
  • Android 기기: 영상 소리, 세로 크롭, 디코더 준비 시간, 대사 앞 영상 → 대사 이어짐
  • Android 기기: 간부 팀전 길이·「승부!」 흐름, 결과 화면 탭 닫기, 전투곡

🤖 Generated with Claude Code

kimsungsugit and others added 17 commits September 9, 2026 17:59
대사창과 프로시저럴 연출만으로 전달되던 자리 중 코드 주석이 스스로 "표현하지 못했다"고
남긴 곳(ch9 3인극에 배우 1명, ch10 갱도 붕괴가 지문 한 줄)을 실제 영상으로 메운다.

- StoryVideoDirector: StoryBeatCompleted 뒤 StreamingAssets/Video/*.mp4를 URL 스트리밍으로
  전체화면 재생. IModalUI 등록·프리즈 원상복구·전투 지연 큐·준비 타임아웃·디코더 오류·
  파일 없음을 전부 Stop() 한 곳으로 모아 진행이 멈추지 않는다(모달 가드 데드락 방지).
- StoryVideoLibrary/Data: 11편 상수·파일명·자막 큐(자막은 영상에 굽지 않고 IMGUI로 얹는다).
- StoryBeat.videoId + Story.json 11비트 저작. ch1_intro는 cs_story_prologue를 영상으로 교체.
- story_lint 검사 13(세 슬롯 배타)·25(ID 실재·switch·파일 배치) 추가, StoryVideoLibraryTests
  (길이 상한 15s·큐 정렬·「무명」 금칙). link.xml VideoModule 보존.
- Docs/StoryVideos.md: 샷 리스트·AI 프롬프트·인코딩·기기 체크리스트의 단일 출처.
- StreamingAssets/Video: AI 생성 전 자리표시 애니매틱 11편(같은 파일명으로 덮어쓴다).

검증: PlayMode 946/946, ci_check 통과(story_lint 26 PASS), StoryBeatWalkthrough campaign
73걸음 OK(영상 비트 7곳 건너뛰기 후 다음 비트 정상 발화), Y: 드라이브 dev APK 101.6MB.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WEGjT4yyC9MChv7xPEdDS2
- P1: Play()의 SetFrozen은 Prepare 시작 시각이라 준비 5s + 영상 15s + 오버런 여유 3s가
  AutoUnfreezeTime(20s)을 넘어 검은 화면 뒤에서 캐릭터가 걸을 수 있었다. OnPrepared에서
  프리즈를 재장전(최악 18s). 테스트 상한도 길이+여유로 계산.
- Stop()이 준비 중에도 VideoPlayer.Stop을 불러 Prepare를 취소. 지연 큐는 IsAnyOpen도 본다.
- RenderTexture 모드에서 무시되는 aspectRatio 제거, ignoreListenerPause=false.
- AudioManager.SetBgmDuck 신설 — 재생 중 BGM·환경음 0.2배, Stop에서 원복.
- story_lint 검사 25: 파일명 대소문자 정확 대조(Android jar 대비) + 라이브러리 미사용 영상 WARN.

검증: PlayMode 946/946, ci_check 통과.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WEGjT4yyC9MChv7xPEdDS2
설정 화면이 모달 중엔 안 열려 실제로 닿지는 않았지만, 그 방어가 다른 파일의 사정이라
CanReplay 스스로도 지킨다. ModalUIRegistry.IsAnyOpenExcept(Type) 신설 — 버튼을 품은
모달 자신은 빼고 "다른 연출이 도는 중인가"를 묻는다. 테스트 4건(950/950).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WEGjT4yyC9MChv7xPEdDS2
"스토리 진행에 극적인 효과가 부족하다(대화·전투 장면·배지·영상)"에 대한 5단계 작업.

1. 오프닝 프롤로그 영상 — 오프닝 일러스트 3장에 2.5D 모션을 입힌 20초 영상(가로·세로 두 편) + 합성 음원.
   Tools/Video/opening_prologue.py · opening_audio.py. 시각의 단일 출처는 OpeningSequenceState.
2. 대사 무대·스토리 보강 — 대사창이 좌우 인물·지문·연출 토큰(fx)을 그린다(StoryDialogueStaging).
   1막·2막 대사 확장, 2막 게이트 4곳을 재발화 트리거로 옮기고 순서에 강한 문구로 고쳤다. 곁이야기 3비트 추가.
3. 전투 연출 — 간부·수문장 대결 컷인, 전투 중 한마디(상대 50%/20%, 내 25%), 결과 한마디(DuelBanter,
   BattleScreenUI.Duel). 라온 라이벌 4단계(NpcRivalDuels) — 대화창 [승부하기]. 격파 기록은 간부 집합에
   rival_ 접두로 적어 세이브 구조를 늘리지 않았다.
4. 수문장 배지 13개 — 격파 기록에서 파생(저장 없음). 획득 연출은 결과 화면 직후 gd_* 대사보다 먼저
   (StoryDirector.BattlePresentationClosed). 배지 케이스(퀵메뉴 K), 4·8·13 이정표 보상.
   이정표 수령 상태만 새 클라우드 필드(badgeMilestonesClaimed, 부트 로드 합집합, SaveScope v9).
   새 배지 신호는 RegionManager.GuardianBadgeEarned — GuardianDefeated는 봉인 정리로 재발화한다.
   그림은 Tools/Badges/guardian_badges.py가 굽는다.
5. 챕터 영상 11편 교체 — 색면 자리표시를 실루엣 삽화 영상으로(Tools/Video/story_silhouettes.py).
   샷 리스트·길이·자막 큐는 Docs/StoryVideos.md §4 그대로. 총 140초, 편당 ≤3.4 MB, H.264 Main 720p.

함께 들어간 것: 작업 트리에 있던 전투 연출(프레이밍·모션·배속), 월드 동선, 곤충 조각 메시, QA 캡처
도구(BattleVisualCapture 등), 9/18~19 검토 문서. 위 변경이 이 코드를 참조해 따로 나누면 중간 커밋이
컴파일되지 않는다.

검증: PlayMode 1160/1160, ci_check 통과, StoryBeatWalkthrough campaign PASS(수문장 6곳 "배지 연출 → gd_*" 순서),
QA 스탠드얼론 캡처(간부·수문장·라이벌 컷인, 배지 연출·케이스 가로/세로). 영상 재생·효과음은 기기 확인 필요.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
"스킬 쓸 때·맞을 때 카메라·액션감·외침이 부족하다(레이드 전체공격 포함)"에 대한 작업.
QA 빌드로 A(타격 펀치형)/B(시네마틱형) 카메라와 소리 샘플을 비교한 뒤 B·팀 합체공격·샘플대로로 결정.

1v1
- 연출 카메라(BattleCameraDirector): 준비 동작에서 시전자 클로즈업 → 돌진을 따라 대상 → 타격 클로즈업 → 원래 구도.
  CameraFollower.SetBattleShot으로 배틀 구도 위에 가중치로 얹어, 연출이 끊겨도 카메라가 남지 않는다.
- 타격감(BattleArenaController.Impact): 히트스톱(BattlePresentation.HitStop — 연출 시계 하나라 화면 전체가
  같이 멈춘다), 넉백·젖힘·눌림, PropertyBlock 피격 섬광, 섬광·불꽃·충격파 버스트, 마무리 슬로모션, 빗나감 회피.
- 외침(BattleShout + BattleShoutOverlay): 기술명 말풍선, 속성별 의성어, 종 계열별 비명, 쓰러짐 "털썩…".
  화면 가운데 "{기술}!" 효과 문구는 피해 숫자와 겹쳐서 뺐다(말풍선이 대신한다).

레이드
- 합체공격: 기 모으기 → 0.16초 간격 차례 돌진·타격 → 합동 일격(큰 히트스톱·슬로모션·보스 비명) → 복귀.
  타임라인은 RaidUniteTimeline이 아레나와 UI 숫자의 단일 출처. 3D 모드에서 2D 사각형·화면 전체 섬광·
  불투명 노란 공 폭발을 걷어냈다.
- 팀원 공격 외침·타격감(보스 비명은 센 타격에만), 보스 예고(몸 젖히기·기 모으기·발밑 경고 고리·포효),
  보스 공격 피격 반응. 보스 전체공격은 꺼진 채 유지.
- 팀 HP 패널·합체 게이지·설명 줄이 팀원 모델을 가리던 배치 — 연출 중엔 아래로 비켜선다.

소리
- 곤충 6계열+보스 울음·비명(ProceduralAudioGenerator.Battle), 층을 쌓은 타격음.
  폰 스피커 대역(300Hz~6kHz) 에너지 타격음 2%→36%, 치명타 3%→43%.

함께 고친 것
- CreateTransparentMaterial(Standard Fade)이 빌드에서 불투명으로 그려져 물 기둥·어둠 구체·독 구름이
  대상을 가렸다 — 빌드에 항상 있는 Hidden/Internal-Colored FX 머티리얼로 교체. 빛 효과는 가산 합성.
- 벌레·무속성 임팩트의 몸통 높이 초록 원판 → 바닥 충격 고리. 세로 화면 반격 준비 때 시전자 잘림.

QA 도구: -battleCamStyle, -captureInterval, -battleScenario elements|raid-unite, BattleVoiceExport(WAV).
검증: PlayMode 1206/1206, ci_check 통과, verify_coverage 미할당 0. QA 캡처(가로·세로, 1v1·속성 10종·레이드).
소리·손맛·기기 프레임레이트는 안드로이드 확인 필요.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Artifacts/(배지·전투 가로/세로 촬영, 868 MB), Insect.zip(5.4 GB), TestResults*.xml(이전 실행 사본)이
미추적으로 남아 `git add -A` 한 번에 쓸려 들어갈 수 있었다.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
두 세션 작업을 테스트한 상태 그대로 한 커밋에 담는다. 같은 파일(InsectEntity·SceneryMaterials·
NpcDialogueUI·BattleArenaController·GraphicsSettings 등)을 여러 갈래가 함께 고쳐, 나누면 중간 커밋이
검증되지 않은 상태가 된다.

마을 이야기(Docs/StoryBible.md 13장)
- 리전별 주민 12인 town_* 비트 + 지역 의뢰 s_town_*(requiredRegionId — QuestRegionGate가 그 리전 안의
  행동만 센다) + 따라가기(StoryObjectiveTracker: [의뢰] → ?·알리기 → 자동 해제, 선행 미완이면 잠금 표시).
- 목표 우선순위를 발화 순서(CompareBeatPriority)와 분리 — CompareObjectivePriority는 최종장 곁가지를
  본편 단계로 본다(발화 쪽을 바꾸면 하월의 대사 순서가 뒤집혔다).
- 퀘스트 목록 따라가기 버튼(터치 최소 크기), 지도·미니맵·머리 위 의뢰 표식 !·? 호박색 통일(민트는 목표·입구).
- 따라가기 선택을 계정 스코프 PlayerPrefs로(SaveScope). 표지 비트 화자에서 라온 제외.
- StoryBeatWalkthrough town 모드 + 걸음 전후 세이브 전체 원복(개발 PC 비로그인 세이브를 바꾸지 않는다).

필드·서브에리어·NPC 비주얼
- 리전 장식(RegionDressingBuilder·RegionPalette·RegionAtmosphere 안개), 배처(SceneryBatcher), 월드 머티리얼
  단일 출처(SceneryMaterials — 무광 마감·반투명·셰이더 폴백 사본 정리), 서브에리어 입구·테마, 원경.
- 둔덕 높이(FieldGround)를 플레이어 접지·곤충 스폰/도주·NPC 보행·아이템에 반영 — 사구에서 0.63m 묻혔다.
- 연못 호수 확대(부두가 물 위), 물 위 스폰·배회 차단, 초원 마을에 박힌 습지 울타리 정리.
- 스토리 NPC 옷차림·소품, 명부회 초상을 월드 외형에서 파생. FieldDesignTour(필드 전체 촬영 도구).

필드 개체군 — 리전을 옮길 때가 아니라 시간으로만 리젠
- 슬롯 기록이 곧 개체(FieldPopulation). 플레이어 45m 안에서만 몸을 세우고 55m 밖이면 몸만 거둔다 —
  떠났다 돌아와도 같은 곤충이 같은 자리에 있다(초원→서릿길→초원 14/14 동일).
- 리전 슬롯 = 설 수 있는 땅 ÷ 550㎡(8~40, 오염은 BlightPolicy 경유). 포획·전투로 빈 자리는 60~120초 뒤,
  산 개체는 수명 4~7분으로 순환(플레이어 25m 안·교전 중엔 안 바꿈). 놓침 도주는 같은 개체를 다른 자리로.
- 서브에리어도 슬롯 영속(45초 재생) — 전용종 9종이 한 번도 안 나오던 순환 결함도 고쳤다.
- 정화는 사건이라 즉시 채움 + 귀환종 확정. 늘어난 상한을 평소 틱이 먼저 채워 "플레이어 둘레"가
  한 번도 안 돌던 경합을 정화 보류로 막았다. 본편 포획 목표종 보조 20% + 수명 순환 면제.
- 도주 벽 통과 수정(FleePath — 7방향 스피어캐스트, 막히면 장애물 앞에서 멈춤).

희귀도는 리전 공통, 레벨만 리전별(사용자 결정)
- 등급을 먼저 전역 표로(일반 60 / 고급 25 / 희귀 11 / 영웅 3.5 / 전설 0.5 — FieldSpawnRules) 굴리고 종은
  리전 풀에서. 13개 리전 풀에 빈 등급을 기존 종으로 보충(초원 희귀·영웅·전설, 유적 일반 등).
- 레벨은 리전 대역 안(지수 1.5, 등급 보정 제거) — 옛 규칙은 유적에서도 절반 가까이가 Lv.10 아래였다.
- progression_sim이 등급표를 코드에서 읽는다: Lv50 3,339 → 3,366전투(< 4,000 PASS).
- 아이 대결 폴백에서 희귀 이상 제외, 도감 서식지 문구 7종·유적 설명 갱신, 안 쓰는 튜닝 필드 3개 제거.

빌드 셰이더 변형 — 기기에서 물·얼음이 불투명, 발광이 무발광이던 결함
- QA 빌드 실측: Standard 반투명(_ALPHABLEND_ON)·발광(_EMISSION) 변형 0개. Standard가 Always Included에
  있으면 머티리얼 키워드를 안 봐서 Resources 머티리얼만으론 안 됐다 — 목록에서 빼고 키퍼 4벌
  (SceneryMaterials.BuildKeepers, Editor/ShaderVariantKeepers). FORWARD 16 → 64, 화면 판정 FAIL → PASS(안개 포함).
- QA 시나리오 -battleScenario materials(수치 판정), 빌드 로그 [ShaderVariants] 보고.

그 밖에
- 광택 통일: 오염 거점·전투 아레나·의상 파츠 무광, 금속·물·보석 부품만 광택(CreateSheenMaterial·부위 재질).
- 대사창 초상 22인 전원 피부·머리·옷을 월드 외형에서(세라 검은 머리, 어르신 백발).

검증: PlayMode 1346/1346, ci_check 통과, verify_coverage 미할당 0, FieldDesignTour 371장 실패 0,
StoryBeatWalkthrough town·campaign·blight PASS, QA 빌드 materials PASS, 전투 속성 10종·대화 캡처 확인.
기기 확인 필요: Android 셰이더 변형, 초원 영웅·전설 출현·후반 레벨 체감.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
결함
- 조건 해금 의상(리전·레벨·퀘스트)이 실제로 풀리게 연결, 기존 세이브 소급 판정(OutfitUnlockRules)
- 안경·안대가 새 눈에 묻히던 것, 외형 변경 시 옛/새 마네킹이 겹쳐 찍히던 것

캐릭터 본체
- 체형 프로파일 몸통·어깨·엄지, 얼굴(눈썹·눈꺼풀·하이라이트·입 모양 3종), 앞머리 셸·헤어 스타일 재작성
- 모자 아래 정수리 머리를 숨기고 옆·뒷머리는 남긴다

의상 형태
- 소매 길이·겉옷 형태(재킷/로브/망토)·하의/신발 형태, 파츠 앵커(Body·다리), ProcMesh 생성기 추가
- OutfitPatternLibrary: 체크·줄무늬·은하·위장·데님 등 패턴 텍스처(형태는 입체, 무늬는 텍스처)

창(UI)
- 의상 창: 여러 슬롯 입어보기·되돌리기, 정면/확대, 보유 필터, 상세(보너스 전체·세트 진행·해금 조건), NEW 배지
- 세로 화면은 1560 패널 — 820 고정일 때 화면 가운데 43%만 썼다. 남는 높이는 설명·입은 세트 진행이 받는다
- 캐릭터 생성: 피부·머리색 견본, 이름 기본값, 긴 버튼 글자 맞춤
- 캐시샵·결투 컷인: 지금 입은 3D 캐릭터. 보석·코인 이모지가 □로 깨져 "보석 N"·"코인 N" 글자로

검수
- OutfitRenderProbe 전 품목·외형 갤러리, -battleScenario outfit 실제 IMGUI 촬영(의상 창·캐시샵·생성 화면)
- PlayMode 테스트 1406/1406, ci_check 11검사 통과

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- 캐시샵 데스크톱 패널 1200 → 1400: 오른쪽 콘텐츠가 812뿐이라 상자 세 장(최소 960)이 안 들어가
  골드 상자가 잘리고 가로 스크롤이 생겼다. 폭 관계를 상수로 뽑아 테스트로 고정
- 의상 창 하단 띠 분리: 카드가 요약 줄 4px 위에서 끝나던 것에 여백. 데스크톱은 미리보기 왼쪽에
  "장비 보너스"(넘치면 항목 경계에서 두 줄), 오른쪽 카드 열 아래에 재화
- 요약 줄 줄바꿈을 IMGUI에 맡기면 한글 사이에서 끊겨 "캔디 / +2%"처럼 항목이 갈렸다 — 직접 나눈다
- 요약 문자열은 장착이 바뀔 때만 다시 만든다
- PlayMode 테스트 1409/1409, ci_check 통과, 검수 빌드 캡처(데스크톱·세로)로 확인

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
나의 섬
- 캐릭터마다 섬 하나. 보유 곤충을 풀어놓으면 시간에 따라 캔디·코인이 쌓이고(상한까지, 접속 안 한 시간 포함)
  수확해서 건물·가구·지형지물·도구 28종을 사 칸 단위로 배치한다. 섬 크기 3단계·곤충 자리 확장은 코인/다이아 병행가.
- 섬은 별개 상태가 아니라 분리 서브에리어(SubAreaData.detached)로 탄다 — RegionManager.EnterDetachedSubArea.
  서브에리어 빌더·방문 퀘스트·끼임 복구·환경광이 detached를 거른다(rules/island.md).
- 화면: 섬 HUD, 꾸미기(모달 + 끌어서 둘러보는 카메라), 상점, 곤충, 나들목(방문·섬 코드·공개), 단계형 안내·도움말.
  진입은 탐험 메뉴 [내 섬](H)과 본 마을 나루터. 「곤충 수집가」 완료 후 열린다.
- 퀘스트 7개(QuestType 6종, 보상 2종: 코인·섬 물건). 다이아는 보상·환급으로 주지 않는다(서버 규칙이 증가를 거부).
- 공유: socialPvpApi에 액션 5개(publish/getMy/get/like/delete), islands/{uid}. 함수는 아직 배포하지 않았다 —
  배포 전에는 방문·좋아요가 "준비 중"으로 뜨고 s_island_visit을 완료할 수 없다(Docs/SocialPvp.md).
- 세이브: island.json + 클라우드 블롭(islandData). 계정 삭제 시 공개 섬을 먼저 내린다.
- 섬 수입 대역: 기본 섬 하루 18캔디(활동 수입의 12%), 풀 확장 177(113%) — economy_sim 신호 6·7, IslandYieldTests.

클라우드 복원 파서
- FirestoreDocParser로 교체. 옛 파서는 공백 없는 마커만 찾아서, 응답이 들여쓰기돼 오면 전 필드를 기본값으로
  복원할 구조였다. 두 형식을 모두 읽고 이스케이프를 한 글자씩 푼다(운영 응답으로는 미확인).

포획·EXP·훈련 (앞선 작업분)
- TrainerLevelGap: 곤충이 캐릭터보다 +5 넘게 높으면 최종 포획 확률을 곱으로 깎고, 캐릭터 EXP가 곤충 레벨과 레벨 차를 본다.
- TrainingPricing: 기술 가격을 효과 가치로 매기고(상태기가 위력 칸 1로 팔리던 문제), 능력치(개체값) 훈련 추가.
- 필드 HUD·포획 선택·배틀팀·훈련소·도감 화면 정리, 등급 한글 표기·HP 색 단일 출처, field-ui 검수 시나리오.

검증: PlayMode 러너 1,559건 통과(섬 100건 + 실제 PlayScene 섬 진입·퇴장 통합 1건), ci_check 통과,
functions 단위 31건·에뮬레이터 통합 통과, QA 빌드 island-ui 데스크톱·세로 캡처, 물건·지형 72장.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
섬 안내 배너
- 모바일에서 좌상단(미니맵·퀘스트 칩 자리)에 놓여 그 밑에 깔렸다. 필드에서는 화면 가운데 줄(캐릭터 발 아래),
  꾸미기 화면 위에서는 상단 바 아래에 둔다.
- ✕ 닫기와 12초 자동 숨김(남은 시간 줄). 닫는 것은 표시만이라 단계는 그대로고, 다음 단계·섬 재진입 때 다시 뜬다.
  다시 보기만 ✕가 끝낸다(IslandManager.EndGuideReplay).
- island-ui 검수 장면에 진짜 미니맵과 퀘스트 칩 자리 대역을 함께 띄운다 — fixture에 없는 HUD와의 겹침은 캡처로 안 보였다.

전투 버프·약화 이펙트
- 버프 고리 자리를 진영 bool로 다시 고르던 코드가 상대 차례에도 내 곤충을 골랐다. 약화도 반대였다
  (상대가 건 약화가 상대 위, 내가 건 약화가 내 곤충 위). 효과 수치는 원래 옳게 걸려 있었고 그림만 틀렸다.
- 자리는 연출 코루틴이 이미 고른 시전자·대상에서 받는다. 가운데 문구는 상대에게 걸린 것이면 "상대"를 붙인다.

초원 울타리
- 가로대가 합친 메시라 콜라이더가 없어 기둥 사이 46칸 전부(칸당 6.5m)를 걸어 나갔고, 겹친 습지 쪽은 울타리 끝과
  습지 잠금 원 사이에 3.6m 틈이 있었다. 난간 칸마다 차단 콜라이더(Ignore Raycast 레이어 — 겹침 검사에만 걸리고
  카메라 차폐·탭 이동 레이는 건너뛴다)를 세우고, 겹친 쪽 끝을 그 리전 원까지 잇는다. 초원만 해당한다.

문서
- 운영에 Cloud Function이 하나도 없다는 사실과 배포하지 않기로 한 결정을 기록(SocialPvp·IslandDesign·rules/island).
  섬 공유 요청이 404면 "서버가 아직 준비되지 않았습니다"로 알린다.

검증: PlayMode 러너 1,568건 통과(+9 — 실제 PlayScene 울타리 한 바퀴 측정 1, 실제 아레나 이펙트 위치 5,
섬 안내 2, 전투 1). 이펙트 위치 테스트는 수정 전 코드로 5건 중 4건 실패 확인. ci_check 통과.
island-ui 캡처 세로 720×1280·데스크톱 1280×720 각 18장.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
`!`가 마을 의뢰 주민에게만 붙어 있어서, 본편이 "이 사람에게 말 걸기"를 가리킬 때
(캠페인 첫 목표인 어르신 포함) 머리 위에도 지도에도 표식이 없었다. 지도의 목표 점은
마우스를 올려야 문구가 떠서 모바일에서는 무엇인지 알 길이 없었다.

- 머리 위: 본편 대상 한 개체에 민트 `!`(의뢰 표식보다 크다). 동행자는 리전마다 서 있어
  목표 행이 고르는 것과 같은 한 개체에만 단다(2026-09-28 결정 유지).
- 지도: 목표 자리에 `!` 배지 + 목표 문구를 항상 표시. 누르면 그 리전이 선택된다.
  리전 중심 목표는 원 위쪽으로 올리고, 내 위치 점과 겹치면 방향을 지킨 채 떼어 놓는다.
- 미니맵: 반경 안이면 같은 `!` 원(쐐기와 겹치지 않게).
- 의뢰를 따라가는 중에도 본편 `!`는 지도에 남고, 누르면 본편 안내로 돌아온다.

의뢰 표식이 본편 표식을 이긴다(StoryTaleResolver.MarkFor) — 눌러서 따라가는 손잡이라
덮이면 그 주민의 의뢰가 지도에서 사라진다.

검증: PlayMode 1585/1585, ci_check 통과, QA 빌드 `-battleScenario map` 가로·세로 캡처.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
미니게임
- 타이밍 바 하나를 살금살금·가두기·던지기 셋으로 바꿨다. 포획마다 무작위로 걸리고 직전 게임은
  연달아 나오지 않는다. 잡으려는 곤충이 놀이판에 직접 나온다.
- 규칙은 CaptureMinigame(순수), 화면·조작은 CaptureMinigameController. 결과는 셋 다 0~3점이라
  CaptureMinigameProbability와 채집망 보정은 그대로 이어진다.

도입부
- 수문장까지의 스토리 체인을 14개 → 9개로. 창을 한 번 열면 끝나는 과제 6개(컬렉션·도감·스킬 장착·
  아이템·훈련·팀 편성)는 배열 자리를 둔 채 Side(「둘러보기」)로 돌렸다. 스토리 퀘스트의 상대 순서는
  바꾸지 않았다 — 소급 완료가 기존 세이브에서 아직 할 차례인 퀘스트를 삼키지 않게.
- 미리 세기: 포획·전투·레이드·레벨업은 차례가 오기 전의 것도 다음 스토리 퀘스트에 쌓인다
  (정화·방문·대화는 제외). 차례가 왔을 때 이미 채웠으면 그 자리에서 완료한다.
- 포획 버튼이 지난번 채집망으로 바로 미니게임을 연다(버튼 아래 줄에서 바꾼다). 결과 팝업은 누르면 닫힌다.
- 첫 파트너 지급이 CaptureInsect를 울려 "첫 포획 축하"가 잡기 전에 뜨던 것을 고쳤다.
- 라온과의 포획 내기(ch1_rival_intro 뒤, 먼저 3마리 — 계정당 1회), 세 번째 포획 앞의 확정 색다른 조우,
  레벨업·이야기 보상 알림(FieldMomentFeed → FieldMomentsUI), 처음 잡은 종의 NEW 표시.

검증: PlayMode 1669/1669, ci_check 통과, StoryBeatWalkthrough campaign 73·town 156걸음 FAIL 0,
QA 빌드 field-ui 가로·세로 캡처. 실기기 조작감(터치)·내기 속도는 미확인.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
새 계정이 처음 필드에 서면(첫 퀘스트 q_move 진행 0) 1.5초 뒤 한 번 도는 연출. 설정의
「챔피언의 꿈 다시 보기」로 다시 볼 수 있다. 처음 켠 사람에게 이 게임의 전투가 얼마나 시원한지,
섬이 얼마나 멋지게 꾸며지는지를 먼저 보여 주고, 깨어나면 곤충 소리 없는 초원(본편의 "잦아듦")이 시작된다.

흐름
- 챔피언전: 실제 전투 화면에서 최상급 전설 곤충(헤라클레스 Lv.80, 개체값 15)으로 싸운다.
  InsectBattleController.StartSandbox — 보상·도감·HP 저장·포획 롤·DuelEnded가 전부 없고,
  SandboxBattleRules가 공식 피해에 배율·상하한만 건다(반드시 이기고 3~4번째 행동에 끝난다).
- 챔피언의 섬: 남의 섬 방문(EnterVisit)의 스냅샷으로 꾸며진 22x22 섬을 연다. 새 지형 코드·저장 없음.
  이동 → 곤충에게 다가가기 → 분수 앞으로, 목표 표식과 거리 표시.
- 깨어남: 흰 화면이 걷히며 마을 어르신 목소리. 건너뛰기는 항상 가능.

핵심 약속: 꿈이 끝나면 계정의 어떤 기록도 시작 전과 같다
- DreamPrologueState.Active 표지를 퀘스트(NotifyAction·NotifyCapture·Update)·자동 주행·필드 HUD 5종·
  설정 버튼·오프닝 다시보기가 읽고 물러난다. 모달 레지스트리로는 못 한다 — 모달이 열려 있으면
  PlayerMovement가 이동 입력을 버려 섬을 걸을 수 없다.
- StoryDirector.OnBattleEnded가 IsSandbox를 보고 BattleWin을 쏘지 않는다(꿈에서 "첫 전투" 비트가 열리면 안 된다).
- 종료는 Finish 한 곳을 지난다(OnDisable/OnDestroy 포함) — 표지가 켜진 채 남으면 퀘스트가 영영 안 올라간다.

검증: PlayMode 1706/1706(신규 37), ci_check 통과, StoryBeatWalkthrough campaign 73·town 156걸음 FAIL 0.
DreamPrologueIntegrationTests가 실제 PlayScene에서 꿈을 끝까지 돌리고(약 45초) 캔디·레벨·XP·코인·컬렉션·
퀘스트 진행·"첫 전투" 비트가 전후 동일한지 본다. 챔피언 종·기술·섬 배치가 실제 DB에 있는지와 실제 능력치로
3~4행동에 이기는지도 테스트로 고정. QA 빌드 dream-island / dream-battle 가로·세로 캡처로 화면 확인.
실기기 터치 조작감·안내 위치는 미확인. 규칙은 .claude/rules/dream-prologue.md.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
낮·밤·날씨 (rules/world-environment.md)
- 하루 12분 시계와 날씨 5종(맑음·비·안개·센바람·눈). 세계 날씨는 하나, 지역 기후로 보이는 날씨가 다르다
  (설산 비→눈, 사막·화산 눈→센바람). 하늘·조명·스카이박스·별·날씨 입자(WorldSkyRules·SubAreaEnvironment·WeatherEffects)
- 곤충 194종 성향표(InsectHabitTable): 주행성·야행성·좋아하는/싫어하는 날씨·습격형
- 스폰: 밤 +1, 비·안개 +1(최대 +2) 보너스 슬롯, 시간대가 바뀌면 어울리지 않는 종의 만료를 당겨 갈아입기
- 야생 전투 보정(BattleEnvironment): 각자의 성향으로 ATK·DEF ×1.10/×0.90, 수문장·NPC·레이드·샌드박스·실내 제외. 전투 화면 칩
- 습격(AmbushRules): 저녁·밤에 깨어 있는 습격형이 다가와 「습격!」 창 — 싸우기/도망치기(BattleEscapeRules 공유)
- 나의 섬: 방목 곤충이 성향대로 활발하거나 쉼(IslandInsectMood), 밤·비·안개에 손님 곤충(IslandGuestRules, 희귀 이하).
  섬 수입은 그대로. 행동 리전은 RegionManager.ActionRegionId(섬 손님이 지역 의뢰·스토리로 새지 않게)
- 시각·날씨 칩과 변화 알림(WorldClockHUD) — 필드·섬, 꿈에서는 숨김

필드 HUD 겹침 정리 (rules/ui-layout.md)
- 잠깐 뜨는 카드는 가운데 무대(HudStage)에 차례로, 자리는 순수 함수(HudFrame). HudOverlapSweepTests가 화면 18장 × 모든 쌍을 잰다
- 가로 모바일 섬 버튼 열×잡기 버튼, 세로 수확 토스트×단축 바, 퀘스트 칩×단축 바, 목표 행×조이스틱(조이스틱이 등록 HUD 위에서
  시작 안 함), 세로 필드 카드가 왼쪽 절반에 붙던 것(무대는 섬 HUD가 보일 때만 피함)

조건부 서브 퀘스트 20종 + 외전 3편(11화) (rules/quest-system.md)
- CaptureTrait·BattleFeat 두 타입 + 조건 필드(몸길이·배율·이로치·속성·등급·레벨 차·행동 수·남은 HP·연승), 판정 QuestTraitRules
- quest_lint 검사 13(조건부 퀘스트 정합)

「챔피언의 꿈」 도입 영상 (rules/dream-prologue.md)
- 경기장 입장 8초 영상(dream_arena.mp4) + 별도 음원(dream_arena.wav), 못 뜨면 글자 카드로. 생성 스크립트 Tools/Video/

스토리 NPC 대사·역할 퀘스트 문구 다듬기 (Story.json·NpcDialogueDatabase, story_lint 검사 30)

검수 도구
- QA 빌드 시나리오에 날씨·섬 시계 칩·토스트 장면 추가, 중단된 빌드가 남긴 임시 씬을 빌더가 치움
- LiveSceneCapture·FieldDesignTour에 시각·날씨 고정 인자
- BattleSupportEffectSideTests: 프레임 수 대신 실시간으로 대기(배치 러너 시간 경합)

테스트 2107건 통과, ci_check 통과

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1단계 — 전투 고장 수정과 진짜 치명타 (rules/balance.md)
- 피해기마다 1/16 확률로 ×1.5(명중과 다른 난수 줄기, SetCritSource). CRITICAL 문구·무거운 타격 연출은 진짜 치명타일 때만
  (예전엔 "최대 HP 25% 이상"을 표시만 해서 거의 매 타격이 CRITICAL이었다)
- RaidBossHpMultiplier 4.5 → 4.65(기대 피해 +3.1% 상쇄). 레이드 쓰러짐 연출 연결, 적 치명타·독·기절 표시

2단계 — 본편 다시 쓰기 (초등 고학년 기준, Docs/StoryBible.md)
- 본편 605 → 496줄(평균 34 → 24자), 곁가지 159 → 139줄. 용어 정리(이름 벽·그림자·이름 잃은 곤충·비상 울타리),
  그림자는 울타리 바깥에 산다로 설정 통일
- 장 「지난 이야기」 카드(Story.json chapters), HUD 목표 둘째 줄 「왜」(비트 why ≤20자)

3단계 — 이야기 전투
- 간부 팀전(집게·저울 3마리, 하월 5마리 — StartTeamDuel), 대사 직후 대결(StoryBeat.duelAfter + StoryDuelLauncher, 대화창 「승부!」)
- 간부전 본편 필수: 다음 장 선행 = duel_*_win, 서릿길·잿불 골짜기 지역 잠금(저장된 해금은 유지)
- 라온 8단계, 최종 보스 변신(RaidBossForms 66%·33%), 수문장 등장 배너(GuardianIntros)

4단계 — 전투 체감
- 진입 쓸기 + 「야생 ○○이 나타났다!」, 상성 「아주 잘 통했다!」 + 화살표, 스킬 칩 「잘 통해요」, 상태이상 몸 표시
- 계열별 공격 모션·숨쉬기, 전용기 컷인, 승리 포즈·「승리!」·보상 줄·「눌러서 계속」(결과는 눌러야 닫힘, 꿈만 4초 자동)
- 읽는 단계 배속 하한, 수문장·라온 전용곡, 전투곡 약 1분. 전투 화면이 떠 있는 동안 플레이어 고정을 매 프레임 다시 건다

5단계 — 그림책 영상 15편 + 소리 (Docs/StoryVideos.md)
- 렌더러 Tools/Video/storybook/(kit·sound·render·v_<이름>), 영상 안에 AAC 소리, 15편 24.7MB
- 새 4편(ch6_wall·ch7_fence·fin_shadow·fin_return)은 대사 앞에 튼다(StoryBeat.introVideoId + StoryPreludeChain:
  영상 → 등장 연출 → 지난 이야기 카드 → 대사). 그 4비트는 대사 5줄로 줄이고 컷신 4개 삭제
- 아이용 자막(≤24자·36pt), 저널 「▶ 영상」 다시 보기(PlayReplay), QA 시나리오 -battleScenario story-video
- story_lint 36검사(대사 앞 영상 실재·videoId와 배타·대사 1~6줄)

검증: PlayMode 2739/2739 통과, 걸음 도구 campaign 두 선택 통과, ci_check 통과,
QA 빌드 가로·세로 영상 15/15 실제 재생·저널 ESC PASS

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 12마을 48비트: 183줄 · 평균 42.4자 · 40자 넘는 줄 96개 · 최장 80자 → 201줄 · 평균 26.0자 · 최장 37자(글자 −33%).
  이야기·보상·게이트·화자는 그대로다(바뀐 건 lines뿐)
- 어려운 역할 이름은 첫 만남에서 풀었다(봉수대·탁본·풍경·필사), 아이가 모를 말(영감·욕봤네·칼금·한지·뙤약볕·가훈 등)을 뺐다
- 새 설정에 맞춤: 유적 후일담 "그림자가 숨을 틈이 없게요", 꽃밭은 「비상 울타리」
- 「먹」은 등장인물 이름이라 결의 대사·잡담은 「먹물」. 서릿길 의뢰 제목 「두 벌의 필사」 → 「얼음 벽의 글씨」
- story_lint 검사 31·32 대상에 town 추가, StoryBible 13장·15장 갱신

검증: PlayMode 2739/2739 통과, story_lint 36/36·ci_check 통과, 걸음 도구 -walkMode town 156걸음 PASS

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kimsungsugit kimsungsugit changed the title 곤충게임: 스토리 영상·연출, 나의 섬, 낮·밤·날씨, 챔피언의 꿈, 쉬운 본편·전투 체감 (16커밋) 곤충게임: 스토리 영상·연출, 나의 섬, 낮·밤·날씨, 챔피언의 꿈, 쉬운 본편·마을 이야기·전투 체감 (17커밋) Oct 5, 2026
@kimsungsugit
kimsungsugit merged commit eedb363 into main Oct 5, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant