From fa5e9cfc089a0930a9d880dc842d7df49a3cadfe Mon Sep 17 00:00:00 2001 From: Eric Wagoner Date: Thu, 29 Oct 2026 10:30:41 -0400 Subject: [PATCH] The chronicle's enchantment lines no longer all run image, colon, consequence; each keeps its picture and its exact fact in its own sentence shape, and the about panel's tally heading and two of its closing flourishes are said plainly, since a page of one sentence pattern reads as written by a machine Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_0141G6xqLeNRYEtviLWSB5Up --- src/lib/components/Hall.svelte | 6 ++--- src/lib/components/Tally.svelte | 2 +- src/lib/game/resolve.ts | 44 ++++++++++++++++----------------- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/lib/components/Hall.svelte b/src/lib/components/Hall.svelte index 1f11b8d..1b82f92 100644 --- a/src/lib/components/Hall.svelte +++ b/src/lib/components/Hall.svelte @@ -46,7 +46,7 @@ ...Object.entries(t.byGame).filter(([label]) => !told.has(label)).map(([label, n]) => ({ n, label })) ]; const first = t.firstGameAt ? `The first duel began ${new Date(t.firstGameAt).toLocaleDateString(undefined, { year: 'numeric', month: 'long', day: 'numeric' })}. ` : ''; - return { headline, details, note: `${first}Names are counted, not people: one player under two names is two here. Table time counts only the minutes between reveals, so a duel left open overnight adds nothing for the night.` }; + return { headline, details, note: `${first}The count is of names, so one player under two names is two here. Table time counts only the minutes between reveals, so a duel left open overnight adds nothing for the night.` }; }); /** The other games of Kestrel's Hall, for the about panel. */ let family = $state([]); @@ -342,7 +342,7 @@ {/snippet} {#snippet aboutTally()} {#if told} - + {:else}

Counting…

{/if} @@ -358,7 +358,7 @@ {/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, and anyone who wants to chip in toward the hosting can do so at - ko-fi.com/kestrelsnest. Chipping in unlocks nothing, and nothing is held back without it. + ko-fi.com/kestrelsnest. Chipping in unlocks nothing, and the games are the same for everyone.

Waving Hands is Richard Bartle's, 1977.

diff --git a/src/lib/components/Tally.svelte b/src/lib/components/Tally.svelte index 0e4331d..0282718 100644 --- a/src/lib/components/Tally.svelte +++ b/src/lib/components/Tally.svelte @@ -10,7 +10,7 @@ // What the ledgers add up to: a few counts that are the game's own story, // large, on cards; then the rest in a column of figures; then the fine // print. Each game chooses its counts and words. - let { headline, details, note, title = 'How much love the table is getting' }: { headline: TallyLine[]; details: TallyLine[]; note?: string; title?: string } = + let { headline, details, note, title = 'What the ledgers add up to' }: { headline: TallyLine[]; details: TallyLine[]; note?: string; title?: string } = $props(); const shown = (n: number | string) => (typeof n === 'number' ? n.toLocaleString() : n); diff --git a/src/lib/game/resolve.ts b/src/lib/game/resolve.ts index b44acb0..8081ea3 100644 --- a/src/lib/game/resolve.ts +++ b/src/lib/game/resolve.ts @@ -312,7 +312,7 @@ export function resolveTurn(previous: GameState, inputs: Record choice.seqIndex === undefined || c.seqIndex === choice.seqIndex) ?? options[0]; if (!completion) continue; if (completion.spell.id === 'lightning_bolt_quick' && w.usedQuickLightning) { - log(`${w.name}'s quick lightning bolt sputters: it has already been used this duel.`, 'fizzle'); + log(`${w.name}'s quick lightning bolt sputters and dies, spent earlier in this duel.`, 'fizzle'); continue; } const cells = usedCells(completion, choice.hand, index + 1); @@ -404,7 +404,7 @@ export function resolveTurn(previous: GameState, inputs: Record(); const dispels = live().filter((c) => c.spell.id === 'dispel_magic'); if (dispels.length > 0) { - log('A wave of stillness rolls across the field. Dispel magic: every other spell fails, every enchantment ends, and every creature will fade after this turn.', 'spell'); + log('A wave of stillness rolls across the field as the magic is dispelled. Every other spell fails, every enchantment ends, and every creature will fade after this turn.', 'spell'); for (const c of casts) if (!c.nullified && c.spell.id !== 'dispel_magic') c.nullified = 'dispelled'; for (const d of dispels) shielded.set(d.target, 'dispel magic'); for (const id of seats) clearEnchantments(W[id]); @@ -476,7 +476,7 @@ export function resolveTurn(previous: GameState, inputs: Record 0) { fireStorm = false; @@ -621,14 +621,14 @@ export function resolveTurn(previous: GameState, inputs: Record W[id].alive), ...state.monsters.filter((o) => o.id !== mon.id).map((o) => o.id)]; const t = pick(candidates as TargetId[]); @@ -641,7 +641,7 @@ export function resolveTurn(previous: GameState, inputs: Record