Compose Guild Cunning with physical Ornithopter movement

Provisionally let either physical card mode replace an earned unused Hajr movement after the second shipment. Keep active group rights separate from actual completed credits and original movement counts. Add v3 original-count receipts while preserving old formats; abandon partial flights through a bound discard suffix before Cunning resumes. Connect persistent controls and minimal legal bot candidates.

Validation: frozen13-file125/125, types/lint/build and eight original-action/rendered-table continuations. Public ready/start, cache1/Hajr1 purchases, real worm/alliance/Guild Nexus draw and paid first2/second1 shipments cover both modes, earlier flights and Basic early endings. Eight minimal policy proposals are legal. No frozen repair; bounded continuation review found no concrete defect. New Semuta grammar lacks direct combined claim/capture proof. Wider combinations, complete modes, final assurance and browser/deployed acceptance remain open. No saved-room/reset/restart/deployment operation.
This commit is contained in:
Quintine committed 2026-10-18 13:10:12 +11:00
1 parent 7fe84ffbbd
commit 561152d58e
16 files changed
+887 -54

No files matched your search

+3 -3
View File
@@ -5001,7 +5001,7 @@ export function GameTable({
{guildCunning?.stage === 'secondShipment'
? 'Choose or decline the second shipment before any Hajr movement.'
: guildCunning?.stage === 'extraMove'
? `${guildCunning.movesLeft} unused Hajr movement remaining. No ordinary movement is granted.`
? `${guildCunning.movesLeft} movement remaining from unused Hajr or the active card. No ordinary movement is granted.`
: (me.moved ?? 0) < (me.movesAllowed ?? 1)
? `${(me.movesAllowed ?? 1) - (me.moved ?? 0)} movement remaining.`
: 'Movement complete. Finish your turn when your shipment is also settled.'}
@@ -5066,7 +5066,7 @@ export function GameTable({
<AdvancedAllySeparation quote={g.advancedAllySeparation} />
{g.nexusGuildCunning?.offer && (
<section className="notice">
<p>Guild Cunning ends your ordinary shipment and movement, then offers one second shipment at normal Guild prices. Only an unused Hajr move can follow it. The physical Ornithopter card combination remains unavailable.</p>
<p>Guild Cunning ends your ordinary shipment and movement, then offers one second shipment at normal Guild prices. Only an unused Hajr move can follow it. Provisional card combination: Ornithopter can replace that unused Hajr movement; declaring Cunning abandons any unfinished current card group.</p>
{g.nexusGuildCunning.offer.blocked && <p>{g.nexusGuildCunning.offer.blocked}</p>}
{actionButton('Finish ordinary turn and declare Guild Cunning',
guildCunningAction ?? {type: 'endMovement'}, !guildCunningAction)}
@@ -5075,7 +5075,7 @@ export function GameTable({
{guildCunning && <p className="notice">{guildCunning.stage === 'secondShipment'
? 'Guild Cunning: choose your second shipment, or skip it and retain an unused Hajr move. This does not reopen ordinary movement.'
: guildCunning.stage === 'extraMove'
? 'The second shipment is settled. Use an unused Hajr move or finish your turn.'
? 'The second shipment is settled. Use an unused Hajr move, replace it with Ornithopter, finish an active card group, or finish your turn.'
: 'Guild Cunning awaits its cancellation response.'}</p>}
{guildCunning?.stage === 'secondShipment' && actionButton('Skip second shipment',
nexusGuildSkipShipmentAction(g, guildCunning.event) ?? {type: 'endMovement'},
+10
View File
@@ -31,6 +31,7 @@ export function OrnithopterMovement({
const me = game.players.find((p) => p.id === game.me);
if (!card || !me) return null;
const advisorGuidance = game.advanced && me.faction === 'beneGesserit';
const guildGuidance = !!game.nexusGuildCunning?.active;
const active = card.active;
const mode =
active?.mode ??
@@ -182,6 +183,14 @@ export function OrnithopterMovement({
</p>
</>
)}
{guildGuidance && (
<p className="notice" id={`${id}-guild-guidance`}>
Provisional Guild Cunning combination: Ornithopter replaces one unused
Hajr movement after the second shipment. Two-group mode keeps its second
different group available until you finish it or end your turn. Ending
early grants no movement for the abandoned group.
</p>
)}
{advisorGuidance && (
<p className="notice" id={`${id}-advisor-guidance`}>
Advanced Bene Gesserit advisors can use both card modes. Advisors in
@@ -207,6 +216,7 @@ export function OrnithopterMovement({
className="min-h-11 whitespace-normal motion-reduce:transition-none"
disabled={busy || !!reason}
aria-describedby={[
...(guildGuidance ? [`${id}-guild-guidance`] : []),
...(advisorGuidance ? [`${id}-advisor-guidance`] : []),
...(reason ? [`${id}-reason`] : []),
].join(' ') || undefined}