Enable early native-faction Truthtrance promises
This commit is contained in:
1 parent
8053e1fb26
commit
d5c5342d2d
22 files changed
+1371
-44
No files matched your search
@@ -36,6 +36,14 @@ export function charityAmount(
|
||||
return charityQuote(g, p).total;
|
||||
}
|
||||
|
||||
/** Native phase-opening collection, distinct from a player's ordinary claim. */
|
||||
export function choamOpeningIncome(
|
||||
g: Pick<Game, 'advanced' | 'turn' | 'inflation' | 'players' | 'homeworlds'>,
|
||||
owner: Pick<Player, 'id'>,
|
||||
) {
|
||||
return (2 * g.players.length + homeworldLowBonus(g, owner.id)) * charityMultiplier(g);
|
||||
}
|
||||
|
||||
export function charityPayer(
|
||||
g: Pick<Game, 'players' | 'turn' | 'choamCharity'>,
|
||||
beneficiary?: string,
|
||||
|
||||
+17
-5
@@ -552,6 +552,7 @@ import {
|
||||
quoteCharityFunding,
|
||||
CharityFundingError,
|
||||
charityMultiplier,
|
||||
choamOpeningIncome,
|
||||
type Inflation,
|
||||
} from './charity';
|
||||
import {
|
||||
@@ -25913,6 +25914,15 @@ type ShipmentCompletionSeed = { game: Game; actions: Action[]; early: { phase: n
|
||||
function earlyShipmentCompletionSeeds(initial: Game, source: Game, owner: string): ShipmentCompletionSeed[] {
|
||||
let seeds: ShipmentCompletionSeed[] = [{ game: initial, actions: [], early: [] }];
|
||||
if (source.phase > 4) return seeds;
|
||||
if (source.phase <= 2 && source.choamCharity?.turn !== source.turn && getPlayer(source,owner).faction === 'choam') {
|
||||
// The owned opening is automatic, not an executable future claim. Witness
|
||||
// its allowed fixed income only; the real table retains the counter.
|
||||
const projected = structuredClone(initial);
|
||||
const choam = getPlayer(projected,owner);
|
||||
choam.spice += choamOpeningIncome(projected,choam);
|
||||
projected.choamCharity = {turn:projected.turn,canceled:false};
|
||||
seeds.push({game:projected,actions:[],early:[]});
|
||||
}
|
||||
if (source.phase <= 2 && !(source.phase === 2 && source.ready.includes(owner))) {
|
||||
const charitySeeds: ShipmentCompletionSeed[] = [];
|
||||
for (const seed of seeds) {
|
||||
@@ -26194,8 +26204,13 @@ function earlyShipmentGuidance(g: Game, p: Player): { preparation: { actions: Ac
|
||||
const current = completion.early?.find(step => step.phase === g.phase)?.action;
|
||||
if (g.decision?.kind === 'auctionPayment')
|
||||
return { preparation: null, policy: [current?.type === 'decision' ? current : { type: 'decision', karama: false }] };
|
||||
if (g.phase === 3)
|
||||
if (g.phase === 3) {
|
||||
const lot = g.richeseAuction;
|
||||
if (lot) return {preparation:null,policy:!lot.outcome && lot.eligible.includes(p.id) &&
|
||||
(lot.method === 'silent' ? !Object.hasOwn(lot.sealed,p.id) : lot.active === p.id)
|
||||
? [{type:'richeseBid',event:lot.event,amount:lot.method === 'silent' ? 0 : null,allyPayment:0}] : []};
|
||||
return { preparation: null, policy: g.auction?.active === p.id ? [{ type: 'passBid' }] : [] };
|
||||
}
|
||||
if (g.phase === 2 || g.phase === 4)
|
||||
return { preparation: current ? { actions: [current] } : null,
|
||||
policy: current ? [current] : g.ready.includes(p.id) ? [] : [{ type: 'ready' }] };
|
||||
@@ -30396,10 +30411,7 @@ function finishResponse(g: Game, canceled: boolean, settlement?: BureaucratSettl
|
||||
// User ruling 7 October 2026: CHOAM's phase-opening income is a
|
||||
// qualifying collection, so a low-population native Homeworld adds its
|
||||
// bank bonus under the same Inflation multiplier as ordinary charity.
|
||||
const multiplier = charityMultiplier(g);
|
||||
const amount =
|
||||
2 * g.players.length * multiplier +
|
||||
homeworldLowBonus(g, choam.id) * multiplier;
|
||||
const amount = choamOpeningIncome(g,choam);
|
||||
choam.spice += amount;
|
||||
log(g, `${choam.name} collected ${amount} spice before charity claims.`);
|
||||
} else
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { TERRITORIES, territory } from './board';
|
||||
import { FACTIONS } from './catalog';
|
||||
import { nativePromiseScopeSupported } from './native-promise-scope';
|
||||
import type { Game } from './engine';
|
||||
|
||||
/** One qualifying ground movement, never the sum of several smaller groups. */
|
||||
@@ -84,20 +84,7 @@ export function finishMovementPromises<T extends MovementPromise>(
|
||||
/** Prototype profile/timing only. Actual route feasibility stays authoritative
|
||||
* in the engine. Truthtrance and an ordinary active Ornithopter may remain. */
|
||||
export function movementPromiseModeSupported(g: Game): boolean {
|
||||
// Basic retains early-phase admission. Advanced native families use the same
|
||||
// declared roster during Movement; earlier forecasts/modules stay separate.
|
||||
return (g.advanced === false ||
|
||||
g.advanced === true && g.phase === 5) &&
|
||||
g.players.length >= 2 && g.players.length <= 6 &&
|
||||
g.expansions.every(id => ['ix', 'choam', 'ecaz'].includes(id)) &&
|
||||
new Set(g.expansions).size === g.expansions.length &&
|
||||
g.players.every(candidate => {
|
||||
const family = FACTIONS.find(entry => entry.id === candidate.faction)?.expansion;
|
||||
return family === 'base' || (!!family && g.expansions.includes(family));
|
||||
}) &&
|
||||
!g.homeworlds && !g.nexusCards && !g.leaderSkills && !g.techTokens &&
|
||||
!g.strongholdCards && !g.discoveryEnabled && !g.discoveries &&
|
||||
!g.discoveryStash && !g.greatMaker && !g.ecazTreachery;
|
||||
return nativePromiseScopeSupported(g);
|
||||
}
|
||||
export function movementPromiseTargetAvailable(g: Game, player: string): boolean {
|
||||
const target = g.players.find(candidate => candidate.id === player);
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
import { FACTIONS } from './catalog';
|
||||
|
||||
export type NativePromiseScope = {
|
||||
advanced: boolean;
|
||||
expansions: readonly unknown[];
|
||||
players: readonly { faction: string }[];
|
||||
homeworlds?: unknown;
|
||||
nexusCards?: unknown;
|
||||
leaderSkills?: unknown;
|
||||
techTokens?: unknown;
|
||||
strongholdCards?: unknown;
|
||||
discoveryEnabled?: unknown;
|
||||
discoveries?: unknown;
|
||||
discoveryStash?: unknown;
|
||||
greatMaker?: unknown;
|
||||
ecazTreachery?: unknown;
|
||||
};
|
||||
|
||||
/** Registered native factions with their selected decks. Optional modules
|
||||
* keep their separate promise envelopes; this never opens a game-start gate. */
|
||||
export function nativePromiseScopeSupported(g: NativePromiseScope): boolean {
|
||||
return typeof g.advanced === 'boolean' && g.players.length >= 2 && g.players.length <= 6 &&
|
||||
g.expansions.every(id => typeof id === 'string' && ['ix','choam','ecaz'].includes(id)) &&
|
||||
new Set(g.expansions).size === g.expansions.length &&
|
||||
g.players.every(p => {
|
||||
const family = FACTIONS.find(f => f.id === p.faction)?.expansion;
|
||||
return family === 'base' || !!family && g.expansions.includes(family);
|
||||
}) && !g.homeworlds && !g.nexusCards && !g.leaderSkills && !g.techTokens &&
|
||||
!g.strongholdCards && !g.discoveryEnabled && !g.discoveries && !g.discoveryStash &&
|
||||
!g.greatMaker && !g.ecazTreachery;
|
||||
}
|
||||
+7
-7
@@ -3140,12 +3140,12 @@ export const RULE_TOPICS: RuleTopic[] = [
|
||||
developmentStage: 'Prototyped',
|
||||
summary: 'Bind one future qualifying physical ground movement before a supported Basic or Advanced respondent with declared native families finishes their current-round turn.',
|
||||
steps: [
|
||||
'Choose Bind ground movement this turn, a printed territory and a minimum of one to twenty physical forces. Basic with declared native families supports clean phases0–4 before Movement. During Movement ask an active player before or after shipment, or a still-unused waiting respondent. Finish pending decisions first. Advanced with declared native families and no modules supports its current Movement phase. Earlier Advanced phases, optional modules, later rounds and wider owned preparations remain unfinished.',
|
||||
'Choose Bind ground movement this turn, a printed territory and a minimum of one to twenty physical forces. Basic and Advanced with declared native families support clean phases0–4 before Movement. During Movement ask an active player before or after shipment, or a still-unused waiting respondent. Finish pending decisions first. Optional modules, later rounds and wider owned preparations remain unfinished.',
|
||||
'Yes requires one qualifying ground movement from now until that player’s Shipment and Movement turn ends, while possible. Smaller groups do not add together and earlier moves do not count. Shipment, HMS relocation and Ambassador relocation do not fulfill this statement; a concealed No-Field marker itself is not a physical on-board force counter.',
|
||||
'A nonmatching move leaves Yes pending when an owned later route remains. One matching physical commitment fulfills it before card disposal and later Intrusion, Ambassador or Terror effects. You are promising the move, not survival afterward. No forbids every later matching move, including Hajr and both Ornithopter groups, until the actual turn closes.',
|
||||
'Ordinary reserve shipment may prepare or reinforce a later ground group using its actual cost, native allocation and pledged payment split. Shipment itself neither fulfills movement Yes nor violates movement No. Joint guidance honors a required shipment before End; an already declared reserve or native Guild transport keeps its exact source, destination and funding while responses finish.',
|
||||
'Waiting answers use current board/resources without assuming foreign income, movement, cooperation or discarded cards. Another player cannot fulfill or close your promise by moving or ending. Ordinary guidance appears on your actual turn; your already-paid Box choice can finish now. Deferred gifts/accompaniment cannot voluntarily spend the last route before another player responds.',
|
||||
'Earlier classic answers include owned Charity and ordinary Revival, reopen readiness when needed, and reserve a current winning auction invoice using cash or a held Karama. Only current preparation, Ready, bid-pass or owned payment appears before Movement. Unknown purchases and future income are not assumed. Forced Storm losses can release impossibility; old movement allowances reset at actual phase entry. A separate held Karama may prepare Guild shipment rates. Native Once Around and owned Silent bids reserve exact funding; a submitted ally locks its full pledge until reveal. Current native guidance passes or submits zero with the original event. A paid sale is not charged again, and foreign invoice outcomes precede release.',
|
||||
'Earlier classic answers include owned Charity and ordinary Revival, reopen readiness when needed, and reserve a current winning auction invoice using cash or a held Karama. Only current preparation, Ready, bid-pass or owned payment appears before Movement. Owned fixed CHOAM opening income uses its allowed native settlement while the actual counter stays live; a canceled current-turn receipt cannot be credited again. Unknown purchases and foreign future income are not assumed. Forced Storm losses can release impossibility; old movement allowances reset at actual phase entry. A separate held Karama may prepare Guild shipment rates. Native Once Around and owned Silent bids reserve exact funding; a submitted ally locks its full pledge until reveal. Current native guidance passes or submits zero with the original event. A paid sale is not charged again, and foreign invoice outcomes precede release.',
|
||||
'Private feasible answers and the next owned step use actual movement legality, typed groups, held Hajr, both Ornithopter modes and original cohorts, current city access, held native Kulon, physical Ghola force returns and owned Box recovery. Before paying the two-spice Box fee, only a known card still in discard supplies a route; unknown future draws/gifts are not invented. Native relocation and wider preparation remain unfinished.',
|
||||
'Ghola returns up to five eligible forces to reserves using the physical card and current typed allowance, without using normal revival slots. It does not fulfill ground movement: an unused affordable shipment and later matching move remain necessary. A known spent Ghola can be recovered and replayed through Box. Possible Tleilaxu income remains conditional and supplies no forecast cash.',
|
||||
'A paid Box search retains its full private choice and original event. A guided choice preserves Yes; an incompatible selection rejects before shuffle and keeps that paid search available without another fee. No-only promises retain ordinary selection before movement can end. The existing provisional atomic full-hand exchange remains.',
|
||||
@@ -3156,7 +3156,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
||||
],
|
||||
related: ['card-truthtrance', 'truthtrance-shipment', 'movement', 'implementation-checklist'],
|
||||
checklist: [
|
||||
{ area: 'Implementation', status: 'Partial', detail: 'Declared native Advanced phase5 now reuses the typed route witness, immediate Hajr timing and owned advisor preparation/arrival flips with real counters. Owned No-Field shipment/reveal/marker movement uses native events, reserve caps and physical-only fulfillment. Basic declared native families join classic phases0–4. Exact Richese own/donor invoices, full submitted-ally Silent locks and already-paid boundaries prepare the owned turn without speculative bought cards/income. Fixed non-CHOAM preopening Charity and shared ordinary force-revival accounting preserve real native counter decisions. Mandatory Ix phase5 opening retains the future turn/reset. Held Ghola and known/paid Box recovery now add exact force returns and later shipment; normal revival allowances stay separate and native income is not precredited. CHOAM own unresolved opening, later rounds, wider preparations/modules remain unfinished.', evidence: ['game/ghola-force-preparation.ts', 'game/early-auction-funding.ts', 'game/movement-promises.ts', 'game/movement-promise-search.ts', 'game/movement-shipment-preparation.ts', 'game/movement-discard-knowledge.ts', 'game/truthtrance.ts', 'game/engine.ts'] },
|
||||
{ area: 'Implementation', status: 'Partial', detail: 'Declared native Advanced phase5 now reuses the typed route witness, immediate Hajr timing and owned advisor preparation/arrival flips with real counters. Owned No-Field shipment/reveal/marker movement uses native events, reserve caps and physical-only fulfillment. Basic declared native families join classic phases0–4. Exact Richese own/donor invoices, full submitted-ally Silent locks and already-paid boundaries prepare the owned turn without speculative bought cards/income. Fixed non-CHOAM preopening Charity and shared ordinary force-revival accounting preserve real native counter decisions. Mandatory Ix phase5 opening retains the future turn/reset. Held Ghola and known/paid Box recovery now add exact force returns and later shipment; normal revival allowances stay separate and native income is not precredited. Basic/Advanced native phases0–4 now include the owned CHOAM fixed allowed opening, retaining its real cancellation and receipt. Later rounds, wider preparations/modules remain unfinished.', evidence: ['game/native-promise-scope.ts', 'tests/fixture-truthtrance-choam-promises.ts', 'tests/truthtrance-choam-promises-engine.test.ts', 'tests/fixture-truthtrance-richese-promises.ts', 'tests/truthtrance-richese-promises-engine.test.ts', 'tests/fixture-truthtrance-native-family-promises.ts', 'tests/truthtrance-native-family-promises-engine.test.ts', 'game/ghola-force-preparation.ts', 'game/early-auction-funding.ts', 'game/movement-promises.ts', 'game/movement-promise-search.ts', 'game/movement-shipment-preparation.ts', 'game/movement-discard-knowledge.ts', 'game/truthtrance.ts', 'game/engine.ts'] },
|
||||
{ area: 'Player controls', status: 'Partial', detail: 'Native No-Field preparation now has distinct persistent reveal/shipment/marker/mixed labels and actual reveal callbacks. Classic Advanced questions and persistent guidance now connect an actual legal movement callback; native advisor preparation has a named action. Physical Ghola force-return guidance now precedes actual reserve shipment and ground movement, with income/disposal controls retaining priority. Persistent busy-safe guidance includes current Charity, Revival, Ready, ordinary bid-pass/payment and event-bearing native Once Around pass/Silent zero. Foreign pending funding cannot force a speculative positive bid or expose future movement. Actual native pass/zero handlers preserve unread obligations. Existing waiting/card controls remain; browser/visual acceptance stays open.', evidence: ['tests/truth-movement-advanced-controls.test.tsx', 'components/movement-claim-fields.tsx', 'components/movement-promises.tsx', 'components/shipment-promises.tsx', 'components/truthtrance.tsx', 'components/nullentropy-box.tsx', 'components/game-table.tsx', 'tests/truth-movement-waiting-controls.test.tsx', 'tests/truth-movement-early-controls.test.tsx', 'tests/truth-movement-native-early-controls.test.tsx', 'tests/truth-movement-ghola-controls.test.tsx'] },
|
||||
{ area: 'AI', status: 'Partial', detail: 'All four existing profiles use actual native Advanced Richese reveal/physical movement legally. All four existing profiles finish a genuine classic Advanced movement question legally without strategy changes. Eight earlier existing-profile held-Ghola/known-Box runs accept40 proposals plus24 separate native continuations. Physical return, exact paid recovery, unused shipment and qualifying ground move use the same private legal guidance. Earlier native funding paths remain. Minimal legal participation only; no strategy tuning or calibration.', evidence: ['game/bots.ts', 'tests/truth-movement-ghola-engine.test.ts', 'tests/truth-movement-native-early-engine.test.ts'] },
|
||||
{ area: 'Documentation', status: 'Implemented', detail: 'General FAQ authority, existential single-event meaning, explicit software composition, source selection and unfinished scope are documented.', evidence: ['docs/TRUTHTRANCE_MOVEMENT_PROMISES.md', 'docs/RULE_DECISIONS.md'] },
|
||||
@@ -3172,7 +3172,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
||||
summary:
|
||||
'Bind this turn’s reserve shipment to a destination and physical minimum, including earlier Basic phases and players whose shipment turn is still ahead.',
|
||||
steps: [
|
||||
'Declare Truthtrance, select an eligible player and choose Bind a shipment from reserves. Bare classic Basic and Advanced rules allow the question during Storm through Revival as well as before that player’s shipment. During Shipment and Movement, base Basic and Advanced, including Guild, support an unused active or waiting turn. Finish pending decisions first. Choose a printed destination and minimum of one to twenty forces, or combine conditions using AND or OR; each describes the same shipment. Answering never grants an early shipment. Earlier expansion and optional configurations keep their existing boundaries.',
|
||||
'Declare Truthtrance, select an eligible player and choose Bind a shipment from reserves. Bare Basic and Advanced rules with selected native faction decks allow the question during Storm through Revival as well as before that player’s shipment. During Shipment and Movement, base Basic and Advanced, including Guild, support an unused active or waiting turn. Finish pending decisions first. Choose a printed destination and minimum of one to twenty forces, or combine conditions using AND or OR; each describes the same shipment. Answering never grants an early shipment. Optional configurations keep their separate boundaries.',
|
||||
'Yes requires the complete statement to match while possible: all AND conditions or at least one OR condition. No requires the whole statement to be false: at least one AND condition false, or every OR condition false. A smaller count, different destination, transport of forces already on the board or no shipment may satisfy No. Forces already in the destination and ground movement do not satisfy the question. Fremen reinforcements and Guild transport from southern reserves do count.',
|
||||
'The target privately sees feasible answers based on the current board, owned resources and all earlier promises. Before Movement, include remaining owned Charity and normal Revival, the current winning invoice and unused outgoing Bidding refunds; incoming Bidding aid expires. Auction payment and shipping discounts need distinct physical Karamas. At shipment time, available Ghola, Karama and current pledged aid retain their normal rules. Unknown purchases, unresolved Storm outcomes, rival gifts and future income are not assumed.',
|
||||
'Accepted whole answers are public and constrain the event together. A new answer reopens your Charity or Revival readiness when needed. Claim or revive before marking Ready if that is your last legal route; bids, gifts and paid revivals cannot spend it away. Honor a required shipment before ground movement or finishing. An unresolved foreign bid and its income responses finish before release. A completed opposing effect that makes compliance impossible releases it publicly.',
|
||||
@@ -3188,7 +3188,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
||||
area: 'Implementation',
|
||||
status: 'Partial',
|
||||
detail:
|
||||
'Bare classic Basic/Advanced phases0–4 use explicit provisional current-board/owned-stage feasibility, auction liabilities, distinct card costs, expiring aid and readiness reopening. Wealthy Advanced BG Charity retains its native counter; the detached witness uses its allowed fixed payment. Typed revival keeps the current one-elite limit. Voluntary bids/payments/closure preserve a route; foreign invoices await their actual outcome. Existing phase5 waiting/native Guild interception, permission and rates remain. Earlier modules and wider future actions remain unfinished.',
|
||||
'Bare registered native Basic/Advanced phases0–4 with selected faction decks use explicit provisional current-board/owned-stage feasibility, auction liabilities, distinct card costs, expiring aid and readiness reopening. Wealthy Advanced BG Charity and owned CHOAM opening income retain their native counters; the detached witness uses their allowed fixed payment. A current-turn CHOAM receipt prevents repeated credit. Native Richese guidance passes or submits Silent zero with its exact event. Typed revival keeps the current one-elite limit. Voluntary bids/payments/closure preserve a route; foreign invoices await their actual outcome. Existing phase5 waiting/native Guild interception, permission and rates remain. Earlier modules and wider future actions remain unfinished.',
|
||||
},
|
||||
{
|
||||
area: 'Player controls',
|
||||
@@ -3212,8 +3212,8 @@ export const RULE_TOPICS: RuleTopic[] = [
|
||||
area: 'Verification',
|
||||
status: 'Partial',
|
||||
detail:
|
||||
'Source programmes cover original Basic and Advanced early-phase questions, actual purchase/payment and delivery, wealthy BG charity/counter, typed revival, real forced Storm release, current preparation controls and four minimal legal profiles. Current frozen totals and limits are in the source contract/current checkpoint; earlier persistence/privacy evidence remains historical. Full Truthtrance, modes, assurance and deployed acceptance remain open.',
|
||||
evidence: [
|
||||
'Source programmes include genuine native CHOAM, Richese and Ecaz/Moritani Basic/Advanced early questions, own opening allowance/cancellation, real native auctions, reserve shipment and physical ground movement, alongside original classic early-phase questions, actual purchase/payment and delivery, wealthy BG charity/counter, typed revival, real forced Storm release, current preparation controls and four minimal legal profiles. Current frozen totals and limits are in the source contract/current checkpoint; earlier persistence/privacy evidence remains historical. Full Truthtrance, modes, assurance and deployed acceptance remain open.',
|
||||
evidence: ['game/native-promise-scope.ts', 'tests/fixture-truthtrance-choam-promises.ts', 'tests/truthtrance-choam-promises-engine.test.ts', 'tests/fixture-truthtrance-richese-promises.ts', 'tests/truthtrance-richese-promises-engine.test.ts', 'tests/fixture-truthtrance-native-family-promises.ts', 'tests/truthtrance-native-family-promises-engine.test.ts',
|
||||
'tests/shipment-promises.test.ts',
|
||||
'tests/shipment-promises-bots.test.ts',
|
||||
'tests/shipment-promises-recovery.test.ts',
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { TERRITORIES, territory } from './board';
|
||||
import type { MixedShipmentExpression } from './mixed-shipment-question';
|
||||
import type { TruthAnswer } from './truthtrance';
|
||||
import { nativePromiseScopeSupported } from './native-promise-scope';
|
||||
|
||||
/** Every shipment leaf describes the same eventual reserve shipment, or its absence. */
|
||||
export type ShipmentLeaf = { territory: string; minimum: number };
|
||||
@@ -160,11 +161,13 @@ export function shipmentPromiseModeSupported(game: {
|
||||
semutaPreview?: unknown;
|
||||
leaderSkills?: unknown;
|
||||
discoveryEnabled?: unknown;
|
||||
discoveries?: unknown;
|
||||
discoveryStash?: unknown;
|
||||
greatMaker?: unknown;
|
||||
ecazTreachery?: unknown;
|
||||
}, respondent = game.active): boolean {
|
||||
if (game.phase !== undefined && game.phase < 5 &&
|
||||
(game.expansions.length || game.techTokens || game.strongholdCards ||
|
||||
game.nexusCards || game.homeworlds || game.leaderSkills || game.discoveryEnabled || game.ecazTreachery)) return false;
|
||||
if (nativePromiseScopeSupported(game)) return true;
|
||||
if (game.phase !== undefined && game.phase < 5) return false;
|
||||
if (game.semutaPreview === true && game.expansions.length === 1 &&
|
||||
game.expansions[0] === 'choam' && !game.techTokens &&
|
||||
!game.strongholdCards && !game.nexusCards && !game.homeworlds &&
|
||||
|
||||
+1
-1
@@ -218,7 +218,7 @@ function parseQuestion(g: Game, asker: string, value: unknown): TruthQuestion {
|
||||
check(Object.keys(v).sort().join(',') === 'kind,minimum,target,territory',
|
||||
'Supply one ground-movement destination, minimum and respondent.');
|
||||
check(movementPromiseTargetAvailable(g, v.target as string),
|
||||
'Ground-movement promises need a supported Basic opportunity this round or an Advanced Movement turn with declared native families and pending decisions finished. Optional modules and earlier Advanced forecasts remain unfinished.');
|
||||
'Ground-movement promises need a supported unused opportunity this round under Basic or Advanced rules with declared native families and pending decisions finished. Optional modules remain unfinished.');
|
||||
try { return { kind: 'movement', target: v.target as string, ...parseMovementClaim(v) }; }
|
||||
catch (error) { if (error instanceof MovementClaimError) throw new TruthError(error.message); throw error; }
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user