[WL-813n] 스킬 프리셋·MP 실테이블 적용 (#813)

WL-813n 2단계 — 1단계 초안(_WL813n_SkillList.json)의 값을 원본 Export 테이블에
실제로 반영. 총 45셀 변경 · 행/필드 추가·삭제 0 · 코드 0 · 유니티 에디터 미사용.

- SkillList.json (39셀)
  - 프리셋 16행 × f_CoolTime·n_MP = 32셀: 쿨 5→6/8/12/20 · MP 5→10/15/25/40
    (근접 4클래스 10101/10102/10501/10502 × 4슬롯 · 다른 33필드 무변경)
  - 고아/오류 n_SkillClassID 정정 7건: 700002 10201→10102 · 700004 10203→10202
    · 700008 10304→10401 · 700009 10305→10402 · 700010 10306→10501
    · 700011 10307→10502 · 700012 10308→10601 (행 삭제 0 · ClassConfig.n_ExtraSkill
    역참조 실측 근거)
- GlobalValue.json (2셀): MP 30→100 · MP_REGEN 3→5
- ClassConfig.json (4셀): n_DefaultMP 30→100 (근접 4클래스만 · 나머지 8행 30 유지)
  → Actor.cs:733-741 MP 게이트 통과. 미반영 시 슬롯 4(40MP) 영구 불발이었음.
- WL813n_SkillPreset.md: §8 "2단계 적용 내역 · 검증 · 롤백 · 남은 선행 조건" 추가

검증(python utf-8-sig): 행 수 130/75/12 불변 · 필드 수 35/3/24 불변 · 키 순서 불변
· 전 값 str 유지 · UTF-8 BOM 유지 · 단일 라인 유지 · 변경 셀 수 39/2/4 = 의도치 일치
· 재직렬화 왕복 byte-identical 사전 확인.

⚠ xlsm 동기화 필요 — SOT 는 Assets/ResWork/Table/butler.xlsm 이다. 위 45셀을 xlsm
의 SkillList/GlobalValue/ClassConfig 시트에 반영하지 않으면 다음 표 추출 때 되돌아간다.
This commit is contained in:
깃 관리자 2026-09-08 23:52:16 +09:00
parent 92f64fdbdd
commit a38e905246
4 changed files with 90 additions and 4 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -158,7 +158,9 @@ arr_PCSkillCard[i].Set_CoolTime(arr_magicCoolTime[i], arr_magicMaxCoolTime[i], i
## 6. 롤백
- **반영 전(현재)**: 새 파일 2개(`_WL813n_SkillList.json` · 본 문서)만 존재. `git -C E:\NerdNavis\WL_wt\data revert <커밋>` 또는 두 파일 삭제로 끝. 게임 영향 0.
> 🔻 **§8(2단계 적용) 이후 상태가 현행이다.** 아래 "반영 전" 항목은 1단계 시점 기록으로 남겨 둔다.
- **반영 전(1단계 시점)**: 새 파일 2개(`_WL813n_SkillList.json` · 본 문서)만 존재. `git -C E:\NerdNavis\WL_wt\data revert <커밋>` 또는 두 파일 삭제로 끝. 게임 영향 0.
- **반영 후(xlsm 편집 뒤)**: 되돌릴 값은 **`f_CoolTime = 5` · `n_MP = 5`**(16행 전부 동일하므로 일괄 복구 가능) + `GlobalValue.MP = 30` · `MP_REGEN = 3` · `ClassConfig.n_DefaultMP = 30`(12행). xlsm 은 git 이력에서 이전 리비전을 꺼내고 Export 를 재생성하는 것이 가장 안전하다.
- 813c 패드가 이미 붙은 뒤라면 데이터만 되돌려도 패드는 그대로 동작한다(패드는 슬롯 값을 읽기만 한다).
@ -171,3 +173,87 @@ arr_PCSkillCard[i].Set_CoolTime(arr_magicCoolTime[i], arr_magicMaxCoolTime[i], i
3. 이펙트 프리팹의 재생 길이·파티클 수·동시 상한(fps 저하 ≤3) — 811i/811b 영역.
4. `Equip.Skill[Preset][slot]` 기본 장착값이 어디서 초기화되는지(서버 데이터) — 813c 와 함께 확인 필요.
5. `casting` / `casting2` 상태의 **전이 조건**(`skill4` 등 다른 상태와의 우선순위) — 컨트롤러의 상태 존재만 grep 으로 확인했고 전이 그래프는 확인 못 함.
---
## 8. 2단계 적용 내역 (실테이블 반영 · Lead 결정 #813 일괄 위임)
> ⚠ **xlsm 동기화 필요.** 아래 45셀은 **Export JSON 에 직접** 넣은 값이다. SOT 는 `Assets/ResWork/Table/butler.xlsm` 이므로,
> xlsm 의 `SkillList` · `GlobalValue` · `ClassConfig` 시트에 같은 값을 넣지 않으면 **다음 표 추출 때 전부 되돌아간다.**
> §4 의 적용 절차 2번(xlsm 편집)이 아직 남아 있는 상태다.
### 8-1. 변경 파일 3개 (전수)
| 파일 | HEAD bytes → 현행 | 행 수 | 필드 수 | 키 순서 | BOM | 변경 셀 |
|---|---|---|---|---|---|---|
| `Assets/ResWork/Table/Export/SkillList.json` | 123,125 → **123,149** | 130 (불변) | 35 (불변) | 불변 | 유지 | **39** |
| `Assets/ResWork/Table/Export/GlobalValue.json` | 5,053 → **5,054** | 75 (불변) | 3 (불변) | 불변 | 유지 | **2** |
| `Assets/ResWork/Table/Export/ClassConfig.json` | 7,743 → **7,747** | 12 (불변) | 24 (불변) | 불변 | 유지 | **4** |
- 바이트 증가분(+24 / +1 / +4)은 **전부 값 자릿수 증가분**과 정확히 일치(구조 변경 0).
- 행 추가·삭제 **0** · 필드 추가·삭제 **0** · 전 값 `str` 타입 유지 · 단일 라인(개행 0) 유지.
- 코드 변경 **0** · 프리팹/씬/에셋 변경 **0** · 유니티 에디터 미사용.
### 8-2. diff 표 (구값 → 신값 · 45셀)
**① `SkillList.json` 프리셋 16행 × 2필드 = 32셀** (§1 표대로 · 다른 33필드 무변경)
| SkillID | 클래스/슬롯 | `f_CoolTime` | `n_MP` |
|---|---|---|---|
| 703101 / 703102 / 703103 / 702006 | 10101 · 1~4 | 5→**6** / 5→**8** / 5→**12** / 5→**20** | 5→**10** / 5→**15** / 5→**25** / 5→**40** |
| 703106 / 703105 / 703104 / 702009 | 10102 · 1~4 | 5→**6** / 5→**8** / 5→**12** / 5→**20** | 5→**10** / 5→**15** / 5→**25** / 5→**40** |
| 703502 / 703503 / 703501 / 702005 | 10501 · 1~4 | 5→**6** / 5→**8** / 5→**12** / 5→**20** | 5→**10** / 5→**15** / 5→**25** / 5→**40** |
| 703505 / 703506 / 703504 / 702012 | 10502 · 1~4 | 5→**6** / 5→**8** / 5→**12** / 5→**20** | 5→**10** / 5→**15** / 5→**25** / 5→**40** |
**② `SkillList.json` 고아/오류 열 정정 7건 = 7셀** (`n_SkillClassID` 만 · **행 삭제 0**)
| SkillID | 이름 | 구값 | 신값 | 근거(실측) |
|---|---|---|---|---|
| 700002 | 약자 멸시 | 10201 | **10102** | `ClassConfig(10102).n_ExtraSkill = 700002` |
| 700004 | 마나 절약 | 10203 | **10202** | `ClassConfig(10202).n_ExtraSkill = 700004` |
| 700008 | 약점 공격 | 10304 | **10401** | `ClassConfig(10401).n_ExtraSkill = 700008` |
| 700009 | 현상금 사냥꾼 | 10305 | **10402** | `ClassConfig(10402).n_ExtraSkill = 700009` |
| 700010 | 방어구 침투 | 10306 | **10501** | `ClassConfig(10501).n_ExtraSkill = 700010` |
| 700011 | 마법의 대가 | 10307 | **10502** | `ClassConfig(10502).n_ExtraSkill = 700011` |
| 700012 | 행복한 유대 | 10308 | **10601** | `ClassConfig(10601).n_ExtraSkill = 700012` |
→ 정정 근거는 **문서 인용이 아니라 `ClassConfig.n_ExtraSkill` 12행 역참조 실측**으로 재확인했다(7건 전부 일치).
**③ `GlobalValue.json` 2셀 · `ClassConfig.json` 4셀 = 6셀** (§1-2 선행 블로커 해소)
| 파일 | 행(키) | 필드 | 구값 → 신값 |
|---|---|---|---|
| GlobalValue | `MP` | `n_Value` | `"30"`**`"100"`** |
| GlobalValue | `MP_REGEN` | `n_Value` | `"3"`**`"5"`** |
| ClassConfig | 10101 / 10102 / 10501 / 10502 | `n_DefaultMP` | `"30"`**`"100"`** (4행) |
- `ClassConfig`**근접 4클래스만** 상향했다. 나머지 8행(10201·10202·10301~10303·10401·10402·10601)은 **`"30"` 그대로** — 이 4클래스만 813n 프리셋 대상이라 다른 클래스의 밸런스를 건드리지 않기 위함. **비근접 8클래스는 여전히 §1-2 의 MP 불일치 상태**이며, 그 클래스로 4슬롯을 확장할 때 함께 올려야 한다.
- 이로써 슬롯 4(40 MP)·슬롯 3(25 MP)가 `Actor.cs:733-741` MP 게이트를 통과한다(풀 100 · 초당 5 회복 = 슬롯 4 재충전 8 s < 20 s).
### 8-3. 검증 (python `utf-8-sig` · git)
| 항목 | 결과 | 방법 |
|---|---|---|
| 초안 델타 = `{f_CoolTime, n_MP}` 뿐 | **True** (16행 전수 · 델타 필드 합집합 2개) | 초안 vs 원본 35필드 전 셀 비교 |
| 재직렬화 왕복 무손실 | **3파일 전부 byte-identical** | `json.dumps(ensure_ascii=False, separators=(', ', ': '))` == 원문 (변경 전 사전 확인) |
| 행 수 · 필드 수 · 키 순서 · 전 값 str · BOM | **전부 불변** | `[list(r.keys()) for r in data]` 리스트 동일성 + `isinstance(v, str)` 전수 |
| 변경 셀 수 | **39 / 2 / 4 = 45** (의도치와 정확히 일치) | `git show HEAD:<path>` vs 현행 파일 셀 단위 비교 |
| 변경 필드 종류 | SkillList 3종(`f_CoolTime`·`n_MP`·`n_SkillClassID`) · 그 외 32필드 무변경 | 동일 스크립트 |
| 변경 파일 범위 | `git status --porcelain` = **M 3건만** | 허용 3파일 + 본 문서 외 수정 0 |
| 컴파일 게이트 | **미실행(해당 없음)** | 코드 0 · `unity` 명령 0회 |
`git diff --stat` = `3 files changed, 3 insertions(+), 3 deletions(-)` (단일 라인 JSON 이라 파일당 1줄로 계상).
### 8-4. 롤백
- **가장 안전**: `git -C E:\NerdNavis\WL_wt\data revert <2단계 커밋>` — 3파일이 1단계 상태(`f_CoolTime="5"` · `n_MP="5"` · `MP="30"` · `MP_REGEN="3"` · `n_DefaultMP="30"`)로 정확히 복원된다. 1단계 산출물(초안 JSON · 본 문서)은 그대로 남는다.
- **부분 롤백**: 밸런스만 되돌리려면 `git checkout <1단계 커밋> -- Assets/ResWork/Table/Export/SkillList.json`(프리셋+고아정정 동시 원복) 또는 파일별로 선택.
- **xlsm 을 이미 편집한 뒤라면** Export 롤백만으로는 부족하다 — xlsm 도 git 이력의 이전 리비전으로 되돌리고 Export 를 재생성해야 한다(안 그러면 다음 추출 때 되살아난다).
- 813c 패드가 붙은 뒤에도 **데이터만 되돌리면 된다**(패드는 슬롯 값을 읽기만 함 · §5-①).
### 8-5. 남은 선행 조건 (2단계로 해소되지 않음)
1. **xlsm 동기화** — 위 45셀을 `butler.xlsm` 에 반영(§4-2). 미반영 시 다음 Export 에서 소실.
2. **서버 덮어쓰기 「미확인」**`GetServerTables.cs:19` 서버 열 목록에 `n_MP`·`f_CoolTime` 포함. 서버가 이 두 값을 내려주면 클라 테이블 값이 무시될 수 있다(§7-1 · 서버 담당 확인 필요).
3. **슬롯 장착**`Equip.Skill[Preset][slot]`(`ServerClass.cs:456`)은 여전히 서버 프리셋 소관. 본 적용은 "어느 스킬이 어떤 쿨/코스트를 갖는가"만 정했고 **장착 자체는 813c 와 함께** 처리해야 한다.
4. **Play 검증 미실시** — 쿨 링 6/8/12/20 s · MP 바 10/15/25/40 소모 · 슬롯 4 광역 명중 수는 에디터 없이 확인 불가(§5-② 판정 기준 참조).