Commit Graph
337 Commits
Author SHA1 Message Date
Eric WagonerandClaude Fable 5 728f9fc28a The feet tray learns hazards and the warp step
Two blind spots close. The active body — wizard or ridden mount —
standing on a dimensional-warp token gets a "step through the warp"
button in the feet tray, dispatching warpStep for the wizard and
creatureWarpStep for the mount (the command the RNRX troll report
earned). And whatever you stand IN shows as a warning chip: tacks,
slime, dust, a pit, the ooze — the near plane's last secrets told.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-27 15:19:22 -04:00
Eric WagonerandClaude Fable 5 043a8b94a2 Bodies sharing your square get a tray of their own
A wizard or creature standing IN your square lives inside the
renderer's near plane — no sprite, nothing to click, though
same-square is exactly where punches, thieves, and a mount's claws
operate. A "sharing your square" tray now joins the cockpit above the
feet tray: co-located bodies as clickable portraits, routed through
the same target handler a sprite click uses — so a possessed skeleton
claws its square-mate and a wizard punches theirs, all from inside
the pane.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-27 15:13:46 -04:00
Eric WagonerandClaude Fable 5 e499df22d7 The facing ribbon rides the mount
While the pane possesses a creature, the keymap's golden ribbon moves
to the mount's token — same shallow triangle, sized to the smaller
body, turning with the borrowed eyes — and leaves the wizard's brow
until the rider returns.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-27 15:02:28 -04:00
Eric WagonerandClaude Fable 5 714c5bef80 Dismounting hands back the exact view you left
Stepping out of a creature's skull treated the return as a fresh cut,
and fresh cuts face the deepest corridor — spinning the rider 90
degrees from where they had been looking. The saddle now remembers:
your position and facing are saved at mount and restored verbatim on
every dismount path (the button, the turn passing, the mount dying),
with no cut and no re-aim.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-27 15:01:18 -04:00
Eric WagonerandClaude Fable 5 1595118410 Possession: ride your creature's eyes; the cockpit stops flinching
The pane learns the menagerie. On your turn, a "ride" button appears
for each creature you command with moves or claws unspent; mounting
seats the camera in its skull facing its longest corridor, hides its
own hide from its eyes, and hands it the helm — chevrons and arrows
stride IT, an adjacent floor click steps it, and clicking an enemy
sharing its square lands its blow. A banner shows the mount's
remaining legs; one tap (or the turn passing, or the mount dying)
returns you to your own eyes, where the director reseats you fresh.

Two cockpit-dignity fixes from live play ride along: a cutaway to
your own body now plays only for things done TO you — dropping a
dagger no longer flings your eyes out of your skull — and a standing
camera is never "rescued" off a wall you deliberately faced; the
deepest-corridor default applies only to fresh cuts.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-27 14:56:29 -04:00
Eric WagonerandClaude Fable 5 5f91e30eb4 Warps preserve your heading, not your bearing
Stepping through a rim warp spun the live camera 180: the director
aimed along the displacement vector, and a top-to-bottom wrap's
vector points exactly opposite the walk. The exit facing now comes
from the warp's own geometry — the far mouth's inward direction —
so travel carries straight through plain wraps and rotates correctly
where boards were laid rotated; a dimensional token step keeps the
facing it entered with.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-27 14:51:56 -04:00
Eric WagonerandClaude Fable 5 770e79d063 The ribbon brightens and grows a hair
Full-strength marigold instead of muted brass, and the rise goes to a
quarter of the token's width.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-27 14:48:18 -04:00
Eric WagonerandClaude Fable 5 a254e46c5e The facing mark becomes a ribbon on the token's brow
Per the table's taste: not a needle but a short wide golden triangle
hugging the token's leading edge — base as wide as the token itself,
rising a fifth of that width outward, turning with the pane's
quarter-turns.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-27 14:46:56 -04:00
Eric WagonerandClaude Fable 5 19752e55e1 Forfeit legs earn no scolding; the pane sees your boots
Picking up an object ends the turn's actions AND movement — yet the
end-turn caution still tallied the unspendable points as regret. The
unspent-movement reason now stays quiet once actions have ended:
those points cannot be spent, only mourned.

