Support native early Basic movement promises

Price native Once Around and Silent funding in early movement forecasts, retaining full sealed donor locks and exact paid-sale boundaries. Add current zero/pass guidance, fixed non-CHOAM preopening Charity entitlement and shared owned normal-revival projection while actual counters remain pending. Preserve the mandatory Ix phase-opening continuation.

Validation: affected rules/control tests, types/lint, production build and six gameplay/control/table-rendering programmes with eight existing-profile native runs. Wider preparations, CHOAM own unresolved opening, modules/Advanced, full rules and deployed acceptance remain open. No saved-room, database, restart or deployment operation.
This commit is contained in:
Quintine committed 2026-10-24 16:05:41 +11:00
1 parent f995b6f4cd
commit c311ed4251
16 files changed
+787 -54

No files matched your search

+2 -1
View File
@@ -12,7 +12,7 @@ export function MovementPromises({ game, act, busy }: { game: GameView; act: (ac
const next = game.phase >= 5 || paidDecision ||
(game.phase === 2 && ['charity', 'ready'].includes(proposed?.type ?? '')) ||
(game.phase === 4 && ['revive', 'ready'].includes(proposed?.type ?? '')) ||
(game.phase === 3 && proposed?.type === 'passBid') ? proposed : undefined;
(game.phase === 3 && ['passBid', 'richeseBid'].includes(proposed?.type ?? '')) ? proposed : undefined;
const amount = next?.forces && typeof next.forces === 'object'
? Object.values(next.forces as Record<string, number>).reduce((sum, count) => sum + count, 0) : typeof next?.amount === 'number' ? next.amount : 0;
const destination = next && game.combatLocations.find(location => location.id === next.territory)?.name;
@@ -27,6 +27,7 @@ export function MovementPromises({ game, act, busy }: { game: GameView; act: (ac
: next?.type === 'revive' ? `Revive ${amount} forces for your later movement`
: next?.type === 'ready' ? 'Finish this preparation phase while preserving your promises'
: next?.type === 'passBid' ? 'Pass this bid and preserve later movement'
: next?.type === 'richeseBid' ? next.amount === 0 ? 'Submit zero in this Silent auction and preserve later movement' : 'Pass this Richese bid and preserve later movement'
: next?.type === 'card' && next.mode === 'shipment' ? `Use ${card?.name ?? 'your card'} for Guild shipment rates`
: next?.type === 'card' && card?.effect === 'nullentropyBox' ? 'Pay 2 spice and search with Nullentropy Box'
: next?.type === 'card' && next.mode === 'choam' ? 'Play Kulon to extend the required movement'