chore: tests for desert triggers

This commit is contained in:
2026-04-17 18:07:49 +08:00
parent 0222b66bed
commit 4f5747d81d
2 changed files with 652 additions and 45 deletions
@@ -228,22 +228,21 @@ export function addEffectTriggers(triggers: Triggers) {
}
});
// ========== storm: give static card to player on attack ==========
triggers.onDamage.use(async (ctx, next) => {
// ========== storm: give static card to player when storm enemy attacks ==========
triggers.onEnemyIntent.use(async (ctx, next) => {
await next();
if (ctx.amount - (ctx.prevented ?? 0) <= 0) return;
const enemy = getCombatEntity(ctx.game.value, ctx.enemyId);
if (!enemy || !enemy.isAlive) return;
const entity = getCombatEntity(ctx.game.value, ctx.entityKey);
if (!entity || !entity.isAlive) return;
const storm = entity.effects.storm?.stacks ?? 0;
if (storm > 0 && ctx.entityKey !== "player") {
const storm = enemy.effects.storm?.stacks ?? 0;
if (storm > 0) {
for (let i = 0; i < storm; i++) {
await triggers.onEffectApplied.execute(ctx.game, {
effect: findEffect(ctx.game, "static"),
entityKey: "player",
stacks: 1,
sourceEntityKey: ctx.enemyId,
});
}
}
@@ -269,10 +268,11 @@ export function addEffectTriggers(triggers: Triggers) {
// ========== molt: enemy flees if molt >= maxHp ==========
triggers.onDamage.use(async (ctx, next) => {
await next();
const entity = getCombatEntity(ctx.game.value, ctx.entityKey);
if (!entity || !entity.isAlive) return;
if (!entity || !entity.isAlive) {
await next();
return;
}
const molt = entity.effects.molt?.stacks ?? 0;
if (molt >= entity.maxHp) {
@@ -285,69 +285,84 @@ export function addEffectTriggers(triggers: Triggers) {
draft.result = draft.enemies.every(en => !en.isAlive) ? "victory" : null;
});
if (ctx.game.value.result) throw ctx.game.value;
return;
}
await next();
});
// ========== discard: random discard at turn start ==========
triggers.onTurnStart.use(async (ctx, next) => {
await next();
if (ctx.entityKey !== "player") return;
if (ctx.entityKey !== "player") {
await next();
return;
}
const discard = ctx.game.value.player.effects.discard;
if (!discard || discard.stacks <= 0) return;
if (discard && discard.stacks > 0) {
const handIds = [...ctx.game.value.player.deck.regions.hand.childIds];
if (handIds.length > 0) {
const randomIndex = ctx.game.rng.nextInt(handIds.length);
const randomCardId = handIds[randomIndex];
await triggers.onCardDiscarded.execute(ctx.game, { cardId: randomCardId });
}
}
const handIds = [...ctx.game.value.player.deck.regions.hand.childIds];
if (handIds.length === 0) return;
const randomIndex = ctx.game.rng.nextInt(handIds.length);
const randomCardId = handIds[randomIndex];
await triggers.onCardDiscarded.execute(ctx.game, { cardId: randomCardId });
await next();
});
// ========== defendNext: gain block next turn ==========
triggers.onTurnStart.use(async (ctx, next) => {
await next();
if (ctx.entityKey !== "player") return;
if (ctx.entityKey !== "player") {
await next();
return;
}
const defendNext = ctx.game.value.player.effects.defendNext;
if (!defendNext || defendNext.stacks <= 0) return;
if (defendNext && defendNext.stacks > 0) {
await ctx.game.produceAsync(draft => {
addEntityEffect(draft.player, findEffect(ctx.game, "defend"), defendNext.stacks);
addEntityEffect(draft.player, defendNext.data, -defendNext.stacks);
});
}
await ctx.game.produceAsync(draft => {
addEntityEffect(draft.player, findEffect(ctx.game, "defend"), defendNext.stacks);
addEntityEffect(draft.player, defendNext.data, -defendNext.stacks);
});
await next();
});
// ========== energyNext: gain energy next turn ==========
triggers.onTurnStart.use(async (ctx, next) => {
await next();
if (ctx.entityKey !== "player") return;
if (ctx.entityKey !== "player") {
await next();
return;
}
const energyNext = ctx.game.value.player.effects.energyNext;
if (!energyNext || energyNext.stacks <= 0) return;
if (energyNext && energyNext.stacks > 0) {
await ctx.game.produceAsync(draft => {
draft.player.energy += energyNext.stacks;
addEntityEffect(draft.player, energyNext.data, -energyNext.stacks);
});
}
await ctx.game.produceAsync(draft => {
draft.player.energy += energyNext.stacks;
addEntityEffect(draft.player, energyNext.data, -energyNext.stacks);
});
await next();
});
// ========== drawNext: draw extra cards next turn ==========
triggers.onTurnStart.use(async (ctx, next) => {
await next();
if (ctx.entityKey !== "player") return;
if (ctx.entityKey !== "player") {
await next();
return;
}
const drawNext = ctx.game.value.player.effects.drawNext;
if (!drawNext || drawNext.stacks <= 0) return;
if (drawNext && drawNext.stacks > 0) {
await ctx.game.produceAsync(draft => {
addEntityEffect(draft.player, drawNext.data, -drawNext.stacks);
});
await triggers.onDraw.execute(ctx.game, { count: drawNext.stacks });
}
await ctx.game.produceAsync(draft => {
addEntityEffect(draft.player, drawNext.data, -drawNext.stacks);
});
await triggers.onDraw.execute(ctx.game, { count: drawNext.stacks });
await next();
});
// ========== aim: double damage, lose aim on damage ==========