Support native Basic Ambassador and Terror arrivals
This commit is contained in:
1 parent
a07c6d8e50
commit
a45d81aa34
9 files changed
+258
-28
No files matched your search
@@ -20,6 +20,17 @@ open mode gates.
|
|||||||
Keep identified Basic-function gaps ahead of Advanced and wider interactions.
|
Keep identified Basic-function gaps ahead of Advanced and wider interactions.
|
||||||
Prototype labels and final acceptance gates remain.
|
Prototype labels and final acceptance gates remain.
|
||||||
|
|
||||||
|
**Basic native Ambassador/Terror arrivals — 27 October. Prototyped / Partial.**
|
||||||
|
Bare Basic games with selected native faction decks can carry one eligible entry
|
||||||
|
through both Ecaz Ambassador and Moritani Terror opportunities in the existing
|
||||||
|
provisional storm order. Their original payment, entry and continuation happen
|
||||||
|
once. Nested Fremen/Guild Ambassador arrivals and optional-module boundaries
|
||||||
|
remain separate. Player reference text also corrects outdated claims that
|
||||||
|
supported faction previews cannot start.
|
||||||
|
[Scope](DEFERRED_SHIPMENT_ARRIVAL.md#basic-native-faction-overlap--27-october-2026).
|
||||||
|
The frozen batch passed 76/76 tests in nine files, type/lint and the production
|
||||||
|
build. Complete and deployed acceptance remain open.
|
||||||
|
|
||||||
**Basic Richese and Kull/Semuta — 27 October. Prototyped / Partial.**
|
**Basic Richese and Kull/Semuta — 27 October. Prototyped / Partial.**
|
||||||
The printed-Kull opt-in includes native Richese. In supported clean parents,
|
The printed-Kull opt-in includes native Richese. In supported clean parents,
|
||||||
successful Kull and a distinct counter open the public Semuta discard reaction
|
successful Kull and a distinct counter open the public Semuta discard reaction
|
||||||
|
|||||||
@@ -4,6 +4,25 @@
|
|||||||
exposed an already accepted shipment whose Guild allowance could not finish.
|
exposed an already accepted shipment whose Guild allowance could not finish.
|
||||||
This continuation repair preserves the existing unfinished arrival-order gates.
|
This continuation repair preserves the existing unfinished arrival-order gates.
|
||||||
|
|
||||||
|
## Basic native faction overlap — 27 October 2026
|
||||||
|
|
||||||
|
**Prototyped / Partial.** In bare Basic games with selected native faction
|
||||||
|
decks and both Ecaz and Moritani seated, an eligible arrival may carry both
|
||||||
|
Ambassador and Terror opportunities through the existing provisional storm
|
||||||
|
order. The original move or shipment is committed and paid once; its two
|
||||||
|
owners resolve their separately earned opportunities in sequence. The existing
|
||||||
|
queue and controls apply; this is not a publisher ruling on simultaneous
|
||||||
|
effects. Actual in-flight controls remain authoritative, and nested Fremen or
|
||||||
|
Guild Ambassador arrivals and optional-module combinations keep their separate
|
||||||
|
boundaries. Complete factions, modes and deployed acceptance remain open.
|
||||||
|
The new [runtime fixture](../tests/fixture-basic-native-overlap.ts) uses public
|
||||||
|
Basic setup and real shipments with explicitly controlled, native-token
|
||||||
|
placements. [Regression cases](../tests/basic-native-overlap-runtime.test.ts)
|
||||||
|
cover both owner orders, Duke acquisition, Robbery and a native Tleilaxu
|
||||||
|
entrant. They do not prove every nested arrival or module combination.
|
||||||
|
Frozen changed-path proof passed 76/76 tests in nine files, type/lint and the
|
||||||
|
production build. Browser, deployed and full-mode acceptance remain open.
|
||||||
|
|
||||||
## Native own-arrival continuations — 15 October 2026
|
## Native own-arrival continuations — 15 October 2026
|
||||||
|
|
||||||
Direct native Guild transport now has the same clear owner-view candidate
|
Direct native Guild transport now has the same clear owner-view candidate
|
||||||
|
|||||||
@@ -1,5 +1,17 @@
|
|||||||
# Dune implementation status
|
# Dune implementation status
|
||||||
|
|
||||||
|
## 27 October 2026 — Basic native Ambassador/Terror arrivals
|
||||||
|
|
||||||
|
The existing ordered same-entry queue admits bare Basic native faction rosters
|
||||||
|
with selected Ix, CHOAM or Ecaz decks, preserving its existing response and
|
||||||
|
nested-arrival boundaries. Stale player-facing faction and selected component
|
||||||
|
guidance now describes available starts as unfinished previews. Complete modes,
|
||||||
|
broader interactions, browser and deployed acceptance remain open.
|
||||||
|
Frozen changed-path proof passed 76/76 tests in nine files, type/lint and the
|
||||||
|
production build. Actual native shipments and both reaction orders are covered;
|
||||||
|
the fixture explicitly stages the two original supply tokens through helpers.
|
||||||
|
[Contract](DEFERRED_SHIPMENT_ARRIVAL.md#basic-native-faction-overlap--27-october-2026).
|
||||||
|
|
||||||
## 27 October 2026 — Basic Richese and Kull/Semuta
|
## 27 October 2026 — Basic Richese and Kull/Semuta
|
||||||
|
|
||||||
The printed-Kull opt-in includes native Richese and its existing cache setup.
|
The printed-Kull opt-in includes native Richese and its existing cache setup.
|
||||||
|
|||||||
@@ -1,5 +1,13 @@
|
|||||||
# Rule decision index
|
# Rule decision index
|
||||||
|
|
||||||
|
## Basic native Ambassador/Terror overlap — 27 October 2026
|
||||||
|
|
||||||
|
The existing provisional storm-order queue also handles eligible same-entry
|
||||||
|
Ambassador and Terror reactions in bare Basic selected native-faction tables.
|
||||||
|
It does not establish a new publisher priority ruling or enable nested
|
||||||
|
Fremen/Guild Ambassador arrivals.
|
||||||
|
[Contract](DEFERRED_SHIPMENT_ARRIVAL.md#basic-native-faction-overlap--27-october-2026).
|
||||||
|
|
||||||
## Basic Richese and Kull/Semuta — 27 October 2026
|
## Basic Richese and Kull/Semuta — 27 October 2026
|
||||||
|
|
||||||
Provisionally offer Semuta after the public discard of a successful printed
|
Provisionally offer Semuta after the public discard of a successful printed
|
||||||
|
|||||||
+8
-2
@@ -66,7 +66,7 @@ import { movementShipmentPreparations } from './movement-shipment-preparation';
|
|||||||
import { MovementClaimError, liveMovementPromises, movementEventAllowed, movementPromiseModeSupported, movementPromiseTargetAvailable, settleMovementEvent, finishMovementPromises, validMovementClaim, type MovementClaim, type MovementPromise } from './movement-promises';
|
import { MovementClaimError, liveMovementPromises, movementEventAllowed, movementPromiseModeSupported, movementPromiseTargetAvailable, settleMovementEvent, finishMovementPromises, validMovementClaim, type MovementClaim, type MovementPromise } from './movement-promises';
|
||||||
import { findMovementCompletion, type MovementCompletion } from './movement-promise-search';
|
import { findMovementCompletion, type MovementCompletion } from './movement-promise-search';
|
||||||
import { classicNexusModulesProfile, mixedE1E2NexusProfile, mixedE3NexusProfile, pairedE3NexusProfile, pairedNexusModulesProfile, singleE1E2NexusProfile, standaloneE3NexusProfile } from './nexus-module-profile';
|
import { classicNexusModulesProfile, mixedE1E2NexusProfile, mixedE3NexusProfile, pairedE3NexusProfile, pairedNexusModulesProfile, singleE1E2NexusProfile, standaloneE3NexusProfile } from './nexus-module-profile';
|
||||||
import { independentDiscoveryProfile, independentNexusProfile, nexusCoreProfile, nativeFactionTechProfile, selectedFactionStrongholdProfile, selectedIndependentCardsProfile } from './faction-module-profile';
|
import { independentDiscoveryProfile, independentNexusProfile, nexusCoreProfile, nativeFactionTechProfile, selectedFactionStrongholdProfile, selectedIndependentCardsProfile, selectedPhaseModuleRoster } from './faction-module-profile';
|
||||||
import { homeworldOccupationLeaderSkillsProfile, homeworldOccupationModulesProfile, homeworldPhaseModulesProfile } from './homeworld-module-profile';
|
import { homeworldOccupationLeaderSkillsProfile, homeworldOccupationModulesProfile, homeworldPhaseModulesProfile } from './homeworld-module-profile';
|
||||||
import { RevivalPromiseError, revivalPromiseModeSupported, liveRevivalPromises, recordPromisedRevival,
|
import { RevivalPromiseError, revivalPromiseModeSupported, liveRevivalPromises, recordPromisedRevival,
|
||||||
revivalPromisesSatisfied, validateRevivalPromises, type RevivalClaim, type RevivalPromise } from './revival-promises';
|
revivalPromisesSatisfied, validateRevivalPromises, type RevivalClaim, type RevivalPromise } from './revival-promises';
|
||||||
@@ -22490,6 +22490,12 @@ function ambassadorEffectBlock(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
function arrivalOverlapModeSupported(g: Game, revivalArrival?: RevivalEntryParent): boolean {
|
function arrivalOverlapModeSupported(g: Game, revivalArrival?: RevivalEntryParent): boolean {
|
||||||
|
// Native Basic faction decks share the same ordered arrival queue. A deck
|
||||||
|
// selection alone is not an optional phase module or a new arrival effect.
|
||||||
|
if (!g.advanced && selectedPhaseModuleRoster(g) && byFaction(g, 'ecaz') && byFaction(g, 'moritani') &&
|
||||||
|
!g.homeworlds && !g.nexusCards && !g.leaderSkills && !g.techTokens && !g.strongholdCards &&
|
||||||
|
!g.discoveryEnabled && !g.discoveries && !g.discoveryStash && !g.greatMaker && !g.ecazTreachery)
|
||||||
|
return true;
|
||||||
if (homeworldPhaseModulesProfile(g) && byFaction(g, 'ecaz') && byFaction(g, 'moritani')) return true;
|
if (homeworldPhaseModulesProfile(g) && byFaction(g, 'ecaz') && byFaction(g, 'moritani')) return true;
|
||||||
if (revivalArrival && g.homeworlds && byFaction(g, 'ecaz') && byFaction(g, 'moritani')) return true;
|
if (revivalArrival && g.homeworlds && byFaction(g, 'ecaz') && byFaction(g, 'moritani')) return true;
|
||||||
if (bareBasicSemutaProfile(g) && byFaction(g, 'ecaz') && byFaction(g, 'moritani')) return true;
|
if (bareBasicSemutaProfile(g) && byFaction(g, 'ecaz') && byFaction(g, 'moritani')) return true;
|
||||||
@@ -22700,7 +22706,7 @@ function openTerritoryEntry(
|
|||||||
return openAmbassadorEntry(g, owner, token, entrant, to, sector, resume, cause, revivalArrival, caladanArrival);
|
return openAmbassadorEntry(g, owner, token, entrant, to, sector, resume, cause, revivalArrival, caladanArrival);
|
||||||
requireRule(arrivalOverlapModeSupported(g, revivalArrival) && !g.pendingArrivalOverlap &&
|
requireRule(arrivalOverlapModeSupported(g, revivalArrival) && !g.pendingArrivalOverlap &&
|
||||||
moritani && g.order.includes(owner.id) && g.order.includes(moritani.id),
|
moritani && g.order.includes(owner.id) && g.order.includes(moritani.id),
|
||||||
'Ambassador and Terror overlap still needs a supported classic Ecaz/Moritani table.');
|
'Ambassador and Terror overlap still needs a supported Ecaz/Moritani faction and module table.');
|
||||||
const first = g.order.indexOf(owner.id) < g.order.indexOf(moritani.id)
|
const first = g.order.indexOf(owner.id) < g.order.indexOf(moritani.id)
|
||||||
? 'ambassador' : 'terror';
|
? 'ambassador' : 'terror';
|
||||||
const overlap: NonNullable<Game['pendingArrivalOverlap']> = {
|
const overlap: NonNullable<Game['pendingArrivalOverlap']> = {
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ export const FACTION_RULES: Record<
|
|||||||
'Use Kulon on your movement turn to add one territory of range. Use La La La during Revival to prevent a player’s free force returns for the phase; a reactive decision lets you stop a pending free revival before it resolves. Both cards have Karama responses before discard.',
|
'Use Kulon on your movement turn to add one territory of range. Use La La La during Revival to prevent a player’s free force returns for the phase; a reactive decision lets you stop a pending free revival before it resolves. Both cards have Karama responses before discard.',
|
||||||
'Trip to Gamont returns one other player’s force from a chosen sector to its reserves during Mentat. Elite types are preserved. A Karama response precedes the return, and CHOAM gets a final opportunity after the closing market before victory is checked.',
|
'Trip to Gamont returns one other player’s force from a chosen sector to its reserves during Mentat. Elite types are preserved. A Karama response precedes the return, and CHOAM gets a final opportunity after the closing market before victory is checked.',
|
||||||
'Baliset prevents a player from moving into a territory occupied by CHOAM for the turn, while permitting shipment. Jubba Cloak protects CHOAM forces in one territory from a moving storm. Both powers have Karama responses before the card is discarded.',
|
'Baliset prevents a player from moving into a territory occupied by CHOAM for the turn, while permitting shipment. Jubba Cloak protects CHOAM forces in one territory from a moving storm. Both powers have Karama responses before the card is discarded.',
|
||||||
'The host can opt into the Basic Kull preview in a CHOAM/classic lobby with the CHOAM and Ix decks and no other modules. React to a legal Karama attempt with held Kull Wahad before costs. The original card stays reserved; only a different eligible Karama can counter before the phase ban applies. Success spends Kull, retains the original unplayed card and prevents the activating player’s Karama uses for the phase. Decline or prevention resumes the original once; a prevented Kull stays held but its physical card’s effect is blocked that phase. The preview also withholds some structured Truthtrance questions and defers unfunded non-CHOAM Karama-dependent overbids; see the Kull guide. Complete CHOAM rules remain unfinished.',
|
'The host can opt into the Basic Kull preview with CHOAM, the CHOAM and Ix decks, each selected faction’s deck, and no other optional modules. React to a legal Karama attempt with held Kull Wahad before costs. The original card stays reserved; only a different eligible Karama can counter before the phase ban applies. Success spends Kull, retains the original unplayed card and prevents the activating player’s Karama uses for the phase. Decline or prevention resumes the original once; a prevented Kull stays held but its physical card’s effect is blocked that phase. With Richese, supported Kull and counter discards offer Semuta; some complex response windows and structured bribe commitments remain unavailable. The preview also withholds other structured Truthtrance questions and defers unfunded non-CHOAM Karama-dependent overbids; see the Kull guide. Complete CHOAM rules remain unfinished.',
|
||||||
],
|
],
|
||||||
advanced: [
|
advanced: [
|
||||||
'Once per game, spend a real Karama and discard selected other cards for three spice each. The cash-in can occur during pending phase or power decisions, while committed battle cards remain protected. See the CHOAM special Karama topic for funding and timing details.',
|
'Once per game, spend a real Karama and discard selected other cards for three spice each. The cash-in can occur during pending phase or power decisions, while committed battle cards remain protected. See the CHOAM special Karama topic for funding and timing details.',
|
||||||
@@ -31,7 +31,7 @@ export const FACTION_RULES: Record<
|
|||||||
'After battle casualties, surviving suboids may be exchanged one for one for cyborgs lost in that battle. Select the suboid and cyborg sectors in the substitution panel. A separate Karama response can stop the exchange.',
|
'After battle casualties, surviving suboids may be exchanged one for one for cyborgs lost in that battle. Select the suboid and cyborg sectors in the substitution panel. A separate Karama response can stop the exchange.',
|
||||||
'Cyborgs move two territories, can bring accompanying suboids, collect three spice and cost three spice to revive. Standalone suboids move one territory and collect normally. These transport, collection and revival details now have tested support; select cyborgs in the force controls and choose the free-revival type in Revival.',
|
'Cyborgs move two territories, can bring accompanying suboids, collect three spice and cost three spice to revive. Standalone suboids move one territory and collect normally. These transport, collection and revival details now have tested support; select cyborgs in the force controls and choose the free-revival type in Revival.',
|
||||||
'Before starting cards are dealt, choose one from a pool of one per faction; shuffle and deal the remainder privately. Before bidding, inspect an extra card and return one to the top or bottom of the deck. Your ally may replace each purchased card with the deck’s top card. These bidding powers have separate Karama responses.',
|
'Before starting cards are dealt, choose one from a pool of one per faction; shuffle and deal the remainder privately. Before bidding, inspect an extra card and return one to the top or bottom of the deck. Your ally may replace each purchased card with the deck’s top card. These bidding powers have separate Karama responses.',
|
||||||
'Start with ten spice, three cyborgs and three suboids in the Hidden Mobile Stronghold, and the remaining forces in reserves. One force revival is free, of either type. Mobile stronghold placement, route movement, entry, protection and victory counting now have engine support. Setup/auction technology now has private decision controls; full interaction audits and complete deck integration are unfinished, so faction starts remain disabled.',
|
'Start with ten spice, three cyborgs and three suboids in the Hidden Mobile Stronghold, and the remaining forces in reserves. One force revival is free, of either type. Mobile stronghold placement, route movement, entry, protection and victory counting have engine support. Setup and auction technology have private decision controls. Ixian faction starts are available as unfinished previews; full interaction audits and complete rules acceptance remain open.',
|
||||||
],
|
],
|
||||||
advanced: [
|
advanced: [
|
||||||
'A cyborg needs one spice to dial at strength two; an unsupported cyborg dials strength one. Suboids always dial one-half and cannot receive spice support. Suboid casualty substitution works in both basic and advanced battles.',
|
'A cyborg needs one spice to dial at strength two; an unsupported cyborg dials strength one. Suboids always dial one-half and cannot receive spice support. Suboid casualty substitution works in both basic and advanced battles.',
|
||||||
@@ -43,7 +43,7 @@ export const FACTION_RULES: Record<
|
|||||||
'Start with twenty forces in off-planet reserves and five spice. Two force revivals are free.',
|
'Start with twenty forces in off-planet reserves and five spice. Two force revivals are free.',
|
||||||
'Receive three Face Dancers after other factions choose their traitors. Reveal a matching victorious leader only after battle rewards are resolved, then replace its surviving army with your forces. See the Face Dancer topic for the full sequence.',
|
'Receive three Face Dancers after other factions choose their traitors. Reveal a matching victorious leader only after battle rewards are resolved, then replace its surviving army with your forces. See the Face Dancer topic for the full sequence.',
|
||||||
'Zoal copies the opposing leader’s strength in battle and for his death bounty. His ordinary revival value is three spice.',
|
'Zoal copies the opposing leader’s strength in battle and for his death bounty. His ordinary revival value is three spice.',
|
||||||
'Other factions pay you for revival; your own revival has no normal quantity limit and costs half price, rounded up. Grant five-force limits, offer an ally half price, and negotiate early leader returns through the revival controls. Full faction starts remain disabled pending remaining powers and audits.',
|
'Other factions pay you for revival; your own revival has no normal quantity limit and costs half price, rounded up. Grant five-force limits, offer an ally half price, and negotiate early leader returns through the revival controls. Tleilaxu faction starts are available as unfinished previews; remaining powers, interactions and acceptance are still open.',
|
||||||
],
|
],
|
||||||
advanced: [
|
advanced: [
|
||||||
'Revive foreign dead leaders at your discounted bank price while your active pool has fewer than five leaders. Their original traitor identities persist. A dead ghola may be sold back by private agreement; living gholas cannot be sold back. See the foreign-ghola topic. Once per game, spend a real Karama at another faction’s normal revival declaration to prevent its normal force and leader revivals for that turn. The attempt pays nothing and returns no pieces. Card exceptions and complete timing remain under audit.',
|
'Revive foreign dead leaders at your discounted bank price while your active pool has fewer than five leaders. Their original traitor identities persist. A dead ghola may be sold back by private agreement; living gholas cannot be sold back. See the foreign-ghola topic. Once per game, spend a real Karama at another faction’s normal revival declaration to prevent its normal force and leader revivals for that turn. The attempt pays nothing and returns no pieces. Card exceptions and complete timing remain under audit.',
|
||||||
|
|||||||
+24
-23
@@ -139,7 +139,7 @@ const phaseDetails = [
|
|||||||
'An allied Fremen player can grant three free force revivals during this phase.',
|
'An allied Fremen player can grant three free force revivals during this phase.',
|
||||||
'Use the leader selector to choose a dead leader. Revival cycles determine whether it is eligible; strength determines its normal cost.',
|
'Use the leader selector to choose a dead leader. Revival cycles determine whether it is eligible; strength determines its normal cost.',
|
||||||
'Ecaz ordinary revival uses a provisional native-identity cohort: five actual Tanks including Duke, or no available native leaders, opens it. Remaining native returns stay legal after another native dies again. Late first deaths do not need to match a global death count; Duke remains independently revivable outside the five native discs.',
|
'Ecaz ordinary revival uses a provisional native-identity cohort: five actual Tanks including Duke, or no available native leaders, opens it. Remaining native returns stay legal after another native dies again. Late first deaths do not need to match a global death count; Duke remains independently revivable outside the five native discs.',
|
||||||
'In development Ecaz fixtures, finishing Revival opens Ambassador placement after any CHOAM closing market. See Ecaz Ambassadors for the supported placement controls and remaining effects. Full expansion starts remain disabled.',
|
'In development Ecaz fixtures, finishing Revival opens Ambassador placement after any CHOAM closing market. See Ecaz Ambassadors for the supported placement controls and remaining effects. Supported expansion starts are available as unfinished previews.',
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'At the start of this phase, resolve the Atreides spice foresight response. If allowed, Atreides privately inspects the next card, including when using double spice blow.',
|
'At the start of this phase, resolve the Atreides spice foresight response. If allowed, Atreides privately inspects the next card, including when using double spice blow.',
|
||||||
@@ -205,7 +205,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
|||||||
'Verification entries identify focused regression suites. Passing those checks does not certify every interaction, browser journey or complete expansion game.',
|
'Verification entries identify focused regression suites. Passing those checks does not certify every interaction, browser journey or complete expansion game.',
|
||||||
'Development stages distinguish Missing functions, working Prototypes, Integrated functions, Verified behavior and Polished presentation. A prototype stage does not certify complete rules coverage; check the stated limits and evidence.',
|
'Development stages distinguish Missing functions, working Prototypes, Integrated functions, Verified behavior and Polished presentation. A prototype stage does not certify complete rules coverage; check the stated limits and evidence.',
|
||||||
'This checklist is being extended across the rules. Features without a checklist still have a topic-level coverage label and are not implicitly complete.',
|
'This checklist is being extended across the rules. Features without a checklist still have a topic-level coverage label and are not implicitly complete.',
|
||||||
'Choose Rules → Advanced preview when creating a room, or as host in the lobby. After everyone is ready, choose Begin Advanced preview. This unfinished mode supports the six classic factions, with optional Tech Tokens (3+ players) and Stronghold Cards. Expansion starts remain disabled; preview access does not certify complete rules compliance.',
|
'Choose Rules → Advanced preview when creating a room, or as host in the lobby. After everyone is ready, choose Begin Advanced preview. This unfinished mode supports selected expansion factions and supported optional Tech Tokens (3+ players) and Stronghold Cards; combination limits remain. Preview access does not certify complete rules compliance.',
|
||||||
],
|
],
|
||||||
related: [
|
related: [
|
||||||
'setup',
|
'setup',
|
||||||
@@ -409,7 +409,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
|||||||
category: 'Cards',
|
category: 'Cards',
|
||||||
coverage: 'Partial',
|
coverage: 'Partial',
|
||||||
summary:
|
summary:
|
||||||
'Inspect ten Richese cards and review the implemented auction flow. Card-effect integration is incomplete and full Richese starts remain disabled.',
|
'Inspect ten Richese cards and review the implemented auction flow. Supported Richese starts are unfinished previews; complete rules and acceptance remain open.',
|
||||||
steps: [
|
steps: [
|
||||||
'Richese begins with one of each of these ten cards in a separate cache. These cached cards are not part of its hand and are not initially shuffled into the ordinary Treachery deck.',
|
'Richese begins with one of each of these ten cards in a separate cache. These cached cards are not part of its hand and are not initially shuffled into the ordinary Treachery deck.',
|
||||||
'This public reference shows printed identities, not the contents of any player’s current cache or hand. Open an inspector for the full original gameplay explanation. Inspection never plays, acquires or discards a card.',
|
'This public reference shows printed identities, not the contents of any player’s current cache or hand. Open an inspector for the full original gameplay explanation. Inspection never plays, acquires or discards a card.',
|
||||||
@@ -423,7 +423,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
|||||||
'A bidder whose hand becomes full is automatically passed, or submits zero in an unfinished Silent lot, unless it is the Black Market seller retaining its already-held card. The same current hand rule governs eligibility, commitments and settlement. A full-hand owner’s unbid cache card is still removed automatically. If every ordinary hand is full, normal-pool preparation does not draw and lose unseen cards.',
|
'A bidder whose hand becomes full is automatically passed, or submits zero in an unfinished Silent lot, unless it is the Black Market seller retaining its already-held card. The same current hand rule governs eligibility, commitments and settlement. A full-hand owner’s unbid cache card is still removed automatically. If every ordinary hand is full, normal-pool preparation does not draw and lose unseen cards.',
|
||||||
'AI supports cache choices and all three offered bidding methods using its own projected information. It currently skips the optional Black Market prelude. A seller in an already offered Black Market lot passes or submits zero.',
|
'AI supports cache choices and all three offered bidding methods using its own projected information. It currently skips the optional Black Market prelude. A seller in an already offered Black Market lot passes or submits zero.',
|
||||||
'Karama may prevent the declared cache auction before the ordinary pool is drawn. Cancellation leaves the cache intact and restores its deducted ordinary lot; first/last position does not create another cache offer that round. The independent reduction for a completed Black Market sale remains, including provisional paid retention. An exhausted cache causes no cache deduction. The supplied Advanced source excludes Richese lots from Ixian Technology.',
|
'Karama may prevent the declared cache auction before the ordinary pool is drawn. Cancellation leaves the cache intact and restores its deducted ordinary lot; first/last position does not create another cache offer that round. The independent reduction for a completed Black Market sale remains, including provisional paid retention. An exhausted cache causes no cache deduction. The supplied Advanced source excludes Richese lots from Ixian Technology.',
|
||||||
'Juice of Sapho now supports bounded first/last Once Around, movement and remaining battle-choice ordering; see its timing guide for current limits. Richese’s Karama uses the existing generic handler, Distrans supports a separate private hand transfer, Nullentropy Box supports a paid private discard search, Ornithopter supports its two movement modes, and Residual Poison supports a random opposing leader death before leader commitment in development fixtures. Portable Snooper supports ordinary and late poison defense. Stone Burner supports a guarded weapon commitment and revealed leader-effect choice. Mirror Weapon copies opposing revealed attacks, with independent copy-first choices for Tooth and Stone in bounded CHOAM/Richese-deck classic-faction battles. A winning physical Mirror may be kept even after copying activated Tooth or Artillery under the user-selected interpretation, not a publisher clarification. Semuta Drug has a bounded clean public ordinary-discard preview; other discard producers and Sapho timing modes remain unfinished. This does not certify every Karama interaction. Richese expansion starts remain disabled. Each component guide identifies its currently available action. Independent continuation and persisted-room checks pass. Desktop checks confirmed all ten enlarged guides, direct topic links, Once Around payment and restored private Silent bidding. Mobile and full Richese-game verification remain unfinished.',
|
'Juice of Sapho now supports bounded first/last Once Around, movement and remaining battle-choice ordering; see its timing guide for current limits. Richese’s Karama uses the existing generic handler, Distrans supports a separate private hand transfer, Nullentropy Box supports a paid private discard search, Ornithopter supports its two movement modes, and Residual Poison supports a random opposing leader death before leader commitment in development fixtures. Portable Snooper supports ordinary and late poison defense. Stone Burner supports a guarded weapon commitment and revealed leader-effect choice. Mirror Weapon copies opposing revealed attacks, with independent copy-first choices for Tooth and Stone in bounded CHOAM/Richese-deck classic-faction battles. A winning physical Mirror may be kept even after copying activated Tooth or Artillery under the user-selected interpretation, not a publisher clarification. Semuta Drug has a bounded clean public ordinary-discard preview; other discard producers and Sapho timing modes remain unfinished. This does not certify every Karama interaction. Supported Richese starts are unfinished previews. Each component guide identifies its currently available action. Independent continuation and persisted-room checks pass. Desktop checks confirmed all ten enlarged guides, direct topic links, Once Around payment and restored private Silent bidding. Mobile and full Richese-game verification remain unfinished.',
|
||||||
],
|
],
|
||||||
related: [
|
related: [
|
||||||
'choam-modules',
|
'choam-modules',
|
||||||
@@ -618,7 +618,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
|||||||
'The private hand panel provides both card selectors and enlarged inspection. It shows the payment recipient and the server’s current availability reason. A reserved auction card cannot be taken from that lot. Spending pledged or already committed funds is not allowed.',
|
'The private hand panel provides both card selectors and enlarged inspection. It shows the payment recipient and the server’s current availability reason. A reserved auction card cannot be taken from that lot. Spending pledged or already committed funds is not allowed.',
|
||||||
'Full-hand activation now has a visibly provisional exchange policy: spend the held Karama and acquire one cache card, leaving the final hand within its actual limit. This is not a publisher timing clarification or numerical user ruling. Buying the final cached card is legal under the resolved exhausted-cache auction rule; subsequent Bidding restores the ordinary pool. Reserved cards, over-limit hands and pending commitments remain ineligible.',
|
'Full-hand activation now has a visibly provisional exchange policy: spend the held Karama and acquire one cache card, leaving the final hand within its actual limit. This is not a publisher timing clarification or numerical user ruling. Buying the final cached card is legal under the resolved exhausted-cache auction rule; subsequent Bidding restores the ordinary pool. Reserved cards, over-limit hands and pending commitments remain ineligible.',
|
||||||
'All four AI profiles can choose the canonical Richese Karama when the projection allows it and enough spice remains. They leave other cache effects to future implementation and give pending responses, decisions and Truthtrance priority.',
|
'All four AI profiles can choose the canonical Richese Karama when the projection allows it and enough spice remains. They leave other cache effects to future implementation and give pending responses, decisions and Truthtrance priority.',
|
||||||
'Richese ally gifts, Distrans transfer and Nullentropy Box search have their own hand-panel controls and rules topics. These are separate from special Karama purchase and retain their own capacity, timing and private-custody boundaries. Selectable Richese and combined advanced starts remain disabled.',
|
'Richese ally gifts, Distrans transfer and Nullentropy Box search have their own hand-panel controls and rules topics. These are separate from special Karama purchase and retain their own capacity, timing and private-custody boundaries. Richese and supported Advanced combinations can start as unfinished previews; other combinations remain unavailable.',
|
||||||
],
|
],
|
||||||
related: [
|
related: [
|
||||||
'richese-cards',
|
'richese-cards',
|
||||||
@@ -693,7 +693,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
|||||||
'The server checks alliance, exact card ownership, capacity and commitments again before transfer. An obsolete pending gift aborts without a partial transfer and restores its interrupted flow. Unrelated players see the gift power, not its private card identity. A pending card cannot also be spent, exchanged or randomly extracted.',
|
'The server checks alliance, exact card ownership, capacity and commitments again before transfer. An obsolete pending gift aborts without a partial transfer and restores its interrupted flow. Unrelated players see the gift power, not its private card identity. A pending card cannot also be spent, exchanged or randomly extracted.',
|
||||||
'After a Karama cancellation, the same card may be offered again while it remains legal. Each new offer opens a fresh cancellation response. This is a provisional interpretation of the one-use cancellation and the gift’s any-time wording, not a specific published retry ruling.',
|
'After a Karama cancellation, the same card may be offered again while it remains legal. Each new offer opens a fresh cancellation response. This is a provisional interpretation of the one-use cancellation and the gift’s any-time wording, not a specific published retry ruling.',
|
||||||
'All four AI profiles conservatively give only the canonical Richese Karama during Bidding to free a full hand when the ally’s public card count is lower and there is room. They do not inspect ally hand contents or infer an unknown need for a card. Pending responses, decisions and Truthtrance take priority.',
|
'All four AI profiles conservatively give only the canonical Richese Karama during Bidding to free a full hand when the ally’s public card count is lower and there is room. They do not inspect ally hand contents or infer an unknown need for a card. Pending responses, decisions and Truthtrance take priority.',
|
||||||
'All ten canonical Richese cards may be transferred when legal, and Karama has its existing card-effect handler. Distrans supports its separate card-transfer effect, Nullentropy Box supports paid private discard search, Ornithopter supports its two movement modes, and Residual Poison supports a random opposing leader death before leader commitment. Portable Snooper supports ordinary and late poison defense. Stone Burner supports a guarded weapon commitment and revealed leader-effect choice. Mirror Weapon copies an opposing revealed weapon in bounded CHOAM/Richese-deck classic-faction battles, with copy-first Tooth/Stone choices; physical-Mirror winner retention even after copied activated Tooth/Artillery is a user-selected interpretation. Juice of Sapho supports bounded Once Around and movement ordering. Semuta Drug has a bounded clean ordinary-discard preview; other discard producers and Sapho timing modes remain unfinished. Desktop gift transfer and fresh-tab pending recovery have been checked in a synthetic table. Mobile, broader interactions and full Richese games remain pending; Richese starts remain disabled.',
|
'All ten canonical Richese cards may be transferred when legal, and Karama has its existing card-effect handler. Distrans supports its separate card-transfer effect, Nullentropy Box supports paid private discard search, Ornithopter supports its two movement modes, and Residual Poison supports a random opposing leader death before leader commitment. Portable Snooper supports ordinary and late poison defense. Stone Burner supports a guarded weapon commitment and revealed leader-effect choice. Mirror Weapon copies an opposing revealed weapon in bounded CHOAM/Richese-deck classic-faction battles, with copy-first Tooth/Stone choices; physical-Mirror winner retention even after copied activated Tooth/Artillery is a user-selected interpretation. Juice of Sapho supports bounded Once Around and movement ordering. Semuta Drug has a bounded clean ordinary-discard preview; other discard producers and Sapho timing modes remain unfinished. Desktop gift transfer and fresh-tab pending recovery have been checked in a synthetic table. Mobile, broader interactions and full Richese-game acceptance remain pending; supported Richese starts are unfinished previews.',
|
||||||
],
|
],
|
||||||
related: [
|
related: [
|
||||||
'richese-cards',
|
'richese-cards',
|
||||||
@@ -1697,6 +1697,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
|||||||
'When an eligible entrant reaches the reusable Ecaz token, Ecaz may acquire the available shared Duke for itself or its current reciprocal ally. The token returns to supply and its companions are unchanged. Direct acquisition persists unused until battle use or Moritani acquisition; that shared tenure is provisional. It is distinct from the optional Basic or automatic Advanced new-alliance turn loan. A fresh token entry is required, with no standing transfer action.',
|
'When an eligible entrant reaches the reusable Ecaz token, Ecaz may acquire the available shared Duke for itself or its current reciprocal ally. The token returns to supply and its companions are unchanged. Direct acquisition persists unused until battle use or Moritani acquisition; that shared tenure is provisional. It is distinct from the optional Basic or automatic Advanced new-alliance turn loan. A fresh token entry is required, with no standing transfer action.',
|
||||||
'Unallied Ecaz may propose an alliance to an unallied entrant. Acceptance activates alliance abilities immediately. Basic then offers an optional Duke loan; Advanced automatically adds an available Duke under supplied PDF p30, without another acknowledgement. The first version releases a surviving loan after one battle, provisionally; an unused living loan is set aside at turn end. Unavailable Duke never prevents consent.',
|
'Unallied Ecaz may propose an alliance to an unallied entrant. Acceptance activates alliance abilities immediately. Basic then offers an optional Duke loan; Advanced automatically adds an available Duke under supplied PDF p30, without another acknowledgement. The first version releases a surviving loan after one battle, provisionally; an unused living loan is set aside at turn end. Unavailable Duke never prevents consent.',
|
||||||
'When another eligible faction enters a marked stronghold, Ecaz may trigger its Ambassador for itself or its current ally, or leave it in place. Ecaz itself, its ally, advisors and the faction matching the physical Ambassador do not trigger it. Ordinary shipment and native Guild transport settle their own income, BG Intrusion and accompaniment controls before queued entry, without replaying payment or forces. Actual busy controls and unsupported paired or module combinations remain guarded.',
|
'When another eligible faction enters a marked stronghold, Ecaz may trigger its Ambassador for itself or its current ally, or leave it in place. Ecaz itself, its ally, advisors and the faction matching the physical Ambassador do not trigger it. Ordinary shipment and native Guild transport settle their own income, BG Intrusion and accompaniment controls before queued entry, without replaying payment or forces. Actual busy controls and unsupported paired or module combinations remain guarded.',
|
||||||
|
'In supported bare Basic games with Ecaz and Moritani, a single entry that earns both an Ambassador and Terror opportunity retains both in their existing provisional storm order, including when other selected native factions are seated. Finish the first response before the second; the original arrival and payment occur once. Nested Fremen or Guild Ambassador arrivals and other unsupported module interactions remain guarded.',
|
||||||
'Accompaniment joining retained BG fighters creates a distinct eligible child entry before the original shipper. Declining the child leaves the live token for the original entry; consuming it does not create a token to offer again. Advisors remain exempt. This existing child-first, live-token composition is explicitly provisional, not a publisher priority ruling.',
|
'Accompaniment joining retained BG fighters creates a distinct eligible child entry before the original shipper. Declining the child leaves the live token for the original entry; consuming it does not create a token to offer again. Advisors remain exempt. This existing child-first, live-token composition is explicitly provisional, not a publisher priority ruling.',
|
||||||
'Emperor grants five bank spice. Atreides records the entrant’s current Treachery hand privately for the beneficiary; Harkonnen records one randomly selected held Traitor identity, or Face Dancer identity for a Tleilaxu entrant. These snapshots remain in the recipient’s private inspection history, identify when they were taken, and do not become a live view of later changes. Opening, enlarging or closing them needs no game acknowledgement.',
|
'Emperor grants five bank spice. Atreides records the entrant’s current Treachery hand privately for the beneficiary; Harkonnen records one randomly selected held Traitor identity, or Face Dancer identity for a Tleilaxu entrant. These snapshots remain in the recipient’s private inspection history, identify when they were taken, and do not become a live view of later changes. Opening, enlarging or closing them needs no game acknowledgement.',
|
||||||
'CHOAM lets the beneficiary choose any available hand cards, including none, for three spice each. Ixians require one available card to discard before drawing its replacement. Card controls respect projected reservations. After committing an Ixian exchange, a voluntary interruption must leave a card available for its required discard; a queued Truthtrance counts as already committed. A Bene Gesserit trigger permanently removes its token, then the beneficiary chooses an available effect outside the original supply for this group; unsupported copies remain visibly blocked.',
|
'CHOAM lets the beneficiary choose any available hand cards, including none, for three spice each. Ixians require one available card to discard before drawing its replacement. Card controls respect projected reservations. After committing an Ixian exchange, a voluntary interruption must leave a card available for its required discard; a queued Truthtrance counts as already committed. A Bene Gesserit trigger permanently removes its token, then the beneficiary chooses an available effect outside the original supply for this group; unsupported copies remain visibly blocked.',
|
||||||
@@ -2196,7 +2197,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
|||||||
'A cyborg in the selected movement group lets that group move two territories. Suboids moving without a cyborg move one. Ornithopters allow three territories regardless of force type. A two-territory cyborg move has a Karama response; if canceled, the army remains in place and can choose a shorter move.',
|
'A cyborg in the selected movement group lets that group move two territories. Suboids moving without a cyborg move one. Ornithopters allow three territories regardless of force type. A two-territory cyborg move has a Karama response; if canceled, the army remains in place and can choose a shorter move.',
|
||||||
'Cyborgs collect three spice each. Suboids collect two, or three with ornithopters. Collection still requires the force to occupy the spice sector, outside the storm.',
|
'Cyborgs collect three spice each. Suboids collect two, or three with ornithopters. Collection still requires the force to occupy the spice sector, outside the storm.',
|
||||||
'Ixians have one free force revival, either type. Choose cyborgs-first or suboids-first in the revival form. Each paid cyborg costs three spice, each paid suboid two; a Tleilaxu ally discount rounds the paid total up after halving. The one-per-turn Sardaukar/Fedaykin restriction does not apply to cyborgs.',
|
'Ixians have one free force revival, either type. Choose cyborgs-first or suboids-first in the revival form. Each paid cyborg costs three spice, each paid suboid two; a Tleilaxu ally discount rounds the paid total up after halving. The one-per-turn Sardaukar/Fedaykin restriction does not apply to cyborgs.',
|
||||||
'Combat and substitution have tested engine, UI and AI support. Cyborg movement, collection and typed revival pricing also have tested support. The mobile stronghold and faction setup/auction technology now have tested support. The complete sector/timing/expansion audit remains unfinished, so expansion starts remain disabled.',
|
'Combat and substitution have tested engine, UI and AI support. Cyborg movement, collection and typed revival pricing also have tested support. The mobile stronghold and faction setup/auction technology now have tested support. The complete sector, timing and expansion audit remains unfinished; supported faction starts are available as previews.',
|
||||||
],
|
],
|
||||||
example:
|
example:
|
||||||
'Two cyborgs and six suboids dial six: lose two cyborgs (four strength) and four suboids (two strength). The two surviving suboids can replace the two lost cyborgs. Six suboids end in the tanks and two cyborgs remain on the board. In advanced play, the dial needs two spice for those cyborgs.',
|
'Two cyborgs and six suboids dial six: lose two cyborgs (four strength) and four suboids (two strength). The two surviving suboids can replace the two lost cyborgs. Six suboids end in the tanks and two cyborgs remain on the board. In advanced play, the dial needs two spice for those cyborgs.',
|
||||||
@@ -2215,7 +2216,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
|||||||
'Face-down leaders can become gholas, preserving their death history. A dead ghola stays associated with the Tleilaxu pool and can be revived again. Returning an existing member with Ghola treachery is distinct from acquiring a new foreign leader.',
|
'Face-down leaders can become gholas, preserving their death history. A dead ghola stays associated with the Tleilaxu pool and can be revived again. Returning an existing member with Ghola treachery is distinct from acquiring a new foreign leader.',
|
||||||
'A living ghola cannot be sold back. After it dies, its original faction may request a private buyback quote through revival commerce, even when all native leaders are unavailable. Tleilaxu may refuse. An accepted return costs the agreed price and uses the requester’s one-leader allowance.',
|
'A living ghola cannot be sold back. After it dies, its original faction may request a private buyback quote through revival commerce, even when all native leaders are unavailable. Tleilaxu may refuse. An accepted return costs the agreed price and uses the requester’s one-leader allowance.',
|
||||||
'A foreign-ghola revival opens a Karama response before payment or transfer. Cancellation prevents revival of that specific leader for the turn; another eligible dead leader may still be chosen. A separate response governs a paid discount.',
|
'A foreign-ghola revival opens a Karama response before payment or transfer. Cancellation prevents revival of that specific leader for the turn; another eligible dead leader may still be chosen. A separate response governs a paid discount.',
|
||||||
'Acquisition, private buybacks, identity and combat control have tested support. Complete timing, captive-pool counting, own-leader returns above a five-member pool, buyback/card exceptions and later leader-skill, homeworld and Ecaz interactions remain in the expansion audit. Expansion starts remain disabled.',
|
'Acquisition, private buybacks, identity and combat control have tested support. Complete timing, captive-pool counting, own-leader returns above a five-member pool, buyback/card exceptions and later leader-skill, homeworld and Ecaz interactions remain in the expansion audit. Supported expansion starts are available as unfinished previews.',
|
||||||
],
|
],
|
||||||
related: [
|
related: [
|
||||||
'tleilaxu-revival',
|
'tleilaxu-revival',
|
||||||
@@ -2238,7 +2239,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
|||||||
'For early leader revival, request a particular dead leader while at least one native leader remains available. Tleilaxu quote a price, possibly zero, and the requester accepts or withdraws. Only these two players see the request and price. With all native leaders unavailable, ordinary revival rules apply.',
|
'For early leader revival, request a particular dead leader while at least one native leader remains available. Tleilaxu quote a price, possibly zero, and the requester accepts or withdraws. Only these two players see the request and price. With all native leaders unavailable, ordinary revival rules apply.',
|
||||||
'An accepted early revival uses the normal one-leader allowance of the requesting faction. Kwisatz Haderach can also be requested. Tleilaxu can revive several of their own dead leaders in a phase, including before all five die.',
|
'An accepted early revival uses the normal one-leader allowance of the requesting faction. Kwisatz Haderach can also be requested. Tleilaxu can revive several of their own dead leaders in a phase, including before all five die.',
|
||||||
'The server pauses before a larger limit, discount or early revival takes effect. Karama can cancel that benefit. Forces and spice remain unchanged if the return is aborted; a canceled discount is repriced before payment. A separate response governs the payment to Tleilaxu after a successful return.',
|
'The server pauses before a larger limit, discount or early revival takes effect. Karama can cancel that benefit. Forces and spice remain unchanged if the return is aborted; a canceled discount is repriced before payment. A separate response governs the payment to Tleilaxu after a successful return.',
|
||||||
'Revival commerce and the private controls are tested. Exact cancellation duration, simultaneous card timing, special free-revival effects, foreign gholas and later expansion economy interactions remain in the complete rules audit. Full expansion starts remain disabled.',
|
'Revival commerce and the private controls are tested. Exact cancellation duration, simultaneous card timing, special free-revival effects, foreign gholas and later expansion economy interactions remain in the complete rules audit. Supported expansion starts are available as unfinished previews.',
|
||||||
],
|
],
|
||||||
related: [
|
related: [
|
||||||
'revival',
|
'revival',
|
||||||
@@ -2384,7 +2385,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
|||||||
category: 'Cards',
|
category: 'Cards',
|
||||||
coverage: 'Partial',
|
coverage: 'Partial',
|
||||||
summary:
|
summary:
|
||||||
'A poison weapon with an optional attack on both leaders. It is included in the local Ix prototype deck; normal expansion starts remain gated.',
|
'A poison weapon with an optional attack on both leaders. It is included in the local Ix prototype deck; supported expansion starts are available as unfinished previews.',
|
||||||
steps: [
|
steps: [
|
||||||
'Commit Poison Tooth in your weapon slot. After both plans are revealed, its owner chooses whether to activate it before traitor decisions proceed. Committing the card does not yet activate its poison.',
|
'Commit Poison Tooth in your weapon slot. After both plans are revealed, its owner chooses whether to activate it before traitor decisions proceed. Committing the card does not yet activate its poison.',
|
||||||
'When activated, the tooth attacks both leaders, including its owner’s leader. Chemistry in the defense slot protects that leader. Snooper and Shield Snooper do not protect against the tooth. A Chemistry card used as a weapon supplies no defense.',
|
'When activated, the tooth attacks both leaders, including its owner’s leader. Chemistry in the defense slot protects that leader. Snooper and Shield Snooper do not protect against the tooth. A Chemistry card used as a weapon supplies no defense.',
|
||||||
@@ -2401,7 +2402,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
|||||||
category: 'Cards',
|
category: 'Cards',
|
||||||
coverage: 'Partial',
|
coverage: 'Partial',
|
||||||
summary:
|
summary:
|
||||||
'An attack on both leaders that suppresses leader strength and bounty. Engine support exists; expansion decks remain unavailable.',
|
'An attack on both leaders that suppresses leader strength and bounty. Engine support exists; the Ix deck is available in supported unfinished expansion previews.',
|
||||||
steps: [
|
steps: [
|
||||||
'Play Artillery Strike in the weapon slot. It attacks both leaders. Each side protects its own leader with Shield or Shield Snooper. Weirding Way as projectile defense is not a shield and does not protect against this card.',
|
'Play Artillery Strike in the weapon slot. It attacks both leaders. Each side protects its own leader with Shield or Shield Snooper. Weirding Way as projectile defense is not a shield and does not protect against this card.',
|
||||||
'Surviving leaders contribute no battle strength. The implemented battle comparison uses the dials, with the aggressor winning ties; the attached Kwisatz Haderach bonus is also suppressed. The surviving KH token is not killed by Artillery Strike.',
|
'Surviving leaders contribute no battle strength. The implemented battle comparison uses the dials, with the aggressor winning ties; the attached Kwisatz Haderach bonus is also suppressed. The surviving KH token is not killed by Artillery Strike.',
|
||||||
@@ -2418,7 +2419,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
|||||||
category: 'Advanced & expansions',
|
category: 'Advanced & expansions',
|
||||||
coverage: 'Partial',
|
coverage: 'Partial',
|
||||||
summary:
|
summary:
|
||||||
'Poison Blade, Shield Snooper, Weirding Way and Chemistry have tested combat support. The fourteen-card inventory is assembled; live expansion starts await the remaining rules audit.',
|
'Poison Blade, Shield Snooper, Weirding Way and Chemistry have tested combat support. The fourteen-card inventory is assembled; supported faction starts are available as unfinished previews.',
|
||||||
steps: [
|
steps: [
|
||||||
'Poison Blade attacks with both projectile and poison. A defense against only one of those types does not save the leader. Shield Snooper defends against both types.',
|
'Poison Blade attacks with both projectile and poison. A defense against only one of those types does not save the leader. Shield Snooper defends against both types.',
|
||||||
'Shield Snooper counts as a shield for a lasgun explosion. Weirding Way used as projectile defense does not count as a shield: it neither stops a lasgun nor causes an explosion.',
|
'Shield Snooper counts as a shield for a lasgun explosion. Weirding Way used as projectile defense does not count as a shield: it neither stops a lasgun nor causes an explosion.',
|
||||||
@@ -2426,7 +2427,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
|||||||
'Voice can name one of these special cards directly or use a matching generic attack or defense type. A prohibition uses the role the card actually plays. For example, forbidding poison weapons still allows Chemistry as poison defense.',
|
'Voice can name one of these special cards directly or use a matching generic attack or defense type. A prohibition uses the role the card actually plays. For example, forbidding poison weapons still allows Chemistry as poison defense.',
|
||||||
'Compulsion uses the default role. Requiring a projectile weapon can compel Weirding Way as a weapon. Requiring a projectile defense cannot force a player to turn Weirding Way into that defense. Likewise, requiring a poison weapon cannot force Chemistry out of its default defense role.',
|
'Compulsion uses the default role. Requiring a projectile weapon can compel Weirding Way as a weapon. Requiring a projectile defense cannot force a player to turn Weirding Way into that defense. Likewise, requiring a poison weapon cannot force Chemistry out of its default defense role.',
|
||||||
'Prescience reveals the card occupying the requested slot. With a poison weapon and Weirding Way, a weapon question reveals the poison weapon; a defense question reveals Weirding Way. The other card remains private, and the revealed slot must remain unchanged.',
|
'Prescience reveals the card occupying the requested slot. With a poison weapon and Weirding Way, a weapon question reveals the poison weapon; a defense question reveals Weirding Way. The other card remains private, and the revealed slot must remain unchanged.',
|
||||||
'The local Ix prototype deals the full expansion deck through genuine setup. Poison Tooth and Artillery Strike have their own topics. Complete rules compliance and combined expansion interactions remain unfinished; prototype access does not open normal expansion starts.',
|
'The local Ix prototype deals the full expansion deck through genuine setup. Poison Tooth and Artillery Strike have their own topics. Complete rules compliance and combined expansion interactions remain unfinished; supported faction starts are labelled previews.',
|
||||||
],
|
],
|
||||||
related: [
|
related: [
|
||||||
'battle',
|
'battle',
|
||||||
@@ -4148,7 +4149,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
|||||||
'Sneak Attack expressly permits its reserve forces to enter despite Aftermath. Its storm and occupancy restrictions still apply.',
|
'Sneak Attack expressly permits its reserve forces to enter despite Aftermath. Its storm and occupancy restrictions still apply.',
|
||||||
'Beginning on the activation turn, Moritani’s hand limit and its ally’s at activation are each reduced by one. If either hand exceeds its reduced limit on resolution, discard one random card per excess card. The public Aftermath notice identifies the affected players; their individual projected hand limits reflect the penalty.',
|
'Beginning on the activation turn, Moritani’s hand limit and its ally’s at activation are each reduced by one. If either hand exceeds its reduced limit on resolution, discard one random card per excess card. The public Aftermath notice identifies the affected players; their individual projected hand limits reflect the penalty.',
|
||||||
'Under the recommended persistent-target interpretation, later Nexus or Enemy of My Enemy alliances do not move the penalty: Moritani and the ally at detonation remain reduced; a later ally keeps its normal limit. An initially unallied detonation gains no ally target afterward. The notice labels this provisional, not a publisher ruling. Original stored targets migrate without replaying casualties or card discards. Genuine Basic/Advanced later-pact, special-alliance, migration and corruption boundaries pass112/112 in6 related files, with types/lint/build and actual390px controls verified. Broader Atomics compositions and complete modes remain open.',
|
'Under the recommended persistent-target interpretation, later Nexus or Enemy of My Enemy alliances do not move the penalty: Moritani and the ally at detonation remain reduced; a later ally keeps its normal limit. An initially unallied detonation gains no ally target afterward. The notice labels this provisional, not a publisher ruling. Original stored targets migrate without replaying casualties or card discards. Genuine Basic/Advanced later-pact, special-alliance, migration and corruption boundaries pass112/112 in6 related files, with types/lint/build and actual390px controls verified. Broader Atomics compositions and complete modes remain open.',
|
||||||
'The Atomics Terror token and Family Atomics Treachery Card are separate components with different effects. Aftermath is not the destroyed Shield Wall. Complete Moritani games and public expansion starts remain unavailable.',
|
'The Atomics Terror token and Family Atomics Treachery Card are separate components with different effects. Aftermath is not the destroyed Shield Wall. Complete Moritani-game acceptance remains open; supported expansion starts are unfinished previews.',
|
||||||
],
|
],
|
||||||
related: ['moritani-terror-effects', 'movement', 'card-atomics', 'bidding'],
|
related: ['moritani-terror-effects', 'movement', 'card-atomics', 'bidding'],
|
||||||
checklist: [
|
checklist: [
|
||||||
@@ -4442,7 +4443,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
|||||||
'When neither Guild nor Fremen is playing and nobody has reached the normal target, compare individual qualifying stronghold counts. Every player tied for the highest count wins. A correct Bene Gesserit prediction can replace this stronghold win.',
|
'When neither Guild nor Fremen is playing and nobody has reached the normal target, compare individual qualifying stronghold counts. Every player tied for the highest count wins. A correct Bene Gesserit prediction can replace this stronghold win.',
|
||||||
'With tech tokens enabled, owning all three adds one stronghold. One player must hold all three, even in an alliance. If several sides reach their target at the same check, they share a normal win before any correct prediction replaces it.',
|
'With tech tokens enabled, owning all three adds one stronghold. One player must hold all three, even in an alliance. If several sides reach their target at the same check, they share a normal win before any correct prediction replaces it.',
|
||||||
'Stronghold victory progress shows current territories, a complete Tech Token set, Ecaz joint occupation and Fremen final-turn conditions. Basic permits reciprocal Fremen/Ecaz cooccupation at Tabr; supplied Advanced p32 permits both protected sietches. Solitary/nonallied Ecaz still blocks. Public counts do not award victory before the proper checkpoint; Tech Tokens cannot supply joint occupation.',
|
'Stronghold victory progress shows current territories, a complete Tech Token set, Ecaz joint occupation and Fremen final-turn conditions. Basic permits reciprocal Fremen/Ecaz cooccupation at Tabr; supplied Advanced p32 permits both protected sietches. Solitary/nonallied Ecaz still blocks. Public counts do not award victory before the proper checkpoint; Tech Tokens cannot supply joint occupation.',
|
||||||
'Other expansion additions to victory remain in development. Advanced preview supports the six classic factions; expansion starts remain disabled.',
|
'Other expansion additions to victory remain in development. Advanced preview supports selected factions and combinations; complete rules acceptance remains open.',
|
||||||
],
|
],
|
||||||
example:
|
example:
|
||||||
'At the final turn with neither Guild nor Fremen, two players each hold two qualifying strongholds and a third holds one. The two leaders of the count share the win.',
|
'At the final turn with neither Guild nor Fremen, two players each hold two qualifying strongholds and a third holds one. The two leaders of the count share the win.',
|
||||||
@@ -4569,7 +4570,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
|||||||
'Carthag, Habbanya, Sietch Tabr and Tuek’s Sietch retain their existing defense, tie, opposing-dial and played-Worthless contracts. New Richese coverage uses actual No-Field shipment/reveal and native cache acquisition for Stone Burner; mixed No-Field dials/full-plan and unresolved Stone/Poison Tooth cases are not silently enabled.',
|
'Carthag, Habbanya, Sietch Tabr and Tuek’s Sietch retain their existing defense, tie, opposing-dial and played-Worthless contracts. New Richese coverage uses actual No-Field shipment/reveal and native cache acquisition for Stone Burner; mixed No-Field dials/full-plan and unresolved Stone/Poison Tooth cases are not silently enabled.',
|
||||||
'Shared Ecaz control holds the card at Ecaz; the selected lead gets only its own held advantage. Ecaz-led Arrakeen may bank-fund actual ally-variable support up to two, never fixed free Ecaz strength. Choosing the ally gives no automatically shared card benefit. Original Habbanya tie and Tabr income likewise follow the actual holder-plan.',
|
'Shared Ecaz control holds the card at Ecaz; the selected lead gets only its own held advantage. Ecaz-led Arrakeen may bank-fund actual ally-variable support up to two, never fixed free Ecaz strength. Choosing the ally gives no automatically shared card benefit. Original Habbanya tie and Tabr income likewise follow the actual holder-plan.',
|
||||||
'Native Moritani losing Tuek holder still earns two bank spice per played Worthless card. Original post-loss assassination follows support/card income, retains only printed bounty and one actual private Mentat replacement. Winner cleanup and force losses finish once; normal Traitor revelation forfeits assassination for the game. Native Terror placement remains free.',
|
'Native Moritani losing Tuek holder still earns two bank spice per played Worthless card. Original post-loss assassination follows support/card income, retains only printed bounty and one actual private Mentat replacement. Winner cleanup and force losses finish once; normal Traitor revelation forfeits assassination for the game. Native Terror placement remains free.',
|
||||||
'Bounded expanded-family evidence includes sixteen rule cases, eleven actual No-Field/Stone/FaceDance program cases, all four legal policies and eighteen unstaged complete paired/mixed2..6 games (11066 accepted actions, no rejections). Human390px Stone kill/Habbanya and two-reserve Face Dance controls complete their native decisions. Save/recovery/privacy/custody assurance follows all rules, not a new prototype gate. Full-card/faction/module/deployed acceptance and public expansion starts remain open.',
|
'Bounded expanded-family evidence includes sixteen rule cases, eleven actual No-Field/Stone/FaceDance program cases, all four legal policies and eighteen unstaged complete paired/mixed2..6 games (11066 accepted actions, no rejections). Human390px Stone kill/Habbanya and two-reserve Face Dance controls complete their native decisions. Save/recovery/privacy/custody assurance follows all rules, not a new prototype gate. Full-card, faction, module and deployed acceptance remain open; supported expansion starts are unfinished previews.',
|
||||||
],
|
],
|
||||||
related: ['stronghold-cards', 'mobile-stronghold', 'choam-combat', 'setup', 'implementation-checklist'],
|
related: ['stronghold-cards', 'mobile-stronghold', 'choam-combat', 'setup', 'implementation-checklist'],
|
||||||
checklist: [
|
checklist: [
|
||||||
@@ -4846,7 +4847,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
|||||||
'Cards fixed in your sealed battle plan or committed to prescience cannot be cashed in. You must also retain enough spice, committed allied funding or another Karama to honor a current winning auction bid.',
|
'Cards fixed in your sealed battle plan or committed to prescience cannot be cashed in. You must also retain enough spice, committed allied funding or another Karama to honor a current winning auction bid.',
|
||||||
'Cash-in takes effect immediately and preserves a pending phase opening, revival, response, market sale or allied exchange. If it consumes a card already offered for a market sale or trade, that transaction later pays nothing or moves neither card. In the Kull preview, a declared original or counter cost remains reserved while that transaction is pending.',
|
'Cash-in takes effect immediately and preserves a pending phase opening, revival, response, market sale or allied exchange. If it consumes a card already offered for a market sale or trade, that transaction later pays nothing or moves neither card. In the Kull preview, a declared original or counter cost remains reserved while that transaction is pending.',
|
||||||
'The battle preparation guide can find a cash-in that funds a promised plan while retaining required cards. Complete the listed preparation before reviewing and sealing the plan. This can combine with Ghola preparation when both remain possible.',
|
'The battle preparation guide can find a cash-in that funds a promised plan while retaining required cards. Complete the listed preparation before reviewing and sealing the plan. This can combine with Ghola preparation when both remain possible.',
|
||||||
'The power is available in all nine playing phases. Finish an active Truthtrance question first. Its precise timing against other simultaneous effects, activation-card payment interpretation and remaining expansion interactions are still under audit; full CHOAM starts remain disabled.',
|
'The power is available in all nine playing phases. Finish an active Truthtrance question first. Its precise timing against other simultaneous effects, activation-card payment interpretation and remaining expansion interactions are still under audit; supported CHOAM starts are unfinished previews.',
|
||||||
],
|
],
|
||||||
related: [
|
related: [
|
||||||
'faction-choam',
|
'faction-choam',
|
||||||
@@ -4873,7 +4874,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
|||||||
'Once per turn, offer one of your cards to your ally. The ally chooses a card to return or declines. CHOAM then confirms or declines the proposed exchange. Confirmation moves both cards together and spends the turn’s trade; a decline moves neither card.',
|
'Once per turn, offer one of your cards to your ally. The ally chooses a card to return or declines. CHOAM then confirms or declines the proposed exchange. Confirmation moves both cards together and spends the turn’s trade; a decline moves neither card.',
|
||||||
'Only the two allies see the proposed cards. A private exchange does not reveal the rest of either hand. Card counts stay unchanged. If an intervening effect makes a sale or exchange impossible, it pays nothing and returns to the closing decision.',
|
'Only the two allies see the proposed cards. A private exchange does not reveal the rest of either hand. Card counts stay unchanged. If an intervening effect makes a sale or exchange impossible, it pays nothing and returns to the closing decision.',
|
||||||
'Truthtrance can interrupt these decisions. Complete its question before returning to the sale or trade. Existing end-of-phase tech income and unspent allied escrow settle after the market closes.',
|
'Truthtrance can interrupt these decisions. Complete its question before returning to the sale or trade. Existing end-of-phase tech income and unspent allied escrow settle after the market closes.',
|
||||||
'These actions have focused tests. Batch-sale timing, exact Karama scope, ordering among simultaneous end-phase effects and the remaining Worthless special effects still require a combined-expansion audit; CHOAM starts remain disabled.',
|
'These actions have focused tests. Batch-sale timing, exact Karama scope, ordering among simultaneous end-phase effects and the remaining Worthless special effects still require a combined-expansion audit; supported CHOAM starts are unfinished previews.',
|
||||||
],
|
],
|
||||||
related: [
|
related: [
|
||||||
'faction-choam',
|
'faction-choam',
|
||||||
@@ -4897,7 +4898,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
|||||||
'At the next Mentat Pause, the token flips automatically. At the following Mentat it is removed permanently. Amal’s phase-opening window resolves before those automatic changes.',
|
'At the next Mentat Pause, the token flips automatically. At the following Mentat it is removed permanently. Amal’s phase-opening window resolves before those automatic changes.',
|
||||||
'Karama can prevent initial placement for this Mentat Pause. The token remains available for a later attempt. Karama cannot stop the mandatory flip or removal. Canceling CHOAM income during Double preserves doubled ordinary payouts from the bank.',
|
'Karama can prevent initial placement for this Mentat Pause. The token remains available for a later attempt. Karama cannot stop the mandatory flip or removal. Canceling CHOAM income during Double preserves doubled ordinary payouts from the bank.',
|
||||||
'Bribes are prohibited whenever the active token shows Double, including immediately after placement. Previously promised bribes still settle at Mentat. Spice Production’s payout is unchanged, and CHOAM’s automatic income alone does not trigger it.',
|
'Bribes are prohibited whenever the active token shows Double, including immediately after placement. Previously promised bribes still settle at Mentat. Spice Production’s payout is unchanged, and CHOAM’s automatic income alone does not trigger it.',
|
||||||
'Lifecycle, response, payment and AI scenarios have focused tests. The exact ordinary one-spice interpretation and interactions with unfinished expansion modules remain under audit; full CHOAM starts are still disabled.',
|
'Lifecycle, response, payment and AI scenarios have focused tests. The exact ordinary one-spice interpretation and interactions with unfinished expansion modules remain under audit; supported CHOAM starts are unfinished previews.',
|
||||||
],
|
],
|
||||||
related: [
|
related: [
|
||||||
'charity',
|
'charity',
|
||||||
@@ -4924,7 +4925,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
|||||||
'Only CHOAM receives the inspected faces. Its private snapshot survives refresh and the transition out of Battle, and expires at the next battle or turn. It does not track later changes in the opposing hand and needs no confirmation to continue.',
|
'Only CHOAM receives the inspected faces. Its private snapshot survives refresh and the transition out of Battle, and expires at the next battle or turn. It does not track later changes in the opposing hand and needs no confirmation to continue.',
|
||||||
'The Auditor cannot be captured, acquired as a foreign ghola by Tleilaxu, or receive a leader skill. CHOAM’s own Ghola card can revive it. Supplied Advanced p29 permits ordinary revival each turn even after repeated deaths, for two spice before discounts, using the usual one-leader allowance.',
|
'The Auditor cannot be captured, acquired as a foreign ghola by Tleilaxu, or receive a leader skill. CHOAM’s own Ghola card can revive it. Supplied Advanced p29 permits ordinary revival each turn even after repeated deaths, for two spice before discounts, using the usual one-leader allowance.',
|
||||||
'Against Moritani, a surviving actual Auditor2 win can open the distinct Advanced native-CHOAM assassination choice. Conversely its matching held Traitor may target Auditor for printed two when a different CHOAM disc survived. The played Auditor is excluded from its own card, while the uniform private opportunity still permits Continue with no spend. Original Mentat retires a revealed card face up and draws one distinct private replacement.',
|
'Against Moritani, a surviving actual Auditor2 win can open the distinct Advanced native-CHOAM assassination choice. Conversely its matching held Traitor may target Auditor for printed two when a different CHOAM disc survived. The played Auditor is excluded from its own card, while the uniform private opportunity still permits Continue with no spend. Original Mentat retires a revealed card face up and draws one distinct private replacement.',
|
||||||
'The ordinary-cycle first version explicitly excludes Auditor from the five ordinary CHOAM discs: its life or repeated deaths neither delay nor open that cohort. This is a visibly provisional policy, not a publisher clarification or numerical user ruling. Full expansion starts remain disabled.',
|
'The ordinary-cycle first version explicitly excludes Auditor from the five ordinary CHOAM discs: its life or repeated deaths neither delay nor open that cohort. This is a visibly provisional policy, not a publisher clarification or numerical user ruling. Supported expansion starts are available as unfinished previews.',
|
||||||
],
|
],
|
||||||
example:
|
example:
|
||||||
'CHOAM loses a battle but its Auditor survives. The opponent keeps a played Shield and has one unplayed Crysknife. Only Crysknife is eligible: the opponent can pay one spice to CHOAM or let CHOAM inspect it.',
|
'CHOAM loses a battle but its Auditor survives. The opponent keeps a played Shield and has one unplayed Crysknife. Only Crysknife is eligible: the opponent can pay one spice to CHOAM or let CHOAM inspect it.',
|
||||||
@@ -4992,7 +4993,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
|||||||
'A canceled request within the new allowance uses the new price. If it is too large or cannot be paid, no forces or spice move; choose another request. Completed earlier revivals remain intact.',
|
'A canceled request within the new allowance uses the new price. If it is too large or cannot be paid, no forces or spice move; choose another request. Completed earlier revivals remain intact.',
|
||||||
'Fremen may grant their allied CHOAM three free revivals. The free allowance is tracked across requests. Tleilaxu may separately offer its ally half price, rounded up on the total payment; canceling that discount retains CHOAM’s native price if it is still active.',
|
'Fremen may grant their allied CHOAM three free revivals. The free allowance is tracked across requests. Tleilaxu may separately offer its ally half price, rounded up on the total payment; canceling that discount retains CHOAM’s native price if it is still active.',
|
||||||
'Emperor-funded extra revivals keep their separate allowance and price. Advanced Tleilaxu special Karama can prevent the normal request before either pricing response. Revival payments go to Tleilaxu when present, with a separate income response.',
|
'Emperor-funded extra revivals keep their separate allowance and price. Advanced Tleilaxu special Karama can prevent the normal request before either pricing response. Revival payments go to Tleilaxu when present, with a separate income response.',
|
||||||
'Force revival has tested support. Auditor’s each-turn return and provisional five-ordinary-disc cycles are described in its topic. Combined-expansion pricing and the complete faction audit remain unfinished; CHOAM starts stay disabled.',
|
'Force revival has tested support. Auditor’s each-turn return and provisional five-ordinary-disc cycles are described in its topic. Combined-expansion pricing and the complete faction audit remain unfinished; supported CHOAM starts are unfinished previews.',
|
||||||
],
|
],
|
||||||
related: [
|
related: [
|
||||||
'revival',
|
'revival',
|
||||||
@@ -6615,7 +6616,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
|||||||
developmentStage: 'Prototyped',
|
developmentStage: 'Prototyped',
|
||||||
summary: 'Genuine setup connects selected expansion factions to development tables. Complete faction rules and combined-game acceptance remain unfinished.',
|
summary: 'Genuine setup connects selected expansion factions to development tables. Complete faction rules and combined-game acceptance remain unfinished.',
|
||||||
steps: [
|
steps: [
|
||||||
'Development setup supports two through six distinct seats from the base factions and selected expansion sets. Expansion selection and optional modules are separate; public expansion starts remain disabled.',
|
'Development setup supports two through six distinct seats from the base factions and selected expansion sets. Expansion selection and optional modules are separate; supported public starts are unfinished previews.',
|
||||||
'Ecaz places six starting forces in Imperial Basin, allocated among sectors 9, 10 and 11, and keeps fourteen in reserve. Finish Fremen placement first; Bene Gesserit then places its Advanced starting advisor. Moritani places its six forces in an unoccupied territory after all other setup is complete.',
|
'Ecaz places six starting forces in Imperial Basin, allocated among sectors 9, 10 and 11, and keeps fourteen in reserve. Finish Fremen placement first; Bene Gesserit then places its Advanced starting advisor. Moritani places its six forces in an unoccupied territory after all other setup is complete.',
|
||||||
'Ixians keep their private starting-card selection and physical cyborg/suboid forces. Tleilaxu receives three private Face Dancers. Advanced CHOAM receives its Auditor. Richese has a separate ten-card cache and three private No-Fields. Ecaz and Moritani receive their Ambassador and Terror inventories and share one Duke Vidal disc.',
|
'Ixians keep their private starting-card selection and physical cyborg/suboid forces. Tleilaxu receives three private Face Dancers. Advanced CHOAM receives its Auditor. Richese has a separate ten-card cache and three private No-Fields. Ecaz and Moritani receive their Ambassador and Terror inventories and share one Duke Vidal disc.',
|
||||||
'Without Ix, CHOAM adds Poison Tooth and Artillery Strike to the 33-card ordinary deck; Ix or combined decks contain47. Ecaz faction selection adds no cards. Explicit independent variant adds Recruits/Harass/Reinforcements for36/50/38, with classic/paired controls and a separately verified native Advanced Occupy combined-army path.',
|
'Without Ix, CHOAM adds Poison Tooth and Artillery Strike to the 33-card ordinary deck; Ix or combined decks contain47. Ecaz faction selection adds no cards. Explicit independent variant adds Recruits/Harass/Reinforcements for36/50/38, with classic/paired controls and a separately verified native Advanced Occupy combined-army path.',
|
||||||
@@ -6659,7 +6660,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
|||||||
steps: [
|
steps: [
|
||||||
...(id === 'choam-modules'
|
...(id === 'choam-modules'
|
||||||
? [
|
? [
|
||||||
'Richese cache and Black Market auction controls are integrated in development fixtures, alongside the ten-card reference collection. Remaining card-effect integration is incomplete and full expansion starts remain disabled; source guards and pending verification are listed in the collection’s five-part checklist.',
|
'Richese cache and Black Market auction controls are integrated in development fixtures, alongside the ten-card reference collection. Remaining card-effect integration is incomplete and supported expansion starts are unfinished previews; source guards and pending verification are listed in the collection’s five-part checklist.',
|
||||||
]
|
]
|
||||||
: []),
|
: []),
|
||||||
...(id === 'ix-modules'
|
...(id === 'ix-modules'
|
||||||
|
|||||||
@@ -0,0 +1,110 @@
|
|||||||
|
import assert from 'node:assert/strict';
|
||||||
|
import test from 'node:test';
|
||||||
|
import { viewGame, type Game } from '../game/engine';
|
||||||
|
import { botActions } from '../game/bots';
|
||||||
|
import { DIFFICULTIES } from '../game/bot-profiles';
|
||||||
|
import { act, player, createBasicNativeOverlapFixture, type First, type Native } from './fixture-basic-native-overlap';
|
||||||
|
|
||||||
|
function decline(game:Game, owner:First):Game {
|
||||||
|
if (owner==='ambassador') {
|
||||||
|
const pending=game.pendingAmbassador; assert.ok(pending);
|
||||||
|
return act(game,'ecaz',{type:'decision',event:pending.event,decline:true});
|
||||||
|
}
|
||||||
|
assert.ok(game.pendingTerrorEntry);
|
||||||
|
return act(game,'moritani',{type:'decision',decline:true});
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const native of ['ixians','tleilaxu'] as const satisfies readonly Native[])
|
||||||
|
for (const first of ['ambassador','terror'] as const satisfies readonly First[]) {
|
||||||
|
void test(`Basic ${native} native roster preserves the original shipment through ${first}-first overlapping arrivals`,()=>{
|
||||||
|
const f=createBasicNativeOverlapFixture(native,first),initial=f.game;
|
||||||
|
const spice=player(initial,f.entrant).spice,reserves=player(initial,f.entrant).reserves;
|
||||||
|
const offered=act(initial,f.entrant,f.shipment);
|
||||||
|
assert.equal(player(offered,f.entrant).spice,spice-1);
|
||||||
|
assert.equal(player(offered,f.entrant).reserves,reserves-1);
|
||||||
|
assert.equal(player(offered,f.entrant).forces[`${f.destination}:${f.sector}`],1);
|
||||||
|
assert.equal(player(offered,f.entrant).shipped,true);
|
||||||
|
assert.equal(offered.pendingArrivalOverlap?.first,first);
|
||||||
|
assert.equal(offered.pendingArrivalOverlap?.stage,'first');
|
||||||
|
assert.equal(offered.pendingArrivalOverlap?.entrant,f.entrant);
|
||||||
|
assert.equal(viewGame(offered,f.entrant).arrivalOverlap?.first,first);
|
||||||
|
const other:First=first==='ambassador'?'terror':'ambassador';
|
||||||
|
const second=decline(offered,first);
|
||||||
|
assert.equal(second.pendingArrivalOverlap?.first,first);
|
||||||
|
assert.equal(second.pendingArrivalOverlap?.stage,'second');
|
||||||
|
assert.equal(player(second,f.entrant).spice,spice-1);
|
||||||
|
assert.equal(player(second,f.entrant).forces[`${f.destination}:${f.sector}`],1);
|
||||||
|
const settled=decline(second,other);
|
||||||
|
assert.equal(settled.pendingArrivalOverlap,null);
|
||||||
|
assert.equal(settled.pendingAmbassador,null);
|
||||||
|
assert.equal(settled.pendingTerrorEntry,null);
|
||||||
|
assert.equal(player(settled,f.entrant).spice,spice-1);
|
||||||
|
assert.equal(player(settled,f.entrant).reserves,reserves-1);
|
||||||
|
assert.equal(player(settled,f.entrant).forces[`${f.destination}:${f.sector}`],1);
|
||||||
|
assert.equal(settled.ecazAmbassadors?.tokens.find(t=>t.id===f.token)?.zone,'placed');
|
||||||
|
assert.equal(settled.moritaniTerror?.tokens.find(t=>t.id===f.terror)?.status,'placed');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void test('all minimal bot profiles can legally handle the first mixed-native overlap decision',()=>{
|
||||||
|
const f=createBasicNativeOverlapFixture('ixians','ambassador');
|
||||||
|
const offered=act(f.game,f.entrant,f.shipment);
|
||||||
|
for(const difficulty of DIFFICULTIES){
|
||||||
|
const view=viewGame(offered,'ecaz');
|
||||||
|
view.players.find(p=>p.id==='ecaz')!.bot=difficulty;
|
||||||
|
const action=botActions(view)[0]; assert.ok(action,difficulty);
|
||||||
|
const after=act(offered,'ecaz',action);
|
||||||
|
assert.ok(after.pendingArrivalOverlap || after.pendingTerrorEntry || after.pendingAmbassador,
|
||||||
|
'The bot choice enters the same real arrival continuation');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
for (const first of ['ambassador','terror'] as const satisfies readonly First[]) {
|
||||||
|
void test(`Basic mixed-native ${first}-first arrival settles Duke acquisition and Robbery once`,()=>{
|
||||||
|
const f=createBasicNativeOverlapFixture('tleilaxu',first);
|
||||||
|
const guildBefore=player(f.game,f.entrant).spice;
|
||||||
|
const moritaniBefore=player(f.game,f.moritani).spice;
|
||||||
|
let game=act(f.game,f.entrant,f.shipment);
|
||||||
|
const afterInvoice=guildBefore-1, stolen=Math.ceil(afterInvoice/2);
|
||||||
|
for(const owner of [first,first==='ambassador'?'terror':'ambassador'] as const){
|
||||||
|
if(owner==='ambassador'){
|
||||||
|
const entry=game.pendingAmbassador; assert.ok(entry);
|
||||||
|
game=act(game,f.owner,{type:'decision',event:entry.event,trigger:true,
|
||||||
|
beneficiary:f.owner,choice:'duke'});
|
||||||
|
assert.equal(game.dukeVidal?.controller,f.owner);
|
||||||
|
assert.equal(game.ecazAmbassadors?.tokens.find(t=>t.id===f.token)?.zone,'supply');
|
||||||
|
}else{
|
||||||
|
assert.equal(game.pendingTerrorEntry?.stage,'offer');
|
||||||
|
game=act(game,f.moritani,{type:'decision',reveal:true});
|
||||||
|
assert.equal(game.pendingTerrorEntry?.stage,'robbery');
|
||||||
|
game=act(game,f.moritani,{type:'decision',choice:'spice'});
|
||||||
|
assert.equal(player(game,f.entrant).spice,afterInvoice-stolen);
|
||||||
|
assert.equal(player(game,f.moritani).spice,moritaniBefore+stolen);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assert.equal(game.pendingArrivalOverlap,null);
|
||||||
|
assert.equal(game.moritaniTerror?.tokens.find(t=>t.id===f.terror)?.status,'removed');
|
||||||
|
assert.equal(player(game,f.entrant).forces[`${f.destination}:${f.sector}`],1);
|
||||||
|
assert.equal(player(game,f.entrant).shipped,true);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void test('a real native Tleilaxu shipment triggers both reactions and resumes with physical forces',()=>{
|
||||||
|
const f=createBasicNativeOverlapFixture('tleilaxu','terror','native');
|
||||||
|
const initial=f.game, before=player(initial,f.entrant).spice;
|
||||||
|
let game=act(initial,f.entrant,f.shipment);
|
||||||
|
assert.equal(game.pendingArrivalOverlap?.entrant,'tleilaxu');
|
||||||
|
assert.equal(game.pendingArrivalOverlap?.first,'terror');
|
||||||
|
assert.equal(player(game,f.entrant).spice,before-1);
|
||||||
|
assert.equal(player(game,f.entrant).forces[`${f.destination}:${f.sector}`],1);
|
||||||
|
game=act(game,f.moritani,{type:'decision',reveal:true});
|
||||||
|
assert.equal(game.pendingTerrorEntry?.stage,'robbery');
|
||||||
|
game=act(game,f.moritani,{type:'decision',choice:'spice'});
|
||||||
|
const pending=game.pendingAmbassador; assert.ok(pending);
|
||||||
|
game=act(game,f.owner,{type:'decision',event:pending.event,trigger:true,
|
||||||
|
beneficiary:f.owner,choice:'duke'});
|
||||||
|
assert.equal(game.dukeVidal?.controller,f.owner);
|
||||||
|
assert.equal(game.pendingArrivalOverlap,null);
|
||||||
|
assert.equal(player(game,f.entrant).forces[`${f.destination}:${f.sector}`],1);
|
||||||
|
assert.equal(player(game,f.entrant).shipped,true);
|
||||||
|
});
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
import assert from 'node:assert/strict';
|
||||||
|
import { createGame, joinGame, newPlayer, type Action, type Game } from '../game/engine';
|
||||||
|
import { placeAmbassador } from '../game/ecaz-ambassadors';
|
||||||
|
import { placeTerror } from '../game/moritani-terror';
|
||||||
|
import { actBasicSemutaAmbassador, advanceBasicSemutaAmbassador, basicSemutaAmbassadorClean,
|
||||||
|
basicSemutaAmbassadorPlayer, type BasicSemutaAmbassadorStep } from './fixture-basic-semuta-ambassador';
|
||||||
|
|
||||||
|
export const act = actBasicSemutaAmbassador;
|
||||||
|
export const player = basicSemutaAmbassadorPlayer;
|
||||||
|
export const advance = advanceBasicSemutaAmbassador;
|
||||||
|
export type Native = 'ixians' | 'tleilaxu';
|
||||||
|
export type First = 'ambassador' | 'terror';
|
||||||
|
|
||||||
|
/** A real public five-seat selected-deck Basic start. All actual setup, phase
|
||||||
|
* choices and owned shipment are native. At the original first movement turn,
|
||||||
|
* two legal marker placements are explicitly controlled on their existing
|
||||||
|
* physical tokens; no resource, force, pending reaction or receipt is staged. */
|
||||||
|
export function createBasicNativeOverlapFixture(native: Native, first: First, entrantKind: 'guild' | 'native' = 'guild') {
|
||||||
|
const entrant = entrantKind === 'native' ? native : 'guild';
|
||||||
|
let game = createGame('BASICNATIVEOVERLAP',newPlayer('ecaz','Ecaz','ecaz'),false,['ecaz','choam','ix']);
|
||||||
|
for (const faction of ['choam',native,'guild','moritani'] as const)
|
||||||
|
joinGame(game,newPlayer(faction,faction,faction));
|
||||||
|
const actions: BasicSemutaAmbassadorStep[] = [];
|
||||||
|
const send = (actor: string, action: Action) => {game=act(game,actor,action,actions);};
|
||||||
|
const reach = (until: (g: Game)=>boolean) => {game=advance(game,until,actions);};
|
||||||
|
// The real lobby circle choices choose the storm ordering; no saved order is edited.
|
||||||
|
send('guild',{type:'seatPosition',position:6});
|
||||||
|
if (first === 'terror') send('moritani',{type:'seatPosition',position:4});
|
||||||
|
send('ecaz',{type:'seatPosition',position:first === 'ambassador' ? 4 : 5});
|
||||||
|
send('choam',{type:'seatPosition',position:1});
|
||||||
|
send(native,{type:'seatPosition',position:2});
|
||||||
|
for (const seat of game.players) send(seat.id,{type:'ready'});
|
||||||
|
const lobby=structuredClone(game);
|
||||||
|
send('ecaz',{type:'start'});
|
||||||
|
const setup=structuredClone(game);
|
||||||
|
assert.equal(game.status,'setup');
|
||||||
|
assert.equal(game.advanced,false);
|
||||||
|
assert.ok(!game.semutaPreview && !game.kullPreview && !game.nexusCards && !game.leaderSkills && !game.homeworlds);
|
||||||
|
reach(g=>g.status==='playing');
|
||||||
|
const afterSetup=structuredClone(game);
|
||||||
|
assert.ok(game.ecazAmbassadors && game.moritaniTerror);
|
||||||
|
// Pick a known ordinary unopened Spice draw; this does not stage its result.
|
||||||
|
const spice=game.spiceDeck.findIndex(card=>'territory' in card && !card.discovery);
|
||||||
|
assert.ok(spice>=0);
|
||||||
|
game.spiceDeck.unshift(game.spiceDeck.splice(spice,1)[0]);
|
||||||
|
reach(g=>g.turn===1 && g.phase===5 && g.active===entrant && basicSemutaAmbassadorClean(g));
|
||||||
|
assert.equal(game.order.indexOf('ecaz')<game.order.indexOf('moritani'),first==='ambassador');
|
||||||
|
const beforeMarkers=structuredClone(game);
|
||||||
|
const token=game.ecazAmbassadors!.tokens.find(t=>t.effect==='ecaz' && t.zone==='supply');
|
||||||
|
const terror=game.moritaniTerror!.tokens.find(t=>t.kind==='robbery' && t.status==='available');
|
||||||
|
assert.ok(token && terror);
|
||||||
|
const destination='habbanya_ridge_sietch',sector=17;
|
||||||
|
game.ecazAmbassadors=placeAmbassador(game.ecazAmbassadors!,token.id,{
|
||||||
|
turn:game.turn,availableSpice:player(game,'ecaz').spice,
|
||||||
|
destination:{id:destination,stronghold:true,inStorm:false,allowed:true},
|
||||||
|
}).state;
|
||||||
|
game.moritaniTerror=placeTerror(game.moritaniTerror!,terror.id,destination,game.turn);
|
||||||
|
const source=structuredClone(game);
|
||||||
|
const shipment: Action={type:'ship',territory:destination,sector,amount:1,elite:0,allyPayment:0};
|
||||||
|
return {game,source,lobby,setup,afterSetup,beforeMarkers,actions,first,native,
|
||||||
|
entrant,owner:'ecaz',moritani:'moritani',destination,sector,token:token.id,terror:terror.id,shipment,
|
||||||
|
staging:'Actual public lobby, setup and turn-one native controls. Two existing supply tokens are placed by their native pure placement helpers at the clean entrant turn; no receipt, pending action, force, purse, seat or order is staged. One unopened ordinary Spice card is selected.'};
|
||||||
|
}
|
||||||
Reference in new issue
Block a user