BurningTimesAi/공유/기획/GodDem/2026-08-22_P3B4_스킬마스터리_설계_v...

52 KiB
Raw Permalink Blame History

GodDem 스킬 마스터리(아웃게임 영구 성장 Layer⑤) 수치 설계 v1

작성: balance-designer(기획팀) 2026-08-22 · P3-B4 산출물 (P32 맥락 분할 · C50 규모 "중") PD 지시 원문 (C42-2 A): "현 세션 B2 계속"·"원작처럼 맞춰"(2026-08-22, B1·B2 v1·v2에 이미 적용된 동일 원칙 — 대화로그 §31·§38) — B4는 이 동일 원칙의 3번째 적용 선행 문서(전부 Read 완료): 2026-08-22_메타아키텍처_재설계_v1.md(메타v1, §P3-B4·§5·⑤층) · 2026-08-22_원작아키텍처_이식청사진_v1.md(청사진v1) · 2026-08-20_원작밸런스_해독_매핑_v1.md(매핑v1, §2-4 heroskillattr·§2-8 heroskilltree) · 2026-08-22_P3B1_레벨승급_설계_v1.md(B1, FinalAttack/FinalHp 캡슐화 패턴) · 2026-08-22_P3B2_장비강화_설계_v2.md(B2, equip_* 접두 패턴·독립 축 설계) 절대 제약: GodDem 레포(E:\NerdNavis\GodDem) Read만 수행, 수정 0건(C39 실측 전부 본 세션 직접 재확인). Unity MCP 미사용. 본 문서가 유일 산출물. 범위(C50): Layer⑤ 실수치 설계까지(구현은 개발팀장). B3(가챠)·C(스테이지) 범위 침범 없음. ele 2종 실전투 소비(AttributeTag) 미확인 전제 — 본 문서 §2에서 "미확인"을 "확인(미소비)"으로 격상하되 결론(소비처 부재)은 동일. 표기 규칙(C5·C44): 🟢확정(코드 직접 실측) · 🟡추정(형태는 원작/형제스탯 근거, 절대치는 플레이테스트 이전 1차값) · 🔴재추출 필요/미확보


0. 결론 요약

메타v1 §5-2가 골격만 남긴 SurvivalMetaSkillMastery.csv(NodeId 1종·penetrate_ratio만 시드)를 3종 완결하고, 메타v1 §1-5가 구조만 확정한 "액티브 카드 드래프트 풀 언락"의 실제 가격 곡선을 신설한다.

유보 사항(메타v1/P3-A 출처) 본 문서 결정
SurvivalMetaSkillMastery.csvmastery_penetrate_ratio l_Cost(10~454)가 "인게임 이관 carry, P3-B4 재산정" 표기로 남아있음 재산정 완료 — f_Value(0.01~0.06)는 무변경(이미 원작 근거 확정값), l_Cost만 아웃게임 스케일로 ×55 재계수화(§5-1·§6-1)
ele_hurt_add·ele_penetrate_ratio "마스터리 강화" 실값 미정 Node2(ele_hurt_add)·Node3(ele_penetrate_ratio) 신설, 형제 스탯(hurt_add/penetrate_ratio) 값곡선 형태 대입(§4·§6-1)
"액티브 스킬 영구 해금(드래프트 풀 필터링)" 구조만 확정, 가격·해금 순서 미정 heroskilltree 20단계 형태 이식(×100 재계수화) + SurvivalMetaSkillUnlock.csv 신설(§5-2·§6-2)
§1-5 "AttributeTag 실전투 소비 여부 미확인(🔴), P3-B4 선행 확인 필요" 본 문서에서 확인 완료(🟢): 미소비 확정(SurvivalUnit.cs 전량 재확인, §2-1) — "미확인"이 "확인됨(소비처 없음)"으로 격상, 결론은 동일하게 부정적

★ 본 문서의 최대 발견(신규, C3 은폐 금지): AttributeTag뿐 아니라 penetrate_ratio 자체도 "관통"이라는 원래 의미의 소비처가 없다 — 적(Enemy) SurvivalUnit.DamageReduction은 코드 전역에서 상시 0이며 감소시킬 "적 방어력"이 애초에 존재하지 않는다(§2-2). 이는 이 프로젝트가 스스로 겪고 코드 주석에 경고까지 남긴 "penetrate_ratio 만렙 1,090골드 순손실" 사고와 동일 계열의 결함이 ⑤ 레이어에서 재발할 수 있는 지점이다. 본 문서는 이를 방치하지 않고 3종 마스터리 스탯 전부를 FinalAttack()의 공격 비율 항으로 잠정 배선한다(§8) — "관통/속성" 고유 의미는 잃지만 사장 스탯 재생산은 피한다(정직 한계 명기, §2·§13 기각안5).

항목 결론
구조 ⑤ 스킬마스터리 = 2개 독립 하위 트랙 — (A) 마스터리 스탯 노드 3종(패시브, 즉시 배선) + (B) 액티브 카드 드래프트 풀 언락(구조 완성·현재 배정 콘텐츠 0건)
재화 기존 GOLD_ID=201 직접 소비(B1·B2 동일 원칙, 신규 중간재 없음)
노드 3종 총액 526,680G(3종 만렙 합, §5-1 그레이드별 한계단가 균일화 재계수화 후) — B1(1,056,056G)의 약 50%, B2(510,496G)와 거의 동일 자릿수(103%)
해금 20단계 총액(구조상 참고치, 배정 콘텐츠 없음) 1,240,000G — heroskilltree 원본 합(12,400)×100
결합 지점 FinalAttack() 승산항에 MasteryAttackRatio() 1개 텀 추가(RecalcPlayer 무변경 — B1·B2보다 더 단순한 결합)
신규유저 영향 0(불변) — 미투자 시 MasteryAttackRatio()=0, 드래프트 풀도 기본 제공 10종("그랜드파더 10종", §8-1 — plan-auditor m-3 지적: 기존 계정 보호가 아니라 신규 계정 포함 전원에게 영구 무상 제공되는 콘텐츠라는 뜻으로 쓰는 용어) 그대로

1. 설계 전제

