Integrate Smuggler companion with owned Richese No-Field
Connect the GF9 FAQ combination: one free physical reserve force accompanies an owned concealed No-Field at its unchanged one-marker price. Preserve zero/three/five token values, actual supply at later reveal, optional human choice and all four legal AI paths. Genuine CHOAM & Richese Leader Skills development setup adds the two sourced battle cards without duplicating their Ix identities. Public mode and publication gates stay closed; allied and remaining combined routes are unfinished. Bind the private declaration across initial No-Field cancellation and later Advanced Guild interception, including saved interruptions. Validate before projection/actions/normalization, hide the internal proof, reject altered declarations immutably, and withdraw the companion once only on successful commitment. Independent rules/privacy/persistence review found no blocker. Preserve other audit setup gates despite expanded deck assembly. Repair the existing randomized recovery test with a genuine seeded Rihani offer and explicit human choice, replacing an inappropriate AI-policy call on a human seat. Initial Karama and later Guild stop retain their distinct existing opportunity outcomes. Validation: 72 focused regressions plus 10 deck tests; typecheck, lint, 4520 offline tests, production build and 43 HTTP tests passed. SQLite restart, concurrent allowance/cancellation and exact physical custody passed. Browser genuine assignment, private token selection, opt-in, one-spice shipment, refresh, five-force reveal and final refresh preserved six physical Arrakeen forces, 14 reserves, zero Tanks, four spice, Crysknife and Soo-Soo Sook. Genuine four-profile Basic/Advanced games completed in 77/116 actions with 3/4 JSON restores and no rejected candidates; Advanced exercised one companion shipment and later reveal. After the outage the existing server was healthy. Preserved all 529 opening rooms and original seat/recovery records (563 after QA/HTTP). SQLite integrity and foreign keys passed. No restart, database reset or automation. Verified source tree: c2aee4138bcb46a05814a340d62eadace3470247ca620844eb0375e78ea4d6c4
This commit is contained in:
1 parent
bf8036dfc1
commit
788453e07e
20 files changed
+1213
-51
No files matched your search
+14
-2
@@ -66,6 +66,7 @@ import {
|
||||
} from './shrine';
|
||||
import { reserveShipmentCost } from './shipment-price';
|
||||
import { quoteSmugglerShipment } from './smuggler-shipment';
|
||||
import { quoteSmugglerNoField } from './smuggler-no-field';
|
||||
import { spiceBankerBattleMaximum, spiceBankerModeSupported } from './spice-banker';
|
||||
import { nexusGuildSecretAllyAction, nexusGuildSecretAllyCanAct, nexusGuildSecretAllyQuote } from './nexus-guild-secret-ally-options';
|
||||
import { nexusRicheseAction, nexusRicheseQuote } from './nexus-richese-options';
|
||||
@@ -2947,11 +2948,21 @@ function policyActions(g: GameView): Action[] {
|
||||
(token) => token.id === marker?.tokenId,
|
||||
);
|
||||
const materialized = Math.min(deployedToken?.value ?? 0, me.reserves);
|
||||
const physicalAlongsideMarker = marker
|
||||
? countAt(me, marker.location.territory) > 0
|
||||
: false;
|
||||
const reveal =
|
||||
noField?.canReveal && marker && materialized > 0
|
||||
noField?.canReveal &&
|
||||
marker &&
|
||||
(materialized > 0 || physicalAlongsideMarker)
|
||||
? { type: 'revealNoField', token: marker.tokenId, event: noField.event }
|
||||
: null;
|
||||
if (reveal && (!me.shipped || (me.moved ?? 0) >= (me.movesAllowed ?? 1)))
|
||||
if (
|
||||
reveal &&
|
||||
(physicalAlongsideMarker ||
|
||||
!me.shipped ||
|
||||
(me.moved ?? 0) >= (me.movesAllowed ?? 1))
|
||||
)
|
||||
return [reveal];
|
||||
const markerTargets = targets.filter(
|
||||
(to) =>
|
||||
@@ -2986,6 +2997,7 @@ function policyActions(g: GameView): Action[] {
|
||||
territory: to.t,
|
||||
sector: to.s,
|
||||
allyPayment: Math.max(0, cost - (me.spice ?? 0)),
|
||||
...(quoteSmugglerNoField(g, me.id, to.t) ? { smuggler: true } : {}),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user