v0.8.0.11 — sixteen fixes from the second multiplayer playtest
Arrivals name whose Office they reached, and no longer tell every seat they can work the train. The turn chart follows the animation queue, so being five behind looks five behind across the whole screen rather than half of it. Pause sits beside Skip and preserves the dwell a held step still owed. A one-render look at another player's Office Area. The district summary counts the board being shown. LIMITS is printed beneath its card instead of through its border. The Mainline region divider is visible. Only Hilly mentions FAST/SLOW, because it is the only card that reads it. A passenger Modifier on a Whistle Post reports itself dormant rather than claiming the facility "only receives". An automatic phase says what the Division is doing instead of answering by negation. The version appears once in the header rather than twice on every .s9pk. Save files carry the join code, the Stage and the date. The New Train phase, reviewed before being changed: the make-up panel now says what the train STILL needs rather than only what its card calls for, explains that a player adds one car before the round passes on, marks the train being loaded on the Division map, and gives an addable car in the yard the same amber every other clickable thing on the page wears. Reasoning, measurements and the reports behind each are in CHANGELOG.md. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017nnuCv8UodHucFfx3LWEoX
This commit is contained in:
co-authored by
Claude Opus 5
parent
4adf149ba5
commit
9a9e50b3c6
+142
@@ -19,6 +19,148 @@ page as `v0.1.0 · <sha> · <date>`, so what is deployed can always be identifie
|
||||
|
||||
---
|
||||
|
||||
## 0.8.0.11 — 2026-09-16
|
||||
|
||||
Fourteen reports from the second multiplayer playtest of v0.8.0.10, the WHISTLE-6945 table. Eleven are
|
||||
fixed here; the review of the New Train phase turned into four changes of its own; and two were
|
||||
questions the engine had already answered.
|
||||
|
||||
### A train's arrival says WHOSE Office it reached
|
||||
|
||||
The line went to every seat reading "Train 3 ARRIVED at the Whistle Post … **You** can work it in Cargo
|
||||
now". At a table of four that is one true sentence and one false one: every seat has an Office, so the
|
||||
tier alone never said which district the train was standing in, and three of the four readers could not
|
||||
touch it. `trainArrived` now carries `owner`, and the narration resolves the name — "ARRIVED at Tom's
|
||||
Whistle Post … Tom can work it". The Mainline Phase has no actor, which is why nothing upstream could
|
||||
name the seat for it. Saves replay history rather than storing events, so the new field strands nothing.
|
||||
|
||||
### Being five behind now looks five behind everywhere
|
||||
|
||||
*"When player Jesse is 5 behind, it should always look like he's 5 behind."* The board, the district
|
||||
panel and the caption row have followed the animation queue since v0.8.0; the turn chart never did. So a
|
||||
player watching three bots play out a Stage saw their cards moving under a chart that had already ticked
|
||||
over to the next phase — the one part of the screen quietly insisting the game was elsewhere. The Day,
|
||||
Stage, clock, phase and Fedora now come from the step on screen (`shownTable`), as does the district
|
||||
panel's auto-open. Being behind is fine and the counter says so; being behind on *part* of the screen is
|
||||
what made it unreadable.
|
||||
|
||||
### Pause, beside Skip
|
||||
|
||||
Skip was the only control the catching-up row had, and it is one-way and total: the way to look harder
|
||||
at a move that had just gone past was to not be too slow about it. Pause is the opposite lever. The
|
||||
property that matters is not that it stops — any flag gives you that — but that a hold **costs the step
|
||||
nothing**: a move paused half-way through its dwell resumes with half a dwell left, rather than being
|
||||
thrown away the moment you let go. Skip lifts a hold rather than leaving a Resume button that does
|
||||
nothing.
|
||||
|
||||
### A one-render look at another player's Office Area
|
||||
|
||||
One button per opponent in the district header. Deliberately not a mode: the look survives exactly the
|
||||
render its own click causes, so the panel is back to following whoever is acting the next time anything
|
||||
redraws. Jesse's call, and the right one — a sticky pin has to answer what happens when the game moves
|
||||
on beneath it, and both honest answers are bad (snap home silently, or leave a player studying a stale
|
||||
board while the game waits on them). Pause already means "hold everything", so that is the lever for a
|
||||
long look and this stays a glance. Player names reach the page through `textContent`, never markup.
|
||||
|
||||
### The Office Area summary counts the district on screen
|
||||
|
||||
The panel has drawn somebody else's board since v0.8.0 and the heading says whose — but the summary
|
||||
line read the viewer's own frame every time. So a bot's turn showed "Bot 2's Office Area" over Bot 2's
|
||||
cards, above a line counting *your* cards, facilities and trains.
|
||||
|
||||
### LIMITS is printed beneath the card, not through it
|
||||
|
||||
*"The text is split by the bottom border of the limits card."* It was: the bottom row's edge lands at
|
||||
`height - 7` and the label's baseline was `height - 4`, so its 8px glyphs spanned `height - 12` to
|
||||
`height - 4` and the border ran through the middle of the word. Raising it would have put it on the
|
||||
card, over the rails, so a 14px band is added below the bottom row and the baseline moved into it.
|
||||
|
||||
### The Mainline region divider is visible
|
||||
|
||||
Drawn at `#4a5361`, 1.2px, on a `#161b21` card — faint enough not to be made out at all. It is the ruler
|
||||
the train is measured against and should stay quieter than the rail, but a ruler you cannot read is not
|
||||
restraint.
|
||||
|
||||
### Only Hilly talks about FAST/SLOW
|
||||
|
||||
Every other Mainline card ended its description with "the printed speed is scenery", which sent a player
|
||||
hunting the card for a number that is not drawn on it. Exactly one card reads the rating — Hilly, the
|
||||
only profile with `speedStarts` — and it already explains itself. Everywhere else now says nothing,
|
||||
which is the honest answer when the rating does not apply.
|
||||
|
||||
### A passenger Modifier on a Whistle Post says it is dormant
|
||||
|
||||
A Restaurant appeared to do nothing. It does nothing: a Whistle Post is not a Passenger Facility, so it
|
||||
allows neither direction and has zero capacity each way; `usableGrant` discards the capacity while the
|
||||
porter is granted regardless, leaving a porter with nothing to carry. The Freight Agent then refuses to
|
||||
stock the box twice over, so no coach can ever be there to board. Playing it there stays legal on
|
||||
Jesse's call — the card is not wasted, it starts working on upgrade — and the panel now says so. It had
|
||||
been claiming the facility "only receives", which is wrong in both directions at a Whistle Post.
|
||||
|
||||
### An automatic phase says what it is doing
|
||||
|
||||
"waiting on **nobody — the Division is running itself**" reached its answer by negation, on the one line
|
||||
whose job is to say where the game is. The phase's name is already printed directly above it, so these
|
||||
describe the work instead: "the Division is moving trains", "the Division is building this Stage's
|
||||
trains". Only a person is waited on.
|
||||
|
||||
### The version appears once in the header
|
||||
|
||||
The no-git fallback for the cache-bust key led with the version, and the stamp already begins with
|
||||
`v${version}` — so the header read "v0.8.0.10 · 0.8.0.10-mfq2p1 · …". It showed up on exactly the builds
|
||||
that take that path, which is **every `.s9pk`**, because the Dockerfile copies the tree in without
|
||||
`.git`. The uniqueness that fallback exists to provide comes from the timestamp, not the version, so the
|
||||
two requirements never competed. Pinned in `test/web.test.ts` beside the constant-fallback assertion
|
||||
that the same function already carries.
|
||||
|
||||
### Save files name the game, the Stage and the day
|
||||
|
||||
Every server game downloaded as `station-master-day1-stage5.json`, so two saves off different tables
|
||||
collided in the downloads folder and neither said which table it came from. The join code is what a
|
||||
player already says out loud to identify a game, so it leads: `whistle-6945.day1.stage5.2026.09.16.json`.
|
||||
A solitaire game has no code and falls back to its seed.
|
||||
|
||||
### The New Train phase says what is left, and why your turn ended
|
||||
|
||||
Reviewed before changing anything, at Jesse's request — and the phase turned out to be better served
|
||||
than it looked from a grep: the Division Yard chip IS the button, the panel already names the train
|
||||
and what its card calls for, warns about assembly order on the trains where order can lock switching,
|
||||
and carries the "no more cars" button that exists to prevent a real softlock. Four things were missing.
|
||||
|
||||
**Still needs.** The heading says what the card CALLS FOR and goes on saying it unchanged as cars go
|
||||
on, so the one question a player actually has while clicking — what is left? — was the only thing on
|
||||
screen that had to be worked out by eye, against a consist drawn in the other column. `consistNeeds`
|
||||
counts by the same categories `acceptsCar` does, so it can never ask for a car the engine would then
|
||||
refuse, and it reads null when the consist is complete.
|
||||
|
||||
**One car each.** §7's round — a single car, then the next player, from the Superintendent working
|
||||
left — was written down only in the turn chart's New Train chip tooltip: hovered once, early on, and
|
||||
never again. "Click a car" then reads as "build this train", and the turn ends with no explanation.
|
||||
It now says so where the clicking happens.
|
||||
|
||||
**The train is marked on the map.** `TrainChip` gained `beingMadeUp`, set from the engine's own
|
||||
`isBeingMadeUp`, and the chip is drawn in the action amber — so the panel on the right and the train
|
||||
on the Division strip at the top left are visibly one subject rather than two.
|
||||
|
||||
**A clickable car looks clickable.** The addable highlight was a thin blue outline, reported as "just
|
||||
a small bold and basically the same color as everything else". It now wears `#c8912f`, the border
|
||||
colour the action buttons themselves use. The loaded/empty text colours are deliberately left alone:
|
||||
green and blue-grey are what say which of the two numbers is which, and that is a different question
|
||||
from whether you may click.
|
||||
|
||||
### Asked, and already answered by the engine
|
||||
|
||||
**Does the bot know how to use Interlocking?** It plays it deliberately — the bot ranks it above the
|
||||
other enhancements precisely because it stops an Office collision — and a Running Track straight is the
|
||||
card's printed placement, so the play seen at the table was correct. Nobody "uses" it: `advance.ts`
|
||||
applies it automatically, turning an arrival at a full Office into a hold at the Limits. There is no
|
||||
decision to get wrong, so no change was made.
|
||||
|
||||
**Can passengers load or unload at a Whistle Post?** No. Zero porters, zero outbound, zero inbound, and
|
||||
not a Passenger Facility — it takes a Depot to do any passenger work at all.
|
||||
|
||||
---
|
||||
|
||||
## 0.8.0.10 — 2026-09-15
|
||||
|
||||
Three reports from the first multiplayer playtest of v0.8.0.9 — one player and three bots — each traced
|
||||
|
||||
Reference in New Issue
Block a user