- 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>
- 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>
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>
메이커에서 단일 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>
main의 5개 PR(#62 exhaust+tooltip, #66 dex/thorns, #67 캐릭터 덱버튼 제거,
#68 스크롤바, #69 표창카드)을 모듈화 브랜치에 병합.
충돌은 tools/deck/gen-slaydeck.mjs 한 파일 — main이 그 단일체를 콘텐츠 변경
(구조/emit/top-level 상수는 불변)한 반면 본 브랜치는 모듈로 재구조화.
해결: main 버전(theirs)을 취해 **콘텐츠 마커 기반으로 재모듈화**(라인인덱스 X,
이름 자동 파생) → lib/data·lib/ui-helpers + hud/*.mjs 16종 재생성.
검증(손실 0): 재모듈화 생성기 출력이 origin/main 산출물과 **바이트 동일**
(diffcheck: ui/DefaultGroup.ui·SlayDeckController.codeblock IDENTICAL).
common.gamelogic은 origin/main 그대로 채택(유일 차이는 main의 stale `.0` 정수표기
— origin/main 원본 생성기도 정수를 만듦을 확인). 미러 테스트 sim-balance·rogue-map 통과.
RULES.md는 §1(모듈구조)+§4/§7(main) 자동 병합.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
DeckHud/DeckInspect/DeckAll/Combat/Reward/Map/Shop/Rest/Treasure/JobChoice/
JobSelect/Lobby/Board/SoulShop를 각 build 함수로 분리, upsertUi는 emit 한 줄로.
전문 상수(PANEL_BG·TYPE_KO)는 해당 블록에 포함. 산출물 무변경(diffcheck IDENTICAL).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
메이커 로컬 임포트 .sprite 디스크립터. 이번 직업 선택 화면은 기본 3종
(warrior/mage/bandit)을 사용. 나머지(hero·palladin·darkknight·archmage×2·
cleric·nightlord·shadower·bowmaster·hunter·pirate·singung)는 향후
2차 전직 선택 이미지용으로 임포트해 둠.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- data/characters.json 신설(전사/법사/도적 초상화 RUID 단일 소스), 생성기 로드·검증
- CharacterSelectHud: 단색 박스 → 카드 전체 캐릭터 이미지(Art 풀블리드 258×318)
+ 하단 이름 배너(NameBanner), Portrait/Desc 제거
- RenderCharacterSelect: 선택 시 카드 테두리 금색(Art 6px 인셋 뒤로)
- BackButton 추가 + BindMenuButtons 바인딩 → ShowLobby(로비 복귀), prop CharBackHandler
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
CharacterSelectHud 단색 박스 → 캐릭터 이미지 카드(이름 하단 배너·선택 금색
테두리), 뒤로가기→로비. data/characters.json 단일 소스(메이커 임포트 RUID).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
증상: 전투맵 진입 시 몬스터마다 [LEA-3023] TypeMismatch(AnimationClip) +
[LEA-2007] AttemptToIndex(clip nil) 서버 로그 스팸(몬스터 수만큼 반복).
원인: MonsterAttack.OnBeginPlay(chasemonster 모델 상속·메이커 저작·생성기 없음)가
정적 Sprite인 SpriteRUID를 _ResourceService:LoadAnimationClipAndWait에 넘김 →
AnimationClip이 아니라 nil 반환(LEA-3023) → clip.Frames[1] 인덱싱(LEA-2007).
이 멜리 공격 로직은 카드 기반 턴제 전투에서 호출하는 코드가 전혀 없는 죽은 코드라
크래시 외 게임 영향은 없으나 로그를 더럽힘.
수정: LoadAnimationClipAndWait 호출 전 GetTypeAndWait가 ResourceType.AnimationClip이
아니면 early-return + clip nil 가드. 정적 스프라이트 몬스터는 공격범위 설정을 건너뜀
(원래 미사용), 애니메이션 클립 몬스터는 기존대로 동작.
주의: MonsterAttack은 생성기 없는 메이커 저작 codeblock이라 디스크 직접 패치.
적용하려면 메이커에서 로컬 워크스페이스 reload 필요.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>