Files
Dune/docs/MORITANI_ALLY_RETENTION_RULES.md

17 KiB
Raw Permalink Blame History

Moritani ally: retaining a battle card

Bounded source and implementation audit, 2026-09-06. No runtime edits or live-room actions were performed.

Initial mandatory discard before native retention — 28 October 2026

Prototyped / Partial. In the supported bare Basic Semuta profile with a native Moritani ally, cards that the losing ally could not keep as a winner are discarded with the original mandatory battle batch; the ally's eligible played cards remain reserved for its later retention choice. Cheap Hero is always ineligible. The ordinary predicate still permits an unused Poison Tooth and applies the existing Traitor exception to otherwise mandatory cards.

The initial batch receives one neutral Semuta opportunity. Its resolved battle and remaining winner cleanup continue once; the losing ally's original retention pool stays fixed even if Semuta transfers a freshly discarded card. The later choice, Karama response and disposal of unkept eligible cards use the existing native continuation. A Semuta holder cannot spend a reserved battle card. Older saved retention records and other profiles keep their recorded all-played reservation.

The publisher permits the ally to keep one eligible played card and Semuta to take a card another player has just discarded. It does not establish the timing between these effects. Sending unretainable cards to an initial batch and the remaining unkept cards to a later batch is a provisional software ordering; it creates separate Semuta opportunities and is not a publisher ruling that the loser's discards are simultaneous or separate. The existing all-card reservation remains a different serialization, documented below. Controlled actual-battle fixtures exercise this boundary; wider combinations, complete rules and deployed acceptance remain open.

Distinct Advanced special Karama first version — 8 October 2026

This is not the ally-retention ability below. Authorized supplied PDF physical p35, Moritani F lets Moritani, after losing a battle, force its winning opponent to keep/discard played Treachery Cards. The native unspent Moritani receives an owned opportunity before optional winner disposal, with only publicly revealed played identities still held there. It can decline or spend one actual Karama for disjoint forced keep/discard subsets. Unchanged cards retain the winner's ordinary choice.

Provisional precedence: existing compulsory named-card disposal finishes first; force keep targets only ordinarily retainable cards. This does not adjudicate a special-power override of Tooth/Artillery/ skill-card mandatory disposal. No arbitrary unused opposing hand is exposed.

game/moritani-special-karama.ts revalidates the exact resolved source and subsets. The original normalized cost/once-use pipeline then applies real forced discards and a typed fresh-discard continuation before resuming the remaining winner choice once; forced keeps cannot be selected in that choice. Owned controls and legal AI are connected.

One real-loss smoke observes the opportunity, legal bot discard candidate, one physical Karama cost, an actual forced weapon discard, retained Snooper and completed cleanup. Live isolated React controls in Chromium change both selectors and submit the exact native event/card/identity subsets. Types pass; no broad suite or complete-mode/deployed acceptance follows.

Explicit effect and eligible outcomes

When Moritani’s ally loses a battle that has a winner, the ally may retain one of its played Treachery cards, provided it could have retained that card as the winner. This is optional, does not benefit Moritani itself, and does not retrieve arbitrary unplayed hand cards or the opponent’s cards. The paragraph is the ordinary Alliance ability, not the advanced Assassinate Leaders ability. GF9 Ecaz & Moritani, printed p. 6

Battle outcome Retention opportunity
Ordinary loss, including an aggressor winning a tied strength total Yes, if the loser is Moritani’s ally and played an eligible card.
Both leaders die to ordinary weapons but one side wins by force strength Yes; leader death does not itself imply a mutual loss.
A single successful traitor call defeats Moritani’s ally Yes. There is an actual winner; E3 supplies no traitor exclusion.
Both sides successfully call traitors No winner, so no retention.
Lasgun/Shield explosion actually resolves No winner, so no retention.
Lasgun and Shield appear, but a single traitor call wins first Treat the actual traitor result as having a winner; do not use raw card presence to disqualify retention.

These distinctions compose E3’s winner condition with the base battle outcomes. The base rules give the single traitor caller the victory despite a revealed explosion, while double traitors destroy both sides. GF9 base rulebook, printed p. 11

Which played card may be retained?

Use exact physical card IDs committed in the loser’s resolved Battle Plan, filtered by the same winner-retention rules used for the actual winner. Ordinary weapons, defenses and played Worthless cards qualify. A leader disc is not a Treachery card. Cheap Hero/Heroine is always discarded. A Poison Tooth actually used cannot be retained; one merely played without use can be kept by a winner and therefore qualifies for the ally. GF9 November 2020 FAQ, printed p. 8

