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))