Files
Dune/tests/battle-territory-explosion-duke.test.ts

78 lines
3.8 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import assert from 'node:assert/strict';
import test from 'node:test';
import { handLimit } from '../game/engine';
import { DUKE_VIDAL_ID } from '../game/duke-vidal';
import { createMoritaniEcazDukeWinner, settleMoritaniEcazDukeWinner } from './fixture-moritani-ecaz-duke-winner';
import { pairedE3NexusInventory, pairedE3NexusPlayer, revealPairedE3Nexus, stepPairedE3Nexus } from './fixture-paired-e3-nexus-modules';
/** Controlled supplement on a genuine Advanced Ecaz/Moritani/Guild setup and
* earned Duke acquisition. Stage only the prior set-aside Duke history and
* physical Lasgun/Shield custody; battle choice, plans and votes are real. */
function source(setAside: boolean) {
const f = createMoritaniEcazDukeWinner();
const game = structuredClone(f.beforeBattle);
const duke = game.dukeVidal!;
assert.equal(duke.leader.id, DUKE_VIDAL_ID);
assert.equal(duke.leader.dead, false);
assert.equal(duke.controller, f.ecaz);
if (setAside) {
duke.controller = null;
duke.acquiredTurn = null;
duke.source = null;
duke.leader.usedAt = f.location;
}
const take = (kind: 'lasgun' | 'shield', actor: string) => {
const recipient = pairedE3NexusPlayer(game, actor);
const already = recipient.hand.find(card => card.kind === kind);
if (already) return already;
const pools = [game.deck, game.discard, ...game.players.map(player => player.hand)];
const pool = pools.find(cards => cards.some(card => card.kind === kind));
assert.ok(pool, `The original ${kind} remains in physical custody`);
const index = pool.findIndex(card => card.kind === kind);
const [card] = pool.splice(index, 1);
if (recipient.hand.length >= handLimit(recipient)) {
const replacement = recipient.hand.pop(); assert.ok(replacement);
pool.push(replacement);
}
recipient.hand.push(card);
return card;
};
const lasgun = take('lasgun', f.ecaz), shield = take('shield', f.moritani);
pairedE3NexusInventory(game);
const native = pairedE3NexusPlayer(game, f.ecaz).leaders.find(leader => !leader.dead && !leader.usedAt);
assert.ok(native);
const chosen = stepPairedE3Nexus(game, f.choice);
const plans = f.plans.map(step => step.actor === f.ecaz
? { ...step, action: { ...step.action, leader: setAside ? native.id : DUKE_VIDAL_ID, weapon: lasgun.id } }
: { ...step, action: { ...step.action, defense: shield.id } });
const ready = revealPairedE3Nexus(chosen, plans);
return { f, game, ready, priorDuke: structuredClone(duke), lasgun: lasgun.id, shield: shield.id };
}
void test('Advanced later explosion does not kill a surviving Duke already set beside the board', () => {
const s = source(true);
assert.equal(s.priorDuke.controller, null);
assert.equal(s.priorDuke.leader.usedAt, s.f.location);
const done = settleMoritaniEcazDukeWinner(s.ready);
assert.equal(done.lastBattleContext?.result, 'explosion');
assert.equal(done.dukeVidal!.leader.id, DUKE_VIDAL_ID);
assert.equal(done.dukeVidal!.leader.dead, false);
assert.equal(done.dukeVidal!.leader.deaths, s.priorDuke.leader.deaths);
assert.equal(done.dukeVidal!.controller, null);
assert.ok(done.players.every(player => player.leaders.every(leader => leader.id !== DUKE_VIDAL_ID)));
pairedE3NexusInventory(done);
});
void test('Advanced current-plan Duke still dies in a resolved Lasgun–Shield explosion', () => {
const s = source(false);
assert.equal(s.priorDuke.controller, s.f.ecaz);
const done = settleMoritaniEcazDukeWinner(s.ready);
assert.equal(done.lastBattleContext?.result, 'explosion');
assert.equal(done.dukeVidal!.leader.id, DUKE_VIDAL_ID);
assert.equal(done.dukeVidal!.leader.dead, true);
assert.equal(done.dukeVidal!.leader.deaths, s.priorDuke.leader.deaths + 1);
assert.equal(done.dukeVidal!.controller, null);
assert.ok(done.players.every(player => player.leaders.every(leader => leader.id !== DUKE_VIDAL_ID)));
pairedE3NexusInventory(done);
});