Prototype Leader Skills setup, battle disciplines and capture
Connect all fourteen physical skills and private setup to five card-role battle modifiers, public posture, Harkonnen skilled capture, death return and optional own-leader revival through controls, legal AI and persisted room actions. Nine skill effects and combined-mode/publication acceptance remain unfinished. Captured replacement entitlement and foreign ghola integration stay guarded. Fresh publisher/designer research supports skilled-capture publicity through its unique known physical card; this is recorded as a component inference. Independent review found and fixed Voice/must-use-leader and invalid saved assignment/offer cases. A pre-existing Discovery privacy assertion confused card ID prefixes; the corrected deterministic physical-pair scenario was independently reviewed. The first broad run was 4410/4411; corrected final verification passes types/lint, all 4411 offline tests, build and 43 HTTP tests. Final durations: check 149741ms, build 6659ms, integration 28274ms. Source fingerprint: aef655ac1ebc0eb2f64294e13d3d27337167312cf8ab17568a166ee9c39f6a85. Private final report: 20260913-leader-skills/checks-final/report.json. Three seeded prototype games completed with no rejected bot candidates. Browser setup/card inspection/refresh passed. Another user-reported power outage stopped the server; backup and necessary restart restored the same private seat. All 292 games at restart and their original application records remain unchanged; 33 isolated HTTP-test rooms bring the current total to 325. No database reset. Efficiency: one shared setup/lifecycle implementation supports five connected role effects; selective existing agents handled catalog/UI/tests/research and independent reviews. One repeated broad check was required by the reproduced ID-prefix assertion failure. Aggregate goal counter rose from 65529766 to 67313673 through this checkpoint (1783907), including inherited context and coordination; this is not a billing or savings estimate. Full goal remains active.
This commit is contained in:
1 parent
369371671f
commit
6e6fecc9d4
28 files changed
+4196
-38
No files matched your search
@@ -2,7 +2,10 @@ import test from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import { DatabaseSync } from 'node:sqlite';
|
||||
import { createGame, joinGame, newPlayer } from '../game/engine';
|
||||
import { startIxPrototypeRoom } from '../tools/prototype-room';
|
||||
import {
|
||||
startIxPrototypeRoom,
|
||||
startPrototypeRoom,
|
||||
} from '../tools/prototype-room';
|
||||
|
||||
function fixture(t: test.TestContext) {
|
||||
const db = new DatabaseSync(':memory:');
|
||||
@@ -96,3 +99,50 @@ void test('unready, wrong identity and incompatible lobbies fail without writing
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
void test('Leader Skills prototype saves the real private setup once without changing other rooms or seats', (t) => {
|
||||
const { db } = fixture(t);
|
||||
const game = createGame(
|
||||
'PROTOTYP',
|
||||
newPlayer('i', 'Atreides', 'atreides'),
|
||||
true,
|
||||
);
|
||||
joinGame(game, newPlayer('h', 'Harkonnen', 'harkonnen'));
|
||||
game.players.forEach((p) => {
|
||||
p.ready = true;
|
||||
});
|
||||
db.prepare('UPDATE rooms SET state = ? WHERE code = ?').run(
|
||||
JSON.stringify(game),
|
||||
game.code,
|
||||
);
|
||||
const seats = db.prepare('SELECT * FROM seats').all();
|
||||
const other = db
|
||||
.prepare('SELECT * FROM rooms WHERE code = ?')
|
||||
.get('KEEPME00');
|
||||
const result = startPrototypeRoom(db, game.code, 7, 'leader-skills');
|
||||
assert.equal(result.version, 8);
|
||||
const saved = JSON.parse(
|
||||
db.prepare('SELECT state FROM rooms WHERE code = ?').get(game.code)!
|
||||
.state as string,
|
||||
);
|
||||
assert.equal(saved.version, 8);
|
||||
assert.equal(saved.setupStage, 'leaderSkills');
|
||||
assert.equal(saved.leaderSkills.offers.i.cards.length, 2);
|
||||
assert.equal(saved.leaderSkills.offers.h.cards.length, 2);
|
||||
assert.equal(saved.players[0].hand.length, 1);
|
||||
assert.equal(saved.players[1].hand.length, 2);
|
||||
const rooms = db.prepare('SELECT * FROM rooms ORDER BY code').all();
|
||||
assert.throws(
|
||||
() => startPrototypeRoom(db, game.code, 8, 'leader-skills'),
|
||||
/redeal/,
|
||||
);
|
||||
assert.deepEqual(
|
||||
db.prepare('SELECT * FROM rooms ORDER BY code').all(),
|
||||
rooms,
|
||||
);
|
||||
assert.deepEqual(db.prepare('SELECT * FROM seats').all(), seats);
|
||||
assert.deepEqual(
|
||||
db.prepare('SELECT * FROM rooms WHERE code = ?').get('KEEPME00'),
|
||||
other,
|
||||
);
|
||||
});
|
||||
Reference in new issue
Block a user