Connect the Basic Ecaz new-ally Duke loan

This commit is contained in:
Quintine committed 2026-10-08 08:30:38 +11:00
1 parent c28e24b5fa
commit 2d0f20b69c
11 files changed
+106 -25

No files matched your search

+4 -4
View File
@@ -118,16 +118,16 @@ void test('single-battle consumption releases custody while retaining alive or d
}
});
void test('turn end releases only Moritani tenure and preserves Ecaz holdings and unresolved allied loans', () => {
void test('turn end releases Moritani tenure and allied loans while preserving unused Ecaz holdings', () => {
for (const source of ['moritani', 'ally', 'ecaz'] as const) {
const state = acquireDuke(createDukeVidal(), 'holder', 4, source);
const earlier = expireDuke(state, 3);
assert.deepEqual(earlier, state);
for (const turn of [4, 5]) {
const expired = expireDuke(state, turn);
assert.equal(expired.controller, source === 'moritani' ? null : 'holder');
assert.equal(expired.acquiredTurn, source === 'moritani' ? null : 4);
assert.equal(expired.source, source === 'moritani' ? null : source);
assert.equal(expired.controller, source === 'ecaz' ? 'holder' : null);
assert.equal(expired.acquiredTurn, source === 'ecaz' ? 4 : null);
assert.equal(expired.source, source === 'ecaz' ? source : null);
assert.deepEqual(expired.leader, state.leader);
}
assert.equal(state.controller, 'holder');
+8 -2
View File
@@ -89,11 +89,17 @@ function propose(g: Game) {
return applyAction(g, 'ec', proposal(g));
}
function answer(g: Game, accept: boolean) {
return applyAction(json(g), 'in', {
let done = applyAction(json(g), 'in', {
type: 'decision',
event: g.pendingAmbassador!.event,
accept,
});
// These scenarios exercise alliance-only continuation, declining the optional loan.
if (done.pendingAmbassador?.stage === 'loan')
done = applyAction(done, 'ec', {
type: 'decision', event: done.pendingAmbassador.event, loan: false,
});
return done;
}
function reject(g: Game, id: string, action: Action) {
const before = structuredClone(g);
@@ -372,7 +378,7 @@ for (const level of DIFFICULTIES)
assert.equal(reply.accept, true);
const done = applyAction(offered, 'in', reply);
assert.equal(seat(done, 'ec').ally, 'in');
assert.equal(done.pendingAmbassador, null);
assert.equal(done.pendingAmbassador?.stage, 'loan');
});
void test('saved alliance replies reject missing events, corrupted token custody and changed entrant bindings before any answer', () => {