feat: UI 메이커-저작 전환 + 컨트롤러 재연결 + MainMenu 부트 #74

Merged
gahusb merged 18 commits from feature/maker-ui-edit into main 2026-06-17 22:39:39 +09:00
Owner

요약

메이커에서 단일 DefaultGroup UI를 7개 UIGroup으로 재편한 것에 맞춰, 생성기가 UI를 더 이상 저작하지 않게 하고 컨트롤러를 새 UIGroup 경로로 재연결했습니다. UI(.ui)는 일절 수정하지 않고 연결만 했습니다.

변경 (파트별)

  • 기반(메이커 저작): ui/{Deck,Run,Select,Lobby}UIGroup.ui 신규 + DefaultGroup/PopupGroup 수정 + 신규 에셋(배경 스프라이트·UIButton.model·MapleTree). 몬스터 슬롯 MonsterSlot{1..5}MonsterStatus{1..4}, TargetFrame 제거.
  • A. 생성기 UI 저작 폐기: hud/*.mjs(15)·gen-cardhand.mjs·upsertUitools/deck/legacy/로 이관(휴면). 오케스트레이터는 SlayDeckController.codeblock + common.gamelogic만 생성, .ui 미접근.
  • B. 경로 재연결: cb/*.mjs/ui/DefaultGroup/<Section> 리터럴을 섹션→UIGroup 매핑으로 일괄 remap(reconnect-ui-paths.mjs, 멱등). 몬스터 슬롯 리네임 + TargetFrame 참조 2곳 제거.
  • C. 부트 흐름: OnBeginPlay→MainMenu, MainMenu/NewGameButton→로비. 로비 run NPC(OnLobbyNpcInteract id=="run")→charselect는 기존 유지.
  • D. 몬스터 인카운터: MAX_MONSTERS=4·노드당 ≤3·map01 필터는 기존 로직이 충족 → 밸런스/맵 무변경(map 재생성 안 함).

검증 (코드)

  • tools/verify/cbgap.mjs: 재연결 후 GAP 0(cb 참조 경로 전부 새 .ui에 실재), 이동 섹션 DefaultGroup 잔여 0.
  • 재생성 후 git status -- ui/ 변경 0 (생성기 .ui 미접근 증명).
  • JS 미러 테스트: sim-balance 41/41 · rogue-map 9/9 pass.
  • 신규 검증 도구: tools/verify/{uimap,cbgap}.mjs.

메이커 플레이테스트 필요 (reload 후)

  • 시작 시 MainMenu → 시작(NewGameButton) → 로비맵+LobbyUIGroup
  • 로비 run NPC(NpcId=="run") → 캐릭터 선택창 → 런/전투
  • 전투에서 MonsterStatus 1~4 렌더(이름·HP·Intent·HP바·BlockBadge·Buffs·타겟마커), TargetFrame 부재 에러 없음
  • 화면 전환(로비↔런↔상점↔덱) UIGroup 누수 없음
  • 몬스터 슬롯 런타임 위치(PositionMonsterSlot) 정상
## 요약 메이커에서 단일 `DefaultGroup` UI를 **7개 UIGroup으로 재편**한 것에 맞춰, 생성기가 UI를 더 이상 저작하지 않게 하고 컨트롤러를 새 UIGroup 경로로 재연결했습니다. **UI(.ui)는 일절 수정하지 않고 연결만** 했습니다. ## 변경 (파트별) - **기반(메이커 저작)**: `ui/{Deck,Run,Select,Lobby}UIGroup.ui` 신규 + `DefaultGroup/PopupGroup` 수정 + 신규 에셋(배경 스프라이트·UIButton.model·MapleTree). 몬스터 슬롯 `MonsterSlot{1..5}` → `MonsterStatus{1..4}`, `TargetFrame` 제거. - **A. 생성기 UI 저작 폐기**: `hud/*.mjs`(15)·`gen-cardhand.mjs`·`upsertUi`를 `tools/deck/legacy/`로 이관(휴면). 오케스트레이터는 `SlayDeckController.codeblock` + `common.gamelogic`만 생성, **`.ui` 미접근**. - **B. 경로 재연결**: `cb/*.mjs`의 `/ui/DefaultGroup/<Section>` 리터럴을 섹션→UIGroup 매핑으로 일괄 remap(`reconnect-ui-paths.mjs`, 멱등). 몬스터 슬롯 리네임 + `TargetFrame` 참조 2곳 제거. - **C. 부트 흐름**: `OnBeginPlay`→MainMenu, `MainMenu/NewGameButton`→로비. 로비 run NPC(`OnLobbyNpcInteract` id=="run")→charselect는 기존 유지. - **D. 몬스터 인카운터**: `MAX_MONSTERS`=4·노드당 ≤3·map01 필터는 기존 로직이 충족 → 밸런스/맵 무변경(map 재생성 안 함). ## 검증 (코드) - `tools/verify/cbgap.mjs`: 재연결 후 **GAP 0**(cb 참조 경로 전부 새 `.ui`에 실재), 이동 섹션 DefaultGroup 잔여 0. - 재생성 후 `git status -- ui/` **변경 0** (생성기 `.ui` 미접근 증명). - JS 미러 테스트: sim-balance 41/41 · rogue-map 9/9 pass. - 신규 검증 도구: `tools/verify/{uimap,cbgap}.mjs`. ## 메이커 플레이테스트 필요 (reload 후) - [ ] 시작 시 MainMenu → 시작(NewGameButton) → 로비맵+LobbyUIGroup - [ ] 로비 run NPC(`NpcId=="run"`) → 캐릭터 선택창 → 런/전투 - [ ] 전투에서 MonsterStatus 1~4 렌더(이름·HP·Intent·HP바·BlockBadge·Buffs·타겟마커), TargetFrame 부재 에러 없음 - [ ] 화면 전환(로비↔런↔상점↔덱) UIGroup 누수 없음 - [ ] 몬스터 슬롯 런타임 위치(`PositionMonsterSlot`) 정상
gahusb added 10 commits 2026-06-17 03:01:11 +09:00
메이커에서 단일 DefaultGroup UI를 6개 UIGroup으로 재편:
- DefaultGroup(MainMenu+월드조작), SelectUIGroup(charselect/job),
  LobbyUIGroup(lobby/board/soulshop), RunUIGroup(combat/map/shop 등),
  DeckUIGroup(덱 도감) + PopupGroup/ToastGroup(기존)
- 신규 에셋: UIButton.model, 배경 스프라이트 4종, MapleTree.codeblock 등
- 몬스터 전투 슬롯 MonsterSlot{1..5} → MonsterStatus{1..4}, TargetFrame 제거

컨트롤러 재연결은 후속 커밋. (.gitignore: docs/superpowers·Mislocated 무시)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- uimap.mjs: .ui별 섹션/엔티티 카운트 매핑 (deny 우회, 카운트만)
- cbgap.mjs: cb 참조 경로↔새 UIGroup 대조, GAP 분류

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
UI를 메이커 저작으로 전환 — 생성기는 더 이상 .ui를 만들지 않는다.
hud/* 15종 + gen-cardhand.mjs를 tools/deck/legacy/로 이동(휴면).
(이 커밋 시점 gen-slaydeck import는 깨짐 — Task 3·4에서 정리)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- gen-slaydeck의 upsertUi 함수를 legacy/upsert-ui.mjs로 추출(롤백/참조용,
  직접 실행 시에만 동작 — import 무해)
- legacy/hud/* 이동으로 깨진 상대경로 ../lib/ → ../../lib/ 교정(15종)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- upsertUi(UI 저작) 함수·hud import 15종 제거 → legacy로 이전(Task 2·3)
- data/codeblock/ui-helpers import를 writeCodeblocks·patchCommon에 필요한
  최소(POTIONS / prop·codeblock·RUN_LENGTH / COMMON_FILE)로 슬림화
- 결과: 생성기가 .ui에 일절 접근 안 함(메이커 저작 UI 보존)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
cb/*.mjs의 /ui/DefaultGroup/<Section> 리터럴을 메이커 재편 UIGroup으로 일괄 remap:
- SelectUIGroup(charselect/job), LobbyUIGroup(lobby/board/soulshop),
  RunUIGroup(combat/map/shop/rest/treasure/reward/cardhand/deck),
  DeckUIGroup(덱 도감). MainMenu·월드조작은 DefaultGroup 잔류.
- 몬스터 슬롯 CombatHud/MonsterSlot → RunUIGroup/CombatHud/MonsterStatus
- 검증: cbgap GAP 0 (참조 경로 전부 새 .ui에 실재), 이동섹션 DefaultGroup 잔여 0

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
메이커 새 구조에서 MonsterStatus 슬롯의 TargetFrame이 제거됨 →
combat.mjs·render.mjs의 SetEntityEnabled(.../TargetFrame) 2줄 삭제.
TargetMarker·TargetMarker/Label·RenderTargetFrames(메서드)는 유지.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- OnBeginPlay: ShowLobby → ShowMainMenu (최초 화면을 메인메뉴로)
- MainMenu NewGameButton: ShowCharacterSelect → ShowLobby (시작→로비맵+LobbyUIGroup)
- 로비 run NPC(OnLobbyNpcInteract id=="run")→ShowCharacterSelect는 기존 유지

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
산출물 재생성: SlayDeckController.codeblock + common.gamelogic.
- 컨트롤러 UI 경로가 새 UIGroup(Select/Lobby/Run/Deck)으로 재연결됨
- 부트 흐름(MainMenu→로비) 반영
- 검증: .ui 무변경, DefaultGroup 이동섹션 0, JS 미러 테스트 50/50 pass

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- RULES §1: ui/*.ui = 메이커 저작(생성기 미생성), 생성기는 컨트롤러+common만,
  hud/*·gen-cardhand → legacy 휴면, 섹션→UIGroup 매핑·재연결 검증(cbgap)·부트 흐름
- README: UI 7 UIGroup 구조·생성기 범위·아키텍처 메모(2026-06-17)·향후 완료 항목

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
gahusb added 2 commits 2026-06-17 08:16:09 +09:00
메이커가 UI를 6개 UIGroup으로 분리하면서 발생한 2개 버그(시작이 MainMenu가
아니라 로비·NPC 상호작용 무반응) 근본 수정. 메이커 MCP 플레이테스트로 확정:
- 원인1: 새 UIGroup(Select/Lobby/Run/Deck)이 DefaultShow=false라 시작 시 비활성.
  → ActivateUIGroups(ClientOnly)로 그룹 :SetEnable(true) 활성화.
- 원인2: 컨트롤러의 중첩 self:SetEntityEnabled(.Enable 토글)가 비-DefaultGroup
  스코프를 잃음(ExecSpace 6 RPC 재디스패치). → SetEntityEnabled를 ClientOnly(2)로
  바꿔 인라인 실행 → 모든 UIGroup 해석. (.Text/RectSize/ImageRUID 등 다른 속성은
  중첩에서도 정상이라 SetText/SetHpBar는 무변경.)
- 원인3: OnBeginPlay가 UI 로드 전 실행 → DeckUIGroup 로드까지 폴링 후
  ActivateUIGroups + ShowMainMenu.

검증(플레이테스트): 부트→MainMenu·시작→로비+LobbyUIGroup·run NPC→charselect 전부 정상.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
gahusb added 2 commits 2026-06-17 08:37:38 +09:00
사용자 메이커 저작 버튼들이 ButtonComponent 없는 단순 스프라이트라 BindXxx가
ButtonComponent ~= nil 조건에서 스킵 → 어떤 버튼도 클릭 안 됨(시작 화면 포함).
바인드 조건 41곳의 `X.ButtonComponent ~= nil`을
`(X.ButtonComponent ~= nil or X:AddComponent("ButtonComponent") ~= nil)`로 바꿔
없으면 런타임 부착 후 통과(있으면 short-circuit). Entity:AddComponent(ControlOnly) 실측 확인.
.ui 무수정(연결만). 메뉴·로비·charselect·전투·상점·덱·맵 버튼 전부 일괄 적용.

검증(플레이테스트): 부트 후 NewGame/Start/Warrior 핸들러 바인딩 완료·버튼 ButtonComponent
부착 확인. 메뉴 상태서 타 UIGroup 활성 자식 0(레이캐스트 블로커 없음). 실제 클릭은 사용자 확인.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
gahusb added 2 commits 2026-06-17 22:15:07 +09:00
MonsterStatus 슬롯이 너무 오른쪽으로 어긋나던 문제. 원인: StartCombat이
KickCombatCamera(0.2s 지연 재confine)+플레이어 텔레포트 정착 전에
BuildMonsters→PositionMonsterSlot을 실행 → 전이중 카메라로 world→screen 변환이
잘못돼 슬롯이 화면 밖 우측에 배치, 카메라 정착 후 재배치 안 됨(고정).
메이커 MCP 플레이테스트로 확정(StartCombat 시점 ui x=978 / 정착 후 정답 442).

수정: StartCombat 끝에 전투 중 슬롯 지속 추종 타이머(0.15s) 추가 —
살아있는 몬스터마다 PositionMonsterSlot 재호출, CombatOver/몬스터0이면 자동 종료.
카메라 정착 타이밍과 무관하게 슬롯이 항상 몬스터 머리 위 추종.
검증: 정착 후 slotUiX == monScreenX-960 (몬스터 위 정확), 스크린샷 확인.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
gahusb added 2 commits 2026-06-17 22:33:55 +09:00
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
#73이 우리 분기(#72) 이후 main에 머지돼 충돌. 해결:
- 소스(boot·deckturn·deckview·gen-slaydeck·data/cards·legacy/hud/deckall): 자동머지로 통합
  (우리 부트폴링/버튼수정/슬롯추종 + #73 thief 아이콘/card-picker 공존).
- 산출물 ui/DefaultGroup.ui: 우리것(메이커 저작 6 UIGroup) 유지(#73의 옛 단일그룹 생성본 폐기).
- 산출물 SlayDeckController.codeblock: 머지된 소스로 재생성(양쪽 기능 모두 반영).
- card-picker reconcile: #73 새 코드의 옛 경로(/ui/DefaultGroup/DeckAllHud)를
  reconnect-ui-paths로 DeckUIGroup으로 remap + 120카드 ButtonComponent 런타임 부착 wrap.
- 검증: cbgap GAP 0, OpenDebugCardPicker/OnAllDeckCardButton 보존, .ui churn 0, JS 41/41.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
gahusb requested review from maple 2026-06-17 22:39:30 +09:00
gahusb merged commit b549abc3b3 into main 2026-06-17 22:39:39 +09:00
gahusb deleted branch feature/maker-ui-edit 2026-06-17 22:39:45 +09:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: gahusb/maplecontest#74