Prototype Semuta after Recruits in Basic play
Verify and publish checkpoint container / container (push) Successful in 10m20s
Verify and publish checkpoint container / container (push) Successful in 10m20s
This commit is contained in:
1 parent
0e9209531a
commit
1ba942138d
9 files changed
+311
-18
No files matched your search
@@ -27,9 +27,13 @@ for (const { label, options } of CONFIGURATIONS) {
|
||||
const fixture = createRecruitsModulesFixture(options);
|
||||
const ordinary = new Map(fixture.game.players.map(player =>
|
||||
[player.id, viewGame(fixture.game, player.id).revival.freeRemaining]));
|
||||
const original = structuredClone(fixture.game);
|
||||
const original = fixture.game.revivalOrder
|
||||
? advanceRecruitsModules(structuredClone(fixture.game), state => state.phase === 4 &&
|
||||
state.revivalOrder?.remaining[0] === fixture.owner && recruitsModulesClean(state))
|
||||
: structuredClone(fixture.game);
|
||||
const beforeRejected = structuredClone(original);
|
||||
assert.throws(() => applyAction(original, fixture.owner, fixture.revivalAction));
|
||||
assert.deepEqual(original, fixture.game, 'The old three-force allowance cannot consume these counters');
|
||||
assert.deepEqual(original, beforeRejected, 'The old three-force allowance cannot consume these counters');
|
||||
|
||||
const activated = applyAction(fixture.game, fixture.owner, fixture.playAction);
|
||||
assert.equal(activated.discard.filter(card => card.id === RECRUITS_CARD_ID).length, 1);
|
||||
@@ -40,8 +44,19 @@ for (const { label, options } of CONFIGURATIONS) {
|
||||
assert.equal(rate?.freeRate, Math.min(2 * ordinary.get(player.id)!, 7),
|
||||
'Every seat retains its own doubled current rate');
|
||||
}
|
||||
const before = recruitsModulesPlayer(activated, fixture.owner);
|
||||
const returned = applyAction(activated, fixture.owner, fixture.revivalAction);
|
||||
let returned = activated;
|
||||
let before: ReturnType<typeof recruitsModulesPlayer> | undefined;
|
||||
let afterOwner: ReturnType<typeof recruitsModulesPlayer> | undefined;
|
||||
let opponentReturned: typeof returned | undefined;
|
||||
for (const step of fixture.revivalSteps) {
|
||||
if (step.actor === fixture.owner && step.action.type === 'revive')
|
||||
before = structuredClone(recruitsModulesPlayer(returned, fixture.owner));
|
||||
returned = applyAction(returned, step.actor, step.action);
|
||||
if (step.actor === fixture.owner && step.action.type === 'revive')
|
||||
afterOwner = structuredClone(recruitsModulesPlayer(returned, fixture.owner));
|
||||
if (step.actor === fixture.opponent && step.action.type === 'revive') opponentReturned = structuredClone(returned);
|
||||
}
|
||||
assert.ok(before && afterOwner && opponentReturned);
|
||||
const owner = recruitsModulesPlayer(returned, fixture.owner);
|
||||
assert.equal(owner.revived, fixture.amount);
|
||||
assert.equal(owner.freeForcesRevived, fixture.doubled.freeRate);
|
||||
@@ -52,14 +67,13 @@ for (const { label, options } of CONFIGURATIONS) {
|
||||
const accrual = ownedTech(returned.techTokens!, fixture.owner).length;
|
||||
assert.equal(returned.techTokens!.axlotl.spice, accrual);
|
||||
|
||||
const second = applyAction(returned, fixture.opponent, fixture.secondRevivalAction);
|
||||
assert.equal(recruitsModulesPlayer(second, fixture.opponent).freeForcesRevived, 1);
|
||||
assert.equal(second.techTokens!.axlotl.spice, accrual,
|
||||
'A second actual free revival does not repeat income');
|
||||
assert.equal(recruitsModulesPlayer(second, fixture.owner).spice, owner.spice,
|
||||
assert.equal(recruitsModulesPlayer(opponentReturned, fixture.opponent).freeForcesRevived, 1);
|
||||
assert.equal(opponentReturned.techTokens!.axlotl.spice, accrual,
|
||||
'Both actual free revivals share one phase income');
|
||||
assert.equal(owner.spice, afterOwner.spice,
|
||||
'Neither free return collects the pending income');
|
||||
|
||||
const settled = advanceRecruitsModules(second, state => state.phase === 5 && recruitsModulesClean(state));
|
||||
const settled = advanceRecruitsModules(returned, state => state.phase === 5 && recruitsModulesClean(state));
|
||||
assert.equal(recruitsModulesPlayer(settled, fixture.owner).spice, owner.spice + accrual,
|
||||
'The phase boundary pays the original held income exactly once');
|
||||
assert.equal(settled.techTokens!.axlotl.spice, 0);
|
||||
|
||||
Reference in new issue
Block a user