diff --git a/packages/web/src/App.svelte b/packages/web/src/App.svelte index 7a640c2..8065bb7 100644 --- a/packages/web/src/App.svelte +++ b/packages/web/src/App.svelte @@ -52,10 +52,16 @@ let fxCancels: (() => void)[] = []; /** 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); function playFx(events: Parameters[0]) { if (!view) return; for (const e of events) { if (e.type === "trapSprung" && e.player === view.you && e.cardId) trapNotice = e.cardId; + 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 }; + } } if (!prefs.flourishes) return; fxCancels.push(scheduleFx( @@ -1339,6 +1345,21 @@ {/if} + {#if wardBite} +
+
+
The treasure bites back!
+
+
+ {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} + {#if view && view.outOfTurnWindow?.playerId === view.you && !momentSeen}