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.
This commit is contained in:
Quintine committed 2026-10-18 12:23:37 +11:00
1 parent 6ccfaa1b4d
commit 72e77d7f4d
16 files changed
+522 -31

No files matched your search

+9
View File
@@ -7,6 +7,15 @@ export type MovementCohort = {
};
type Counts = Readonly<Record<string, number>>;
/** A two-group flight replaces one ordinary entitlement. Only its completed
* extra group earns a physical-move credit; Hajr remains an independent move. */
export function ordinaryMovementAllowance(hajrUsed: boolean, extraMoves = 0): number {
const limit = 1 + Number(hajrUsed) + extraMoves;
if (typeof hajrUsed !== 'boolean' || !Number.isSafeInteger(extraMoves) || extraMoves < 0 ||
!Number.isSafeInteger(limit)) throw new RangeError('Movement credits must be nonnegative safe integers.');
return limit;
}
function validateCounts(counts: Counts, label: string) {
if (!counts || typeof counts !== 'object' || Array.isArray(counts))
throw new TypeError(`${label} must be a location count record.`);