Say who the game is waiting on, and move the Fedora; replay in words
Three items folded into the unshipped v0.7.9. WAITING ON (reported by Jesse from play). The status line said "nobody — the Division is running itself" while the game was stopped on the Superintendent. Frame.actor carried clock.currentActor, which is null for the whole Mainline Phase, so all three interruptions — §8.1's clearance ruling, Gitea#5's Yard Office offer, Gitea#19's Red Flag prompt — reported that nobody was holding it up. actingPlayer had the answer since the Gitea#5 refactor; the Frame threw it away. It carries actingPlayer now, plus a new `awaiting` field naming the question and the train: "waiting on Bob · a clearance ruling · Train 4". Naming the person alone is not enough when three different things can be pending. THE FEDORA (TODO #29) rides at the right-hand end of the phase row instead of a line of its own, and wraps under rather than squeezing the chips. THE DEVELOPER REPLAY (TODO #34) printed "loss — revenueFloor", the same defect Gitea#16 was filed about, still alive because nothing player-facing pointed at it. panels.ts's reasonSentence is exported and shared rather than reimplemented, fed the last recorded frame and stripped of markup. The drift test maps win/loss to won/lost so it still checks the two AGREE rather than that they are spelled alike. Also carries the previous, unsigned commit's work: the two setup screens worded the same section by section. 877 tests pass, ten new. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AdG46Ja2PEDBkpqiDazMoX
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
131538dc7c
commit
a70b7f88f3
+28
-2
@@ -47,7 +47,7 @@ import {
|
||||
} from '../engine/content.ts';
|
||||
import type { Intent } from '../engine/intents.ts';
|
||||
import type { Facility, GameConfig, GameState, PlayerIndex, SeatIndex, TrackCard, TurnoutOrientation } from '../engine/state.ts';
|
||||
import { carsOn, playerAtSeat, railFacingOf, seatOf, turnOf } from '../engine/state.ts';
|
||||
import { actingPlayer, carsOn, playerAtSeat, railFacingOf, seatOf, turnOf } from '../engine/state.ts';
|
||||
import type { Hand, HouseRules, TrackGeometry } from '../engine/content.ts';
|
||||
import type { Port } from '../engine/track.ts';
|
||||
import { connectionsFor, slopeOfPair, variantsFor } from '../engine/track.ts';
|
||||
@@ -354,7 +354,21 @@ export type Frame = {
|
||||
* replay recorder, which sees the events; the live game keeps its own on the Game object.
|
||||
*/
|
||||
cues?: string[];
|
||||
/**
|
||||
* WHO THE GAME IS WAITING ON — the phase's actor, or the owner of a pending interruption when
|
||||
* there is one. It carried `clock.currentActor` alone until 2026-08-30, which is null during the
|
||||
* Mainline Phase, so a game stopped dead on a Superintendent's clearance ruling reported "waiting
|
||||
* on nobody — the Division is running itself" while it waited on a named person to click
|
||||
* (reported by Jesse). The engine had the answer the whole time in `actingPlayer`.
|
||||
*/
|
||||
actor: number | null;
|
||||
/**
|
||||
* WHAT that player is being asked, when the game is stopped on a question rather than a turn.
|
||||
* Null whenever the phase is simply running. Naming the person is not enough on its own: three
|
||||
* different interruptions can be waiting, and "waiting on Bob" with no more than that is a game
|
||||
* that looks stuck to everyone except Bob.
|
||||
*/
|
||||
awaiting: { asks: string; train: string } | null;
|
||||
superintendent: number;
|
||||
revenue: number;
|
||||
/**
|
||||
@@ -1342,7 +1356,19 @@ export function snapshot(
|
||||
clock: clockTime(s.clock.stage),
|
||||
phase: phaseLabel(s.clock.phase),
|
||||
phaseKey: s.clock.phase,
|
||||
actor: s.clock.currentActor,
|
||||
actor: actingPlayer(s),
|
||||
/**
|
||||
* The three interruptions §8.1 and Gitea#5/#19 can raise, said in the words the prompt itself
|
||||
* uses. `decisionActor` above decides WHO; this is only what they are looking at.
|
||||
*/
|
||||
awaiting: (() => {
|
||||
const d = s.clock.pendingDecision;
|
||||
if (!d) return null;
|
||||
const train = trainName(s, d.train);
|
||||
if (d.kind === 'clearance') return { asks: 'a clearance ruling', train };
|
||||
if (d.kind === 'yardOffice') return { asks: 'the Yard Office offer', train };
|
||||
return { asks: 'a Red Flag', train };
|
||||
})(),
|
||||
superintendent: s.clock.superintendent,
|
||||
revenue: s.players[viewer]?.revenue ?? 0,
|
||||
lines,
|
||||
|
||||
Reference in New Issue
Block a user