From 497c2245a378eea4c28c3e6add3601226f70e93a Mon Sep 17 00:00:00 2001 From: Eric Wagoner Date: Tue, 18 Aug 2026 10:37:57 -0400 Subject: [PATCH] Every segment states its hitpoints in the tooltip MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 'a wall — 20 hitpoints'; battered, 'a wall — 13 of 20 hitpoints left'; doors the same against their 15, lock states included ('held open by a standing wizard — 15 hitpoints'). The crack overlay already told the damage; now the wall itself tells what still stands. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_0138A8CjeQRpvzKxuMfz1Bqc --- packages/web/src/Board.svelte | 2 +- packages/web/src/EdgeGlyph.svelte | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/web/src/Board.svelte b/packages/web/src/Board.svelte index ce8c1f4..42e3df7 100644 --- a/packages/web/src/Board.svelte +++ b/packages/web/src/Board.svelte @@ -396,7 +396,7 @@ + title={lockTitle} damage={view.wallDamage[`${e.kind}:${e.x},${e.y}`] ?? 0} /> {/if} {/each} diff --git a/packages/web/src/EdgeGlyph.svelte b/packages/web/src/EdgeGlyph.svelte index 71bd68f..a122d74 100644 --- a/packages/web/src/EdgeGlyph.svelte +++ b/packages/web/src/EdgeGlyph.svelte @@ -2,16 +2,23 @@ // A wall or door on an edge, exactly as the board draws it. Wall-segment // effects (locks picked, jammed, removed; doors held) are color states of // this one glyph — the game has never used tokens for them. - let { x, y, kind, state, lock = null, title = null }: { + let { x, y, kind, state, lock = null, title = null, damage = 0 }: { x: number; y: number; kind: "V" | "H"; state: "wall" | "door"; lock?: "removed" | "jammed" | "held" | "ajar" | null; title?: string | null; + /** Battle damage taken so far (walls fall at 20, doors at 15). */ + damage?: number; } = $props(); const CELL = 48; const WALL = 7; const cls = $derived(state === "door" ? `door${lock ? ` ${lock}` : ""}` : "wall"); - const tip = $derived(title ?? (state === "door" ? "a locked door" : "a wall")); + // Every segment tells its hitpoints: what still stands of its 20 (or 15). + const needed = $derived(state === "door" ? 15 : 20); + const hp = $derived(damage > 0 + ? `${Math.max(0, needed - damage)} of ${needed} hitpoints left` + : `${needed} hitpoints`); + const tip = $derived(`${title ?? (state === "door" ? "a locked door" : "a wall")} — ${hp}`); {#if kind === "V"}