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.
This commit is contained in:
Quintine committed 2026-10-18 11:21:28 +11:00
1 parent 8793e23d6b
commit bb9d292c4c
23 files changed
+1824 -88

No files matched your search

+3 -1
View File
@@ -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.
</p>
)}
{entry.kind === 'sneakAttack' && sneak && (
+3 -2
View File
@@ -21,7 +21,7 @@ export function NexusEcazBetrayal({ game, act, busy }: Props) {
<section aria-label="Ecaz Nexus Betrayal" className="space-y-3 rounded-lg border border-[#a88b60]/50 p-3">
<h3>Ecaz Nexus · Betrayal</h3>
<p>{nexusCardReference('ecaz').betrayal}</p>
{ally && <p className="fine">Ecaz’s ally: {ally.name}. Their entire physical group in the selected territory returns to reserves after the Karama response.</p>}
{ally && <p className="fine">Ecaz’s ally: {ally.name}. Their entire group in the selected territory returns to reserves if the Karama response allows Betrayal.</p>}
{offer.territories.length > 1 && <label className="block space-y-1">
<span>Shared territory</span>
<select className="min-h-11 w-full" value={choice?.territory ?? ''} disabled={busy || !!offer.blocked}
@@ -29,7 +29,8 @@ export function NexusEcazBetrayal({ game, act, busy }: Props) {
{offer.territories.map(candidate => <option key={candidate.territory} value={candidate.territory}>{boardTerritory(candidate.territory).name}</option>)}
</select>
</label>}
{choice && <p>Selected: {boardTerritory(choice.territory).name} · {choice.total.normal} normal · {choice.total.elite} elite forces</p>}
{choice && <p>Selected: {boardTerritory(choice.territory).name} · {choice.total.normal} visible normal · {choice.total.elite} visible elite forces{choice.concealed ? ' · one concealed No-Field' : ''}</p>}
{choice?.concealed && <p className="fine">The No-Field returns face-down without revealing its value. Cancellation leaves the marker and all forces in place.</p>}
{offer.blocked && <p className="notice">{offer.blocked}</p>}
<Button className="game-action min-h-11 whitespace-normal" disabled={busy || !action}
onClick={() => { if (!busy && action) act(action); }}>