Permit native Advanced quiet any-player declarations alongside the original target-bound pending request. Preserve completed returns and charges. Adopt explicit provisional Ghola inclusion during the remaining Revival and phase expiry; keep printed Emperor special immunity and the existing low-Homeworld guard. Connect persistent controls and minimal legal bots through the shared quote. Validation: 14 related files148/148, types/lint/build, six actual native control/engine/GameTable SSR journeys and four existing-profile continuations. Private-driver-only feedback reuses passed source-identical checks. Native111/113-action setup, paid shipment and battle sources earn originals. No saved-room/D1/restart/deployment operation; full modes and browser/deployed acceptance remain open.
37 lines
1.9 KiB
TypeScript
37 lines
1.9 KiB
TypeScript
import type { FactionId } from './catalog';
|
|
|
|
export type TleilaxuSpecialKaramaContext = {
|
|
status: string;
|
|
phase: number;
|
|
advanced: boolean;
|
|
owner: { id: string; faction: FactionId; specialKaramaUsed?: boolean };
|
|
players: readonly { id: string }[];
|
|
/** The authoritative engine supplies current spendable physical card IDs. */
|
|
cards: readonly string[];
|
|
/** The original normal-revival interruption, otherwise a quiet declaration. */
|
|
pendingPlayer: string | null;
|
|
blocked: string | null;
|
|
targetBlocks?: Readonly<Record<string, string | null>>;
|
|
};
|
|
|
|
/** Supplied physical p38 H permits choosing any one player during Revival.
|
|
* Tank count, hidden leader eligibility, prior returns and readiness do not
|
|
* determine permission. Existing enclosing priorities and target exceptions do.
|
|
*/
|
|
export function quoteTleilaxuSpecialKarama(context: TleilaxuSpecialKaramaContext) {
|
|
let blocked: string | null = null;
|
|
if (!context.advanced) blocked = 'Special Karama powers require the Advanced game.';
|
|
else if (context.owner.faction !== 'tleilaxu') blocked = 'Only native Tleilaxu may use this special Karama.';
|
|
else if (context.status !== 'playing' || context.phase !== 4)
|
|
blocked = 'Declare this special Karama during the Revival Phase.';
|
|
else if (context.owner.specialKaramaUsed)
|
|
blocked = 'Your special Karama power has already been used this game.';
|
|
else if (context.blocked) blocked = context.blocked;
|
|
else if (!context.cards.length) blocked = 'A spendable Karama card is required.';
|
|
const targets = context.players
|
|
.filter(player => context.pendingPlayer === null || player.id === context.pendingPlayer)
|
|
.map(player => ({ player: player.id, blocked: context.targetBlocks?.[player.id] ?? null }));
|
|
if (!blocked && !targets.length) blocked = 'Choose a player in this Revival Phase.';
|
|
return { blocked, cards: [...context.cards], targets, pending: context.pendingPlayer !== null };
|
|
}
|