원작은 12진영 × 150레벨 × 6등급 × 31성의 **수개월짜리 수집형 RPG**이고, 우리는 **캐릭터 1명 · 한 판 20레벨 · 매판 리셋**이다. 행을 그대로 복사하면 5레벨 만에 자릿수가 터진다. 따라서 **검증된 수식을 우리 스케일로 다시 푸는 것**이 정답이다.
> **검증 상태 표기** — 적대적 교차검증을 완주한 절은 ✅, 검증관이 세션 한도로 완주하지 못한 절은 ⚠️로 표기한다. ⚠️ 절은 근거 수치가 명시된 항목만 채택했으나 **테이블 작성 시 해당 CSV를 반드시 재확인**할 것. 실제로 본 문서 감사에서 적발된 오류 4건이 전부 ⚠️ 절에서 나왔다.
### 2-1. ⚠️ 캐릭터 레벨 성장 — `hero_level.csv` (1800행 = 12진영 × 150레벨)
- **레벨당 수치는 22시리즈 전부 순수 선형** (비선형 0건). 예: attack_add 1.0/2.0/3.0/4.0/5.0, hp_add 2.0/4.0/6.0/8.0/10.0.
- **원작 스킬의 수치는 전부 패시브 스탯 버프**다. `heroskillattr`에 쿨타임·지속시간·발동조건 컬럼이 없고 `heroskillbuff.csv`는 미존재. 다만 **`heroskill.csv`는 실존한다**(170바이트·3행) — 컬럼 `id,nameid,prefab,icon,descid,quality,effect,skilltype,target,subclass`로 `prefab`·`effect`·`skilltype`·`target`이 **액티브 스킬 파이프라인의 스키마 증거**다(값은 전부 공란인 스텁, cooldown·range 컬럼은 실제로 없음). 즉 "액티브 스킬 개념 자체가 없었다"가 아니라 **"스키마는 있으나 데이터가 비어 있다"**가 정확하다. 액티브 스킬 설계 시 참조할 **수치**는 없다.
### 2-5. ✅ 가중 추첨 — `heroequipmentskill.csv` (1430행) ⭐ 3종 택1의 데이터 모델
**weight = 354 / 189 / 57 / 26 / 15 / 1, 합 642** → 등급 1~6 확률 **55.14% / 29.44% / 8.88% / 4.05% / 2.34% / 0.16%**. position 순으로 6주기 반복. skill_id 882종이 `heroskillattr.id`에 882/882 전부 매칭.
**등급의 실질 가치 = 확정 티어 지급**: q3 장비는 자연 확률 8.88%인 티어3 옵션을 100% 확정으로 받는다. 옵션 슬롯 수 = `max(1, quality-1)`.
- **weight/10000 basis point**: 전체 **192개 풀 중 102개**가 정확히 합 10000 (재실측). 나머지는 8374(34풀)·9999(9풀)·9900(6풀)·9500(4풀) 등으로 **합계가 통일돼 있지 않다** — 원작도 완전히 규율하지 못한 부분이다. 우리는 **전 풀 합 10000 강제**를 채택한다(1 = 0.01% 단위, float 확률 금지, int weight 통일). 검증이 "합계 10000" 한 줄로 끝나는 것이 이 방식의 최대 이점.
3.**`HeroAttackMultiplier`·`HeroHpMultiplier` 사장** — `Equip.csv` 2200003(목걸이)가 이 옵션을 부여하고 아이콘·3개국어 텍스트까지 완비돼 있으나 **소비 코드가 0건**이라 아이템이 아무 효과도 내지 않는다. 출고된 아이템의 무효화 결함.
4. 미사용 컬럼 5종 — `Unit.csv`의 `f_ExtraHitArea`·`f_ExtraHitRate`·`n_AttackCount`·`f_AttackDelay`·`e_AttackType` (UnitT에 프로퍼티까지 있으나 읽는 곳 0건). **신설 전에 먼저 살려 쓸 후보**.
---
## 4. 인게임 밸런스 적용안
### (a) 웨이브별 적 스탯 — 계단형 지수
```
EnemyHP(stage s, wave w) = Base × 2.1^(s-1) × 1.04^((w-1) mod 10)
EnemyATK = EnemyHP / 4 ← 원작 4:1 규율
```
- 웨이브 내 ×1.04 근거: 원작 블록 내부 기하평균의 **전체 실측 범위는 ×1.0019~×1.1457**(20블록)이며 단조 감쇠하지 않는다. ×1.04는 그 중 초기 구간(1.0333~1.0436) 기준으로 **우리가 선택한 값**이지 원작 대표값이 아니다 — 튜닝 여지가 넓다는 뜻.
- 블록 경계 ×2.1 근거: 1.04^9 × 2.1 = **×2.989** ≈ 우리 `StageBalance.csv` 기존 스테이지당 ×3.00과 정합. (원작 경계 점프 ×8~×2142는 과격해 폐기, **구조는 원작 / 강도는 자사 기존 곡선** 절충)
- 후반 감쇠: 스테이지 5 이후 웨이브 내부 증가율을 1.04 → 1.03 → 1.02 단계 하향.
### (b) 10웨이브 보스
- **HP 배율 ×8**, 공격력은 4:1 유지 → 원작 "공격 유닛 HP 상한 13.33배" 규율 내.
- 그 이상 체력이 필요하면 원작처럼 **공격력 0인 오브젝트**로 분리.
- ⚠️ 원작에 "10웨이브 보스" 데이터는 **없다**(검증에서 확인). 이 수치는 원작 규율을 적용한 우리 설계다.
### (c) 적 처치 골드
- 웨이브 진행 대비 보상은 원작 `teamwavepassreward` 등급 배율 **[1.0, 1.2, 1.6, 2.0]** 채택 (원작은 저수량 구간에서 정수 반올림 때문에 [1.0,1.5,2.0,2.5]로 변형되므로, 우리는 기본 수량을 충분히 크게 잡아 배율을 일관 유지한다).
20단계 길이가 "한 판 20레벨"과 정확히 맞고, 차분이 5단계마다 +10만 오르는 계단선형이라 런 전체 레벨업 체감이 균일하다. `hero_level`의 3차식(20레벨 안에서 곡선이 살아나지 못함)이나 `BattleUpgrade`×1.18(5레벨 만에 자릿수 폭발)은 부적합.
**3종 택1 추첨** — `heroequipmentskill` weight 모델 + `drawlib` basis point 결합:
천장: pool2need=9 (10레벨 레어 확정) / pool3need=29 (30레벨 에픽 확정) ← 라이브러리 교체 방식
```
천장 근거는 원작 `drawtype.csv`의 `(libid2need, libid3need, libid4need) = (9, 29, 999)` 스케줄이다. 원작은 **4단**을 지원하나 18행 중 4행만 천장을 쓰고 스케줄도 2종뿐이므로, 우리는 한 판 20레벨 규모에 맞춰 **2단(9·29)만 채택**한다. 4번째 슬롯은 필요해질 때 컬럼만 추가하면 된다.
**스킬 효과 카탈로그** (원작 `heroskillattr` q1 실측값 기반, 등급 1~3 3단):
| `ingameconst.csv` | `s_Key, s_Value, n_Value2, f_Value3` | 원작 const 패턴 — 시스템 늘 때 클래스 추가 불필요 |
**코드 측**: `BoostType`에 `RunSkill` 추가 + `RunSkillBoost : Boost` 1클래스 + 매판 초기화 메서드 → 기존 `GetPlayerAttackMultiplier()` 경로에 자동 합류. `UnitGrade`에 `Boss` 추가. `OptionType`에 위 표의 ⚠️ 항목 신설.
---
## 6. 주의·한계
1.**저작권** — 원작 밸런스 "수치"는 참고 자료이며, **아트·텍스트·사운드 리소스는 사용 불가**. 추출물은 scratchpad 임시 폴더에만 보관하고 레포에 커밋하지 않았다. 우리 테이블은 위 수식을 우리 스케일로 다시 푼 자체 수치로 채운다.
2.**규모 불일치** — 원작 12진영×150레벨×6등급×31성 vs 우리 캐릭터 1명·20레벨·매판 리셋. 행 단위 복사는 전면 금지.
3.**영구 vs 매판** — 원작 강화 곡선은 수확체감이 없다(영구 전제). 매판 리셋에는 반드시 지수 비용 + 선형 증가로 재설계해야 선택의 재미가 생긴다.
4.**액티브 스킬 수치 부재** — 원작에 채워진 스킬 데이터는 전부 패시브 스탯 버프다. 단 `heroskill.csv`에 `prefab`·`effect`·`skilltype`·`target` 스키마가 존재하므로(값은 공란 스텁) "액티브 개념이 없었다"가 아니라 **"틀은 있고 데이터가 비었다"**가 정확하다. 액티브 스킬을 만들 경우 참조할 **수치**는 없으므로 자체 설계다.
5.**미검증 구간** — 검증 에이전트가 세션 한도로 4개 그룹(성장·장비·경제·자사구조)을 완주하지 못했다. 해당 절은 본문에 **⚠️로 표기**했다. 실제로 이후 PM 감사에서 적발된 오류 4건이 **전부 ⚠️ 절에서 나왔다** — 전역 고지 1줄은 절 단위 표기를 대체하지 못한다는 교훈이다. ⚠️ 절의 수치는 테이블 작성 시 반드시 원본 CSV 재확인.
6.**원작 몬스터 스탯 원본 부재** — `wildernesspk`가 참조하는 `monsterteam[10001~10052]` 테이블이 추출본에 없다. 참고 가능한 적 절대 스탯은 `A80ChampMatchConfig` 34행이 전부다.
7.**복호화 키 취급** — 22바이트 XOR 키는 타사 기술적 보호조치 우회 수단이므로 본 문서에 평문 기재하지 않았다(§1). **PD 결정(2026-08-21): 조직 기록 미보존 확정 — 대화로그 평문분 삭제 완료.** 재해독이 필요하면 원작 APK에서 재추출한다.