Files
maplecontest/docs/superpowers/specs/2026-06-08-card-combat-integration-design.md
2026-06-09 00:04:33 +09:00

4.0 KiB
Raw Permalink Blame History

카드 전투 통합 (TODO 항목 B) — 설계

작성: 2026-06-08 / 상태: 승인됨 / 근거: TODO.md 항목 B + 코드 직접 분석. 선행 작업: 항목 C(미커밋 노이즈 정리) 완료 — 작업 트리 클린.

문제

현재 SlayDeckController.codeblockPlayCard는 에너지만 차감하고 Toast(log)만 띄운다. 실제 전투 상태(적 HP/방어, 플레이어 HP/Block, 적 의도, 승패)가 없어 STS식 덱빌딩 루프가 닫히지 않는다. 필드 액션 몬스터(Monster.codeblock — HP·피격·리스폰)는 카드 시스템과 분리돼 있다.

범위

포함: 단일 적 카드 전투 루프(데미지·방어·적 의도·턴 진행·승패), 카드 수치화, DeckHud UI 노출. 제외(금지): 로그라이크 메타(E), 신규 카드 대량 추가, 전체 데이터 외부화(D — 본 작업은 인라인 수치화까지).

단일 소스 원칙

모든 변경은 tools/gen-slaydeck.mjs에서 생성한다. SlayDeckController.codeblock / ui/DefaultGroup.ui / Global/common.gamelogic을 직접 손으로 편집하지 않는다. 변경 = 생성기 수정 → node tools/gen-slaydeck.mjs 재실행.

수치는 임시 placeholder

플레이어 수치는 향후 캐릭터 특성별, 몬스터 수치는 몬스터별로 다르게 설정 예정. 본 작업의 값(플레이어 80 / 적 45 / 의도 10·6·방8)은 루프 검증용 임시값이며, D(데이터 외부화) 단계에서 캐릭터/몬스터별 데이터로 분리한다.

설계

1) 전투 상태 (codeblock 속성 추가)

  • 플레이어: PlayerHp, PlayerMaxHp(임시 80), PlayerBlock
  • 적: EnemyHp, EnemyMaxHp(임시 45), EnemyBlock, EnemyIntentIndex
  • CombatOver(승패 후 입력 잠금)
  • 적은 codeblock 내부 상태로 보유(필드 Monster.codeblock과 분리).

2) 카드 데이터 수치화 (desc 파싱 폐기)

id 이름 cost kind 효과
Strike 타격 1 Attack damage 6
Defend 방어 1 Skill block 5
Bash 강타 2 Attack damage 10

desc는 표시용으로만 유지. 효과는 damage/block 숫자 필드로 처리. 시작 덱: Strike×5, Defend×4, Bash×1 (10장).

3) 적 의도 — 결정적 사이클 (사용자 선택: A안)

  • 의도 사이클(3스텝 회전): [공격 10] → [공격 6] → [방어 8]
  • 매 플레이어 턴 시작 시 다음 의도를 미리 표시.
  • 결정적이라 F(밸런스 시뮬레이터)에서 동일 규칙 재현 가능.

4) 전투 규칙 (STS 관례)

  • 데미지는 방어도 먼저 차감 후 잔여만 HP에 적용.
  • 플레이어 Block은 플레이어 턴 시작 시 0 리셋, 적 Block은 적 턴 시작 시 리셋.
  • PlayCard(slot): kind=="Attack" → 적 HP 감소(적 Block 우선 차감); kind=="Skill" → 플레이어 Block 증가.
  • EndPlayerTurn → 적 턴: 적 Block 리셋 → 현재 의도 실행(공격이면 플레이어에 피해, 방어면 적 Block↑) → 의도 인덱스 전진 → 패배 체크 → 다음 플레이어 턴(Block/에너지 리셋·드로우) → 다음 의도 표시.
  • 승패: 적 HP≤0 → 승리 / 플레이어 HP≤0 → 패배. 승패 시 CombatOver=true로 입력 잠금 + 결과 텍스트 표시 + 보상 훅 자리(E용 주석).

5) UI — DeckHud 엔티티 추가 (생성기 생성)

  • 상단 적 패널: 적 이름 · HP 45/45 · 방어 0 · 의도: 공격 10
  • 좌측 플레이어 패널: HP 80/80 · 방어 0
  • 승패 결과 텍스트(중앙, 평소 숨김 → 승패 시 표시).

검증 (메이커 Play)

  • 타격 카드 → 적 HP 감소(적 Block 있으면 먼저 차감).
  • 방어 카드 → 플레이어 Block 증가.
  • 턴 종료 → 적이 표시된 의도대로 공격(플레이어 Block이 피해 흡수) 또는 방어.
  • 적 HP 0 → 승리 / 플레이어 HP 0 → 패배, 입력 잠금.
  • node tools/gen-slaydeck.mjs 2회 실행 결과 동일(결정적).
  • git status — 의도한 생성물만 변경.