항목
기준 플레이어 수준 미투자(SkillMasteryLevel 전부 0) ~ 완전 맥스(3노드 그레이드6 + 해금순번 N) 밴드
목표 경험 "계정을 오래 키울수록 다음 판 드래프트 폭이 넓어지고, 공격 비율이 한 겹 더 쌓인다" — 매판 완결성(로그라이크)은 유지, 원작 학습형 스킬트리의 "영구 학습" 감각만 절충 이식(메타v1 §1-5 재미 근거 승계)
전제 스탯 앵커 SurvivalMeta.BaseAttack=22(불변) · B1 HeroLevel맥스 +120atk · B1 Promotion맥스 +22%(attack) · B2 6종 실투자 맥스 TotalAttack 기여분(장비강화 완료v2 §6-2 기준)
전제 경제 앵커 B1 총비용 1,056,056G · B2 9종 총비용 510,496G(실투자 6종 359,728G) — B4 규모 비교 기준
재화 기존 GOLD_ID=201 직접 소비(B1 §1·B2 §1이 확정한 동일 원칙 3번째 적용, §13 기각안3)
C39 실측 확증(본 세션 직접 Read 완료) SurvivalStatCatalog.cs·SurvivalMetaSkillMastery.csv(P3-A 시드 6행)·SurvivalMeta.cs(전문, FinalAttack()/FinalHp()/PromotionDefenseRatio()/EquipLevel/TotalAttack()/TotalHp()/EquipAttackSpeedRatio()/EquipDefenseRatio() 전부 라이브 구현 확인 — B1·B2가 이미 게임에 진입했다는 배경 설명과 코드 상태 일치) · SurvivalUpgrade.csv(전문, ingame 12트랙 6그레이드 비용 10/42/99/184/301/454 균일 확인) · SurvivalBattleManager.cs(RecalcPlayer()·ConsumedUpgradeKeys·ValidateUpgradeCoverage()·TakeDamage 호출부) · SurvivalUnit.cs(전문, DamageReduction·TakeDamage()) · SkillDataAsset.cs(AttributeTag enum 정의) · SurvivalSkill.cs(Draw() 전문, 액티브 후보 필터 지점) · SurvivalActiveSkillRunner.cs(전문) · Resources/Skills/Active/*.asset 10건 실물(A02·A04·A05·A06·A08·A10·A11·A12·A13·A_Laser — "액티브 10종" 배경 서술과 정확히 일치)

2. C39 신규 실측 발견 — 정직 한계 재확정 (은폐 금지, C3)

2-1. AttributeTag 속성 시스템 — "미확인(🔴)"에서 "확인(🟢: 미소비)"으로 격상

메타v1 §1-5·§2-2는 "AttributeTagSurvivalUnit.TakeDamage()의 실제 데미지 계산에서 상성/저항으로 소비되는지는 미확인(🔴) — P3-B4 착수 시 개발팀 재확인 필수 선행 조건"이라 명시했다. 본 문서가 그 선행 확인을 직접 수행했다:

  • SkillDataAsset.cs L24: AttributeTag AttributeTags(Flags enum, Physical/Fire/Frost/Lightning/Dark) — 데이터 필드로만 존재.
  • SurvivalUnit.cs 전문 재확인: TakeDamage(float amount)actual = amount * (1f - Mathf.Clamp01(DamageReduction)) 단일 승산식뿐 — AttributeTag를 읽는 코드 0건.
  • 전투 판정 전체(SurvivalBattleManager.cs·SurvivalActiveSkillRunner.cs·SurvivalProjectile.cs 등)에서 속성 상성/저항 계산 코드 0건.

결론: "미확인"이 아니라 "확인됨 — 속성 시스템 자체가 전투 데미지 계산에 전혀 소비되지 않는다"(🟢). 원작 매핑v1 §6-4가 "액티브 스킬은 틀은 있고 데이터는 비었다"고 밝힌 것과 동일 계열의 "스키마는 있으나 소비 로직이 없다" 패턴이 여기서도 재확인된다.

2-2. ★ 신규 발견 — penetrate_ratio 자체도 동일 계열의 소비처 부재

메타v1·P3-A는 penetrate_ratio를 이미 "⑤ 확정" 완료 상태로 다뤄 왔으나(P3-A 재추출 완료, ele_* 2종과 별개), 본 문서가 RecalcPlayer()/TakeDamage()를 전투 관점에서 재확인한 결과 "관통(penetrate)"이라는 이름이 의미하는 실제 기능 — 적 방어력을 낮춰 더 많은 피해가 통과하게 하는 것 — 을 수행할 대상 자체가 코드에 없다:

SurvivalUnit.cs L26:  public float DamageReduction = 0f;   // 0~1
SurvivalBattleManager.cs L243:  Player.DamageReduction = 1f - (1f - ingameReduce) * (1f - outgameRatio);  // Player 전용 유일한 대입

DamageReduction 필드에 값이 대입되는 곳은 코드 전체에서 Player.DamageReduction 이 한 줄뿐이다. 적(SurvivalUnit) 인스턴스는 생성 후 DamageReduction을 변경하는 코드가 0건 — 적은 항상 방어력 0. 즉 penetrate_ratio가 낮춰야 할 "적 방어력"이라는 대상 자체가 존재하지 않는다.

이 발견의 무게: SurvivalBattleManager.cs 자체 주석(L158-163)이 이미 "penetrate_ratio가 상점에만 등재된 채 전투 계산 어디에도 참조되지 않아 만렙 1,090골드가 순손실이 되는 함정이 발생했다(2026-08-21 실측)"고 명시적으로 경고한 바로 그 결함 유형이다. 그 사고는 인게임 레이어에서 발생했고 이관으로 해소됐다고 여겨졌으나(§1-5 "이관 = 위험 회피 아니라 배치 원칙 적용"), 이관 이후에도 "관통"이라는 스탯의 진짜 기능이 소비될 지점 자체가 어느 레이어에도 없다는 사실은 그대로 남아 있었다 — 지금까지 어느 문서도 이 부분을 정면으로 확인하지 않았다. 본 문서가 이를 명시적으로 표면화한다(C3).

대응(§8에서 상세): 3종 마스터리 스탯(penetrate_ratio·ele_hurt_add·ele_penetrate_ratio) 전부를 원작 taxonomy상 "공격계"(청사진v1 §1-1 — plan-auditor M-1 지적으로 인용 정정, 매핑v1 §1-1은 복호화 결과·암호 방식 절이라 해당 분류표가 없다)라는 공통점을 근거로 FinalAttack()의 공격 비율 항에 잠정 합산한다 — "관통/속성"이라는 개별 의미는 임시로 접어두고 실제 공격력 증가로 치환해 소비처를 즉시 확보한다. 진짜 관통/속성 메커니즘(적 방어 시스템·원소 상성)은 별도 시스템 신설이 필요한 P3-C 이후 영역이며, 그 시점에 이 항을 재분리하면 된다(§13 리스크 R-F1·기각안5).


3. 스킬 마스터리 구조 확정 — 2개 독립 하위 트랙

원작 heroskill+heroskilltree는 하나의 학습 진행(20단계 EXP 소비 곡선)이 heroskillattr의 여러 스탯 보상을 동시에 관장하는 구조였다(매핑v1 §1-2·§2-8). GodDem 적용에서는 이를 패시브 강화액티브 해금이라는 서로 다른 재미 축(메타v1 §1-5)으로 재해석해 완전히 독립된 두 트랙으로 분리한다 — B1(Layer①②, 승급이 레벨을 게이팅)과 달리 두 트랙 사이에 게이팅 관계는 두지 않는다(B2의 "9개 아이템 독립 축" 선례와 동일 원칙, §13 기각안6).

트랙 데이터 모델(메타v1 §5-1 기존 필드) 재화 게이팅 원작 대응
(A) 마스터리 스탯 노드 SkillMasteryLevel: Dictionary<int,int>(NodeId→Grade 0~6) GOLD 노드 간 완전 독립(B2 아이템 패턴) heroskillattr 6개 효과타입 중 인게임 미보유 3종(penetrate_ratio·ele_hurt_add·ele_penetrate_ratio, §4)
(B) 액티브 카드 언락 UnlockedActiveCardIds: HashSet<string> GOLD 순번 N 구매 시 N+1만 구매 가능(순차) heroskilltree 20단계 학습 곡선(형태만, §4·§5-2)

4. 원작 heroskill/heroskilltree 정합 ((A) 형태이식)

4-1. heroskillattr 6개 효과타입 — GodDem 배치와의 정합 재확인

매핑v1 §2-4: "실사용 87엔트리 = 고유 22시리즈… 효과타입 6종만 사용 — hp_add 25 / attack_add 14 / penetrate_ratio 12 / ele_penetrate_ratio 12 / hurt_add 12 / ele_hurt_add 12." 원작 학습형 스킬트리가 실제로 보상하는 스탯은 정확히 이 6종뿐이다.

원작 6종 GodDem 배치(P3-A 확정) 본 트랙(A) 소속 여부
hp_add 인게임(SurvivalUpgrade.csv, §0 원칙 — 이미 기능 중) 아니오
attack_add 인게임 아니오
hurt_add 인게임 아니오
penetrate_ratio ⑤ 스킬마스터리(P3-A 이관 확정) 예 — Node1
ele_hurt_add ⑤ 스킬마스터리(P3-A 재추출 확정) 예 — Node2
ele_penetrate_ratio ⑤ 스킬마스터리(P3-A 재추출 확정) 예 — Node3

핵심 정합: 원작 heroskilltree가 보상하던 6종 중 정확히 절반(hp_add·attack_add·hurt_add)은 GodDem 인게임 레이어가 이미 흡수했고, 나머지 절반(penetrate_ratio·ele_hurt_add·ele_penetrate_ratio) — 본 트랙(A)이 다루는 그 3종 그대로가 어느 레이어에도 배치되지 않고 남아 있었다. 이는 우연이 아니라 §0 원칙("인게임에 이미 기능 중인 것은 유지, 신규만 아웃게임 배치")이 heroskilltree라는 단일 원작 시스템에 대해 자동으로 만들어낸 여집합이다 — P3-A의 층 배치 작업이 heroskilltree 전체를 정확히 절반씩 인게임/⑤로 쪼갠 셈이 된다(🟢, 6종 전수 대조 확인).

4-2. heroskilltree 20단계 학습 곡선 — 이중 이식 상태 정정

메타v1 §1-0이 이미 밝혔듯 heroskilltree 소비수열(50,100,…,1300, 20단계)은 런레벨(RunLevel) EXP 곡선으로 이미 이식 완료돼 있다(ExpTable, 매핑v1 §2-8·§4(e)). 즉 이 절대 수열은 인게임에 선점됐다 — 트랙(B)에 그대로 재사용하면 같은 원작 원본을 두 곳에 중복 이식하는 모양이 된다.

본 문서의 처리: 절대 수열이 아니라 형태(4블록×5단계, 블록별 증가폭 +10 등차, 블록 내부 등차 계단선형)만 가져와 아웃게임 경제 스케일로 재계수화한다(§5-2) — B1이 hero_level 3차식을, B2가 heroequipment M수열을 각각 형태만 재사용하고 절대치를 자사 스케일로 다시 푼 것과 동일한 절차((A) 형태이식 원칙, §13 기각안 없음 — 이미 B1·B2가 확립한 방식의 3번째 적용이라 재론 불요).


5. 공식

5-1. 마스터리 스탯 노드(3종 공통 구조)

ValueAt(node, grade)  — 그레이드 "현재값"(직접 조회, 누적 아님).  grade=0 → 0(미투자)
CumulativeCostAt(node, grade) = Σ StepCost(node, 1..grade)   — 그레이드 1~6 순차 구매 누적 비용

값(f_Value) 결정 — 형제 스탯 형태 대입:

  • Node1 penetrate_ratio: P3-A 기존값 무변경(0.01~0.06, A-선형 +0.01/grade) — 이미 원작 heroskillattr 계열10 A패턴 근거 확정값이라 재론 불요.
  • Node3 ele_penetrate_ratio: Node1의 "속성 변형 형제"(SurvivalStatCatalog.cs 자체 Note, §2-2 배치표) — 동일 A-선형 값곡선 대입: 0.01~0.06.
  • Node2 ele_hurt_add: hurt_add의 속성 변형 형제. GodDem 인게임 hurt_add가 이미 원작 "C 패턴"(매핑v1 §2-4, 0.05/0.07/0.10/0.15/0.20/0.30)을 그대로 쓰고 있음을 SurvivalUpgrade.csv로 직접 재확인(🟢, §1 C39) — 동일 C-패턴 값곡선 대입: 0.05~0.30.

비용(l_Cost) 결정 — ingame 6그레이드 비용 형태 재계수화: SurvivalUpgrade.csv 12트랙 전부가 스탯 종류와 무관하게 동일한 6그레이드 비용열(10/42/99/184/301/454)을 쓴다(🟢, §1 C39 전수 확인) — cost가 스탯 파워와 독립인 것이 GodDem의 기존 관행이다. 이 관행을 그대로 복제하면 Node2(최댓값 30%)가 Node1·3(최댓값 6%)과 동일 가격에 5배 가치를 갖게 돼 "무조건 Node2부터" 라는 지배 전략이 생긴다 — P30(재미 우선) 원칙상 실질 선택지가 사라지는 결과라 그대로 복제하지 않는다(§13 기각안1).

최초 시도(누적 평균 균일화)의 결함 — plan-auditor C-1 지적, 정정: 본 문서 최초 초안은 "Node1·3 총액÷6% = Node2 총액÷30%"가 같도록 Node별로 서로 다른 단일 배율(×55/×275)만 곱했다. 이 방식은 완주 시점의 평균 단가만 맞출 뿐, 구매 도중의 한계 단가(그 스텝을 사면 1%p를 얻는 데 실제로 드는 비용)를 맞추지 못한다 — Node2는 값곡선이 균등하지 않아(그레이드별 %p 증분이 5/2/3/5/5/10으로 들쭉날쭉, §5-1 값 문단) 단일 배율을 곱해도 스텝별 한계 단가가 550→5,775→9,075→10,120→16,555→12,485G/%p로 어긋나며, 특히 마지막 스텝(그레이드6)이 Node1·3의 마지막 스텝(24,970G/%p)보다 정확히 절반이 된다. 즉 "완주 직전까지는 Node2가 항상 더 싸다"는 지배 전략이 그대로 남아 §13 기각안1이 막으려던 문제가 형태만 바뀐 채 재발했다 — P30(실질 선택지) 위반이자 이전 판정(§10 시나리오5 "통과")이 완주 단면만 검사한 정직성 결함(C5)이었다.

채택 — 그레이드 "단(段)"별 한계 단가 균일화: 단일 배율이 아니라, **그레이드 위치(1~6)마다 고정된 %p당 단가 D(grade)**를 먼저 정의하고(Node1·3의 자체 스텝 비용을 그대로 D(grade)로 채택 — 값 증분이 항상 1%p라 스텝 비용=한계 단가), 각 노드의 실제 스텝 비용을 D(grade) × 그 스텝의 %p 증분으로 역산한다. 이러면 어느 그레이드에서 비교하든 노드와 무관하게 %p당 단가가 완전히 동일해진다 — "무엇을 밀지"가 순수하게 어떤 부가효과를 원하는가의 문제가 되고, 완주 단면이 아니라 구매 경로 전 구간에서 지배 전략이 사라진다.

D(grade)            = Node1/Node3 스텝 비용(SurvivalUpgrade 6그레이드 비용열 × 55) = %p당 단가, grade 1~6
                       550 / 2,310 / 5,445 / 10,120 / 16,555 / 24,970

Node1/Node3 StepCost(grade) = D(grade) × 1%p(그레이드당 증분 항상 1%p, A-선형)
                       = D(grade) 그대로 (550 / 2,310 / 5,445 / 10,120 / 16,555 / 24,970)

Node2       StepCost(grade) = D(grade) × ΔValue(grade)%p   (ΔValue = 5/2/3/5/5/10, C패턴 그레이드별 증분)
                       = 2,750 / 4,620 / 16,335 / 50,600 / 82,775 / 249,700

검증: 임의 그레이드에서 StepCost÷ΔValue를 재계산하면 3개 노드 전부 정확히 D(grade)와 일치한다(예: Node2 그레이드6 = 249,700÷10%p = 24,970G/%p = Node1·3 그레이드6과 동일). 총액은 Node1·3 각 59,950G(무변경)·Node2 406,780G(재계수화) — 3종 합계 526,680G로, B2(9종 510,496G)와 거의 같은 자릿수에 도달한다(우연이나 유의미한 교차 검증치로 기록).

앵커 근거(단일 노드 규모): D(1)=550G/%p를 기준으로 Node1·3 완주 총액(59,950G)이 B2 최저가 아이템(item1, 48,320G)과 최고가 아이템(item9, 75,520G) 사이 중간값에 위치하도록 잡았다 — "노드 하나를 완전히 마스터하는 비용 ≈ B2 아이템 하나를 만렙 찍는 비용"이라는 단일 완결 투자 단위 간 자릿수 비교이며(구조가 대칭인 비교라 앞서 시도했던 Promotion 대비 %당 단가 비교보다 안전하다 — Promotion은 1회 지불로 공/방/HP 3스탯이 동시에 오르는 번들형이라 "%당 단가"를 1개 스탯 기준으로 나누면 어느 쪽으로 나눠도 자기모순적 결론이 나온다, plan-auditor M-3 지적), Promotion과의 직접 %당 비교는 본 문서에서 제외한다.

5-2. 액티브 카드 언락(heroskilltree 20단계 형태 이식)

UnlockCost(n) = heroskilltree_shape(n) × 100      (n=1,2,3,… — 그랜드파더 10종 이후 순번)

heroskilltree_shape(n): 4단계 블록 구조(원본 형태 그대로, 매핑v1 §2-8)
  블록1(n=1~5):   증가폭 50  → 50,100,150,200,250
  블록2(n=6~10):  증가폭 60  → 310,370,430,490,550
  블록3(n=11~15): 증가폭 70  → 620,690,760,830,900
  블록4(n=16~20): 증가폭 80  → 980,1060,1140,1220,1300
  (블록5 이후 필요 시 증가폭 +10씩 계속 연장 — 닫힌 형태라 20단계 이후도 자유 확장)

×100 재계수화 근거: heroskilltree 원본 합(12,400, 이미 런레벨 EXP로 선점된 절대 단위)과 다른 통화 단위(골드)로 전환하면서, 순번1(=5,000G)이 B1 저레벨 초반 투자와, 순번10 단일 가격(=55,000G)이 B2 item2 만렙(L16) 총비용(54,720G) 과 각각 비슷한 자릿수에 오도록 잡은 앵커다(plan-auditor M-2 지적으로 비교 대상 정정 — "B2 1회 강화 스텝"이 아니라 "B2 아이템 1종 완전 강화 총액"과의 비교다. B2 개별 스텝 비용은 수천 G대에 불과해 원 비교는 실제보다 8배 저렴해 보이는 착시를 낳았다. 정밀 도달성 검증은 §12 재추출 필요분과 별개로, 콘텐츠 배정 이후 플레이테스트 대상).

현재 배정 콘텐츠: 0건(§0 결론 요약, §6-2 표 참조). 그랜드파더 10종(A02·A04·A05·A06·A08·A10·A11·A12·A13·A_Laser, §1 C39 실물 확인)은 가격표 밖에서 전원 무료 상시 해금이며(§8 그랜드파더 처리), 순번1~20은 향후 신규 액티브 스킬이 추가될 때 content-designer가 배정할 가격 스케줄이다.


6. 수치 테이블

6-1. 마스터리 스탯 노드 3종 (전체 18행)

본 표의 l_Cost는 §5-1 "그레이드 단(段)별 한계단가 균일화"(D(grade)×ΔValue) 재계수화 결과다(plan-auditor C-1 정정 반영 — 최초 단일배율×55/×275안은 완주 시점 평균만 맞고 구매 도중 한계단가가 어긋나 폐기, §14 기각안1).

NodeId s_StatKey Grade f_Value 표기 l_Cost(단계별) 누적 비용 한계단가(G/%p)
1 mastery_penetrate_ratio 1 0.01 🟢 550 550 550
1 mastery_penetrate_ratio 2 0.02 🟢 2,310 2,860 2,310
1 mastery_penetrate_ratio 3 0.03 🟢 5,445 8,305 5,445
1 mastery_penetrate_ratio 4 0.04 🟢 10,120 18,425 10,120
1 mastery_penetrate_ratio 5 0.05 🟢 16,555 34,980 16,555
1 mastery_penetrate_ratio 6 0.06 🟢 24,970 59,950 24,970
2 mastery_ele_hurt_add 1 0.05 🟡 2,750 2,750 550
2 mastery_ele_hurt_add 2 0.07 🟡 4,620 7,370 2,310
2 mastery_ele_hurt_add 3 0.10 🟡 16,335 23,705 5,445
2 mastery_ele_hurt_add 4 0.15 🟡 50,600 74,305 10,120
2 mastery_ele_hurt_add 5 0.20 🟡 82,775 157,080 16,555
2 mastery_ele_hurt_add 6 0.30 🟡 249,700 406,780 24,970
3 mastery_ele_penetrate_ratio 1 0.01 🟡 550 550 550
3 mastery_ele_penetrate_ratio 2 0.02 🟡 2,310 2,860 2,310
3 mastery_ele_penetrate_ratio 3 0.03 🟡 5,445 8,305 5,445
3 mastery_ele_penetrate_ratio 4 0.04 🟡 10,120 18,425 10,120
3 mastery_ele_penetrate_ratio 5 0.05 🟡 16,555 34,980 16,555
3 mastery_ele_penetrate_ratio 6 0.06 🟡 24,970 59,950 24,970
3종 합계 526,680 (모든 행 한계단가 그레이드별 완전 일치 — §5-1 검증)

표기(🟢/🟡) 근거(m-1 반영): Node1은 P3-A 기존 확정값 무변경이라 🟢. Node2·3은 §4-1이 명시하듯 "형제 스탯 값형태 대입"(유추, 원본 heroskillattr 고티어 행 직접 재추출 아님)이라 🟡 — §12 재추출 필요분 1행과 정합.

6-2. 액티브 카드 언락 20단계 (배정 콘텐츠 없음 — 가격 구조만)

순번(n) s_CardId l_Cost 누적 비용
1 (미배정) 5,000 5,000
2 (미배정) 10,000 15,000
3 (미배정) 15,000 30,000
4 (미배정) 20,000 50,000
5 (미배정) 25,000 75,000
6 (미배정) 31,000 106,000
7 (미배정) 37,000 143,000
8 (미배정) 43,000 186,000
9 (미배정) 49,000 235,000
10 (미배정) 55,000 290,000
11 (미배정) 62,000 352,000
12 (미배정) 69,000 421,000
13 (미배정) 76,000 497,000
14 (미배정) 83,000 580,000
15 (미배정) 90,000 670,000
16 (미배정) 98,000 768,000
17 (미배정) 106,000 874,000
18 (미배정) 114,000 988,000
19 (미배정) 122,000 1,110,000
20 (미배정) 130,000 1,240,000

7. 성장 곡선

  • 노드 값: Grade→Value는 직접 조회(B1·B2 아웃게임 관행 계승 — 이전 그레이드 값과 합산하지 않음, §13 기각안2). Node1·3은 완전 선형(+0.01/grade 균일), Node2는 원작 C패턴 그대로 후반 가속(+0.02→+0.03→+0.05→+0.05→+0.10, 뒤로 갈수록 그레이드당 가치가 커짐).
  • 노드 비용: 그레이드 위치(1~6)마다 고정된 %p당 단가 D(grade)(=550/2,310/5,445/10,120/16,555/24,970, ingame 6그레이드 비용열×55 형태 그대로)를 정의하고 각 노드의 스텝 비용은 D(grade)×그 스텝 %p증분으로 산출한다(§5-1) — Node1·3은 증분이 항상 1%p라 D(grade) 그대로, Node2는 증분이 5/2/3/5/5/10%p로 들쭉날쭉해 스텝 비용도 2,750/4,620/16,335/50,600/82,775/249,700으로 비선형이지만, %p당 단가는 세 노드 전부 동일 그레이드에서 완전히 같다(지배 전략 부재). 마지막 그레이드(6) 비용이 Node1·3 누적의 약 42%(24,970/59,950) — B1(마지막 10레벨이 전체의 49.9%)과 같은 계열의 후반 집중 강도. Node2는 마지막 그레이드 한 스텝(249,700G)만으로 누적의 61%를 차지 — 10%p를 한 번에 얻는 그레이드6 자체가 원작 C패턴의 "뒤로 갈수록 증분이 커지는" 성격을 비용에도 그대로 반영한 결과다.
  • 액티브 언락: heroskilltree 블록 구조 그대로 — 5순번마다 증가폭이 +1,000G씩 계단으로 올라간다(계단식 선형, B2의 M수열 계단식 2차보다 완만한 형태 — 원작에서도 heroskilltree가 heroequipment보다 완만했던 형태 차이를 그대로 승계).

8. 매판 베이스 결합 — FinalAttack() 항 1개 추가 (RecalcPlayer 무변경)

메타v1 §3-4·B1 §5가 확립한 "단일 계산 메서드" 원칙을 그대로 따른다. 3종 마스터리 스탯이 전부 원작 taxonomy상 "공격계"(청사진v1 §1-1)이므로 DamageReduction이 아니라 FinalAttack()에만 결합한다(작업 지시의 "FinalAttack/DamageReduction 등"은 결합 지점 유형의 예시이지, 본 3종이 양쪽에 걸친다는 뜻은 아님 — §2-2가 확인했듯 애초에 DamageReduction 쪽엔 소비 대상 자체가 없다).

// SurvivalMeta.cs — 신규(P3-B4). SurvivalSkillMasteryTable.Load()는 SurvivalEquipUpgradeTable.Load() 패턴 복제.
static SurvivalSkillMasteryTable _skillMastery;
public static SurvivalSkillMasteryTable SkillMastery => _skillMastery ??= SurvivalSkillMasteryTable.Load();

public static int MasteryGradeOf(int nodeId) =>
    Data.SkillMasteryLevel.TryGetValue(nodeId, out int g) ? g : 0;

/// <summary>3종 마스터리 스탯 합산 — 단일 결합 메서드(3중 SOT 방지, §2-2 정직 한계에 따라
/// "관통/속성" 고유 의미 대신 공격 비율로 잠정 배선. 적 방어 시스템 신설 시 재분리 권고(§13 R-F1).</summary>
public static float MasteryAttackRatio() =>
    SkillMastery.ValueAt(1, MasteryGradeOf(1))     // mastery_penetrate_ratio
  + SkillMastery.ValueAt(2, MasteryGradeOf(2))     // mastery_ele_hurt_add
  + SkillMastery.ValueAt(3, MasteryGradeOf(3));    // mastery_ele_penetrate_ratio

// FinalAttack() 기존 라인 수정(B1 §5 원문, 항 1개만 추가 — 나머지 완전 동일)
public static float FinalAttack() =>
    (BaseAttack + TotalAttack() + HeroLevels.AttackBudgetAt(Data.HeroLevel))
    * (1f + Promotions.AttackBonusRatio(Data.PromotionStar) + MasteryAttackRatio());   // ← 신규 텀

RecalcPlayer() 변경 없음: FinalAttack()은 이미 ApplyMetaEquipment()을 통해 런 시작 시 PlayerAttack에 반영되고(B1 §5·B2 §7), RecalcPlayer()atkRatio(ingame attack_add+hurt_add)는 그 위에서 별도로 곱해진다 — 마스터리 항을 FinalAttack()에 넣으면 RecalcPlayer는 손댈 필요가 없다. B1(4곳)·B2(2곳) 대비 본 결합이 가장 단순하다(호출부 1곳, 신규 항 1개).

8-1. 액티브 카드 드래프트 풀 필터 — SurvivalSkill.Draw() 1줄 추가

// SurvivalMeta.cs — 그랜드파더 스냅샷은 B4 시점 고정 목록이어야 한다(아래 §13 R-F2 필독 — Resources 동적 스캔 금지)
public static readonly HashSet<string> GrandfatheredActiveCardIds = new()
{ "A02", "A04", "A05", "A06", "A08", "A10", "A11", "A12", "A13", "A_Laser" };

public static bool IsActiveCardUnlocked(string cardId) =>
    GrandfatheredActiveCardIds.Contains(cardId) || Data.UnlockedActiveCardIds.Contains(cardId);

public static long NextActiveCardUnlockCost()          // 테이블 캡 초과 시 -1
    => SkillUnlock.CostAt(Data.UnlockedActiveCardIds.Count + 1);

public static void ApplyActiveCardUnlock(string cardId)  // cardId는 content-designer 확정 후 실배정
{
    // plan-auditor m-4 반영 — 그랜드파더 10종이 실수로 섞여 들어오면 Count(=다음 순번 SOT)가
    // 어긋나 이후 전체 순번의 가격이 밀린다. 호출부(UI/개발팀)는 배정된 신규 CardId만 넘길 것.
    if (GrandfatheredActiveCardIds.Contains(cardId) || Data.UnlockedActiveCardIds.Contains(cardId)) return;
    Data.UnlockedActiveCardIds.Add(cardId);
    Save();
}
// SurvivalSkill.cs Draw() — 기존 avail 리스트 채우기 루프에 조건 1개 추가(메타v1 §1-5 확정 방식)
foreach (var a in SurvivalActiveSkillRunner.LoadActiveSkills())
    if (a != null && runner.CanAcquireOrUpgrade(a) && SurvivalMeta.IsActiveCardUnlocked(a.CardId))  // ← 추가
        avail.Add(a);

현재 그랜드파더 10종 = LoadActiveSkills()가 반환하는 실제 10종 전체이므로 이 필터는 현재 시점엔 무엇도 걸러내지 않는다(§0 신규유저 불변 검증) — 향후 11번째 액티브 카드가 추가되는 순간부터 실제로 작동을 시작하는 구조다.


9. 데이터 모델

9-1. SurvivalMetaData v3→v4

// ── P3-B4 신규 (아웃게임 영구 성장 Layer⑤ 스킬마스터리) ──
/// <summary>Layer⑤ 마스터리 스탯 노드 — NodeId(1=penetrate_ratio,2=ele_hurt_add,3=ele_penetrate_ratio) → Grade(0~6).
/// 미투자 노드는 키 자체가 없어 MasteryGradeOf 가 0 을 돌려준다(신규 유저 FinalAttack 불변 보장).</summary>
public Dictionary<int, int> SkillMasteryLevel = new();

/// <summary>Layer⑤ 액티브 카드 언락 — 그랜드파더 10종은 포함하지 않는다(코드 상수로 별도 판정, §8-1).
/// 이 집합엔 순번 11번째 이후 신규 카드 CardId만 쌓인다. Count 자체가 "다음 구매할 순번-1"의 SOT다(별도 카운터 불요).</summary>
public HashSet<string> UnlockedActiveCardIds = new();

public const int CurrentVersion = 4;   // v4: SkillMasteryLevel/UnlockedActiveCardIds(P3-B4)
public int Version = CurrentVersion;

Load() 마이그레이션(B1·B2 패턴 그대로): _data.SkillMasteryLevel ??= new(); _data.UnlockedActiveCardIds ??= new();빈 딕셔너리/빈 셋으로 충분하다. UnlockedActiveCardIds를 "현재 Resources의 전체 카드로 채워 시작"시키지 않는 것이 의도적 설계 차이다(메타v1 §5-1 원안 대비 개선, §13 기각안4) — 그랜드파더 판정을 저장 데이터가 아니라 코드 상수(GrandfatheredActiveCardIds)로 고정하면, 마이그레이션 시점이 언제든(v1 직접 승격이든 v3 경유든) 정확히 동일한 10종만 무료 판정을 받는다.

9-2. 신규 CSV 2종

SurvivalMetaSkillMastery.csv(기존 파일 갱신 — Node1 l_Cost 재계수화 + Node2·3 신규 추가)

n_NodeId,s_StatKey,n_Grade,f_Value,l_Cost
마스터리 노드ID,능력치 키(아웃게임 mastery_ 접두 가드),강화 단계,단계별 값(heroskillattr A/C패턴 원값·매핑v1 §2-4 표기 통일·그레이드 직접값 비누적),해금 비용(P3-B4 그레이드별 한계단가 균일화 재산정)
1,mastery_penetrate_ratio,1,0.01,550
1,mastery_penetrate_ratio,2,0.02,2310
1,mastery_penetrate_ratio,3,0.03,5445
1,mastery_penetrate_ratio,4,0.04,10120
1,mastery_penetrate_ratio,5,0.05,16555
1,mastery_penetrate_ratio,6,0.06,24970
2,mastery_ele_hurt_add,1,0.05,2750
2,mastery_ele_hurt_add,2,0.07,4620
2,mastery_ele_hurt_add,3,0.10,16335
2,mastery_ele_hurt_add,4,0.15,50600
2,mastery_ele_hurt_add,5,0.20,82775
2,mastery_ele_hurt_add,6,0.30,249700
3,mastery_ele_penetrate_ratio,1,0.01,550
3,mastery_ele_penetrate_ratio,2,0.02,2310
3,mastery_ele_penetrate_ratio,3,0.03,5445
3,mastery_ele_penetrate_ratio,4,0.04,10120
3,mastery_ele_penetrate_ratio,5,0.05,16555
3,mastery_ele_penetrate_ratio,6,0.06,24970

SurvivalMetaSkillUnlock.csv(신규 — CSV 포맷 계약 §3-4 준수, 매핑v1 §3-4)

n_UnlockOrder,s_CardId,l_Cost
해금 순번(그랜드파더 10종 이후),배정 카드ID(미배정 시 공란·content-designer 후속 기입),해금 비용(heroskilltree 20단계 형태×100)
1,,5000
2,,10000
3,,15000
4,,20000
5,,25000
6,,31000
7,,37000
8,,43000
9,,49000
10,,55000
11,,62000
12,,69000
13,,76000
14,,83000
15,,90000
16,,98000
17,,106000
18,,114000
19,,122000
20,,130000

9-3. 코드 터치포인트 요약

파일 변경
SurvivalMeta.cs SurvivalMetaData 2필드 추가(v3→v4)+Load() 마이그레이션 1줄 · SkillMastery/SkillUnlock 프로퍼티 · MasteryGradeOf/MasteryAttackRatio/GrandfatheredActiveCardIds/IsActiveCardUnlocked/NextActiveCardUnlockCost/ApplyActiveCardUnlock/MasteryUpgradeCost/ApplyMasteryUpgrade 신규 메서드 · FinalAttack() 1항 추가(§8)
SurvivalSkill.cs Draw() 액티브 후보 필터에 IsActiveCardUnlocked 조건 1개(§8-1)
신규 파일 2개 SurvivalSkillMasteryTable.cs(ValueAt/CumulativeCostAt/MaxGrade) · SurvivalSkillUnlockTable.cs(CostAt/MaxOrder) — SurvivalEquipUpgradeTable.Load() CSV 파싱 패턴(헤더 2행 스킵) 복제
SurvivalBattleManager.cs 무변경(§8, RecalcPlayer 손대지 않음 — B1·B2보다 단순)
SurvivalStatCatalog.cs (참고, 본 문서 범위 밖) 3종 Note 필드를 구현 완료 후 "획득 로직 P3-B4" → 실제 CSV/메서드 참조로 갱신 권고

10. 검증 시나리오

# 시나리오 통과 기준 결과
1 기준선 무결성 — SkillMasteryLevel 전부 미투자 MasteryAttackRatio()=0, FinalAttack()이 B1·B2 시점과 동일 통과(§9-1 딕셔너리 기본 조회 0)
2 그랜드파더 보존 — UnlockedActiveCardIds 빈 셋 10종 전부 IsActiveCardUnlocked()=true 통과(§8-1 하드코딩 OR 조건)
3 신규유저 드래프트 풀 불변 Draw() 결과가 B4 이전과 동일한 10종 후보 통과(§8-1, 현재 그랜드파더=Resources 전체와 일치)
4 노드 독립성 Node2만 그레이드3 구매해도 Node1·3 무관 통과(딕셔너리 키 독립)
5 한계단가 균일성(그레이드별) 임의 그레이드 G에서 Node1·2·3 전부 동일 D(G) 통과(§5-1 정정판 — D(grade)×ΔValue 역산 설계로 전 그레이드 산술 일치. 최초 초안(단일 배율 ×55/×275)은 완주 평균만 맞고 도중 한계단가가 최대 2배 어긋나 plan-auditor C-1로 불통과 판정, §5-1·§14 기각안1에서 정정 완료)
6 결합 최댓값(원시 %p, RecalcPlayer 전개 전) 3노드 전부 그레이드6: MasteryAttackRatio()=0.06+0.30+0.06=0.42 참고치(+42%p, FinalAttack() 승산항 기준) — RecalcPlayer 전개 시 atkFlat(만렙 1,650 고정 가산)에 의해 실효 증폭률은 이보다 작다(plan-auditor M-4 지적, B1 R-C4가 동일 계열 전개를 이미 수행한 전례) — §13 R-F3(연쇄 증폭) 이관, 정밀 전개는 범위 밖
7 해금 스케줄 확장성 n>20 시에도 블록 패턴(+10/블록) 연장으로 CostAt 정의 가능 통과(닫힌 형태, §5-2)
8 액티브 언락 순차성 순번3 구매 전 순번4 구매 불가 통과(Count+1 단일 다음-순번 조회)

11. 밸런싱 제안 표

항목 현재 값 제안 값 근거
mastery_penetrate_ratio f_Value(Grade1~6) 0.01/0.02/0.03/0.04/0.05/0.06(P3-A 기존) 무변경 이미 원작 heroskillattr A패턴 확정값(§5-1)
mastery_penetrate_ratio l_Cost(Grade1~6) 10/42/99/184/301/454(인게임 이관 carry, "P3-B4 재산정" 표기 상태) 550/2,310/5,445/10,120/16,555/24,970(=D(grade), ingame 비용열×55) 아웃게임 영구 경제 스케일 재계수화. 단일 노드 완주 총액(59,950G)이 B2 아이템 1종 만렙 비용대(48,320~75,520G) 중간값에 위치하도록 앵커(§5-1)
mastery_ele_hurt_add(Node2) f_Value/l_Cost 없음(신규) 0.05~0.30(C패턴, hurt_add 형제)/2,750·4,620·16,335·50,600·82,775·249,700(=D(grade)×그레이드별 %p증분) 형제 스탯 값형태 대입 + 그레이드별 한계단가(G/%p)를 Node1·3과 완전히 동일하게 역산(§5-1 — plan-auditor C-1 지적으로 "완주 평균 균일화" 대신 "그레이드 단위 한계단가 균일화"로 정정)
mastery_ele_penetrate_ratio(Node3) f_Value/l_Cost 없음(신규) 0.01~0.06(A패턴, penetrate_ratio 형제)/550~24,970(Node1과 완전 동일 — 증분이 항상 1%p라 D(grade) 그대로) 형제 스탯 값형태 대입(§5-1)
액티브 카드 언락 순번1~20 l_Cost 없음(신규, 구조만) 5,000~130,000(heroskilltree×100) §5-2, 배정 콘텐츠는 content-designer 후속
FinalAttack() 결합항 Promotion 1항만 +MasteryAttackRatio() 1항 추가 §8, RecalcPlayer 무변경 유지

세그먼트 영향(무과금/소과금/고과금): B1·B2와 동일 판정 — 전 세그먼트 동일(Survival IAP 미연동 현재 상태 승계). GOLD_ID가 상점 골드팩과 공유되므로, 향후 상점 IAP 결선 시 고과금 유저는 골드 구매로 마스터리 노드·언락 진행을 시간 단축 가능(B1 §10이 이미 F2P 표준 구조로 판정한 것과 동일 성격, 별도 조치 불요).


12. 재추출 필요분 (개발팀장 후속 — 차단 아님)

항목 현재 확보 상태 우선순위 사유
ele_hurt_add(038, prefix 93~95)·ele_penetrate_ratio(037, prefix 73~75) 원본 heroskillattr 고티어 실제 행 값(SurvivalStatCatalog.cs Note 필드 기준, plan-auditor m-2 지적으로 prefix 짝 정정) 🟡 형제 스탯(hurt_add C패턴·penetrate_ratio A패턴) 유추 대입 — 직접 재추출값 아님 중(플레이테스트 전 선행 권고) 재추출 완료 시 §5-1·§6-1 값곡선을 유추가 아닌 실측으로 교체 가능. 현재 유추는 "같은 계열 변형이므로 같은 패턴을 따를 개연성이 높다"는 구조적 근거이지 원본 확인은 아니다
heroskillattr 87엔트리 6종 분포 불균등(hp_add25·attack_add14·penetrate_ratio12·ele_penetrate_ratio12·hurt_add12·ele_hurt_add12) 원인 🟡 미규명 — quality tier 수 대응 여부 미확인 낮음(참고용) GodDem은 이미 6그레이드 균일 표준(B1·B2·ingame 전체 관행)을 확립했으므로 원작의 불균등 엔트리 수를 그대로 따를 이유가 없음 — 재추출해도 본 설계를 바꾸지 않음

13. 리스크

ID 리스크 심각도 내용
R-F1(신규, §2 발견) 3종 마스터리 스탯 전부 "관통/속성" 고유 의미 없이 공격 비율로 잠정 배선 §2-2·§8 — 적 방어 시스템·원소 상성 시스템이 없어 원래 의미대로 소비할 수 없다. 잠정 조치(FinalAttack 합산)로 사장 스탯 재발은 막았으나, "관통"·"속성"이라는 표시 문구가 실제 동작(순수 공격력↑)과 불일치 — UI 표기 시 ux-designer 협의 필요(§14)
R-F2(신규) 그랜드파더 카드 목록을 동적 스캔(Resources 전체)으로 구현할 경우 게이팅 무력화 높음(구현 주의) §8-1·§9-1 — GrandfatheredActiveCardIds는 반드시 B4 시점 고정 하드코딩 10종이어야 한다. "현재 Resources에 있는 카드 전부"로 구현하면 미래에 신규 카드가 추가된 뒤 설치한 신규 계정도 그 카드를 무료로 받게 되어 언락 시스템 자체가 무의미해진다 — 개발팀 구현 시 최우선 점검 항목
R-F3(신규, plan-auditor M-4 반영 정정) 마스터리 최댓값(원시 +42%p, FinalAttack() 승산항 기준)이 B1(103.7배 증폭 기확인, R-C4)·B2(66배 형태축소) 위에 추가로 쌓이는 3번째 증폭 레이어 중(범위 외) §10 시나리오6 — 원시 +42%p는 RecalcPlayer()atkFlat(만렙 1,650 고정 가산) 희석을 반영하지 않은 상한값이라 실제 체감 증폭은 이보다 작다(B1 R-C4가 동일한 이유로 최초 발신값을 정정했던 전례와 동일 성격 — 본 문서는 정밀 전개까지는 범위 밖으로 유보). 스테이지 난이도(P3-C) 설계 시 B1+B2+B4 결합 최댓값을 RecalcPlayer() 전개 기준으로 재검토 필요. system-designer·PD 인지 필요(B1 R-C6 계열과 동일 성격)
R-F4(신규) 액티브 언락 20단계가 현재 배정 콘텐츠 0건 — ele_* 2종과 동일한 "구조만 있고 실체 없음" 패턴 재현 낮음(의도된 구조) §6-2·§8-1 — 다만 이는 ele_*처럼 "숨은 위험"이 아니라 명시적으로 의도된 선구축(기본 제공 10종이 전량 무상 유지되므로 당장 어떤 유저 경험도 저해하지 않음). content-designer가 신규 액티브를 만들 때 이 표를 그대로 사용하면 된다
R-F5(신규) Node2(ele_hurt_add) 최댓값 0.30이 ingame hurt_add 자체 최댓값(0.30, 직접값 기준)과 동일 — 인게임+아웃게임 동일 스탯 계열 합산 시 상호 인지 필요 낮음(정보성) §5-1 — hurt_add(ingame)와 ele_hurt_add(마스터리)는 별개 키라 코드상 충돌은 없으나, 두 값이 개념적으로 같은 "피해 증가" 계열이라는 점은 향후 UI 표시 시(합산 노출 여부) 고려 필요
R-F6(신규, plan-auditor C-2 반영) SurvivalMetaSkillMastery.csv 덮어쓰기 전 C6-1 백업 미명시 높음(구현 전 필수) 본 시리즈(B1·B2) 최초로 기존 파일을 덮어쓰는 케이스다(B1·B2는 전부 신규 CSV 생성이라 백업 대상 자체가 없었음). C6-1은 수치 밸런스 파일 변경 전 {원본명}.bak_{YYYYMMDD_HHMM}.{확장자} 백업을 무조건 요구 — git 추적 이력이 있으나 "git 이력으로 C6-1 백업 의무를 갈음한다"는 판단은 설계자가 침묵으로 대체할 사안이 아니라 팀장·PD 확인이 필요하다(§16 후속조치에 명시)

14. 기각안 (C32)

# 검토안 기각 사유
1 ingame 6그레이드 비용열을 스탯 종류 무관하게 동일 배율로 3노드에 복제(Node2도 ×55) §5-1 — Node2(최댓값 30%)가 Node1·3(최댓값 6%)과 동일 가격에 5배 가치를 가져 "무조건 Node2부터"라는 지배 전략이 생김. P30(재미 우선 — 실질 선택지) 위반 소지
1-B(신규, plan-auditor C-1 반영 — 2단계 기각) 기각안1의 대안으로 최초 채택했던 "노드별 완주 총액 평균만 균일화"(Node1·3 ×55, Node2 ×275 단일 배율) 완주 시점(그레이드6) 평균 단가만 9,992G/%로 맞을 뿐, 구매 도중 그레이드별 한계단가는 맞지 않는다 — Node2의 값곡선(C패턴, 그레이드별 %p증분 5/2/3/5/5/10로 불균등)에 단일 배율을 곱하면 그레이드6 한계단가(12,485G/%p)가 Node1·3의 그레이드6(24,970G/%p)보다 정확히 절반이 되어, "만렙 직전까지는 Node2가 항상 더 싸다"는 지배 전략이 형태만 바꿔 재발한다(plan-auditor 실측 재계산으로 확인). 그레이드 단(段)별 한계단가 균일화(D(grade)×ΔValue 역산, §5-1 본문)로 대체 — 이러면 임의 그레이드에서 비교해도 3노드가 완전히 동률이라 지배 전략이 구조적으로 성립하지 않는다
2 마스터리 노드값을 ingame Total()처럼 그레이드 1~N 누적합으로 해석(Node1 만렙=0.21) ingame과 아웃게임(B1·B2)이 서로 다른 관행을 이미 확립했음을 재확인(B1 HeroLevel 예산·B2 Attack/Hp 컬럼 전부 "현재 레벨 직접값", ingame만 Total() 누적) — 본 층은 아웃게임이므로 B1·B2 관행(직접값) 채택. "B1·B2 일관" 지시와 직접 부합
3 마스터리·언락 전용 신규 중간재(예: "숙련 결정") 도입 B1 기각안4·B2 §1이 이미 확립한 "기존 골드 재사용" 원칙의 3번째 적용 — 별도 통화 UI·환전 로직 등 불필요한 복잡도 회피(C50)
4 UnlockedActiveCardIds를 마이그레이션 시점 "현재 Resources 전체 카드"로 채워 시작(메타v1 §5-1 원안) §9-1·R-F2 — 이 방식은 신규 카드 추가 이후 설치한 신규 계정도 그 카드를 자동 그랜드파더 처리해버려 게이팅이 시간이 지날수록 무력화된다. 코드 상수 고정 스냅샷 + 쿼리 시점 OR 판정으로 대체해 이 부식을 원천 차단
5 적 방어 시스템·원소 상성 시스템이 실제로 신설될 때까지 3종 마스터리 스탯을 소비처 없이 "정의만" 대기 §2-2·§8 — 이 프로젝트가 이미 겪고 코드 주석에 명시적으로 경고를 남긴 "penetrate_ratio 사장" 사고와 동일한 유형을 ⑤ 레이어에서 그대로 반복하게 된다. 잠정 배선(FinalAttack 공격비율 합산)으로 실제 효과를 즉시 부여하는 쪽이 헌법 원칙(사장 스탯 방지) 및 C2(근본해결·proxy 구분: 완전한 재분리는 적 방어 시스템 신설이 근본해결이나 그 전까지 무효과 방치는 proxy조차 못 되는 방치)에 부합
6 마스터리 노드(A) 또는 언락(B) 트랙에 B1식 게이팅(예: HeroLevel 일정 이상이어야 마스터리 착수 가능) 도입 B1의 "승급이 레벨을 게이팅"은 원작 실측(hero_star의 진짜 기능)에 근거한 예외적 설계였고, B2(장비 9종)는 그런 교차 게이팅 없이 완전 독립이다 — 본 트랙도 B2 선례를 따라 독립 유지, 임의로 B1의 예외 패턴을 일반화하지 않는다

15. 변경 이력 (P16)

일시 변경자 항목 이전값 이후값 사유
2026-08-22 balance-designer 문서 신규 작성(v1) 본 문서 전체(Layer⑤ 2트랙 실수치·결합식·CSV 2종) PD "현 세션 B2 계속"+"원작처럼 맞춰" 원칙의 3번째 적용(B1·B2 계승), P3-B4 착수
2026-08-22 balance-designer AttributeTag 소비 여부 🔴 미확인(메타v1 §1-5 선행조건) 🟢 확인됨(미소비 확정) 본 세션 SurvivalUnit.cs·SkillDataAsset.cs 직접 재확인(C39)
2026-08-22 balance-designer penetrate_ratio 소비처 상태(신규 발견) (명시된 적 없음 — 암묵적으로 "⑤ 확정 완료"로만 취급) 🟢 확인됨: 적 DamageReduction 상시 0, 관통 대상 자체 부재 본 세션 RecalcPlayer()·SurvivalUnit.TakeDamage() 재확인 중 발견, C3 은폐 없이 표면화
2026-08-22 balance-designer mastery_penetrate_ratio l_Cost 10/42/99/184/301/454(인게임 이관 carry) 550/2,310/5,445/10,120/16,555/24,970(×55) P3-A CSV 자체 표기 "P3-B4 재산정" 이행
2026-08-22 balance-designer mastery_ele_hurt_add/mastery_ele_penetrate_ratio(Node2·3) 없음(신규) f_Value·l_Cost 전체 확정(§6-1) 형제 스탯 값형태 대입 + 그레이드별 한계단가 균일화 설계
2026-08-22 balance-designer 액티브 카드 언락 가격 스케줄 없음(구조만, 메타v1 §1-5) 20단계 heroskilltree 형태×100 확정(§6-2) §5-2
2026-08-22 plan-auditor 모드A 감사 수행 조건부통과(Critical2·Major6·Minor7, 산술·(a)(d) 사실주장 전량 무오류) C35 감사 게이트 — balance-designer 요청
2026-08-22 balance-designer plan-auditor 지적 전항 반영 최종화(같은 v1 내 확정) 초안 Critical(§5-1 한계단가 균일화 재설계·Node2 l_Cost 4,620/16,335/249,700 정정·§16 C6-1 백업 명시)·Major(§4-1·§8 인용 청사진v1 정정·§5-2 B2 비교대상 정정·§5-1 Promotion 교차검증 제거·§16 메타v1 정정요청·기획팀장 검증 단계 추가)·Minor(§6-1 🟢/🟡 표기·§12 prefix 짝 정정·"그랜드파더"→"기본 제공" 일부 정정·§9-2 헤더 용어 통일) 전부 반영 C35 감사 게이트 — 조건부통과 정정 완료 후 발신

16. 후속 조치 (본 문서 범위 밖)

  1. 개발팀 구현 선행 필수: §9-3 코드 터치포인트 전체(SurvivalMetaData v4·FinalAttack() 1항·Draw() 1조건·CSV 2종·신규 Table 클래스 2개). GrandfatheredActiveCardIds는 반드시 하드코딩 스냅샷으로 구현(R-F2, 최우선 점검).
  2. C6-1 백업 의무(신규, plan-auditor C-2 반영): SurvivalMetaSkillMastery.csv는 B1·B2와 달리 기존 파일 덮어쓰기다(P3-A 시드 6행이 이미 존재). 개발팀 구현 착수 시 원본을 SurvivalMetaSkillMastery.csv.bak_{YYYYMMDD_HHMM}.csv로 백업 후 갱신할 것 — 또는 "git 이력을 C6-1 복구 경로로 갈음한다"는 판단을 팀장·PD가 명시적으로 승인할 것(R-F6). 침묵 채택 금지.
  3. 개발팀장 재추출(차단 아님, §12): ele_hurt_add(038, prefix 93~95)/ele_penetrate_ratio(037, prefix 73~75) 원본 행 값.
  4. content-designer 후속: 신규 액티브 스킬 제작 시 SurvivalMetaSkillUnlock.csv 순번1부터 순차 배정(§6-2·§8-1).
  5. ux-designer 협의: R-F1 — 마스터리 스탯 UI 표기가 "관통/속성"이라는 이름과 실제 동작(공격 비율)의 불일치를 어떻게 다룰지(예: 표시 문구를 "관통 마스터리"로 유지하되 툴팁에 "공격력 증가로 적용" 명기).
  6. system-designer·PD 인지 필요: R-F3 — B1(103.7배)·B2(66배 축소)·B4(원시 +42%p, RecalcPlayer 전개 시 더 작음) 3개 레이어 결합 최댓값이 P3-C 스테이지 난이도 기준선에 미치는 영향.
  7. 메타v1 본문 정정 요청(신규, plan-auditor M-5 반영): 2026-08-22_메타아키텍처_재설계_v1.md에 다음 2건 갱신 필요 — ㄱ) §1-5·§5-1의 "UnlockedActiveCardIds는 전체 카드로 채워 시작" 서술을 본 문서 §9-1 확정 방식(빈 셋 + 코드 상수 GrandfatheredActiveCardIds 별도 판정)으로 정정 ㄴ) §1-5·§10-1의 AttributeTag 🔴 미확인 선행조건을 🟢 확인됨(미소비 확정, 본 문서 §2-1)으로 갱신. system-designer(메타v1 원저자) 또는 PM 소관.
  8. 기획팀장 검증(신규, plan-auditor M-6 반영): C49 3단계(팀장 설계→팀원 작업→팀장 검증) 완결을 위해 plan-auditor 감사(C35 게이트) 통과와 별개로 기획팀장(Opus) 최종 검증을 재상정한다 — B1 §14-7이 동일하게 명시한 절차.
  9. PM 공유: 본 문서 산출 완료를 대화로그(공유/대화로그/GodDem/2026-08-22.md #45, 결정·근거·영향·기각안 4요소 포함)에 반영, 개발팀_PD_지시_로그.md(GodDem/BT13 단일 관리) 갱신은 개발팀장 소관(B1·B2 선례 승계).
  10. plan-auditor 모드A 감사 — 완료: 판정 조건부통과(Critical2·Major6·Minor7). 지적 사항 전항 본 v1에 반영 완료(§0·§5-1·§6-1·§9-2·§10·§11·§12·§13·§14·§15, 위 1·2·7·8 항목 포함) — 재검증 필요 시 후속 세션에서 확인.