And the raycaster has no downward pitch, so whatever lay in your own
square — a treasure, a dropped blade — was invisible from inside the
cockpit. An "at your feet" tray now rides the pane's bottom edge on
your turn: your square's floor treasures and objects as clickable
icons, each a one-tap pickup through the same commands the board's
buttons send.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-27 13:51:27 -04:00
Eric WagonerandClaude Fable 5 3d2bf17585 Absence is not evidence: the seat wallet trusts only verdicts
The games-list reply pruned any wallet seat the server did not vouch
for — so one poll against a restarting (or wrong) server silently
deleted live credentials, the second seat-burning path this session's
server-squatting exposed. myGames now returns explicit verdicts:
a seat is voided only when its room EXISTS and refused that exact
token. Absent rooms earn no verdict and absent seats survive; the
wallet caps by age at fifty instead of by trust.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-26 14:03:29 -04:00
Eric WagonerandClaude Fable 5 72148dd7c2 A missing room must not burn the seat
The client deleted its saved seat credentials on "no such room" — but
that error proves nothing about the seat: a restarting server, a
stale restore, or a wrong backend all say it, and burning the token
on a transient locked a live player out of a live game (room 22EC,
after this session's server-squatting incident). Now only "name is
taken" — this exact token tried and refused — clears the credential;
a not-found shows its error and keeps the key for the reconnect that
finds the room home again.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-26 14:00:30 -04:00
Eric WagonerandClaude Fable 5 b396469bea The facing needle surfaces from under the token
The keymap's facing wedge rendered BENEATH the wizard's own art, its
tips a pixel past the portrait's edge — present in the DOM, invisible
at the table. It now draws above the token as a proper compass
needle, tip half a cell out, dark-stroked for contrast. Verified in
rendered pixels this time, not element existence.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-26 13:53:56 -04:00
Eric WagonerandClaude Fable 5 22c443d2c5 The crosshair answers before the click commits
Hovering the pane now shows what a click would do: a wizard or
creature outlines in gold with its name at the crosshair, a wall or
door face lights across every column it owns, and a floor square
draws its perspective-true quad on the ground. Warp-bent ground still
targets truly but labels itself "through the warp" rather than
drawing a quad in the wrong geometry. And when a cell-target card is
selected, the ineligible ground dims in the 3D view itself — the same
litCells the board's shadow uses, rasterized into the floor pass.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-26 12:35:12 -04:00
Eric WagonerandClaude Fable 5 42d872df6d Milestone two: the pane becomes the wand hand
Clicks in the first-person view now act. The renderer keeps what the
last frame knew — per-column depth, warp bends, every wall hit's edge,
every sprite's screen rect with its identity — and hitTest inverts the
projection: the nearest visible sprite answers as its wizard or
creature, a struck wall or door answers as its edge, and the ground
answers as the square under the pixel, warp-bent columns mapping their
virtual floor back to real cells through the warp's own rigid motion.
The pane hands each target to the very functions the top-down board's
clicks use, so pane and map can never disagree: click the floor ahead
and you walk there; click a door with a key selected and the lock
turns; click a wizard with an attack and the spell flies.

The keymap token now wears a golden wedge showing the camera's compass
quadrant — the cockpit and the chart always agree on which way you
face. Verified live: a floor click became a real move command in the
room ledger, edge clicks resolve and defer correctly, and the wedge
tracks quarter-turns.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-26 12:28:51 -04:00
Eric Wagoner aac06dd2b5 Merge branch 'main' into first-person-play 2026-08-26 12:13:13 -04:00
Eric WagonerandClaude Fable 5 365cb3821e Idle bot turns confess; the chronicle fills its gaps
A clockwork whose chosen command the engine refuses now stumbles
visibly: the refusal is logged server-side with the offending command
(the RNRX coma took three silent turns to notice), and the bot says
so in character at the table — "RECALCULATING." — instead of an
unexplained idle turn. And six event types that never spoke in the
chronicle find their lines: the wave's wash-back, thornbush entry,
dragged objects, the opening deal, stolen-card and revealed-hand
privates. Replay captions inherit them all through humanize.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-26 12:10:55 -04:00
Eric WagonerandClaude Fable 5 9af7bd80ce The host clears seats and closes rooms
Two lobby-lifecycle gaps from tonight's duels (a token lost to a
client bug left an unkickable ghost seat holding a chair in VQJW).
kickSeat: the host removes any other seat from an unstarted room —
the kick is a ledger line so restarts replay it, and a kicked live
socket is set adrift with notice. abandonRoom: the host dissolves a
lobby or a finished game; every member is notified and detached, and
the ledger is archived to rooms-abandoned/ — moved, never deleted.
The lobby shows hosts a ✕ per seat and an abandon-room control.
Proven live: kick with notice, kick surviving a server restart, and
abandonment archiving its ledger.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-26 11:05:42 -04:00
Eric WagonerandClaude Fable 5 9e4807eab8 The needle shows itself; floor objects answer a tap
Two findings from duel two (room UNS6). AROUND THE CORNER's bent
sight was legal but invisible: a 1-by-6 diagonal threading six open
edge spans read as an impossible shot because the table never saw the
line. The stack now records bentCorner, and stackSightTrace finds the
middle square and returns both legs; the board draws them with a
pulsing diamond on the corner the sight bent around — the answer to
"how can he even see me?" now covers the bent case.

