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 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
This commit is contained in:
Eric Wagoner
2026-09-17 00:34:45 -04:00
co-authored by Claude Fable 5.1
parent 1be1cf7d1b
commit 3c10e0463f
2 changed files with 11 additions and 4 deletions
+7 -2
View File
@@ -2683,11 +2683,16 @@
{#if !net.challenge && !net.players.includes(net.keeper) && net.players.length + net.expected.length < 6} {#if !net.challenge && !net.players.includes(net.keeper) && net.players.length + net.expected.length < 6}
<div class="challenge-row"> <div class="challenge-row">
<button class="stamp quiet-lid" onclick={() => net.challengeKeeper()} <button class="stamp quiet-lid" onclick={() => net.challengeKeeper()}
title="{net.keeper} keeps this table and gets a call; if they can come they take the seat, and either way they may leave a word here"> title="a raven flies to {net.keeper}, who keeps this table">
⚔ Challenge {net.keeper}, the keeper</button> ⚔ Challenge {net.keeper}, the keeper</button>
<div class="challenge-note">{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.</div>
</div> </div>
{:else if net.challenge} {:else if net.challenge}
<div class="challenge-note">{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.</div> <div class="challenge-note">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.</div>
{/if} {/if}
<!-- Talk before the boards flip: to say when, or to leave a word. --> <!-- Talk before the boards flip: to say when, or to leave a word. -->
{@const lobbyTalk = net.log.filter((l) => l.text.startsWith("\u{1F4AC}")).slice(-6)} {@const lobbyTalk = net.log.filter((l) => l.text.startsWith("\u{1F4AC}")).slice(-6)}
+4 -2
View File
@@ -720,7 +720,7 @@ class Net {
create(name: string): void { create(name: string): void {
this.you = name; this.you = name;
this.spectating = false; 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. */ /** 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( const existing = this.seats.find(
(s) => s.roomId === this.roomIdPending && s.name === name, (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. */ /** Sit back down at a remembered seat. */