Combine current facts with native Traitor decisions

This commit is contained in:
Quintine committed 2026-10-26 18:52:06 +11:00
1 parent 812f77e348
commit 13398aa76e
22 files changed
+1512 -17

No files matched your search

+9 -3
View File
@@ -13,6 +13,8 @@ export type TraitorDecisionContext = {
export type TraitorDecisionPromise = Omit<TraitorDecisionContext, 'canReveal' | 'submitted'> & {
asker: string;
answer: boolean;
/** Link to the owner's mixed-question record; pure declaration receipts omit it. */
event?: string;
fulfilled?: boolean;
released?: boolean;
};
@@ -40,11 +42,12 @@ export function validateTraitorDecisionPromise(value: unknown): value is Traitor
if (!record(value)) return false;
const required = ['answer', 'asker', 'battle', 'beneficiary', 'leader', 'player', 'target', 'turn'];
if (!required.every(key => Object.hasOwn(value, key)) ||
Object.keys(value).some(key => !required.includes(key) && key !== 'fulfilled' && key !== 'released')) return false;
Object.keys(value).some(key => !required.includes(key) && key !== 'event' && key !== 'fulfilled' && key !== 'released')) return false;
return turnNumber(value.turn) && identifier(value.battle) && identifier(value.player) &&
identifier(value.beneficiary) && identifier(value.target) &&
(value.leader === null || identifier(value.leader)) && identifier(value.asker) &&
typeof value.answer === 'boolean' && optionalBoolean(value.fulfilled) && optionalBoolean(value.released);
typeof value.answer === 'boolean' && (!Object.hasOwn(value, 'event') || identifier(value.event)) &&
optionalBoolean(value.fulfilled) && optionalBoolean(value.released);
}
function validateContext(context: TraitorDecisionContext) {
@@ -85,13 +88,16 @@ export function bindTraitorDecisionPromise(
promises: readonly TraitorDecisionPromise[],
asker: string,
answer: boolean,
event?: string,
): TraitorDecisionPromise[] {
requireDecision(identifier(asker) && typeof answer === 'boolean', 'Choose a definite Traitor decision answer and its asker.');
requireDecision(identifier(asker) && typeof answer === 'boolean' && (event === undefined || identifier(event)),
'Choose a definite Traitor decision answer, its asker and an optional public event.');
requireDecision(traitorDecisionChoices(context, promises).includes(answer),
'This answer has no compatible current Traitor declaration.');
return [...promises.map(promise => ({ ...promise })), {
turn: context.turn, battle: context.battle, player: context.player,
beneficiary: context.beneficiary, target: context.target, leader: context.leader, asker, answer,
...(event === undefined ? {} : { event }),
}];
}