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
@@ -16,6 +16,7 @@ import {
|
||||
areaOf,
|
||||
destinationsFor,
|
||||
facilityCarType,
|
||||
isBeingMadeUp,
|
||||
laborersLeft,
|
||||
movesFor,
|
||||
ownCutFor,
|
||||
@@ -276,6 +277,15 @@ export type TrainChip = {
|
||||
* it belongs in the tooltip, where there is room to say which it is.
|
||||
*/
|
||||
stagesLeft?: number;
|
||||
/**
|
||||
* BEING MADE UP RIGHT NOW — §7's round, one car at a time, at a Division Point.
|
||||
*
|
||||
* The make-up panel names the train and the yard chips load it, and both are in the right-hand
|
||||
* column; the train itself is drawn on the Division strip at the top left, looking exactly like
|
||||
* every other chip on the map. So the two halves of the same activity never pointed at each other
|
||||
* (Jesse, playtest 2026-09-16). Absent rather than false everywhere else, like `region` above.
|
||||
*/
|
||||
beingMadeUp?: true;
|
||||
};
|
||||
/**
|
||||
* One card of a player's Running Track, as the Division sees it.
|
||||
@@ -720,6 +730,26 @@ function suppressedGrants(modifiers: string[], f: Facility): string[] {
|
||||
for (const key of modifiers) {
|
||||
const m = MODIFIER_PROFILES.find((p) => p.kind === key);
|
||||
if (!m) continue;
|
||||
/**
|
||||
* A WHISTLE POST TAKES NOTHING AT ALL, AND SAYING "IT ONLY RECEIVES" WOULD BE A LIE.
|
||||
*
|
||||
* Jesse, playtest 2026-09-16: a Restaurant appeared to do nothing. It does nothing — a Whistle
|
||||
* Post is not a Passenger Facility, so it allows neither direction and has 0 capacity each way;
|
||||
* the engine's `usableGrant` discards the capacity while the porter is granted regardless, which
|
||||
* leaves a porter with nothing to carry. Playing it there stays LEGAL on Jesse's call, so the
|
||||
* card is not wasted — it starts working the moment the Office is upgraded — but the panel has
|
||||
* to say so, or the player is left believing the card is broken.
|
||||
*
|
||||
* Only a Whistle Post can reach this: every freight flow allows at least one direction, and
|
||||
* every Office above the first allows both.
|
||||
*/
|
||||
if (f.kind === 'passenger' && !f.allows.outbound && !f.allows.inbound) {
|
||||
out.push(
|
||||
`${m.name}: DORMANT — a Whistle Post works no passengers at all, so nothing this card ` +
|
||||
`grants is in use yet. It all starts working when the Office is upgraded to a Depot.`,
|
||||
);
|
||||
continue;
|
||||
}
|
||||
if (m.addOut > 0 && !f.allows.outbound) {
|
||||
out.push(`${m.name}: +${m.addOut} outbound has no effect here — this facility only receives`);
|
||||
}
|
||||
@@ -2367,6 +2397,9 @@ function trainChip(s: GameState, id: string): TrainChip {
|
||||
engineAt: at,
|
||||
facing: railFacingOf(t),
|
||||
what: t.trainNumber === null ? 'A local crew — no timetable, no card, no special rules.' : trainRules(t),
|
||||
// Conditional spread, not `beingMadeUp: isBeingMadeUp(t)`: the field is optional-and-true, and
|
||||
// `exactOptionalPropertyTypes` refuses an explicit `false` for it.
|
||||
...(isBeingMadeUp(t) ? { beingMadeUp: true as const } : {}),
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user