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
This commit is contained in:
2026-06-29 18:21:08 +09:00
parent d7813f9912
commit 926733dbef
4 changed files with 16 additions and 3 deletions

View File

@@ -342,7 +342,7 @@ export function simulateCombat(data, rng, stats) {
if (c.damagePerDiscardedThisTurn) base += turnDiscardedCards * c.damagePerDiscardedThisTurn;
if (c.damagePerSkillInHand) base += countOtherHandSkills(id) * c.damagePerSkillInHand;
if (c.damagePerCardDrawnThisCombat) base += cardsDrawnThisCombat * c.damagePerCardDrawnThisCombat;
if (c.class === 'Attack' && turnCardsPlayedThisTurn === 0 && c.firstCardDamageBonus) base += c.firstCardDamageBonus;
if (c.kind === 'Attack' && turnCardsPlayedThisTurn === 0 && c.firstCardDamageBonus) base += c.firstCardDamageBonus;
if (c.class === 'shiv') {
if (powerFieldTotal('shivDamageBonus') > 0) base += powerFieldTotal('shivDamageBonus');
if (!shivFirstDamageBonusUsed && powerFieldTotal('firstShivDamageBonus') > 0) base += powerFieldTotal('firstShivDamageBonus');

View File

@@ -262,6 +262,19 @@ test('simulateCombat: 카드 취약 부여가 같은 카드 피해에 선적용
assert.equal(r.turns, 1);
});
test('simulateCombat: firstCardDamageBonus가 턴 첫 카드에 적용 (kind===Attack, Lua 동기화)', () => {
// ChargedBlow처럼 class=warrior·kind=Attack인 카드의 첫-카드 보너스.
// 게이트가 class==="Attack"이면 영구 false라 미발동(버그) → 5뎀/2턴.
// kind==="Attack"이면 5+2=7 → 1턴 처치.
const data = {
cards: { CB: { name: '차지블로우', cost: 3, kind: 'Attack', class: 'warrior', damage: 5, firstCardDamageBonus: 2 } },
starterDeck: ['CB', 'CB', 'CB', 'CB', 'CB'],
monsters: [{ name: '적', maxHp: 7, intents: [{ kind: 'Defend', value: 0 }] }],
};
const r = simulateCombat(data, mulberry32(1));
assert.equal(r.turns, 1);
});
test('simulateCombat: Power(매턴 힘) 누적', () => {
const data = {
cards: {