Complete forced Harkonnen returns with private saved inspection
Automatically return the full combined hand when it is the only legal special-Karama return. Preserve real choices and restore the suspended response or auction payment through the same settlement. Record the actual blind draw as owner-only historical card faces, with a bound integrity receipt; legacy forced saves describe held-card history truthfully. Add readable private history and enlarged inspectors. Both manual and forced returns publish only a faction/action completion tag. Wake idle legacy exchanges through production recovery without writes for real choices. Keep provisional auction funding rules and release gates. Validation: types, lint, 5150 offline tests, build and 49 HTTP tests passed. Independent review resolved history substitution and root review completed idle recovery wiring. New tests cover 1-4 forced draws, real choices, overlays, exact saved history, immutable rejection, all four legal AI paths, production competing actions/recovery, private views and custody. One genuine Advanced four-player sample completed 158 actions with 4 JSON restores and no rejected action; no difficulty tuning. Browser QA QUTHVPTT used genuine Advanced setup and conserved Bidding positions. The actual power returned four cards without a prompt; private history/enlargement and exact refresh worked. Phone panel fit without horizontal overflow with 44px inspector controls. Screenshot capture timed out; complete visual acceptance and transient notice capture remain open. Preserved every prior row across all ten tables, including 1586 rooms and 3354 seats. New QA/integration records bring totals to 1626 rooms and 3442 seats. No reset, restart or automation.
This commit is contained in:
1 parent
a3bc0ac837
commit
0f79f28ccb
21 files changed
+847
-52
No files matched your search
@@ -194,6 +194,8 @@ void test('real Harkonnen extraction reserves future recipient slots and enough
|
||||
hold(g, 'r', 'Distrans');
|
||||
const give = hold(g, 'r', 'Shield');
|
||||
const k = hold(g, 'e', 'Karama');
|
||||
// Keep a real return choice after the blind draw; a Karama-only hand now returns automatically.
|
||||
const retained = hold(g, 'e', 'Truthtrance');
|
||||
for (const name of ['Maula Pistol', 'Lasgun', 'Baliset', 'Snooper'].slice(
|
||||
0,
|
||||
initialSize,
|
||||
@@ -208,6 +210,8 @@ void test('real Harkonnen extraction reserves future recipient slots and enough
|
||||
target: 'a',
|
||||
amount: 2,
|
||||
});
|
||||
assert.equal(g.decision?.kind, 'handExchange');
|
||||
assert.equal(g.players[2].hand.length, 3);
|
||||
if (initialSize === 4) {
|
||||
const snapshot = structuredClone(g);
|
||||
assert.throws(() => transfer(g, 'r', 'a', give), /room|exchange/);
|
||||
@@ -220,6 +224,7 @@ void test('real Harkonnen extraction reserves future recipient slots and enough
|
||||
.map((c) => c.id),
|
||||
});
|
||||
assert.equal(g.players[1].hand.length, 4);
|
||||
assert.deepEqual(g.players[2].hand.map(card => card.id), [retained]);
|
||||
assert.deepEqual(inventory(g), before);
|
||||
}
|
||||
let g = fixture();
|
||||
|
||||
Reference in new issue
Block a user