표창 카드 손패 생성 구현

This commit is contained in:
2026-06-16 02:19:22 +09:00
parent b23dc3868e
commit 62187db5dd
5 changed files with 178 additions and 51 deletions

View File

@@ -131,6 +131,12 @@ export function simulateCombat(data, rng, stats) {
} else hand.push(card);
}
}
function addCardsToHand(id, n) {
for (let k = 0; k < n; k++) {
if (hand.length >= 10) discard.push(id);
else hand.push(id);
}
}
const aliveList = () => mob.filter((m) => m.alive);
function resolveCardEffects(id, c, costSpent, recordStats = true) {
const alive = aliveList();
@@ -166,7 +172,7 @@ export function simulateCombat(data, rng, stats) {
}
if (c.block) { blockGained = Math.max(0, c.block + pDex); pBlock += blockGained; }
} else if (c.kind === 'Power') {
if (c.powerEffect && recordStats) powers.push(id);
if (recordStats) powers.push(id);
} else {
if (c.block) { blockGained = Math.max(0, c.block + pDex); pBlock += blockGained; }
if ((c.weak || c.vuln || c.poison) && alive.length) {
@@ -182,6 +188,7 @@ export function simulateCombat(data, rng, stats) {
if (c.selfVuln) pVuln += c.selfVuln;
if (c.heal) pHp = Math.min(pHp + c.heal, PLAYER_HP);
if (c.draw) draw(c.draw);
if (c.addShiv && !c.discard && c.discardAll !== true) addCardsToHand('Shiv', c.addShiv);
if (recordStats && stats) stats[id] = bump(stats[id], costSpent, dmg, blockGained);
}
function triggerSly(id) {
@@ -196,12 +203,15 @@ export function simulateCombat(data, rng, stats) {
if (trigger) triggerSly(id);
}
function applyDiscardEffects(c) {
let discarded = 0;
if (c.discardAll) {
while (hand.length) discardHandCard(hand.length - 1, true);
while (hand.length) { discardHandCard(hand.length - 1, true); discarded++; }
} else if (c.discard) {
const n = Math.min(c.discard, hand.length);
for (let i = 0; i < n; i++) discardHandCard(hand.length - 1, true);
for (let i = 0; i < n; i++) { discardHandCard(hand.length - 1, true); discarded++; }
}
if (c.addShiv && (c.discard || c.discardAll === true)) addCardsToHand('Shiv', c.addShiv);
if (c.addShivPerDiscard === true) addCardsToHand('Shiv', discarded);
}
while (turns < MAX_TURNS) {
@@ -215,6 +225,7 @@ export function simulateCombat(data, rng, stats) {
if (pc.powerEffect === 'strengthPerTurn') pStr += pc.value;
else if (pc.powerEffect === 'energyPerTurn') energyBonus += pc.value;
else if (pc.powerEffect === 'blockPerTurn') pBlock += pc.value;
if (pc.turnStartShiv) addCardsToHand('Shiv', pc.turnStartShiv);
}
let energy = ENERGY + energyBonus; draw(HAND_SIZE);
while (true) {

View File

@@ -447,3 +447,17 @@ test("simulateCombat: thorns reflects unblocked attack damage", () => {
assert.equal(r.turns, 1);
assert.equal(r.playerHpRemaining, 79);
});
test("simulateCombat: addShiv creates shuriken cards in hand", () => {
const data = {
cards: {
MakeShiv: { name: "MakeShiv", cost: 0, kind: "Skill", addShiv: 2 },
Shiv: { name: "표창", cost: 0, kind: "Attack", damage: 4, exhaust: true },
},
starterDeck: ["MakeShiv"],
monsters: [{ name: "Dummy", maxHp: 8, intents: [{ kind: "Attack", value: 0 }] }],
};
const r = simulateCombat(data, () => 0.999999);
assert.equal(r.win, true);
assert.equal(r.turns, 1);
});