Expand Basic Richese movement and worm interactions
Verify and publish checkpoint container / container (push) Canceled after 0s

This commit is contained in:
Quintine committed 2026-10-29 09:54:24 +11:00
1 parent 3dbd326891
commit 605cb2a32f
12 files changed
+637 -8

No files matched your search

+4 -1
View File
@@ -1,5 +1,6 @@
import type { Game } from './engine';
import { validateFremenRevivalGrant } from './fremen-revival-grant';
import { richeseRevealForeignMovementPending } from './richese-reveal-foreign-movement';
const factions = new Set([
'atreides', 'beneGesserit', 'emperor', 'fremen', 'guild', 'harkonnen',
@@ -51,8 +52,9 @@ export function richeseRevealInterruptSupported(g: Game): boolean {
// Each other pending field is an active child/continuation, not a completed
// receipt. Empty pending arrays do not represent a live child.
const foreignMovement = richeseRevealForeignMovementPending(g);
if (Object.entries(g).some(([key, value]) => key.startsWith('pending') &&
!(key === 'pendingShipment' && guildRate) &&
!(key === 'pendingShipment' && guildRate) && key !== foreignMovement &&
(Array.isArray(value) ? value.length > 0 : value !== null && value !== undefined && value !== false))) return false;
const live = (rows: readonly {turn: number; fulfilled?: boolean; released?: boolean}[] | undefined) =>
@@ -72,6 +74,7 @@ export function richeseRevealInterruptSupported(g: Game): boolean {
g.mixedAllianceQuestions, g.mixedMovementQuestions, g.mixedTraitorQuestions, g.mixedBattleQuestions];
if (mixed.some(rows => rows?.some(row => row.turn === g.turn && row.binding))) return false;
if (foreignMovement) return true;
if (g.response) {
// Only independent, un-nested native responses with a stable original
// source are admitted. In particular, shipment and revival transactions