574 lines
33 KiB
Markdown
574 lines
33 KiB
Markdown
# Implications of the four recovered design files
|
||
|
||
Four files were added to `docs/` on 2026-07-30 that were part of the original design but never made
|
||
it into this workspace:
|
||
|
||
| File | What it is |
|
||
| --- | --- |
|
||
| `Deck cards2.xlsx` | The **complete card list** — every card, its count, where it may be placed, what it does |
|
||
| `Mainline Cards.pdf` | The **Mainline card types** — Plains, Curves, Hilly, Heavy Grade, Double Track, Uncontrolled Siding, Tunnel, Trestle, Yard, and both Division Points |
|
||
| `Trains3.pdf` | The **train cards** — all 22, with names, speed class, consist and individual operating rules |
|
||
| `tracks.png` | **Card art** for track and industry cards |
|
||
|
||
This document records what they imply and proposes what to do. **§1a below records what has since been
|
||
implemented**; everything else is still a proposal.
|
||
|
||
---
|
||
|
||
## 1. The headline: the game is roughly 3× what we built
|
||
|
||
| | Built | Recovered design | Change |
|
||
| --- | ---: | ---: | --- |
|
||
| Home Office deck | 52 | **115** | 2.2× |
|
||
| Track cards | in the deck (12) | **104**, a per-player supply of 26 | moved out of the deck entirely |
|
||
| Start cards | ad-hoc | **12** (4 Whistle Posts, 8 Limits) | formalised |
|
||
| **Total components** | ~52 | **231** | |
|
||
| Train cards | 16 | **22** | 12 timetabled + 10 Extras |
|
||
| Distinct card categories | 6 | **10** | four categories are entirely new |
|
||
|
||
The sheet's own totals (115 / 104 / 12 / 231) reconcile exactly with the line items, so these
|
||
numbers are the design's, not an inference.
|
||
|
||
**Most of my invented numbers are now superseded, and that is a good outcome.** Everything in
|
||
`card-reference.md` was explicitly provisional — placeholders standing in for exactly this document.
|
||
|
||
---
|
||
|
||
## 1b. Implementation status after the answers (2026-07-31)
|
||
|
||
All nine answers are implemented, **170 tests passing**:
|
||
|
||
| Answer | Implemented as |
|
||
| --- | --- |
|
||
| Q1 crossing time | `crossingStages()` — a 60 card takes 1 Stage, a 30 takes 2. Mainline nodes now carry a **terrain type** dealt at setup, and trains count down Stages instead of stepping through regions. The `Region` model is gone. |
|
||
| Q2 Fast/Slow | Slow adds one Stage to every card. Hilly reads the consist (any coach = passenger). |
|
||
| Q3 Expedite | An expedited train departs the Stage it arrives — it gets a second `moveTrain` in the same Mainline Phase, still subject to §8.1 clearance. |
|
||
| Q4 Lockouts | `isLockedOut()` rejects the placement with `FACILITY_LOCKED`. |
|
||
| Q5 Run-around | Nothing to do — reachability is geometric, so a built bypass already works. |
|
||
| Q6 Space-use | **Solitaire decks omit all 22 opponent-directed cards**: `buildDeck('solitaire')` returns **93**, competitive returns 115. |
|
||
| Q7 Downward-only | Office cards have a stub **below only**; turnout and curve legs always diverge south; placement and modifier candidates above the Running Track are rejected. §9's "nine nearby spots" is really **six**. |
|
||
| Q8 Crew Tray cap | Already correct. |
|
||
| Q9 Second Section | `newTrain.secondSection` plays on a train due out; an identical train is made up behind it next New Train Phase. The **Sister trains optional rule is removed** from Appendix B. |
|
||
|
||
**Enhancements (18) are now implemented** — placement rules, Small Yard consist re-ordering, ABS
|
||
Signals, Yard Office diversion, Interlocking, the Telegraph/Telephone/Radio dispatch bonuses and the
|
||
three defensive cards, covered by `test/enhancements.test.ts`.
|
||
|
||
**Mainline modifiers (7) and Maneuvers (6 of 7) are now implemented**, covered by
|
||
`test/mainline-cards.test.ts`. They are *not* multiplayer-only — that was a mistaken impression
|
||
given earlier. Brakeman, Airbrakes, Helpers and Realignment all change your own crossing times, and
|
||
Red Flags prevents a rear-ender, which happens in solitaire too. The real reason they lagged was
|
||
sequencing: Enhancements were done first because they change core loops.
|
||
|
||
| Card | Where it lives | Effect |
|
||
| --- | --- | --- |
|
||
| Brakeman, Airbrakes | `mainline.modify` on a grade | −1 Stage downhill each; Airbrakes needs Brakeman on the card |
|
||
| Helpers | `mainline.modify` on a grade | −1 Stage uphill |
|
||
| Realignment ×2 | `mainline.modify` on any Mainline card | converts per `REALIGNMENTS`; barred while a train is on the card |
|
||
| Facing Point Locks ×2 | grid, as the Enhancement | the sheet prints this card in **both** lists — one card, not two |
|
||
| Red Flags ×5 | `maneuver.redFlags` on a stopped train | an approaching train is held instead of colliding; flags come in when the train rolls |
|
||
| Flying Switch | `maneuver.flyingSwitch` during switching | cuts cars into an adjacent industry without the engine entering; costs a Move |
|
||
| Poling | — | **deliberately unimplemented** |
|
||
|
||
Crossing time never falls below one Stage — a train cannot cross in no time.
|
||
|
||
**Poling stays unimplemented.** The recovered sheet records its effect as "TBD in the source", so
|
||
there is nothing to build. A test asserts it remains TBD, to stop anyone "fixing" it by inventing
|
||
an effect; a silent no-op would be worse than a rejection.
|
||
|
||
> **Open question (Q11).** The sheet says Brakeman and Airbrakes give "faster passage downhill" and
|
||
> Helpers "faster passage uphill", but never says **which way a Heavy Grade climbs**. Modelled as
|
||
> climbing **eastward** — eastbound is uphill, westbound downhill. If grades instead carry their own
|
||
> direction, this becomes a property of the Mainline node rather than a constant.
|
||
|
||
**Still not implemented**: the Action (10) and Space-use (12) cards, which are genuinely
|
||
multiplayer-only. Playing them is rejected with `NOT_IMPLEMENTED`.
|
||
|
||
### Track was unplayable (found while wiring up Enhancements)
|
||
|
||
Moving track out of the deck into a per-player supply (§12.2) left **no way to play it**. Districts
|
||
could only grow through Freight-Facility and Modifier cards, so the Running-Track and
|
||
Secondary-Track *straights* that Enhancements attach to essentially never existed. Two bugs
|
||
compounded it: `legalActions` offered Enhancements only **empty** grid cells, when an Enhancement
|
||
attaches to an **occupied** card.
|
||
|
||
Measured before the fix: a hand held a playable Enhancement on **4,778** turns and could legally
|
||
place one on **33** — and those 33 were all ABS Signals, which targets a Mainline card rather than
|
||
the grid.
|
||
|
||
Fixed by adding a `track.lay` intent drawing from `OfficeArea.trackSupply`, and by giving
|
||
Enhancements the occupied cells as candidates. Enhancement placements went 21 → 98 per 40 games.
|
||
|
||
> **Open question (Q10).** The design moves track to a per-player supply but never says *when* a
|
||
> piece may be laid. It is currently treated as a play available during the "draw a card" option,
|
||
> limited to **one piece a turn** — which is how track behaved when it *was* a card. This is an
|
||
> assumption, flagged in `intents.ts`, and needs confirming.
|
||
|
||
### Measurement after the answers
|
||
|
||
100 solitaire Standard games: mean revenue **−1.3**, trains scheduled **2.8**, cards played **11.3**.
|
||
|
||
After Enhancements and the track fix: mean revenue **0.0**, trains scheduled **2.9**, cards played
|
||
**13.9**, collisions **0.3**. Still **0 wins against a target of 20**.
|
||
|
||
### Gap 12 resolved — industry density
|
||
|
||
The shortfall was structural rather than a missing rule. Freight was 10% of gross revenue and
|
||
`carsCoupled` fired **4 times in 100 games**: the chain needs a Freight Facility, an empty car of
|
||
its exact type spotted on its industry track, three Laborer advances, and then a crew with spare
|
||
capacity to lift the load — and there were only **1.6 freight facilities per game**, because the
|
||
recovered sheet puts **9 industries in a 115-card deck** where the prototype had 10 in 52.
|
||
|
||
**Every industry's `copies` is tripled: 9 → 27, deck 115 → 133** (solitaire 93 → 111). Tripling
|
||
uniformly restores roughly the prototype ratio while preserving the sheet's proportions exactly —
|
||
the outbound/inbound balance and the lockout structure are untouched.
|
||
|
||
`ROLLING_STOCK_SUPPLY` scaled with it, from 62 pieces to **80**: worst-case demand at 27 industries
|
||
is boxcar 15, hopper 12, tank 9, reefer 6, and a Division Yard that runs dry would starve the very
|
||
loop the increase exists to feed. That supply was already flagged as provisional, not transcribed.
|
||
|
||
| | 9 industries / 115 | 27 industries / 133 |
|
||
| --- | --- | --- |
|
||
| revenue per player | 0.0 | **1.1** |
|
||
| freight facilities per game | 1.6 | **3.6** |
|
||
| freight share of gross | 10% | **18%** |
|
||
| laborer actions | 9.8 | **16.9** |
|
||
| collisions | 0.3 | **0.1** |
|
||
| trains scheduled | 2.9 | **2.1** |
|
||
|
||
First positive mean revenue recorded, and the `carsCoupled` anomaly cleared. **Still 0 wins against
|
||
a target of 20**, so this is progress on a diagnosis, not a balanced game. Note the side effect:
|
||
trains scheduled fell 2.9 → 2.1, because 22 train cards in 133 are drawn less often than 22 in 115.
|
||
Train density may need the same treatment.
|
||
|
||
Still no wins, and still **not a verdict** — roughly a third of the deck does nothing yet, and the
|
||
Small Yard enhancement (which is what makes the switching puzzle solvable) is among the unimplemented
|
||
cards. Gap 12 stays invalidated until the enhancements are in.
|
||
|
||
---
|
||
|
||
## 1a. What has been done so far (2026-07-31)
|
||
|
||
**Transcribed and in code**, with 169 tests passing:
|
||
|
||
- The full **115-card deck** — `deckComposition()` reconciles exactly with the sheet's own total.
|
||
- **Track removed from the deck** and modelled as a per-player supply of **26** pieces
|
||
(`TRACK_SUPPLY`), with printed handedness and a **move cost** field (2 for sharp curves).
|
||
- **Curves** added to the track graph; the invented run-around card removed.
|
||
- All **22 trains** with names, Fast/Slow speed class, category-based consists and per-card
|
||
operating rules.
|
||
- **Industries retuned to 1-out / 1-loader**, with the real six kinds and their lockout lists.
|
||
- All **23 modifiers**, each tied to its specific hosts, with their effects applied on placement.
|
||
- **Office slots corrected** to equal porter count; deck copies corrected to Depot 4 / Station 2 /
|
||
Terminal 1.
|
||
- The **ten Mainline card types** with speeds and named entry points, as data.
|
||
- The four new categories (space-use, enhancements, mainline modifiers, maneuver, action) are in
|
||
the deck. **Playing them is rejected with `NOT_IMPLEMENTED`** rather than silently doing nothing —
|
||
the failure mode that left Modifiers as dead weight for weeks.
|
||
|
||
**Not done, pending the questions in §10**: the speed model, Expedite, lockout enforcement,
|
||
space-use semantics, and everything the four new categories actually do.
|
||
|
||
### First measurement on the real catalogue
|
||
|
||
100 solitaire Standard games, same bot: mean revenue **−1.9**, trains scheduled **2.3** (was 4.8),
|
||
cards played **10.5** (was 16.3).
|
||
|
||
Development has slowed sharply, and the reason is visible in the composition: **industries are now
|
||
9 cards in 115 (7.8%), where the placeholder had 10 in 52 (19%)**. Their density more than halved,
|
||
and trains fell from 16-in-52 to 22-in-115. The deck is much more diluted, which is exactly what the
|
||
enhancements, maneuver and action cards are there to fill — and none of those do anything yet.
|
||
|
||
**Read no balance conclusions from this number.** It measures a half-implemented ruleset.
|
||
|
||
---
|
||
|
||
## 2. Deck composition
|
||
|
||
### What the design says — 115 cards
|
||
|
||
| Category | Cards | Notes |
|
||
| --- | ---: | --- |
|
||
| Offices (Depot 4, Station 2, Terminal 1) | 7 | *We had 9 (4/3/2)* |
|
||
| Passenger modifiers (Waiting area 3, Restaurant 2, Hotel 1) | 6 | each adds 1 passenger-out + 1 porter |
|
||
| Industries (Freight House 2, Mine Tipple 2, Refinery 1, Power Plant 2, Packing Sheds 1, Grocer's Warehouse 1) | 9 | *We had 10 in a different mix* |
|
||
| Industry modifiers | 17 | each tied to a **specific** industry |
|
||
| Trains (12 timetabled + 10 Extras) | 22 | *We had 16* |
|
||
| **Space-use cards** | 12 | **entirely new** — cards that burn table space |
|
||
| **Enhancements** | 18 | **entirely new** |
|
||
| **Mainline modifiers** | 7 | **entirely new** |
|
||
| **Maneuver cards** | 7 | Red Flags ×5, Flying Switch, Poling |
|
||
| **Action cards ("screw you")** | 10 | **entirely new** — played *at other players* |
|
||
| **Total** | **115** | |
|
||
|
||
### Proposal
|
||
|
||
- Replace `content.ts` wholesale with this catalogue. It is data, so this is transcription rather
|
||
than design.
|
||
- **Gap 4a (52-card deck) is superseded.** Record it as such rather than deleting the reasoning —
|
||
the deck was a stand-in and it did its job.
|
||
- **Gap 13 (deck scaling by player count) largely dissolves.** Track is now per-player by
|
||
construction, which was the real pressure I measured. The 115-card deck is shared. Re-measure
|
||
before concluding anything further.
|
||
|
||
---
|
||
|
||
## 3. Track — the biggest structural change
|
||
|
||
### What the design says
|
||
|
||
Track is **not in the deck**. Each player gets a fixed personal supply of **26 pieces**:
|
||
|
||
| Piece | Per player | Total (4p) | Notes |
|
||
| --- | ---: | ---: | --- |
|
||
| Straight | 8 | 32 | |
|
||
| Curved left | 4 | 16 | **we have no curves at all** |
|
||
| Curved right | 4 | 16 | |
|
||
| Sharp curved left | 1 | 4 | **any move across is doubled — two Moves** |
|
||
| Sharp curved right | 1 | 4 | |
|
||
| Turnout left | 4 | 16 | |
|
||
| Turnout right | 4 | 16 | |
|
||
|
||
Column J ("Train can stop here") is set for straights and curves, blank for turnouts — which matches
|
||
what we built: a turnout is not Operational Rail.
|
||
|
||
### What this changes
|
||
|
||
1. **Curves exist and we have none.** Our geometry is straight / turnout / run-around. The design has
|
||
straight / curved / sharp-curved / turnout, each in left and right hands. Run-around is not a card
|
||
at all — it is presumably *built* from a turnout pair.
|
||
2. **Handedness is printed, not chosen.** Left and right are distinct physical cards.
|
||
**Gap 11's decision — "orientation is chosen on placement" — is therefore superseded.** The
|
||
measurement behind it stands (a fixed default made vertical growth impossible), but the design's
|
||
answer is different and better: give the player a supply containing both hands.
|
||
3. **Sharp curves cost two Moves.** A per-card movement cost, which our Move model does not have.
|
||
4. **Track no longer competes for deck slots**, so the draw is entirely about industry, trains and
|
||
enhancements. This materially changes the economy I measured.
|
||
|
||
### Proposal
|
||
|
||
- Rework `track.ts` around a per-player supply with printed handedness; drop the variant machinery.
|
||
- Add a **move cost** per card (1 normally, 2 for sharp curves) and charge it against the six Moves.
|
||
- Confirm with the designer whether run-around is a built pattern rather than a card — see §10.
|
||
|
||
---
|
||
|
||
## 4. Industries and modifiers — much smaller, much more specific
|
||
|
||
### What the design says
|
||
|
||
Each industry is **one car out and one loader**, not the 2–3 capacity and 2–3 Laborers I invented:
|
||
|
||
| Industry | In deck | Car | Direction | Base capacity |
|
||
| --- | ---: | --- | --- | --- |
|
||
| Freight House | 2 | Box | BOTH | 1 boxcar out, 1 loader; boxcars in |
|
||
| Mine Tipple | 2 | Hopper | OUT | 1 hopper out, 1 loader |
|
||
| Refinery | 1 | Tank | OUT | 1 tank out, 1 loader |
|
||
| Power Plant | 2 | Hopper, Tank | IN | 1 loader |
|
||
| Packing Sheds | 1 | Reefer | OUT | 1 reefer out, 1 loader |
|
||
| Grocer's Warehouse | 1 | Box, Reefer | IN | — |
|
||
|
||
Capacity is then grown by **industry-specific modifiers**, each adding "+1 out, +1 loader":
|
||
|
||
- Mine Tipple → Prep Plant, Coal Piles, Conveyor Belts
|
||
- Refinery → Pipelines, Oil Depot, Viscosity breakers
|
||
- Power Plant → Transmission lines, Rotary Dumps, Steam Turbines
|
||
- Packing Sheds / Grocer's → Ice House, Local small groceries
|
||
- Freight House / Packing Sheds / Grocer's → Truck dock, Forklifts, Railroad Express Agency
|
||
|
||
**Column E is a lockout list** — a concept we do not have at all. Freight House locks out Grocer's
|
||
Warehouse; Mine Tipple locks out Power Plant; Refinery locks out Power Plant; Packing Sheds locks out
|
||
Grocer's Warehouse. Presumably a player may not build both of a locked-out pair.
|
||
|
||
### Passenger side — our guesses were right
|
||
|
||
| Office | Design | What we built |
|
||
| --- | --- | --- |
|
||
| Depot | 1 psgr out, 1 in, 1 porter, **2 A/D** | 1 porter, 2 green, 2 red, 2 A/D |
|
||
| Station | 2 / 2 / 2 porters, **3 A/D** | 2 porters, 3 green, 3 red, 3 A/D |
|
||
| Terminal | 3 / 3 / 3 porters, **4 A/D** | 3 porters, 4 green, 4 red, 4 A/D |
|
||
| Whistle Post | 1 A/D, not in deck, 4 copies | 1 A/D ✓ |
|
||
|
||
Porters and A/D tracks match exactly. **Our slot capacities are one too generous at every tier** —
|
||
the design gives slots equal to porters, not one more. Passenger modifiers (Waiting area, Restaurant,
|
||
Hotel) are what grow them.
|
||
|
||
### Proposal
|
||
|
||
- Retune every industry to **1 out / 1 loader** and rebuild capacity growth around the 17 modifiers.
|
||
This makes Gap 10a's "moderate, varied by industry" profile obsolete.
|
||
- Correct passenger slots to equal porter count.
|
||
- Implement **lockouts** — a new placement constraint.
|
||
- **This changes the economy substantially**: a base industry is far weaker than what we modelled, so
|
||
Gap 12's balance measurements must be re-run from scratch rather than adjusted.
|
||
|
||
---
|
||
|
||
## 5. Trains — names, speed classes, and per-train rules
|
||
|
||
### Timetabled (1–12)
|
||
|
||
| # | Name | Speed | Consist | Rule |
|
||
| --- | --- | --- | --- | --- |
|
||
| 1/2 | Crack Limited | Fast | 3 coaches | Stop at Terminals only. No switching. Expedite. |
|
||
| 3/4 | Express | Fast | 2 freight | May drop or pick up one freight car at every location. Expedite. |
|
||
| 5/6 | The Sparrow | Fast | 2 coaches | No switching. Expedite. |
|
||
| 7/8 | Local | Slow | 1 freight + 1 coach | Coach must remain on station track if switching. |
|
||
| 9/10 | Heavy Freight | Slow | 3 freight + caboose | |
|
||
| 11/12 | Drag Freight | Slow | 2 freight + caboose | |
|
||
|
||
### Extras (X13–X22) — ten distinct trains, not four generic ones
|
||
|
||
Appleseed Extra (MT freight only, may drop but not pick up), Fruit Growers Express (reefers only),
|
||
Yard Xfer, Light Engine Move (no cars at all), Campaign Train (one turn at station for speeches),
|
||
Circus Train (**one turn stopped anywhere earns 1 point**), Military Train, Director's Private Car,
|
||
Freight Extra, Pee-Dee (per-diem, may only pick up empties). Plus a **Second Section** card that
|
||
duplicates the next scheduled train's seniority, rules and consist.
|
||
|
||
### What this changes
|
||
|
||
1. **Consists are by CATEGORY** — "Freight (2)" means any two freight cars, not two hoppers. Our
|
||
`allowedTypes` model is too narrow.
|
||
2. **Fast / Slow is a train property** that pairs with the Mainline cards' 60/30 speeds (§6). We have
|
||
no speed model at all.
|
||
3. **"Expedite"** is a keyword appearing on seven trains, meaning is not yet defined for us.
|
||
4. **Per-train operating rules** — "no switching", "stop at Terminals only", "may drop or pick up one
|
||
freight car at every location". We have none of these.
|
||
5. **Extras are X13–X22**, all junior to every timetabled train. **Gap 5 (Extra vs Timetabled ties)
|
||
becomes unreachable** — the tie it resolves cannot occur. The decision is harmless but moot.
|
||
6. **The Circus Train earns a point for standing still** — the first revenue source that is not a
|
||
load/unload operation. Our scoring model assumes only §9 operations and collisions.
|
||
7. **Second Section** makes the "Sister trains" optional rule concrete.
|
||
|
||
### Proposal
|
||
|
||
- Rewrite the train catalogue from `Trains3.pdf`.
|
||
- Add `speed: fast | slow` and a `rules` field per train; implement the operating rules as checks in
|
||
`apply.ts`.
|
||
- Define "Expedite" with the designer before implementing it — see §10.
|
||
|
||
---
|
||
|
||
## 6. Mainline cards — a whole system we reduced to a constant
|
||
|
||
We modelled a Mainline card as **2 regions, uniform**. The design has **ten distinct card types**:
|
||
|
||
| Card | Speed | Notes |
|
||
| --- | --- | --- |
|
||
| Plains | 60 | |
|
||
| Curves | 30 | |
|
||
| Hilly | **P60 / F30** | different speeds for passenger and freight |
|
||
| Heavy Grade (Up) | **G** | player sets orientation; Brakeman/Airbrakes/Helpers unlock better start positions |
|
||
| Double Track | 60 | **trains may pass** |
|
||
| Uncontrolled Siding | 60 | trains may pass; separate "no pass" and "passing" starts |
|
||
| Tunnel | 30 | |
|
||
| Trestle | 60 | |
|
||
| Yard | 60 | **sort cars into any new order**; has a Yard Limit |
|
||
| East / West Division Point | — | the ends |
|
||
|
||
Each card shows **Start positions** — where a train enters depending on direction, train type, and
|
||
which modifier cards are in play. The Heavy Grade card has five distinct starts (plain, brakemen,
|
||
airbrakes, plain, helpers), so playing Brakeman literally moves your entry point further along.
|
||
|
||
`Realignment` can convert one Mainline card type into another (Plains→Double Track, Curves→Plains,
|
||
Uncontrolled Siding→Double Track, Trestle→Uncontrolled Siding).
|
||
|
||
### What this changes
|
||
|
||
**This is the single largest mechanical gap.** Our Mainline Phase moves every train one region per
|
||
Stage, unconditionally. The design has speed classes, per-train-type speeds, passing, grades that
|
||
modifier cards ameliorate, and yards that re-sort consists.
|
||
|
||
It also bears directly on **Gap 12**. I measured "a train stands at the Office only 18% of Stages"
|
||
and treated it as a possible balance problem. With Double Track, passing sidings, and 60-speed
|
||
cards, traffic density is a *designed variable* — the measurement was taken against a placeholder.
|
||
|
||
### Proposal
|
||
|
||
- Model Mainline cards as typed, with a speed and a set of named entry points.
|
||
- Implement Fast/Slow × card-speed to derive how far a train moves per Stage.
|
||
- **Re-run every Gap 12 measurement afterwards.** The current numbers describe a game that does not
|
||
exist.
|
||
|
||
---
|
||
|
||
## 7. Four entirely new card categories
|
||
|
||
### Space-use cards (12)
|
||
|
||
Bean House, Flop House, Watertower, Hobo Jungle, Section House, City Blocks ×4, Engine Shops,
|
||
Tenderloin District, Engineer Cemetery. All "burn tablespace" — they occupy a grid cell and do
|
||
nothing for you. Presumably played at opponents, or a cost of drawing.
|
||
|
||
### Enhancements (18)
|
||
|
||
- **Interlocking** (+ Facing Point Locks): may stop an inbound train on the Limit track.
|
||
- **Yard Office**: an inbound train with no coaches may arrive at the yard instead of the Train Order
|
||
Office.
|
||
- **Small Yard**: a train spending one Move in the yard **may sort itself into any order, including
|
||
cars ahead of the engine**.
|
||
- **Water Column**: lets you remove a Watertower.
|
||
- **Overpass**: removes restrictions on a Railroad Crossing.
|
||
- **Telegraph / Telephone / Radio**: once a day, when dispatching facing trains, add **+4 / +8 / +12**
|
||
to the other train's number. A genuine dispatching-technology progression.
|
||
- **ABS Signals**: trains on this Mainline card will not rear-end each other; they stop short.
|
||
|
||
**Small Yard deserves special note.** It solves precisely the problem my bot cannot handle: §A.3
|
||
forces cars off in seated order, so spotting a specific car needs the consist re-ordered. A Small
|
||
Yard makes that possible. The switching puzzle was *designed* to have this answer, and we did not
|
||
have the card.
|
||
|
||
**ABS Signals directly touches Gap 2.** We made collisions unconditional; this card makes them
|
||
avoidable on a given card.
|
||
|
||
### Mainline modifiers (7)
|
||
|
||
Brakeman, Airbrakes (requires Brakeman), Helpers, Realignment ×2, Facing Point Locks ×2.
|
||
|
||
### Action cards — played at other players (10)
|
||
|
||
Derail, Broken Coupler, Railroad Crossing, Per Diem Inventory, Demurrage Charge, Customer
|
||
Complaints, Vandalism, Hotbox, Outlawed.
|
||
|
||
**We have no player-interaction mechanic whatsoever.** Several of these cause *point losses* based on
|
||
board state — "lose one point per 2 empty cars on Secondary Tracks" — which is a scoring channel our
|
||
model does not have. In a Competitive game these are presumably a large part of the tension.
|
||
|
||
### Proposal
|
||
|
||
Treat these as four separate work packages, in this order: **Enhancements** (they change core
|
||
movement and switching), **Mainline modifiers**, **Action cards** (needed for multiplayer to mean
|
||
anything), **Space-use** (lowest mechanical weight).
|
||
|
||
---
|
||
|
||
## 8. What this does to the decided gaps
|
||
|
||
| Gap | Status now | Why |
|
||
| --- | --- | --- |
|
||
| 1 Phase order | **stands** | nothing in the new files contradicts it |
|
||
| 2 Collisions automatic | **amended** | ABS Signals makes them avoidable on a card |
|
||
| 3 Office upgrades | **stands**, counts confirmed | A/D and porters match exactly |
|
||
| 4a Deck composition | **superseded** | 52 → 115, track removed from deck |
|
||
| 4b Piece counts | **needs re-derivation** | Mainline speeds change train turnaround entirely |
|
||
| 4c Consist criteria | **superseded** | consists are by category, with per-train rules |
|
||
| 5 Extra/Timetabled ties | **moot** | Extras are X13–X22; the tie cannot occur |
|
||
| 6 Victory conditions | **needs re-derivation** | new revenue sources and point losses |
|
||
| 7 Terminology | **stands** | |
|
||
| 8 Office junction stubs | **needs checking against the art** | `tracks.png` shows the through-line at the card's top edge, not the middle |
|
||
| 9 Make-up round repeats | **stands** | |
|
||
| 10 Card faces | **superseded** | this is the real card list |
|
||
| 11 Track orientation | **superseded** | handedness is printed; both hands are supplied |
|
||
| 12 Balance targets | **invalidated, re-measure** | measured against a placeholder ruleset |
|
||
| 13 Deck scaling | **largely dissolves** | track is per-player by construction |
|
||
|
||
Superseded decisions should be **marked, not deleted** — the reasoning that produced them is how we
|
||
know what questions the design answers.
|
||
|
||
---
|
||
|
||
## 9. Code impact
|
||
|
||
| Component | Impact | Notes |
|
||
| --- | --- | --- |
|
||
| 1 Card catalogue | **Rewrite** | pure data; largest single edit but lowest risk |
|
||
| 2 State model | **Major** | new card kinds, per-player track supply, typed Mainline cards, train speed/rules |
|
||
| 3 Track graph | **Major** | curves, printed handedness, per-card move cost |
|
||
| 4 apply | **Major** | per-train operating rules, enhancements, action cards played at opponents |
|
||
| 5 Phase driver | **Major** | speed model, passing, grades, yard sorting |
|
||
| 6 legalActions | Moderate | follows from 4; the discipline of delegating to `check` protects it |
|
||
| 7 RNG | None | |
|
||
| 17 Bot | **Rewrite** | Small Yard changes the switching problem fundamentally |
|
||
| 18 Harness | Minor | re-run everything |
|
||
| 16 Replay | Moderate | new card types and mechanics to narrate |
|
||
| 19 Tests | **Substantial** | most rules assertions need revisiting |
|
||
|
||
**The engine's architecture holds.** Nothing here breaks the `check`/`execute`/`reduce` split, the
|
||
event log, or the pure-engine boundary. This is a large content and rules expansion inside a
|
||
structure that was built to take it — which is the main thing worth saying about it.
|
||
|
||
---
|
||
|
||
## 9a. Answers from the designer
|
||
|
||
Recorded as they are given, so nothing is lost between sessions.
|
||
|
||
| # | Question | Answer |
|
||
| --- | --- | --- |
|
||
| 1 | What do Mainline 60 / 30 mean? | **Miles per hour, expressed as crossing time.** A 60 card takes **one Stage** to cross; a 30 card takes **two**. The printed cells are decoration. Realignment (Curves→Plains) therefore has real value, and 30-cards are genuine chokepoints. |
|
||
| 2 | How does Fast/Slow affect crossing? | **Slow adds one Stage to every card.** Fast 60→1, 30→2; Slow 60→2, 30→3. The label therefore matters on every card. Consequence to watch: Slow trains occupy a Crew Tray roughly twice as long, so tray scarcity (§7) bites considerably harder than the placeholder measured. |
|
||
| 3 | What does "Expedite" mean? | **The train departs the same Stage it arrives** — it does not spend a Stage standing at the Office. Still subject to the normal §8.1 clearance rules, so it can be held. Fits X17's "one turn at station *then* expedite", and partly offsets the Slow-train transit cost below. |
|
||
| 4 | What does a lockout prevent? | **Building both in your district.** If you hold a Mine Tipple, a Power Plant card is unplayable in your Office Area, and vice versa. Each locked pair is a producer and the consumer of the same commodity, so this forces traffic to flow *between* districts — a deliberate multiplayer-interdependence mechanic. In solitaire it simply narrows the build options. |
|
||
| 5 | Is a run-around a card? | **No — a pattern built from the track supply.** Opposite-hand turnouts joined by straights. Nothing to implement: reachability is computed from geometry, so a valid bypass already works. This explains the 8 turnouts per player, and makes §A.5's facing-point move a building achievement rather than a lucky draw. |
|
||
| 6 | How are Space-use cards played? | **At another player's district**, consuming a grid cell they wanted. This explains Water Column ("remove any Watertower in *your* district" — one an opponent gave you) and Vandalism (exploits a Hobo Jungle you were saddled with). A second, milder attack channel alongside the Action cards. **In solitaire they have no target** — see the note below. |
|
||
| 7 | Does a district grow both ways? | **Downward only** — the through-track sits at the card's top edge and everything diverges beneath it, matching `tracks.png`. A district is a Running Track with all Secondary Track hanging below. **Supersedes Gap 8's north-and-south stubs.** Consequences: buildable area halves; districts become long and shallow; §9's nine-spot Modifier neighbourhood needs rewording, since three of the nine spots are above the track and no longer exist. |
|
||
| 8 | Any cap on trains in play? | **No — Crew Trays are the only limit.** All 12 timetabled trains may end up scheduled; Extras run on top ad hoc; a due train with no free crew is held (§7). Already implemented. This makes the Crew Tray count (`players + 3`) the single most important balance dial, and "held" a common visible state. |
|
||
| 9 | What is the Second Section card? | **A card played on a train that is due out.** A second identical train runs immediately behind it — same number, rules and consist — and needs its own Crew Tray. It deliberately creates the following-train situation §8.1 makes the Superintendent rule on, so a player can force the game's central decision onto the table. Explains the green flags on the artwork. **Supersedes the "Sister trains" optional rule**, which should be removed from Appendix B. |
|
||
|
||
### Solitaire consequence of Q6
|
||
|
||
If Space-use cards are played at opponents, then in the **solitaire MVP they have no legal target** —
|
||
12 of 115 cards (10.4%) become dead draws. Combined with the 10 Action cards, which are also
|
||
opponent-directed, **22 of 115 cards (19%) do nothing in a one-player game.**
|
||
|
||
That is a real finding for the MVP, and there are only a few honest ways to handle it: remove them
|
||
from a solitaire deck, allow them to be discarded freely, or accept that solitaire draws are a fifth
|
||
dead. Worth deciding explicitly rather than by default. Not blocking — flagged for after the
|
||
remaining questions.
|
||
|
||
### Consequence noted at the time of answering
|
||
|
||
Under Q1 + Q2, on a 3-player Division (4 Mainline cards, mixed terrain):
|
||
|
||
| | Mainline Stages | + Office stops | End-to-end |
|
||
| --- | ---: | ---: | ---: |
|
||
| Fast train | 6 | 3 | **9 Stages** |
|
||
| Slow train | 10 | 3 | **13 Stages** |
|
||
|
||
A Day is 12 Stages, so **every Slow train is still on the road when the next Day begins**, holding
|
||
its Crew Tray. With `players + 3` trays this will throttle freight hard. Expedite (Q3) relieves it
|
||
somewhat for the trains that carry it — but none of the Slow freight trains do. Worth re-measuring
|
||
once the speed model is implemented; the Crew Tray count is the obvious dial.
|
||
|
||
---
|
||
|
||
## 10. Questions only the designer can answer
|
||
|
||
1. **"Expedite"** — appears on seven trains and is never defined. Priority? No stopping? Extra speed?
|
||
2. **Speed numbers.** Do 60 and 30 mean "cells per Stage", "Stages to cross", or literal mph against
|
||
a 2-hour Stage? A Mainline card is "roughly a hundred miles" (§2.1), so 60 mph × 2 h ≈ one card
|
||
per Stage and 30 ≈ two — but this should be confirmed, not inferred.
|
||
3. **Fast vs Slow trains** — how do they interact with a card's speed? Does a Slow train take double
|
||
on every card, or only where the card distinguishes (Hilly's P60/F30)?
|
||
4. **Lockouts** (spreadsheet column E) — does one card prevent *building* the other, or prevent both
|
||
*operating*?
|
||
5. **Run-around** — we treat it as a card; it is not in the supply. Is it a pattern built from two
|
||
turnouts?
|
||
6. **Space-use cards** — played at yourself as a cost of drawing, or at opponents?
|
||
7. **Where the Office's junction stubs are.** `tracks.png` draws the through-line along the top edge
|
||
with curves diverging downward. Gap 8 assumed stubs above *and* below a centred track.
|
||
8. **Are all 22 trains in play at once**, or is the timetable still 12 slots with Extras run on top?
|
||
9. **Second Section** — is it a card played on a scheduled train, or its own train?
|
||
|
||
---
|
||
|
||
## 11. Recommended sequencing
|
||
|
||
The temptation is to rebuild everything at once. I would not.
|
||
|
||
1. **Transcribe the catalogue first** (`content.ts` from the spreadsheet and `Trains3.pdf`). Pure
|
||
data, no rules risk, and it makes the true scope concrete.
|
||
2. **Answer §10's questions**, particularly speed and Expedite — several later decisions hang on
|
||
them.
|
||
3. **Mainline card types and the speed model.** The largest mechanical gap and the one that
|
||
invalidates the current balance numbers.
|
||
4. **Track supply and curves**, including the sharp-curve double Move cost.
|
||
5. **Industry retune to 1-out/1-loader plus the modifier system**, then re-run the harness. Expect
|
||
very different numbers.
|
||
6. **Enhancements**, starting with Small Yard and ABS Signals — both change core loops.
|
||
7. **Action cards**, which is when multiplayer becomes a real game rather than parallel solitaire.
|
||
8. **Space-use cards** last.
|
||
|
||
**Do not retune anything against current measurements.** Gap 12's numbers describe a placeholder
|
||
ruleset. Re-measure after step 5 and treat everything before that as void.
|