Files
maplecontest/docs/superpowers/specs/2026-06-08-deck-controller-fixes-design.md
2026-06-08 01:01:42 +09:00

3.5 KiB

덱 컨트롤러 코드리뷰 수정 설계

  • 날짜: 2026-06-08
  • 브랜치: feature/deck-controller-fixes (main 기준)
  • 대상: tools/gen-slaydeck.mjs (단일 소스) → 재생성으로 ui/DefaultGroup.ui·RootDesk/MyDesk/SlayDeckController.codeblock·Global/common.gamelogic 갱신

배경

PR #6의 SlayDeckController 코드 리뷰에서 6건을 발견. 모든 산출물(카드 UI·DeckHud·codeblock·common 패치)은 tools/gen-slaydeck.mjs 한 곳에서 생성되므로, 이 생성기를 고치고 재실행하면 전부 반영된다.

수정 항목

  • ① [Important] EndTurn 핸들러 self 바인딩: buttonEntity:ConnectEvent(ButtonClickEvent, self.EndPlayerTurn)ConnectEvent(ButtonClickEvent, function() self:EndPlayerTurn() end). 메서드 직접 전달 시 self가 event로 잘못 바인딩되는 문제 제거. (타이머는 이미 클로저 사용 — 일관성)
  • ② [Important] Card5 이미지 충돌: 이미 gen-slaydeck.upsertUi가 Card1~5를 동일 텍스트 카드로 통일(ImageRUID='', 틴트, Cost/Name/Desc 추가)하므로 재생성으로 해결됨. 추가 코드 변경 없음 — 검증만.
  • ③ [기능] 카드 클릭 = 사용:
    • upsertUi의 카드 스타일 루프에서 Card1~5에 ButtonComponent 추가 + 카드 스프라이트 RaycastTarget=true.
    • codeblock에 PlayCard(slot) 메서드 추가: Hand[slot]의 카드 코스트를 CARDS에서 조회 → Energy >= costEnergy -= cost, 효과 표시(토스트/로그, 예: "타격 — 피해 6"), Hand에서 제거 후 DiscardPile에 삽입, RenderHand(false)+RenderPiles(). 부족하면 사용 불가(토스트/로그).
    • BindButtons에서 각 카드의 ButtonClickEventfunction() self:PlayCard(i) end 클로저로 연결(루프 변수 i는 Lua에서 반복마다 새 지역변수라 안전). 재연결 전 이전 핸들러 해제.
  • ④ [Minor] 카드 데이터 단일화: CARDS = { Strike={name,cost,desc,kind}, Defend={...}, Bash={...} } 테이블을 codeblock 상단에 두고, 시작덱 구성·ApplyCardVisual·PlayCard가 공유(if/elseif 중복 제거).
  • ⑤ [Minor] 매직넘버 상수화: 손패/드로우 수(5), 시작 에너지(3) 등 의미 있는 상수로.
  • ⑥ [Nit] pcall 제거: ApplyCardVisualpcall(function() return Color(...) end) → 직접 Color(...) 호출(틴트는 CARDS[id].kind별 색).

효과 표시(③)

적/데미지 시스템이 없으므로 카드 사용 효과는 토스트 또는 로그로만 표현(예: log("타격 — 피해 6") 또는 UIToast). 실제 데미지 적용은 범위 밖.

재생성·검증

  1. node --check tools/gen-slaydeck.mjsnode tools/gen-slaydeck.mjs
  2. 검증(데이터): codeblock에 PlayCard 존재, BindButtons/EndTurn이 클로저, CARDS 단일 테이블, ApplyCardVisual에 pcall 없음. DefaultGroup.ui의 Card1~5에 ButtonComponent + RaycastTarget true, Card5가 균일 텍스트 카드(ImageRUID 빈값·Cost/Name/Desc 존재).
  3. Maker Play: 카드 클릭 → 에너지 감소·카드가 버림더미로·재렌더, EndTurn 버튼 동작, 5장 균일.

stash 복구

이전 Maker 세션에서 stash해 둔 로컬 맵 변경(map02/05/06/07/10/11)을 이 브랜치에 복구해 포함. 단 복구분이 몬스터/타일셋 작업을 유지하는지(되돌리지 않는지) 무결성 검증 후 커밋. 손상/무의미하면 사용자에게 알리고 제외.

범위 밖 (YAGNI)

적 턴, 카드 효과의 실제 전투 적용, 신규 카드 종류.