Floor objects (a dropped wizardblade) showed a marker but answered
only a 450ms hold; a plain click did nothing. The marker itself is
now a click target that opens the same card peek.

All 21 ledgers verified; 284 tests.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-26 10:38:57 -04:00
Eric WagonerandClaude Fable 5 dd87f1d843 Monsters ride the wormhole; mental force fails loudly (rules rev 5)
Two findings from the first human-vs-Claude duel (room 9UA6). A
creature standing on a DIMENSIONAL WARP token had no way through it —
warpStep obeys only wizards. The new creatureWarpStep command steps a
commanded creature through the tokens under the walker's rules: one
move spent, solid stone refuses it, FEAR holds the beast, touch
effects greet whoever shares the landing; the board taps the paired
token like a rim mouth. Replay-safe ungated — a new command widens
nothing that was recorded.

MENTAL FORCE ate its card silently when the destination lay beyond
the victim's three walked spaces — the caster spent an attack and
learned nothing (ask me how I know). Rev 5 refuses the impossible
destination up front with the card kept; when the victim slips out of
range between cast and resolution, a mentalForceFizzled event tells
the table what happened instead of nothing. All 20 production ledgers
verified, the duel's own among them; 283 tests.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-25 23:59:31 -04:00
Eric WagonerandClaude Fable 5 324853ce51 Every turn wears the eye
The chronicle stops judging what is share-worthy: the 👁 now rides
every turn's opening line — headers, skipped turns, extra turns — and
the players decide which moments deserve reliving. The game-winning
line keeps its own crown eye. The notable-event catalog and the
one-eye bookkeeping retire with the judgment.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-25 21:14:37 -04:00
Eric WagonerandClaude Fable 5 64e4e243dc The MASTER KEY earns its display
"Display Immediately," says the card — now the key lives up to it.
Cast bare (a new Display button beside the hold-the-door checkbox),
it goes straight on display; once displayed, it turns in every lock
its bearer walks through — no more casting at each door — with the
door relocking behind them at turn's end like any picked lock, and
the doorUnlocked event still swinging the door in the reels. Cast at
an adjacent door it still works one lock like PICK LOCK, including
holding the door open for others. A JAMmed LOCK refuses it as ever,
and the adjacent peek through workable locks already rode the rev-2
sight rules. Replay-safe ungated: bare casts were never recorded
(they were refused), displayed cards still count against the hand
limit, and walking through a locked door only widens what is
accepted.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-25 20:46:23 -04:00
Eric WagonerandClaude Fable 5 805fb09782 Chaos aims at no one
The client always offered CHAOS from the hint bar without a target,
and the engine refused it: "attack spells target a player". Not this
one — cast bare, it sweeps every other living wizard into the pile,
each offered their FULL SHIELD sit-out in turn order from the caster.
No stack forms; full shields only ever excluded a player from the
storm, so the queue is the whole defense. The older player-targeted
form stays accepted, so stored games replay unchanged. The scramble
joins the chronicle's notable events — a turn that redeals every hand
earns its eye.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-25 20:35:12 -04:00
Eric WagonerandClaude Fable 5 b16bbe82a6 The masthead wears its deploy stamp
A small yyyy.mm.dd.hh.mm mark beside the edition line, baked in at
build time — and the deploy builds moments before it ships, so the
stamp reads as deploy time.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
2026-08-25 14:34:06 -04:00
Eric WagonerandClaude Fable 5 ffd2cc7a82 The helm grows tappable: chevron strips ride the pane's edges
Milestone two opens with touch. Faint chevrons live along the pane's
four edges — left and right strips quarter-turn the camera (always),
top and bottom stride forward and back (your turn only, through the
same commands, cautions, and wall-bounces as the keys). Quiet under a
resting eye, brighter under a pointer, generous under a thumb.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-24 00:14:16 -04:00
Eric WagonerandClaude Fable 5 b8bb60cf6d Milestone one: the pane becomes the cockpit
FPV play begins. On your turn the pane takes the helm: arrows or WASD
— quarter-turns are free camera, a stride issues a REAL move command
through the same cautions and refusals as a board click, and a wall
bounces you with the table's own toast. While the player steers, the
director keeps its hands off the idle facings; your own magic still
turns your head, and cutaways still fire. The layout inverts to match
the mode: the 3D view is the primary window into the game, the
top-down board reduced to a keymap beneath it, with the control hint
in the pane's corner. Typing in chat is never hijacked.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-24 00:02:16 -04:00
Eric WagonerandClaude Fable 5 c7109fcddf The pane sits square on the board's shoulders
Eric's layout call: the first-person pane wears exactly the board's
width, directly above it. A shrink-wrapped column stacks the two, with
the pane held out of the intrinsic sizing (width:0, min-width:100%) so
the BOARD alone decides how wide the column is; the canvas keeps its
aspect as it scales.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 23:46:20 -04:00
Eric WagonerandClaude Fable 5 e6ef5f6315 First person comes to the living table (branch work)
A pane above the board plays the game through your own eyes while you
play it — the board below stays the tactical truth. One new module,
fpv/director.ts, extracts the reel's directorial instincts (the aim
ladder, the hurl test, the glide gatherer) so the replay and the live
pane share one eye and can never drift; Replay is refactored onto it
unchanged. LiveFirstPerson.svelte feeds the shared FirstPerson
renderer from the live event stream: every batch plays through the
same fx pipeline as the instant replay — projectiles, door swings,
conjurations growing — while the camera walks your strides, turns to
your aims and to actors in your sight, cuts away (with your own body
in frame) to deeds beyond it, and never idles nose-to-brick. Bodies
glide between server views. A ✕ hides the pane; the liveFp preference
(on by default) brings it back.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 23:29:03 -04:00
Eric WagonerandClaude Fable 5 2932d1e500 The instant replay graduates: on by default
The eye earned its place — every notable turn offers its reel unless a
player has switched it off, and an explicit off stays respected.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 22:27:56 -04:00
Eric WagonerandClaude Fable 5 be7c451437 Overlays paint around a body, not merely behind it
The per-column sprite gate blanked an overlay's WHOLE column wherever a
nearer body touched it — a treasure chest masked the warp veil all the
way to the ceiling. Each column now remembers its nearest sprite's
vertical span as well as its depth, and every overlay family (veils,
ghost walls, lintels, rising conjurations) draws in segments above and
below the covered band, sampling the matching slice of its texture — so
the shimmer wraps the chest instead of vanishing over it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 21:53:20 -04:00
Eric WagonerandClaude Fable 5 b235a7a9cd Overlays yield to the body standing in front of them
The warp veil painted over a wizard standing before the mouth — the
overlay passes ran after the sprites with no knowledge of their depth.
Each column now remembers its nearest sprite, and every overlay family
(veils, ghost walls, doorway lintels, rising conjurations) skips the
columns where a body stands closer, while still washing translucently
over anything beyond.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 21:46:27 -04:00
Eric WagonerandClaude Fable 5 7a32370ccb Credibility pass: the reel's scars sanded, the veil finally hung
Three blind reviews over the first-person arc, every finding verified
against the source. History-narrating comments made timeless or cut;
the stacked BUDDY comment collapsed to one voice. Dead code out: the
orphaned FACE copy, the DIR_ANGLE duplicate, the dead loop-counter
poke, the impossible-state sentinel. The never-produced "warp" hit
kind resolved the right way — warp mouths now hang a translucent veil
of the painted warp texture, so art that never rendered finally does.
Types tightened (SlabStrike named once, ShareData rides CatchUpStep,
botTier loses its casts), the gallery reads MATERIALS instead of a
hand-copied list, the chronicle resets through one helper, a
superseded share mint rejects instead of stranding, and the conjured
safe gains the growth key its siblings had. Tests lose a triple
assignment, a tautology, and two self-swallowing regex alternatives.
The sprite spec — which still told the artist to paint for additive
compositing the renderer no longer uses — now describes the renderer
that exists.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 21:41:11 -04:00
Eric WagonerandClaude Fable 5 88994f18a2 The winning line always wears the eye
One instant-replay eye per turn keeps the chronicle uncluttered — but
the turn that WINS the game is the turn people want to relive, and if
its wizard did something notable earlier, the eye had already been
spent by the time the crown line printed. The game-winning line now
carries its own eye regardless, fireworks and all.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 21:15:03 -04:00
Eric WagonerandClaude Fable 5 252d10711d The caption wears the actor's face
Every reel caption now carries the acting wizard's standee at its left
— the same token art the board plays with, framed in the caption's own
ink — and the burned-in video caption bar gets the portrait too, so a
shared clip names its actors by face as well as by name.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 21:07:45 -04:00
Eric WagonerandClaude Fable 5 f5151a0c99 Turn zero's eyes belong to the first player, even in the whole tale
Eric caught the whole-game reel opening in the wrong head: turn zero's
turnStarted fires in the deal, before any step, so the boundary scan
found nothing and fell back to the share's pov prop — the WINNER, whose
eyes then watched the first player's whole turn from across the maze.
When no boundary precedes the current step, the owner is now read from
the reel's first turnEnded, which turn zero always contains.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 21:01:25 -04:00
Eric WagonerandClaude Fable 5 4ee2a3e5d3 Dropped treasure is seen falling
treasureDropped and objectDropped played as nothing — the gold simply
teleported from chest to floor between frames. A drop now glints (the
spark blooming where it lands, a beat after the blow when combat
knocked it loose), and a wizard dropping at their own feet takes the
cutaway: a third-person shot of them setting the prize down — or
spilling it. When the reel's wizard strikes the spill loose from
someone else, the attack-facing already has the victim in frame, so
the treasure falls on camera.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 20:50:06 -04:00
Eric WagonerandClaude Fable 5 846cf56ffe A laden wizard shows their burden
A carried treasure rendered nowhere in first person — the thief hauling
your gold looked exactly like an innocent. The treasure now rides its
carrier at chest height, drawn just in front of their card (a sort bias
wins the tie), gliding along with their tweened strides and showing
through warp mouths like everything else. The workshop rehearses it
with ?carry=Rival.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 20:48:41 -04:00
Eric WagonerandClaude Fable 5 df20e35124 The camera audit: wherever the fx will play, the eyes already are
Eric asked what else happens off-camera, and the audit found a family:
a wizard's creature marching or clawing, objects dragged from afar,
punches (always same-square, so also invisible), treasure grabbed at
one's own feet, the Thumb of God's landing. Rather than patch each,
one rule retires the class: when nothing else aims the reel's own
wizard's step, the camera aims wherever the fx layer is about to play
its first impact or projectile landing — so every effect that exists,
and every one added later, gets watched by construction. Creature
marches and treasure grabs (which play no fx) get explicit aim rungs;
own-square deeds keep taking the cutaway.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 20:44:29 -04:00
Eric WagonerandClaude Fable 5 698e975b6d A summon at your own feet earns a shot of yourself
Two A9WK summons — fire imp, shadow — landed on their casters' OWN
squares: no turn can face your own feet, and a creature in your own
cell is closer than the near plane, so both materialized invisibly.
The aim now reads creatureCreated (the summon's true landing, whatever
the cast's target says), and a deed on the wizard's own square takes
the CUTAWAY: the camera steps outside, stands down the deepest
corridor, and — for cutaway frames only — the reel's own wizard
renders too, so you watch the imp grow at your own feet with yourself
in the shot.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 20:41:39 -04:00
Eric WagonerandClaude Fable 5 ccb5346a31 Hedges stay in their squares; the eyes turn to the lock they pick
Eric's rosebush-through-a-wall, hunted to two roots. A camera-facing
billboard viewed obliquely rotates out of its square, so cell-bound
volumes are now windowed to the exact segment where their plane
crosses their own cell — no end may paint beyond it. And the real
smoking gun: the near-bias that lets a hedge win the tie against the
wizard standing in it was applied to the OCCLUSION depth too, letting
the hedge cheat a fifth of a cell through any neighboring wall. The
bias now orders sprites among themselves only; walls always judge the
true depth.

Also answered: edge-deeds turn the head. Picking or jamming a lock,
unlocking with the Master Key, raising or razing or drowning a wall —
any edge-bearing deed by the reel's own wizard now aims the camera at
that edge's midpoint before the outcome shows, same as any other
target.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 20:28:24 -04:00
Eric WagonerandClaude Fable 5 285c91b2c8 Conjurations grow into the world, wrapped in glowing swirls
Nothing appears fully-formed anymore. Summoned creatures and conjured
terrain volumes scale up from a sliver, bottom-anchored, as if growing
out of the floor. Conjured SOLIDS — walls, firewalls, stone, and yes,
illusion walls for whoever they fool — RISE: while growing, the rays
pass over them so the room behind stays visible, and the renderer
draws the young face climbing bottom-up with violet swirls running
across it, solidifying as it tops out. Every creation also blooms the
shimmer at its cell. The growth is driven through the fx channel, so
the director's slate applies: things grow only once the camera faces
them.

Two camera notes squared away en route: the slate-setter read back the
state it had just written, registering itself as its own dependency
(an update-depth ping-pong under fast stepping) — locals now; and a
reel whose FINAL step strides into a corner gets one more turn after
the walk lands, to a view worth ending on.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 20:19:48 -04:00
Eric WagonerandClaude Fable 5 cd9ce9fddf Sprites respect the window they are seen through
DUKK's floor-to-ceiling white sliver, decoded: the sprite gate only
asked "did this column's ray warp?" — so a REAL body standing in front
of a warp mouth was clipped out of the mouth's columns (leaving a
baffling sliver of a huge close sprite), and a body virtualized
through warp A could paint columns bent by warp B. Every column now
remembers WHICH warp bent its ray and how far away that mouth stood;
a real body paints a column only nearer than its mouth (in front of
the window), and a virtual one only through its own warp's columns,
beyond the mouth. Projectile legs carry the same identity.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 20:07:41 -04:00
Eric WagonerandClaude Fable 5 045e868190 The outcome waits until the eyes arrive
Eric dispelled an object and it un-rendered off-screen, before the
camera had turned to look. The reel now sequences like a director:
each step the camera writes a slate — how long the PREVIOUS world
stays on screen while the eyes turn toward the recipient — and both
the view swap and the step's effects reveal together when the turn
lands. Cutaways hold a beat of the world-before too, so a thing
destroyed across the maze is SEEN existing, then seen ending. Cuts
that open the reel still reveal at once.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 19:56:21 -04:00
Eric Wagoner 9d59ac9ec1 Four more painted: the doorway dressed, harm cracked, roots laid, iron shut 2026-08-23 19:47:58 -04:00
Eric WagonerandClaude Fable 5 707297da17 Half the warp pairings were secretly mirrors
Eric walked a five-player board's corner warp and the world stretched.
The lane rule — carry the along-the-edge offset through unchanged —
is only correct for half the side pairings: for the rest (N to N,
E to N, and their kin, the ones five-player boards deal), the proper
rotation lands the entry axis head-to-head against the exit axis, and
preserving the raw lane smuggled a REFLECTION into the traversal —
rays crossing over at the mouth, parallax inverted, the far room
swimming. warpLaneMirrored computes the pairing's sign from the
rotation itself; castRay mirrors the lane where required, and
warpMotion anchors the far mouth at its opposite corner to stay the
same pure rotation — so sprites and projectile legs agree with the
rays again. The workshop grows ?players=2..6 to stand on any table
size (the mirror-class mouths live on the five-player boards).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 19:47:28 -04:00
Eric WagonerandClaude Fable 5 700db70d4e A cell-wide sprite is now actually a cell wide
Rubble drawn to span its gap stopped short of the posts, and the
ledger of blame is arithmetic: billboard widths scaled by the vertical
pixel ratio (H/depth) when horizontal pixels-per-world-unit is the
focal length over depth — about 1.4x larger. Every "one cell wide"
volume rendered at seventy percent. Sprites that declare an aspect now
mean WORLD width and use the horizontal scale, so rubble reaches post
to post and hedges brush both walls; plain square token sprites keep
their familiar pixel shape.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 19:39:26 -04:00
Eric WagonerandClaude Fable 5 5fc5805354 Odds, ends, and every missing effect: doorways dressed, victory earns its fireworks
The audit Eric called for, delivered whole. Open doors are DOORWAYS
now: stone jamb posts at both ends and a lintel hung across the top
(paintable as textures/doorframe.png), the way through open to the eye.
Battle damage shows — the engine's per-edge wallDamage wears painted
cracks into any wall, heavier as harm mounts. The wall safe stands as
a strongbox volume instead of a flat token. Hedges take root: an
underbrush floor decal covers the whole square beneath them (Eric's
report — a billboard at center depth can't reach the floor trapezoid's
near edge), and the hedge itself widens past the cell. Rubble
stretches across the fallen wall's full gap, corner piles landing at
the posts, exactly as its art was painted.

