- a hunter's or warlock's pet has its action bar now: attack, follow, stay, the pet's own spells with cooldowns and autocast sparkles
- the macro system lands: the macro window, the icon chooser, /cast and /macro, and macros dragged onto the action bar
- hunter shots look right at last: the bow draws and releases on the shot, and the arrow lays a spark trail its whole flight
- the options window re-dresses in 1.12's own art with the classic dialog look, and gets a working search box and clickable steppers
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- one era-style Options window: window chrome, category list, search box and its own ESC rung, with the game menu reshaped to match
- settings are real CVars now: GetCVar/SetCVar reach Lua, and your changes persist as a diff in benilla/config.toml
- all local state lives in one visible benilla/ folder beside your Data/ — nothing hides in platform config dirs
- UI text stays crisp at any scale and survives a mid-session resolution change: glyphs measure in the environment they raster in
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- the spellbook draws the cooldown pie on a spell that's cooling down, and the active form's slot lights its checked ring
- shader variants warm at startup (with a tripwire if one ever compiles live), so a first cast no longer hitches on shader compile
- additive glow stacks clamp the way the original scene does, taming Frost Nova's blown-out mist, and shoulder cards split only at rigidly separable bones
- the login handshake now reads the same under both SRP encodings, and cooldown events no longer race the net step
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- stealth reads as stealth now: the body fades to the reference's 30 % and creeps with the proper stealth walk and stand poses
- the item and enchant glow subsystem exists: permanent weapon glows and enchant visuals show in the world and at character select
- the character-select background's colour banding (the reported "16-bit" look) is fixed at the render target, and the tauren stage's black corners with it
- aura body tints got a real per-instance channel, so a spell can tint the whole unit without touching its neighbours
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- The login screen stops paying for a world nobody is in. It had been
streaming and simulating all of Elwynn Forest behind a static image — the
client began life as a terrain viewer and the streamers never had an off
switch. The world now boots when you enter it, aimed at the map your
character is actually on, and logging out releases it. Login frame cost:
p50 18.6 to 10.3 cpu ms, worst paced frame 308 to 20 ms; entering
Stratholme is a covered 1.2 s load.
- More login-screen honesty: the fullscreen glue image was re-uploaded to
the GPU every frame — 22 MB a frame for a still picture — and the
braziers' fire had been invisible since the 25th, simulating perfectly
into a camera that is off, because two booths had computed the same render
layer. Both fixed; the flames are back.
- Indoors got truer: the outdoor world draws only through the portal windows
actually in frame, as the original does; the painted-skybox gate settled
on the reference's real rule — any sky-flagged room the portal flood
reaches; and interior objects — gates, hanging signs, chains — take their
room's baked light, anchored at their box centre instead of an artist
pivot that often sits under the floor.
- Hovering with a tooltip up takes its full fix: a tooltip content change
used to run the whole-UI layout solve twice, and it runs once now, on top
of the morning's fix that made an unchanged tooltip cost nothing at all.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- The voidwalker's eye glow vanished whenever the camera rose above eye level.
Three investigations said depth; measuring the depth buffer inside the live
quads said otherwise — the fragments reached the framebuffer every frame, and
the body's own transparent batches painted over them. The real client draws a
model's particles after that model's batches, always. Ours now does: every
effect carries a draw-order rung sized to clear exactly its own model.
- Widened to every effect family after asking "what else does this fix": ribbon
trails (a wisp's streamers wove six batches deep into its own body and
flickered as the head whipped) and 3-D model particles (Cone of Cold's
shards). A census over all 9,691 models found 967 whose own body could paint
over their effects; all take the rung now.
- The skinning lane is ours end to end: every rig's joint matrices live in our
shared GPU buffer, written only when a rig actually moved, and our shader
reads them. The engine's lane rewrote the entire joint buffer every frame and
swept every entity in the world for changed transforms — that machinery now
runs against empty sets. Another 6.7 CPU ms off the worst reported dungeon
spot, which now holds a flat 60 fps with p99 under 19 ms.
- Getting around while developing: Ctrl+Cmd+G lands your character where the
free-fly camera is, and Alt-clicking the world map teleports you there (both
ride the server's own teleport, GM-gated). The frozen-body coordinates the
panel used to copy while flying now follow the camera.
- A stuck main thread now diagnoses itself: a watchdog samples our own stacks
and prints where the time went, and a hung teardown names its last system
instead of hanging the window.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- The dungeon framerate reports were right about the mechanism: the cost is
CPU-side and it scales with NPC count, not with what's drawn. Two per-unit
lanes were each 30–100x more expensive than the work they do. Measured at the
reported Lower Blackrock Spire spot: 29.7 ms/frame, 72 CPU ms, before.
- "Which room is this NPC in" scanned whole dungeon groups triangle by
triangle — a spire stacks several 15k-face groups into any vertical column,
so 37 moving NPCs cost 1.2 million triangle tests per frame. Each group's
faces now sit in a column index built at load; same verdicts (pinned by
exactness tests), 88k tests, the lane drops from 11.3 ms to 1.1 ms.
- Animating one creature cost ~190 microseconds per frame in generic per-bone
animation machinery — hash lookups and boxed curves per bone, mostly to
produce constants. A direct pose evaluator now does the same math into the
same joints for ~16 microseconds per rig, checked bone-for-bone against the
old output across crossfades, overlays and masks. The reference animates
every in-range unit with no view cull, and now so can we: a raid's worth of
animating rigs (~450) costs ~4 CPU ms where it used to cost ~85.
- Net at the reported spot: a flat 60 fps. The performance probes also learned
to report CPU work (ms and %) instead of wall-clock fps, which is what makes
these numbers repeatable on a busy machine — and comparable to the Mac
report's own units.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- One text-input law for every field. Login, character create and the delete
dialog each improvised their own tiny keyboard handling — no caret movement,
no selection, no clipboard, and Ctrl/Cmd+V typed a literal "v" into the
password box. All of them now run the same byte-verified edit-box law as
chat: clipboard, select-all, word moves, shift-selection, the real 0.5 s
caret blink. The password box masks what you copy off it, like the original.
- Copy/paste on Linux had two independent causes, one per direction: our window
is Wayland but the clipboard backend spoke X11 only, and a copy relinquished
the X11 selection the moment it returned (an X11 clipboard lives only as long
as its owning connection). Both fixed — Wayland windows get a real Wayland
clipboard, X11 keeps a held handle. AltGr is not Ctrl anymore either, so
Polish and German layouts can type ą, ć and ź in chat instead of triggering
select-all. Compile-checked on Linux; wants a real-session retest.
- The exterior sun keeps its colour. A per-channel clamp saturated the warm
continental sun to pale yellow-white on every sunlit fence, post and doodad;
the clamp now happens once, at the sum, so the fiery orange survives — the
reported Silverpine fence and Blackrock steps match the reference's own
arithmetic.
- A pool has a floor. Undercity's upper slime channels claimed the dry room a
storey below them — 115 yards down still read as submerged. A pool now stops
at its own room's floor; a sweep of every building in the shipped world found
51 such stacked sites across 6 buildings, all closed.
- Ctrl/Cmd+Z hides the whole UI layer for clean screenshots, and instrumented
debug runs open their window in the background instead of stealing focus.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Other players walk the world. A watched player's motion between server updates now runs through
the same grounded movement resolve as your own character — same capsule, same colliders, same
step-up and ground election — so they follow terrain every frame instead of every packet, and
stop at a wall instead of walking into it and being snapped back. Their jumps are swept against
the world too, and a standstill jump steered mid-air reports that steer, the one mid-air press
the reference client broadcasts rather than defers.
- The move relay rebuilt: relayed moves ride a per-unit chain on real time, a due move never jumps
ahead of its unit's queue, and SMSG_COMPRESSED_MOVES — the batched carrier the server sends under
load — is decoded rather than skipped. Our own send path now matches the reference client's:
facing streams while moving, Nagle is off so each packet is one write, and the strafe axis nets so
left and right can never ride the same packet.
- NPC and quest text speaks the whole $-macro grammar, carved from the reference bytes — your name,
class and race, the gendered forms, and the server's live world states — and the same
substitution feeds gossip, quest text, the quest log and unit frames. Greetings are a weighted
draw, rolled per NPC per open, and a quest giver with no quest to give is no longer clickable,
where it used to open a dialog holding nothing but a placeholder greeting.
- Spell tooltips finish the reference's line law: cast time and cooldown behind the real passive
gate, the required tool or form, the reagents block, the chance-to-X line, a multi-bit
equipped-item requirement named properly instead of by raw bits, and a buff's dispel class.
- The UI layout engine got a dense, reusable anchor solver, and a change gate that skips the resolve
entirely on frames where no layout input moved — in practice, almost every idle frame. Pets are
named by their pet number rather than a creature-template entry, so the client asks the query the
server can actually answer. And the asset extractor grew a stray-geometry census for tracking
down geometry that renders where it should not.
This snapshot replaces the six dated `sync` commits that stood here before it, whose subjects said
nothing but the date. If you cloned before now: `git fetch && git reset --hard origin/main`.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>