From 3c10e0463f30e7ba4f7f2fdc4073297400395002 Mon Sep 17 00:00:00 2001 From: Eric Wagoner Date: Thu, 17 Sep 2026 00:34:45 -0400 Subject: [PATCH] The raven sets expectations; Create and Join say so when the table is not yet reached The lobby tells a challenger what to expect in the table's own voice: the keeper answers every raven, sometimes within the minute, sometimes after a night's sleep; the seat is held either way, and the table is theirs meanwhile. A Create or Join tried before the socket is open used to vanish; it now says the table is still being reached. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG --- packages/web/src/App.svelte | 9 +++++++-- packages/web/src/net.svelte.ts | 6 ++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/packages/web/src/App.svelte b/packages/web/src/App.svelte index bdfd890..da48038 100644 --- a/packages/web/src/App.svelte +++ b/packages/web/src/App.svelte @@ -2683,11 +2683,16 @@ {#if !net.challenge && !net.players.includes(net.keeper) && net.players.length + net.expected.length < 6}
+
{net.keeper} keeps this table and answers every raven — sometimes within the minute, + sometimes after a night's sleep. The seat is held either way.
{:else if net.challenge} -
{net.keeper} has been called by {net.challenge.by}. If they can come, they take their seat; if not, they may leave a word below.
+
The raven has flown to {net.keeper}, called by {net.challenge.by}. A seat is held for them: + if they can come now, they will take it; if they are at supper, or asleep, or off in the world, they will + leave a word below when they can. Meanwhile the table is yours — seat a clockwork wizard, invite a friend, + or leave the room on the ledger and come back to it later.
{/if} {@const lobbyTalk = net.log.filter((l) => l.text.startsWith("\u{1F4AC}")).slice(-6)} diff --git a/packages/web/src/net.svelte.ts b/packages/web/src/net.svelte.ts index 0cb7c28..cbc7507 100644 --- a/packages/web/src/net.svelte.ts +++ b/packages/web/src/net.svelte.ts @@ -720,7 +720,7 @@ class Net { create(name: string): void { this.you = name; this.spectating = false; - this.send({ type: "create", name }); + if (!this.send({ type: "create", name })) this.flash("Still reaching the table — try again in a moment"); } /** Take a seat in the Peanut Gallery: watch a game with no name and no voice. */ @@ -737,7 +737,9 @@ class Net { const existing = this.seats.find( (s) => s.roomId === this.roomIdPending && s.name === name, ); - this.send({ type: "join", roomId, name, token: existing?.token ?? this.token }); + if (!this.send({ type: "join", roomId, name, token: existing?.token ?? this.token })) { + this.flash("Still reaching the table — try again in a moment"); + } } /** Sit back down at a remembered seat. */