Waving Hands: a duel

Waving Hands

{#if room?.remote?.started && watching}

From the Peanut Gallery you watch {#each room.others as id, i (id)}{#if i > 0}{i === room.others.length - 1 ? ' and ' : ', '}{/if}{room.state.wizards[id].name}{/each} duel. {#if !room.remote.connected}Reconnecting to the duel.{/if}

{:else if room?.remote?.started}

You are {room.you.name}, duelling {#each room.others as id, i (id)}{#if i > 0}{i === room.others.length - 1 ? ' and ' : ', '}{/if}{room.state.wizards[id].name}{/each}. {#if !room.remote.connected}Reconnecting to the duel.{/if}

{:else}

A duel between people, played by turns whenever each of you has a moment.

{/if}
{#if room} {#if room.isHost}{/if} {/if} {#if error}

{error}

{/if} {#if phrase}

On the other device, open the hall and claim this phrase within ten minutes: {phrase.phrase}

{/if} {#if room?.remote?.started && !seatLost && room.remote.seats.some((s) => s.standIn)}

A bot duels for {room.remote.seats.filter((s) => s.standIn).map((s) => s.name).join(', ')}, at the host's word, until a transfer phrase from the host brings them back.

{/if} {#if watching && room?.remote?.started && !room.state.over}
{#if seatLost}

{seatLost} Claim it here, or write to the keeper.

{:else}{#if room.remote.expected.length > 0}

{room.speaker(room.remote.host)} began the duel before {room.remote.expected.join(' and ')} arrived, and the seat held for {room.remote.expected.length === 1 ? 'them' : 'each'} went with it.

{/if}

Had a seat at this duel? Ask the host for a transfer phrase, or make one on the device that still holds the seat, and claim it here. Or write to the keeper for a link that brings it back.

{/if}
{/if} {#if room?.remote?.started && room.state.over && !watching} {@const r = room.remote}

{#if r.rematch} {room.speaker(r.rematch.by)} called for a rematch at table {r.rematch.to}. Take your seat {:else} The same company sits down at a new table, with a seat held for everyone here. {/if}

{/if} {#if joining && seatFree}

room {roomId}

Take a seat

A wizard has opened this table and is gathering opponents. Choose a name and sit down. The duel begins when the host says.

Just watching? You are in the Peanut Gallery until you sit.

{/if} {#if room && lobby} {@const r = room.remote!} {@const hostName = r.seats.find((s) => s.id === r.host)?.name ?? 'the host'}
{#if watching}

At the table

{#if seatFree}

{hostName} is gathering wizards. Sit down above, or watch from the gallery until the duel begins.

{:else}

The table is full, so you watch from the Peanut Gallery. The duel begins when {hostName} says.

{/if} {:else}

room {roomId}

The table is laid

Send this link, or the code. Whoever opens it takes a seat, up to a dozen, and the duel begins when you say. Anyone who arrives once it has begun watches from the Peanut Gallery.

{/if}
    {#each r.seats as s (s.id)}
  • {s.name} {s.id === r.host ? 'opened the table' : s.bot ? 'the bot' : 'seated'}{s.id === r.seat ? ', you' : ''}{#if s.bot && room.isHost} {/if}
  • {/each} {#each r.expected as name (name)}
  • {name} {r.challenge && name.toLowerCase() === r.keeper.toLowerCase() ? 'called to the table; a seat is held' : 'from the last table; a seat is held'}
  • {/each}
  • {r.size - r.seats.length - r.expected.length} of {r.size} seats empty{#if r.audience > 0}; {r.audience} in the gallery{r.galleryTalk ? ', allowed to talk' : ''}{/if}
{#if r.rematchOf}

This is a rematch of table {r.rematchOf}, with seats held for those not yet back.

{/if} {#if !watching}
{#if r.seats.length < r.size && room.isHost} {/if} {#if room.isHost && beginAsked && r.expected.length > 0} A seat is held for {r.expected.join(' and ')}, who {r.expected.length === 1 ? 'has' : 'have'} not arrived. The seat goes once the duel begins. {:else if room.isHost} {r.seats.length < 2 ? 'once a second wizard is seated' : `with ${r.seats.length} wizards`} {:else} {hostName} will begin the duel when the table is ready. {/if}
{#if room.isHost} {/if} {#if r.keeper && !r.challenge && !r.seats.some((s) => s.name.toLowerCase() === r.keeper.toLowerCase()) && r.seats.length + r.expected.length < r.size}

{r.keeper} keeps this site and answers every call, sometimes within the minute, sometimes after a night's sleep.{#if keeperHour} It is {keeperHour} where {r.keeper} lives.{/if} The seat is held either way.

{:else if r.challenge}

{r.keeper} has been called to the table by {room.speaker(r.challenge.by)}.{#if keeperHour} It is {keeperHour} there.{/if} A seat is held for them. If they can come now, they will take it. If they are asleep or away, they will leave a word below when they can. In the meantime you can seat a bot, invite a friend, or play another duel in a new tab. This table keeps its place in your hall until you come back.

{/if} {/if} {#if r.error}

{r.error}

{/if}
{:else if room} {:else if !error}

{joining ? 'Finding the table.' : 'Finding your seat.'}

{/if}

After Richard Bartle's Waving Hands (1977), also known as Spellbinder and Spellcaster. Read the full rules. A rule read wrong or a bug found: send word.