Scope Advanced Kull to the attempted Karama effect

Adopt the supplied Advanced specific-effect wording, preserving Basic and legacy phase-wide semantics. Bind signed semantic purposes through ordinary/special activations, counters, feasibility and settlement; retain unrelated human controls and minimal bot actions. Phase expiry remains provisional; prior counter, BG and deferred-overbid choices stay.

Validation: frozen12-file111/111, types/lint/build and two original-action/rendered-table programmes. Explicit unopened deal/auction/spice order supports real paid Baliset and shipments; Advanced retains Karama for Baliset cancellation while Basic stays blocked. Four minimal policies remain legal. Correct stale exchange/phase-market/Fremen fixture assumptions. Recovery schema expectations maintained without running deferred SQL assurance. No full modes, browser/deployed acceptance, saved-game/reset/restart or deployment operation.
This commit is contained in:
Quintine committed 2026-10-18 12:49:23 +11:00
1 parent b82441c834
commit 884a09fa92
24 files changed
+951 -64

No files matched your search

+9 -2
View File
@@ -404,7 +404,7 @@ for (const source of ['printed', 'nexus'] as const)
assert.equal(paid.players[0].spice, 1);
});
void test('the Nexus-only Kull profile keeps unsupported Fremen remote Cunning behind its existing pre-offer guard', () => {
void test('a declined Kull resumes the original Fremen special into its native Cunning offer', () => {
const f = createNexusChoamKullFixture({ actorFaction: 'fremen', fuel: 'weapon', counter: false });
const game = applyAction(f.game, f.choam, { type: 'kullDecision', event: f.event, decline: true });
game.players[1].hand.push(takeKullCard(game, f.original));
@@ -435,12 +435,19 @@ void test('the Nexus-only Kull profile keeps unsupported Fremen remote Cunning b
const summoned = applyAction(reload(offered), f.choam, {
type: 'kullDecision', event: offered.pendingKull!.event, decline: true });
assert.equal(summoned.players[1].specialKaramaUsed, true);
assert.equal(summoned.nexusFremenCunningOffer ?? null, null);
assert.ok(summoned.nexusFremenCunningOffer);
assert.equal(summoned.nexusFremenCunningOffer.occurrence.parent, summoned.summonedWorm?.event);
assert.equal(summoned.decision?.kind, 'nexusFremenCunningOffer');
assert.equal(summoned.nexusFremenCunningRides ?? null, null);
assert.equal(summoned.nexusCards!.cards!.hands[f.actor], 'fremen');
assert.equal(summoned.discard.filter(card => card.id === f.original).length, 1);
reject(summoned, f.actor, { type: 'decision', event: 'unsupported-remote-ride', accept: true });
viewGame(reload(summoned), f.actor);
const declined = applyAction(summoned, f.actor, {type:'decision',
event:summoned.nexusFremenCunningOffer.occurrence.event, accept:false});
assert.equal(declined.nexusFremenCunningOffer ?? null, null);
assert.equal(declined.nexusCards!.cards!.hands[f.actor], 'fremen');
assert.equal(declined.discard.filter(card => card.id === f.original).length, 1);
});
void test('a canceled CHOAM-effect block does not remove ordinary Karama auction-payment coverage', () => {