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.
This commit is contained in:
Quintine committed 2026-10-24 19:30:21 +11:00
1 parent 6ea691255a
commit 1a505525a8
18 files changed
+977 -59

No files matched your search

+8 -1
View File
@@ -234,7 +234,7 @@ void test('Ghola options are own-hand only and ignore opponents private spice ca
assert.deepEqual(viewGame(g, 'p').ghola, a);
assert.deepEqual(before.players[0], g.players[0]);
});
void test('Ghola respects pending table windows while normal revival prevention does not block it', () => {
void test('Ghola respects table windows and Revival prevention, which expires outside Revival', () => {
const { g, card } = fixture();
Object.assign(g.players[0], {
tanks: 5,
@@ -243,6 +243,13 @@ void test('Ghola respects pending table windows while normal revival prevention
leaderRevived: true,
});
g.revivalPrevention = { player: 'p', turn: 2 };
assert.equal(viewGame(g, 'p').ghola.available, false);
const blocked = structuredClone(g);
assert.throws(() => applyAction(g, 'p', { type: 'card', card, amount: 5 }), /prevented.*Ghola/);
assert.deepEqual(g, blocked);
// Unit timing branch; the native fixture separately proves actual phase exit.
g.phase = 5;
g.active = 'p';
assert.equal(viewGame(g, 'p').ghola.available, true);
const done = applyAction(g, 'p', { type: 'card', card, amount: 5 });
assert.equal(done.players[0].reserves, 20);