From 9afe9333c2fcd6c98fa18a5c867f2ca3d52ab849 Mon Sep 17 00:00:00 2001 From: Eric Wagoner Date: Sun, 11 Oct 2026 10:25:14 -0400 Subject: [PATCH] An editing pass over the words around the game The hall, the guide, the rules page, the lobby and the report slip lose most of their semicolons, the statement-colon lines and the guide narrating itself. The tagline is one sentence, 'a labor of love' is gone from the about link, and the shared parts read as Waving Hands' do. Corrected along the way: the about panel no longer says players are shown only what the rules let them see (nothing in hnefatafl is hidden); the game was played for centuries before chess, not a thousand years; the report slip's example no longer mentions points; and a watcher is no longer told that "your defender" was taken. The move story reads "Ada moved an attacker from d1 to d4" rather than "Ada: an attacker...". The end-of-game reasons are unchanged: ledgers record them verbatim. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_0141G6xqLeNRYEtviLWSB5Up --- src/app.html | 6 +++--- src/lib/components/Board.svelte | 5 +++-- src/lib/components/Hall.svelte | 22 +++++++++---------- src/lib/components/Lobby.svelte | 6 +++--- src/lib/components/ReportSlip.svelte | 6 +++--- src/lib/components/TableTalk.svelte | 2 +- src/lib/game/index.ts | 4 ++-- src/routes/guide/+page.svelte | 27 ++++++++++++----------- src/routes/join/[code]/+page.svelte | 4 ++-- src/routes/rules/+page.svelte | 32 ++++++++++++++-------------- 10 files changed, 58 insertions(+), 56 deletions(-) diff --git a/src/app.html b/src/app.html index 31b4cf1..3bbbbaf 100644 --- a/src/app.html +++ b/src/app.html @@ -6,21 +6,21 @@ Hnefatafl - + - + - + %sveltekit.head% diff --git a/src/lib/components/Board.svelte b/src/lib/components/Board.svelte index 3104396..9ed1a1f 100644 --- a/src/lib/components/Board.svelte +++ b/src/lib/components/Board.svelte @@ -106,13 +106,14 @@ const side = sideOfPly(ply); const yours = !!mySide && mySide === side; const who = yours ? 'You' : nameOfSide(side); + const theirs = !!mySide && !yours; const moverPiece = ply === g.moves.length ? (g.cells[m.to] ?? '.') : '.'; const moverWord = moverPiece !== '.' ? pieceWord(moverPiece) : side === 'attackers' ? 'an attacker' : 'a piece'; - let text = `${who}: ${moverWord} from ${label(m.from)} to ${label(m.to)}.`; + let text = `${who} moved ${moverWord} from ${label(m.from)} to ${label(m.to)}.`; for (const c of m.captured) { const anvil = beyond(size, m.to, c); const kingFell = side === 'attackers' && !g.cells.includes('k') && ply === g.moves.length; - const victim = kingFell ? 'the king' : side === 'attackers' ? (yours ? 'a defender' : 'your defender') : yours ? 'an attacker' : 'your attacker'; + const victim = kingFell ? 'the king' : side === 'attackers' ? (theirs ? 'your defender' : 'a defender') : theirs ? 'your attacker' : 'an attacker'; const against = anvil === -1 ? 'the edge' diff --git a/src/lib/components/Hall.svelte b/src/lib/components/Hall.svelte index 5a7309b..2949917 100644 --- a/src/lib/components/Hall.svelte +++ b/src/lib/components/Hall.svelte @@ -195,9 +195,9 @@

Hnefatafl

-

The Viking board game. One king, one throne, four corners, and a ring of attackers closing in.

-

Hnefatafl was played across the Norse world for a thousand years before chess. Every piece moves like a rook and is taken by being sandwiched; the attackers must capture the king, the king must reach safety. Play a housecarl, or open a table for a friend and play by turns. Copenhagen rules on the big board, or Tablut, the older game Linnaeus wrote down in 1732.

- +

The Viking board game of a king breaking for safety and a ring of attackers closing in.

+

Hnefatafl was played across the Norse world for centuries before chess arrived. Every piece moves like a rook and is taken by being caught between two enemies. The attackers must capture the king, and the king must reach safety. Play a housecarl, or open a table for a friend and play by turns, by Copenhagen rules on the big board or as Tablut, the older game Linnaeus wrote down in 1732.

+
@@ -231,7 +231,7 @@ -

A code opens the door either way: take a seat if one is free, or watch from the Peanut Gallery.

+

With a code you can take a seat if one is free, or watch from the Peanut Gallery.

or bring a seat from another device @@ -293,9 +293,9 @@ {#snippet aboutGame()}
-

Hnefatafl is the tafl game of the Vikings, carried by them from Scandinavia to Britain, Ireland, Iceland and beyond, and played until chess arrived in the eleventh and twelfth centuries. No rules from that age survive; the game was reconstructed in modern times from a Sámi cousin, Tablut, whose rules the botanist Carl Linnaeus jotted down on his journey through Lapland in 1732.

-

This table plays Copenhagen, the modern tournament ruleset, on the eleven-by-eleven board, and Tablut on the nine-by-nine one, with the older board showing its age. The rules it follows are on the rules page. The game is in the public domain; the board and pieces here are drawn, not borrowed.

-

It is free and keeps no accounts. A game between people lives on a small server as an append-only ledger of moves, so it can be replayed from its first move, and each player is shown only what the rules let them see.

+

Hnefatafl is the tafl game of the Vikings, carried by them from Scandinavia to Britain, Ireland, Iceland and beyond, and played until chess arrived in the eleventh and twelfth centuries. No rules from that age survive. The game was reconstructed in modern times from a Sámi cousin, Tablut, whose rules the botanist Carl Linnaeus jotted down on his journey through Lapland in 1732.

+

This table plays Copenhagen, the modern tournament ruleset, on the eleven-by-eleven board, and Tablut on the nine-by-nine one, with the older board showing its age. The rules it follows are on the rules page. The game is in the public domain, and the board and pieces here were drawn for this site.

+

It is free and keeps no accounts. A game between people lives on a small server as an append-only ledger of moves, so it can be replayed from its first move.

{/snippet} {#snippet aboutTally()} @@ -315,15 +315,15 @@ {/if}

- The games of Kestrel's Hall are free and will stay free. They run on small servers that cost a few dollars a month; anyone who wants to chip in toward the hosting can at - ko-fi.com/kestrelsnest. Nothing is unlocked by it and nothing is withheld without it. + The games of Kestrel's Hall are free and will stay free. They run on small servers that cost a few dollars a month, and anyone who wants to chip in toward the hosting can do so at + ko-fi.com/kestrelsnest. Every game stays whole either way.

-

Hnefatafl belongs to everyone; it is a thousand years old.

+

Hnefatafl belongs to everyone. It is more than a thousand years old.

{/snippet} {#snippet aboutWord()}
-

A rule read wrong, a bug, a game you would like to tell of: write to eric@ericwagoner.com, @kestrelsnest.social on Bluesky, or @eric@toots.kestrelsnest.social on Mastodon. The keeper of this hall roosts at kestrelsnest.social.

+

If a rule reads wrong, something breaks, or you have a game to tell of, write to eric@ericwagoner.com, @kestrelsnest.social on Bluesky, or @eric@toots.kestrelsnest.social on Mastodon. The keeper of this hall roosts at kestrelsnest.social.

{/snippet} diff --git a/src/lib/components/Lobby.svelte b/src/lib/components/Lobby.svelte index 16f0d6a..d83ac41 100644 --- a/src/lib/components/Lobby.svelte +++ b/src/lib/components/Lobby.svelte @@ -35,7 +35,7 @@ {#if room.seatEmpty}

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

{:else} -

The table is full. You watch from the Peanut Gallery; the game begins when {hostName} says.

+

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

{/if} {:else}

room {v.roomId}

@@ -60,7 +60,7 @@
  • {v.size - v.seats.length - v.expected.length} of {v.size} seats empty{#if v.audience > 0}; {v.audience} in the gallery{v.galleryTalk ? ', allowed to talk' : ''}{/if}
  • {#if v.rematchOf} -

    A rematch of table {v.rematchOf}: the same company, seats held for those not yet back.

    +

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

    {/if} {#if !room.spectating}
    @@ -86,7 +86,7 @@

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

    {:else if v.challenge} -

    {v.keeper} has been called to the table by {room.nameOf(v.challenge.by)}.{#if keeperHour} It is {keeperHour} there.{/if} A seat is held: if they can come now they will take it; if they are asleep or away they will leave a word below when they can. Meanwhile the table is yours: seat a housecarl, invite a friend, or open another game in a new tab and play on. This table keeps its place in your hall until you come back.

    +

    {v.keeper} has been called to the table by {room.nameOf(v.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 housecarl, invite a friend, or play another game in a new tab. This table keeps its place in your hall until you come back.

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

    {room.error}

    {/if} diff --git a/src/lib/components/ReportSlip.svelte b/src/lib/components/ReportSlip.svelte index 863ed79..2450471 100644 --- a/src/lib/components/ReportSlip.svelte +++ b/src/lib/components/ReportSlip.svelte @@ -59,7 +59,7 @@

    Something amiss?

    {#if sent} -

    Recorded beside the room's ledger, with the round. Thank you; the keeper will study the moment.{#if error} {error}{/if}

    +

    Recorded beside the room's ledger, with the turn. Thank you. The keeper will look into it.{#if error} {error}{/if}

    {:else} -

    The room code and the round ride along; the keeper can replay the game to this moment.

    +

    The room code and the turn are sent with it, so the keeper can replay the game to this moment.

    {#if error}

    {error}

    {/if}
    diff --git a/src/lib/components/TableTalk.svelte b/src/lib/components/TableTalk.svelte index 61fa85e..2d90d6c 100644 --- a/src/lib/components/TableTalk.svelte +++ b/src/lib/components/TableTalk.svelte @@ -57,7 +57,7 @@ {:else if room.spectating} -

    The gallery listens; the host has not let it talk.

    +

    The host has not let the gallery talk at this table.

    {:else}
    diff --git a/src/lib/game/index.ts b/src/lib/game/index.ts index cea99f5..295c21e 100644 --- a/src/lib/game/index.ts +++ b/src/lib/game/index.ts @@ -46,7 +46,7 @@ export interface State { const SIDES: { value: Side; label: string; note: string }[] = [ { value: 'defenders', label: 'the defenders, with the king', note: 'Fewer pieces, and the king must reach safety before the ring closes.' }, - { value: 'attackers', label: 'the attackers', note: 'Twice the pieces, and the first move; close every road and take the king.' } + { value: 'attackers', label: 'the attackers', note: 'Twice the pieces and the first move. Close every road and take the king.' } ]; /** The sentences a game ends on. The tally counts finished games by them, so they are written here and nowhere else. */ @@ -208,7 +208,7 @@ export const game: GameSpec = { label: 'Rules', choices: [ { value: 'tablut', label: 'Tablut, 9 by 9, after Linnaeus', note: 'The older game. The king escapes to any edge square, and away from the throne two attackers take him like any piece.' }, - { value: 'copenhagen', label: 'Copenhagen, 11 by 11', note: 'The modern tournament game. The king escapes to a corner and falls only to four attackers, three beside the throne.' } + { value: 'copenhagen', label: 'Copenhagen, 11 by 11', note: 'The modern tournament game. The king escapes to a corner and falls only to four attackers, or three beside the throne.' } ], default: DEFAULT_SET }, diff --git a/src/routes/guide/+page.svelte b/src/routes/guide/+page.svelte index 84c032d..cf9b6b7 100644 --- a/src/routes/guide/+page.svelte +++ b/src/routes/guide/+page.svelte @@ -1,5 +1,5 @@