Do not admit a mandatory-discard card merely because the general winner rule allows keeping cards. Current runtime makes Artillery Strike mandatory-discard in a resolved ordinary battle, and used Poison Tooth likewise. The CHOAM expansion supplies revised versions of those cards, so their implemented card-version rules must remain authoritative for this filter. GF9 CHOAM & Richese, printed p. 4

The current winner cleanup suppresses Artillery/Tooth effect-discard when a traitor decides the battle, but still discards Cheap Hero. Reusing that predicate for the loser avoids contradictory card semantics. No retrieved Moritani-specific FAQ spells out the counterfactual Artillery/Tooth case after a traitor loss; retain this evidence limit rather than claiming a dedicated clarification or silently changing the ordinary card rules.

Karama and timing limits

Correction after verifying the November 2020 FAQ p. 7: the publisher explicitly confirms that Karama can stop an alliance ability. Moritani’s card-retention power is therefore cancelable under a directly confirmed category, despite lacking an individual row in the E3 table. The earlier classification as merely a plausible generic cancellation was too weak and is superseded. GF9 November 2020 FAQ, p. 7

The FAQ does not specify Moritani retention’s exact declaration timing or whether cancellation precedes disclosure of the selected card. The current ally-selects-card → response → final-disposal sequence remains an implementation of the general power window, not a specialized timing ruling. Distinguish Moritani as the power owner from the defeated ally as the card-choice owner. Do not manufacture an extra Moritani approval requirement: the printed retention choice belongs to the ally. GF9 E3, pp. 6, 16

Retention belongs to battle-card cleanup after the winner is known. There is no retrieved combined priority ruling against Harkonnen capture, CHOAM income, technology transfer or Face Dancers. Capture changes leader custody, not which Treachery cards were played; it does not independently suppress this ability. A narrow implementation can serialize the retention choice before those existing continuations, but should not claim that ordering as an explicit expansion FAQ. Preserve the resolved battle outcome through subsequent replacement effects rather than rerunning battle resolution.

Required change to current cleanup

resolveBattle currently discards every loser card in its used(p, plan) loop, then sets g.battle=null and proceeds through casualty selection, winner card cleanup and finishBattle. Implementing retention by taking a card back from g.discard would lose exact custody and expose it to deck/recycling effects. Determine retention candidates before the discard loop. For a simple exact-custody implementation, reserve all of this loser’s played cards while the choice is pending; only the filtered eligible subset may be retained. Other players’ cleanup can remain on its existing continuation.

A narrow persistent record could be:

type PendingMoritaniRetention = {
  owner: string; // Moritani, the power owner
  player: string; // the defeated ally, who chooses
  winner: string;
  territory: string;
  turn: number;
  played: string[];
  eligible: string[];
  stage: 'response' | 'choose';
};

This is a proposed software contract, not printed rules. Keep the existing settled-battle continuation separately; no arbitrary stored Action is needed. Finish leader deaths, force/payment results and bounty once. On choose, require zero or one exact eligible card still in this hand; discard all remaining pending played cards once. On decline or canceled use, discard all. Resume the preexisting casualty/winner-card/postbattle chain without recalculating outcomes, random capture selection or payments.

Reservation matters: holding pending cards in the ally’s hand after clearing g.battle otherwise permits CHOAM cash-in or Bene Gesserit Worthless-as-Karama to spend cards still committed to cleanup. Shared reservation checks must cover these IDs through nested responses and JSON reloads. Public data can show the already-revealed played cards and which player must decide; it must not expose unrelated cards from the ally’s hand. Stale choices must fail without acquiring a replacement card or duplicating a discard.

Focused validation suggested

Test an ordinary loser choosing either eligible card or none; reject an unplayed card, opposing card and two-card selection. Cover Cheap Hero, used/unused Tooth and Artillery under the actual winner predicate. Cover single/double traitors, actual explosion and traitor-preempted explosion. Verify Moritani itself gets no benefit, ownership belongs to the ally, and absent alliance gives no decision. Serialize before selection and through any Karama conversion; verify exact card conservation and no CHOAM/BG spending of reserved IDs. Resume Advanced casualty choice, Harkonnen capture and Face Dancer continuation without repeating payment, RNG or loss effects.

Official indexed E3, base and November 2020 FAQ passages were compared with the existing local publisher-authored extracts. Targeted primary-source searches found no dedicated retention FAQ. Search results from older editions, tournament variations and community discussions were not used to supply missing rules.

