Commit Graph

413 Commits

Author SHA1 Message Date
72750f3647 fix(deck): Envenom attackPoison을 광역 공격에도 적용 (Lua 누락)
Envenom(독 바르기: 공격이 막히지 않은 피해를 줄 때마다 중독 1)이
단일타겟(DealDamageToTarget)에는 적용됐지만 광역(DealDamageToAllMonsters)
에는 빠져 있어, Envenom+광역공격이 게임에선 아무 적도 중독 안 됐다
(JS 미러는 양쪽 적용 — Lua가 누락).

DealDamageToAllMonsters의 막히지 않은 피해(dmg>0) 분기에 단일타겟과
동일한 attackPoison 적용을 추가(적별 ApplyPoisonToMonster). JS 미러는
이미 올바라 무변경. 산출물 재생성 포함.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UUvHKjrt8jqLzDeCsRRGmj
2026-06-29 18:53:24 +09:00
1291c52346 fix(balance): 시뮬 enemyStrengthLoss를 음수 힘 허용으로 (Lua 동기화)
PiercingWail(귀를 찢는 비명: 모든 적 힘 -6)에서 Lua는 적 공격을
(value+str-loss, 0클램프)로 줄여 StS처럼 힘이 음수로 작동하는데,
JS 시뮬은 max(0, str-loss)로 힘을 0에서 클램프해 모든 적 str=0일 때
공격이 전혀 안 줄었다(게임 -6, 시뮬 -0). 기존 테스트는 str>=loss
구간만 봐서 못 잡음.

Lua가 정답(게임은 정상) — 시뮬만 수정. calcEnemyAttack의 max(0,...)
제거(음수 힘 허용, 최종 calcAttack이 0클램프) + EnemyActStep을 그
헬퍼로 통일(중복 제거). RED-GREEN 테스트로 loss>str 구간 검증. 86개.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UUvHKjrt8jqLzDeCsRRGmj
2026-06-29 18:50:22 +09:00
926733dbef fix(deck): firstCardDamageBonus 게이트 class→kind (영구 미발동 버그)
ChargedBlow(class=warrior, kind=Attack, firstCardDamageBonus=2)의 첫-카드
보너스가 Lua·JS 양쪽에서 `c.class == "Attack"`로 게이트돼 있었다. class는
warrior/bandit 등이라 절대 "Attack"이 아니어서 보너스가 영구 미발동(죽은 코드).
kind가 "Attack"이므로 `c.kind == "Attack"`로 수정(양쪽 미러).

RED-GREEN 회귀 테스트 추가: class=warrior·kind=Attack 카드의 첫 카드
보너스로 7뎀 → 1턴 처치(미수정 시 5뎀 2턴). 테스트 84→85.
산출물 재생성 포함.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UUvHKjrt8jqLzDeCsRRGmj
2026-06-29 18:21:08 +09:00
d7813f9912 fix(deck): drawDamage/drawPoison를 per-play→per-draw로 (카드 설명과 일치)
Speedster("카드를 뽑을 때마다 피해")·CorrosiveWave("뽑을 때마다 중독")의
효과가 Lua에서는 ResolveCardEffects 끝에서 카드를 '낼 때마다' 발동해
카드 설명·JS 미러(sim-balance draw())와 어긋났다.

per-play 블록을 ApplyDrawTrigger() 메서드로 추출하고 DrawCards에서
뽑은 카드마다 호출해 per-draw로 정렬(JS와 동일). JS 미러는 이미
per-draw라 무변경 — 양쪽 일치.

부수: CheckCombatEnd에 self.CombatOver 멱등 가드 추가. per-draw로
호출이 잦아져(턴시작 5드로 등) 전멸 시 보상/골드/유물이 중복
발동할 수 있던 잠재 버그를 차단(공격+drawDamage 카드에서도 위험했음).

