Connect native Fremen Nexus effects across selected modules

Retain actual Cunning appearances, paid Karama and typed remote riding with optional Sandmaster collection and source-parent HMS entry. Preserve Betrayal movement sources and apply its declared worm restriction to Great Maker reserve riding without suppressing votes or casualties. Completed Maker history no longer blocks a later ordinary offer.

Validation: frozen 14-file86/86, types/lint/build, nine finite original-action/rendered-control programmes, four minimal legal policies. Discovery destination proof remains focused quotes pending actual arrival; full combinations, assurance and deployed acceptance remain required. No saved-game, restart or deployment operation.
This commit is contained in:
Quintine committed 2026-10-18 11:35:59 +11:00
1 parent bb9d292c4c
commit b4157aaa9b
20 files changed
+1349 -41

No files matched your search

+8 -4
View File
@@ -99,7 +99,8 @@ import {
} from './bot-mobility';
import { planetologistMovementModeSupported, planetologistLeader, planetologistGatherAdvisorEntry } from './planetologist-movement';
import { quoteSandmasterStronghold, sandmasterDefaultChoice, sandmasterDestinationCollection } from './sandmaster-movement';
import { sandmasterWormCollection } from './sandmaster-worm';
import { sandmasterWormCollection, sandmasterCunningCollection } from './sandmaster-worm';
import { fremenCunningPublicDestinationBlock } from './nexus-fremen-cunning';
import { richeseCardDefinition } from './richese-cards';
import { presenceAt } from './force-presence';
import { botArrivalBlock, botWormRideArrivalBlock } from './bot-arrival';
@@ -2763,10 +2764,13 @@ function policyActions(g: GameView): Action[] {
const elite = me.elites?.forces[key] ?? 0;
const forces = { [key]: { normal: count - elite, elite } };
for (const to of destinations(g)) {
if (to.t === source || !botEntryAllowed(g, me, to.t, to.s, 'move') ||
territoryEntryBlock(g.players, me.id, to.t)) continue;
if (fremenCunningPublicDestinationBlock(g, me.id, source,
{ territory: to.t, sector: to.s }) || !botEntryAllowed(g, me, to.t, to.s, 'move')) continue;
const sandmaster = sandmasterCunningCollection(g, me.id, source, to.t, to.s);
candidates.push({ type: 'decision', event: d.event, accept: true,
source, forces, territory: to.t, sector: to.s });
source, forces, territory: to.t, sector: to.s,
...(sandmaster?.blocked === null && sandmaster.key
? { sandmasterCollect: true, sandmasterPile: sandmaster.key } : {}) });
if (candidates.length >= 16) return [...candidates, decline];
}
}