From 4a4e164e886672889bd0368cd7853970f22f4358 Mon Sep 17 00:00:00 2001 From: Eric Wagoner Date: Sun, 16 Aug 2026 22:15:12 -0400 Subject: [PATCH] The dice roll once MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rejoining a room replays the whole chronicle through the same events channel that carries live play, so the opening roll-off modal fired on every return. The replayed chronicle is now flagged, and one-time fanfare stays quiet on it — the log still rebuilds in full. Co-Authored-By: Claude Fable 5 --- packages/server/src/index.ts | 6 ++++-- packages/web/src/net.svelte.ts | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/server/src/index.ts b/packages/server/src/index.ts index 6bb5f57..c056047 100644 --- a/packages/server/src/index.ts +++ b/packages/server/src/index.ts @@ -319,9 +319,11 @@ wss.on("connection", (socket) => { session.roomId = room.id; session.token = result.token; send(socket, { type: "seat", playerId: name, token: result.token }); - // Rejoining a running game: replay the chronicle so far. + // Rejoining a running game: replay the chronicle so far. The + // replayed flag keeps one-time fanfare (the opening roll-off) + // from firing again on every return to the room. if (room.state) { - send(socket, { type: "events", events: redactFor(room.events, name) }); + send(socket, { type: "events", events: redactFor(room.events, name), replayed: true }); } broadcastRoomState(room); runBots(room); diff --git a/packages/web/src/net.svelte.ts b/packages/web/src/net.svelte.ts index 59be4f3..b3e39d4 100644 --- a/packages/web/src/net.svelte.ts +++ b/packages/web/src/net.svelte.ts @@ -334,7 +334,7 @@ class Net { let talk = 0; for (const e of msg.events as GameEvent[]) { if (e.type === "tableTalk") talk++; - if (e.type === "gameStarted") { + if (e.type === "gameStarted" && !msg.replayed) { this.openingRolls = { rolls: e.dieRolls, first: e.firstPlayer, players: e.players }; } const line = humanize(e);