Prototype Jacurutu income, Testing Station and Shrine effects
Connect automatic unambiguous Jacurutu physical-force income, a sole-occupant Testing Station storm choice and Shrine reciprocal physical card roles to engine actions, player controls, legal AI and saved continuation. Preserve Weather Control exclusion, exact card/force custody, private hand boundaries and committed effects after restart. Shared role checks cover existing ordinary and special Karama paths; reserved cards cannot enter another pending use. Keep Orgiz, mixed-force Jacurutu allocation and contested Cistern/Testing Station benefits explicitly pending. These are bounded prototypes; complete Discovery/Advanced/expansion and publication gates remain closed. Validation: types, lint and 4,345 offline tests passed (32 added), production build passed, and 40 HTTP tests passed. Independent cross-reviews repaired reserved-card deadlock, physical-card selection, alternate-role permission, storm source/token binding and public-entitlement bot ordering. The first broad run found five failures; focused repairs preceded the stable repeated check. Browser A5EJQ2W4 used genuine Discovery setup/reveal/free entry with targeted QA positioning. A human increased storm movement from two to three sectors, moving sector 6 to 9. Refresh restored station forces and the private Snooper. This was targeted control/recovery evidence, not an unmodified full game. All 187 opening saved rooms remained unchanged; 31 QA/HTTP rooms were added (218 total). Reused the running server; no restart or save reset. Source-bound report: /home/quintine/.local/share/dune/checkpoints/20260913-discovery-location-effects/verification-final/report.json Source fingerprint: beecb85ab7ec39319115389c115434d161591e8549802c542a6343a0fc19bea6 Durations: check 140540ms; build 6741ms; integration 24956ms. Aggregate goal counter 63,116,444 to 64,295,091 at final verification: 1,178,647 tokens before final Git/push overhead for three bounded functions. Standing authorization: Push all from now on.
This commit is contained in:
1 parent
ab0ab52849
commit
f0d3d9c464
31 files changed
+2524
-138
No files matched your search
+17
-2
@@ -1,6 +1,7 @@
|
||||
import { discoveryBotActions } from './discovery-options';
|
||||
import { discoveryFlightBotActions } from './discovery-flight-options';
|
||||
import { discoveryEntryBotActions } from './discovery-entry-options';
|
||||
import { discoveryStormActions } from './discovery-storm-options';
|
||||
import { greatMakerBotActions } from './great-maker-options';
|
||||
import { nexusChoamTradeBotActions } from './nexus-choam-trade-options';
|
||||
import { nexusGuildCunningAction, nexusGuildCunningActive, nexusGuildHajrAction, nexusGuildMovementAvailable, nexusGuildShipmentAvailable, nexusGuildSkipShipmentAction } from './nexus-guild-cunning-options';
|
||||
@@ -57,6 +58,10 @@ import {
|
||||
import { ownedTech } from './tech-tokens';
|
||||
import type { StrongholdProgress } from './victory-progress';
|
||||
import { canUseAsKarama } from './karama';
|
||||
import {
|
||||
canUseAsKaramaRole,
|
||||
shrineTruthtranceBotAction,
|
||||
} from './shrine';
|
||||
import { reserveShipmentCost } from './shipment-price';
|
||||
import { nexusGuildSecretAllyAction, nexusGuildSecretAllyCanAct, nexusGuildSecretAllyQuote } from './nexus-guild-secret-ally-options';
|
||||
import { nexusRicheseAction, nexusRicheseQuote } from './nexus-richese-options';
|
||||
@@ -1204,7 +1209,11 @@ function policyActions(g: GameView): Action[] {
|
||||
(me.faction === 'tleilaxu' && g.decision?.kind === 'revivalStop')) &&
|
||||
g.advanced &&
|
||||
!me.specialKaramaUsed &&
|
||||
me.hand?.find((c) => c.effect === 'karama');
|
||||
me.hand?.find(
|
||||
(c) =>
|
||||
canUseAsKaramaRole(g, me, c) &&
|
||||
g.richeseGift?.pending?.card?.id !== c.id,
|
||||
);
|
||||
if (
|
||||
specialCard &&
|
||||
me.faction === 'ixians' &&
|
||||
@@ -2346,6 +2355,7 @@ function policyActions(g: GameView): Action[] {
|
||||
];
|
||||
if (d.kind === 'discoveryDiscard') return discoveryBotActions(g);
|
||||
if (d.kind === 'discoveryEntry') return discoveryEntryBotActions(g);
|
||||
if (d.kind === 'ecologicalStorm') return discoveryStormActions(g);
|
||||
if (d.kind === 'greatMakerVote' || d.kind === 'greatMakerRide') return greatMakerBotActions(g);
|
||||
if (d.kind === 'wormProtection')
|
||||
return [{ type: 'decision', accept: true }];
|
||||
@@ -2382,7 +2392,7 @@ function policyActions(g: GameView): Action[] {
|
||||
}
|
||||
if (d.kind === 'auctionPayment') {
|
||||
const karama = me.hand?.find((c) =>
|
||||
canUseAsKarama(g.advanced, me.faction, c),
|
||||
canUseAsKaramaRole(g, me, c),
|
||||
);
|
||||
const use =
|
||||
!!karama &&
|
||||
@@ -3415,6 +3425,11 @@ export function botActions(g: GameView): Action[] {
|
||||
if (field)
|
||||
return [{ type: 'nexusAtreides', event: nexus.event, mode: nexus.mode, field }];
|
||||
}
|
||||
const shrineTruth = shrineTruthtranceBotAction(
|
||||
g,
|
||||
g.players.find((player) => player.id === g.me)!,
|
||||
);
|
||||
if (shrineTruth) return [shrineTruth];
|
||||
const intelligence = tupileIntelligenceActions(g);
|
||||
if (intelligence.length) return intelligence;
|
||||
const actions = [...junctionTransportActions(g, rank(g)), ...policyActions(g)].flatMap((action) => {
|
||||
|
||||
Reference in new issue
Block a user