From bb9d292c4c4a6ad89df13dc2308fac25ff2be89d Mon Sep 17 00:00:00 2001
From: Quintine <15965533+Quintine@users.noreply.github.com>
Date: Sun, 18 Oct 2026 11:21:28 +1100
Subject: [PATCH] Compose native Ecaz Betrayal and Moritani Atomics
Retain original selected modules, typed native returns, advisors and hidden No-Field recall. Preserve a full unspent Guild/Sapho opening, paid ordered arrivals, capped provisional No-Field destruction and native World Sneak withdrawal. Bind desert Aftermath to its original Moritani Cunning placement.
Validation: frozen 16-file115/115, types/lint/build, eight finite original-action and GameTable SSR programmes, four minimal legal policies. Document provisional overlaps and corrected genuine recipes. No stored-game change or deployment; full combinations, comprehensive assurance and deployed acceptance remain required.
---
components/moritani-terror.tsx | 4 +-
components/nexus-ecaz-betrayal.tsx | 5 +-
docs/CURRENT_STATUS.md | 30 ++-
docs/IMPLEMENTATION_STATUS.md | 20 ++
docs/MORITANI_TERROR_RULES.md | 48 ++++
docs/NEXUS_CARD_RULES.md | 61 ++++-
docs/NEXUS_ECAZ_RULES.md | 52 +++-
docs/NEXUS_MORITANI_RUNTIME.md | 6 +-
docs/RULE_DECISIONS.md | 27 ++
game/engine.ts | 77 ++++--
game/moritani-atomics.ts | 21 +-
game/nexus-ecaz-betrayal.ts | 145 ++++++++---
game/reference.ts | 29 ++-
game/richese-no-field.ts | 22 +-
tests/ecaz-betrayal-modules.test.ts | 167 ++++++++++++
tests/fixture-ecaz-betrayal-modules.ts | 226 +++++++++++++++++
tests/fixture-moritani-atomics-modules.ts | 238 +++++++++++++++++
tests/fixture-nexus-moritani-atomics.ts | 132 ++++++++++
tests/moritani-atomics-modules.test.ts | 180 +++++++++++++
tests/moritani-atomics.test.ts | 52 +++-
tests/nexus-ecaz-betrayal-quotes.test.ts | 253 ++++++++++++++++++-
tests/nexus-moritani-atomics-runtime.test.ts | 73 ++++++
tests/richese-no-field-hidden-return.test.ts | 44 ++++
23 files changed, 1824 insertions(+), 88 deletions(-)
create mode 100644 tests/ecaz-betrayal-modules.test.ts
create mode 100644 tests/fixture-ecaz-betrayal-modules.ts
create mode 100644 tests/fixture-moritani-atomics-modules.ts
create mode 100644 tests/fixture-nexus-moritani-atomics.ts
create mode 100644 tests/moritani-atomics-modules.test.ts
create mode 100644 tests/nexus-moritani-atomics-runtime.test.ts
create mode 100644 tests/richese-no-field-hidden-return.test.ts
diff --git a/components/moritani-terror.tsx b/components/moritani-terror.tsx
index e2055dfa..5384326e 100644
--- a/components/moritani-terror.tsx
+++ b/components/moritani-terror.tsx
@@ -601,7 +601,9 @@ export function MoritaniEntry({
does too, if you have one. Each hand over its new limit
discards one random card per excess card. Under the provisional
persistent-target interpretation, later alliance changes do not
- move this penalty to a new ally.
+ move this penalty to a new ally. A caught concealed No-Field
+ provisionally reveals and places only its available reserve
+ forces before those forces go to the Tanks.
)}
{entry.kind === 'sneakAttack' && sneak && (
diff --git a/components/nexus-ecaz-betrayal.tsx b/components/nexus-ecaz-betrayal.tsx
index 51b173ef..2bd9a831 100644
--- a/components/nexus-ecaz-betrayal.tsx
+++ b/components/nexus-ecaz-betrayal.tsx
@@ -21,7 +21,7 @@ export function NexusEcazBetrayal({ game, act, busy }: Props) {
Ecaz Nexus · Betrayal
{nexusCardReference('ecaz').betrayal}
- {ally && Ecaz’s ally: {ally.name}. Their entire physical group in the selected territory returns to reserves after the Karama response.
}
+ {ally && Ecaz’s ally: {ally.name}. Their entire group in the selected territory returns to reserves if the Karama response allows Betrayal.
}
{offer.territories.length > 1 && }
- {choice && Selected: {boardTerritory(choice.territory).name} · {choice.total.normal} normal · {choice.total.elite} elite forces
}
+ {choice && Selected: {boardTerritory(choice.territory).name} · {choice.total.normal} visible normal · {choice.total.elite} visible elite forces{choice.concealed ? ' · one concealed No-Field' : ''}
}
+ {choice?.concealed && The No-Field returns face-down without revealing its value. Cancellation leaves the marker and all forces in place.
}
{offer.blocked && {offer.blocked}
}