v0.8.0.13 — the board on screen is the board you can act on
Nine reports from the Day 1-2 playtest of v0.8.0.12. One moved a car, one was a rule working correctly with nothing on screen to say so, and the rest are things the table could not see. The real bug: the Division Yard chips stayed lit and clickable while the board was catching up. `renderActions` puts the action list away while the queue is behind — a move offered against a position that has already moved on is a move made blind — but the make-up wiring sat outside that guard. A chip was clicked during a bot's make-up, a coach left the yard, and the train ended up with three cars: a real intent submitted against a board several moves stale. The chips now follow the queue like every other control, and the yard COUNTS are drawn from the shown board rather than the live game — they were the one panel still reporting a future the player had not been shown. The Office Area picker had a button per opponent and none for yourself, so the one player who could not reach their own district was the player waiting on everybody else. Your own seat is in the row now, and the row is ordered by SEAT, west to east as the Division map draws it, rather than by join order — sorted from the Frame's own `seat` on every render, so it rotates with Employee Rotation instead of having to be told. §5's handover of the Fedora rode on `actorChanged`, which is turn bookkeeping and which `record()` drops as noise, so the one moment it carried that a player needed went past in silence. It is its own event now, narrated and announced. The phase keeps its name: the Supervisor Shift refreshes every Laborer and Porter EVERY Stage and the Fedora moves only every third. A collision now names whose Office it was and who paid the 5 Revenue, which rode in a separate `revenueChanged`; a Mainline collision is phrased differently because §10 makes it the Superintendent's. Passengers, reported as a bug and ruled not one after replaying the save: the Depot's capacity and modifiers were fine, and §6.3 stocking wants a LOADED coach out of the Division Yard, which held none while six sat in Classification. The shortage stays — running out is part of the game, the same ruling Gitea#2 got — but the blocked panel says so now instead of the action being silently absent. Smaller: "working left" is "working eastward" in the make-up panel and the New Train tip, because the map runs west to east and the table does not; the history panel keeps 90 lines instead of 60 in the same 230px box. `git diff v0.8.0.12..v0.8.0.13 -- src/engine/` is NOT empty this time: `events.ts` declares `superintendentChanged` and `advance.ts` emits it. Both are additive — `check()`, `legal.ts` and every predicate are untouched, and events are derived by replaying a save rather than stored — so no once-legal move became illegal and games in progress resume. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DmdqqCNoiqE7GBo6wthBnR
This commit is contained in:
co-authored by
Claude Opus 5
parent
7c9ef8797d
commit
ad277fb994
@@ -19,6 +19,90 @@ page as `v0.1.0 · <sha> · <date>`, so what is deployed can always be identifie
|
||||
|
||||
---
|
||||
|
||||
## 0.8.0.13 — 2026-09-16
|
||||
|
||||
Nine reports from the Day 1–2 playtest of v0.8.0.12. One was a real bug that cost a car, one was a
|
||||
rule working correctly with nothing on screen to say so, and the rest are things the table could not
|
||||
see.
|
||||
|
||||
### The Division Yard no longer takes a click while your board is behind
|
||||
|
||||
The worst of the batch, because it moved a car. `renderActions` puts the action list away while the
|
||||
queue is catching up — a move offered against a position that has already moved on is a move made
|
||||
blind — but the make-up wiring sat OUTSIDE that guard, so the yard chips stayed lit and clickable.
|
||||
Reported exactly as it happens: a bot was adding the last car, the board lagged, a chip was clicked,
|
||||
a coach left the Division Yard and the train still ended up with three cars. The click had submitted
|
||||
a real intent against a board that was several moves stale.
|
||||
|
||||
Both halves are fixed. The chips are wired only when the queue is idle, and the yard COUNTS are now
|
||||
drawn from the board on screen rather than the live game — they were the one panel still reporting a
|
||||
future the player had not been shown, which is what "the yards may not be in sync with the turns
|
||||
behind" was describing.
|
||||
|
||||
### Every seat has a button, in map order
|
||||
|
||||
The Office Area picker had a button per opponent and none for yourself, so the one player who could
|
||||
not reach their own district was the player waiting on everybody else — watching the board follow
|
||||
whoever was acting, with no way back. Your own seat is now in the row, and `watchedDistrict` returns
|
||||
your board for it rather than falling through to the actor, which is the same bug seen from the other
|
||||
side.
|
||||
|
||||
The buttons are ordered by SEAT — west to east, exactly as the Division map draws it — instead of by
|
||||
player index, which is the order people joined. Seat is not player index and must not be assumed to
|
||||
be: under Employee Rotation the seating moves, and because the row is sorted from the Frame's own
|
||||
`seat` on every render, the buttons rotate with the players rather than having to be told.
|
||||
|
||||
### The Fedora passing is said out loud
|
||||
|
||||
§5 moves the Superintendent at the end of Stages 3, 6, 9 and 12, and the log never mentioned it. The
|
||||
rotation was riding on `actorChanged` — turn bookkeeping, fired every time the cursor moves, which
|
||||
`record()` drops as noise — so the one moment that event carried something a player needed went past
|
||||
in silence, with only "Supervisor Shift" in the history to hint at it.
|
||||
|
||||
It is its own event now (`superintendentChanged`), narrated in the log and announced on screen the
|
||||
way a completed run already is. The phase keeps its name: the Supervisor Shift refreshes every
|
||||
Laborer and Porter EVERY Stage, and the Fedora moves only every third — naming the phase after the
|
||||
rarer event would mislead about the common one.
|
||||
|
||||
### A collision says whose Office it was and who paid for it
|
||||
|
||||
The line named the wreck and the reason and stopped there: the 5-point penalty rides in a separate
|
||||
`revenueChanged`, so a player had to add two log entries together to learn who had just lost five
|
||||
Revenue, and "COLLISION at the Office" never said whose. The faulting seat is in the event — and for
|
||||
anything inside a district that seat IS the district's owner — so the line now reads "COLLISION at
|
||||
Tom's Office … Tom loses 5 Revenue — it happened in their district." A Mainline collision is phrased
|
||||
differently because §10 makes it the Superintendent's, which is a different kind of fault.
|
||||
|
||||
### Passengers: the rule stands, the silence goes
|
||||
|
||||
Reported as a bug and it is not one, which took a replay of the save to establish. The Depot in
|
||||
question had a Restaurant and a Hotel beside it and `cap{out:3}` — capacity was never the problem,
|
||||
and the modifiers grant exactly what they print. What stopped a second passenger was §6.3: stocking
|
||||
takes a LOADED car of the facility's type out of the Division Yard, and there was not a loaded coach
|
||||
in it. Six were sitting in the Classification Yard, which §2.2 returns only when the Division Yard
|
||||
runs bare, and it was holding sixty-odd cars.
|
||||
|
||||
Jesse's ruling is the same one Gitea#2 got: the shortage stays, because running out is part of the
|
||||
game. So the blocked panel now says it — room for N more passengers, no loaded coach in the Division
|
||||
Yard, and how many are waiting in Classification — instead of the action simply being absent from the
|
||||
menu with no reason given.
|
||||
|
||||
### Smaller
|
||||
|
||||
"Working left" is now "working eastward" in the make-up panel and the New Train tip. It was always the
|
||||
same rule — `playerLeftOf` is increasing seat index — but "left" describes a table nobody is looking
|
||||
at, while the map runs west to east, so at a real three-player game the second car went to the player
|
||||
sitting EAST and the text read as wrong. The history panel keeps 90 lines instead of 60, in the same
|
||||
230px box: more to scroll back through, no more screen taken, and the newest line stays where the eye
|
||||
already is.
|
||||
|
||||
### Note for the packaging repo
|
||||
|
||||
`git diff v0.8.0.12..v0.8.0.13 -- src/engine/` is NOT empty this time: `events.ts` declares
|
||||
`superintendentChanged` and `advance.ts` emits it. Both are additive — `check()`, `legal.ts` and
|
||||
every predicate are untouched, and events are derived by replaying a save rather than stored — so no
|
||||
once-legal move became illegal and games in progress resume.
|
||||
|
||||
## 0.8.0.12 — 2026-09-16
|
||||
|
||||
A player who has lost their browser storage can be put back in their seat (Gitea#33). No rule
|
||||
|
||||
Reference in New Issue
Block a user