v0.4.9e — five of six playtest bugs: one button per train, and a load that has to go somewhere
Gameplay testing on 0.4.9d returned six reports. Five are fixed; the sixth could not be reproduced and is written up in TODO.md with the two questions that would pin it down. TWO TRAINS AT ONE PLATFORM ANSWERED TO ONE BUTTON. `porter.board` and `porter.detrain` carried no tray, so there was one button per platform however many trains stood at it and the reducer filled the first empty coach on the A/D tracks. `check` and the reducer were not even asking the same question: `check` skipped a train whose card refuses passenger work and the reducer did not. Both intents now carry an optional `trayId`, one function resolves the train and the coach for check/execute/reduce alike, `legal.ts` offers one candidate per train, and the label names it. A LOAD COULD BE MADE AND BROKEN WITHOUT GOING ANYWHERE. A Freight House could unload the boxcar it had just loaded; a platform could detrain the passengers it had just boarded. Full Revenue at both ends for a movement that never happened. Jesse's rule: a load made anywhere in an Office Area may not be broken anywhere in that Office Area, ever — it has to be carried to another district. The load carries the seat that made it (`RollingStock.origin`), stripped by `pooled` at every yard push. Measured at -0.60 +/- 0.10 Revenue a game (t = -6.1) over 400 paired deals: 78 worse, 3 better, 319 unchanged — free Revenue coming off the board, not a nerf. THE GROCER'S WAREHOUSE SHIPPED AND THE REFINERY RECEIVED. Both were `flow: 'both'` on the reading that "Freight House" was a collective term for exactly those two, and therefore what §9.3 described. The engine has dealt a Freight House CARD since before v0.4.9, so §9.3 names it and the argument goes. The card set agrees: all three Refinery modifiers grant +1 outbound. Refinery outbound-only, Grocer's inbound-only, Freight House the one two-way industry — which leaves exactly the one same-district pairing the rule above refuses. NOT REPRODUCED: cars left behind when backing up over them. Five layouts tried, including cars spotted at an industry; every one couples the lot. Three are pinned in `apply.test.ts`. One way to create such cars was closed anyway — `flyingSwitch` wrote its cut past `carsOn`. Both published replays that had gone dead were re-recorded; a rules change retires a save, and `harness.test.ts` is what catches it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011nbvwWMef8CuEP6t5cgkTv
This commit is contained in:
co-authored by
Claude Opus 5
parent
f9c4d9fa92
commit
7c35e002af
@@ -396,6 +396,41 @@ Deferred while planning the server; decisions and reasoning are in `docs/archite
|
||||
|
||||
Blocked on a decision, not on work.
|
||||
|
||||
- [ ] **NOT REPRODUCED: "when I back up to collect standing cars and, further down the tracks, the
|
||||
caboose, I get the caboose but the cars remain. I can later drive right through them."**
|
||||
Reported against v0.4.9d by a playtester (not Jesse, who forwarded it and could not add detail;
|
||||
his guess was that the cars were spotted at an industry).
|
||||
|
||||
**What was tried, all of which works.** Cars on plain track on the way to the caboose; cars
|
||||
SPOTTED AT AN INDUSTRY on the way; the train's own cut standing on the square it is pulling out
|
||||
of; a stale `standingWest` on the intermediate card; the industry locked by MEN AT WORK (which
|
||||
correctly blocks the whole route rather than letting the crew past). Every one couples the lot.
|
||||
The first three are pinned in `apply.test.ts` — "backing up over a cut to something beyond it
|
||||
takes both" — so if the case is found later it is somewhere none of them cover.
|
||||
|
||||
**Why it is hard to make happen.** Coupling is mandatory (§A.4) and `exploreMoves` accumulates
|
||||
what it meets card by card, so a route that reaches the caboose has already met everything
|
||||
between. `carsOn` (`state.ts`) is the SINGLE answer to "what is standing here", and the movement
|
||||
walk, the sweep in `carsCoupled` and every renderer all ask it — so cars a train can drive
|
||||
through would have to be cars that are on screen and not in `carsOn`, and there is no such
|
||||
place. (One route to one was closed anyway: `flyingSwitch`'s reducer wrote the cut straight into
|
||||
`industryTrack`, which for a Passenger Facility is not where `carsOn` looks. `check` refuses a
|
||||
non-freight target, so it never fired.)
|
||||
|
||||
**The two questions that would settle it**, for whoever has the board: was there a SECOND route
|
||||
to the caboose — a parallel row, or a turnout — so the move could have gone round the cars? And
|
||||
what did the move button say it would couple? The label names every car (`describeIntent`), so a
|
||||
button that read "couples caboose" and one that read "couples 2 boxcars, caboose" are different
|
||||
bugs: the first is route selection, the second is the sweep.
|
||||
|
||||
- [ ] **An unload does not check the facility's commodity.** `laborer.beginUnload` gates on
|
||||
`allows.inbound`, a loaded car, an empty of that type in the Division Yard and room in the red
|
||||
box — but never on `facilityCarTypes(f)`, which `freightAgent.stockOutbound` does check. So a
|
||||
Freight House (boxcars) will unload a hopper. Found reading the code for the v0.4.9e district
|
||||
rule, not from play. Low impact today because the district rule now refuses the only same-Office
|
||||
pairing that made it easy to hit, and because the bot spots matching cars — but it is a rule the
|
||||
engine states in one direction and not the other.
|
||||
|
||||
- [ ] **WHERE THE LOCAL'S COACH STANDS WHILE ITS ENGINE WORKS (§A.4) — now hit in play, still open.**
|
||||
Trains 7/8 print "coach must remain on station track if switching", read as "the coach is never
|
||||
set out". A cut comes off an OUTER end, so a coach on one outer end with the engine on the
|
||||
|
||||
Reference in New Issue
Block a user