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"}