Allow replay of the recovered physical Hajr

Count one movement grant per accepted Hajr play after original paid Box recovery. Preserve physical card custody, Basic timing and fresh Advanced post-movement opportunities. Carry unused counts through Guild Cunning with counted declarations and signed final history while retaining legacy receipt compatibility.

Validation: frozen12-file102/102, types/lint/build and two original-action/rendered-table programmes; four minimal policies retain third moves in both modes. Real cache and normal purchases, paid shipment and Box2 recovery reuse the single original Hajr. Replay is an explicit source interpretation. Native Cunning replay has pure/related evidence; wider combinations, final assurance and deployed acceptance remain open. No saved-game, reset, restart or deployment operation.
This commit is contained in:
Quintine committed 2026-10-18 12:33:50 +11:00
1 parent 72e77d7f4d
commit b82441c834
17 files changed
+679 -65

No files matched your search

+9 -10
View File
@@ -88,7 +88,8 @@ void test('Guild special Karama stops its own second shipment without payment or
const f = nexusGuildCunningFixture({ advanced: true, homeworlds });
const karama = holdGuildCunningCard(f.g, f.owner, 'karama');
const hajr = holdGuildCunningCard(f.g, f.owner, 'hajr');
let g = originalGuildCunningTurn(f, false);
let g = originalGuildCunningTurn(f);
g = applyAction(g, f.owner, {type:'card',card:hajr.id});
g = nexusGuildCunningAllow(
applyAction(g, f.owner, nexusGuildCunningRequest(f, g)),
);
@@ -131,22 +132,20 @@ void test('Guild special Karama stops its own second shipment without payment or
);
const move: Action = {
type: 'move',
from: 'arrakeen:10',
territory: 'hagga_basin',
from: 'hagga_basin:12',
territory: 'plastic_basin',
sector: 12,
amount: 5,
};
rejected(g, f.owner, move);
rejected(g, f.owner, shipment);
g = applyAction(nexusGuildCunningReload(g), f.owner, {
type: 'card',
card: hajr.id,
});
assert.equal(viewGame(g,f.owner).nexusGuildCunning!.active!.movesLeft,1);
// Supplied Advanced timing played Hajr after the first actual movement;
// the stopped second shipment preserves that already earned unused move.
g = applyAction(g, f.owner, move);
rejected(g, f.owner, {
type: 'move',
from: 'hagga_basin:12',
territory: 'arsunt',
from: 'plastic_basin:12',
territory: 'hagga_basin',
sector: 12,
amount: 5,
});