Enable Basic Nexus Kull and native reactions
Verify and publish checkpoint container / container (push) Successful in 11m12s

This commit is contained in:
Quintine committed 2026-10-30 18:26:05 +11:00
1 parent 5b66628399
commit 95ebd7f976
15 files changed
+388 -21

No files matched your search

+4 -5
View File
@@ -8067,10 +8067,10 @@ function suspendedControlsIntegrity(
}
/** Original native Nexus roster/modules with no extra overlay-specific setup. */
function semutaNexusProfile(g: Game): boolean {
return !!g.nexusCards && (g.leaderSkills
return !!g.nexusCards && (g.semutaPreview === true && nexusCoreProfile(g) || (g.leaderSkills
? pairedNexusLeaderSkillsProfile(g) || singleE1E2NexusLeaderSkillsProfile(g) ||
mixedE1E2NexusLeaderSkillsProfile(g)
: pairedNexusModulesProfile(g) || singleE1E2NexusProfile(g) || mixedE1E2NexusProfile(g));
: pairedNexusModulesProfile(g) || singleE1E2NexusProfile(g) || mixedE1E2NexusProfile(g)));
}
/** Original classic occupation or a focused Advanced Tleilax SEND profile.
* Other optional envelopes remain separate; no recorded game is redealt. */
@@ -11212,6 +11212,7 @@ function startModules(state: Game): Game {
const g = structuredClone(state);
delete g.lobbyOptions;
if (lobbyKullEnabled(state)) {
if (g.nexusCards && g.advanced === false) return initializeNexusKullGameForAudit(g);
const supportedBasic = g.advanced === false && (g.expansions.length === 2 ||
g.expansions.length === 3 && g.expansions.includes('ecaz')) && g.expansions.includes('choam') &&
g.expansions.includes('ix') && !!byFaction(g,'choam') &&
@@ -13729,8 +13730,6 @@ export function initializeNexusKullGameForAudit(state: Game): Game {
const g = initializeSetupGameForAudit(state, false, true, false, false, false, false, true);
g.kullPreview = true;
g.nexusKullPreview = true;
// Ix supplies Treachery cards here, not the optional Sandtrout Spice card.
g.spiceDeck = shuffle(spiceDeck());
return g;
}
/** Prototype-only Discovery setup. Public starts stay gated while remaining effects are connected. */
@@ -20273,7 +20272,7 @@ function kullIntegrity(g: Game): void {
g.players.some(p => p.faction === 'choam') &&
g.players.every(p => p.faction === 'choam' || faction(p.faction).expansion === 'base') &&
!g.homeworlds && !g.leaderSkills && !g.discoveryEnabled && !g.discoveries &&
!g.discoveryStash && !g.greatMaker && !g.sandtrout &&
!g.discoveryStash && !g.greatMaker &&
!g.techTokens && !g.strongholdCards && !g.ecazTreachery && !g.semutaPreview &&
!g.richeseBetrayalPreview && !g.richeseBetrayal && !g.pendingRicheseBetrayal,
'The Nexus Kull profile has lost its supported native inventory and modules.');
+38 -2
View File
@@ -36,6 +36,20 @@ type NexusCoreConfiguration = Partial<FactionModuleProfile> & Pick<FactionModule
sandtrout?: unknown; moritaniAssassinatePreview?: unknown;
};
/** The pre-existing Nexus Kull audit also accepts Advanced CHOAM/classic
* seats; retain its native reaction stamps without opening a public mode. */
function nexusKullCore(game: NexusCoreConfiguration): boolean {
return typeof game.advanced === 'boolean' && !!game.nexusCards &&
game.kullPreview === true && game.nexusKullPreview === true && !game.semutaPreview &&
game.expansions.length === 2 && game.expansions.includes('ix') && game.expansions.includes('choam') &&
!!game.players?.some(player => player.faction === 'choam') &&
game.players.every(player => player.faction === 'choam' ||
FACTIONS.some(faction => faction.id === player.faction && faction.expansion === 'base')) &&
!game.homeworlds && !game.leaderSkills && !game.techTokens && !game.strongholdCards &&
!game.ecazTreachery && !game.discoveryEnabled && !game.discoveries && !game.discoveryStash &&
!game.greatMaker && !game.advancedPreview && !game.richeseBetrayalPreview;
}
/** Classic Nexus12 with selected base33/independent36, optional all14, original
* Homeworlds and phase modules. Native effect stamps are not selected overlays. */
export function classicNexusCoreProfile(game: NexusCoreConfiguration): boolean {
@@ -79,6 +93,27 @@ export function selectedDiscoverySkillsSemutaProfile(game: NexusCoreConfiguratio
selectedDiscoveryWithoutCardsProfile({...game, semutaPreview: undefined});
}
/** Fresh Basic E1/E2 Nexus without additional modules. Native reaction stamps
* are part of this core; Semuta and Nexus Kull keep their physical prerequisites. */
function basicNativeNexusCore(game: NexusCoreConfiguration): boolean {
const players = game.players;
if (game.advanced !== false || !game.nexusCards || !players || !game.expansions.length ||
!game.expansions.every(id => id === 'ix' || id === 'choam') ||
game.homeworlds || game.leaderSkills || game.techTokens || game.strongholdCards ||
game.ecazTreachery || game.discoveryEnabled || game.discoveries || game.discoveryStash || game.greatMaker ||
game.advancedPreview || game.richeseBetrayalPreview) return false;
if (game.semutaPreview && (game.semutaPreview !== true || game.kullPreview || game.nexusKullPreview ||
!game.expansions.includes('choam') || !players.some(player => player.faction === 'richese'))) return false;
if (game.kullPreview || game.nexusKullPreview) {
if (game.kullPreview !== true || game.nexusKullPreview !== true || game.semutaPreview ||
game.expansions.length !== 2 || !game.expansions.includes('ix') || !game.expansions.includes('choam') ||
!players.some(player => player.faction === 'choam') ||
players.some(player => player.faction !== 'choam' &&
!FACTIONS.some(faction => faction.id === player.faction && faction.expansion === 'base'))) return false;
}
return true;
}
/** Original selected decks do not require their native factions or the
* independent three-card variant. Hidden E3/Harkonnen compositions retain
* their existing separately scoped paths. */
@@ -88,7 +123,7 @@ export function selectedNexusWithoutCardsProfile(game: NexusCoreConfiguration):
!game.expansions.length || !nexusCoreRosterProfile(game, true, game.discoveryEnabled === true)) return false;
if (game.advanced && players.some(player => player.faction === 'harkonnen') &&
players.some(player => player.faction === 'ecaz' || player.faction === 'moritani')) return false;
return game.expansions.some(expansion => !players.some(player =>
return basicNativeNexusCore(game) || game.expansions.some(expansion => !players.some(player =>
FACTIONS.some(faction => faction.id === player.faction && faction.expansion === expansion)));
}
@@ -100,11 +135,12 @@ export function nexusCoreProfile(game: NexusCoreConfiguration): boolean {
function nexusCoreRosterProfile(game: NexusCoreConfiguration, selectedDecks: boolean, discovery = false): boolean {
const players = game.players;
const basicNative = selectedDecks && (basicNativeNexusCore(game) || nexusKullCore(game));
if (typeof game.advanced !== 'boolean' || (!discovery && !game.nexusCards) ||
!players || players.length < (game.techTokens ? 3 : 2) || players.length > 6 ||
(game.strongholdCards && !game.advanced) ||
(!discovery && (game.discoveryEnabled || game.discoveries || game.discoveryStash || game.greatMaker)) ||
game.semutaPreview || game.advancedPreview || game.kullPreview || game.nexusKullPreview ||
(game.semutaPreview || game.kullPreview || game.nexusKullPreview) && !basicNative || game.advancedPreview ||
game.richeseBetrayalPreview ||
(!game.nexusCards && (game.guildBetrayalPreview || game.nexusIxianReplacementPreview ||
game.nexusIxianBetrayalPreview || game.nexusHarkonnenBetrayalPreview)) ||
+12 -1
View File
@@ -15,6 +15,7 @@ export type KullDefaultProfile = {
discoveries?: unknown;
discoveryStash?: unknown;
greatMaker?: unknown;
sandtrout?: unknown;
homeworlds?: unknown;
techTokens?: unknown;
strongholdCards?: unknown;
@@ -58,8 +59,18 @@ export function kullDefaultProfile(game: KullDefaultProfile): KullDefaultEligibi
new Set(game.players.map(player => player.faction)).size !== game.players.length)
return blocked('Automatic Kull needs one to six distinct factions, including CHOAM, with their selected decks.');
const options = game.lobbyOptions, projected = game.lobbyModules;
if (game.nexusCards || projected?.nexusCards) {
if (game.expansions.length !== 2 ||
!game.players.every(player => player.faction === 'choam' || classic.has(player.faction)) ||
options?.leaderSkills || options?.ecazTreachery || projected?.leaderSkills ||
projected?.ecazTreachery || projected?.discoveries || game.leaderSkills || game.ecazTreachery ||
game.discoveryEnabled || game.discoveries || game.discoveryStash || game.greatMaker ||
game.homeworlds || game.techTokens || game.strongholdCards || game.sandtrout)
return blocked('Kull with Nexus currently requires Basic CHOAM and classic factions, the Ix and CHOAM decks, and no other optional modules.');
return { eligible: true, reason: null };
}
if (options?.leaderSkills || projected?.leaderSkills ||
projected?.nexusCards || projected?.discoveries || game.leaderSkills || game.ecazTreachery || game.nexusCards ||
projected?.discoveries || game.leaderSkills || game.ecazTreachery ||
game.discoveryEnabled || game.discoveries || game.discoveryStash || game.greatMaker ||
game.homeworlds || game.strongholdCards ||
(game.techTokens && (!basicKullTechRoster(game) || options?.ecazTreachery || projected?.ecazTreachery)))
+2 -2
View File
@@ -5993,7 +5993,7 @@ export const RULE_TOPICS: RuleTopic[] = [
developmentStage: 'Verified',
summary: 'In the explicit Nexus Kull preview, choose one actual Treachery fuel card at a Karama attempt; the CHOAM Nexus is spent when the declaration is accepted, even if Kull is prevented.',
steps: [
'This is the fresh local nexus-kull development profile, not a public expansion start or an upgrade to existing saves. It admits two to six ready seats with native CHOAM and otherwise classic factions in Basic or Advanced, physical CHOAM and Ix Treachery decks, and Nexus alone. Other optional modules, expansion factions, Semuta and Richese Betrayal stay outside its boundary. The older kull profile remains printed-only and has no Nexus cards.',
'Fresh Basic CHOAM/classic public games with the CHOAM and Ix decks and Nexus alone enable this preview by default; the host may turn it off. Original Ix Sandtrout stays in the Spice deck. The separate local Advanced audit remains available. Other optional modules, expansion factions, Semuta and Richese Betrayal stay outside this profile; existing games are not converted.',
'The CHOAM Nexus face says: Discard any Treachery Card to obtain a Worthless Card special effect of your choice. Basic uses the CHOAM phase-wide scope; new Advanced attempts use the supplied specific-effect scope with provisional phase expiry. Cunning changes the fuel identity, not the effect, target or timing. Neither text supplies a nested counter priority: distinct counters and BG-before-conversion custody are the recorded user-selected policy, not a publisher clarification.',
'Wait for another player’s validated Karama attempt. There is no proactive Kull choice in the generic Nexus panel. The public event, attempted player and purpose are the same whether CHOAM holds CHOAM Nexus, another Nexus, no eligible fuel or no Nexus at all. Only CHOAM receives its private source-aware plays and blocking reasons; opponents do not see the cost list or reserved original card.',
'Choose a cost through the shared selector and inspect that actual card before Use. Printed source requires a held printed Kull Wahad. Nexus source requires unallied native CHOAM holding the actual CHOAM Nexus in this profile and one uniquely held canonical Treachery Card: a weapon, defense, special, Karama or Worthless card can be fuel. Reserved or promise-incompatible fuel is unavailable. The card does not become a manufactured Kull, and Karama used as fuel does not activate its own power.',
@@ -6235,7 +6235,7 @@ export const RULE_TOPICS: RuleTopic[] = [
summary: 'Fresh supported classic starts cancel one original native Harkonnen traitor call, return that physical card immediately and give Harkonnen a private replacement during Mentat Pause.',
searchText: 'Harkonnen Nexus Betrayal revealed declared traitor ally caller beneficiary shuffle replacement Mentat neutral acknowledgement',
steps: [
'In supported Basic selected-deck Nexus starts that initialize this reaction, native expansion leaders and the Ix Cheap Hero Traitor can also be declared. The selected stock and Richese cache remain physical; an owed replacement waits through the Ix phase-opening acknowledgements before the original Mentat draw. Advanced selected-deck reactions remain unfinished and their original calls continue without this interruption.',
'Fresh Basic Nexus starts with selected Ix and/or CHOAM decks and no other modules initialize this reaction even when every selected family is seated, including the supported Richese/Semuta start. Native expansion leaders and the Ix Cheap Hero Traitor can be declared. An owed replacement waits through the Ix phase-opening acknowledgements before the original Mentat draw. Advanced selected-deck reactions remain unfinished and their original calls continue without this interruption.',
'Original standalone preview requires native Harkonnen, classic2–6 Basic/Advanced, base33 and Nexus alone. Fresh classic Nexus core initializes the same effect with base33 or selected36, optional14, original Tech3+ and Advanced Strongholds2+, alongside actual Guild/Ixian reactions. Public selection binds the census; real held-card effects and cleanup stay native. No played game is reflagged; other native/module envelopes remain separate.',
'Nexus has no initial deal. An actual alliance-qualified closing Nexus must supply the unallied holder. An effect scenario needs at least three seats; two seats can continue ordinary play without inventing a card. Two simultaneous receivers need four actual seats.',
'The photographed publisher face cancels a revealed Harkonnen traitor, shuffles that exact card back immediately, and gives Harkonnen one replacement during Mentat Pause. It is not a draw-now exchange, whole-battle ban or refund of an already resolved outcome. Native Cunning and absent-Harkonnen Secret Ally remain separate effects.',