fix(balance): Prepared 시뮬에 blockPerDamageDealtThisTurn 실제 방어 적용 + 설명 정확화
Lua는 Prepared(예비)에서 AddCardBlock으로 실제 방어를 부여하는데, JS 시뮬은 blockGained(통계 카운터)만 증가시키고 addBlock을 호출하지 않아 플레이어가 실제 방어를 못 받았다(시뮬이 방어를 과소집계). JS도 다른 블록 출처처럼 addBlock 경유로 변경(Lua 동기화). 또한 Prepared 데이터는 discard:1 + blockPerDamageDealtThisTurn뿐(draw 없음) 인데 설명이 "1장 뽑고 1장 버립니다"로 부정확해, 실제 동작(1장 버리고 이번 턴 피해만큼 방어)에 맞게 보강. RED-GREEN 테스트 추가. 88개. 산출물 재생성 포함. 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:
File diff suppressed because one or more lines are too long
@@ -537,7 +537,7 @@
|
|||||||
"kind": "Skill",
|
"kind": "Skill",
|
||||||
"class": "bandit",
|
"class": "bandit",
|
||||||
"rarity": "normal",
|
"rarity": "normal",
|
||||||
"desc": "카드를 1장 뽑습니다. 카드를 1장 버립니다.",
|
"desc": "카드를 1장 버리고, 이번 턴에 준 피해만큼 방어를 얻습니다.",
|
||||||
"blockPerDamageDealtThisTurn": 1,
|
"blockPerDamageDealtThisTurn": 1,
|
||||||
"discard": 1,
|
"discard": 1,
|
||||||
"image": "c1e19219745e44c39ae6ac2f77e347d9"
|
"image": "c1e19219745e44c39ae6ac2f77e347d9"
|
||||||
|
|||||||
@@ -565,7 +565,7 @@ export function simulateCombat(data, rng, stats) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (c.blockPerDamageDealtThisTurn && c.blockPerDamageDealtThisTurn > 0 && c.kind !== 'Power') {
|
if (c.blockPerDamageDealtThisTurn && c.blockPerDamageDealtThisTurn > 0 && c.kind !== 'Power') {
|
||||||
blockGained += Math.max(0, damageDealtThisTurn * c.blockPerDamageDealtThisTurn);
|
blockGained += addBlock(Math.max(0, damageDealtThisTurn * c.blockPerDamageDealtThisTurn));
|
||||||
}
|
}
|
||||||
if (recordStats && stats) stats[id] = bump(stats[id], costSpent, dmg, blockGained);
|
if (recordStats && stats) stats[id] = bump(stats[id], costSpent, dmg, blockGained);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -918,6 +918,21 @@ test('simulateCombat: firstShivDamageBonus는 턴당 첫 Shiv에만 적용 (Lua
|
|||||||
assert.equal(r.turns, 2);
|
assert.equal(r.turns, 2);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('simulateCombat: blockPerDamageDealtThisTurn이 실제 방어를 부여 (Lua 동기화)', () => {
|
||||||
|
// 매턴 Hit(5뎀) → Guard(준 피해만큼 방어 5) → 적 공격 5 상쇄.
|
||||||
|
// 수정(실제 방어): 무한 생존 → 무승부. 버그(방어 미부여): 매턴 5피해 → 사망.
|
||||||
|
const data = {
|
||||||
|
cards: {
|
||||||
|
Hit: { name: '타격', cost: 2, kind: 'Attack', damage: 5 },
|
||||||
|
Guard: { name: '대비', cost: 1, kind: 'Skill', blockPerDamageDealtThisTurn: 1 },
|
||||||
|
},
|
||||||
|
starterDeck: ['Hit', 'Guard'],
|
||||||
|
monsters: [{ name: '적', maxHp: 9999, intents: [{ kind: 'Attack', value: 5 }] }],
|
||||||
|
};
|
||||||
|
const r = simulateCombat(data, mulberry32(1));
|
||||||
|
assert.equal(r.draw, true);
|
||||||
|
});
|
||||||
|
|
||||||
test("simulateCombat: repeatOnKill repeats an attack until no kill occurs", () => {
|
test("simulateCombat: repeatOnKill repeats an attack until no kill occurs", () => {
|
||||||
const shared = {
|
const shared = {
|
||||||
cards: {
|
cards: {
|
||||||
|
|||||||
Reference in New Issue
Block a user