Independent alternate-spending audit

Reviewed the proposed retention state against the current dispatcher. The reservation must start when the battle outcome is committed, covering the winner’s casualty/card-cleanup decisions as well as the later ally selection and Karama response. Checking only the currently visible moritaniRetention decision would leave earlier and nested windows exposed. The two currently reachable alternate spend paths are CHOAM’s special cash-in and spendKarama for Bene Gesserit Worthless conversion; both need the exact pending played-card reservation.

No additional currently reachable spender was found in the bounded review. Truthtrance only spends cards with its own special effect, which cannot be legal weapon/defense/hero commitments, and its overlay preserves pending state. Harkonnen’s exchange requires Bidding; Fremen, Emperor and Tleilaxu specials require other phases. Ixian movement needs phase 5 with no pending decision/response. Atreides special prescience needs an existing battle and its preparation offer. CHOAM’s Worthless effects reject the relevant decisions and response windows, and their implemented phase timings exclude Battle. Ordinary play/discard/exchange handlers run after the pending-state gates. Existing winner-card cleanup accepts only its own decision’s card IDs.

Private projection may expose the defeated player’s reserved IDs for client-side availability, or the already revealed played identities publicly, but must not include the rest of that player’s hand. A shared client helper must receive enough authorized reservation data to agree with the server. Truthtrance fact answers may still correctly regard reserved cards as in the hand; asking about a battle plan after g.battle has cleared is rejected. These findings describe current reachable paths and should be revisited when new phase-independent card effects are enabled.

Integrated implementation checkpoint

The engine now implements this flow with moritaniRetention and the shared canRetainBattleCard predicate in game/moritani-retention.ts. Reservations begin before discards. Winner casualty/card cleanup completes first; finishBattle then offers the defeated ally its choice before CHOAM income, tech transfer, capture and Face Dancer continuations. The ally may decline without a response or declare one card; declaration opens the ordinary Karama window owned by Moritani. Final settlement checks exact custody, discards all other played IDs once and resumes the existing continuation. This chosen software serialization and generic Karama composition remain the interpretation described above, not a newly located dedicated FAQ.

spendKarama and cashInCards reject reserved cards, including during winner cleanup and nested Worthless conversion. The interface and bot response choices also honor the reservation. A public declared-card projection enables response-stage inspection without exposing unrelated hand contents. The linked internal reference and general battle-card guide now explain the exception.

Eighteen focused real-battle/server tests and five AI tests cover the integrated ability. The full suite reached935 passes;45 persisted multiplayer checks, TypeScript, lint and build passed. Independent review additionally exercised both nested Worthless cancellation and counter-cancellation through JSON reloads. Desktop browser QA completed declaration, response refresh and final exact-card settlement in S85SLVRR. Complete Moritani/expansion acceptance remains unfinished and faction starts remain gated.

Semuta composition — 11 October 2026

The existing Basic Richese/Moritani CHOAM/Ecaz entry now offers Semuta after completed native allied-card disposal. The losing ally's original choice and native Karama response finish first; only unkept played cards form the fresh batch. A sole card completes automatically after commitment; multiple cards require one private selection. Kept and unrelated hand cards remain unavailable.

Compulsory/optional winner-card batches may also pause before the original choose-stage retention. Existing aftermath validation and reciprocal alliance checks preserve that native opportunity. A loser acquiring the winner's card through Semuta cannot add it to the original played/eligible pool. At this earlier checkpoint all losing played cards were reserved, so no losing battleResolved batch preceded retention. The later narrowly scoped initial mandatory-discard prototype is described above. Advanced native Moritani and Nexus/Skills compositions are not opened.

An enemy or the defeated ally spending a printed Karama to cancel the proposed keep now produces an earlier singleton cost offer through karamaBattleDiscard. The original response/keep proposal remains pending across that reaction. Claim/pass then completes cancellation once and discards all original played IDs in the later allied batch. A distinct holder may acquire the activating cost, including the approved full-hand exchange, but it never joins that played pool or restores retention. Own discarded costs are not eligible. The original Moritani power owner still cannot cancel its own power.

Thirty-four isolated runtime cases cover keep either/none, claim/pass/four legal AI profiles, both preceding winner batches and original enemy/ally Karama allowance or cancellation. Actual GameTable at390px declines native retention, commits Semuta, privately selects Maula Pistol from two fresh cards and reaches phase7 without another retention choice or horizontal overflow. No source ruling, original native behavior outside the Semuta entry or public gate changed.