diff --git a/공유/PD_지시_트래킹/개발팀_PD_지시_로그.md b/공유/PD_지시_트래킹/개발팀_PD_지시_로그.md index dd0fcd3..69f9325 100644 --- a/공유/PD_지시_트래킹/개발팀_PD_지시_로그.md +++ b/공유/PD_지시_트래킹/개발팀_PD_지시_로그.md @@ -33,7 +33,7 @@ C3·C13 위반에 해당. **즉시 자진 보고 후 소급 등록**. | # | 일시 | 지시 요지 | 처리 상태 | 산출물 경로 | 중단 사유 | 사후 조치 | |---|------|----------|----------|-----------|----------|----------| -| BT13-GodDem | 2026-08-19~20 | **GodDem 프로젝트 개시 + 인게임 「황야의 생존자」형 전환** — PD 직접 지시 6건 연속. ①(2026-08-19) "이 세션은 우리 조직의 새로운 프로젝트인 GodDem 프로젝트 개발을 위한 세션이야. 현재 프로젝트 레포는 'E:\NerdNavis\GodDem' 이므로 코드 및 프로젝트를 제대로 검토해보고 개발할 준비가 되면 보고해." ②"앞으로는 도구 사용을 묻지 않도록 자동으로 도구 승인처리해" (+ ToolSearch·MCP 리소스 도구·`.claude/**` 편집 영구 허용 반복 지시) ③"인게임을 유튜브(https://youtu.be/cBVc0OwUX6U 황야의 생존자) 영상과 같은 형태로 변경. 더미 리소스(기존 자산)로 기본 시스템 동일 설계·인게임 씬 배치. **아웃게임 유지, 인게임 씬만 변경**" + 전투 명세 4항(플레이어 중앙 고정 자동공격 / 매판 리셋 로그라이크 스텟 강화 / 10웨이브 보스·스테이지 클리어 / **신규: 경험치→레벨업마다 특수 스킬 3종 택1**) ④"원작 APK 디컴파일해서 게임 로직·데이터 분석. 능력치·성장 수치·강화 비용 등 밸런스 데이터를 그대로 활용하고 싶다" ⑤"FABLE5로 원작 복호화 리버싱을 먼저 시도해봐. 안되면 자체 수치로 설계할게" ⑥"csv 형태로 제작해줘" / "워크플로우 설계할 때 ponytail 스킬을 써줘". **C13 위반 자진 보고** — 본 6건이 대화로그에만 기록되고 본 트래킹 로그에 미등록 상태였음(pm-auditor 감사 Critical 적발). 소급 등록. **[2026-08-21 인게임·메타·밸런스 일괄 집행]** PD "전부 진행해" 승인 — 1차 인게임 완결(A10 분신 10종 정합·일시정지·적 HP바, `77bd835`·`ee9ec11`) + 3차 상점·Hero 메타 결선(SurvivalMeta 분리 신설, `57a8fcf`) + 4차 결함 해소(penetrate_ratio 함정·A13 사거리·waveInStage 산식·이중 SOT, `7728a41`) + 5차 S3 v2 밸런스 확정 반영(42/1/14/+3, plan-auditor 재검증 통과, `d5dea4d`). 상세: 공유/대화로그/GodDem/2026-08-21.md §3~§12. **[2026-08-22 밸런스 원작이탈 지적·2층 재구현]** PD 플레이 실측 지적 — 공격력이 원작 2층(정액 hero_level power + 배율 attack_add) 중 배율만·축소, 정액 트랙 누락 / 몬스터 원작 소스 부재. 근본 = 본 로그 사후조치 (2) "스케일 재조정 방침"을 PD 재확인 없이 진행한 C36 위반이 플레이로 표면화. PD "이 방향으로 재구현해" 승인 → 공격력 원작 2층 복원 착수 (C49: balance-designer 재설계 → plan-auditor 검증 → 개발팀장 구현). memory `feedback_pd_directive_altered_to_rescale` 신설. **[완료 2026-08-22 GodDem `26ff655`]** 공격력 원작 2층 복원 완결 — APK 재추출로 배율(0.05~0.30)=원작 attack_add prefix-10 원본 확정(이탈 아님)·정액 트랙 `attack`(30~600) 신설로 2층 복원·C49 이중검증(balance v2→plan-auditor 통과)·플레이테스트 2층 산술 정확 재현(22~1691). PD 지적 (a)(b) "정액 누락" 단일원인 해소. 부수 강화테이블 전수 원작 정합 확인. **잔여 = R-M2(정액 몰빵 스테이지1 보스 3.5배 오버킬) 조정 방향 PD/balance 판단 1건**. 상세 대화로그 §15~§20. **[2026-08-22 원작 아키텍처 전면 이식 착수·대규모]** PD 지적 2건("총 스테이지 구성 원작 동일"·"능력치가 원작보다 훨씬 적음·원작은 아웃게임 확장") → PD 결정 "원작 데이터 아키텍처 전면 이식이 맞아"+"이대로 진행". 실측 gap 3축(능력치 24 vs 13·아웃게임 5층 vs 1층·스테이지 6구간 vs 무한). 근본=초기 MVP 전환 원작 축소(feedback_pd_directive_altered_to_rescale 연장). P32 분할: 1단계 balance-designer 이식청사진 → 2단계 system-designer 메타재설계 → 3단계 축별 구현. 상세 대화로그 §21. **[P1 완료·P2 착수 2026-08-22]** 청사진 v1 완료(`b5d95cc`, 능력치 24종/PvE 18·아웃게임 5층·스테이지=원작 teamwavepassreward 54단계뿐/StageBalance는 GodDem 자산 정정·재사용3/확장3). PD 결정: 가챠 원작대로 도입(과금 신설)·현 세션 P2 계속. P2 system-designer 메타 아키텍처 재설계 착수(5층·능력치18 배치·인게임/아웃게임 경계 재정의). 상세 §22~§23. | **진행중** | ①레포 검토 완료·`공유/대화로그/GodDem/2026-08-19.md` ②`.claude/settings.json` dontAsk+allow 확장 (커밋 `7366860`·`c4a5dfd`) ③설계도 `공유/기획/GodDem/2026-08-19_인게임_중앙디펜스_전환_설계_v1.md` (커밋 `4346d4d`) ④⑤**복호화 성공** — 22바이트 반복 XOR·`libil2cpp.so` 리버싱 불필요. 원작 밸런스 237테이블 복호화 ⑥**CSV 230종/22,261행** 변환·PD 전달. 종합 매핑 SOT `공유/기획/GodDem/2026-08-20_원작밸런스_해독_매핑_v1.md` | — | **PD 결정 대기 2건**: (1) 복호화 XOR 키의 조직 기록 보존 가부 (타사 기술적 보호조치 우회 수단 — PM 재량 밖, C36-2 보수 선택으로 문서에서 마스킹) (2) 원작 절대수치 vs 자체 스케일 재조정 방침 확인. **다음 단계**: 설계 P1(중앙 고정 플레이어+사방 스폰+웨이브 씬 골격 배치) 착수. **후속 조치**: `.gitignore`에 `scratchpad/`·`wild/` 선제 등재, `공유/대화로그/INDEX.md`에 GodDem 등재. **저작권 방침**: 원작 수치는 참고, 아트·텍스트 리소스 사용 불가. 추출물 레포 미커밋(git 실측 확인). | +| BT13-GodDem | 2026-08-19~20 | **GodDem 프로젝트 개시 + 인게임 「황야의 생존자」형 전환** — PD 직접 지시 6건 연속. ①(2026-08-19) "이 세션은 우리 조직의 새로운 프로젝트인 GodDem 프로젝트 개발을 위한 세션이야. 현재 프로젝트 레포는 'E:\NerdNavis\GodDem' 이므로 코드 및 프로젝트를 제대로 검토해보고 개발할 준비가 되면 보고해." ②"앞으로는 도구 사용을 묻지 않도록 자동으로 도구 승인처리해" (+ ToolSearch·MCP 리소스 도구·`.claude/**` 편집 영구 허용 반복 지시) ③"인게임을 유튜브(https://youtu.be/cBVc0OwUX6U 황야의 생존자) 영상과 같은 형태로 변경. 더미 리소스(기존 자산)로 기본 시스템 동일 설계·인게임 씬 배치. **아웃게임 유지, 인게임 씬만 변경**" + 전투 명세 4항(플레이어 중앙 고정 자동공격 / 매판 리셋 로그라이크 스텟 강화 / 10웨이브 보스·스테이지 클리어 / **신규: 경험치→레벨업마다 특수 스킬 3종 택1**) ④"원작 APK 디컴파일해서 게임 로직·데이터 분석. 능력치·성장 수치·강화 비용 등 밸런스 데이터를 그대로 활용하고 싶다" ⑤"FABLE5로 원작 복호화 리버싱을 먼저 시도해봐. 안되면 자체 수치로 설계할게" ⑥"csv 형태로 제작해줘" / "워크플로우 설계할 때 ponytail 스킬을 써줘". **C13 위반 자진 보고** — 본 6건이 대화로그에만 기록되고 본 트래킹 로그에 미등록 상태였음(pm-auditor 감사 Critical 적발). 소급 등록. **[2026-08-21 인게임·메타·밸런스 일괄 집행]** PD "전부 진행해" 승인 — 1차 인게임 완결(A10 분신 10종 정합·일시정지·적 HP바, `77bd835`·`ee9ec11`) + 3차 상점·Hero 메타 결선(SurvivalMeta 분리 신설, `57a8fcf`) + 4차 결함 해소(penetrate_ratio 함정·A13 사거리·waveInStage 산식·이중 SOT, `7728a41`) + 5차 S3 v2 밸런스 확정 반영(42/1/14/+3, plan-auditor 재검증 통과, `d5dea4d`). 상세: 공유/대화로그/GodDem/2026-08-21.md §3~§12. **[2026-08-22 밸런스 원작이탈 지적·2층 재구현]** PD 플레이 실측 지적 — 공격력이 원작 2층(정액 hero_level power + 배율 attack_add) 중 배율만·축소, 정액 트랙 누락 / 몬스터 원작 소스 부재. 근본 = 본 로그 사후조치 (2) "스케일 재조정 방침"을 PD 재확인 없이 진행한 C36 위반이 플레이로 표면화. PD "이 방향으로 재구현해" 승인 → 공격력 원작 2층 복원 착수 (C49: balance-designer 재설계 → plan-auditor 검증 → 개발팀장 구현). memory `feedback_pd_directive_altered_to_rescale` 신설. **[완료 2026-08-22 GodDem `26ff655`]** 공격력 원작 2층 복원 완결 — APK 재추출로 배율(0.05~0.30)=원작 attack_add prefix-10 원본 확정(이탈 아님)·정액 트랙 `attack`(30~600) 신설로 2층 복원·C49 이중검증(balance v2→plan-auditor 통과)·플레이테스트 2층 산술 정확 재현(22~1691). PD 지적 (a)(b) "정액 누락" 단일원인 해소. 부수 강화테이블 전수 원작 정합 확인. **잔여 = R-M2(정액 몰빵 스테이지1 보스 3.5배 오버킬) 조정 방향 PD/balance 판단 1건**. 상세 대화로그 §15~§20. **[2026-08-22 원작 아키텍처 전면 이식 착수·대규모]** PD 지적 2건("총 스테이지 구성 원작 동일"·"능력치가 원작보다 훨씬 적음·원작은 아웃게임 확장") → PD 결정 "원작 데이터 아키텍처 전면 이식이 맞아"+"이대로 진행". 실측 gap 3축(능력치 24 vs 13·아웃게임 5층 vs 1층·스테이지 6구간 vs 무한). 근본=초기 MVP 전환 원작 축소(feedback_pd_directive_altered_to_rescale 연장). P32 분할: 1단계 balance-designer 이식청사진 → 2단계 system-designer 메타재설계 → 3단계 축별 구현. 상세 대화로그 §21. **[P1 완료·P2 착수 2026-08-22]** 청사진 v1 완료(`b5d95cc`, 능력치 24종/PvE 18·아웃게임 5층·스테이지=원작 teamwavepassreward 54단계뿐/StageBalance는 GodDem 자산 정정·재사용3/확장3). PD 결정: 가챠 원작대로 도입(과금 신설)·현 세션 P2 계속. P2 system-designer 메타 아키텍처 재설계 착수(5층·능력치18 배치·인게임/아웃게임 경계 재정의). 상세 §22~§23. **[P2 완료 2026-08-22]** 메타 아키텍처 재설계 v1 완료 — 5층 확정(①영웅레벨·②승급·③장비강화·④가챠·⑤스킬마스터리, 인게임 "런레벨"과 명칭 분리) + 능력치 18종 배치(청사진 §2-3 "미보유 5종" 정정: `stun_rate` 누락 확인·실제 6종) + ★결합 지점 정정(초안 "1곳"→plan-auditor 감사로 4개 호출부 확인, `SurvivalLobbyController.Hero.cs` 2곳 누락분 포함, `FinalAttack()`/`FinalHp()` 단일 캡슐화 메서드로 3중 SOT 재발 방지 설계) + 재사용/확장 판정(SurvivalMeta 확장·Upgrade/Skill 불변·ItemCatalog 확장·**ShopCatalog는 "구조 확장 필요"로 정정**, 확률 지급물 미지원 확인) + 신규 클래스 4·CSV 7종 골격 + P3 4서브페이즈 분할(B1레벨승급→B2장비→B4스킬→B3가챠). plan-auditor 모드A 감사 1회 수행(조건부통과, Critical 2·Major 6·Minor 4 — 전부 반영 후 확정). **PD 확인 대기 2건**: ①가챠 소비재화(골드 vs 젬, 원작 근거 부재 🔴) ②가챠 가격·확률 실값. | **진행중** | ①레포 검토 완료·`공유/대화로그/GodDem/2026-08-19.md` ②`.claude/settings.json` dontAsk+allow 확장 (커밋 `7366860`·`c4a5dfd`) ③설계도 `공유/기획/GodDem/2026-08-19_인게임_중앙디펜스_전환_설계_v1.md` (커밋 `4346d4d`) ④⑤**복호화 성공** — 22바이트 반복 XOR·`libil2cpp.so` 리버싱 불필요. 원작 밸런스 237테이블 복호화 ⑥**CSV 230종/22,261행** 변환·PD 전달. 종합 매핑 SOT `공유/기획/GodDem/2026-08-20_원작밸런스_해독_매핑_v1.md`. **P1 청사진** `공유/기획/GodDem/2026-08-22_원작아키텍처_이식청사진_v1.md`(`b5d95cc`, 산출물 경로 누락분 소급 추가·pm-auditor 지적). **P2 메타 재설계** `공유/기획/GodDem/2026-08-22_메타아키텍처_재설계_v1.md`(system-designer, plan-auditor 검증 완료). | — | **PD 결정 대기 2건**: (1) 복호화 XOR 키의 조직 기록 보존 가부 (타사 기술적 보호조치 우회 수단 — PM 재량 밖, C36-2 보수 선택으로 문서에서 마스킹) (2) 원작 절대수치 vs 자체 스케일 재조정 방침 확인. **다음 단계**: 설계 P1(중앙 고정 플레이어+사방 스폰+웨이브 씬 골격 배치) 착수. **후속 조치**: `.gitignore`에 `scratchpad/`·`wild/` 선제 등재, `공유/대화로그/INDEX.md`에 GodDem 등재. **저작권 방침**: 원작 수치는 참고, 아트·텍스트 리소스 사용 불가. 추출물 레포 미커밋(git 실측 확인). | | BT12-Dev-Vis | 2026-05-09 | **PlayerSkillInventory 등록 시각화 지시** — PD 직접 발화: "PlayerSkillInventory 등록이 되었는지 어떻게 판단해야하지? 시각적인 변화가 없으니 확인이 불가능해. 유니티 기본 제공 리소스를 활용해도 좋으니 보이게 해줘." **[2026-05-13 후속 세션 신규 3건]** (1) 투사체 사거리 파란 박스 시각화 — `HitboxDebug.SpawnRange` 신규 (`Projectile.Initialize` 끝 호출·3초 유지·`HideFlags.DontSave`). (2) 사정거리·속도 Inspector 직접 조절 — `ActiveSkillData.MaxRange`·`ProjectileSpeed` 신규 필드 (`RangeTier`·`camWidth`·`mults` 계산 폐기·`PiercingProjectile._speed = 2.5f` override 폐기). (3) A04 ExtraHitFxPrefab + FX_Thunder Smoke — `ActiveSkillData.ExtraHitFxPrefab` 신규·`LightningStrikeSpawner.DelayedExtraHitFx` Coroutine (0.6초 후 spawn·y -0.5·비주얼 전용·판정 무관). EerieVillage `ab40b27` push 정합. **[2026-05-13 사고 정정]** 본 PM `git reset --hard origin/main` 영역 PD Inspector 작업 .asset 6 폐기 사고 발생. PD 보고 "스킬 관련 스크립터블 오브젝트가 full 이후 롤백되어버렸어" 수령. `git reflog` 영역 `e2bc95f` 보존 정합·.asset 6 복구·EerieVillage `5b2a032` push 정합. A04 ExtraHitFxPrefab (FX_Thunder Smoke) 영역 PD 후속 Inspector drag&drop 필요. 본 PM 자성 #4 (헌법급) 등재. **[2026-05-13 신규 2건]** (1) 디버그 박스·사거리 박스 시각화 off (재활용 toggle) — `HitboxDebug.ShowDebugVisuals` 플래그 신규·4 위치 `SpriteRenderer.enabled` 정합. (2) 레벨업 카드 풀 5종 한정 — `SkillRuntimeFactory.AvailableCardIds` 화이트리스트 (A02·A13·A04·A05·A_Laser)·미완성 placeholder 5종 (A01·A03·A08·A14·A15) 제외. EerieVillage `d26bd83` push 정합. **잔여**: A04·A05·A_Laser 영역 SkillFireEvent default return 영역 실전 발사 미연결 (카드 풀 한정 영역과 별개·PD 후속 결정 대기). **[2026-05-13 정정·진단]** (1) A05·A_Laser 박스 시각 off 누락 정정 — MeleeAreaSpawner·LaserSpawner 영역 직접 SpriteRenderer 부착 코드 (HitboxDebug 미경유) 영역 `sr.enabled = HitboxDebug.ShowDebugVisuals` 추가. 본 PM 자성 #5 (변경 영향 사전 grep 누락). (2) Player 피격 X 진단 Debug.Log 추가 (회수 의무) — EnemyController.Update L387-396 영역 `[EnemyHit][Intersect]`·`[EnemyHit][Decrement]` 2종. PD Console 측정 결과 영역 근본 fix·Debug.Log revert. EerieVillage `e8779df` push 정합. **[2026-05-13 신규]** 게임 시작 시 기본 파이어볼 A02 자동 습득 — `PlayerSkillInventory.StartingCardIds` (string[]) Inspector 필드·기본 `{ "A02" }`·`Start()` 영역 일괄 `AddSkillByCardId`. EerieVillage `0ad1325` push 정합. **[2026-05-13 신규 2건]** (1) Player 피격 X fix — EnemyController.Update L387-396 영역 `IsGrounded` 조건 폐기 (PD 표현 "닿아도" = ground·공중 무관 피격 의도)·진단 Debug.Log 2종 revert. (2) Enemy HP 30~40 random — `Health.RandomMaxHPRange` (Vector2Int) Inspector 필드 신규·Awake 영역 random·`maxHearts` 자동 산정·Enemy.prefab Inspector `(30, 40)` PD 직접 설정. 본 PM 자성 #6 (PD Console 측정 결과 미수신 영역 가설 fix 시도·feedback_pm_root_diagnosis_priority 약한 위반). EerieVillage `b4847b1` push 정합. **[2026-05-13 재발 정정]** (1) Enemy HP 30~40 자동 fallback — Health.Awake 영역 RandomMaxHPRange 미설정 + EnemyController 검출 → 자동 random. PD Inspector 의존 폐기. (2) Player 피격 distance 기반 강화 + 진단 Debug.Log 재추가 — `VisualBounds.Intersects OR dist < 1.5f` 단일 조건·`[EnemyHit]` 진단·회수 의무. 본 PM 자성 #7 (feedback_pm_root_diagnosis_priority 위반 누적). EerieVillage `2efcd34` push 정합. **[2026-05-13 신규]** Enemy·Player 사망 모션 y -0.5 오프셋 — EnemyDeath·PlayerDeath Execute 영역 Animator death/hurt Trigger 직전 `transform.position.y -= 0.5` 적용·sprite 위로 떠 보이는 현상 정정·collider 영향 X. EerieVillage `18b2125` push 정합. **[2026-05-13 신규]** 스킬 선택 UI 아이콘 fallback — SkillCardSlot.Bind 영역 card.Icon null 시 동적 원 sprite (32×32 알파) + 속성별 색상 (Fire 주황·Frost 하늘·Dark 보라·Lightning 노랑·Physical 흰). _glowEffect 동심원 빛 효과 alpha 0.3. EerieVillage `32ab76f` push 정합. **[2026-05-13 신규 2건]** (1) 사망 모션 y -0.5 → -0.3 (EnemyDeath·PlayerDeath). (2) 게임 시작 시 파이어볼 투사체 정지·잔존 fix — ProjectileSpawner.Trigger 영역 `facing.sqrMagnitude<0.01f` 시 `Vector2.right` fallback. 원인: Player.Facing 영역 (0,0) 영역 → _direction = (0,0) → _speed × 0 = 정지. EerieVillage `56a4a36` push 정합. **[2026-05-13 신규]** 투사체끼리 통과 fix — Projectile.OnTriggerEnter2D 영역 동족 Projectile skip (Wall·Enemy 판정 이전). 원인: fallback GO default Layer 0 영역 → isWall=true → 양쪽 SelfDestruct. EerieVillage `ebd7086` push 정합. **[2026-05-13 신규 4건]** (1) Player 사망 사라지는 현상 fix — PlayerDeath 영역 `Rigidbody2D.simulated=false` (gravity 정지·낙사 차단). (2·3) 제자리 부활·부활 모션·2초 무적 깜박 — PlayerSpawn 영역 `Teleport` 폐기·`health.Resurrect()` 호출 (currentHP=maxHP·invulnerableUntil=2초·Animator resurrect Trigger)·Rigidbody simulated=true 복원·PlayerInvulnerabilityFlash 자동 깜박. (4) FX 잔상 safety cap 5초 — LaserSpawner fx Destroy 누락 추가·LightningStrike·MeleeArea·Projectile.AutoDestroy 영역 `Mathf.Min(lifetime, 5f)` cap. EerieVillage `3a672f0` push 정합. **[2026-05-13 컴파일 에러 fix]** PlayerSpawn.cs CS0246 — using UnityEngine 누락·첫 줄 추가. 본 PM 자성 #8 (신규 type 사용 시 namespace using 사전 검증 누락). EerieVillage `c052d78` push 정합. **[2026-05-13 신규 3건]** (1) Player 죽는 모션 X fix — Player.controller parameter "hurt" 부재 측정·`SetTrigger("hit")`·`updateMode=UnscaledTime`. (2) 부활 모션 중 움직임 fix — PlayerSpawn simulated 복원 폐기·EnablePlayerInput 영역 이전. (3) 투사체 잔상 진단 — `[Projectile][SelfDestruct]`·`[Projectile][OnDestroy]` Debug.Log·회수 의무. 본 PM 자성 #9 (Animator parameter 사전 측정 누락). EerieVillage `69a1805` push 정합. **[2026-05-13 NullReferenceException + 잔존 근본 fix]** ProjectileSpawner.Trigger 영역 collider isTrigger=true 활성 시점 vs Initialize 호출 시점 race → OnTriggerEnter2D 영역 `_runtime=null` NullReferenceException → SelfDestruct 미호출 → 영구 잔존. fix: OnTriggerEnter2D 영역 `_runtime/_data == null` defensive return + Update 영역 `_data == null` 시 즉시 SelfDestruct. 본 PM 자성 #10 (race condition 사전 측정 누락). EerieVillage `1437720` push 정합. **[2026-05-13 신규 3건]** (1) 사망 팝업 타이밍 fix — LevelUpManager.HandleLevelUp 영역 Player 사망 상태 시 _pendingLevels 영역 저장·Update 영역 IsAlive 회복 시 표시. (2) Player 사망 y -0.3 추가 (누적 -0.6). (3) 투사체 잔상 강화 + 진단 — Projectile.Update 영역 lifetime+0.5 backup·Initialize·Trigger 영역 진단 Log·회수 의무. EerieVillage `b1931af` push 정합. **[2026-05-13 근본 원인 fix]** 재시작 시 정지 투사체 누적 — Time.timeScale=0 (LevelUp 등) 영역 Time.time·Invoke 정지 영역 영구 잔존. fix: Projectile `_spawnTime = Time.unscaledTime`·Update 영역 unscaledTime lifetime check·Invoke 폐기·CancelInvoke 추가 안전. 본 PM 자성 #11 (timeScale 영향 사전 측정 누락). EerieVillage `705d943` push 정합. **[2026-05-13 진단 Log 회수]** PD "사라졌어" 정합 작동 확인 후 진단 Debug.Log 5종 revert (ProjectileSpawner·Projectile.Initialize·SelfDestruct·OnDestroy·EnemyHit). Projectile.Update lifetime backup·CancelInvoke 안전망 보존. feedback_pm_root_diagnosis_priority 정합. EerieVillage `41fa4e4` push 정합. **[2026-05-13 신규 2건]** (1) MeleeArea 실전 발사 연결 — SkillFireEvent.Execute switch 영역 MeleeArea case·CardId 분기 (A04·A_Laser·기타). (2) FX AutoDestroy unscaledTime — FxAutoDestroyUnscaled MonoBehaviour 신규 (Object.Destroy 영역 timeScale 영향 fix)·전수 변경·WaitForSecondsRealtime. 본 PM 자성 #12 (Unity 표준 API timeScale 영향 사전 측정 누락). EerieVillage `26b0666` push 정합. **[2026-05-13 신규]** A04 번개 충격 적 유무 무관 자동 발동 — LightningStrikeSpawner.Trigger 영역 candidates 0 시 Player 위치 fallback spawn. A05·A_Laser = 이미 Player 위치 기준 발동·정합. EerieVillage `ebedf6d` push 정합. **[2026-05-13 InvalidOperationException Input System fix]** ParticleGroupView (2).cs 영역 삭제 (Scenes 폴더 영역 비정상 .cs·미사용·StandaloneInputModule 동적 부착 코드)·ProjectSettings activeInputHandler 1→2 (Both 모드·호환). 본 PM 자성 #13. EerieVillage `b30976a` push 정합. **[2026-05-13 본 PM 자성 #14 + fix 정정]** PD 직접 자성 지적 — 본 PM 직전 미승인 `.cs` 삭제 영역 정정. PD 재배치 후 ParticleGroupView (2).cs UnityEngine.Input → InputSystem 전환·activeInputHandler 2→1 revert. EerieVillage `b23e00f` push 정합. **[2026-05-13 Phase A]** A12 정화의 빛 신규·A08 저주의 화살 이펙트 적용 — ActiveSkillData.CastFxPrefab 신규·ProjectileSpawner.Trigger 영역 CastFx spawn·SkillRuntimeFactory.AvailableCardIds 7종 확장. **Phase B 대기** (A06 독 늪·A11 정령불 신규 Effector). EerieVillage `5077f5d` push 정합. **[2026-05-13 Phase B]** A06 독 늪·A11 정령불 신규 Effector + 1키·2키 매핑 — PoisonSwampSpawner/Instance/PoisonedEnemyMarker·SpiritFireSpawner/Instance 신규·SkillFireEvent switch PlacementPersistent·Minion case 확장·TestSkillFireOn1to5 Category 분기 추가·A06·A11 .asset 신규·SkillRuntimeFactory 9종. PD Inspector Player.prefab Skill1·Skill2 drag&drop 필요. EerieVillage `f292eb4` push 정합. **[2026-05-13 Phase B FX 재생 fix]** ParticleSystem 명시 `Play(true)` 호출 추가·PoisonSwampInstance 영역 BoxCollider2D·Rigidbody2D 자식 GO 분리 (ParticleSystem root 영향 차단). EerieVillage `b1b476a` push 정합. **[2026-05-13 A11 frame 제어]** FX_Rotating shield Animator frame 제어 — intro 1~88·loop 89~105 반복·outro 106~169 (남은 frame). Animator.Play(STATE_HASH, 0, normalizedTime) 매 frame 호출. EerieVillage `ebd0808` push 정합. **[2026-05-13 A12·A08·전수 FX Play]** 4 Spawner + Projectile 영역 ParticleSystem.Play(true) 명시 호출 전수 적용 (직전 b1b476a 영역 PoisonSwamp·SpiritFire만 적용 영역 영역 영역 보완). EerieVillage `68843a8` push 정합. **[2026-05-13 A08 sprite 방향 fix]** ActiveSkillData.ProjectileAngleOffset (float Range -360~360) 신규·Projectile.Initialize 영역 angle 보정·A08.asset 180 (FX_PinkMagicArrow sprite left→right). EerieVillage `71c3b7d` push 정합. **[2026-05-13 A08 FX 진단]** A08.asset GUID 정합·코드 정합 측정. PD 보고 영역 실측 진단 Debug.Log 추가 (회수 의무). EerieVillage `aa6cef1` push 정합. **[2026-05-13 CS1056 fix]** ProjectileSpawner.cs interpolated string `\"NULL\"` escape 영역 컴파일 에러·ternary 결과 변수 분리 fix. 본 PM 자성 #15 (Edit 후 컴파일 사전 검증 누락). EerieVillage `9879425` push 정합. **[2026-05-13 fileID 잘못된 측정 정정·자성 #16]** PD Inspector 측정 결과 영역 본 PM .asset 영역 fileID 영역 자식 GameObject 영역 매핑 영역. `grep -m 1` 영역 첫 GameObject 영역 = root 영역 영역 X. A08·A06·A12 .asset 영역 fileID 일괄 정정 (FX_PinkMagicArrow_Hit·FX_PinkArrow_Shoot·FX_Venom_Spray·FX_Icelight_Seal). 올바른 측정 = `awk m_Name + m_Father=0 정합`. EerieVillage `b26eb42`·`447ea92` push 정합. **[2026-05-13 CastFx 방향 + 진단 회수]** CastFx Instantiate 영역 facing+ProjectileAngleOffset+FxRotation 적용 (sprite 반대 방향 정정)·진단 Debug.Log 3종 revert. EerieVillage `7ad3319` push 정합. **[2026-05-13 A08 spawn 끝점·grace]** A08.asset OffsetDistance.x=1.5 (캐스팅 끝 spawn)·Projectile.OnTriggerEnter2D 영역 0.1초 grace 추가 (Hit FX Player 위치 회피). EerieVillage `eab215d` push 정합. **[2026-05-13 ScalingMode Hierarchy 전수]** 모든 fx spawn 영역 ParticleSystem.MainModule.scalingMode = Hierarchy 설정 (HitFxScale 정합 적용·7 파일 전수). EerieVillage `6ed6efe` push 정합. **[2026-05-14 자연 fade SelfDestruct]** Projectile.SelfDestruct 영역 즉시 Destroy 영역 → ParticleSystem Stop(emission)·Collider/박스 disable·_speed=0·0.5s 후 Destroy·FADE_START_RATIO 0.85. 발사 영역 영역 영역 trail 자연 연속. EerieVillage `2ee5084` push 정합. **[2026-05-14 A08 캐스팅 제거·적 조준]** A08.asset OffsetDistance.x=0·CastFx=null·TargetEnemyOnFire=1·ActiveSkillData.TargetEnemyOnFire 신규·ProjectileSpawner.Trigger 영역 nearest enemy 방향 발사. 벽·발판 관통 X 영역 = Projectile.Update Layer 0·16 OverlapPoint 영역 정합. EerieVillage `55ee4f3` push 정합. **[2026-05-14 HitFx sortingOrder·적 조준 하단]** 모든 hit fx (Projectile·LightningStrike·MeleeArea·Laser) Renderer.sortingOrder += 100 (Enemy 영역 위)·ProjectileSpawner TargetEnemyOnFire 영역 toEnemy.y -= 0.5 (hitbox 영역 영역 영역 적중). EerieVillage `eb33e64` push 정합. **[2026-05-14 적 조준 중간 보정]** toEnemy.y -= 0.5 → 0.25 (이전·1차 중간·너무 하단 정정). EerieVillage `b52c99d` push 정합. | **진행중** | 신규 `Assets/Scripts/MyUI/SkillInventoryHUD.cs` (OnGUI 좌상단·장착 액티브 DisplayName·Lv·CooldownRemaining/EffectiveCooldown·패시브 카운트). PlayerController.Awake 자동 부착. 보강: ProjectileSpawner fallback prefab에 SpriteRenderer + 동적 흰색 원 sprite + 속성별 색상 (Fire 주황·Frost 하늘·Dark 보라·Lightning 노랑·Physical 흰). Unity 기본 자원 활용 — Texture2D 동적 생성 16×16 알파 원. **[이펙트 개선 완료 2026-05-13]** (PD 지시 "이펙트 개선작업은 완료처리"). 본 세션 (`cranky-wescoff-e855b0`) 누적: (1) 5 스킬 통합 + 1~5 키 발사 시스템 — A02·A04·A05·A_Laser·A13 (EerieVillage `2ebf313`). (2) Inspector 즉시 반영 필드 확장 — HitboxSize·OffsetDistance(Vector2)·OffsetXY·FxRotation·HitFxScale·DamageFrameDelay·EnableRepeatDamage·MaxHitCount·RepeatFrameInterval. (3) hit 모션 + flash 연출 (붉은색·alpha 50%·1 frame) — Animator self-loop transition + Health.DecrementBypassInvulnWithHit. (4) Scene 잔존 박스·FX 6개 cleanup + HideFlags.DontSave 8 spawn 지점 (EerieVillage `60e28e3`) — Edit Mode execute_code 측정 시 Scene 오염 방지 표준 확립. (5) FxRotation 박스 미적용 분리 (EerieVillage `ea7d32f`) — 박스(판정) = facing 만 · 이펙트(시각) = facing + FxRotation. 4 case 검증 (facing R/L × FxRotation 0/90 박스 무반응·facing 좌/우 정확 반전). (6) A05 좌우 베기 이펙트 Player 동조 (EerieVillage `f6c6eb5`) — MeleeAreaSpawner.SetParent(true) 추가·Player 전진 시 이펙트 밀림 정정 (Δ+2.0 동조 측정). 양 레포 push 정합. | — | **이펙트 개선 영역 = 완료 처리.** HUD·Icon UI·Layer Lab 카드 정합 등 잔여 사항은 PD 후속 결정 대기. 인수인계서: `공유/조직공지/2026-05-13_BT12-Dev_세션종결인수인계.md`. **[이펙트 작업 완성 확정 2026-05-14]** (PD 발화 "스킬 이펙트 작업은 완성이야. 임의로 투사체 판정 범위나 크기 등이 바뀌지 않도록 지금 상태를 잘 기록해"). 본 PM SOT 신설: `프로젝트/EerieVillage/개발/spec/스킬_이펙트_확정_v1.md` — 13 활성 스킬 (A01·A02·A03·A04·A05·A06·A08·A11·A12·A13·A14·A15·A_Laser) 핵심 필드 표 + 박스↔이펙트 분리 원칙 + EerieVillage stamp `1a1de0c`. **변경 금지 원칙**: PD 직접 명시 지시 없이 임의 변경 금지. 변경 시 SOT §4 갱신 + commit + PD 보고 의무. 본 PM·차기 세션 PM 모두 본 SOT 준수. | | BT12-MVP-A | 2026-05-08 | **경험치·레벨업·스킬 카드 선택 UI** — PD 직접 지시 2건 (1) 적 처치 → EXP → 레벨업마다 스킬 카드 3개 선택 기능 (2) 레벨업 UI (스킬 효과 추후·UI만). PD 첨부 예시 영역 ("기술 선택" 화면 — 카드 3장 가로·색상 배너·원형 아이콘·동심원·"레벨 N"/"최대"·"확인" 버튼). PD 결정 (β) 채택 — BT12-Dev 보류 일부 해제·BT12-MVP-A 분리 항목 진행. **PD 결정 D안 (2026-05-09)** — 기능 우선·그래픽 디테일 차후 영역. | **D안 완료 2026-05-09** | [Phase 1 완료] `프로젝트/EerieVillage/개발/spec/BT12-MVP-A_설계_v1.md` (~600 라인). [Phase 2-A 완료] EerieVillage `047661c` — 시스템 코드 6 + JSON 테이블. [Phase 2-B 코드 완료] EerieVillage `5b2b753` — UI 컴포넌트 2 + LevelUpManager 통합. **[Phase 2-B asset 5 완료 2026-05-08]** EerieVillage `755a51c` — `Assets/Data/SkillPlaceholders/{A01_jineonbu, A05_hagikjin, P01_bonghwanggyeok, P12_saengmyeongkkot, AW01_cheonbugyeongmun}.asset` (5) + 각 .meta (5) + folder meta 2 = 12 파일. C49 표준 — Phase 1 dev-team-lead Opus 첫 정합 호출 + Phase 2 Sonnet 위임 + Phase 3 PM 검증. **dev-team-lead 자진 고지** — 설계서 v1 §2-4 영역 P01·P12·AW01 BT11-Plan v0.2 정합 X (3건 정정 적용). **설계서 v1 §2-4 + §7-1 정정 완료** (commit 후속). PD Editor 가이드 신규 `BT12-MVP-A_Phase2B_PDEditor가이드.md`. 대화로그 엔트리 10. | — | **PM 후속 대기**: ① Phase 2-B B (Prefab) + C (Scene 통합) — **PD 직접 발화 (2026-05-08): "단계1은 완료. 단계2, 3은 개발팀에서 작업해줘" + "E"** → 옵션 E 채택 (Claude Desktop Unity MCP 위임) → 본 PM 의뢰서 작성 `BT12-MVP-A_Phase2B_ClaudeDesktop의뢰서.md` (~16K) → PD Claude Desktop 새 세션 영역 의뢰서 첨부 영역 작업 진행 → EerieVillage commit·push → 본 worktree PM 보고 ② Phase 3 dev-team-lead 통합 검증 (Phase 1 + 2-A + 2-B asset + Prefab + Scene + BT5-Dev/BT7-Dev 회귀) ③ **단계 4 PD Play 검증** (적 처치 → EXP → 레벨업 → UI 노출 → 카드 선택 → 게임 재개) ④ 기획팀 별도 안건 — `01_카드_풀.md` line 114 P12 = "도약강화" 잔존 정정 (`02_스킬_효과_컨셉.md` line 381·418 영역 동기화 X) ⑤ icon sprite asset 5장 별도 작업 ⑥ 완료 아카이브 이동. (PD Editor 가이드 영역 = 옵션 D 보류 영역·차기 영역 활용 가능) | | BT12-Dev | 2026-04-24 23:00 | **스킬 시스템 설계 (C43 "개발팀" 호칭 직접 수령 + C49 시범 적용)** — PD 직접 지시 "개발팀은 기획서를 토대로 스킬 시스템 설계 진행". 기획서 v0.2 (`프로젝트/EerieVillage/기획/content/02_스킬_효과_컨셉.md` 액티브 6카테고리·패시브 5카테고리·각성 4패턴) + CSV v0.3 60종 (`프로젝트/EerieVillage/기획/content/02_스킬_효과_컨셉_v0.3.csv` UTF-8 BOM) 토대. C49 표준 프로세스 시범 적용 (개발팀장 Opus 설계 → 클라이언트팀 Sonnet 구현 → 개발팀장 검증) **[Phase 2-A 완료 2026-05-09]** Skills 13 파일 신규 EerieVillage `87710ba` (Interfaces 4 + Data 4 + Runtime 4 + Events 1). **[Phase 2-B 투사체 완료 2026-05-09]** Effectors 7 파일 신규 + SkillFireEvent 정정 EerieVillage `2f2790c` (Sonnet 자율 push·feedback `feedback_pm_sonnet_subagent_unauthorized_push.md` 신설). **[Phase 2-C 투사체 6 asset 완료 2026-05-09]** PD 결정 "(a)안" — 본 PM 직접 placeholder 수치 작성. EerieVillage `c01f25a` (14 파일·A01·A02·A03·A08·A14·A15 ActiveSkillData ScriptableObject). DisplayName 한글만 (한자 X). 차후 balance-designer 정식 수치. SOT 채택 = PD 본문 (A16 사신 강림·A17 오발탄·A18 죽음의 가시). Phase 2 분할 = (b) 5분할 + b-1 카테고리 6분할. **[Phase 2-D BT12-MVP-A 통합 정정 완료 2026-05-09]** EerieVillage `d53150b` — 6 파일 수정 + 9 .meta 보충. LevelUpManager._pool 제거 → SkillRuntimeFactory.RandomDraw3() · SkillSelectionUI/SkillCardSlot ActiveSkillData 시그니처 전환 · PlayerController Awake PlayerSkillInventory 자동 부착 · Projectile Layer Enemy fallback (Minor 1·proxy) · SkillRuntimeFactory.RandomDraw3 신규. Sonnet 의뢰서 "git add·commit·push 절대 금지" 명시 (feedback `feedback_pm_sonnet_subagent_unauthorized_push.md` 정합). Compile error 0건. pm-auditor Pass + Minor 1. | **진행중** | **[Phase 1 완료 2026-04-24]** 개발팀장 Opus 직접 설계 완결 — `프로젝트/EerieVillage/개발/spec/스킬_시스템_설계_v1.md` (1074 라인, 14 섹션). §1 아키텍처 4계층 · §2 인터페이스 4종(`ISkillRuntime`·`IActiveSkill`·`IPassiveSkill`·`IAwakeningSkill`) + ScriptableObject 3종(`ActiveSkillData`·`PassiveSkillData`·`AwakeningSkillData`) + `PlayerSkillInventory`·`PlayerStats` · §3 CSV→ScriptableObject→Runtime→Health.Decrement 데이터 흐름 + 카테고리 문자열 매핑 · §4 VS 순수형 자동 발동 사이클 (OnTime·OnHit·OnKill + `ActiveSkillRuntime.Tick(deltaTime)` 독립 Cooldown) · §5 `AwakeningManager` 3 조건 동시 충족 + 4 패턴 Dispatcher + 다중 각성 선택 UI · §6 카테고리 매핑 6+5+4 (B는 BT7-Dev `AttackHitbox` 재활용 · 나머지 5 효과 발동기 신설) · §7 Phase 2-A~E 작업 단위 분해 (스크립트 25개·테스트 10건·asset 60개) · §10 BT7-Dev 통합 영역 (Health·AttackHitbox·PlayerAttackTicker·PlayerController 완전 보존 · `Health.OnDamagedEvent` 확장 필요 명시) · §11 기각안 5건 + 대화로그 추가 2건 (총 7건 C32 초과). 대화로그 `공유/대화로그/EerieVillage/2026-04-24.md` `[BT12-Dev Phase 1 완료] 개발팀장 스킬 시스템 설계 v1 (1074 라인)` 엔트리 완결. **C48 3자문 전수 통과**로 Phase 2 클라이언트팀 Sonnet Task는 본 Task에서 호출하지 않고 **PM 차원 별도 위임** 권고 (C48·C49·C50 정합) | **기획서 확정 대기** (PD 2026-04-25 직접 지시 — "기획서 확정되기 전까지 작업 대기") | **재개 트리거**: 기획팀 v0.3 또는 v1.0 확정 + balance-designer 60종 수치 확정 + narrative-designer 카드명 세계관 재매핑 결정 → C50 Phase 2 사전 승인 옵션(a/b/c/d) PD 결정 → 분할 시 Phase 2-A~E 순차 진행 (인터페이스·SO → 중앙 컴포넌트 → 효과 발동기 → 60장 .asset → EditMode 테스트) → Phase 3 개발팀장 검증 → 완료 아카이브. **선행 차단 블로커**: `paths.local.json.UNITY_PROJECT_ROOT: __SET_PER_PC__` 미설정 — 재개 시 PD PC 경로 설정 필요. Phase 1 산출물 1074 라인 설계 문서는 보존 | diff --git a/공유/기획/GodDem/2026-08-22_메타아키텍처_재설계_v1.md b/공유/기획/GodDem/2026-08-22_메타아키텍처_재설계_v1.md new file mode 100644 index 0000000..0bf7772 --- /dev/null +++ b/공유/기획/GodDem/2026-08-22_메타아키텍처_재설계_v1.md @@ -0,0 +1,362 @@ +# GodDem 아웃게임 메타 아키텍처 재설계 v1 (P2 — 골격) + +> **작성**: system-designer(기획팀) 2026-08-22 · **2단계 산출물** (P32 맥락 분할 · C50 대규모 승인분) +> **PD 지시 원문 (C42-2 A, 2026-08-22)**: "원작 데이터 아키텍처 전면 이식이 맞아" / "원작대로 가챠 도입" / "현 세션 P2 계속" +> **입력 문서**: [`2026-08-22_원작아키텍처_이식청사진_v1.md`](./2026-08-22_원작아키텍처_이식청사진_v1.md)(청사진v1, balance-designer P1) · [`2026-08-22_원작배율_재추출_원본_v1.md`](./2026-08-22_원작배율_재추출_원본_v1.md)(재추출v1) · [`2026-08-20_원작밸런스_해독_매핑_v1.md`](./2026-08-20_원작밸런스_해독_매핑_v1.md)(매핑v1) +> **절대 제약**: GodDem 레포(`E:\NerdNavis\GodDem`) Read만 수행, 수정 0건. Unity MCP 미사용. 본 문서가 유일 산출물. +> **범위**: 메타 아키텍처 골격(각 층 역할·상호작용·데이터 스키마 구조). 세부 수치·CSV 실제 값 채움은 P3 축별 단계(C50). +> **표기 규칙(C5·C44)**: 🟢확정(코드/문서 직접 실측) · 🟡추정(근거 있으나 미확정) · 🔴재추출 필요/미확보 · `TBD(Px)` = 후속 단계 수치 결정 자리 +> **감사 이력(C35)**: plan-auditor 모드A 1회 수행 — 판정 **조건부통과**(Critical 2·Major 6·Minor 4). 본 v1은 그 지적을 전부 반영한 최종본이다(§11). + +--- + +## 0. 결론 요약 + +청사진v1이 제시한 5층 대응 후보(§2-2)를 **전부 채택**하고 실제 스키마를 확정한다. 핵심 설계 원칙 1개로 5층 전체를 관통시켰다: + +> **인게임(매판 리셋)은 "이번 판 빌드 다양성", 아웃게임(영구)은 "계정 장기 성장"을 담당한다. 같은 스탯을 양쪽에 중복 배치하지 않는다 — 인게임에 이미 기능 중인 것은 그대로 두고, 원작에 있지만 우리 게임에 아직 없는 것만 아웃게임 5층에 새로 배치한다.** + +**청사진 §2-3 정정(C44)**: "인게임 미보유 5종"은 재검증 결과 **6종**이다 — `stun_rate`가 누락돼 있었다(§2-1). + +**결합 구조 정정(plan-auditor C-1 반영)**: 아웃게임→인게임 결합은 "1곳"이 아니라 **Attack/Hp 조회 3개 호출부 + Defense 채널 1개 호출부**, 총 4곳이다. 이를 각 스탯별 **단일 계산 메서드**(`SurvivalMeta.FinalAttack()`/`FinalHp()`/`TotalDefenseRatio()`)로 캡슐화해 호출부가 몇 개든 공식은 한 곳에서만 정의되도록 한다(§3-4) — 이 캡슐화 자체가 이 코드베이스가 반복 겪은 "3중 SOT" 결함 패턴(`SurvivalMeta.cs` 자체 주석이 경고하는 바로 그 패턴)의 재발을 막는 설계 장치다. + +| 항목 | 결론 | +|---|---| +| 5층 채택 | ①레벨→"영웅레벨"(신규 영구) ②승급→레벨 게이팅+3스탯 보너스(신규 영구) ③장비강화→per-item 레벨업(SurvivalItemCatalog 확장) ④가챠→장비 확률 획득(전면 신규, PD 확인 완료) ⑤스킬→마스터리 영구 해금(SurvivalActiveSkillRunner 연동, 드래프트 풀 필터링 방식으로 확정) | +| 능력치 18종 배치 | 인게임 기능 11종 유지 + 인게임 사장(死藏) 1종(penetrate_ratio) ⑤로 이관 + 완전 신규 6종을 ④(4종 확정: hit/stun/retaliate/combo) + ele_hurt_add·ele_penetrate_ratio(2종, 🟡 ④ 잠정·P3-A 확정) | +| 경계 재정의 | "판 시작 전 확정 vs 판 진행 중 리셋" 시점 기준. 네임스페이스 충돌은 클래스 분리+CSV 키 접두+**단일 계산 메서드 캡슐화** 3중 방지 | +| 재사용/확장 | SurvivalMeta(확장 기반)·SurvivalUpgrade(불변 재사용)·SurvivalSkill(불변+조건부 확장) / SurvivalItemCatalog·**SurvivalShopCatalog(구조 확장 필요 — 확률 지급물 미지원 확인)** / 신규 클래스 4·CSV 7종 | +| 미확정 이관 사항(PD/개발팀 영역, §10) | 가챠 소비 재화(골드 vs 젬, 🔴 원작 근거 부재) · ele_* 2종 최종 층(④/⑤) · defense 클램프 공유 방식 | +| P3 분할 | P3-A(능력치 정리) → P3-B1(레벨+승급) → P3-B2(장비강화, 원본 재대조 선행) → P3-B4(스킬마스터리) → P3-B3(가챠, PD 정책 확인 후) → P3-C(스테이지, 병렬 가능) | + +--- + +## 1. 5층 재설계 확정 + +### 1-0. 표기 원칙 — 인게임과 아웃게임의 이름을 분리한다 + +현재 코드에 이미 **"Level"이라는 이름이 인게임에서 쓰이고 있다** (`SurvivalBattleManager.Level`, EXP 20단계, 매판 리셋, 레벨업마다 스킬 3택1). 이것은 원작 ①레벨(hero_level, 스탯 총량 공식)의 이식이 **아니라** 원작 ⑤스킬(heroskilltree EXP 소비 곡선)의 이식이다(🟢, `ExpTable = {50,100,...,1300}` 20단 수열이 매핑v1 §2-8 `heroskilltree` 수열과 정확히 일치 — 코드 주석도 이를 명시). 따라서 신규 영구 레이어에 "레벨"이라는 이름을 그대로 쓰면 기존 인게임 "Level"과 혼동된다. + +**본 문서부터 용어를 분리한다**: + +| 용어 | 소속 | 실체 | +|---|---|---| +| **런레벨**(RunLevel) | 인게임, 기존, 불변 | `SurvivalBattleManager.Level` — 원작 ⑤스킬 EXP곡선의 이식체, 매판 리셋 | +| **영웅레벨**(HeroLevel) | 아웃게임, 신규(본 문서 Layer①) | 원작 ①레벨(hero_level) 스탯총량 공식의 이식체, 영구 누적 | + +### 1-1. Layer① 영웅레벨(HeroLevel) — 아웃게임 신규 + +**재미 근거(P30)**: 판을 거듭할수록 "이번 판 시작점 자체"가 조금씩 높아진다는 감각 — 로그라이크의 매판 완결성(이번 판은 이번 판대로 승부)을 해치지 않으면서, 계정을 오래 키운 유저가 신규 유저보다 항상 유리한 출발선을 갖는 장기 동기(수집·성장 게임의 핵심 재미축)를 제공한다. 청사진이 지적한 "능력치가 점차 확장되는 느낌"의 가장 직접적인 담당 층. + +**역할**: 판 시작 전 이미 확정된 공격력/체력 "바닥"을 영구히 높인다. 원작 `stat(L)=0.22L²+0.26L`(2차) 구조를 형태만 재이식한다(원작 1800행 절대치는 규모 불일치로 폐기, 매핑v1 §0 원칙 승계). + +- **획득 조건**: 소비 재화 `TBD(P3-B1)`(디폴트 권고: 신규 중간재 도입 없이 기존 골드(`GOLD_ID=201`) 직접 소비 — 원작의 골드→경험서→소비 2단 경제를 스킵. 중간재 도입 필요성은 balance-designer 열린 이슈). +- **비용 곡선**: 원작 3차식(`0.5L³+4.5L²`) 형태만 재사용, 절대값은 `TBD(P3-B1)`. +- **산출**: `AttackBudget(HeroLevel)`·`HpBudget(HeroLevel)` 2개 함수 — 기존 `SurvivalMeta.BaseAttack`/`BaseHp` 상수는 `HeroLevel=0` 앵커로 유지하고, HeroLevel 상승분은 그 위에 가산되는 증분으로 취급(§3-4). +- **상한**: 없음(원작 "수확체감 없음" 원칙 승계) — Layer②가 열어주지 않으면 다음 구간 진입 불가. + +### 1-2. Layer② 승급(Promotion) — 아웃게임 신규 + +**재미 근거(P30)**: 영웅레벨 하나만 있으면 "돈 모아서 계속 누르는" 단조 곡선이 된다. 승급이라는 별도 게이팅 자원을 끼워 넣으면 "지금 승급을 더 할까, 레벨을 더 올릴까"라는 자원 배분 선택이 아웃게임에도 생긴다 — 원작이 이미 검증한 문지기 문법(매핑v1 §2-2)을 그대로 가져와 로그라이크 장르에도 자연스러운 "메타 프로그레션 우선순위 선택" 재미를 만든다(청사진 §2-2② 근거 승계). + +**역할**: 원작의 진짜 기능(레벨 캡 게이팅)을 그대로 이식한다. Layer①의 "문지기". + +- **공식 형태만 재사용**(절대 계수는 원작 그대로 쓰지 않는다 — 매핑v1 §0 "그대로 복사하면 자릿수가 터진다" 경고 대상이므로 `TBD(P3-B1)`로 유보): 비용 `gold=quality×(star+1)³×(star+50)` 꼴(4차) / 보너스 `k×quality×star` 꼴(선형, 공/방/HP 계수 동일) / 레벨캡 `k'×(star+1)` 꼴(선형 게이팅). +- **재실측 선행 필수**: 매핑v1 §2-2 자체가 "성29·성30 레벨캡 12행 불일치, 재검증 필요"를 🔴로 남겼다 — 본 층 채택 시 재실측이 P3-B1의 직접 선행 조건이다(청사진 §5 우선순위 승계). +- **보너스 3스탯 유지**: 원작 실측(매핑v1 §2-2 "공/방/HP 3스탯 항상 동일값, 186행 검증 True")을 존중해 attack/hp뿐 아니라 **defense도 포함**한다. 단 이는 아웃게임에 처음으로 `defense` 채널을 들여오는 지점이며, 인게임에 이미 `defense_add`가 있어 **결합식이 RecalcPlayer 쪽에도 필요**하다(§3-3·§3-4·§7 R-B2에서 정면 처리 — "RecalcPlayer 무변경" 같은 과장된 주장을 하지 않는다). + +### 1-3. Layer③ 장비강화(Equipment Upgrade) — SurvivalItemCatalog 확장 + +**재미 근거(P30)**: 지금은 장비를 "얻으면 끝"이라 수집 자체가 목표의 전부다. 개별 장비에 강화축이 생기면 "어느 장비를 밀어줄까"라는 2차 선택이 생겨 같은 9종 장비라도 유저마다 다른 투자 경로가 나온다 — 수집(④가챠)과 육성(③강화)이 분리된 2단계 동기 구조는 원작뿐 아니라 이 장르(수집형 강화 게임) 전반의 표준 재미 축이다. + +**역할**: 현재 정적인(레벨 개념 없는) 9종 장비 각각에 **개별 강화축**을 신설한다. 원작 `Base(quality)+V(level)` 완전 가산 분해(매핑v1 §2-3, `SurvivalUpgrade.cs`가 이미 검증한 패턴과 동일 구조)를 재사용한다. + +- **강화 대상**: **itemId 단위**(슬롯 단위 아님) — 원작이 `heroequipment` 개별 ID에 레벨을 매기는 것과 동일. 슬롯 단위로 하면 "어떤 장비를 껴도 같은 강화치"가 되어 수집 동기가 약화된다(§8 기각안3). +- **소비 재화**: 골드(기존 `GOLD_ID`) — 원작 그대로. +- **슬롯 종속 2차 스탯**(매핑v1 §2-3 "슬롯 종속" 규칙 재사용): 원작 subtype1(공격형)=`attack_speed_add` 파생, subtype2(방어형)=`defense_add` 파생. 우리 6슬롯에 이 규칙을 적용하면 슬롯마다 주 스탯(Attack 또는 Hp) 외에 부 스탯 1종이 함께 오른다. 슬롯→부스탯 매핑표는 `TBD(P3-B2)`. +- **재실측 선행 필수(청사진 §5 R-A5 승계)**: `heroequipment`/`heroequipmentupgrade` 계단식 M수열(16단계) 원본 CSV 재대조가 P3-B2의 직접 선행 조건이다 — 매핑v1 §6-5가 "실제 PM 감사 적발 오류 4건 전부 ⚠️ 절에서 발생"이라 경고한 바로 그 절(⚠️ 표기)이며, 공격력 트랙도 동일 경로로 재추출이 필요했던 전례가 있다. +- **아이템 융합(TryFuse)과의 상호작용 미정의(엣지 케이스)**: `EquipLevel[itemId]>0`인 장비가 융합 재료로 소모돼 `Owned=0`이 되면 투자한 강화분이 고아(orphan)가 된다. 기본 권고: 강화분>0 아이템은 융합 차단(경고 후 확인) — 최종 결정은 P3-B2(§7 R-B3). +- **레벨업 vs 승급도박(forging) 분리 여부**: 원작은 레벨업(확정)과 등급업(도박, 실패율 0.6~0.9)이 별도 축이다. 현재 `TryFuse()`는 무조건 성공(도박 요소 0). 도박 요소 도입 여부는 재미(P30) 판단이 필요한 열린 이슈 — 본 문서는 구조 자리만 마련, 채택은 P3-B2. + +### 1-4. Layer④ 가챠(Gacha) — 전면 신규 (PD 도입 확정) + +**재미 근거(P30)**: "이번에 뭐가 나올까"라는 확률 기대감은 확정 구매(현 상점)에 없는 재미축이다. 원작이 이미 등급별 확정 지급(quality↑ = 하위 결과 배제)으로 "실패해도 손해는 아니다"라는 안전판을 설계해뒀다 — 이를 그대로 가져오면 신규 재미축 도입과 동시에 "질렀는데 완전 꽝"이라는 이탈 유발 요소를 피할 수 있다. + +**역할**: 장비를 확률로 획득하는 새 채널을 **추가**한다(기존 상점 직접구매를 대체하지 않음 — §4). + +- **가중치 모델**: 원작 `heroequipmentskill`(매핑v1 §2-5) 구조 재사용 — **전 풀 합 10000 basis point 강제**(매핑v1 §2-6 채택 원칙 재사용). **정정(plan-auditor m-3)**: 이 "합 10000 강제"는 인게임에서 이미 검증된 관행이 아니라 **본 층이 이 프로젝트에서 처음 실제로 도입하는 계약**이다 — `SurvivalSkill.cs`의 `GradeWeight={5514,2944,888}`는 합이 **9346**이며 `RollGrade()`가 그 실제 합으로 정규화하는 방식이라(🟢 실측), "합 10000 고정"을 따르고 있지 않다. 가챠(Layer④)에서 이 규율을 처음 실제로 강제하고, 인게임 드래프트 쪽 정합 여부는 본 문서 범위 밖(별건). +- **천장(pity)**: 원작 `drawtype`은 4단이나 18행 중 4행만 실사용·스케줄 2종뿐(매핑v1 §2-6). "우리 2단 채택"은 매핑v1 §4(e)가 인게임 스킬드래프트용으로 **문서화한 설계**이며, 코드 실측 결과(`SurvivalSkill.cs` `RollGrade()`) 그 설계는 아직 **코드로 구현되지 않았다**(🟢 실측 — 천장 카운터 없음, 순수 가중치 랜덤). 본 층에서 2단 천장을 **처음 실제 구현**한다 — 인게임 쪽 천장 미구현은 범위 밖 별건(§10). +- **등급의 실질 가치**: 원작 "등급이 높을수록 확정 티어 지급"(quality→확정 확률 대체) 원칙 재사용 — 높은 등급 뽑기권은 낮은 등급 결과를 배제. +- **소비 재화 — 🔴 미확보, PD 이관**: 원작 문서 3건 어디에도 `drawlib`/`drawtype`의 소비 재화(무료 vs 유료) 언급이 없다(매핑v1 §2-6은 weight·천장만 다룸). "원작대로 가챠 도입"이라는 PD 지시가 구조·스키마 설계까지는 덮지만(C1), 무료재화(골드) 가챠와 유료재화(젬) 가챠는 서로 다른 BM이자 R-A3 정책 등급도 달라진다. **본 문서는 재화 종류를 확정하지 않는다** — 결정은 PD 영역(§10). +- **드롭 대상 확장**: 가챠는 §1-3(장비강화)과 별개로 **SurvivalItemCatalog 자체의 폭 확장**(신규 등급 3+·신규 아이템) 창구다 — 청사진 §3의 "등급 1~2뿐, 극히 협소" 문제의 실제 해소 지점. +- **신규 스탯 수용(확정 4종 + 잠정 2종)**: `hit_rate`·`stun_rate`·`retaliate_rate`·`combo_rate`(명중/회피계+특수효과계, 원작 B-템플릿 ×2 등비 공유군, 재추출v1 §2-2 — 확정 배치) + `ele_hurt_add`·`ele_penetrate_ratio`(🟡 잠정, §2 상세). + +### 1-5. Layer⑤ 스킬 마스터리(Skill Mastery) — SurvivalActiveSkillRunner 연동 + +**재미 근거(P30)**: 지금은 계정을 아무리 오래 해도 다음 판 스킬 뽑기 폭이 첫 판과 똑같다. 마스터리로 드래프트 후보 자체를 넓혀주면 "이번 판엔 어떤 언락된 카드가 뜰까"라는 장기 기대감이 매판 드래프트 재미 위에 한 겹 더 얹힌다 — 매판 완결성(로그라이크)과 영구 확장(원작 학습형 스킬트리)을 절충하는 지점. + +**역할**: 원작 학습형 스킬트리의 "영구 학습" 기능만 가져오고, 학습 UX는 로그라이크 관용어인 **"영구 언락→드래프트 풀 확장"**으로 재해석한다(청사진 §2-2⑤ 판단 승계). + +- **연동 지점 실측**(C39-10): `SurvivalActiveSkillRunner`는 `_owned`/`_byId`를 인스턴스 필드로 갖고 `Awake()`에서 빈 상태로 시작한다(🟢, 완전 매판 리셋). `LoadActiveSkills()`는 `Resources/Skills/Active/*.asset` 전체를 조건 없이 로드한다 — 현재는 액티브 스킬 습득에 게이팅이 전혀 없다. +- **메커니즘 확정 — 드래프트 풀 필터링(Pre-seed 방식 기각)**: `SurvivalSkill.Draw()`가 액티브 후보를 계산하는 지점(`avail` 리스트)에 `SurvivalMeta.Data.UnlockedActiveCardIds` 조회 조건 1줄을 추가해, 언락 안 된 카드는 그 판 드래프트에 아예 등장하지 않게 한다. **"판 시작 시 자동 장착(pre-seed)" 방식은 채택하지 않는다** — 로그라이크의 매판 선택 긴장감(레벨업마다 3택1)을 그대로 보존하면서 "풀이 넓어진다"는 감각만 추가하는 쪽이 재미(P30) 관점에서 더 낫고, 구현도 1줄 필터로 더 단순하다. 기본값은 **전체 언락 상태로 시작**(하위호환 유지 — 아무 투자 안 한 신규 계정은 지금과 동일하게 전체 풀에서 드래프트). +- **패시브 마스터리 노드**: 드래프트를 거치지 않고 ①②③처럼 항상 적용되는 영구 가산 스탯. 확정 배치는 `penetrate_ratio` 1종뿐이다(아래 이관 근거). `ele_hurt_add`/`ele_penetrate_ratio`는 §2에서 🟡로 별도 처리한다. +- **`penetrate_ratio` 이관(확정 권고)**: 현재 인게임 CSV(13종)에 존재하나 `ConsumedUpgradeKeys`에 없어 **사장(死藏)**돼 있다(🟢 실측, `SurvivalBattleManager.cs` L152-160). **중요 정정(plan-auditor m-2)**: 이 트랙은 방치된 위험 요소가 아니다 — `ValidateUpgradeCoverage()`(L167)가 기동 시 미소비 키를 경고하도록 이미 설계돼 있고(주석이 "동일 유형의 재발을 막는다"고 명시), 상점에서도 이미 자동으로 숨겨진다. 실제 문제는 **`ConsumedUpgradeKeys`(소비 목록)와 `RecalcPlayer`(실계산)가 손으로 동기화해야 하는 한 쌍**이라는 점이며(코드 주석 L148-150이 이미 자인), 이 수동 동기화 부담은 아웃게임에 신규 키를 추가할 때도 똑같이 발생한다(§3-3에 동일 원칙 적용). `penetrate_ratio`를 인게임에서 배선(1줄 추가)하는 대안 대신 ⑤로 이관하는 이유는 순수하게 §0 원칙("이미 인게임에 있는 건 유지, 신규만 아웃게임 배치") 적용이지, 위험 회피가 아니다(§8 기각안 다). +- **속성(elemental) 시스템 전제조건 미확인**: `ele_hurt_add`/`ele_penetrate_ratio`가 의미를 가지려면 전투에 "속성" 개념이 필요하다. `AttributeTag`(Flags enum, 물리/화염 등)가 `SkillDataAsset.cs`에 이미 존재하나(🟢), 이것이 `SurvivalUnit.TakeDamage()`의 실제 데미지 계산에서 상성/저항으로 소비되는지는 **미확인**(🔴, 범위 외 — P3-B4 착수 시 개발팀 재확인 필수 선행 조건). 이 전제조건은 ele_* 2종이 최종적으로 ④에 배치되든 ⑤에 배치되든 **동일하게 적용**된다(§2 참조). + +### 1-6. 5층 상호작용 요약 + +``` +[판 시작 전 — 아웃게임, 영구] + ①영웅레벨(HeroLevel) ──예산 산출──> AttackBudget·HpBudget + ②승급(Promotion) ──게이팅────> ①의 최대 도달 가능 HeroLevel 상한 + ──보너스────> attack%·hp%·defense% (defense는 §3-4 별도 결합) + ③장비강화(EquipLv) ──독립──────> 슬롯별 attack/hp + 부스탯(속도|방어) + ④가챠(Gacha) ──확률 공급──> ③이 강화할 "장비 자체"(신규 아이템) + 옵션(hit/stun/retaliate/combo, +ele_*🟡잠정) + ⑤스킬마스터리 ──패시브────> penetrate_ratio 영구 가산(+ele_*🟡잠정 시) + ──풀 확장───> 런레벨업 드래프트의 "액티브 카드" 후보 목록(필터링, 패시브와 별개 트랙) + ↓ (①②③④의 스탯 기여 = 아웃게임 최종 flat/ratio 총합, §3-4) +[판 진행 중 — 인게임, 매판 리셋] + 런레벨(RunLevel, 기존) ──EXP──────> 3택1 드래프트(⑤가 넓혀준 액티브 풀 + 기존 패시브 10종 카탈로그에서 추첨) + 강화(SurvivalUpgrade, 기존 13종) ──골드──> attack_add 등 11종 기능 누적(불변) +``` + +원작 §1-2 인과("①이 바닥, ②가 ①의 상한 게이팅, ③은 독립, ④는 ③의 확률원, ⑤는 전부와 독립된 별도 슬롯")가 보존됨을 확인. 단 ⑤는 "패시브 가산"과 "드래프트 풀 확장" 2개 하위 트랙으로 분리된다는 점이 원작에 없던 우리 쪽 재해석이다(위 표에서 명시적으로 분리 표기). + +--- + +## 2. 능력치 18종 배치 확정 (청사진 §2-3 정정 포함) + +### 2-1. 정정 — "인게임 미보유"는 5종이 아니라 6종이다 + +청사진 §2-3은 "차집합 5종(hit_rate·ele_hurt_add·ele_penetrate_ratio·retaliate_rate·combo_rate)"이라 기재했다. `SurvivalUpgrade.csv`(13행 전수) + `SurvivalSkill.cs`의 `Catalog`(10항목 전수) 직접 대조 재실측(plan-auditor 재검증 완료) 결과: + +| 18종 원본 목록 | 인게임 상태 | +|---|---| +| lucky_rate, lucky_multiple, hp, hp_add, attack_add, defense_add, attack_speed_add, hurt_add, hurt_reduce, suck_ratio, dodge_rate | ✅ 기능 중(11종) | +| penetrate_ratio | ⚠️ CSV엔 있으나 `ConsumedUpgradeKeys` 미포함 = 사장(1종) | +| hit_rate, **stun_rate**, retaliate_rate, combo_rate, ele_penetrate_ratio, ele_hurt_add | ❌ 완전 미보유(6종, `stun_rate`가 청사진 누락분) | + +**11 + 1 + 6 = 18, 정합.** "미보유 = 6종"이 정확하며, `stun_rate` 누락은 청사진 자체가 🟡 표기 없이 넘어간 대목이다 — C3에 따라 은폐 없이 표면화한다. + +**참고(18종 외 트랙)**: 인게임 `attack`(정액)은 18종에 속하지 않는다 — 원작 27개 effect code 카탈로그(재추출v1 §2-1)에 대응 항목이 없는 **GodDem 자체 발명 트랙**이다. 다만 이는 무근거 발명이 아니라 직전 완료된 "공격력 원작 2층 복원" 사이클(`26ff655`)이 원작 hero_level의 "정액+배율 2층 구조" 개념을 인게임 스케일로 의도적으로 재현한 결과물이다(`hp`의 정액/배율 쌍 구조를 `attack`에도 대칭 적용, 4:1 비율 파생). 본 문서의 18종 집계에서는 제외한다. + +### 2-2. 배치 확정표 + +| 능력치 | 층 | 사유 | +|---|---|---| +| attack_add, hp_add, hp, attack_speed_add, hurt_add, hurt_reduce, defense_add, lucky_rate, lucky_multiple, suck_ratio, dodge_rate | **인게임 유지**(불변, 11종) | 이미 SurvivalUpgrade에서 기능 중 — 중복 배치 금지 원칙(§0) | +| hit_rate, stun_rate, retaliate_rate, combo_rate | **④가챠 옵션**(확정, 4종) | 원작 분류상 "명중/회피계"+"특수효과계"이며 원작 B-템플릿(×2 등비, 재추출v1 §2-2) 공유군 — 확률 드로우풀 스탯으로서의 원작 성격과 일치 | +| ele_hurt_add, ele_penetrate_ratio | **🟡 ④ 잠정(2종), P3-A 확정 필요** | 청사진 §1-1은 "5층(스킬) 전용 scope"로 분류했으나 🟡 태그였고, 재추출v1 §2-1(27코드−res6=21) 산술이 §3의 "장비옵션 드로우풀 실사용 21종"과 일치해 오히려 ④ 소속일 가능성이 있다(plan-auditor M-1 지적). 재추출v1 §3 스스로 "두 usage scope가 혼재"라 경고한 대목이라 본 문서 단계에서 최종 확정하지 않는다 — P3-A 재추출로 확정. 어느 쪽에 배치되든 §1-5의 속성 시스템 전제조건은 동일 적용 | +| penetrate_ratio | **⑤스킬마스터리로 이관**(확정, 1종) | 인게임에서 이미 사장된 트랙을 §0 원칙(신규만 아웃게임 배치)에 따라 이관 — 위험 회피가 아니라 배치 원칙 적용(§1-5) | + +--- + +## 3. ★ 매판 리셋 인게임 ↔ 영구 아웃게임 경계 재정의 + +### 3-1. 판정 원칙 (일반화 규칙) + +> **"판이 시작되기 전에 이미 값이 정해져 있는가?"** — 그렇다면 아웃게임. **"이번 판 안에서 무작위로 얻고 이번 판이 끝나면 사라지는가?"** — 그렇다면 인게임. + +부가 원칙 2개: +1. **중복 배치 금지** — 같은 스탯 키를 인게임·아웃게임 양쪽에 동시에 두지 않는다(R-A2 재발 방지 최우선 원칙). +2. **총량 vs 증분 분리** — 인게임·아웃게임이 같은 물리량(Attack·Hp·Defense)에 동시에 기여하는 것은 허용하되, 반드시 **서로 다른 시점의 항(項)**으로 분리하고 **결합 공식을 한 곳에서만 정의**한다(§3-4). + +### 3-2. 현재 SurvivalMeta·SurvivalUpgrade와의 관계 + +**둘 다 이미 정확한 자리에 있다** — 청사진 §3의 판정을 재확인한다: + +- `SurvivalMeta`(장비 6부위·공격/체력만) = 원작 5층 중 **③장비만** 이식된 아웃게임. 얕지만 위치는 맞다. +- `SurvivalUpgrade`(13종, 매판 리셋) = 원작 4층(가챠) 스코프를 인게임 화폐 강화로 이식한 것 — "인게임" 정체성 자체는 정확. + +본 설계는 이 둘을 **대체하지 않고 확장**한다. + +### 3-3. 네임스페이스 충돌(R-A2) 3중 방어 + +**충돌이 실제로 발생하는 지점**: Layer②(승급) 보너스가 아웃게임에 `defense` 채널을 처음 들여오는데, 인게임 `SurvivalUpgrade.csv`에도 이미 `defense_add`가 있다. + +1. **구조적 분리(1차 방어, 이미 존재)**: 아웃게임 5층은 `SurvivalMeta`(확장 클래스) 소속, 인게임은 `SurvivalUpgradeTable` 소속 — 서로 다른 클래스·CSV·`Total()`이라 두 딕셔너리가 물리적으로 섞이지 않는다. +2. **CSV 키 접두 가드(2차 방어, 신규 도입)**: 이 프로젝트는 "동일 문자열 키를 다른 테이블에 복붙하다 조용히 어긋나는" 결함 이력이 반복됐다(사장된 `penetrate_ratio`, stale "12종" 주석, 사장된 `HeroAttackMultiplier` 아이템). 신규 아웃게임 CSV의 `s_StatKey`는 인게임과 절대 같은 문자열을 쓰지 않는다 — 예: 인게임 `defense_add` ↔ 아웃게임 `promo_defense_add`(승급)·`equip_defense_add`(장비강화). +3. **단일 계산 메서드 캡슐화(3차 방어, 신규 도입 — plan-auditor C-1 반영)**: 결합 공식 자체를 호출부마다 재작성하지 않고 `SurvivalMeta` 안에 딱 한 번만 정의한다(§3-4). 호출부가 3개든 10개든 전부 이 메서드 하나만 부르므로, "공식이 여러 곳에 흩어져 하나만 안 고쳐 어긋나는" 3중 SOT 결함이 구조적으로 발생하지 않는다. **이 신규 관리 부담(신규 outgame 키 추가 시 접두 가드 준수)은 코드 리뷰 체크리스트 항목으로 명문화 권고**(§7 R-A2). + +### 3-4. 결합 지점 확정 (구현 가이드라인 — plan-auditor C-1·C-2 반영 재작성) + +**실측 결과 결합이 필요한 호출부는 4곳**이다(🟢, 최초 초안의 "1곳" 주장은 정정): + +| 스탯 | 현재 호출부(수정 없이 그대로 둘 대상) | 정정 방식 | +|---|---|---| +| Attack | `SurvivalBattleManager.ApplyMetaEquipment()` L121-122 | 아래 신규 메서드 호출로 교체 | +| Attack(표시) | `SurvivalLobbyController.Hero.cs` L232-233 (`RefreshHeroStats`) | 동일 신규 메서드 호출로 교체 | +| Attack(상세표시) | `SurvivalLobbyController.Hero.cs` L338-339 (`UpdatePropertyText`, Base/+Bonus 2단 표기) | 신규 메서드 호출 + **비율 항 표기 방식은 ux-designer 협의 대상**(현재는 flat 가산만 표기하는 구조라 비율 항이 추가되면 "기초/장비/승급%" 3단 분해 표시가 필요할 수 있음) | +| Defense | `SurvivalBattleManager.RecalcPlayer()` L202 `reduce = ...` | 항 1개 추가(아래) — **"RecalcPlayer 무변경"은 성립하지 않으므로 정정** | + +``` +// 신규: SurvivalMeta에 결합 공식을 한 곳에만 정의 (호출부는 전부 이것만 부른다) +SurvivalMeta.FinalAttack() = (BaseAttack + TotalAttack()) × (1 + TotalAttackRatio()) +SurvivalMeta.FinalHp() = (BaseHp + TotalHp()) × (1 + TotalHpRatio()) + // TotalAttack()/TotalHp() 내부(신규) = ①영웅레벨 예산 + 기존 장비 flat 총합 + ③강화분 + // TotalAttackRatio()/TotalHpRatio() 내부(신규) = ②승급 attack%/hp% 보너스 + +SurvivalMeta.TotalDefenseRatio() = ②승급 promo_defense_add% // 신규, 인게임과 별개 네임스페이스 + +// 호출부 정정 +ApplyMetaEquipment(): PlayerAttack = SurvivalMeta.FinalAttack(); PlayerHp = SurvivalMeta.FinalHp(); +Hero.cs RefreshHeroStats(): 같은 SurvivalMeta.FinalAttack()/FinalHp() 호출로 교체(3중 SOT 방지) +RecalcPlayer() L202(수정): reduce = t.Total("hurt_reduce") + t.Total("defense_add") + t.Total("dodge_rate") + + SurvivalMeta.TotalDefenseRatio(); // ← 1개 항 추가 + Player.DamageReduction = Mathf.Clamp(reduce, 0f, 0.8f); +``` + +**defense 클램프 공유 리스크와 권고안(§7 R-B2)**: 위 방식대로 `promo_defense_add`가 인게임 항들과 **같은 0~0.8 클램프**를 공유하면, 계정을 오래 키운 유저는 판 시작부터 클램프에 근접해 있어 **그 판의 인게임 방어 강화 선택 자체가 무의미**해지는 함정이 생긴다(P30 직결 — "성장했는데 체감 0"). 권고 기본안: 아웃게임 defense는 **클램프 이후 별도 승산항**으로 분리한다 — `최종피해감소 = 1 - (1-ingame_reduce_clamped) × (1-outgame_defense_ratio)`. 이러면 인게임 클램프(0.8 상한)는 그대로 보존되면서 아웃게임 투자도 항상 체감 있게 작동한다. 최종 수식·클램프 정책은 P3-B1에서 balance-designer 확정. + +**추가 발견 — `Player.Attack`의 숨은 2번째 소비처(plan-auditor m-1)**: `SurvivalActiveSkillRunner.cs` L18,83이 `const float BaselineAttack = 22f`를 자체 보유하고 `(atk/BaselineAttack)`로 액티브 스킬 데미지를 스케일링한다. 이는 (a) Layer①로 `Player.Attack`이 오르면 **액티브 스킬 데미지도 선형 증폭**된다는 뜻이며, (b) `22f`가 `SurvivalMeta.BaseAttack`의 **const 복제본**이라는 뜻이다 — `SurvivalMeta.cs` L57-60 자체 주석이 "SOT로 선언한 값에는 const를 쓰지 않는다"고 명시적으로 금지한 바로 그 패턴이 여기 이미 존재한다. 본 문서 범위(P2 설계) 밖의 **기존 결함 발견**이므로 여기서 수정하지 않되 은폐하지 않는다(C3) — P3-B1 착수 시 `BaselineAttack`을 `SurvivalMeta.BaseAttack` 참조로 교체 권고(§7 R-B4). 영웅레벨이 오른 상태에서 ⑤(액티브 언락)까지 겹치면 이중 증폭 효과가 생기므로 P3-B1/B4 밸런싱 시 인지 필요. + +--- + +## 4. 재사용/확장 판정 확정 (청사진 §6-7 구체화) + +| 시스템 | 판정 | 확장 방향 | +|---|---|---| +| **SurvivalMeta.cs** | ✅ 확장 기반 재사용 | `Version 1→2` + 신규 필드 6종(§5-1) + `FinalAttack()`/`FinalHp()`/`TotalDefenseRatio()` 신규 메서드(§3-4) | +| **SurvivalUpgrade.cs/.csv (13종)** | ✅ 완전 불변 재사용 | 손대지 않음. `penetrate_ratio` 이관은 CSV에서 행 제거(별건 정리, §1-5) | +| **SurvivalSkill.cs(가중치)** | ✅ 재사용 + 조건부 확장 | `Draw()`의 액티브 후보 계산에 아웃게임 언락 필터 1줄 추가(§1-5). `Catalog`(패시브 10종) 불변. 가중치 합 9346(비-10000) 정합 여부는 본 문서 범위 밖 | +| **SurvivalItemCatalog.cs** | ⚠️ 확장 | 등급 1~2→3+ 확장, 슬롯별 부스탯 필드 추가(§1-3). `EquipLevel` 저장은 카탈로그가 아니라 `SurvivalMetaData`가 보유 | +| **SurvivalShopCatalog.cs** | ⚠️ **구조 확장 필요(plan-auditor M-5 반영 — "무변경 수용 가능" 주장 철회)** | `SurvivalShopEntry`의 지급물은 `GoodsId/GoodsAmount`(재화) 또는 `ItemId/ItemCount`(장비) **2종 중 택1 구조**뿐이라 확률 지급물을 표현할 수 없다(L28 주석 확인). 또 `Path`가 `Shop.prefab` 실측 노드에 1:1 대응해 엔트리 추가 = 프리팹 카드 노드 추가(개발팀·클라이언트팀 협업 필요). 가챠는 (a) 신규 지급 타입(`PoolId` 참조) 필드 추가, 또는 (b) 기존 상점과 분리된 전용 UI/데이터 경로 신설 중 택1 — 결정은 P3-B3 | +| **SurvivalActiveSkillRunner.cs** | ⚠️ 연동 지점 추가 + 기존 결함 1건 발견 | `SurvivalSkill.Draw()` 필터 연동(§1-5). `BaselineAttack` const 복제 결함 발견(§3-4, 본 문서 범위 밖 별건) | +| Stage(`EnemyWaveBalance` 등) | 범위 외 | P3-C 소속(§6). 병렬 착수 가능 | + +**신규 클래스 4개**: `SurvivalHeroLevelTable`(①) · `SurvivalPromotionTable`(②) · `SurvivalEquipUpgradeTable`(③, `SurvivalUpgradeTable`과 동일 패턴 복제) · `SurvivalGachaTable`(④, weight+pity). ⑤는 신규 클래스 없이 `SurvivalMetaData` 필드 + `SurvivalActiveSkillRunner` 연동만으로 충분. + +--- + +## 5. 데이터 모델 골격 + +### 5-1. `SurvivalMetaData` 확장 (Version 1→2) + +```csharp +public class SurvivalMetaData +{ + // ── 기존 필드 (v1, 불변) ── + public Dictionary Owned; + public int[] Equipped; // 6 + public Dictionary DailyPurchase; + public string LastDailyReset; + public int Version = 2; // ← 1에서 상향 + + // ── 신규 필드 (v2, 본 설계) ── + public int HeroLevel = 0; // Layer① 영구 레벨 + public long HeroLevelExp = 0; // Layer① 소비 자원 누적(단위는 §1-1 열린 이슈) + public int PromotionStar = 0; // Layer② 승급 성급(게이팅 토큰) + public Dictionary EquipLevel; // Layer③ itemId → 강화단계(신규, Owned와 별개) + public int GachaPityCount; // Layer④ 천장 카운터(2단 중 현재 위치) + public Dictionary SkillMasteryLevel; // Layer⑤ 노드ID → 레벨(penetrate_ratio 등 패시브 전용) + public HashSet UnlockedActiveCardIds; // Layer⑤ 액티브 카드 드래프트 풀 언락 목록 +} +``` + +**마이그레이션**: 기존 `Load()`의 `Owned ??= new Dictionary()` 패턴(L96-98)을 그대로 복제 — 신규 Dictionary/HashSet 필드 전부 동일한 null-coalescing 초기화 필요. `Version==1`(구버전) 로드 시 `UnlockedActiveCardIds`는 **전체 카드로 채워 시작**(§1-5 하위호환 원칙) — 이 분기가 유일한 실제 마이그레이션 로직이다. + +### 5-2. 신규 CSV 스키마 (골격 — 값은 P3, CSV 포맷 계약 §3-4 준수) + +CSV 계약: **1행 헤더(컬럼명, 타입 접두 `n_`/`f_`/`s_`/`e_`/`l_`) · 2행 한글 설명(로더가 무조건 폐기) · 3행부터 데이터**(매핑v1 §3-4, `SurvivalUpgrade.csv` 실물 확인). + +| 파일 | 컬럼 | 원작 근거 | 비고 | +|---|---|---|---| +| `SurvivalMetaHeroLevel.csv` | `n_Level, l_RequireCost, f_AttackBudget, f_HpBudget` | hero_level 2차 스탯식 + 3차 비용식(형태만) | ① | +| `SurvivalMetaPromotion.csv` | `n_Star, n_Quality, l_GoldCost, n_LevelCap, f_AttackBonusRatio, f_HpBonusRatio, f_PromoDefenseAddRatio` | hero_star 4차 비용+선형 보너스+게이팅(형태만) | ②. `f_PromoDefenseAddRatio`가 §3-3 키 접두 가드 적용 예 | +| `SurvivalMetaEquipUpgrade.csv` | `n_ItemId, n_Level, f_EquipAttackAdd, f_EquipHpAdd, s_SecondaryStatKey, f_SecondaryValue, l_Cost` | heroequipment Base+V 가산분해(형태만) | ③. `s_SecondaryStatKey`는 `equip_attack_speed_add` 등 접두 키만 허용 | +| `SurvivalMetaGachaPool.csv` | `n_PoolId, n_ItemId, n_Grade, n_Weight` | heroequipmentskill weight, 합 10000 강제(본 층이 첫 실도입, §1-4) | ④ | +| `SurvivalMetaGachaOption.csv` | `n_OptionId, s_StatKey, n_Grade, f_Value` | heroskillattr B-템플릿(hit/stun/retaliate/combo, +ele_*🟡) | ④. `s_StatKey`=`gacha_hit_rate` 등 | +| `SurvivalMetaGachaPity.csv` | `n_Tier, n_PullsNeed, n_GuaranteedGrade` | drawtype 2단(pool2need/pool3need 구조) | ④ | +| `SurvivalMetaSkillMastery.csv` | `n_NodeId, s_StatKey, n_Grade, f_Value, l_Cost` | heroskillattr(`penetrate_ratio` 확정 + ele_*🟡) | ⑤. `s_StatKey`=`mastery_penetrate_ratio` 등 | + +예시(헤더+한글설명 행 실물, 값은 `TBD`): +``` +n_Star,n_Quality,l_GoldCost,n_LevelCap,f_AttackBonusRatio,f_HpBonusRatio,f_PromoDefenseAddRatio +승급 성급,등급,골드비용(4차식 형태),레벨상한(게이팅),공격%보너스,체력%보너스,방어%보너스(접두 promo_ 가드) +0,1,TBD,TBD,TBD,TBD,TBD +``` + +### 5-3. 코드 터치포인트 (구현 가이드라인 — plan-auditor C-1 반영 갱신) + +| 파일 | 변경 | +|---|---| +| `SurvivalMeta.cs` | `SurvivalMetaData`에 6필드 추가 + `Load()` 마이그레이션 분기 + `FinalAttack()`/`FinalHp()`/`TotalDefenseRatio()` 신규 메서드(§3-4) + 내부 `TotalAttack()`/`TotalHp()`에 ①③ 반영 | +| `SurvivalBattleManager.cs` | `ApplyMetaEquipment()`을 `FinalAttack()`/`FinalHp()` 호출로 교체 + `RecalcPlayer()` L202에 `TotalDefenseRatio()` 항 1개 추가(§3-4) | +| **`SurvivalLobbyController.Hero.cs`(누락분 추가, C-1)** | `RefreshHeroStats()`(L232-233)·`UpdatePropertyText()`(L338-339) 2곳 모두 동일한 `FinalAttack()`/`FinalHp()` 호출로 교체 — **직접 수식을 재작성하지 말 것**(3중 SOT 재발 방지가 본 설계의 핵심 목적). L338-339의 Base/+Bonus 2단 표기는 비율 항 추가로 표시 로직 재검토 필요(ux-designer 협의) | +| `SurvivalSkill.cs` | `Draw()`의 액티브 후보 필터링에 `SurvivalMeta.Data.UnlockedActiveCardIds` 조회 조건 1줄 | +| `SurvivalActiveSkillRunner.cs` | 기존 결함(`BaselineAttack` const 복제, §3-4) 인지만 — 수정은 별건. 신규 로직 추가 없음(pre-seed 방식 기각, §1-5) | +| `SurvivalItemCatalog.cs` | `SurvivalItemDef`에 `SecondaryStatKey`(슬롯별 부스탯 종류) 필드 추가, 등급 3+ 아이템 정의 추가 | +| `SurvivalShopCatalog.cs` | §4 판정대로 구조 확장(신규 지급 타입 또는 전용 경로) — 세부는 P3-B3, 클라이언트팀 협업 필요 | +| 신규 파일 4개 | `SurvivalHeroLevelTable.cs`·`SurvivalPromotionTable.cs`·`SurvivalEquipUpgradeTable.cs`·`SurvivalGachaTable.cs` — `SurvivalUpgradeTable.Load()`의 CSV 파싱 패턴(헤더 2행 스킵) 복제 | + +--- + +## 6. P3 단계 분할 정합 + +청사진 §4의 P3-A/B/C를 세분화한다. C49(팀장 설계→팀원 작업→팀장 검증) 준수, Phase 간 착수는 이전 Phase 완료·PD 확인 전제(C9 — 일정 아님). + +| Phase | 범위 | 규모 추정(근거) | 선행 조건 | +|---|---|---|---| +| **P3-A** | 능력치 정리 — §2-2 배치표 확정 반영, `penetrate_ratio` 이관(CSV 행 제거+마스터리 CSV 등재), ele_* 2종 최종 층(④/⑤) 재추출 확정 | 소~중(재추출 1건 포함) | 본 문서 PD 확인 | +| **P3-B1** | Layer①+② 구현 — 영웅레벨+승급, `SurvivalMetaHeroLevel.csv`+`SurvivalMetaPromotion.csv` + defense 클램프 분리 결합식(§3-4) | 중(신규 클래스 2·결합 로직) | P3-A + `hero_star` 레벨캡 불일치 재실측(청사진 §5) | +| **P3-B2** | Layer③ 구현 — 장비강화, `SurvivalMetaEquipUpgrade.csv` + `SurvivalItemCatalog` 확장 | 중(기존 패턴 복제 + 슬롯별 부스탯 매핑) | P3-B1(결합식 전제) **+ `heroequipment`/`upgrade` M수열 원본 재대조(R-A5, §7)** | +| **P3-B4** | Layer⑤ 구현 — 스킬 마스터리, `SurvivalMetaSkillMastery.csv` + `SurvivalActiveSkillRunner` 드래프트 필터 연동 | 중(속성 시스템 실존 확인 선행 필요) | 개발팀 `AttributeTag` 소비 여부 재확인 | +| **P3-B3** | Layer④ 구현 — 가챠, `SurvivalMetaGachaPool/Option/Pity.csv` + 상점 구조 확장 | 중~대(과금 정책 연동 + 상점 구조 변경, R-A3·M-5) | **PD 확인 필수**(재화 종류·확률형 아이템 정책, P23 기준) | +| **P3-C** | 스테이지 구조 데이터화(청사진 소관, 본 문서 범위 외) | 청사진 §4 추정 유지 | §5(`teamwavepassreward` 반복 여부) 재추출 | + +**순서 권고**: P3-A→B1→B2→B4→B3 순 착수(가챠는 정책 확인이 가장 오래 걸릴 수 있어 마지막 배치 — 나머지 4층이 먼저 플레이 가능한 깊이를 만든다). **P3-C는 P3-B와 독립적이므로 병렬 착수 가능**(C41). + +**검증 부하 분산**(청사진 R-A4 대응): 5층을 4개 서브페이즈로 쪼갠 것 자체가 "5층 동시 착수 시 검증 부하" 리스크의 직접 해소책이다. + +--- + +## 7. 리스크 (청사진 R-A1~5 전체 승계 + 신규 4건) + +| ID | 리스크 | 심각도 | 내용 | +|---|---|---|---| +| R-A1(승계) | 스테이지 유한/무한 결정 지연 | 중 | 청사진 §6 원문 그대로 — 본 문서 범위 밖(P3-C) | +| R-A2(승계, §3-3에서 3중 방어 반영) | 네임스페이스 충돌 | 중→**구조·키·캡슐화 3중 방어 반영** | §3-3. 접두 가드 준수는 구현자 규율에 의존하므로 P3-B1 code review 체크리스트에 명문화 권고 | +| R-A3(승계) | 가챠 도입 정책 리스크 | 중~높음 | §1-4·P3-B3에서 PD 확인 필수. **재화 종류(골드/젬) 자체도 미확정**임을 추가 명시(M-2) | +| R-A4(승계) | 5층 동시 착수 시 검증 부하 | 중 | §6의 4개 서브페이즈 분할로 대응 | +| **R-A5(승계 — 최초 초안 누락분)** | ⚠️ 절 재발 패턴 | 낮음(주의) | 매핑v1 §6-5 "실제 오류 4건 전부 ⚠️ 절에서 발생". Layer②(hero_star, ⚠️)·Layer③(heroequipment, ⚠️) 둘 다 이 패턴 대상 — P3-B1·B2 선행 재실측으로 대응(§6) | +| **R-B1(신규)** | `penetrate_ratio` 이관 지연 | 낮음(하향 조정) | plan-auditor m-2 반영 — `ValidateUpgradeCoverage()`가 이미 경고하므로 방치 위험은 낮다. 실제 리스크는 "소비목록↔실계산 수동 동기화 부담"이 신규 outgame 테이블에도 반복된다는 점(§1-5) | +| **R-B2(신규 — plan-auditor C-2 반영)** | defense 클램프 공유 시 아웃게임 투자 무의미화 | 중 | §3-4 — 승급 defense% 보너스가 인게임과 같은 0.8 클램프를 공유하면 계정이 성장할수록 그 판 인게임 방어 강화 선택이 무의미해진다. 권고: 클램프 이후 별도 승산항으로 분리 | +| **R-B3(신규)** | 아이템 융합(TryFuse) ↔ 장비강화(EquipLevel) 상호작용 미정의 | 중 | §1-3 — 강화분 투자된 아이템이 융합 재료로 소모되면 투자가 고아화. 기본 권고: 강화분>0 아이템 융합 차단 | +| **R-B4(신규 — plan-auditor m-1 반영)** | `SurvivalActiveSkillRunner.BaselineAttack` const 복제 기존 결함 + Layer①과의 증폭 상호작용 | 낮음~중 | §3-4 — 기존 결함 발견(본 문서 범위 밖). 영웅레벨 상승이 액티브 스킬 데미지도 선형 증폭시키며, ⑤ 언락과 겹치면 이중 증폭. P3-B1 착수 시 `BaselineAttack`을 SOT 참조로 교체 권고 | +| R-B5(신규) | 가챠·상점 중복 판매 시 상점 가치 희석 | 낮음~중 | §1-4 — "상점=저확정 티어, 가챠=고티어+옵션" 역할 분리 권고, 최종 경계는 P3-B3 | + +--- + +## 8. 기각안 (C32 — plan-auditor 지적 3건 추가 반영) + +| # | 검토안 | 기각 사유 | +|---|---|---| +| 1 | 원작 ①레벨 이름을 그대로 "레벨"로 아웃게임에 도입 | 기존 인게임 `SurvivalBattleManager.Level`과 이름 충돌(§1-0). "영웅레벨"/"런레벨"로 분리 | +| 2 | 승급(Layer②) 보너스에서 `defense`를 제외하고 attack/hp 2종만 이식 | 원작 실측(매핑v1 §2-2 "186행 검증 True")이 3스탯 동일 보너스임을 명시 — 임의 축소는 이식 충실성 훼손. 대신 §3-4 클램프 분리로 부작용만 해소 | +| 3 | 장비강화(Layer③)를 슬롯 단위 설계 | 원작은 `heroequipment` 개별 ID 단위(매핑v1 §2-3). 슬롯 단위면 수집 동기 약화 | +| 4 | 가챠(Layer④) 도입 시 기존 상점 직접판매 장비 항목 전부 대체 | 청사진 §3 재사용 판정과 배치. 신규 유저 저티어 접근성 보존을 위해 병존(R-B5) | +| 5 | `ele_hurt_add`/`ele_penetrate_ratio`를 속성 시스템 실존 여부 확인 없이 즉시 수치까지 확정 | C39 위반 소지 — 소비처 없는 스탯 배치는 결함 재발(청사진의 `HeroAttackMultiplier` 사장 사례와 동일 패턴). 배치(④ 잠정)만 하고 수치는 유예 | +| 6 | 청사진 §2-3 "5종" 표기를 재검증 없이 승계 | C44는 상위 문서 수치도 항상 재검증 요구. 실측 결과 6종(stun_rate 누락)이 정확 | +| 7 | 본 문서에서 세부 CSV 수치까지 한 번에 확정 | PD 지시가 "P1 조망→P2 메타재설계→P3 축별 구현"으로 명시 분할(C50) | +| **8(신규)** | Layer②를 성29·성30 레벨캡 12행 불일치 미해소 상태로 그대로 채택 강행 | plan-auditor M-3 지적 — 매핑v1 §2-2 자체가 재검증 필요를 명시한 ⚠️ 절이다. 채택 방향은 확정하되 **재실측을 P3-B1 선행 조건으로 강제**(§6·R-A5)해 강행하지 않는다 | +| **9(신규)** | 가챠 소비 재화를 젬(유료)으로 본 문서에서 확정 | plan-auditor M-2 지적 — 원작 문서 3건 어디에도 `drawlib`/`drawtype` 소비 재화 근거가 없다(🔴). 무료(골드)·유료(젬) 가챠는 BM 자체가 다른 결정이라 스키마 설계 이상의 확정은 PD 영역 침범(C36) — 재화 컬럼 구조만 만들고 값은 유보(§10) | +| **10(신규)** | `penetrate_ratio`를 인게임에 그대로 두고 `ConsumedUpgradeKeys`에 1줄만 추가해 배선(이관 대신 배선) | plan-auditor 질의 유도 — 기술적으로는 더 간단한 수정이지만, 이미 신규 스탯 6종을 아웃게임에 배치하기로 한 §0 원칙과 충돌한다(사장된 스탯이라 해서 "인게임에 있던 것"이 아니게 되는 건 아니지만, 기능적으로 전혀 작동한 적 없던 스탯이므로 §0의 "신규만 아웃게임" 원칙을 적용해도 무리가 없고, 이관 쪽이 청사진이 지적한 "아웃게임 능력치 종류 확장" 목표에 더 직접 기여한다) | + +--- + +## 9. 변경 이력 (P16) + +| 일시 | 변경자 | 항목 | 이전값 | 이후값 | 사유 | +|---|---|---|---|---|---| +| 2026-08-22 | system-designer | 문서 신규 작성 초안 | — | 5층 골격·18종 배치(5종 기준)·결합 "1곳" 주장 | PD 지시 집행 1차 초안 | +| 2026-08-22 | system-designer | plan-auditor 감사 반영 최종화(같은 v1 내 확정) | 초안 | Critical 2(결합 4곳 정정·defense 채널 처리)·Major 6(ele_* 🟡화·가챠재화 🔴화·상점구조 확장·통계 정합·R-A5 승계·P30 근거 보강) 전부 반영 | C35 감사 게이트 — 조건부통과 정정 완료 후 발신 | + +--- + +## 10. 후속 조치 (본 문서 범위 밖) + +1. **개발팀 재확인 3건**: ①`hero_star` 레벨캡 성29·30 불일치 재실측(P3-B1 선행) ②`heroequipment`/`upgrade` M수열 원본 CSV 재대조(P3-B2 선행, R-A5) ③`AttributeTag`의 실전투 데미지 계산 소비 여부(P3-B4 선행, R-B2 아님 — §1-5 속성 전제조건). +2. **balance-designer 위임(P3-A)**: §2-2 배치표를 입력으로 능력치 축 확장 설계 + ele_* 2종 최종 층(④/⑤) 확정 재추출. +3. **PD 확인 2건**: ①Layer④ 가챠 가격·확률 실제 값 및 확률형 아이템 정책 준수 방식(P3-B3 착수 전제, R-A3) ②**가챠 소비 재화(골드 vs 젬) 방향**(🔴 원작 근거 부재, §8 기각안9·M-2) — 스키마는 재화 종류 무관하게 설계됐으므로 이 결정이 P2를 재작업시키지 않는다. +4. **PM 공유**: 본 문서 산출 완료를 `개발팀_PD_지시_로그.md`(BT13-GodDem 단일 관리) 및 대화로그에 반영. +5. **별건 결함 인지(수정은 범위 외, C3 은폐 금지 목적 기록)**: `SurvivalActiveSkillRunner.BaselineAttack` const 복제(R-B4) — P3-B1 착수 시 정리 권고. diff --git a/공유/대화로그/GodDem/2026-08-22.md b/공유/대화로그/GodDem/2026-08-22.md index 0a0d15c..a51b96a 100644 --- a/공유/대화로그/GodDem/2026-08-22.md +++ b/공유/대화로그/GodDem/2026-08-22.md @@ -104,3 +104,14 @@ - **P2 착수**: system-designer 메타 아키텍처 재설계 (진행중) — 원작 5층(레벨·승급·장비·가챠·스킬)을 GodDem 중앙디펜스 메타로 재설계·능력치 18종(PvE) 층별 배치·**매판 인게임 강화 ↔ 영구 아웃게임 경계 재정의**(핵심)·재사용(SurvivalMeta·Upgrade·Skill)/확장(ItemCatalog·ShopCatalog·Stage)·데이터 모델 골격. 산출 예정 `2026-08-22_메타아키텍처_재설계_v1.md` - **후속 체인**: P2 골격 → plan-auditor 검증 → P3-A(능력치)·P3-B(아웃게임 층·가챠)·P3-C(스테이지) 축별 구현 + 재추출 3건(우선순위순) - **가챠 도입 = 과금 시스템 신설**: 원작 유료재화·확률·천장 구조 이식. 가격·확률 세부는 PD 후속 결정 영역(구조 골격만 P2) + +## 24. P2 메타 아키텍처 재설계 v1 — 완료 (system-designer, GodDem 수정 0건) + +- **결정**: 원작 5층(레벨·승급·장비·가챠·스킬)을 GodDem 메타로 확정 재설계. 산출물 `공유/기획/GodDem/2026-08-22_메타아키텍처_재설계_v1.md`. + - 5층: ①영웅레벨(신규 영구, 인게임 기존 "런레벨"과 명칭 분리 확정) ②승급(레벨캡 게이팅+공/방/HP 3스탯 보너스) ③장비강화(itemId 단위 신설) ④가챠(전면 신규, weight+2단 천장) ⑤스킬마스터리(액티브 카드 드래프트 풀 필터링 방식 확정, pre-seed 방식 기각) + - 능력치 18종: 인게임 기능 11 유지 + 사장 트랙 `penetrate_ratio` 1종 ⑤로 이관 + 신규 6종을 ④(4종 확정: hit/stun/retaliate/combo) + ele_hurt_add·ele_penetrate_ratio(2종, 🟡 ④잠정·P3-A 확정) + - ★결합 지점: `SurvivalMeta.FinalAttack()`/`FinalHp()`/`TotalDefenseRatio()` 단일 캡슐화 메서드로 호출부 4곳(SurvivalBattleManager 2·SurvivalLobbyController.Hero.cs 2) 공식 일원화 — 3중 SOT 재발 방지 +- **근거**: 청사진v1(P1)·재추출v1·매핑v1 3건 실측 + GodDem 코드 8개 파일 직접 Read(C39) + plan-auditor 모드A 교차검증(조건부통과, Critical 2·Major 6·Minor 4 — 전부 문서 반영 완료). +- **영향**: P3 착수 가능 상태 확보(4서브페이즈: B1레벨승급→B2장비→B4스킬→B3가챠 + 독립적 P3-C). PD 확인 대기 2건(가챠 소비재화 골드/젬 🔴·가격확률 실값) 남음 — 스키마는 재화 종류 무관 설계라 P2 재작업 유발 없음. +- **기각안(C32, 문서 §8 전문 — 10건)**: ①원작 "레벨" 명칭 그대로 도입(런레벨과 충돌로 기각) ②승급 defense 보너스 제외(원작 3스탯 검증 근거로 기각, 클램프 분리로 부작용만 해소) ③장비강화 슬롯 단위 설계(수집동기 약화로 기각) ④가챠가 상점 전면 대체(신규유저 접근성으로 기각) ⑤ele_* 속성계 미확인 상태 수치 확정(C39 위반 소지로 기각) ⑥청사진 "5종" 재검증 없이 승계(C44 위반으로 기각, 실제 6종) ⑦본 문서에서 세부 CSV 수치 확정(C50 위반으로 기각) ⑧성29·30 레벨캡 불일치 미해소 강행(재실측 선행조건으로 대체) ⑨가챠 재화 젬으로 본 문서 확정(원작 근거 부재+C36으로 기각, PD 이관) ⑩penetrate_ratio 인게임 배선 유지(§0 원칙 정합성 위해 이관 채택). +- **plan-auditor 사전 감사**: 모드A 1회(조건부통과, 상세 상기). **pm-auditor 사전 감사**: 본 로그 갱신 계획 통과(Minor 1 — 산출물 경로 P1 청사진 누락분 동시 해소 완료).