Resolve Basic Ambassador child arrivals during Terror
This commit is contained in:
1 parent
a45d81aa34
commit
fbdf11c789
15 files changed
+817
-16
No files matched your search
@@ -0,0 +1,45 @@
|
||||
import assert from 'node:assert/strict';
|
||||
import { placeAmbassador } from '../game/ecaz-ambassadors';
|
||||
import { guildAmbassadorShipments } from '../game/guild-ambassador';
|
||||
import { placeTerror } from '../game/moritani-terror';
|
||||
import { createBasicNativeOverlapFixture, player, type First } from './fixture-basic-native-overlap';
|
||||
|
||||
/** Real public Basic setup and native Tleilaxu's real turn from the shared
|
||||
* fixture. Controlled supplements select Guild as one original Ambassador in
|
||||
* the five-token cohort and legally place it at the original destination.
|
||||
* For distinct destinations an additional original Terror token is placed by
|
||||
* a controlled custody-preserving edit (not a claim of natural Mentat history).
|
||||
* No purse, forces, phase, player order, pending decision or receipt is staged. */
|
||||
export function createGuildOverlapChildFixture(first: First, same: boolean) {
|
||||
const f = createBasicNativeOverlapFixture('tleilaxu', first, 'native');
|
||||
const game = structuredClone(f.beforeMarkers);
|
||||
const state = game.ecazAmbassadors!;
|
||||
const guild = state.tokens.find(token => token.effect === 'guild'); assert.ok(guild);
|
||||
if (guild.zone === 'pool') {
|
||||
const replaced = state.tokens.find(token => token.zone === 'supply' && token.effect !== 'ecaz');
|
||||
assert.ok(replaced);
|
||||
const index = state.cohort.indexOf(replaced.id); assert.ok(index >= 0);
|
||||
state.cohort[index] = guild.id; replaced.zone = 'pool'; guild.zone = 'supply';
|
||||
}
|
||||
assert.equal(guild.zone, 'supply');
|
||||
game.ecazAmbassadors = placeAmbassador(state, guild.id, {
|
||||
turn:game.turn, availableSpice:player(game,'ecaz').spice,
|
||||
destination:{id:f.destination,stronghold:true,inStorm:false,allowed:true},
|
||||
}).state;
|
||||
const choices = guildAmbassadorShipments(game, 'ecaz').destinations;
|
||||
const separate = choices.find(choice => choice.territory !== f.destination &&
|
||||
['arrakeen','carthag','sietch_tabr','tueks_sietch'].includes(choice.territory));
|
||||
const target = same ? choices.find(choice => choice.territory === f.destination && choice.sector === f.sector) : separate;
|
||||
assert.ok(target, 'The free shipment must have an available selected stronghold destination');
|
||||
const terror = game.moritaniTerror!;
|
||||
const original = terror.tokens.find(token => token.kind === (same ? 'robbery' : 'sabotage')); assert.ok(original);
|
||||
game.moritaniTerror = placeTerror(terror, original.id, f.destination, game.turn);
|
||||
let child = original;
|
||||
if (!same) {
|
||||
const second = game.moritaniTerror.tokens.find(token => token.kind === 'robbery'); assert.ok(second);
|
||||
second.status = 'placed'; second.location = target.territory; child = second;
|
||||
}
|
||||
return { ...f, game, ambassador:guild.id, originalTerror:original.id,
|
||||
childTerror:child.id, childDestination:target.territory, childSector:target.sector,
|
||||
staging:'Public native setup and actual Tleilaxu shipment. Original Guild token/cohort and Terror placements are controlled; the distinct child Terror is a physical token placed without staging a Mentat turn.' };
|
||||
}
|
||||
Reference in new issue
Block a user