feat: 메이플 전사 전직 카드와 연계 기믹 추가
This commit is contained in:
@@ -1391,3 +1391,102 @@ test("simulateCombat: shivAoe makes Shivs hit all enemies", () => {
|
||||
assert.equal(r.win, true);
|
||||
assert.equal(r.turns, 1);
|
||||
});
|
||||
|
||||
test("simulateCombat: comboGain and damagePerCombo scale repeated attacks", () => {
|
||||
const data = {
|
||||
cards: {
|
||||
Brandish: { name: "브랜디쉬", cost: 1, kind: "Attack", damage: 2, hits: 2, comboGain: 1, damagePerCombo: 1 },
|
||||
},
|
||||
starterDeck: ["Brandish"],
|
||||
monsters: [{ name: "Dummy", maxHp: 14, intents: [{ kind: "Attack", value: 0 }] }],
|
||||
};
|
||||
const stats = {};
|
||||
const r = simulateCombat(data, () => 0.999999, stats);
|
||||
assert.equal(r.win, true);
|
||||
assert.ok(stats.Brandish.damage > stats.Brandish.plays * 4);
|
||||
});
|
||||
|
||||
test("simulateCombat: comboMax power raises the combo cap", () => {
|
||||
const data = {
|
||||
cards: {
|
||||
ComboSynergy: { name: "콤보 시너지", cost: 0, kind: "Power", comboMax: 8, comboOnAttack: 2, attackDamagePerCombo: 1, innate: true },
|
||||
Hit: { name: "연속 베기", cost: 0, kind: "Attack", damage: 1 },
|
||||
},
|
||||
starterDeck: ["ComboSynergy", "Hit"],
|
||||
monsters: [{ name: "Dummy", maxHp: 40, intents: [{ kind: "Attack", value: 0 }] }],
|
||||
};
|
||||
const stats = {};
|
||||
const r = simulateCombat(data, () => 0.999999, stats);
|
||||
assert.equal(r.win, true);
|
||||
assert.ok(stats.Hit.damage > stats.Hit.plays);
|
||||
});
|
||||
|
||||
test("simulateCombat: healPerTurn power restores hp at turn start", () => {
|
||||
const data = {
|
||||
cards: {
|
||||
Recovery: { name: "셀프 리커버리", cost: 0, kind: "Power", powerEffect: "healPerTurn", value: 3 },
|
||||
Hit: { name: "마무리", cost: 1, kind: "Attack", damage: 1 },
|
||||
},
|
||||
starterDeck: ["Recovery", "Hit"],
|
||||
monsters: [{ name: "Dummy", maxHp: 2, intents: [{ kind: "Attack", value: 2 }] }],
|
||||
playerHp: 70,
|
||||
playerMaxHp: 80,
|
||||
};
|
||||
const r = simulateCombat(data, () => 0.999999);
|
||||
assert.equal(r.win, true);
|
||||
assert.ok(r.playerHpRemaining >= 69);
|
||||
});
|
||||
|
||||
test("simulateCombat: Holy Charge scales repeated Holy Force attacks", () => {
|
||||
const data = {
|
||||
cards: {
|
||||
ChargeStrike: { name: "차지 타격", cost: 1, kind: "Attack", damage: 2, holyChargeGain: 1, damagePerHolyCharge: 1 },
|
||||
},
|
||||
starterDeck: ["ChargeStrike"],
|
||||
monsters: [{ name: "Dummy", maxHp: 14, intents: [{ kind: "Attack", value: 0 }] }],
|
||||
};
|
||||
const stats = {};
|
||||
const r = simulateCombat(data, () => 0.999999, stats);
|
||||
assert.equal(r.win, true);
|
||||
assert.ok(stats.ChargeStrike.damage > stats.ChargeStrike.plays * 2);
|
||||
});
|
||||
|
||||
test("simulateCombat: damageTakenReduction lowers incoming HP damage", () => {
|
||||
const data = {
|
||||
cards: {
|
||||
Achilles: { name: "아킬레스", cost: 3, kind: "Power", damageTakenReduction: 0.25, innate: true },
|
||||
Wait1: { name: "대기", cost: 99, kind: "Status", unplayable: true, innate: true },
|
||||
Wait2: { name: "대기", cost: 99, kind: "Status", unplayable: true, innate: true },
|
||||
Wait3: { name: "대기", cost: 99, kind: "Status", unplayable: true, innate: true },
|
||||
Wait4: { name: "대기", cost: 99, kind: "Status", unplayable: true, innate: true },
|
||||
Finish: { name: "마무리", cost: 3, kind: "Power", cardPlayedDamage: 2 },
|
||||
},
|
||||
starterDeck: ["Finish", "Achilles", "Wait1", "Wait2", "Wait3", "Wait4"],
|
||||
monsters: [{ name: "Dummy", maxHp: 2, intents: [{ kind: "Attack", value: 10 }] }],
|
||||
};
|
||||
const r = simulateCombat(data, () => 0.999999);
|
||||
assert.equal(r.win, true);
|
||||
assert.equal(r.playerHpRemaining, 73);
|
||||
});
|
||||
|
||||
test("simulateCombat: blockOnDamaged protects against later attackers", () => {
|
||||
const data = {
|
||||
cards: {
|
||||
Armor: { name: "블레싱 아머", cost: 3, kind: "Power", blockOnDamaged: 6, strengthOnDamagedOnce: 2, innate: true },
|
||||
Wait1: { name: "대기", cost: 99, kind: "Status", unplayable: true, innate: true },
|
||||
Wait2: { name: "대기", cost: 99, kind: "Status", unplayable: true, innate: true },
|
||||
Wait3: { name: "대기", cost: 99, kind: "Status", unplayable: true, innate: true },
|
||||
Wait4: { name: "대기", cost: 99, kind: "Status", unplayable: true, innate: true },
|
||||
Finish1: { name: "마무리", cost: 3, kind: "Power", cardPlayedDamage: 1 },
|
||||
Finish2: { name: "마무리", cost: 3, kind: "Power", cardPlayedDamage: 1 },
|
||||
},
|
||||
starterDeck: ["Finish1", "Finish2", "Armor", "Wait1", "Wait2", "Wait3", "Wait4"],
|
||||
monsters: [
|
||||
{ name: "A", maxHp: 1, intents: [{ kind: "Attack", value: 5 }] },
|
||||
{ name: "B", maxHp: 1, intents: [{ kind: "Attack", value: 5 }] },
|
||||
],
|
||||
};
|
||||
const r = simulateCombat(data, () => 0.999999);
|
||||
assert.equal(r.win, true);
|
||||
assert.equal(r.playerHpRemaining, 70);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user