The eyes turn to meet magic thrown at them, even after a stride

Springing the Trap never showed its fireball: Rival stepped into the
watched corridor facing the way he walked, and the ambush's fireball
flew in from the mouth behind him while only the caption told of it.
The director now aims at incoming magic and punches — the caster's or
attacker's square, straight or through a mouth — and a stride that
ends with something to watch turns once more after the walk, the
slate holding the outcome until the eyes face it. The fireball comes
through the wormhole at the camera, then the blow lands.

The trap's first beat re-blessed for it.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
This commit is contained in:
Eric Wagoner
2026-09-02 21:28:52 -04:00
co-authored by Claude Fable 5.1
parent 86856781df
commit 86070b42a3
3 changed files with 24 additions and 4 deletions
+6
View File
@@ -41,6 +41,12 @@ export function aimOfEvents(
cell = e.targetCell ?? view.players.find((p) => p.id === e.target)?.position ?? null;
} else if (e.type === "attackResolved" && e.attacker === povId) {
cell = view.players.find((p) => p.id === e.defender)?.position ?? null;
} else if (e.type === "spellCast" && e.target === povId && e.caster !== povId) {
// Magic thrown AT these eyes: they turn to where it came from —
// the ambusher down the corridor, or through the mouth.
cell = view.players.find((p) => p.id === e.caster)?.position ?? null;
} else if (e.type === "punched" && e.target === povId) {
cell = view.players.find((p) => p.id === e.attacker)?.position ?? null;
} else if (e.type === "objectThrown" && e.attacker === povId) {
cell = e.landedAt;
} else if (