Allow Richese reveal during Emperor revival
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
cfccfe5acb
commit
a10e019b01
9 files changed
+260
-16
No files matched your search
+3
-3
@@ -1131,7 +1131,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.',
|
||||
'In supported Basic games, your voluntary reveal can also interrupt a clean Emperor allied spice gift or extra-revival response, 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. If Richese receives the extra revival, reveal from current reserves before that return. The original response and payment continue once; other interruptions remain guarded.',
|
||||
'During supported Basic games you can also reveal while another faction’s ordinary movement waits for a Fremen or Ixian response or a CHOAM decision. The original move and its response remain pending; a zero No-Field disappears without creating physical forces.',
|
||||
'These supported clean Basic interruptions also work with the Ecaz/Moritani deck and native factions. A token already present does not enter again when it is revealed; pending Ambassador and Terror reactions keep their own controls.',
|
||||
'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.',
|
||||
@@ -3314,7 +3314,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
||||
steps: [
|
||||
'Choose a recorded prediction faction, compare its turn, or compare the target’s current submitted storm dial or known Fremen forecast. Exactly, at least and at most are available for numeric facts.',
|
||||
'Ask whether Atreides’ currently known next Spice Card is a sandworm, Sandtrout, or a blow at a named printed territory. If the peek was canceled or is no longer available, the answer is I don’t know.',
|
||||
'Ask whether the current ordinary auction card or Advanced Richese Black Market card inspected by Atreides has a named Treachery Card face. If the inspection was canceled or the lot is no longer available, the answer is I don’t know. Other special-auction inspections and occupied Homeworld inspections are not yet included.',
|
||||
'Ask whether the current ordinary auction card or Advanced Richese Black Market card inspected by Atreides has a named Treachery Card face. The Black Market question supports normal, Once Around and Silent bidding. If the inspection was canceled or the lot is no longer available, the answer is I don’t know. Occupied Homeworld inspections are not yet included.',
|
||||
'In a Basic or Advanced Richese cache auction, ask any participant whether the currently offered public cache card has a named face. If no supported cache lot is active, the answer is I don’t know. This is separate from the Atreides inspection question.',
|
||||
'In Basic or Advanced Bidding, ask Ixians whether their recorded inspected auction group contains a named card. This refers to the recorded group, including cards later sold, rather than what remains for sale. If the inspection is unavailable or belongs to another player, the answer is I don’t know.',
|
||||
'Ask an entitled participant whether an already answered Prescience reveals a named leader, weapon or defense, no element, or an exact force dial. A pending, unavailable or differently inspected element yields I don’t know.',
|
||||
@@ -3326,7 +3326,7 @@ export const RULE_TOPICS: RuleTopic[] = [
|
||||
],
|
||||
related: ['card-truthtrance', 'truthtrance-spice', 'privacy'],
|
||||
checklist: [
|
||||
{ area: 'Implementation', status: 'Partial', detail: 'Stored prediction, entitled storm knowledge, native Atreides peeks including Advanced Black Market, revealed Prescience, the Ixian recorded auction group and the current public Richese cache face use shared three-valued fact evaluation; other special auctions and occupied inspection remain separate.', evidence: ['game/truthtrance-knowledge.ts', 'game/truthtrance.ts', 'game/engine.ts'] },
|
||||
{ area: 'Implementation', status: 'Partial', detail: 'Stored prediction, entitled storm knowledge, native Atreides peeks including all Advanced Black Market methods, revealed Prescience, the Ixian recorded auction group and the current public Richese cache face use shared three-valued fact evaluation; occupied inspection remains separate.', evidence: ['game/truthtrance-knowledge.ts', 'game/truthtrance.ts', 'game/engine.ts'] },
|
||||
{ area: 'Player controls', status: 'Partial', detail: 'Fact choices, numeric comparisons, public faction and card names, bounded inputs and compound question previews.', evidence: ['components/truthtrance-knowledge.tsx', 'components/mixed-shipment-fields.tsx'] },
|
||||
{ area: 'AI', status: 'Partial', detail: 'All four profiles answer the owner-only verified scalar through the existing Truthtrance flow. Strategic question selection and freeform understanding remain incomplete.', evidence: ['game/bots.ts', 'tests/truthtrance-knowledge.test.ts'] },
|
||||
{ area: 'Documentation', status: 'Partial', detail: 'Current-knowledge semantics, unknown cases and original FAQ authority are explicit.', evidence: ['docs/TRUTHTRANCE_KNOWLEDGE.md'] },
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import type { Game } from './engine';
|
||||
import { validateFremenRevivalGrant } from './fremen-revival-grant';
|
||||
import { richeseRevealForeignMovementPending } from './richese-reveal-foreign-movement';
|
||||
import { eliteRevivalRemaining, paidForceRevivalCost, revivalPrevented } from './revival';
|
||||
|
||||
const factions = new Set([
|
||||
'atreides', 'beneGesserit', 'emperor', 'fremen', 'guild', 'harkonnen',
|
||||
@@ -78,8 +79,8 @@ export function richeseRevealInterruptSupported(g: Game): boolean {
|
||||
if (foreignMovement) return true;
|
||||
if (g.response) {
|
||||
// Only independent, un-nested native responses with a stable original
|
||||
// source are admitted. In particular, shipment and revival transactions
|
||||
// still need their own continuation proofs.
|
||||
// source are admitted. Other shipment and revival transactions still
|
||||
// need their own continuation proofs.
|
||||
const response = g.response;
|
||||
if (g.decision || g.phaseOpening || g.choamMarket ||
|
||||
!Array.isArray(response.passed) || new Set(response.passed).size !== response.passed.length ||
|
||||
@@ -100,6 +101,20 @@ export function richeseRevealInterruptSupported(g: Game): boolean {
|
||||
!!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 === 'emperorRevival') {
|
||||
const recipient = g.players.find(player => player.id === response.recipient);
|
||||
const amount = response.amount, elite = response.elite;
|
||||
return keys === 'amount,elite,kind,owner,passed,recipient' && g.phase === 4 && owner.faction === 'emperor' &&
|
||||
!!recipient && recipient.id !== owner.id &&
|
||||
owner.ally === recipient.id && recipient.ally === owner.id &&
|
||||
Number.isSafeInteger(amount) && amount! > 0 && amount! <= recipient.tanks &&
|
||||
Number.isSafeInteger(elite) && elite! >= 0 && elite! <= amount! &&
|
||||
elite! <= (recipient.elites?.tanks ?? 0) && amount! - elite! <= recipient.tanks - (recipient.elites?.tanks ?? 0) &&
|
||||
elite! <= eliteRevivalRemaining(recipient, g.advanced) &&
|
||||
Number.isSafeInteger(g.emperorExtra[recipient.id] ?? 0) && (g.emperorExtra[recipient.id] ?? 0) >= 0 &&
|
||||
(g.emperorExtra[recipient.id] ?? 0) + amount! <= 3 &&
|
||||
!revivalPrevented(g, recipient.id) && owner.spice >= paidForceRevivalCost(recipient, amount!, elite!);
|
||||
}
|
||||
if (response.kind === 'revivalIncome')
|
||||
return keys === 'amount,kind,owner,passed,recipient' && owner.faction === 'tleilaxu' &&
|
||||
g.players.some(player => player.id === response.recipient) &&
|
||||
|
||||
Reference in new issue
Block a user