X22 PeeDee couldn't pick up a caboose - because it was loaded? #8

Closed
opened 2026-08-23 08:21:41 +00:00 by Jesse.Markowitz · 3 comments
Owner

X22 is the PeeDee, which picks up empty cars in a sweep. Cool. So I had a second train in the station and I moved it out of the way so X22 could dump its caboose way out east, then run around to pick up two unloaded hopper cars from the power plant. This I did. But when I went to couple up to the caboose and finish the job, guess what? Wouldn't couple up. Wouldn't let me select the eastern limit square.

Why?

Because I think the program sees the caboose as a "loaded" car and won't let me pick it up.

X22 is the PeeDee, which picks up empty cars in a sweep. Cool. So I had a second train in the station and I moved it out of the way so X22 could dump its caboose way out east, then run around to pick up two unloaded hopper cars from the power plant. This I did. But when I went to couple up to the caboose and finish the job, guess what? Wouldn't couple up. Wouldn't let me select the eastern limit square. Why? Because I think the program sees the caboose as a "loaded" car and won't let me pick it up.
Author
Owner

Claude says: your guess is right, confirmed in the source. pickUpEmptiesOnly rejects any car with loaded: true, and ROLLING_STOCK_SUPPLY mints all six cabooses as { loaded: 6, empty: 0 }. X22 can never couple a caboose, including its own. The fix is to exempt cabooses from the empties test, not to change the supply table — the loaded/empty split is doubling as a piece count.

Claude says: your guess is right, confirmed in the source. pickUpEmptiesOnly rejects any car with loaded: true, and ROLLING_STOCK_SUPPLY mints all six cabooses as { loaded: 6, empty: 0 }. X22 can never couple a caboose, including its own. The fix is to exempt cabooses from the empties test, not to change the supply table — the loaded/empty split is doubling as a piece count.
Author
Owner

Confirmed — your guess is exactly right, and it is a data bug, not a rules one.

X22's restriction is enforced here (src/engine/apply.ts:780):

if (rules.pickUpEmptiesOnly && fresh.some((c) => c.loaded)) return 'EMPTIES_ONLY';

And every caboose in the game is minted loaded (ROLLING_STOCK_SUPPLY, src/engine/content.ts:955):

{ type: 'caboose', loaded: 6, empty: 0 },

There are six cabooses and zero empty ones, because §2.2's "a coloured car is loaded, a white car is empty" is being used to count pieces — a caboose has no white version, so the supply table records all six on the loaded side. Which means the empties-only test sees loaded: true on every caboose and refuses it.

Consequence: X22 can never couple a caboose at all — including the one it started with. Drop it and it is stranded. That is why the eastern Limit square would not select: the move existed, but the pick-up it implied was illegal, so the button was never offered.

The fix is to make the empties-only test ignore cabooses rather than to flip the supply table — "may only pick up MTs" is about freight cars, and the supply's loaded/empty split is doing double duty as a piece count that other code depends on.

Nicely diagnosed from the table.

**Confirmed — your guess is exactly right, and it is a data bug, not a rules one.** X22's restriction is enforced here (`src/engine/apply.ts:780`): ``` if (rules.pickUpEmptiesOnly && fresh.some((c) => c.loaded)) return 'EMPTIES_ONLY'; ``` And every caboose in the game is minted loaded (`ROLLING_STOCK_SUPPLY`, `src/engine/content.ts:955`): ``` { type: 'caboose', loaded: 6, empty: 0 }, ``` There are six cabooses and zero empty ones, because §2.2's "a coloured car is loaded, a white car is empty" is being used to count *pieces* — a caboose has no white version, so the supply table records all six on the loaded side. Which means the empties-only test sees `loaded: true` on every caboose and refuses it. **Consequence: X22 can never couple a caboose at all — including the one it started with.** Drop it and it is stranded. That is why the eastern Limit square would not select: the move existed, but the pick-up it implied was illegal, so the button was never offered. The fix is to make the empties-only test ignore cabooses rather than to flip the supply table — "may only pick up MTs" is about *freight* cars, and the supply's loaded/empty split is doing double duty as a piece count that other code depends on. Nicely diagnosed from the table.
Author
Owner

Fixed in v0.7.1 (4414476) and ported to the playtest line as v0.4.9g (9735468).

Your diagnosis was right: the program did see the caboose as loaded. All six cabooses are minted
loaded: true, because §2.2's "a coloured car is loaded, a white car is empty" is doing double duty
in the supply table as a piece count, and there is no white caboose to make a train up from. So the
flag carries two meanings, and exactly one place read the wrong one — the empties-only check.

A caboose carries the crew, not freight, so it is never a load. The restriction itself is untouched:
a loaded car sitting alongside the caboose still refuses. And the card now says so out loud —
"EMPTIES ONLY — it may not couple a loaded car. A caboose is not a load." — because reading
"EMPTIES ONLY" gave you no way to know which reading the game had taken.

Worth noting this made X22 Pee-Dee unplayable rather than merely restricted: set the caboose out at
the end of a sweep and the train could never pick it up again.

Fixed in **v0.7.1** (`4414476`) and ported to the playtest line as **v0.4.9g** (`9735468`). Your diagnosis was right: the program did see the caboose as loaded. All six cabooses are minted `loaded: true`, because §2.2's "a coloured car is loaded, a white car is empty" is doing double duty in the supply table as a *piece count*, and there is no white caboose to make a train up from. So the flag carries two meanings, and exactly one place read the wrong one — the empties-only check. A caboose carries the crew, not freight, so it is never a load. The restriction itself is untouched: a loaded car sitting alongside the caboose still refuses. And the card now says so out loud — "EMPTIES ONLY — it may not couple a loaded car. **A caboose is not a load.**" — because reading "EMPTIES ONLY" gave you no way to know which reading the game had taken. Worth noting this made X22 Pee-Dee *unplayable* rather than merely restricted: set the caboose out at the end of a sweep and the train could never pick it up again.
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Jesse.Markowitz/station-master#8