Admit original native Nexus bank purchases without widening legacy revivals

This commit is contained in:
Quintine committed 2026-10-15 11:41:20 +11:00
1 parent e2dc5f3d0d
commit 172363d9d3
14 files changed
+681 -39

No files matched your search

+7 -8
View File
@@ -44,8 +44,8 @@ import { quoteNexusMoritaniRetention, nexusMoritaniRetentionSignature, type Nexu
import { quoteNexusChoamBetrayal, validateNexusChoamBetrayal, nexusChoamBetrayalSignature, type NexusChoamBetrayal } from './nexus-choam-betrayal';
import { quoteEcazInquiry, ecazInquiryAnswer, ecazInquiryHistory, ecazInquirySignature, validateEcazInquiry, type EcazInquiryReceipt } from './nexus-ecaz-inquiry';
import { nexusCleanPlayBlocked } from './nexus-play-boundary';
import { EMPEROR_NEXUS_REVIVALS, emperorNexusModeSupported, quoteEmperorNexusRevival, createEmperorNexusRevival, settleEmperorNexusRevival, validateEmperorNexusRevival, type NexusEmperorRevival } from './nexus-emperor-secret-ally';
import { emperorNexusPurchaseEvent, quoteEmperorNexusPurchase, signEmperorNexusPurchase, validateEmperorNexusPurchase, emperorNexusSellerPurchaseModeSupported, quoteEmperorNexusSellerPurchase, createEmperorNexusSellerPurchase, emperorNexusAmbassadorPurchaseModeSupported, quoteEmperorNexusAmbassadorPurchase, createEmperorNexusAmbassadorPurchase, quoteEmperorNexusSpecialPurchase, createEmperorNexusSpecialPurchase, type EmperorNexusPurchase } from './nexus-emperor-purchase';
import { EMPEROR_NEXUS_REVIVALS, emperorNexusLegacyRevivalModeSupported, quoteEmperorNexusRevival, createEmperorNexusRevival, settleEmperorNexusRevival, validateEmperorNexusRevival, type NexusEmperorRevival } from './nexus-emperor-secret-ally';
import { emperorNexusPurchaseEvent, quoteEmperorNexusPurchase, signEmperorNexusPurchase, validateEmperorNexusPurchase, emperorNexusBankPurchaseModeSupported, emperorNexusSellerPurchaseModeSupported, quoteEmperorNexusSellerPurchase, createEmperorNexusSellerPurchase, emperorNexusAmbassadorPurchaseModeSupported, quoteEmperorNexusAmbassadorPurchase, createEmperorNexusAmbassadorPurchase, quoteEmperorNexusSpecialPurchase, createEmperorNexusSpecialPurchase, type EmperorNexusPurchase } from './nexus-emperor-purchase';
import { createEmperorPaymentReceipt, validateEmperorPaymentReceipt, emperorPaymentUseBlock, emperorPaymentSourceQuote, requiredEmperorPaymentResponders, emperorPaymentReceiptSignature, type EmperorPaymentReceipt } from './nexus-emperor-payment';
import { FREMEN_NEXUS_FREE_FORCES, fremenNexusRevivalOffer, createFremenNexusRevival, upgradeFremenNexusRevival, validateFremenNexusRevival, type FremenNexusRevival } from './nexus-fremen-revival';
import { captureFremenCunningOccurrence, quoteFremenCunning, quoteFremenCunningRide, validateFremenCunningSelection, type FremenCunningOccurrence, type FremenCunningRideAuthorization, type FremenCunningSelection } from './nexus-fremen-cunning';
@@ -2735,8 +2735,7 @@ function playNexusBgBetrayal(g: Game, p: Player, action: Action) {
}
/** The public payment window must not depend on who privately holds Emperor Nexus. */
function emperorNexusUniformAuctionPayment(g: Game): boolean {
return !!g.nexusCards?.cards && !byFaction(g,'emperor') &&
emperorNexusModeSupported(g) && !g.ecazTreachery && !g.sandtrout &&
return !!g.nexusCards?.cards && emperorNexusBankPurchaseModeSupported(g) &&
!!g.auction && !g.currentAuctionSale;
}
@@ -2754,8 +2753,8 @@ function nexusEmperorSecretAllyOffer(g:Game,owner:string) {
if (purchasing) {
let purchaseBlock:string|null = null;
if (p.ally) purchaseBlock = 'Emperor Nexus Secret Ally requires an unallied buyer.';
else if (!emperorNexusModeSupported(g) || g.ecazTreachery || g.sandtrout)
purchaseBlock = 'Emperor Nexus purchase requires a supported classic Nexus profile; unrelated modules remain unavailable.';
else if (!emperorNexusBankPurchaseModeSupported(g))
purchaseBlock = 'Emperor Nexus purchase requires its supported original Nexus profile and normal bank auction.';
else if (g.response || g.truthtrance || g.phaseOpening || g.pendingKarama ||
g.pendingTreacheryDiscard || g.pendingNullentropy || g.pendingExchange ||
g.pendingRicheseGift || g.pendingRichesePurchaseIncome || g.pendingAmbassador ||
@@ -2783,7 +2782,7 @@ function nexusEmperorSecretIntegrity(g:Game) {
for (const [index,record] of history.entries()) {
nexusRule(() => validateEmperorNexusRevival(g,record));
if (!('version' in record))
requireRule(emperorNexusModeSupported(g),
requireRule(emperorNexusLegacyRevivalModeSupported(g),
'A legacy Emperor return lost its original supported roster.');
else if (record.stage === 'requested')
requireRule(index === history.length - 1 && g.pendingRevival?.nexusEmperorEvent === record.event &&
@@ -2807,7 +2806,7 @@ function nexusEmperorSecretIntegrity(g:Game) {
for (const [index,record] of purchases.entries()) {
nexusRule(() => validateEmperorNexusPurchase(g,record));
if (!('version' in record))
requireRule(emperorNexusModeSupported(g) && !g.ecazTreachery && !g.sandtrout,
requireRule(emperorNexusBankPurchaseModeSupported(g),
'A normal-bank Emperor purchase lost its original supported profile.');
else if (record.version === 3)
requireRule(emperorNexusAmbassadorPurchaseModeSupported(g),