Support Moritani assassination of captured and foreign-ghola targets

Retain printed native identity and valid original custody while projecting only
uniform potential bounty before commitment. Resolve living/dead targets once,
clear selected capture/concealment and retain ordinary Ghola return custody.
Selected concealed-outcome disclosure is explicitly provisional.

Verified: 14 affected offline files100/100, types/lint and production build;
six actual choice/gameplay/GameTable SSR journeys and twelve profile paths.
Native capture source47 actions; actual paid Ghola prefix140 actions followed
by explicit conserved seven-action battle. No saved-room/D1/reset/restart or
deployment operation. Runtime-only driver fixes reused unchanged passed checks.
This commit is contained in:
Quintine committed 2026-10-24 19:03:03 +11:00
1 parent 61828150b9
commit eff668b202
25 files changed
+1041 -57

No files matched your search

+3 -1
View File
@@ -32,7 +32,9 @@ void test('a real lost battle reveals one different opposing traitor, kills its
void test('an already dead target remains a legal assassination reveal with no bounty or repeated death',()=>{
const pending=resolveAssassinationBattle(stageAssassinationBattle(assassinationGame(),'guild-1',true));
const before=pending.players[0].spice,dead=structuredClone(pending.players[1].leaders[1]);
assert.equal(viewGame(pending,'m').moritaniAssassinate!.pending!.cards[0].bounty,0);
const choice=viewGame(pending,'m').moritaniAssassinate!.pending!.cards[0];
assert.equal(choice.potentialBounty,dead.strength);
assert.equal('dead' in choice,false);assert.equal('bounty' in choice,false);
const done=assassinationChoice(pending,'guild-1');
assert.equal(done.players[0].spice,before);assert.deepEqual(done.players[1].leaders[1],dead);
const next=assassinationToMentat(done);assert.equal(next.moritaniAssassinate!.opportunities[0].stage,'replaced');