From 7e3d7458076162e40de063372171409c5f2f8d07 Mon Sep 17 00:00:00 2001 From: Quintine <15965533+Quintine@users.noreply.github.com> Date: Thu, 29 Oct 2026 04:55:44 +1100 Subject: [PATCH] Prototype native Homeworld No-Field return --- components/homeworld-shipment.tsx | 11 +- docs/CURRENT_STATUS.md | 9 + docs/HOMEWORLD_RULES.md | 4 +- docs/RICHESE_NO_FIELD_RULES.md | 28 ++- docs/RULE_DECISIONS.md | 22 +- game/engine.ts | 7 +- game/homeworld-alliance.ts | 5 +- game/homeworld-occupation-history.ts | 5 +- game/reference.ts | 7 +- game/richese-homeworld-marker-combat.ts | 4 +- game/richese-homeworld-marker-shipment.ts | 7 +- tests/native-world-no-field-controls.test.tsx | 122 +++++++++ tests/native-world-no-field-helpers.test.ts | 98 ++++++++ tests/native-world-no-field-runtime.test.ts | 231 ++++++++++++++++++ tests/richese-homeworld-marker-combat.test.ts | 3 +- ...omeworld-marker-transfer-controls.test.tsx | 5 +- ...se-homeworld-marker-transfer-quote.test.ts | 4 +- 17 files changed, 540 insertions(+), 32 deletions(-) create mode 100644 tests/native-world-no-field-controls.test.tsx create mode 100644 tests/native-world-no-field-helpers.test.ts create mode 100644 tests/native-world-no-field-runtime.test.ts diff --git a/components/homeworld-shipment.tsx b/components/homeworld-shipment.tsx index 0ab8ecd9..e9e5d02f 100644 --- a/components/homeworld-shipment.tsx +++ b/components/homeworld-shipment.tsx @@ -26,8 +26,10 @@ export function HomeworldNoFieldShipment({ game, act, busy }: { const deployed = info.private.deployed; const source = deployed && 'homeworld' in deployed.location ? deployed.location.homeworld : undefined; const targets = (game.homeworlds?.worlds ?? []).filter(world => - world.native !== me.id && world.native !== me.ally && world.id !== source); - const destination = targets.find(world => world.id === selectedDestination) ?? targets[0]; + (world.native !== me.id || !!source && game.advanced) && + world.native !== me.ally && world.id !== source); + const destination = targets.find(world => world.id === selectedDestination) ?? + targets.find(world => world.native !== me.id) ?? 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] : @@ -39,8 +41,9 @@ export function HomeworldNoFieldShipment({ game, act, busy }: { Ship a concealed No-Field

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. - {' Physical forces from the same source may accompany it.'}

+ remain in your reserves until the marker is revealed. On your own Homeworld, + the represented forces are already in those reserves and are not added again. + This uses your normal shipment. Physical forces from the same source may accompany it.