v0.7.2 — a leg that is part of the row, the deck the sheet prints, regions not miles per hour, and a Division you read left to right

Gitea#17 — a 45° leg is an end of the west-to-east row, so backing into a cut
through a curve's south leg no longer couples it back to front. The same
assumption left a crew's own cut standing when it pulled out through a leg,
which is the "cars left behind" report we had failed to reproduce.

Gitea#14 — every count is docs/Deck cards5.xlsx. Track halved, and the Q12
office doubling and Gap 12 industry tripling both come out with it: they were
measured against a deck with twice the track, and keeping them at the sheet's
track count wipes out the reefer chain entirely. 84 rows now match card for
card; the ten Safety, Event and Inspection cards it adds are not built and are
held out. Cards the sheet no longer lists are dealt zero copies rather than
deleted, so their rules stay implemented.

Gitea#15 — RAR reversed it: a rail may stop dead against its neighbour and the
placement is legal. What must hold is that no train crosses the gap, which was
already true and is now pinned against the reported board.

Gitea#3 — the printed speeds are scenery. A card costs one Stage per printed
region and where a train STARTS is what varies; Fast/Slow is read on Hilly
alone. Entering a one-region card behind another is a collision now, which is
what ABS exists to prevent, and ABS no longer holds trains silently.

Gitea#18 — the Division draws as one row, west to east, with no office-area
detail. East is finally always to the right.

Closes #3
Closes #14
Closes #15
Closes #17
Closes #18
This commit is contained in:
Jesse.Markowitz
2026-08-26 15:20:56 -04:00
parent 441447648d
commit 2ab25e320c
23 changed files with 4619 additions and 3264 deletions
+36 -2
View File
@@ -40,8 +40,9 @@ 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). |
| ~~Q1 crossing time~~ | **SUPERSEDED 2026-08-26 — see Q1a below.** Was: a 60 card takes 1 Stage, a 30 takes 2. |
| ~~Q2 Fast/Slow~~ | **SUPERSEDED 2026-08-26 — see Q1a below.** Was: Slow adds one Stage to every card; Hilly reads the consist. |
| Q1a crossing time | `crossingStages()` — a card costs one Stage per **region printed on it**, and where a train STARTS is what varies. Plains 1, Double Track 1, Trestle 1, Curves 2, Tunnel 2, Heavy Grade 3. The printed mph are scenery. Fast/Slow is read on Hilly and nowhere else. |
| 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. |
@@ -76,6 +77,39 @@ Crossing time never falls below one Stage — a train cannot cross in no time.
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.
**Q1a, answered by RAR 2026-08-26 (Gitea#3), and it replaces Q1 and Q2 together.**
> "Ignore speed signs. They are just graphics. Regions shown on cards indicate how many stages it
> takes to cross. Plains is 1. Double track is 1, tunnel is 2, curves is 2, heavy grade is 3 unless
> you have help… Some cards say fast / slow. This is an indication that if on the train card, the
> train is listed as fast or slow, that's starting position / how many stages it takes to traverse
> the card. Fast / Slow does not apply to every card — just those that say fast / slow on them.
> Currently this is only hilly."
What this changes, against what was recorded before:
- **The printed 60/30 mean nothing.** Q1 read them as crossing time; they are ambiance.
- **Fast/Slow is not a global penalty.** Q2 added a Stage to every card for a Slow train, which is
what made a Slow train take two Stages to clear Double Track — the report that opened the issue.
It now applies on Hilly alone, where a fast train starts in the second region.
- **Hilly no longer reads the consist.** RAR: "I notice that you are basing stages in mainline cards
off coach/non-coach. Actually, all trains are rated as FAST and SLOW."
- **Heavy Grade is three regions, not two**, and the modifiers move the START rather than cutting the
clock: Helpers start an uphill train a region on, Brakeman a downhill one, Airbrakes another again.
- **The Uncontrolled Siding and the Interchange print a back region** that is not part of the road. A
train running through starts past it; a train arriving to find the siding occupied takes it and
runs a region behind, which is what keeps the two apart, and an Extra beginning its run at an
Interchange starts there too.
- **ABS holds a train off the card** rather than letting it collide, on any Mainline card.
Measured consequence, replacing the one recorded under Q2: on a **3-player Division the Mainline
cards themselves now cost a fast train ~5.6 Stages and a slow train ~6.0**, against ~5.4 and ~9.4
before. Fast traffic is unchanged; **slow traffic is about a third quicker**, and the Fast/Slow gap
across a whole Division collapses from roughly four Stages to less than one. The Q2 note that "every
Slow train is still on the road when the next Day begins, holding its Crew Tray" no longer holds, so
the `players + 3` tray count is due a re-examination — RAR's own closing worry: "been worried about
the time it takes to cross the division. More thunking on this is needed."
**Q11, answered from the source.** The Heavy Grade card prints **"(Up)"** and **"Player sets
orientation"**, so which way it climbs is a property of the placed card, not a fixed compass
direction. `DivisionNode.gradeUp` records the direction a train travels when **climbing**; a train