From b82441c834ebf6c59a3b09a22a4e8821f4b7ccf8 Mon Sep 17 00:00:00 2001 From: Quintine <15965533+Quintine@users.noreply.github.com> Date: Sun, 18 Oct 2026 12:33:50 +1100 Subject: [PATCH] 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. --- README.md | 3 + components/game-table.tsx | 1 + docs/CURRENT_STATUS.md | 20 +++ docs/IMPLEMENTATION_STATUS.md | 20 +++ docs/NEXUS_GUILD_CUNNING_RUNTIME.md | 14 +- docs/RICHESE_ORNITHOPTER_ENGINE_AUDIT.md | 63 +++++++++ docs/RULE_DECISIONS.md | 2 +- game/card-availability.ts | 3 +- game/engine.ts | 53 ++++++-- game/nexus-guild-cunning.ts | 92 +++++++++---- game/ornithopter.ts | 7 +- game/reference.ts | 20 ++- tests/card-availability.test.ts | 4 +- tests/fixture-hajr-replay.ts | 153 ++++++++++++++++++++++ tests/hajr-replay-engine.test.ts | 144 ++++++++++++++++++++ tests/nexus-guild-cunning-counted.test.ts | 126 ++++++++++++++++++ tests/nexus-guild-cunning-engine.test.ts | 19 ++- 17 files changed, 679 insertions(+), 65 deletions(-) create mode 100644 tests/fixture-hajr-replay.ts create mode 100644 tests/hajr-replay-engine.test.ts create mode 100644 tests/nexus-guild-cunning-counted.test.ts diff --git a/README.md b/README.md index 9acaa6dc..c2ce8bb0 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,9 @@ Advanced Hajr is played immediately after a completed Force Movement and its required arrival decisions. Basic keeps its broader own-turn timing. The [Ornithopter combination](docs/RICHESE_ORNITHOPTER_ENGINE_AUDIT.md#hajr-and-unused-movement-entitlements--18-october-2026) uses one unused movement entitlement and retains Hajr's separate move. +The single physical Hajr can be played again after legitimate +[paid Box recovery](docs/RICHESE_ORNITHOPTER_ENGINE_AUDIT.md#recovered-hajr-replay--18-october-2026). +Advanced still requires a fresh post-movement opportunity. Before starting, open **Configure** on an AI seat to change its difficulty, faction or player circle without replacing it. Changes save immediately and diff --git a/components/game-table.tsx b/components/game-table.tsx index 40561713..ecd84ae5 100644 --- a/components/game-table.tsx +++ b/components/game-table.tsx @@ -5005,6 +5005,7 @@ export function GameTable({

{g.ornithopter &&

Provisional card composition: Ornithopter replaces one unused movement. Its two groups must be different; Hajr adds one separate normal move and may move those forces again.

} {g.advanced && me.hand?.some(card => card.effect === 'hajr') &&

Play Hajr immediately after a completed Force Movement and its required arrival decisions, before your next voluntary action.

} + {!!me.hajrPlays &&

{me.hajrPlays} Hajr play{me.hajrPlays === 1 ? '' : 's'} this turn. Each legal play grants one additional movement. A recovered Hajr must return to your hand; Advanced requires a fresh post-move opportunity.

} {transportPreview && ( <>