BurningTimesAi/공유/대화로그/FirstRising/2026-10-01_세션인수인계.md

87 lines
9.0 KiB
Markdown
Raw Permalink Normal View History

# FR 아이템 드랍 · 아이템 · 능력치 시스템 — 세션 인수인계서 (2026-10-01 · BT47~BT48)
> C40 한도(기록 8MB · 이미지 30장) 도달로 작성. PD 지시 없이 세션 전환을 권하지 않는다 — 다음 세션이 이어 갈 때 읽는 문서다.
## 0. 다음 세션 첫 프롬프트 (그대로 붙여넣기)
```
FR(FirstRising) 작업을 이어서 진행한다.
인수인계서: 공유/대화로그/FirstRising/2026-10-01_세션인수인계.md 의 §0-1 · §1 · §2 를 먼저 읽고,
현황을 3줄로 보고한 뒤 내 지시를 기다려라. (로그 전문 읽기 금지, 필요한 절만 Grep)
고정 사항:
- 커밋 · push 는 PD 지시 시만(FR · 조직 레포 모두). 작업을 마치면 작업 트리에 두고 보고한다
- 재컴파일 · Play 조작 · 에디터 설정을 바꾸는 명령 앞에는 Play 여부를 단독 명령으로 먼저 확인한다.
PD Play 중에는 코드 수정 · Play 조작 · 무거운 스크립트 금지(읽기 전용 확인만)
- 검증 Play 는 끝나면 즉시 종료 · 임시로 바꾼 값(저장 파일 · GlobalValue · 훅)은 즉시 원복 · 백그라운드 작업을 남기지 않는다
- 오류 확인은 에디터 로그 기준(logscan.py). recompile_status 는 'completed' 글자만 찾는다
- 게임 원본 코드 수정 시 날짜 · 이유 한글 주석. 새 코드 · 고친 코드에는 선언 단위 한글 주석. 스크립트는 BT_Visual 노드에만
- 파일 삭제는 PD 지시 시만. 허위 · 추정 단정 금지. 감사 호출 생략, 무거운 에이전트 호출은 사전 승인, 세션 전환 권고 금지
- 보고는 한국어 · 간결 · 경어, 호칭 PD님. 승인이 필요하면 질문으로 끝낸다
```
## 0-1. 이번에 열 문서(필요한 절만)
| 하려는 일 | 열 문서 · 절 |
|---|---|
| 아이템 드랍 · 능력치 규칙(확정) | `공유/기획/FirstRising/시스템기획/2026-10-01_FR_아이템드랍시스템_초안_v0.md` §1 등급 · §2 드롭 · §3 부위 풀 · §4-5 신성 · §4-6 방어 공식 · §7 PD 확정 목록 |
| 구현 구조 · 원본 수정 지점 | 이 문서 §2 + 메모리 `project_fr_item_drop_bt48.md` |
| 검증 다시 돌리기 | `공유/기획/FirstRising/몬스터보스/tools/unity_eval/bt_evals_1001/` → `%TEMP%\bt_evals\` 로 복사 후 `run_bt48_verify.ps1`(시험 아이템이 저장 파일에 남으므로 끝나면 걷어낼 것 · §3) |
| 필드 이동 · 장비 동기화 · 최소화 모드 등 앞선 작업 | `2026-09-30_세션인수인계.md` §0-1 표 |
## 1. 현황 한눈에
| 구분 | 상태 |
|---|---|
| FR `bt/work` | **`dc45353d72` push 완료(BT47~48 · 10-01 22:59)** — 드롭률 10% · 예전 등급 옵션 제거 + 기존 장비 변환(ConvertLegacy) · 활 투사체 수 1(테이블 프리팹 4종 다시 굽기) 포함. 에디터가 덧건드린 재질 · 글자체 · `GlobalEntitySceneDependency.asset` 은 내 변경 아님 |
| 조직 레포 `main` | 이 인계서 · 대화로그 · 초안 · PPT · 검증 스크립트 사본 — 미커밋 |
| BT47 초안 | PD 결정 전부 반영(§7 확정 목록). 결정 대기 없음 |
| BT48 구현 | **완료 · push**. 보류 항목은 §4. 아이콘 생성 시험(Game Icon Institute LoRA)은 대화로그 10-01 끝 절 — 방향 결정 대기 |
| 저장 파일 | 시험 아이템 걷어내고 장착 원복(활 id 1). 백업 세션 scratchpad `save_backup_1001`(세션이 끝나면 사라져도 됨) |
| GlobalValue 자산 | dropChanceNormal 3(원복 확인 · dirty 아님) |
| 백그라운드 작업 · 훅 | 없음 |
## 2. 이번 세션이 만든 것(FR)
### 새 스크립트 (`Assets/BurningTimes/Visual/Scripts/`)
| 파일 | 하는 일 |
|---|---|
| `TVItemData.cs` | 부위(TVItemPart 8) · 보조 종류(TVSubEquipKind 8) · 옵션 정의(TVAffixDef) · 등급 정의(TVGradeDef) · 규칙 도우미(TVItemRules: 고정1 능력치 · 고정1 값 · 이름). `Protocol.BTItemAffix`(RawItem 에 붙는 옵션) |
| `TVGlobalValue.cs` | PD 조절용 자산 — 방어 공식 s · Rmax, 드롭 확률, 고정1 계수, 티어 배수, 등급 10 표, 습득 거리. `Resources/BT/GlobalValue.asset` |
| `TVItemDatabase.cs` | 랜덤 옵션 풀(43 정의 · 부위/보조 종류 비트) · 보조 장비 ↔ 무기 허용표 · 양손 무기 비트. `Resources/BT/ItemDatabase.asset` |
| `TVItemGenerator.cs` | 드롭 결정(RollDrop · RollGrade) · 인스턴스 생성(CreateAndGive: 원본 ItemTable 정의 빌림 → AddItem → bt 필드 · 옵션 추첨) · 시험 생성(GiveForTest) |
| `TVLootDrops.cs` | BT_Visual 구성 요소. 처치 감지 관리 시스템(TVLootDropSystem — DeadRecordBufferElement 를 게임보다 먼저 읽음 · killed/hit 이벤트) · 바닥 표시(기둥 + 한글 이름표 · 풀) · 습득 · 안내 · 구역 레벨 표 · SpawnTest/SimulateKill |
| `TVItemStats.cs` | 원본이 부르는 세 함수 — Accumulate(합산 배열) · Flat(정수 고정1 + 양손 보정 + 정수 옵션) · SamePart(장착 슬롯 비교). PercentFromEquipped · LegacyGradeIndex |
| `TVItemStatSync.cs` | BT_Visual 구성 요소. 새 능력치를 엔티티에 씀(DefenceComponent · HealthComponent bt 필드, 매 프레임 비교 후 다를 때만) · 처치 시 · 타격 당 회복 |
| `TVItemText.cs` | 이름(등급 색) · 고정1 · 옵션 목록 · 요약 문자열 |
### 원본 수정(전부 `2026-10-01 BurningTimes(BT48…)` 주석)
| 파일 | 수정 |
|---|---|
| `GameHub/JsonCommon.cs` | `eAbility` 끝에 32종 추가(BTAttackSpeed … BTDefencePercent). **중간 삽입 금지** |
| `GameHub/Protocol.cs` | `RawItem` 에 btIlvl · btGrade · btPart · btSubKind · btFixedChoice · btAffixes |
| `GameHub/NetPlayer.cs` | `EquipItem` 슬롯 비교를 `TVItemStats.SamePart` 로 |
| `Manager/PlayerManager.cs` | `GetTotalAbilities` 에 Accumulate · `CalcAttack/Defence/Health` 에 bt 아이템 고정1 경로 + 근접/원거리 공격력% · 방어력% |
| `Entity/CharacterComponents.cs` | `HealthComponent` 공격자 bt 필드 8 · `DefenceComponent` 피격자 bt 필드 10 |
| `Entity/TakeDamageComponent.cs` | `TakeDamageBufferElement` 에 btRanged · btHolyDamage · btPierceDamage · btFlatDamage |
| `Entity/Fx/FxComponentPlay.cs` | `HitEntity`: 근접/원거리/스킬 피해 곱 → 신성 · 관통 · 고정 피해 산출 → 두 AppendToBuffer 에 실음 |
| `Entity/DamageSystem.cs` | 피해 처리 9단계(회피 → 방어 v2 → 피해 감소 → 저항 → 관통 → 신성 → 막기 → 고정 피해 ± → 최소 1). bt 값 0 이면 원래 계산과 같음 |
| `UI/Lobby/ItemInfoPopUp.cs` · `ItemIconData.cs` | 드롭 장비의 이름 · 값 · 옵션 표시 · 인스턴스 등급 틀 |
| `GameAssets/LobbyPlayScene.prefab` | BT_Visual 에 TVLootDrops · TVItemStatSync 부착 |
## 3. 실측으로 알게 된 것(다시 조사하지 말 것)
- `GameHub.EquipItem` 은 같은 종류 요청이 끝나기 전에 또 보내면 `DUPLICATE_REQ` — 여러 장착은 2초 간격으로 순차.
- `LocalPlayer.txt`(LocalLow\ThunderRisingGames\Dead Archive) 는 `PlayerManager.SaveLocalPlayer()` 로 통째 저장. RawItem 새 필드는 Newtonsoft 가 그대로 저장 · 복원(2차 Play 에서 유지 확인).
- 원본 `DeadRecordBufferElement` 는 치명타격 예측 때 플레이어 엔티티에 남고 `PlayerEntityAbilitySyncSystem` 이 지운다 — 그 앞에서 읽으면 처치 감지가 된다. 시험 `SimulateKill` 도 killCount 에 섞이므로 실전 처치 수는 차이로 센다.
- 정보 창의 능력치 칸(m_ItemAbilityText) 글꼴은 한글이 없다(네모) → 값만 넣고 이름은 설명 칸에. 3D TMP 기본 글꼴도 한글이 없어 실행 중 UI 에서 '가'를 가진 글꼴을 찾아 쓴다.
- Play 중 `TVGlobalValue.Instance` 값을 바꾸면 자산 인스턴스가 바뀐다(dirty 아님) — 끝나면 반드시 원복.
- `eval_file` 로 프리팹을 열어 저장하는 부착 스크립트는 5초를 넘겨 400 이 뜨지만 실제로는 부착이 끝나 있다 — 가벼운 확인 스크립트로 재확인.
## 4. 미검증 · 보류 · 결정 대기(PD)
- **보류(스킬 시스템 수정 필요, 값은 저장 · 합산되나 적용 안 됨)**: 공격 속도(무기 공격 쿨타임과 스킬 쿨타임 분리 · Q20) · 기본 공격 사거리 · 투사체 수 · 범위 공격 데미지 · 모든 스킬 레벨(+99 외삽) · 상태이상 저항 · 흡혈 효과 증가량 · 경험치/골드 획득량 · 조건부 옵션 풀 섞기(7등급↑) · 양손 무기 슬롯 잠금 · 장착 때 보조 장비 ↔ 무기 허용 검사.
- **미검증**: 장비 창(ItemPageUI) 장착 슬롯에서 반지 · 보조 장비의 표시 자리 · 드롭 기둥 등급 색 · PC 빌드 · 다른 필드(열쇠별 구역 레벨은 기본 1).
- **PD 확인 요청**: ① 구역 레벨 표(TVLootDrops.areaLevels) 값 ② GlobalValue 자리표시 수치(드롭 확률 3/25/100 · 고정1 계수 · 티어 배수) ③ 반지 · 보조 장비 전용 아이콘 · 이름(지금은 목걸이 정의를 빌림).
## 5. 남은 이슈(기존)
- 09-30 인계서 §4 · §5 그대로(BT42 보스전 포함 여부 · BT44 PC 빌드 · BT45 첫 맵 굽기 시간 · BT46 작업 스케줄러 등록 여부).