Creatures walk open doorways, and the interruption gets its fanfare

Player movement asked the full question of a door — removed, keyed
this turn, or held — while creature movement only saw "door" and
refused, so a skeleton balked at a doorway its master had unlocked
for good. One doorIsOpen() now answers for both, and an open doorway
costs a wraith none of its wall passes.

And the interruption window earns the modal it deserved: "The maze
holds its breath" — the card shown, the instruction plain, dismissed
with "Seize it". No more hunting the rail for a slip while time
stands parted.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Eric Wagoner
2026-08-17 13:50:38 -04:00
co-authored by Claude Fable 5
parent 44c14f5ce1
commit e7c8ddc0b3
3 changed files with 65 additions and 4 deletions
+19
View File
@@ -39,6 +39,11 @@
/** Which pending attack the player has already acknowledged (modal dismissed). */
const fxWorkshop = new URLSearchParams(location.search).has("fx");
let attackNoticeSeen = $state<string | null>(null);
/** The interruption fanfare, dismissed once per window. */
let momentSeen = $state(false);
$effect(() => {
if (!view?.outOfTurnWindow) momentSeen = false;
});
/** Live spell flourishes on the board (cosmetic, self-expiring). */
let boardFx = $state<BoardFx[]>([]);
let fxCancels: (() => void)[] = [];
@@ -1008,6 +1013,20 @@
</div>
{/if}
{#if view && view.outOfTurnWindow?.playerId === view.you && !momentSeen}
<div class="scrim attack-scrim" role="alertdialog" aria-label="your interruption">
<div class="attack-notice">
<div class="attack-headline">The maze holds its breath</div>
<div class="attack-card"><Card card={{ instanceId: "moment", cardId: view.outOfTurnWindow.kind }} /></div>
<div class="attack-power">
Time parts for your {cardDef(view.outOfTurnWindow.kind).name}
pick an attack card and a target, or let the moment pass.
</div>
<button class="stamp big" onclick={() => (momentSeen = true)}>Seize it</button>
</div>
</div>
{/if}
{#if openingRolls}
<div class="scrim attack-scrim" role="alertdialog" aria-label="the roll for first wizard">
<div class="attack-notice">