adding classification and division yard updates, train collisions, engine and car updates, turnout improvements.

This commit is contained in:
Jesse
2026-08-04 21:03:17 -04:00
parent 4bba991f41
commit 821d3cdffa
26 changed files with 6876 additions and 2638 deletions
+12 -7
View File
@@ -53,7 +53,11 @@ describe('card catalogue (component 1)', () => {
// Transcribed from docs/Deck cards2.xlsx, whose own total is 115 — plus 18 extra industry cards
// (Gap 12, industries 9 → 27) and 7 extra office cards (Q12, offices 7 → 14). Both are
// deliberate departures from the sheet and both are flagged provisional in content.ts.
assert.equal(DECK_SIZE, 140);
//
// 139, not 140: Poling is dealt ZERO copies. Its effect is "TBD in the source", so a card that
// cannot be played is worse in a hand than absent from the deck. The entry stays in the
// catalogue so the gap remains visible.
assert.equal(DECK_SIZE, 139);
assert.equal(buildDeck().length, DECK_SIZE);
});
@@ -69,20 +73,21 @@ describe('card catalogue (component 1)', () => {
spaceUse: 12,
enhancement: 18,
mainlineModifier: 7,
maneuver: 7,
// 6, not 7 — Poling is dealt no copies until its rule is known.
maneuver: 6,
action: 10,
});
});
it('removes opponent-directed cards from a solitaire deck', () => {
// Q6 — Space-use and Action cards can only be played AT another player, so in a one-player
// game they would be 22 of 140 draws (16%) that do nothing.
assert.equal(SOLITAIRE_DECK_SIZE, 118);
// game they would be 22 of 139 draws (16%) that do nothing.
assert.equal(SOLITAIRE_DECK_SIZE, 117);
const solo = buildDeck('solitaire');
assert.equal(solo.length, 118);
assert.equal(solo.length, SOLITAIRE_DECK_SIZE);
assert.ok(!solo.some((c) => c.kind.kind === 'spaceUse' || c.kind.kind === 'action'));
// A competitive deck keeps them.
assert.equal(buildDeck('competitive').length, 140);
// A competitive deck keeps them. 139, not 140 — Poling is dealt no copies.
assert.equal(buildDeck('competitive').length, 139);
});
it('keeps track OUT of the deck, as a per-player supply', () => {