v0.7.0 — four game types, a lobby you can read and leave, and a multiplayer game that makes a sound
The multiplayer set-up, the lobby, the start of a game, and four signals a remote client had never been sent. Reasoning, the preset table and what was verified how: CHANGELOG.md. - Co-op, Competitive, Cutthroat, Solitaire and Custom, on both screens, from one shared block — they had drifted, and each was missing a question the other asked. - A player reads the whole rule set before taking a seat, may leave a lobby or a running game, and keeps a seat across a reload. The host may clear a chair. The browser remembers every game it is in, not just the last one. - The start of a game is drawn: a handoff beat, an announcement, the code and type in the header. - Sound, the timetable flash, announcements and the just-drawn badge now reach a remote client; justDrawn goes to the seat that drew it and nobody else. - Played on StartOS, which found the rest: an Extra belongs to the player who played it, the board never named the Superintendent, bot seats were reported as absent players, and rule section numbers are out of every string a player reads. Also carries the previous session's Heavy Grade documentation work — asked again, answer unchanged. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016JczK5i33ZNSf2PtzZqdhS
This commit is contained in:
co-authored by
Claude Opus 5
parent
42adfda390
commit
06db36e5b5
+17
-1
@@ -371,6 +371,15 @@ export type CrewTray = {
|
||||
* bug `isBeingMadeUp` was tightened to kill, and an arriving train never carries this.
|
||||
*/
|
||||
beingMadeUp?: boolean;
|
||||
/**
|
||||
* WHOSE TRAIN THIS IS TO BUILD, for an Extra only.
|
||||
*
|
||||
* §7's Extra is loaded by the player who played the card, not by the Superintendent-first round
|
||||
* that fills a Timetabled train — so the tray has to remember them: `pendingExtras` is emptied the
|
||||
* moment the Extra starts, which is before a single car goes on. Undefined on every Timetabled
|
||||
* train, where the round decides instead.
|
||||
*/
|
||||
builtBy?: PlayerIndex;
|
||||
/**
|
||||
* WHERE THE ENGINE SITS IN THE TRAY, as an index into `consist`.
|
||||
*
|
||||
@@ -831,8 +840,15 @@ export type GameState = {
|
||||
/**
|
||||
* §7 — Extra Trains played from hand, waiting for a free Crew Tray. An Extra is not scheduled:
|
||||
* it runs once, immediately, then its card goes to the Salvage Yard (§2.3).
|
||||
*
|
||||
* CARRIES WHO PLAYED IT (2026-08-23, Jesse's call). §7 gives an Extra to the player who played the
|
||||
* card — "may place the Crew Tray at either Division Point ... and may load the consist as he
|
||||
* chooses" — which is a different rule from the Timetabled make-up round, where the table goes
|
||||
* round starting at the Superintendent. This was a bare `number[]`, so the engine could not tell
|
||||
* whose Extra it was and asked whoever the acting order happened to be on: correct in solitaire,
|
||||
* where there is only one player, and wrong at every table.
|
||||
*/
|
||||
pendingExtras: number[];
|
||||
pendingExtras: { trainNumber: number; player: PlayerIndex }[];
|
||||
/**
|
||||
* Q9 — train numbers ordered to run a second section. The next New Train Phase makes up an
|
||||
* identical train behind the first, if a Crew Tray is free.
|
||||
|
||||
Reference in New Issue
Block a user