도적 카드 공용 효과 추가

This commit is contained in:
2026-06-19 02:57:11 +09:00
parent b2bf1bf4dd
commit acf295d56c
9 changed files with 106 additions and 17 deletions

View File

@@ -94,7 +94,8 @@ export function chooseAction(hand, cards, energy, ctx = {}) {
const card = cards[x.id];
if (!card || card.unplayable || !canPlayCardNow(card, ctx)) return false;
let effectiveCost = card.cost || 0;
if (card.kind === 'Skill') {
if (ctx.handCostZeroThisTurn === true) effectiveCost = 0;
else if (card.kind === 'Skill') {
if (ctx.nextSkillCostZero === true) effectiveCost = 0;
else effectiveCost = Math.max(0, effectiveCost - (ctx.skillCostReductionThisTurn || 0));
}
@@ -105,7 +106,8 @@ export function chooseAction(hand, cards, energy, ctx = {}) {
const skills = entries.filter((x) => cards[x.id].kind === 'Skill');
const effectiveCost = (card) => {
let cost = card.cost || 0;
if (card.kind === 'Skill') {
if (ctx.handCostZeroThisTurn === true) cost = 0;
else if (card.kind === 'Skill') {
if (ctx.nextSkillCostZero === true) cost = 0;
else cost = Math.max(0, cost - (ctx.skillCostReductionThisTurn || 0));
}
@@ -146,6 +148,8 @@ export function simulateCombat(data, rng, stats) {
let pHp = PLAYER_HP, pBlock = 0;
let pStr = 0, pDex = 0, pThorns = 0, pWeak = 0, pVuln = 0;
let blockGainMultiplier = 1;
let handCostZeroThisTurn = false;
let drawDisabledThisTurn = false;
let nextSkillCostZero = false;
let skillCostReductionThisTurn = 0;
let nextTurnBlock = 0, nextTurnDraw = 0, nextTurnKeepBlock = false;
@@ -162,6 +166,7 @@ export function simulateCombat(data, rng, stats) {
function draw(n) {
const drawn = [];
if (drawDisabledThisTurn === true) return drawn;
for (let k = 0; k < n; k++) {
if (drawPile.length === 0) { drawPile = shuffle(discard, rng); discard = []; }
if (drawPile.length === 0) break;
@@ -270,6 +275,8 @@ export function simulateCombat(data, rng, stats) {
if (c.blockGainMultiplier && c.blockGainMultiplier > 0) blockGainMultiplier *= c.blockGainMultiplier;
if (c.nextSkillCostZero === true) nextSkillCostZero = true;
if (c.skillCostReductionThisTurn && c.skillCostReductionThisTurn > 0) skillCostReductionThisTurn += c.skillCostReductionThisTurn;
if (c.handCostZeroThisTurn === true) handCostZeroThisTurn = true;
if (c.drawDisabledThisTurn === true) drawDisabledThisTurn = true;
if (c.kind === 'Attack') {
if (alive.length && c.damage) {
const baseDamage = attackBaseForCard(id, c);
@@ -365,6 +372,8 @@ export function simulateCombat(data, rng, stats) {
turnAttackCardsPlayed = 0;
turnDiscardedCards = 0;
blockGainMultiplier = 1;
handCostZeroThisTurn = false;
drawDisabledThisTurn = false;
skillCostReductionThisTurn = 0;
// 파워 발동 — Lua StartPlayerTurn 동기화 (블록 리셋 후 strength/energy/block 파워)
if (nextTurnKeepBlock === true) nextTurnKeepBlock = false;
@@ -380,6 +389,16 @@ 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;
else if (pc.powerEffect === 'poisonPerTurn') {
for (const m of mob) if (m.alive) m.poison += pc.value;
} else if (pc.powerEffect === 'damagePerTurn') {
for (const m of mob) {
if (!m.alive) continue;
const r = applyDamage(m.hp, m.block, pc.value || 0);
m.hp = r.hp; m.block = r.block;
if (m.hp <= 0) m.alive = false;
}
}
if (pc.turnStartShiv) addCardsToHand('Shiv', pc.turnStartShiv);
if (pc.turnStartDraw) powerTurnDraw += pc.turnStartDraw;
if (pc.turnStartDiscard) powerTurnDiscard += pc.turnStartDiscard;
@@ -397,12 +416,12 @@ export function simulateCombat(data, rng, stats) {
while (true) {
const alive = aliveList();
if (alive.length === 0) break;
const idx = chooseAction(hand, cards, energy, { drawPileCount: drawPile.length, nextSkillCostZero, skillCostReductionThisTurn });
const idx = chooseAction(hand, cards, energy, { drawPileCount: drawPile.length, nextSkillCostZero, skillCostReductionThisTurn, handCostZeroThisTurn });
if (idx < 0) break;
const id = hand[idx], c = cards[id];
const skillFree = c.kind === 'Skill' && nextSkillCostZero === true;
const baseCost = c.cost || 0;
const cost = skillFree ? 0 : (c.kind === 'Skill' ? Math.max(0, baseCost - skillCostReductionThisTurn) : baseCost);
const cost = handCostZeroThisTurn === true ? 0 : (skillFree ? 0 : (c.kind === 'Skill' ? Math.max(0, baseCost - skillCostReductionThisTurn) : baseCost));
energy -= cost;
resolveCardEffects(id, c, cost);
if (c.kind === 'Attack') turnAttackCardsPlayed++;