The first-person effect gaps close: victory now throws SIX fireworks
climbing over the winner's home with gold washing the screen; sector
rotations flash violet and heave the whole world; the Thumb of God
lands with a burst and a shudder; walls conjured from nothing rise in
stone dust; and every hazard pratfall plays — pit falls (with a dark
drop and jolt for the faller's own eyes), ooze slips, tack yelps,
thorn snaps, slime, dust. Dying in first person fades long and dark.

And the whole tale travels: a finished game's full replay carries the
share button too — turn -1 mints a link to every turn of the game,
each through its wizard's own eyes, titled for the winner's triumph.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 19:32:42 -04:00
Eric WagonerandClaude Fable 5 a94ab5c6f5 A cut is not a stride
The wraith reel still ended in a wall, and the ledger showed why: its
final step CUTS home from the cutaway at the summon site — a nine-cell
leap — and the camera read that leap as a walk, faced along it into
the masonry, and counted itself aimed, which silenced the closing-shot
rescue. Leaps no longer set facing: any step that will cut computes
willCut first, strides only turn the eyes within a stride's reach, and
a cut that lands with nothing aimed always re-picks its view from the
new position. The wraith turn now closes down a corridor with the
wraith itself in frame.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 19:19:33 -04:00
Eric WagonerandClaude Fable 5 59c25f42f0 The closing shot finds something worth looking at
A reel that ends nose-to-brick ends badly — especially recorded. On
the final step the idle-gaze rescue raises its standard (a wall inside
1.2 cells is a bad last frame) and scores the four cardinals by more
than corridor depth: a visible wizard or creature weighs most, loose
treasure half, each behind a real line-of-sight check. The camera
turns once to the best view and only if one clearly beats what it has
— a wizard walled in on every side keeps its poor view rather than
hunting forever.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 19:14:25 -04:00
Eric WagonerandClaude Fable 5 765828700d Reel captions keep the count, not the cards
"You draw Waterbolt" belongs in the chronicle, not on a replay whose
canvas gets recorded and passed around — the reel's captions now skip
the private-draw events (drawn, dealt, stolen) and say only how many.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 19:11:09 -04:00
Eric Wagoner 19558c62af Ten terrains painted: the maze grows thorns, jello, and falling light 2026-08-23 18:56:02 -04:00