Enable Basic Richese Semuta in Nexus games
Verify and publish checkpoint container / container (push) Successful in 10m35s

This commit is contained in:
Quintine committed 2026-10-30 18:18:45 +11:00
1 parent 7680e1ee69
commit 5b66628399
13 files changed
+494 -15

No files matched your search

+18 -1
View File
@@ -8092,6 +8092,7 @@ function semutaHomeworldRoster(g: Game): boolean {
function semutaTruthOrderProfile(g: Game): boolean {
if (bareBasicSemutaProfile(g) || semutaHomeworldRoster(g)) return true;
if (selectedDiscoverySkillsSemutaProfile(g)) return true;
if (g.semutaPreview === true && !g.advanced && semutaNexusProfile(g)) return true;
return g.semutaPreview === true && g.expansions.length === 1 && g.expansions[0] === 'choam' &&
!!byFaction(g, 'richese') && g.players.every(p => p.faction === 'richese' ||
p.faction === 'choam' || CLASSIC_FACTIONS[p.faction] === true) &&
@@ -10164,7 +10165,12 @@ function semutaOfferSupported(
? ordinaryDiscardIncomeMatches(g, continuation)
: continuation.kind === 'ornithopterDiscard' && continuation.source === 'cunning'
? continuation.resume.response?.kind === 'nexusGuildCunning'
: !continuation.resume.response) && !continuation.resume.decision &&
: !continuation.resume.response) &&
(!continuation.resume.decision || continuation.kind === 'truthtranceDiscard' &&
ordinaryAuctionDiscard && !g.advanced && semutaNexusProfile(g) &&
continuation.resume.decision.kind === 'auctionPayment' &&
continuation.resume.decision.player === g.auction?.bidder &&
(!g.pendingTreacheryDiscard || !!g.pendingTreacheryDiscard.reaction)) &&
!continuation.resume.pendingKarama &&
(continuation.kind === 'amalDiscard'
? continuation.resume.phaseOpening?.passed.length === 0
@@ -11190,6 +11196,16 @@ function publicSemutaDiscoveryProfile(g: Game): boolean {
!g.homeworlds && !g.nexusCards && g.discoveryEnabled === true && !g.ecazTreachery &&
!g.leaderSkills && !g.kullPreview && !g.nexusKullPreview && discoveryModuleProfile(g);
}
/** Fresh Basic CHOAM-deck Nexus starts retain the existing native Semuta path. */
function publicSemutaNexusProfile(g: Game): boolean {
return g.status === 'lobby' && g.advanced === false &&
g.players.length >= 2 && g.players.length <= 6 &&
g.expansions.length === 1 && g.expansions[0] === 'choam' && !!byFaction(g, 'richese') &&
g.players.every(p => p.faction === 'richese' || p.faction === 'choam' || CLASSIC_FACTIONS[p.faction] === true) &&
!!g.nexusCards && !g.homeworlds && !g.discoveryEnabled && !g.ecazTreachery && !g.leaderSkills &&
!g.techTokens && !g.strongholdCards && !g.twoPlayerControllers && !g.shortAllianceVictory &&
!g.coalitionPreview && !g.kullPreview && !g.nexusKullPreview;
}
/** Route a normal start through the existing genuine setup for the selected modules. */
function startModules(state: Game): Game {
const options = state.lobbyOptions ?? {};
@@ -11221,6 +11237,7 @@ function startModules(state: Game): Game {
// also selected; unsupported combinations must reject, not silently omit cards.
if (options.ecazTreachery) return initializeEcazTreacheryGameForAudit(g);
if (g.nexusCards) {
if (publicSemutaNexusProfile(g)) return initializeSemutaGameForAudit(g);
const natives: Record<string, [string, string]> = { ix: ['ixians', 'tleilaxu'], choam: ['choam', 'richese'], ecaz: ['ecaz', 'moritani'] };
const pair = g.expansions.length === 1 ? natives[g.expansions[0]] : undefined;
return pair && pair.every(id => g.players.some(p => p.faction === id))
+6 -1
View File
@@ -352,7 +352,12 @@ export function validateEmperorNexusPurchase(
* roster and delegated Discovery/Homeworld/Tech/Stronghold envelopes, and the
* separately flagged preview aliases never open one. */
function nativeBankNexusProfile(g: Game): boolean {
if (g.semutaPreview || g.advancedPreview || g.kullPreview || g.nexusKullPreview ||
const basicSemutaNexus = g.advanced === false && g.semutaPreview === true &&
g.expansions.length === 1 && g.expansions[0] === 'choam' &&
g.players.some(player => player.faction === 'richese') &&
!g.homeworlds && !g.leaderSkills && !g.techTokens && !g.strongholdCards &&
!g.discoveryEnabled && !g.discoveries && !g.discoveryStash && !g.greatMaker;
if (g.semutaPreview && !basicSemutaNexus || g.advancedPreview || g.kullPreview || g.nexusKullPreview ||
g.guildBetrayalPreview || g.richeseBetrayalPreview ||
g.nexusIxianReplacementPreview || g.nexusIxianBetrayalPreview ||
g.nexusHarkonnenBetrayalPreview) return false;
+6
View File
@@ -233,6 +233,12 @@ export function validateEmperorNexusRevival(
/** Reuse original fresh roster/module predicates, independently of purchase admission. */
function revivalModeSupported(g: Game): boolean {
if (nexusCoreProfile(g)) return true;
// The original Semuta/Nexus E1/E2 entry already supplies native Nexus
// custody. Spending Emperor's Nexus for its extra return discards no
// Treachery Card, so the Semuta marker does not change this continuation.
if (g.semutaPreview === true && !g.advanced && !g.leaderSkills &&
!g.techTokens && !g.strongholdCards &&
(singleE1E2NexusProfile(g) || pairedNexusModulesProfile(g) || mixedE1E2NexusProfile(g))) return true;
if (g.semutaPreview || g.advancedPreview || g.kullPreview || g.nexusKullPreview ||
g.guildBetrayalPreview || g.richeseBetrayalPreview || g.nexusIxianReplacementPreview ||
g.nexusIxianBetrayalPreview || g.nexusHarkonnenBetrayalPreview || g.ecazTreachery)
+1
View File
@@ -1360,6 +1360,7 @@ export const RULE_TOPICS: RuleTopic[] = [
'In fresh Basic games with Richese, classic opponents, the CHOAM deck and Tech Tokens, the existing Semuta preview is also enabled. Other module combinations remain separate; existing started games are not retrofitted.',
'Fresh Basic and Advanced Richese games with the CHOAM deck and Leader Skills now use the existing bounded Semuta reaction. Optional Tech Tokens require three seats; Advanced may also select Stronghold Cards. Supported discards retain their original continuations, while other discard sources remain unfinished. Existing games are not converted.',
'Fresh Basic and Advanced Richese games with the CHOAM deck and Discoveries also use the bounded Semuta reaction. Shrine role costs and a committed Sapho Testing Station reorder retain their original effects and continue after claim or pass. Other producers and combinations remain unfinished; existing games are not converted.',
'Fresh Basic Richese games with the CHOAM deck and Nexus also enable supported Semuta reactions. CHOAM Secret Ally and Betrayal keep their original effects; Sapho ordering and Emperor Secret Ally revival or ordinary bank purchase remain available. Other modules, Advanced starts and nested discard sources retain their separate limits.',
'In supported Basic games with both Discoveries and Leader Skills, CHOAM and Ixian Ambassador discards can also offer Semuta during ordinary movement or shipment, a paired Ambassador/Terror entry, and a clean Fremen worm ride. CHOAM credit stays paid; Ixian replacement and the original entry continue once after claim or pass. Other nested sources and Advanced Ambassador interactions remain unfinished.',
'Fresh Basic and Advanced Richese games with the CHOAM deck and Homeworlds also use the bounded Semuta reaction. A supported Sapho change to simultaneous Truthtrance order pauses for Semuta, then resumes the same questions. Other discard sources and module combinations remain unfinished; existing games are not converted.',
'Fresh Advanced Richese preview games with only the CHOAM expansion deck and classic or CHOAM opponents enable Semuta reactions for supported ordinary Hajr, Ghola, Harvester and Weather Control discards, completed Box and Distrans, simple definite Truthtrance answers, clean Residual Poison, completed CHOAM sales, supported printed CHOAM Worthless costs and supported battle cleanup. Other discard parents and optional-module combinations remain unfinished. Existing games are not retrofitted.',