Files
Dune/game/tleilaxu-special-karama.ts
Quintine 1a505525a8 Open Tleilaxu special Karama throughout Revival
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.
2026-10-24 19:30:21 +11:00

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 };
}