From 3d4bf1fa6defa51c72a6416fe7595fe9d9ed44bc Mon Sep 17 00:00:00 2001 From: Eric Wagoner Date: Sat, 5 Sep 2026 23:25:05 -0400 Subject: [PATCH] A sprung Ward says its bite is coming, not that it missed The bite rides a counteraction stack, so the batch that springs the Ward carries no damage; the notice read that as a bite with no purchase and the three points landed later unannounced. It now says the bite waits on the taker's answer, and the counteractions follow. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG --- packages/web/src/App.svelte | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/web/src/App.svelte b/packages/web/src/App.svelte index 4842d3f..314189e 100644 --- a/packages/web/src/App.svelte +++ b/packages/web/src/App.svelte @@ -89,7 +89,10 @@ /** A trap drawn by YOU earns a modal; buried log lines get missed. */ let trapNotice = $state(null); /** A Ward sprung on YOU earns the same courtesy. */ - let wardBite = $state<{ owner: string; amount: number } | null>(null); + /** A sprung WARD. The bite rides a counteraction stack, so the batch + * that springs it carries no damage: `pending` means the three points + * wait on the taker's answer rather than having found no purchase. */ + let wardBite = $state<{ owner: string; amount: number; pending: boolean } | null>(null); /** Cards revealed to YOU alone (a read mind, plunder, spoils): the * glimpse arrives once, in an event — hold it up until dismissed, or it * is lost to the scrollback. */ @@ -196,7 +199,8 @@ } if (e.type === "wardSprung" && e.victim === view.you) { const dmg = events.find((d) => d.type === "damaged" && d.player === e.victim && d.source === "warded treasure"); - wardBite = { owner: e.owner, amount: dmg?.type === "damaged" ? dmg.amount : 0 }; + const pending = view.stack?.defenderId === view.you && view.stack.sourceName === "warded treasure"; + wardBite = { owner: e.owner, amount: dmg?.type === "damaged" ? dmg.amount : 0, pending }; } } if (view) fpBatch = { n: (fpBatch?.n ?? 0) + 1, events, view }; @@ -1951,11 +1955,13 @@
The treasure bites back!
- {wardBite.amount > 0 + {wardBite.pending + ? `${wardBite.owner}'s treasure was warded — it bites for 3 unless you answer it. Your counteractions come next.` + : wardBite.amount > 0 ? `${wardBite.owner}'s treasure was warded — it bites you for ${wardBite.amount} point${wardBite.amount === 1 ? "" : "s"}.` : `${wardBite.owner}'s treasure was warded — but its bite finds no purchase.`}
- + {/if}