From 72e77d7f4d96a3eca5987eba5287cc36dea3e99c Mon Sep 17 00:00:00 2001 From: Quintine <15965533+Quintine@users.noreply.github.com> Date: Sun, 18 Oct 2026 12:23:37 +1100 Subject: [PATCH] Compose Ornithopter with unused Hajr movement Replace one unused movement entitlement by the selected card mode and retain independent Hajr movement after a completed two-group flight. Preserve distinct cohorts and later legal reuse. Adopt supplied Advanced immediate-after-movement Hajr play timing with explicit provisional online/card-group interpretation; Basic timing remains. Validation: frozen11-file132/132, types/lint/build and12 original-action/rendered-table programmes; four minimal policies retain both continuations. Actual cards are acquired by original auctions and source groups use funded shipments. Multiple Hajr cards, advisors, wider combinations, final assurance and deployed acceptance remain open. No saved-game, reset, restart or deployment operation. --- README.md | 4 + components/game-table.tsx | 2 + docs/CURRENT_STATUS.md | 17 ++ docs/IMPLEMENTATION_STATUS.md | 18 +++ docs/RICHESE_ORNITHOPTER_ENGINE_AUDIT.md | 67 ++++++++ docs/RULE_DECISIONS.md | 1 + game/card-availability.ts | 10 +- game/engine.ts | 41 +++-- game/ornithopter.ts | 9 ++ game/reference.ts | 31 ++-- tests/card-availability.test.ts | 2 +- tests/fixture-ornithopter-hajr.ts | 160 +++++++++++++++++++ tests/ornithopter-bots.test.ts | 1 + tests/ornithopter-engine.test.ts | 4 +- tests/ornithopter-hajr-engine.test.ts | 172 +++++++++++++++++++++ tests/semuta-homeworld-ornithopter.test.ts | 14 +- 16 files changed, 522 insertions(+), 31 deletions(-) create mode 100644 tests/fixture-ornithopter-hajr.ts create mode 100644 tests/ornithopter-hajr-engine.test.ts diff --git a/README.md b/README.md index c3b0edbc..9acaa6dc 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,10 @@ advisors, Polar Sink and native Ecaz coexistence retain their exceptions. Basic and an already recorded current Storm keep their existing protocol. See [Advanced source boundaries](docs/BASE_ADVANCED_READINESS_20260907.md#authorized-advanced-source-follow-up--1-october-2026) and [allied separation](docs/ALLIED_TRANSIT_RULES.md). +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. 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 67531bdb..40561713 100644 --- a/components/game-table.tsx +++ b/components/game-table.tsx @@ -5003,6 +5003,8 @@ export function GameTable({ ? `${(me.movesAllowed ?? 1) - (me.moved ?? 0)} movement remaining.` : 'Movement complete. Finish your turn when your shipment is also settled.'}

+ {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.

} {transportPreview && ( <>