Compose selected native World independent cards
This commit is contained in:
1 parent
f5b7ebc8da
commit
cda9338f13
18 files changed
+1292
-40
No files matched your search
@@ -118,10 +118,10 @@ export function cardPresentation(card: VisibleCard): CardPresentation {
|
||||
guidance: ecaz.summary,
|
||||
gameplay: ecaz.gameplay,
|
||||
availability: ecaz.card.effect === 'recruits'
|
||||
? 'Recruits has development controls during Revival, including classic Basic/Advanced Homeworlds with original Tech3+ and Advanced Strongholds2+. Selected Ix/CHOAM composes those phase modules separately without Homeworlds. Double the current native free rate within the seven-force total; typed deposits, special-force caps and original once-per-phase Axlotl income stay. Prior paid returns keep payment under the provisional no-refund policy; pending transactions, unknown ledgers, later Fremen grants and replay remain guarded.'
|
||||
? 'Recruits has Revival controls in classic and selected Ix/CHOAM Basic/Advanced Worlds. Selected-family Worlds retain original native setup without other modules; base-deck classic Worlds may also retain Tech3+ and Advanced Strongholds2+. Double current native free rates within the ordinary seven-force total; native unlimited allowances, typed deposits and special-force caps stay. Prior paid returns keep payment under the provisional no-refund policy. Pending transactions, unknown ledgers, later Fremen grants and replay remain guarded.'
|
||||
: ecaz.card.effect === 'harassWithdraw'
|
||||
? 'Harass & Withdraw has controls in either battle-card slot, with physical allocation after reveal. Classic tables including Homeworlds compose original Tech3+ and Advanced Strongholds2+; selected Ix/CHOAM remains without Worlds. Native custody returns Advanced Emperor normal to Kaitain/Sardaukar to Salusa; Basic to its primary World. Never use Harass on an own Homeworld. Original commitment/support stays. Own No-Field provisionally materializes first without resetting history. Stone compares post-withdrawal counters provisionally; its own profile/allocation guards remain.'
|
||||
: 'Reinforcements works in either slot in selected Ix/CHOAM, classic tables including Homeworlds, and selected Advanced Occupy. Classic Worlds now retain original Tech3+ and Advanced Strongholds2+; selected Ix/CHOAM phase modules remain without Worlds. Spend three original own reserves normal-first for +2 normal score, not support or physical tokens. Exact World sources seal when ambiguous; a fee here cannot also fund its dial. Original face/support stays. No-Field must leave three before payment; future Harass cannot fund it. Stone ignores +2 but charges reserves. Cost/order interpretations and remaining profile guards stay.',
|
||||
? 'Harass & Withdraw uses either battle-card slot and exact physical allocation after reveal, including selected Ix/CHOAM Worlds without other modules. Base-deck classic Worlds separately retain Tech3+ and Advanced Strongholds2+. Return actual native types: Advanced Emperor normal to Kaitain/Sardaukar to Salusa; other natives to their original primary World. Never withdraw on any own World. Original commitment/support stays. Own No-Field provisionally materializes first; Stone keeps its separate profile/allocation guards.'
|
||||
: 'Reinforcements uses either slot, including selected Ix/CHOAM Basic/Advanced Worlds without other modules. Classic base36 Worlds separately retain Tech3+ and Advanced Strongholds2+. Pay three original own reserves normal-first for +2 normal score, not support or physical tokens. Exact native sources seal when ambiguous; an own-World fee cannot also fund its dial, while original traits/face stay. Own No-Field must leave three before payment, including native World reserves; future Harass cannot fund it. Remaining profile guards and cost/order interpretations stay provisional.',
|
||||
topics: RULE_TOPICS.filter((topic) => topic.id === (ecaz.card.effect === 'harassWithdraw' ? 'card-harass-withdraw' : ecaz.card.effect === 'reinforcements' ? 'card-reinforcements' : 'card-recruits')),
|
||||
};
|
||||
const topicIds =
|
||||
|
||||
+29
-22
@@ -10697,31 +10697,39 @@ export function initializeSpiceBankerIncomeGameForAudit(state: Game): Game {
|
||||
if (advancedMoritaniLeaderSkillsProfile(initialized)) initializeMoritaniAssassinateState(initialized);
|
||||
return initialized;
|
||||
}
|
||||
function classicEcazHomeworldProfile(g: Game): boolean {
|
||||
return !!g.homeworlds && g.ecazTreachery === true && g.expansions.length === 0 &&
|
||||
/** Independent cards keep the actual selected base/E1/E2 physical families. */
|
||||
function independentCardRoster(g: Game): boolean {
|
||||
if (g.expansions.length > 2 ||
|
||||
(g.expansions.length === 2 && g.expansions[0] === g.expansions[1]) ||
|
||||
g.expansions.some(expansion => expansion !== 'ix' && expansion !== 'choam')) return false;
|
||||
return g.players.every(player => {
|
||||
const family = faction(player.faction).expansion;
|
||||
return family === 'base' || ((family === 'ix' || family === 'choam') && g.expansions.includes(family));
|
||||
});
|
||||
}
|
||||
function ecazHomeworldProfile(g: Game): boolean {
|
||||
return !!g.homeworlds && g.ecazTreachery === true && independentCardRoster(g) &&
|
||||
g.players.length >= 2 && g.players.length <= 6 &&
|
||||
g.players.every(p => CLASSIC_FACTIONS[p.faction]) &&
|
||||
!g.nexusCards && !g.leaderSkills &&
|
||||
((!g.techTokens && !g.strongholdCards) || independentCardModulesProfile(g)) &&
|
||||
!g.discoveryEnabled && !g.discoveries && !g.discoveryStash && !g.greatMaker && !g.sandtrout;
|
||||
!g.discoveryEnabled && !g.discoveries && !g.discoveryStash && !g.greatMaker && !g.sandtrout &&
|
||||
!g.ecazOccupyPreview && !g.semutaPreview && !g.kullPreview && !g.nexusKullPreview &&
|
||||
!g.richeseBetrayalPreview && !g.guildBetrayalPreview && !g.moritaniAssassinatePreview &&
|
||||
!g.spiceBankerIncomePreview && !g.nexusIxianReplacementPreview &&
|
||||
!g.nexusIxianBetrayalPreview && !g.nexusHarkonnenBetrayalPreview;
|
||||
}
|
||||
/** Independent cards compose original phase modules, not unrelated previews. */
|
||||
function independentCardModulesProfile(g: Game): boolean {
|
||||
if (!g.ecazTreachery || (!g.techTokens && !g.strongholdCards) ||
|
||||
if (!g.ecazTreachery || (!g.techTokens && !g.strongholdCards) || !independentCardRoster(g) ||
|
||||
g.players.length < (g.techTokens ? 3 : 2) || g.players.length > 6 ||
|
||||
(g.strongholdCards && !g.advanced) || g.expansions.length > 2 ||
|
||||
(g.expansions.length === 2 && g.expansions[0] === g.expansions[1]) ||
|
||||
g.expansions.some(expansion => expansion !== 'ix' && expansion !== 'choam') ||
|
||||
(g.strongholdCards && !g.advanced) ||
|
||||
(g.homeworlds && g.expansions.length !== 0) || g.nexusCards || g.leaderSkills ||
|
||||
g.discoveryEnabled || g.discoveries || g.discoveryStash || g.greatMaker || g.sandtrout ||
|
||||
g.ecazOccupyPreview || g.semutaPreview || g.kullPreview || g.nexusKullPreview ||
|
||||
g.richeseBetrayalPreview || g.guildBetrayalPreview || g.moritaniAssassinatePreview ||
|
||||
g.spiceBankerIncomePreview || g.nexusIxianReplacementPreview ||
|
||||
g.nexusIxianBetrayalPreview || g.nexusHarkonnenBetrayalPreview) return false;
|
||||
return g.players.every(player => {
|
||||
const family = faction(player.faction).expansion;
|
||||
return family === 'base' || ((family === 'ix' || family === 'choam') && g.expansions.includes(family));
|
||||
});
|
||||
return true;
|
||||
}
|
||||
/** Gated development setup for the independent three-card Ecaz variant. */
|
||||
export function initializeEcazTreacheryGameForAudit(state: Game): Game {
|
||||
@@ -10729,8 +10737,8 @@ export function initializeEcazTreacheryGameForAudit(state: Game): Game {
|
||||
const g = structuredClone(state);
|
||||
g.ecazTreachery = true;
|
||||
const homeworlds = !!g.homeworlds;
|
||||
requireRule(!homeworlds || classicEcazHomeworldProfile(g),
|
||||
'Independent cards with Homeworlds require a fresh classic roster with only supported original Tech or Advanced Strongholds.');
|
||||
requireRule(!homeworlds || ecazHomeworldProfile(g),
|
||||
'Independent cards with Homeworlds need a fresh classic or selected Ix/CHOAM roster; phase modules remain classic-only.');
|
||||
return initializeSetupGameForAudit(g, homeworlds, false, false, false, false, false, true, true);
|
||||
}
|
||||
function initializeSetupGameForAudit(state: Game, homeworlds: boolean, nexus = false, ix = false, discovery = false, leaderSkills = false, choam = false, factions = false, ecazTreachery = false, strongholdFactions = false): Game {
|
||||
@@ -13777,7 +13785,7 @@ function ecazTreacheryIntegrity(g: Game) {
|
||||
function recruitsModeSupported(g: Game) {
|
||||
const modules = independentCardModulesProfile(g);
|
||||
return (
|
||||
(!g.homeworlds || classicEcazHomeworldProfile(g)) &&
|
||||
(!g.homeworlds || ecazHomeworldProfile(g)) &&
|
||||
!g.nexusCards &&
|
||||
!g.leaderSkills &&
|
||||
(!g.techTokens || modules) &&
|
||||
@@ -13800,13 +13808,9 @@ function combinedCardBattleBlock(g: Game): string | null {
|
||||
}
|
||||
function reinforcementsModeSupported(g: Game) {
|
||||
const pairedEcaz = g.expansions.length === 1 && g.expansions[0] === 'ecaz';
|
||||
const nativeFamilies = !g.homeworlds && !g.discoveries && !g.discoveryStash && !g.greatMaker &&
|
||||
const nativeFamilies = !g.discoveries && !g.discoveryStash && !g.greatMaker &&
|
||||
!g.semutaPreview && !g.kullPreview && !g.ecazOccupyPreview &&
|
||||
g.expansions.length > 0 && g.expansions.every(expansion => expansion === 'ix' || expansion === 'choam') &&
|
||||
g.players.every(player => {
|
||||
const family = faction(player.faction).expansion;
|
||||
return family === 'base' || ((family === 'ix' || family === 'choam') && g.expansions.includes(family));
|
||||
});
|
||||
g.expansions.length > 0 && independentCardRoster(g);
|
||||
return !!g.ecazTreachery && recruitsModeSupported(g) && !g.sandtrout &&
|
||||
(nativeFamilies || (g.ecazOccupyPreview === true && ecazOccupyCompositionSupported(g)) ||
|
||||
((g.expansions.length === 0 || pairedEcaz) && g.players.every(player => {
|
||||
@@ -13827,12 +13831,15 @@ function currentReinforcementsCost(g: Game, p: Player,
|
||||
requireRule(selections === undefined || g.homeworlds,
|
||||
'Native Reinforcements sources require the original Homeworld module.');
|
||||
try {
|
||||
const materializes = prospectiveNoFieldForces(p, g.battle?.territory ?? '');
|
||||
if (g.homeworlds) {
|
||||
requireRule(g.homeworlds.custody, 'Reinforcements needs its original native reserve custody.');
|
||||
// Richese materializes ordinary primary-World reserves before this fee.
|
||||
if (materializes)
|
||||
quoteReinforcements(p.reserves - materializes - (p.elites?.reserves ?? 0), p.elites?.reserves ?? 0);
|
||||
return homeworldRule(() => quoteReinforcementsHomeworldCost(
|
||||
homeworldContext(g), g.homeworlds!.custody!, p.id, selections));
|
||||
}
|
||||
const materializes = prospectiveNoFieldForces(p, g.battle?.territory ?? '');
|
||||
return quoteReinforcements(p.reserves - materializes - (p.elites?.reserves ?? 0), p.elites?.reserves ?? 0);
|
||||
} catch (error) {
|
||||
if (error instanceof ReinforcementsError) throw new RuleError(error.message);
|
||||
|
||||
+7
-6
@@ -4983,6 +4983,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
||||
'Free prevention still prevents free returns. Prior paid ordinary returns now have a visibly provisional policy: preserve payment, deduct only recorded free returns from the doubled free allowance and all returns from the total cap. Two free plus one paid Atreides may take two more free without refund; this is not a numerical user ruling. Missing/inconsistent ledgers, later Fremen grants, pending transactions and same-turn replay remain guarded.',
|
||||
'Clean classic2–6 Basic/Advanced Homeworlds compose through the fresh independent36-card setup. Double current native free rates including low-population bonuses, within the seven-force total. Provisionally recheck population and recorded free use on each separate request: low Fremen may take7 together, but1 crossing high leaves5 further free and cannot buy a seventh without Tleilaxu. Original typed destinations and special-force limits stay. Other overlays/rosters, public activation and whole-mode acceptance remain unfinished.',
|
||||
'Classic rosters including Homeworlds, or selected Ix/CHOAM native/base rosters without Worlds, may retain original unused Tech Tokens3–6 and/or Stronghold Cards2–6 Advanced. Setup, first-Storm Tech and actual end-Mentat custody remain original. Recruits changes current native free rates, not the once-per-phase Axlotl trigger/delayed payout. Harass returns are not free Revival.',
|
||||
'Selected Ix/CHOAM native/base Basic/Advanced Worlds now use original38/50 independent-card setup without other modules. Current native bonuses, typed deposits and accepted paid/free classifications stay. Ix keeps its multiple-Cyborg allowance; Tleilaxu and CHOAM remain unlimited rather than being reduced to seven. Other card/overlay/public-start gates remain.',
|
||||
],
|
||||
related: ['revival', 'homeworlds', 'ecaz-modules', 'expansion-faction-games', 'implementation-checklist'],
|
||||
checklist: [
|
||||
@@ -4990,7 +4991,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
||||
{ area: 'Player controls', status: 'Implemented', detail: 'The owned physical card has full inspection, a Revival action and explicit unavailable reasons. All seats see the effective public rates after play.', evidence: ['components/recruits.tsx', 'components/game-table.tsx', 'game/card-presentation.ts'] },
|
||||
{ area: 'AI', status: 'Partial', detail: 'All four profiles use the same legal owned offer for useful own or allied revival, then existing authoritative revival choices. Complete card strategy and calibration remain unfinished.', evidence: ['game/bots.ts'] },
|
||||
{ area: 'Documentation', status: 'Implemented', detail: 'The guide records examples, limits, independent-cap inference and the visibly provisional late-paid policy; source alternatives and late-rate questions remain explicit.', evidence: ['docs/RECRUITS_RULES.md', 'docs/RECRUITS_RUNTIME.md'] },
|
||||
{ area: 'Verification', status: 'Partial', detail: 'Native rates/caps, paid/free ledgers, useful Recruits and one delayed Axlotl payment compose with original phase modules and World custody. Classic World batch: one mobile journey/9 actions,24 four-policy programmes/156 actions with explicitly conserved useful card holders. Bulk7 versus split6 and one Fedaykin plus five normals retain current thresholds. Earlier World/non-World proof stays dated in its contracts; complete modes/calibration remain open.', evidence: ['tests/world-phase-recruits.test.ts', 'tests/fixture-world-phase-recruits.ts', 'tests/recruits-modules.test.ts', 'tests/fixture-recruits-modules.ts', 'tests/fixture-independent-card-modules.ts', 'tests/recruits-homeworld.test.ts', 'tests/fixture-recruits-homeworld.ts', 'tests/recruits.test.ts', 'tests/recruits-engine.test.ts', 'tests/recruits-controls.test.tsx', 'tests/recruits-recovery.test.ts', 'tests/prototype-room.test.ts'] },
|
||||
{ area: 'Verification', status: 'Partial', detail: 'Earlier classic World/phase evidence stays dated in linked contracts. Selected native Worlds add real typed deposits/prices, current population crossings, prior-paid reopening, unlimited Tleilaxu/CHOAM returns and ordinary Richese/Imperial elite caps. One mobile11-force revival/9 actions and40 useful four-policy programmes/300 actions reach legal shipment. Policy card holders are explicit conserved staging. Complete modes/calibration remain open.', evidence: ['tests/native-world-recruits.test.ts', 'tests/fixture-native-world-recruits.ts', 'tests/world-phase-recruits.test.ts', 'tests/fixture-world-phase-recruits.ts', 'tests/recruits-modules.test.ts', 'tests/fixture-recruits-modules.ts', 'tests/fixture-independent-card-modules.ts', 'tests/recruits-homeworld.test.ts', 'tests/fixture-recruits-homeworld.ts', 'tests/recruits.test.ts', 'tests/recruits-engine.test.ts', 'tests/recruits-controls.test.tsx', 'tests/recruits-recovery.test.ts', 'tests/prototype-room.test.ts'] },
|
||||
],
|
||||
},
|
||||
{
|
||||
@@ -5006,9 +5007,9 @@ export const RULE_TOPICS: RuleTopic[] = [
|
||||
'The normal-outcome score gains 2 without adding to the physical dial, spice support or on-board casualties. The card and its reserve cost are consumed even on a Traitor victory, a mutual Traitor result or a Lasgun/Shield explosion; successful Traitor calls still decide the outcome directly.',
|
||||
'All-outcome payment, normal-first selection and reserve transfer counting as battle losses remain provisional interpretations, not publisher rulings. Same-plan Harass pays the original three-reserve cost before returns; returned reserves cannot fund or change it. In native Advanced Occupy, original or copied Stone ignores +2 normal score but still charges the reserve cost. Basic/unprofiled co-side and other profile/module limits remain guarded.',
|
||||
'With your own concealed No-Field, the provisional native order materializes its reserve-limited counters before this cost. At least three own reserves must remain after that reveal, before any future Harass return; otherwise Reinforcements is unavailable before the first plan seals. This checks only the actual card user, never its ally’s marker or reserves.',
|
||||
'Classic2–6 Basic/Advanced Homeworlds retain exact native normal-first fee sources, sealed when ambiguous; unique sources may derive. An own-World fee cannot also fund dial/casualties, but original printed face/support remains, including explosion losses across a threshold. Original Tech3+ and Advanced Strongholds2+ now compose without changing that quote, native-only Traitors, typed Tanks or cost-before-Harass. This remains provisional composition, not a new card FAQ.',
|
||||
'Classic and selected Ix/CHOAM Basic/Advanced Worlds retain exact native normal-first sources, sealed when ambiguous; unique sources may derive. Own-World fees cannot also fund dial/casualties; original face/support stays, including explosion thresholds. Phase modules remain classic base36 only. Native-only World Traitors, typed Tanks and fee-before-Harass stay provisional composition, not a new card FAQ.',
|
||||
'One canonical physical-name registry now includes the independent cards for current facts and named battle conditions. Naming Reinforcements in a weapon slot does not make it a weapon category. Native questions use actual combat-location labels. Source-aware legal completion, private full-plan/read-only review and the fill button retain exact native sources.',
|
||||
'Clean selected Ix and/or CHOAM families retain original Basic/Advanced setup and independent cards. Native cyborg substitution and Face Dance use their original physical pools, not a second copy of the reserve fee. Richese No-Field reveal precedes payment; physical Stone ignores +2. Separately retain original Tech3+ and/or Advanced Strongholds2+ without Homeworlds, using actual phase income/earned custody; other family/module and Stone profile guards stay.',
|
||||
'Selected Ix/CHOAM Worlds add no other modules; original38/50 setup and native stock remain. Cyborg substitution and Face Dance use their actual physical pools, never a duplicate fee origin. Native Richese must retain three World reserves AFTER its own projected No-Field reveal before R seals; rejection moves no counter or marker. Without Worlds, original phase-module and admitted Stone compositions remain separate.',
|
||||
],
|
||||
related: ['battle-cards', 'battle', 'homeworlds', 'card-recruits', 'card-harass-withdraw', 'card-truthtrance', 'implementation-checklist'],
|
||||
checklist: [
|
||||
@@ -5016,7 +5017,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
||||
{ area: 'Player controls', status: 'Partial', detail: 'Owner-only cost/source choices, own-World physical bounds, wrapped exact allocation, source-aware legal-plan fill and earned private reviews connect; category answers remain None. Native named-question preview/answer/history uses canonical combat labels.', evidence: ['components/battle-preparation.tsx', 'components/reinforcements-sources.tsx', 'components/private-battle-plan.tsx', 'components/battle-promises.tsx', 'components/truthtrance.tsx', 'components/game-table.tsx'] },
|
||||
{ area: 'AI', status: 'Partial', detail: 'Four profiles consider legal physical slot candidates and the normal score bonus; strategy and calibration remain unfinished.', evidence: ['game/bots.ts'] },
|
||||
{ area: 'Documentation', status: 'Partial', detail: 'The printed effect and unresolved Traitor, explosion, type-selection and accounting interpretations are distinguished from this temporary prototype.', evidence: ['docs/ECAZ_TREACHERY_RULES.md', 'docs/REINFORCEMENTS_RUNTIME.md'] },
|
||||
{ area: 'Verification', status: 'Partial', detail: 'Earlier World/family/phase evidence stays dated in linked contracts. Classic World phase batch adds earned bank support, split native fee/typed return, own-World disjointness/Harass ban and actual Caladan continuation. Two mobile battle journeys/8 actions;24 four-policy battle/aftercare programmes/48 continuations and7609 validated R-or-H proposals preserve normal outcomes. Original sources, traits and physical counters remain; no complete-mode/calibration/deployed claim.', evidence: ['tests/world-phase-battle.test.ts', 'tests/fixture-world-phase-battle.ts', 'tests/battle-card-modules.test.ts', 'tests/fixture-battle-card-modules.ts', 'tests/fixture-independent-card-modules.ts', 'tests/native-family-reinforcements.test.ts', 'tests/fixture-native-family-reinforcements.ts', 'tests/richese-reinforcements.test.ts', 'tests/fixture-richese-reinforcements.ts', 'tests/reinforcements-homeworld.test.ts', 'tests/fixture-reinforcements-homeworld.ts', 'tests/reinforcements-homeworld-arrakis.test.ts', 'tests/fixture-reinforcements-homeworld-arrakis.ts', 'tests/no-field-reinforcements.test.ts', 'tests/fixture-no-field-reinforcements.ts', 'tests/stone-reinforcements.test.ts', 'tests/harass-reinforcements.test.ts', 'tests/reinforcements.test.ts', 'tests/reinforcements-engine.test.ts', 'tests/ecaz-occupy-cards-runtime.test.ts', 'docs/ECAZ_OCCUPY_RULES.md'] },
|
||||
{ area: 'Verification', status: 'Partial', detail: 'Earlier classic/family/phase evidence stays dated. Native Worlds add1N2E fees before normal returns, own-Ix fee/dial disjointness/H ban, one board-Cyborg exchange versus fee casualties, native Face Dance/Auditor and marker funding/caps. Four mobile battle/marker journeys33 actions;52 four-policy programmes232 continuations5280 R-or-H proposals preserve normal outcomes. Before/after raw marker3/reserves5 proves unchanged first-seal rejection. No complete-mode/calibration/deployed claim.', evidence: ['tests/native-world-battle.test.ts', 'tests/fixture-native-world-battle.ts', 'tests/native-world-marker.test.ts', 'tests/fixture-native-world-marker.ts', 'tests/world-phase-battle.test.ts', 'tests/fixture-world-phase-battle.ts', 'tests/battle-card-modules.test.ts', 'tests/fixture-battle-card-modules.ts', 'tests/fixture-independent-card-modules.ts', 'tests/native-family-reinforcements.test.ts', 'tests/fixture-native-family-reinforcements.ts', 'tests/richese-reinforcements.test.ts', 'tests/fixture-richese-reinforcements.ts', 'tests/reinforcements-homeworld.test.ts', 'tests/fixture-reinforcements-homeworld.ts', 'tests/reinforcements-homeworld-arrakis.test.ts', 'tests/fixture-reinforcements-homeworld-arrakis.ts', 'tests/no-field-reinforcements.test.ts', 'tests/fixture-no-field-reinforcements.ts', 'tests/stone-reinforcements.test.ts', 'tests/harass-reinforcements.test.ts', 'tests/reinforcements.test.ts', 'tests/reinforcements-engine.test.ts', 'tests/ecaz-occupy-cards-runtime.test.ts', 'docs/ECAZ_OCCUPY_RULES.md'] },
|
||||
],
|
||||
},
|
||||
{
|
||||
@@ -5035,7 +5036,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
||||
'In explicitly selected Advanced Occupy, only the actual card user’s undialed forces return. An Ecaz user preserves its original mandatory fixed count at free full strength; an allied user uses its native variable commitment, while canceled Occupy uses its selected lead’s ordinary own pool. Returned reserves remain outside losses and Face Dance. Basic/unprofiled co-side, public starts and full acceptance remain gated.',
|
||||
'In supported same-plan Reinforcements, the provisional order pays three original own reserves before Harass returns undialed counters. Future returns cannot fund or change that reserve quote; neither the +2 score bonus nor that cost adds to the physical commitment. Both cards discard after use. An opposing successful Traitor cancels Harass but not the provisional Reinforcements cost.',
|
||||
'With an own concealed No-Field, this prototype provisionally uses the original materialization-first order. Before sealing, privately forecast its actual ordinary counters at the original marker sector; do not move them early. Both plans seal before native revelation, then any return allocation uses actual counters. Marker0 remains legal with a leader/cards, reserve shortage caps materialization, and withdrawal does not return/reset the token. Opposing successful Traitor cancels Harass, not that native reveal.',
|
||||
'Clean classic2–6 Basic/Advanced Homeworlds may be selected before independent36-card setup. Harass works on Arrakis or a foreign Homeworld, never any own World. Return actual undialed board/visitor counters through native custody, not Tanks: Basic primary; Advanced Emperor normal to Kaitain/Sardaukar to Salusa. Original dial/support and committed counters remain fixed across thresholds. Native-only Traitors, late defense/explosion and disposal stay. Recruits has native current rates; Reinforcements seals exact original native fees before these returns. Other overlays/rosters remain guarded.',
|
||||
'Classic and selected Ix/CHOAM Basic/Advanced Worlds may choose the independent cards before original setup. Harass works on Arrakis or a foreign World, never an own World. Return actual undialed board/visitor types through native custody: normal/special to the original primary World except Advanced Emperor normal to Kaitain and Sardaukar to Salusa. Original commitment stays across thresholds; native-only World Traitors/Face Dancers, late defense/explosion and disposal stay. Native Worlds add no phase modules.',
|
||||
'Classic rosters including Homeworlds, or selected Ix/CHOAM native/base rosters without Worlds, compose original Tech3+ and/or Advanced Strongholds2+. An earned held Stronghold affects only its original eligible plan/actual support; +2 R adds no supported counters. Harass deposits are not off-planet shipment/free Revival. Original winner card cleanup/Tech reward and native queues retain their order.',
|
||||
],
|
||||
related: ['battle-cards', 'battle', 'card-recruits', 'homeworlds', 'ecaz-modules', 'implementation-checklist'],
|
||||
@@ -5044,7 +5045,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
||||
{ area: 'Player controls', status: 'Partial', detail: 'Either slot and native typed allocation remain. World names, Basic versus Advanced reserve destinations and fixed-commitment timing are explicit. Invaders no longer receive forbidden Traitor controls. Four actual390px journeys complete Basic foreign loss, Advanced foreign victory, Salusa threshold return and own-Salusa ban/plain alternative into Collection.', evidence: ['components/battle-preparation.tsx', 'components/harass-withdraw.tsx', 'components/revealed-battle.tsx', 'components/game-table.tsx', 'components/harass-withdraw-choice.tsx'] },
|
||||
{ area: 'AI', status: 'Partial', detail: 'All four profiles use legal shared precommit quotes and exact after-reveal allocations without an invader vote. Sixteen native World programs accept36 continuation actions and validate original precommit proposals through normal/explosion/own-World alternatives. Retreat strategy and combined strength remain deferred.', evidence: ['game/bots.ts', 'tests/ecaz-battle-bots.test.ts'] },
|
||||
{ area: 'Documentation', status: 'Partial', detail: 'Printed own-World restriction and explicit native destination/fixed-commitment composition are separated from original materialization/Stone policies and remaining faction/module/final gates.', evidence: ['docs/HARASS_WITHDRAW_RUNTIME.md', 'docs/ECAZ_TREACHERY_RULES.md', 'docs/STONE_BURNER_ENGINE_AUDIT.md', 'docs/RICHESE_NO_FIELD_RULES.md'] },
|
||||
{ area: 'Verification', status: 'Partial', detail: 'Original typed return, native reserve destinations, frozen commitment, own-World ban and native-only Traitors remain. Classic World phase batch adds earned bank support, exact source fee before typed withdrawal and preserved original winner/Caladan queues. Two mobile battles/8 actions and24 four-policy battle/aftercare programmes/48 continuations/7609 R-or-H proposals reach usable native decisions. Earlier World/No-Field/Stone proof is separate; no complete-mode/deployed/calibration claim.', evidence: ['tests/world-phase-battle.test.ts', 'tests/fixture-world-phase-battle.ts', 'tests/battle-card-modules.test.ts', 'tests/fixture-battle-card-modules.ts', 'tests/fixture-independent-card-modules.ts', 'tests/harass-homeworld.test.ts', 'tests/fixture-harass-homeworld.ts', 'tests/harass-homeworld-arrakis.test.ts', 'tests/fixture-harass-homeworld-arrakis.ts', 'tests/harass-no-field.test.ts', 'tests/fixture-harass-no-field.ts', 'tests/no-field-reinforcements.test.ts', 'tests/stone-harass-quote.test.ts', 'tests/stone-harass-runtime.test.ts', 'tests/fixture-stone-harass.ts', 'tests/ecaz-occupy-harass-quote.test.ts', 'tests/harass-allocation-engine.test.ts', 'tests/harass-allocation-recovery.test.ts', 'tests/harass-withdraw-choice-controls.test.tsx', 'tests/harass-withdraw.test.ts', 'tests/ecaz-battle-controls.test.tsx', 'tests/ecaz-battle-bots.test.ts', 'tests/ecaz-battle-recovery.test.ts'] },
|
||||
{ area: 'Verification', status: 'Partial', detail: 'Earlier World/phase/No-Field/Stone proofs stay dated. Selected native Worlds add exact primary typed deposits, normal-first R payment before7 Suboids return, one eligible board-Cyborg exchange and native-only World Face Dance/Auditor. Four mobile battle/marker journeys33 actions;52 four-policy programmes232 continuations5280 R-or-H proposals reach original queues. Unfunded R stays unspent under legal H fallback. No complete-mode/deployed/calibration claim.', evidence: ['tests/native-world-battle.test.ts', 'tests/fixture-native-world-battle.ts', 'tests/native-world-marker.test.ts', 'tests/fixture-native-world-marker.ts', 'tests/world-phase-battle.test.ts', 'tests/fixture-world-phase-battle.ts', 'tests/battle-card-modules.test.ts', 'tests/fixture-battle-card-modules.ts', 'tests/fixture-independent-card-modules.ts', 'tests/harass-homeworld.test.ts', 'tests/fixture-harass-homeworld.ts', 'tests/harass-homeworld-arrakis.test.ts', 'tests/fixture-harass-homeworld-arrakis.ts', 'tests/harass-no-field.test.ts', 'tests/fixture-harass-no-field.ts', 'tests/no-field-reinforcements.test.ts', 'tests/stone-harass-quote.test.ts', 'tests/stone-harass-runtime.test.ts', 'tests/fixture-stone-harass.ts', 'tests/ecaz-occupy-harass-quote.test.ts', 'tests/harass-allocation-engine.test.ts', 'tests/harass-allocation-recovery.test.ts', 'tests/harass-withdraw-choice-controls.test.tsx', 'tests/harass-withdraw.test.ts', 'tests/ecaz-battle-controls.test.tsx', 'tests/ecaz-battle-bots.test.ts', 'tests/ecaz-battle-recovery.test.ts'] },
|
||||
],
|
||||
},
|
||||
{
|
||||
|
||||
Reference in new issue
Block a user