Restore safe Duke grants in early legacy games
Verify and publish checkpoint container / container (push) Successful in 10m31s

This commit is contained in:
Quintine committed 2026-10-29 19:35:55 +11:00
1 parent 59cb336c80
commit 22b463a395
10 files changed
+263 -11

No files matched your search

+4 -1
View File
@@ -147,7 +147,7 @@ import { battleCardSlotEligible, battleCategoryInspectionValue, fixedBattleInspe
import { HARASS_WITHDRAW_CARD, HarassWithdrawError, isHarassWithdraw, quoteHarassWithdraw, defaultHarassWithdrawAllocation, harassWithdrawNeedsAllocation, type HarassWithdrawSelection, type HarassWithdrawContext, type HarassWithdrawPreview } from './harass-withdraw';
import { originalAuctionInspectionLot } from './auction-inspection-source';
import { nextDukeCaptureUncertainty } from './duke-capture-uncertainty';
import { dukeCaptureUncertaintyBlock, plainAdvancedEcazDukeProfile } from './ecaz-duke-capture-policy';
import { dukeCaptureUncertaintyBlock, legacyDukeCaptureHistoryClear, plainAdvancedEcazDukeProfile } from './ecaz-duke-capture-policy';
import { discoveryChoices, discoveryStashSignature, type DiscoveryStash } from './discovery-actions';
import { createStormSource, validateStormSource, discoveryStormOffer, createDiscoveryStorm, chooseDiscoveryStorm, validateDiscoveryStorm, finishDiscoveryStorm, discoveryStormDistance, discoveryStormSaphoModes, reorderDiscoveryStorm, type StormMovementSource, type DiscoveryStorm } from './discovery-storm';
import { completeDiscoveryFlight, discoveryFlightOffer, quoteDiscoveryFlight, validateDiscoveryFlight, type DiscoveryFlightReceipt } from './discovery-flight';
@@ -31327,6 +31327,7 @@ function reconcileHomeworldEcazDuke(g: Game) {
!duke.leader.dead && !duke.leader.capturedBy && !duke.leader.gholaBy && !duke.leader.concealed) {
g.dukeVidal = consumeDuke(duke);
log(g, 'Occupied Ecaz displaced Duke Vidal’s ordinary faction grant; the occupier chooses its eligible recipient.');
g.dukeCaptureUncertain = false;
}
const available = homeworldRule(() => quoteHomeworldEcazDuke(g));
if (!available.blocked && available.event && available.owner && available.recipients.length === 1)
@@ -44038,6 +44039,7 @@ export function normalizeAutomaticGame(state: Game): Game {
ecazCollectionIntegrity(state);
ecazAllianceIntegrity(state);
const g = structuredClone(state);
if (legacyDukeCaptureHistoryClear(g)) g.dukeCaptureUncertain = false;
reconcileHomeworldEcazDuke(g);
syncTupileSlots(g);
prepareTupileCleanup(g);
@@ -44155,6 +44157,7 @@ function applyActionInner(
'Finish the original occupied Tupile hand cleanup before another action.');
ecazTreacheryIntegrity(state);
const g = structuredClone(state);
if (execution === 'live' && legacyDukeCaptureHistoryClear(g)) g.dukeCaptureUncertain = false;
if ((g.pendingNexusEmperorPayment || g.pendingNexusEmperorSellerPurchase || g.pendingAmbassador?.nexusPurchase) &&
!g.truthtrance && !pendingNexusTraitors(g)) {
const p = getPlayer(g, id);