Support Emperor special Karama truth commitments
Verify and publish checkpoint container / container (push) Canceled after 0s

This commit is contained in:
Quintine committed 2026-10-29 18:12:20 +11:00
1 parent b448144c52
commit add8e1d51a
14 files changed
+345 -20

No files matched your search

+36 -1
View File
@@ -62,7 +62,8 @@ const power = (claim: BattlePowerClaim = { kind: 'voice', use: true }): Expressi
({ kind: 'action', action: { kind: 'battlePower', battle: 'battle:1', territory: 'carthag', claim } });
const windowSource = (effect: WindowCardEffect) => effect === 'karamaShipment'
? JSON.stringify(['karamaShipment', 1, 'recipient', 'original']) : effect === 'karamaHarkonnenSpecial'
? JSON.stringify(['karamaHarkonnenSpecial', 1, 'respondent']) : effect === 'karamaAuction' ? 'ordinary-auction:1:1' :
? JSON.stringify(['karamaHarkonnenSpecial', 1, 'respondent']) : effect === 'karamaEmperorSpecial'
? JSON.stringify(['karamaEmperorSpecial', 1, 'respondent']) : effect === 'karamaAuction' ? 'ordinary-auction:1:1' :
effect === 'amal' ? 'phase-opening:1:2' : effect === 'thumper' ? 'first-spice-reveal:1' :
effect === 'harvester' ? 'spice-blow:1' : 'storm:1';
const windowCard = (effect: WindowCardEffect = 'weather', source = windowSource(effect)): Expression =>
@@ -1898,3 +1899,37 @@ void test('Harkonnen special No and source binding retain exact responder, turn
assert.deepEqual(JSON.parse(JSON.stringify(old)), old);
assert.doesNotThrow(() => validateTurnActionPromises([old], seats));
});
void test('Emperor special Karama window records only the original owner and phase after the answer', () => {
const source = windowSource('karamaEmperorSpecial');
const question = windowed(group('and', windowCard('karamaEmperorSpecial'), pay()));
const signed = { kind: 'windowCardPlay', effect: 'karamaEmperorSpecial', source, answer: true };
assert.deepEqual(branches(question), [[signed, signedPay()]]);
const otherOwner = recordTurnActionWindowCardPlay([question], 'other', 1, 'karamaEmperorSpecial', source);
assert.equal(otherOwner[0], question);
const actual = recordTurnActionWindowCardPlay([question], 'respondent', 1, 'karamaEmperorSpecial', source);
assert.deepEqual(branches(actual[0]), [[signedPay()]]);
assert.equal(recordTurnActionPayment(actual, 'respondent', 1, payment())[0].fulfilled, true);
assert.equal(question.windowCards!.karamaEmperorSpecial!.played, false);
validateTurnActionPromises(actual, seats);
const closed = closeTurnActionWindowCardPlay([question], 'respondent', 1, 'karamaEmperorSpecial', source);
assert.equal(closed[0].windowCards!.karamaEmperorSpecial!.closed, true);
assert.deepEqual(branches(closed[0]), []);
});
void test('Emperor special No and source binding retain exact responder, turn and old receipts', () => {
const source = windowSource('karamaEmperorSpecial');
const negative = windowed(windowCard('karamaEmperorSpecial'), false);
assert.throws(() => recordTurnActionWindowCardPlay([negative], 'respondent', 1, 'karamaEmperorSpecial', source), TurnActionError);
const passed = closeTurnActionWindowCardPlay([negative], 'respondent', 1, 'karamaEmperorSpecial', source);
assert.equal(passed[0].fulfilled, true);
for (const bad of ['', 'storm:1', JSON.stringify(['karamaEmperorSpecial', 0, 'respondent']),
JSON.stringify(['karamaEmperorSpecial', 1, '']), JSON.stringify(['karamaEmperorSpecial', 1, 'respondent', 'extra'])])
assert.throws(() => parseTurnActionLeaf({ kind: 'windowCardPlay', effect: 'karamaEmperorSpecial', source: bad }), TurnActionError);
for (const bad of [JSON.stringify(['karamaEmperorSpecial', 2, 'respondent']),
JSON.stringify(['karamaEmperorSpecial', 1, 'other'])])
assert.throws(() => turnActionValue(windowed(windowCard('karamaEmperorSpecial', bad))), TurnActionError);
const old = windowed(windowCard('karamaAuction'));
assert.deepEqual(JSON.parse(JSON.stringify(old)), old);
assert.doesNotThrow(() => validateTurnActionPromises([old], seats));
});