more info on train moves in history. train info added to tooltip on timetable and division map. support for multiple trains in area switching. more info on train7/8 wrt location of coach on initial train build.

This commit is contained in:
Jesse
2026-08-16 21:45:19 -04:00
parent 98f93e6691
commit 08339effba
14 changed files with 1029 additions and 40 deletions
+183
View File
@@ -21,6 +21,189 @@ page as `v0.1.0 · <sha> · <date>`, so what is deployed can always be identifie
## Unreleased
## 0.4.6 — 2026-08-16
Four play reports in one release: trains that seemed to move before you could work them, a train card
you could not look at again, a switching list that never said which train it meant, and a Freight
Agent button that looked like it might be where the money was.
### Why did that train move? The history now says
**Reported:** "some trains seem to be moving before I can switch or do other operations on them. It
may be that the rules as written and implemented are just wrong. It may be that it's my perception."
It was perception — but the log was feeding it, in one place with an outright falsehood.
**The arrival line was wrong about Expedite.** It said an expedited train *"leaves again this same
Mainline Phase; there is no turn in which to work it"*. The expedited departure was moved to
Supervisor Shift precisely so the Porters and Laborers get their Stage with the train, so **Cargo is
available and only Local Operations is not** — the log was talking players out of the one turn they
had. Both branches now name the phases:
> Train 8 ARRIVED at the Whistle Post carrying loaded boxcar, empty coach — it stands here for the
> rest of this Stage. You can work it in Cargo now, switch it in the NEXT Stage's Local Operations,
> and it departs in that Stage's Mainline Phase.
**Every departure now carries the rule that released it.** They all read alike before, so the one
that matters — an Expedited train going at the end of the Stage it arrived — looked exactly like an
ordinary train going a Stage later:
> Train 8 HIGHBALLED — departed the Western Division Point onto the Mainline. **Why now:** it was
> made up and the Subdivision ahead was clear, so its run begins
**EXPEDITE TURNS OUT TO BE CONDITIONAL**, which is most of why it feels arbitrary at the table.
`shiftChange` has always said so in a comment — *"an expedited train that would need a ruling simply
stays, and runs normally next Stage"* — and it happens often: on one seed with ordinary traffic
running, Train 6 The Sparrow was held this way and collected **four** Local Operations turns instead
of none. That was silent. It now says so, and the card and the arrival line no longer promise that an
Expedited train can never be switched.
Three tests pin the claims the log makes, so a phase-order change cannot leave the narration lying:
an ordinary train gets a Local Operations turn and leaves in a Mainline Phase; an Expedited train
alone on the Division gets Cargo, no Local Operations, and leaves in Supervisor Shift; an Expedited
train held for a ruling gets its Local Operations turns after all.
*Also fixed:* a Division Point departure was narrated as a **fake phase marker** — "▸ train 8
highballed phase" — and the new departure line reported the wrong end of the railroad, because it
read the train's position after `enterMainline` had already moved it onto the Mainline.
### The train's card, after the card is gone
**Reported:** "once a train card's been played, how would I see that particular train card again —
what it's allowed to do and not allowed to do, and how it has to be loaded? Could I see it on a
timetable tooltip? If a train is on the board, could its tooltip include its special rules?"
Yes to both. `trainRules` already produced the card as one line and the Office card already showed
it; it now also rides on:
- **the Timetable** — hovering a slot gives the train's card under `ITS CARD —`, which is where a
player already looks for that train;
- **the Division map chip** — a train out on the Mainline can now be asked what it is, which is
exactly where "why did that leave without me?" gets asked.
Two lines in that card were wrong and are corrected. **The coach rule** said *"a cut carrying it may
only be set out at the Office"*, which reads as a place you can do it — you cannot, §A.4 refuses the
Office square outright, so the coach can never be set out anywhere. **The Expedite rule** said only
"it departs in the same Stage it arrives", which is true and useless; it now names the phases, and
the clearance exception above.
### Which train are you switching?
**Reported from play:** "when switching, make it clear which train you are switching — it is possible
to have more than one train available."
A train standing on an A/D track while a local shunts is ordinary, and the page got it wrong twice
over. `Frame.moves` was built from the **first tray in the map**, with a comment admitting it — *"One
crew. Solitaire has one, and with more the answer would depend on which is selected — a question the
page does not yet ask."* So the board highlighted one crew's reachable squares while the action list
offered every crew's moves under a single "Switching" heading of bare coordinates.
Worse, and not noticed until this was pulled apart: identical labels were collapsed across the whole
action kind. *"move to (0, 2)"* describes one crew's move exactly as it describes another's, so **one
of the two was silently dropped and could not be chosen at all** — a legal move with no button.
Now:
- **One heading per crew**, naming the train and where it stands — *"Switching Train 8, standing at
(-1, -3)"*. The train is named in the heading rather than on every button, so the buttons stay
short.
- **A "Which train are you switching?" row** when there is more than one, and the crew chosen there
is the crew whose squares the board draws. One crew at a time on purpose: every crew's highlights
at once merge into a blob and stop meaning "here is where *this* train can go".
- **De-duplication is per crew**, so two trains that can both reach the same square each get a button.
- **A train that may not switch is not offered as one.** `movesFor` is pure track geometry and six
cards print "no switching", which `check` enforces and it does not — the Circus Train was being
offered as a crew to switch, with every one of its moves refused.
Display state, deliberately not in the game: which train a player is looking at is not a fact about
the railroad, and two players may reasonably be looking at different ones.
*Found while fixing it:* the grouping key had briefly been `type + separator + trayId`, and a stray
byte in that separator collapsed every crew back into one group. The crew now travels as **data on
the entry** rather than encoded into a map key that `GROUP_ORDER` also prefix-matches on.
### The Freight Agent's red box says what it does, and what it does not pay
**Reported:** "it wasn't obvious if that was a mechanical thing or if that's the actual revenue
generation. I believe that's actually where you get the revenue, and that completes unloading the
car."
It is the mechanical one, and the button now says so. The Revenue for an inbound load is paid **one
step earlier** — §9.3: *"The last [Laborer] places the load on a red Unloading box. **Earn a Revenue
point.**"* Clearing the box is §6.3's Freight Agent operation, *"select one Rolling Stock from a
Facility's red Inbound box and place it into the Classification Yard pile"*, and the printed rule
attaches no Revenue to it. Confirmed against the engine as well as the rules: `clearInbound` emits
`inboundCleared` alone, with no `revenueChanged` beside it, and the score does not move.
clear red box at (0,0)
becomes
send the loaded coach in the red Inbound box at (0,0) to the Classification Yard — pays nothing
(the Revenue was paid when the passengers detrained); it frees the last slot so more passengers
can detrain here
The wording follows the facility: an inbound freight load and a coach whose passengers have detrained
both wait in the same red box, and both were paid for a step earlier.
### Making up a Local says which order the cars go on in
**Reported from play:** "I can't drop a car at all — trying to get an empty to an industry, but I
can't drop any cars on the siding first." Chased through two wrong guesses (it was not movement, and
it was not the 0.4.5 fix falling short) to a single train and a single arrangement.
Trains **7/8 Local** print *"coach must remain on station track if switching"*, which the engine
reads as "the coach is never set out". A cut always comes off an **outer end**, so if the coach is on
one outer end and the engine is on the other, every cut on offer contains the coach — and the train
is locked. It cannot set out its freight car, and it cannot even uncouple to **run around**, because
that means leaving the coach standing too. The one escape is a Small Yard, of which there is exactly
1 copy in the 213-card deck.
All six arrangements, checked against the rules rather than reasoned about:
```
ENGINE boxcar coach NOTHING — the train is locked
boxcar ENGINE coach can set out: boxcar
boxcar coach ENGINE can set out: boxcar
ENGINE coach boxcar can set out: boxcar
coach ENGINE boxcar can set out: boxcar
coach boxcar ENGINE NOTHING — the train is locked
```
Two of six lock, and they are exactly the two where the coach holds one outer end and the engine
holds the other. **It is only the Local.** Over 60 games, every other train that stood in a district
with cars where a set-out was allowed managed one — Drag Freight, Heavy Freight, the Freight Extra,
the Director's private car, Yard Xfer, Appleseed — 127 positions, zero blocked. The Local: 1,181
positions, every one refused, all `COACH_MUST_STAY`.
The cruelty is that the locking order `ENGINE boxcar coach` is both the prototypical mixed-train
make-up and what the game naturally produces: cars are appended as they are clicked with the engine
on the nose, so the **last car added takes the outer end**, and the freight car is the natural first
pick.
**So the make-up panel now says so.** The whole remedy is "do not add the coach last", and it is
stated at the only moment it can still be acted on:
- nothing on the train yet → *"Add the coach FIRST… ENGINE, coach, freight is the order that works."*
- coach on, freight still to come → *"Now add the freight car — it takes the outer end, leaving the
coach safely inside."* A **hint**, not a warning: the coach lands on the outer end the moment it
goes on, including for the player who has just been told to put it there, and colouring that as a
mistake punishes them for taking the advice.
- coach on the outer end with nothing left to add → a real **warning**, because there is no next step.
- freight already on and the coach still to come → *"send it out without the coach if you want it to
work the district"*, since "add the coach first" is advice it is too late to take.
Shown **only** for a train the order can lock, so it is not a standing caption a player learns to
skip — every other train, and a Local with no coach coming, get nothing.
**The rules are untouched.** This is guidance, not a rules change; the open §A.4 question about where
the Local's coach stands while its engine works is still open in `TODO.md`, and answering it (letting
the coach be set out at the Office, as the card's wording suggests) would let the prototypical
make-up work and make this advice unnecessary.
**Verified end to end**, not just unit-tested: played to a real Local make-up, followed the advice
through both steps, and confirmed the resulting `ENGINE coach boxcar` can set a car out.
## 0.4.5 — 2026-08-14
### A train can back out of a curve again