Expand Semuta and Richese Homeworld shipments
Verify and publish checkpoint container / container (push) Successful in 10m7s

This commit is contained in:
Quintine committed 2026-10-28 22:26:47 +11:00
1 parent 1ba942138d
commit 4d769af8c7
15 files changed
+626 -39

No files matched your search

+3 -2
View File
@@ -1281,8 +1281,9 @@ export function GameTable({
{g.semutaRecruitsPreview && (
<p className="notice" role="status">
Semuta Drug preview: in this independent-card game, Semuta can react
to another player discarding Recruits. Other Semuta discard
opportunities in this combination are still being implemented.{' '}
to another player discarding Recruits, Hajr, Ghola, Harvester,
Weather Control or Family Atomics. Other discard opportunities are
still being implemented.{' '}
<a href="/rules?topic=card-recruits#card-recruits">Recruits rules</a>
</p>
)}
+6 -5
View File
@@ -30,16 +30,17 @@ export function HomeworldNoFieldShipment({ game, act, busy }: {
const destination = targets.find(world => world.id === selectedDestination) ?? targets[0];
const tokens = info.private.tokens.filter(token => source ? token.id === deployed?.tokenId : token.id !== info.private!.lastShipped);
const token = tokens.find(candidate => candidate.id === selectedToken) ?? tokens[0];
const pool = source ? game.homeworlds?.worlds?.find(world => world.id === source)?.forces[me.id] : undefined;
const pool = source ? game.homeworlds?.worlds?.find(world => world.id === source)?.forces[me.id] :
{ normal: me.reserves - (me.elites?.reserves ?? 0), elite: me.elites?.reserves ?? 0 };
const quote = richeseHomeworldMarkerChoice(game, destination?.id ?? '', token?.id ?? '', allyPayment, source,
source ? forces : undefined);
forces);
return <fieldset disabled={busy || !!me.autopilot || !!game.homeworldShipment?.blocked}
className="space-y-3 pt-3">
<legend>Ship a concealed No-Field</legend>
<p className="fine">Provisional Homeworld rule: ship one concealed marker {source ? `from ${homeworldName(game, source)}` : 'from your supply'} to
another non-allied Homeworld. Its value stays private and its represented forces
remain in your reserves until the marker is revealed. This uses your normal shipment.
{source && ' Physical forces already on the same Homeworld may accompany it.'}</p>
{' Physical forces from the same source may accompany it.'}</p>
<label className="block space-y-1">Destination Homeworld for No-Field
<select aria-label="No-Field destination Homeworld" value={destination?.id ?? ''}
onChange={event => setSelectedDestination(event.target.value)}>
@@ -56,8 +57,8 @@ export function HomeworldNoFieldShipment({ game, act, busy }: {
{tokens.map(candidate => <option key={candidate.id} value={candidate.id}>No-Field {candidate.value}</option>)}
</select>
</label>
{source && pool && <fieldset className="space-y-2">
<legend>Accompanying forces from {homeworldName(game, source)}</legend>
{pool && <fieldset className="space-y-2">
<legend>Accompanying forces from {source ? homeworldName(game, source) : 'your reserves'}</legend>
{(['normal', 'elite'] as const).filter(kind => kind === 'normal' || pool.elite > 0).map(kind =>
<label key={kind} className="block space-y-1">
{kind === 'normal' ? 'Normal forces' : specialForceName(me.faction)} accompanying No-Field · {pool[kind]} available