Expand Basic No-Field reveal response timing
Verify and publish checkpoint container / container (push) Successful in 11m10s
Verify and publish checkpoint container / container (push) Successful in 11m10s
This commit is contained in:
1 parent
eb68f28a3a
commit
3dbd326891
8 files changed
+574
-1
No files matched your search
@@ -1130,6 +1130,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
||||
'In Basic play, your own single concealed No-Field may provisionally ship into an ally’s territory if it can legally enter; move it and any paid accompanying forces out before your turn ends. Paid companions require the High Richese Homeworld power. If the marker remains, reveal it and send its newly materialized forces to Tanks under the provisional no-departure policy. A zero marker reveals but contributes no casualties. Existing physical forces and the ally are not part of that new-visitor loss. Paired markers keep their separate guards.',
|
||||
'A normal No-Field shipment pays the one-force price. The concealed token moves like a force. Before Battle, Richese may reveal it voluntarily; a token involved in battle is revealed with the Battle Plan. Revelation brings the indicated forces from reserves, limited by what remains there.',
|
||||
'In supported Basic native games, voluntary revelation is also available during an Ix phase opening or selected auction and market decisions without replacing that decision. Other interruption windows remain unfinished.',
|
||||
'In supported Basic games, your voluntary reveal can also interrupt a clean Emperor allied spice gift, Tleilaxu revival-income response, Atreides Movement-phase Spice forecast without Bene Gesserit, or Guild’s own ordinary reserve-shipment rate response when the shipment enters a different territory from the marker. The original response and payment continue once; other interruptions remain guarded.',
|
||||
'Provisional Guild transport treats your owned concealed marker as one billable force alongside any same-origin physical counters. Native Guild allies may cross-ship it through the normal permission and rate responses. The actual absent-Guild Secret Ally may cross-ship or return it face down, spending its Nexus once and paying the Bank. Cross keeps concealment; return creates no denomination-sized reserve deposit and retains the same-token next-shipment ban. Ordinary Guild allies cannot return. Select the marker separately from physical counters; ordinary movement remains available.',
|
||||
'In supported native Homeworld games, you may provisionally ship one concealed No-Field from your reserves to a foreign non-allied Homeworld, alone or with physical forces from those reserves. On a later turn, you may ship that same concealed marker between distinct eligible Homeworlds, alone or with selected physical Richese counters from the marker’s current World; its own Homeworld is an eligible endpoint only in Advanced. Price the whole group as one plus those counters; a purchased Guild rate halves the total, rounding up once. The marker retains its identity and last-shipment history, and its value does not materialize until reveal; available reserves are placed there unless it is already on its own World, where the physical pool stays unchanged. Only one marker may be deployed globally. Fresh placement from the screen to your own Homeworld and optional-module combinations remain unavailable; an Advanced native return uses the provisional physical-reserve interpretation described below. The supplied revised rulebook permits World-to-World shipment (physical p. 22) and counts a concealed marker as one force for effects (physical p. 36), but does not explicitly resolve this combination; this is a provisional interpretation.',
|
||||
'With a living, uncaptured Planetologist, your own concealed marker may provisionally use either ordinary movement alternative. Extra range adds one, capped at three, for one origin. Gathering combines exactly two territories at one destination using each selected sector’s ordinary range; the marker can supply one origin alone or with physical companions, and physical counters supply the other. The alternatives do not stack. The marker stays concealed, including zero, and spends one movement without materializing reserves. Physical and Discovery flight use the provisional skill transport policy with original marker quotas; complete combinations remain unfinished.',
|
||||
|
||||
@@ -32,9 +32,27 @@ export function richeseRevealInterruptSupported(g: Game): boolean {
|
||||
// interruption behavior; fresh games initialize an explicit empty history.
|
||||
if (!Array.isArray(g.truthHistory) || g.truthHistory.some(entry => entry.turn === g.turn)) return false;
|
||||
|
||||
// Each pending field is an active child/continuation, not a completed
|
||||
// An ordinary Guild reserve shipment is independent of Richese's reserves
|
||||
// and marker when its destination is in a different territory. Its exact
|
||||
// rate response remains open while the marker is materialized.
|
||||
const shipment = g.pendingShipment;
|
||||
const richese = g.players.find(player => player.faction === 'richese');
|
||||
const marker = richese?.noField?.deployed?.location;
|
||||
const guildRate = g.response?.kind === 'guildRate' && g.phase === 5 &&
|
||||
!!shipment && !!richese && !!marker && 'territory' in marker &&
|
||||
shipment.player === g.response.owner && shipment.player === g.active &&
|
||||
g.players.some(player => player.id === shipment.player && player.faction === 'guild') &&
|
||||
shipment.turn === g.turn && shipment.territory !== marker.territory &&
|
||||
typeof shipment.guildRateEvent === 'string' && shipment.guildRateEvent.length > 0 &&
|
||||
shipment.guildRateEvent === g.response.guildRateEvent &&
|
||||
!shipment.source && !shipment.noField && !shipment.alliedNoField && !shipment.richesePair &&
|
||||
!shipment.guildSecretEvent && !shipment.guildNexusEvent && !shipment.nexusEvent &&
|
||||
!shipment.homeworldSources && !shipment.smuggler && !shipment.smugglerCompanion;
|
||||
|
||||
// Each other pending field is an active child/continuation, not a completed
|
||||
// receipt. Empty pending arrays do not represent a live child.
|
||||
if (Object.entries(g).some(([key, value]) => key.startsWith('pending') &&
|
||||
!(key === 'pendingShipment' && guildRate) &&
|
||||
(Array.isArray(value) ? value.length > 0 : value !== null && value !== undefined && value !== false))) return false;
|
||||
|
||||
const live = (rows: readonly {turn: number; fulfilled?: boolean; released?: boolean}[] | undefined) =>
|
||||
@@ -65,6 +83,23 @@ export function richeseRevealInterruptSupported(g: Game): boolean {
|
||||
const owner = g.players.find(player => player.id === response.owner);
|
||||
if (!owner) return false;
|
||||
const keys = Object.keys(response).sort().join(',');
|
||||
if (response.kind === 'guildRate')
|
||||
return !!guildRate && keys === 'guildRateEvent,intent,kind,owner,passed';
|
||||
if (response.kind === 'atreidesSpice')
|
||||
return keys === 'kind,owner,passed' && g.phase === 5 && owner.faction === 'atreides' &&
|
||||
!g.players.some(player => player.faction === 'beneGesserit') &&
|
||||
Array.isArray(g.spiceDeck) && g.spiceDeck.length > 0 && g.spicePeekKnown === false &&
|
||||
Array.isArray(g.movementRemaining) && g.movementRemaining.length > 0;
|
||||
if (response.kind === 'emperorGift') {
|
||||
const recipient = g.players.find(player => player.id === response.recipient);
|
||||
return keys === 'amount,elite,kind,owner,passed,recipient' && owner.faction === 'emperor' &&
|
||||
!!recipient && recipient.id !== owner.id && owner.ally === recipient.id && recipient.ally === owner.id &&
|
||||
Number.isSafeInteger(response.amount) && response.amount! > 0 && response.amount! <= owner.spice && response.elite === 0;
|
||||
}
|
||||
if (response.kind === 'revivalIncome')
|
||||
return keys === 'amount,kind,owner,passed,recipient' && owner.faction === 'tleilaxu' &&
|
||||
g.players.some(player => player.id === response.recipient) &&
|
||||
Number.isSafeInteger(response.amount) && response.amount! > 0;
|
||||
if (response.kind === 'choamCharity')
|
||||
return keys === 'kind,owner,passed' && g.phase === 2 && owner.faction === 'choam' &&
|
||||
g.choamCharity?.turn !== g.turn;
|
||||
|
||||
Reference in new issue
Block a user