import { readFileSync, writeFileSync, readdirSync } from 'node:fs'; import { join } from 'node:path'; // 일회성·멱등 마이그레이션: cb/*.mjs의 UI 경로 리터럴을 메이커 재편 UIGroup으로 재연결. // 이미 이동된 경로는 매치 안 됨(멱등). MainMenu·Button_Attack/Jump·UIJoystick(=DefaultGroup 잔류)은 미변경. // 섹션→UIGroup 매핑은 tools/verify/uimap.mjs 탐색으로 검증된 실제 .ui 분포 기준. const MOVE = { CharacterSelectHud: 'SelectUIGroup', JobChoiceHud: 'SelectUIGroup', JobSelectHud: 'SelectUIGroup', LobbyHud: 'LobbyUIGroup', BoardHud: 'LobbyUIGroup', SoulShopHud: 'LobbyUIGroup', CombatHud: 'RunUIGroup', DeckHud: 'RunUIGroup', CardHand: 'RunUIGroup', MapHud: 'RunUIGroup', RewardHud: 'RunUIGroup', ShopHud: 'RunUIGroup', RestHud: 'RunUIGroup', TreasureHud: 'RunUIGroup', DeckInspectHud: 'DeckUIGroup', DeckAllHud: 'DeckUIGroup', }; const CB_DIR = 'tools/deck/cb'; let n = 0; for (const f of readdirSync(CB_DIR).filter((x) => x.endsWith('.mjs'))) { const p = join(CB_DIR, f); const before = readFileSync(p, 'utf8'); let s = before; // 1) 몬스터 슬롯: 그룹+이름 동시 (CombatHud 일반 remap보다 먼저). 슬롯 5→4는 MAX_MONSTERS(=4)가 이미 반영. s = s.split('/ui/DefaultGroup/CombatHud/MonsterSlot').join('/ui/RunUIGroup/CombatHud/MonsterStatus'); // 2) 섹션별 그룹 접두사 remap for (const [section, group] of Object.entries(MOVE)) { s = s.split(`/ui/DefaultGroup/${section}`).join(`/ui/${group}/${section}`); } if (s !== before) { writeFileSync(p, s, 'utf8'); n++; console.log(' remapped', f); } } console.log(`reconnect-ui-paths: ${n} files updated`);