밸런스 영향: Speedster(Power)가 매턴 시작 드로에도 발동해 강해짐 —
값 튜닝은 sim으로 후속 조정 가능. 산출물 재생성 포함.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UUvHKjrt8jqLzDeCsRRGmj
2026-06-29 18:17:01 +09:00
e6f351420b fix(deck): BindButtons 1회 바인드 가드로 2회차 런 핸들러 중복 차단
StartRun이 run마다 BindButtons를 호출하는데 앞 7개 핸들러만
disconnect 가드돼 있고 reward/skip/map/shop/monster/relic/potion/job
등 ~30개 ConnectEvent는 미가드라, 2회차+ 런에서 핸들러가 누적된다.
특히 PickReward는 RewardChoices·CombatOver를 클리어하지 않아 중복
핸들러로 두 번 불리면 같은 보상 카드가 RunDeck에 2번 추가된다.

BindLobbyButtons/BindSoulShopButtons와 동일하게 self.ButtonsBound
1회 가드를 추가(런 UI 엔티티는 영속이라 1회 바인드로 충분).
신규 prop ButtonsBound 선언. 산출물 재생성 포함.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UUvHKjrt8jqLzDeCsRRGmj
2026-06-29 18:02:49 +09:00
b4a4560678 Merge pull request 'fix: 버리기-뽑기 카드 미선언 prop 추가 (no such field 크래시)' (#95) from fix/discard-draw-props into main 2026-06-29 17:51:50 +09:00
1e0b91294a Merge pull request 'refactor: SlayDeckController 관심사별 모듈 분리 + 코드 규칙 3종' (#94) from refactor/cb-concern-modules into main 2026-06-29 17:39:18 +09:00
8f8f17bd8f fix(deck): 버리기-뽑기 카드의 미선언 prop 추가 (no such field 크래시)
`DiscardPostDraw`·`DiscardDrawPerPick`가 hand.mjs(BeginDiscardSelection·
AutoDiscardHand·FinishDiscardSelection·SelectDiscardSlot)에서 대입되는데
gen-slaydeck.mjs prop 목록에 선언되지 않아 런타임 "cannot set DiscardPostDraw,
no such field"로 BeginDiscardSelection이 중단됨. 그 직전 DiscardSelectRemaining/
Total이 이미 set되어 게임이 버리기-선택 모드에 갇혀, 이후 모든 카드(공중제비 포함)
클릭이 버리기 픽으로 처리됨("2장 버린다 표시 + 동작 없음").

근본 원인: 형제 prop DiscardPostShiv·DiscardShivPerPick는 선언됐으나
draw 변형 2개가 누락. 선언만 추가(병렬 패턴).

신규 가드 tools/verify/cbprops.mjs: cb의 `self.X =` 대입 ↔ 선언 prop 대조,
미선언 = no such field 후보 검출. 수정 전 2개 누락→후 0.
검증: cbprops 0·cbgap GAP 0·테스트 93/93. 산출물(codeblock) 재생성 포함.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-27 02:44:06 +09:00
478fd1e5f0 docs(rules): PR 머지 후 브랜치 삭제·변수명·관심사 모듈화 규칙 추가
RULES.md 규칙 3종:
- §1: codeblock 메서드를 관심사별 모듈로(화면전환=screens·NPC=npc·
  포지션=navigation/layout). 17→20종. 새 메서드는 알맞은 모듈에.
- §4: PR 머지 후 머지된 feature/docs 브랜치 로컬·원격 삭제
  (merge-base --is-ancestor로 확인, 미머지·codex/* 보존).
- §8 신규: cb Lua 지역변수는 의미명(e→entity 등), 반복 인덱스만 단일문자 허용.

설계 문서 docs/superpowers/specs/2026-06-26-cb-concern-modules-design.md 추가.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 18:40:53 +09:00
0c1dfd3162 refactor(cb): 분리 모듈 단일문자 지역변수 의미명으로 개명
손댄 모듈(screens·navigation·layout)의 단일문자 Lua 지역변수를
의미가 드러나는 이름으로 변경(규칙 시연):
- ActivateUIGroups: grp/n/g → enableGroup/name/group
- RenderSoulLabel: s → soulPoints
- BindLobbyButtons: e/fn → entity/handler
- GoLobbyMap: lp/go → localPlayer/tryTeleport
- TeleportToActMap: lp → localPlayer
- PositionMonsterSlot: m/tr/wp/e → monster/transform/worldPos/slotEntity

검증: cbset = 위 6개 메서드만 본문 변경(추가/삭제 0), cbgap GAP 0, 테스트 93/93.
산출물 재생성(SlayDeckController.codeblock) 포함.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 18:39:39 +09:00
8d2e320d60 refactor(cb): 컨트롤러 횡단 관심사 모듈 분리 (이동·본문 무변경)
화면 전환·NPC·포지션 관심사를 state.mjs/render.mjs/runend.mjs에서
전용 모듈로 분리. 런타임은 단일 SlayDeckController codeblock 유지.

- state.mjs → screens.mjs 개명 (화면 라우팅·버튼 바인딩)
- npc.mjs 신규: OnLobbyNpcInteract
- navigation.mjs 신규: GoLobbyMap·TeleportToActMap (월드 텔레포트)
- layout.mjs 신규: PositionMonsterSlot (UI 슬롯 배치)
- gen-slaydeck.mjs import·spread 갱신

검증: tools/verify/cbset.mjs (순서 무관 집합 비교) = 189/189 무손실,
본문/exec/params 변경 0. cbgap GAP 0, 테스트 93/93.
산출물 재생성(SlayDeckController.codeblock) 포함 — 메서드 순서만 바뀜.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 18:35:51 +09:00
7b5e79bcf2 Merge pull request 'Add Excel roundtrip for cards data' (#93) from codex/cards-excel-json into main
Reviewed-on: #93
2026-06-24 21:55:35 +09:00
39356e5038 Add cards Excel roundtrip tools 2026-06-24 21:52:24 +09:00
4878e5d8cc Merge pull request 'fix: 교활 카드 초기 필드 선언 추가' (#92) from codex/fix-skill-sly-fields into main
Reviewed-on: #92
2026-06-23 23:30:40 +09:00
5f047ae41b Revert "fix: 전투 데미지 팝업 순서 복구"
This reverts commit d83a377865.
2026-06-23 22:55:42 +09:00
d83a377865 fix: 전투 데미지 팝업 순서 복구 2026-06-23 22:00:20 +09:00
8292e26726 fix: 보상 스크린 상태 추가 2026-06-23 21:56:33 +09:00
07ae56909a fix: 쉬브 첫 피해 보너스 상태 추가 2026-06-23 21:47:49 +09:00
f33018194f fix: 교활 카드 초기 필드 추가 2026-06-23 21:40:17 +09:00
a682baa5dc Merge pull request 'fix: 스킬 반복 필드 중복 정리' (#91) from codex/fix-skill-repeat-fields into main
Reviewed-on: #91
2026-06-23 21:38:10 +09:00
6d0ebde863 fix: 스킬 반복 필드 정리 2026-06-23 21:36:27 +09:00
4ce87bec5d fix: 전투 드로우 필드 선언 추가 2026-06-23 21:28:15 +09:00
0cf714dca6 fix: 카드 호버 nil 가드 추가 2026-06-23 21:24:34 +09:00
fd00ed12d9 Merge pull request 'docs(readme): 도적 카드 공용 효과 항목 추가 + 테스트 수 갱신' (#90) from docs/readme-bandit-effects into main 2026-06-23 11:24:50 +09:00
74a2106021 docs(readme): 도적 카드 공용 효과 항목 추가 + 테스트 수 갱신
구현 기능 표에 "도적 카드 공용 효과" 행 추가 — 카드명 하드코딩 대신
data/cards.json 공용 필드로 효과 표현(불가침·x-cost·드로우 비례·다음 스킬
반복·처치 보상·키워드 하이라이트·독 버스트 등), Lua+JS 미러 양쪽 구현,
필드 사전 docs/card-effect-fields.md. 밸런스 시뮬 단위테스트 현 84종 명시.
(codex PRs #82~#89로 main 반영된 내용 README 동기화)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 11:24:03 +09:00
a2044e20af Merge pull request 'feat: 도적 공용 카드 효과 구현' (#89) from codex/bandit-shared-effects into main
Reviewed-on: #89
2026-06-22 22:18:15 +09:00
a3d5174b34 feat: 도적 공용 효과 정리 2026-06-22 21:59:28 +09:00
4f9be00ff2 Merge pull request '도적 카드 공통 효과 훅 정리' (#88) from codex/bandit-shared-hooks-pr into main 2026-06-22 17:50:37 +09:00
24a79a309f Add shared bandit effect hooks 2026-06-22 16:08:05 +09:00
ba450f16b0 Merge codex/bandit-intangible-pr 2026-06-21 21:16:28 +09:00
278007f908 도적 다음 스킬 반복 효과 추가 2026-06-21 17:55:25 +09:00
16ebf304a5 사냥 처치 보상 추가 2026-06-21 15:43:47 +09:00
5b7f7bb69f 도적 불가침 기능 추가 2026-06-21 15:28:27 +09:00
34531b184f 도적 카드 공용 효과 추가 2026-06-19 21:59:49 +09:00
f6650a6c70 Merge pull request '도적 카드 공용 효과 추가' (#84) from codex/bandit-effect-pack into main 2026-06-19 03:06:03 +09:00
acf295d56c 도적 카드 공용 효과 추가 2026-06-19 02:57:11 +09:00
9278c47901 Merge pull request '카드 설명 키워드 하이라이트와 드로우 연동 공용 효과 추가' (#83) from codex/bandit-effect-pack into main 2026-06-19 01:53:02 +09:00
b2bf1bf4dd 카드 설명 키워드 하이라이트 추가 2026-06-19 01:51:36 +09:00
5da6e8f3aa Merge pull request '밴딧 카드 공용 효과 확장 및 문서 정리' (#82) from codex/bandit-effect-pack into main 2026-06-19 01:36:57 +09:00
71435a2c91 밴딧 카드 공용 효과 확장 2026-06-19 01:26:15 +09:00
f64e35668d Merge origin/main into main 2026-06-19 00:58:31 +09:00
ba1651e52c 밴딧 공용 효과와 문서 정리 2026-06-19 00:56:08 +09:00
f8414a9c33 Merge pull request 'docs(readme): 현황 동기화 — 적 18종·카드 121장·로비 직행·캐릭터 선택 UI 반영' (#80) from docs/sync-readme-memory into main 2026-06-18 10:04:39 +09:00
6344685052 docs(readme): 현황 동기화 — 적 18종·카드 121장·로비 직행·캐릭터 선택 UI 반영
지금까지 main 머지분(#76~#79)을 README에 반영하고 stale 수치/문구 정리:
- 적 12종 → 18종, 카드 122장 → 121장(도적 86), Silent 88 → 86
- 구현 PR 범위 #34~#57 → #34~#79
- 게임 시작 시 MainMenu 없이 로비 직행(MainMenu 추후 재지정) 명시
- 캐릭터 선택: 초상화·직업 설명·선택 테두리 강조 UI 반영
- 향후 계획: 로비 직행·캐릭터 선택 UI·디버그 치트·map01 로스터 [x],
  도적 카드 아이콘 완료 반영(TODO는 카드명 재서사·한글화로 정정)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 10:04:05 +09:00
b0f1a0840c Merge pull request 'feat(charselect): 캐릭터 선택 UI 배선 — 초상화·흰 테두리·직업 정보·Art 클리핑' (#79) from feature/charselect-wire into main 2026-06-18 09:57:03 +09:00
c703bd9b4d feat(charselect): 캐릭터 선택 UI 동작 배선 (초상화·흰 테두리·직업 정보·Art 클리핑)
사용자가 메이커에서 재구성한 CharacterSelectHud(SelectedClass/Eng/Status·
SelectedCharacterArt 신설, ThiefButton→BanditButton 개명)에 컨트롤러 연결.

RenderCharacterSelect:
- 버튼 클릭 시 해당 버튼 하위 Art의 ImageRUID를 SelectedCharacterArt로 복사(큰 그림)
- 선택 버튼 테두리 흰색(1,1,1,1)·비선택 디밍
- SelectedClass(한글)·SelectedClassEng(Warrior/Thief/Magician)·SelectedClassStatus
  ("직업군 · 모험가" + 설명) 갱신. 개행은 string.char(10) 연결(Lua 문자열 raw 개행 문법오류 회피)
- 각 Button에 MaskComponent(기본 Shape Rect) 런타임 부착 → Art를 Button 영역으로
  클리핑(Art 크기 불변, 넘치는 부분 숨김)
경로 교정: BindMenuButtons ThiefButton→BanditButton, StartNewGame Status→SelectedClassStatus.

UI(메이커 저작): CharacterSelectHud 재구성 + MageButton/BanditButton Art 위치 미세조정,
char-select 배경 에셋 01_blue_background_clean(sprite ac448e…) 추가.

산출물 재생성: SlayDeckController.codeblock + common.gamelogic.
검증: cbgap GAP 0, JS 미러 41/41, 인게임(초상화·테두리·텍스트·Art 클리핑) 확인.
(map01·타 UIGroup의 메이커 재직렬화 churn은 revert.)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 09:56:19 +09:00
96102dc41f Merge pull request 'feat(boot): 시작 시 MainMenu 대신 로비로 바로 진입 (MainMenu 일시 비활성)' (#78) from feature/boot-to-lobby into main 2026-06-18 02:14:55 +09:00
8702d5209e feat(boot): 시작 시 MainMenu 대신 로비로 바로 진입 (MainMenu 일시 비활성)
OnBeginPlay에서 UI 로드 후 self:ShowMainMenu() 대신 self:ShowLobby() 호출.
게임 시작하면 MainMenu를 거치지 않고 곧장 로비 맵(LobbyUIGroup)으로 진입한다.
ShowState("lobby")가 MainMenu를 숨기므로 메뉴는 표시되지 않음.

MainMenu는 한동안 비활성이지만 ShowMainMenu 메서드·BindMenuButtons·
DefaultGroup/MainMenu UI는 그대로 유지 — 추후 싱글/멀티/게임 종료 선택
메뉴가 필요할 때 OnBeginPlay를 self:ShowMainMenu()로 되돌리면 복구된다.

산출물 재생성: SlayDeckController.codeblock. 검증: cbgap GAP 0, JS 41/41.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 02:08:08 +09:00
74d4824a1c Merge pull request 'fix(debug): Ctrl+Shift+E 치트 체력 회복 추가 (체력+에너지 전체 회복)' (#77) from fix/debug-cheat-hp-restore into main 2026-06-18 01:58:51 +09:00
bdea6a8c28 fix(debug): Ctrl+Shift+E 치트에 체력 회복 추가 (체력+에너지 전체 회복)
원인: Ctrl+Shift+E의 CheatFillEnergy는 #75에서 energy-only로 만들어져
self.Energy만 채우고 self.PlayerHp는 전혀 건드리지 않았다(설계상 체력 미회복).
바인딩·발동은 정상(Ctrl+Shift+C 카드 picker와 동일 입력 메커니즘)이라
에너지는 차지만 체력은 회복된 적이 없었음 → "체력 회복 안됨".

수정: CheatFillEnergy에 self.PlayerHp = self.PlayerMaxHp 추가 + RenderCombat()
호출(HP 표시 갱신). 누르던 Ctrl+Shift+E 그대로 체력+에너지 전체 회복으로 확장.
토스트 "치트: 체력·에너지 회복", README 디버그 단축키 표기도 갱신.

산출물 재생성: SlayDeckController.codeblock. 검증: cbgap GAP 0, JS 41/41.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 01:56:30 +09:00