+ Your payment, shipment and movement promises
+ {own.map(promise => -
+ Turn {promise.turn}: You answered {promise.answer ? 'Yes' : 'No'} to {truthQuestionText({ kind: 'turnActions', target: promise.player,
+ turn: promise.turn, mixed: promise.mixed }, id => id === CHEAP_HERO_TRAITOR ? 'Cheap Hero / Heroine'
+ : game.allLeaders.find(leader => leader.id === id)?.name ?? id,
+ id => game.combatLocations.find(location => location.id === id)?.name ?? id,
+ id => game.players.find(player => player.id === id)?.name ?? id)}.
+ {promise.released ? ' Released: this whole commitment is no longer possible.'
+ : promise.fulfilled ? ' Fulfilled: this whole commitment is complete.' : ' This whole answer is binding until its remaining conditions close this turn.'}
+
)}
+ AND requires every condition; OR requires at least one. No negates the whole expression, not each condition separately.
+ Separate No answers each create their own restriction. Legal alternatives remain available; no fixed branch is selected for you.
+ Current facts freeze at the answer and create no promise to keep cards, spice or forces afterward.
+ Only the aggregate answer is shared. Individual fact answers and any reduced future branch remain private.
+ Count the sum of future real ordinary payments to each named recipient after the answer.
+ Earlier payments, gifts and ally aid do not count. The sender pays immediately; the recipient collects at the next Mentat opening.
+ Payments made during Mentat Pause wait until next turn's Mentat opening; collection never counts twice.
+ Shipment conditions concern one future original reserve shipment. Ground-movement conditions count the maximum physical forces in one actual future move,
+ never the sum of smaller moves. Earlier shipment and movement do not count.
+ Shipment and movement close at your own Movement turn end; ordinary payments remain possible until the actual turn ends.
+ Original costs, timing, cards, preparation and action rights still apply. This claim grants no extra action.
+ {live && {game.phase === 8 ? 'Complete any remaining ordinary payment before the actual turn ends. Late recipients collect next turn.'
+ : game.phase < 5 ? 'Your Movement turn is still ahead. Preserve the needed forces, spice and cards and complete any offered native preparation.'
+ : 'Use the current native controls to honor your whole answer. Payment conditions can remain after your Movement turn ends.'}
}
+ {live && }
+ ;
+}
+
+/** Render only the current respondent's private native whole-answer choices. */
+export function TurnActionAnswers(props: TurnActionProps) {
+ const game = props.game, window = game.truthtrance, question = window?.question;
+ if (window?.stage !== 'answer' || question?.kind !== 'turnActions' || question.target !== game.me || !game.truthTurnActionAnswers) return null;
+ const actor = game.me, turn = game.turn, phase = game.phase, source = window.queue[0], answers = game.truthTurnActionAnswers;
+ const signature = JSON.stringify(question), sourceSignature = JSON.stringify(source);
+ const canAnswer = (answer: TruthAnswer) => {
+ const current = props.game, me = current.players.find(player => player.id === actor);
+ return !props.busy && current === game && current.status === 'playing' &&
+ Number.isSafeInteger(phase) && phase >= 0 && phase <= 8 && current.phase === phase && current.turn === turn &&
+ current.me === actor && question.turn === turn && current.truthtrance === window && window.stage === 'answer' &&
+ window.question === question && question.target === actor && JSON.stringify(question) === signature &&
+ !!source && window.queue[0] === source && JSON.stringify(source) === sourceSignature &&
+ current.truthTurnActionAnswers === answers && answers.includes(answer) &&
+ !!me && !me.autopilot && !current.response && !current.decision && !current.phaseOpening &&
+ !current.automaticContinuationPending && !current.roomControl?.paused && !current.roomControl?.closed;
+ };
+ return