Extend conditional battle questions across previews
Verify and publish checkpoint container / container (push) Canceled after 0s
Verify and publish checkpoint container / container (push) Canceled after 0s
This commit is contained in:
1 parent
0e52c25355
commit
50703664cf
13 files changed
+336
-24
No files matched your search
+4
-1
@@ -36658,6 +36658,9 @@ function finishResponse(g: Game, canceled: boolean, settlement?: BureaucratSettl
|
||||
!Object.keys(b.plans).length, 'Resolve Occupy before native powers and plans.');
|
||||
occupy.canceled = canceled;
|
||||
ecazBattleProfile(g);
|
||||
// The chosen plan owner and final Occupy force profile are now fixed.
|
||||
// A nonleading ally keeps its waiting receipt for its own later battle.
|
||||
bindFutureBattleLeaderQuestions(g);
|
||||
createMentatQuestion(g);
|
||||
beginStrongholdBattle(g);
|
||||
log(g, canceled ? 'Karama canceled the combined dial: the selected lead now dials only their own forces; the other allied army contributes zero.' : 'Ecaz Occupy proceeds with its mandatory free contribution and the ally’s physical force pool.', { faction: 'ecaz', name: 'Occupy' });
|
||||
@@ -46114,7 +46117,7 @@ function applyActionInner(
|
||||
revealed: false,
|
||||
traitorCalls: {},
|
||||
};
|
||||
bindFutureBattleLeaderQuestions(g);
|
||||
if (!combined) bindFutureBattleLeaderQuestions(g);
|
||||
if (combined) {
|
||||
g.battle.ecazOccupy = { event: battleEvent, ecaz: ecaz!.id, ally: ally!.id, lead: null, canceled: false };
|
||||
const opponent = [choice.attacker, choice.defender].find(id => id !== ecaz!.id && id !== ally!.id)!;
|
||||
|
||||
@@ -11,11 +11,10 @@ export function futureBattleLeaderTiming(g: Pick<Game, 'phase' | 'stormPending'
|
||||
}
|
||||
|
||||
/** Share the same quiet-window boundary between question validation and the
|
||||
* projected editor. Basic expansion factions use the same native battle
|
||||
* receipt except Ecaz, whose combined battle lead is chosen afterward. */
|
||||
* projected editor. Advanced Ecaz remains outside the current preview. */
|
||||
export function futureBattleLeaderWindow(g: Game): boolean {
|
||||
return g.status === 'playing' && !g.advanced && futureBattleLeaderTiming(g) &&
|
||||
!g.players.some(player => player.faction === 'ecaz') && !g.ecazOccupyPreview &&
|
||||
return g.status === 'playing' && futureBattleLeaderTiming(g) &&
|
||||
(!g.advanced || !g.players.some(player => player.faction === 'ecaz') && !g.ecazOccupyPreview) &&
|
||||
!g.techTokens && !g.strongholdCards && !g.nexusCards && !g.homeworlds &&
|
||||
!g.leaderSkills && !g.discoveryEnabled && !g.ecazTreachery && !g.battle &&
|
||||
!g.response && !g.decision && !g.phaseOpening && !g.pendingRevival &&
|
||||
|
||||
+1
-1
@@ -3314,7 +3314,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
||||
category: 'Cards', coverage: 'Partial', developmentStage: 'Prototyped',
|
||||
summary: 'Combine printed Karama shipment pricing and current-lot costs, original-window Weather/Atomics/Harvester plays, native Voice/Prescience declarations, future printed Hajr/Ghola plays, current battle decisions, final Nexus membership, ordinary bids, native Revival, future payments and physical transport in one whole current-turn answer, with optional frozen facts.',
|
||||
steps: [
|
||||
'In a quiet Basic Storm, Spice Blow, Charity, Bidding, Revival or Shipment and Movement window, ask whether a player will use a named native leader in their first later battle this turn, if one occurs. Storm must have a pending movement after the dials; Spice Blow must be before the draw. The answer waits for an actual battle; if none occurs, it expires. This separate provisional question supports classic and expansion factions without Ecaz or optional modules and uses only currently available leaders for its answer.',
|
||||
'In a supported quiet Storm, Spice Blow, Charity, Bidding, Revival or Shipment and Movement window, ask whether a player will use a named native leader in their first later battle this turn, if one occurs. Storm must have a pending movement after the dials; Spice Blow must be before the draw. The answer waits for an actual battle; if none occurs, it expires. This separate provisional question supports Basic factions and Advanced without Ecaz, excluding optional modules. In a Basic Ecaz combined battle, only the selected lead and opponent bind; the nonleading ally waits for its own later battle. Answers use only currently available leaders.',
|
||||
'Choose Combine printed card plays, native battle powers and this turn’s other actions. Full AND/OR groups share sixteen logical leaves and four grouping levels, with optional current facts. This is a provisional composition of original-window card plays, native power declarations, printed Hajr/Ghola use, current battle decisions, final Nexus membership, current-lot bids, ordinary Revival, funded payments and owned-stage travel; wider action families and optional combinations remain unfinished.',
|
||||
'The supported bare Basic printed-Kull profile also permits these questions, including with Richese and Semuta. The answer remains bound while Kull or its counter is resolving. Voice, Prescience, Ixian cyborg strength and clean Guild income cancellations can use a proven continuation; other Karama uses remain guarded until their effects can be quoted without assuming hidden or foreign outcomes.',
|
||||
'A final-alliance clause names another current participant during this original quiet native Nexus. Existing invitations and reciprocal formation remain authoritative. Offers, temporary membership and your own Ready do not settle the clause; final actual membership is fixed only when the Nexus closes.',
|
||||
|
||||
+2
-2
@@ -610,7 +610,7 @@ function parseQuestion(g: Game, asker: string, value: unknown): TruthQuestion {
|
||||
v.turn === g.turn && typeof v.leader === 'string' &&
|
||||
leaders(target.faction).some(leader => leader.id === v.leader) &&
|
||||
futureBattleLeaderWindow(g),
|
||||
'Choose a native leader in a quiet Basic Storm, Spice Blow, Charity, Bidding, Revival or Shipment and Movement window.');
|
||||
'Choose a native leader in a supported quiet Storm, Spice Blow, Charity, Bidding, Revival or Shipment and Movement window.');
|
||||
return { kind: 'futureBattleLeader', target: v.target, turn: g.turn, leader: v.leader };
|
||||
}
|
||||
if (v.kind === 'battlePlan') {
|
||||
@@ -816,7 +816,7 @@ export function truthQuestionText(
|
||||
if (q.kind === 'battlePlan')
|
||||
return `In this battle in ${locationName(q.territory)}, will it be true that ${planClaimText(q.claim, leaderName)}?`;
|
||||
if (q.kind === 'futureBattleLeader')
|
||||
return `If you fight a battle later this turn, will you use ${leaderName(q.leader)} in your first such battle?`;
|
||||
return `If you submit a battle plan later this turn, will you use ${leaderName(q.leader)} in your first such battle?`;
|
||||
const clause = (f: TruthFact): string => {
|
||||
if (isKnowledgeFact(f)) return knowledgeFactText(f);
|
||||
if (f.kind === 'noFieldValue') return noFieldValueFactText(f);
|
||||
|
||||
Reference in new issue
Block a user