diff --git a/components/game-table.tsx b/components/game-table.tsx
index 8691ac4f..99ec141e 100644
--- a/components/game-table.tsx
+++ b/components/game-table.tsx
@@ -101,7 +101,8 @@ import { PlanetologistMovement } from './planetologist-movement';
import { selectedOriginElites, advisorFlipMovementBlocked } from '@/game/planetologist-movement';
import { SandmasterMovement } from './sandmaster-movement';
import { SandmasterWormChoice } from './sandmaster-worm';
-import { sandmasterWormCollection } from '@/game/sandmaster-worm';
+import { sandmasterWormCollection, sandmasterCunningCollection } from '@/game/sandmaster-worm';
+import { fremenCunningPublicDestinationBlock } from '@/game/nexus-fremen-cunning';
import { ResidualPoison, BattleLeaderOpportunity } from './residual-poison';
import { PortableSnooper } from './portable-snooper';
import {
@@ -536,12 +537,18 @@ export function GameTable({
const [rideForces, setRideForces] = useState>({});
const [collectSandmasterRide, setCollectSandmasterRide] = useState(true);
const [sandmasterRidePile, setSandmasterRidePile] = useState<{ target: string; key: string } | null>(null);
- const sandmasterRideTarget = JSON.stringify([g.turn, g.decision?.kind === 'wormRide' ? g.decision : null, selected, sector]);
- const baseSandmasterRide = sandmasterWormCollection(g, me.id, selected, sector);
+ const sandmasterRideTarget = JSON.stringify([g.turn,
+ g.decision?.kind === 'wormRide' || g.decision?.kind === 'nexusFremenCunningRide' ? g.decision : null,
+ source, selected, sector]);
+ const baseSandmasterRide = g.decision?.kind === 'nexusFremenCunningRide'
+ ? sandmasterCunningCollection(g, me.id, source, selected, sector)
+ : sandmasterWormCollection(g, me.id, selected, sector);
const selectedRidePile = sandmasterRidePile?.target === sandmasterRideTarget
? baseSandmasterRide?.piles.find(pile => pile.key === sandmasterRidePile.key) : null;
const sandmasterRide = selectedRidePile && baseSandmasterRide
? { ...baseSandmasterRide, key: selectedRidePile.key, before: selectedRidePile.before } : baseSandmasterRide;
+ const cunningDestinationBlocked = g.decision?.kind === 'nexusFremenCunningRide' && source
+ ? fremenCunningPublicDestinationBlock(g, me.id, source, { territory: selected, sector }) : null;
const [exchangeCards, setExchangeCards] = useState>(
{},
);
@@ -3828,16 +3835,23 @@ export function GameTable({
)}
)}
{destination}
+ {cunningDestinationBlocked && {cunningDestinationBlocked}
}
+ setSandmasterRidePile({ target: sandmasterRideTarget, key })} />
{actionButton('Ride remotely', {
type: 'decision', event: g.decision.event, accept: true,
source, territory: selected, sector,
+ ...(sandmasterRide?.blocked === null
+ ? { sandmasterCollect: collectSandmasterRide,
+ ...(collectSandmasterRide ? { sandmasterPile: sandmasterRide.key } : {}) } : {}),
forces: Object.fromEntries(Object.entries(rideForces)
.filter(([key, count]) => count > 0 && splitLocation(key).territory === source)
.map(([key, count]) => [key, {
normal: count - (eliteForces[key] ?? 0),
elite: eliteForces[key] ?? 0,
}])),
- }, !source || !Object.entries(rideForces).some(([key, count]) =>
+ }, !source || !!cunningDestinationBlocked || !Object.entries(rideForces).some(([key, count]) =>
count > 0 && splitLocation(key).territory === source))}
{actionButton('Decline remote ride', {
type: 'decision', event: g.decision.event, accept: false,
diff --git a/components/nexus-fremen-betrayal.tsx b/components/nexus-fremen-betrayal.tsx
index 0ec6df13..1c6f6c0c 100644
--- a/components/nexus-fremen-betrayal.tsx
+++ b/components/nexus-fremen-betrayal.tsx
@@ -21,6 +21,10 @@ export function NexusFremenBetrayal({ game, act, busy }: Props) {
? `Declare before the first spice blow: ${fremen.name} cannot take ordinary or Cunning worm rides this turn. Worm destruction, survival, protection and Nexus still resolve.`
: `This use suppresses ${fremen.name}’s native two-territory movement advantage for the rest of this turn. Independent ornithopters remain available.`}
}
+ {offer.mode === 'worm' && game.discoveries &&
+ Provisional Great Maker interpretation: its reserve ride is also prevented;
+ the original vote, worm effects and Nexus continue.
+
}
{offer.blocked && {offer.blocked}
}