BurningTimesAi/공유/대화로그/ReaperGirlIdle/2026-09-17.md

54 lines
6.8 KiB
Markdown

# ReaperGirlIdle 대화로그 — 2026-09-17
> 프로젝트 경로 `C:\BurningTimes\ReaperGirlIdle` (origin `bluecell2/ReaperGirlIdle`) · 선행 사례 = `공유/대화로그/ImmortalSword/2026-09-17.md` §4·§5
## 1. 프로젝트 세션 개시 + DataTables JSON → CSV → 엑셀 시트 추가 (PM 직접 집행)
### PD 원문 (2026-09-17 01:35)
> ① "이 세션은 우리 조직의 "ReaperGirlIdle" 프로젝트 세션이야. 프로젝트 경로는 "C:\BurningTimes\ReaperGirlIdle" 이고, 기존 "ImmortalSword" 프로젝트와 동일하게, "ReaperGirlIdle\Assets\DataTables\TableManager" 경로에 관리용 엑셀 테이블 "ReaperGirlIdle"를 만들어두었어. "ReaperGirlIdle\Assets\DataTables" 경로의 json 파일들을 csv로 변환한 후 "ReaperGirlIdle" 엑셀에 시트로 추가해줘."
### 실측
| # | 실측 | 근거 |
|---|------|------|
| 1 | 워크북 `Assets/DataTables/TableManager/ReaperGirlIdle.xlsm` = **`ImmortalSword.xlsm` 과 바이트 동일**(359,359B · SHA256 `ADB3C947…5560` 일치) → ImmortalSword §4·§5 결과물 그대로: 기본 8시트 + **ImmortalSword 데이터가 든 19시트**(시트명 = 본 프로젝트 JSON 19종과 동일) · VBA 구성요소 35(§5 패치본) | 해시 · openpyxl |
| 2 | 대상 JSON **19종** 전부 레코드 객체 배열 · 1,197행 · 15,327셀. ImmortalSword JSON 대비 **파일 동일 8종**(Cheat·Companion·LocalizeMission·Pass·ShopGem·ShopPackageReward·ShopPackage·ShopProduct) / **상이 11종** — 열 추가: CharacterTable `CharacterType` · CostumeTable `PurchaseType`·`IAPProductId` / 행 수 변화: Character 161→159 · LocalizeSkill 135→136 · Localize 182→197 · LocalizeText 185→215 / 나머지는 값 차이 | 비교 스크립트 |
| 3 | 데이터 특성: 열 내 타입 혼재 0 · null 0 · 15자리 초과 숫자 0 · `'` 시작 문자열 0 · 최장 셀 3,306자(PassTable 중첩) · 따옴표 포함 셀 276 · 줄바꿈 포함 셀 266 · 빈 문자열 19 | 분석 스크립트 |
| 4 | 데이터 19시트를 참조하는 요소 0(정의된 이름·타 시트 수식·연결 파트 XML 전수 검색) · 해당 VBA 문서 모듈(Sheet9~27) 코드 0줄 · VBA 에 ImmortalSword 고정 경로 없음(루트 = `ThisWorkbook.path` 기준 동적 계산, §5 설계) | XML 검색 · olevba |
| 5 | 워크북·`TableManager/` git 미추적(`??`) · Excel 실행 중 없음 · 파일 잠금 없음 | git · 프로세스 · 잠금 테스트 |
### 결정과 기각안 (C32)
**결정 1 — 기존 데이터 19시트를 ReaperGirlIdle 데이터로 교체(삭제 후 같은 이름으로 재생성)**: PD 문언 "json 파일들을 csv로 변환한 후 엑셀에 시트로 추가" + 실측 1(같은 이름 시트가 ImmortalSword 데이터로 이미 존재). 시트명 = 매크로 JSON 내보내기 파일명이므로 ImmortalSword 데이터가 남으면 기본 저장(JSON) 시 `Assets\DataTables` 게임 JSON 11종이 ImmortalSword 값으로 덮어써진다. 삭제분은 ImmortalSword JSON 파생물이며 `ImmortalSword.xlsm`·백업에 그대로 남아 정보 손실 0.
- **기각안 A — 기존 시트 유지 + 이름 변형 시트 추가**: 시트명 = 내보내기 파일명 규칙이 깨지고 ImmortalSword 데이터 잔존 위험이 그대로 남는다.
- **기각안 B — 기존 시트 셀만 지우고 재기입**: 열 너비·서식·오류 무시 플래그 등 잔여 상태를 남길 수 있어 검증 대상이 늘어난다. 삭제 후 재생성은 ImmortalSword §4 에서 검증된 생성 경로를 그대로 재사용한다.
**결정 2 — 시트 구성·서식·형 보존·CSV 형식 = ImmortalSword §4 결정 1~3 그대로**: 저장 주체 Excel COM(`AutomationSecurity=3` 매크로 강제 비활성 · 저장 없는 DryRun 선행) · 1행 헤더 = JSON 키 원문 · 클라 헤더 서식(`ShopGoods!A1` 복제, Accent6 미사용) · 텍스트 열 `@` 선지정 · 1행 틀 고정 · 열 너비 자동(텍스트 상한 60) · 숫자/문자열/논리/중첩(압축 JSON 문자열) 형 보존 · CSV = UTF-8 BOM·CRLF·전 필드 따옴표·RFC 4180 이스케이프.
**CSV 파일**: `C:\BurningTimes\ReaperGirlIdle\output\DataTables_csv\*.csv` 19개(480,666B) — ImmortalSword 와 같은 위치 규칙(`Assets` 밖).
### 집행
1. **백업(C6)**: `공유/개발팀_백업/ReaperGirlIdle/ReaperGirlIdle.xlsm.bak_20260917_0139.xlsm` (359,359B · SHA256 원본 일치 · `*.bak_*` gitignore = 이 PC 로컬 보존)
2. 변환: CSV 19 + 정규화 데이터 (ImmortalSword `prep_tables.py` 경로만 치환)
3. DryRun(저장 없음 · 착수 전 해시 일치 가드 · 기본/데이터 외 시트 존재 시 중단 가드): 19시트 불일치 0 · 원본 해시 불변
4. 본 실행 **01:41:23 저장** — 시트 27(기본 8 + 데이터 19 이름순, 순서 동일) · 359KB → 348KB · 활성 시트 MonthlyReward 복원 · Excel 잔존 0
### 검증
- **Excel 세션 내**(저장 전): 19시트 Value2 전수 불일치 0 · 숫자·논리 셀 `.Text`(매크로 내보내기 값) 4,393셀 불일치 0 · 255자 초과 텍스트 34셀 `.Text` 잘림 0
- **Excel 밖 독립 검증**(openpyxl + olevba, 백업 대비) — **PASS**:
- 기본 8시트 셀 값·수식 변경 0 · 병합·틀 고정·열 너비 동일
- 데이터 19시트 15,327셀 타입·값 불일치 0 · 범위 초과 셀 0 · 텍스트 셀 `@` 누락 0 · CSV 엄격 파싱·셀 불일치 0 · 헤더 = `ShopGoods!A1` 서식 · Accent6(서버) 헤더 0 · 틀 고정 A2
- 비시트 파트 유실 0 (`vbaProject.bin`·`connections.xml`·`customXml/item1.xml`·`ctrlProp1.xml`·`drawing1.xml`·`vmlDrawing1.vml`)
- VBA 표준·폼·통합 문서·기본 시트 모듈 16개 중 15개 코드 동일 · `UserForm` 은 `Attribute VB_Base` GUID 1줄만 상이(ImmortalSword §4 와 같은 현상) · 구 데이터 시트 문서 모듈 19개(코드 0줄) 제거·잔존 0 · 코드 내 데이터 시트 코드네임 참조 0
### 참고·발견 (PD 안내)
- 새 19시트는 **코드네임 미부여 상태**로 저장됨(매크로 비활성 상태에서 추가된 시트 — ImmortalSword §4 직후와 같은 상태). 매크로 활성으로 열면 Excel 이 문서 모듈을 자동 생성하며, 매크로는 시트를 이름·순회로 다루므로 영향 없음
- 따옴표 276셀·줄바꿈 266셀은 §5 패치 매크로(CSV `""` 이스케이프·JSON 재작성)가 처리하는 유형. 매크로 내보내기는 게임 JSON 덮어쓰기 경로라 본 지시 범위 밖으로 보고 실행하지 않음
- 기본 8시트(Info·ShopConfig 등)는 복사된 내용 그대로 — 지시 범위 밖이라 미변경
- 커밋: ImmortalSword §4 ④ "커밋은 내 지시 전까지 진행하지 말고 대기해." 해제 전 → BT 기록은 작업 트리에 둠 · 게임 레포 미커밋
- 세션 시작 hook 의 C40 세션 수명 경고(113MB·이미지 165장)는 오측정 — 본 세션 기록 실측 0.6MB. BT16 별건 `session_health.sh` 타 세션 오측정과 같은 건