- ice block freezes the body the frame it lands, before the arm even rises
- the loot message links the item, so the name wears its quality colour
- a looted item drops into the bag that actually took it
- effect models live their authored life, born, held, decayed, and bar fills sit under their borders
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- a stealthed unit's particles and ribbons now dim with the body, and a depth-prime pass stops overlapping translucent parts from darkening each other
- changing gear re-dresses the character in place instead of tearing the whole model down and rebuilding it
- terrain tiles furnish cell-by-cell and model render forms build paced across frames, so first contact with fresh ground no longer hitches
- Ghost Wolf renders properly ghostly, and a live toggle swaps its action-bar icon to the active form while it holds
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>
- terrain draws per chunk now, and one authority culls everything outside: buildings, billboard cards, particle emitters
- the fps and memory creep on long flights is fixed twice over: material animations only tick what something draws, and far-away art is released by distance (with a 30 s dwell floor so fast cameras don't thrash it)
- the second crash ever reported (a cast racing a despawning unit at flight speed) is fixed, with a regression test that reproduces the exact panic
- every build now prints which commit it is, so a bug report can say exactly what it ran
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- The keyring is built. Your first key makes the keyring button appear by
the bags, opening the window the original keeps its dungeon keys in — the
server had been sending the keys all along; nothing had ever shown them.
- Keys open their doors now. The client used to cast the open as a bare
spell, which the server rightly refuses; it now sends the item-use the
original sends, carrying which key from which slot. The tooltip plays
along: "Locked" turns the soft green when something you carry opens it,
and a key stops inventing a "Use: Opening" line it never had.
- A building can own the sky: a WMO can name its own painted skybox, and
Stratholme's burning city now draws its near-black-to-red dome instead of
the zone's khaki gradient. The exact rule for when it applies settles in
the next snapshot.
- Signpost tooltips follow the cursor again — the tooltip anchor forks per
object class, corner for doors, cursor for signs — and the Blasted Lands
lightning stops striking the same spot for ever: a placed doodad re-rolls
its animation variation every play-window, like the original.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- The second half of the open-door fix: the system that applies a door's
state to its collider had never run once. The state arrives with the
spawn, the collider is baked from the model hull frames later, and the
reconcile demanded both in the same frame — so every door kept the solid
collider it was born with. Open gates and forcefields are walkable now,
and the inspector prints solid-or-passable out loud.
- The mouseover follows the original's law: an object you cannot use — in
use, waiting on a quest, or hostile-faction scenery like the enemy's own
doors — shows nothing at all on hover. No tooltip, no highlight, no
cursor. Each object type answers for itself, the way the real client
dispatches it.
- Dun Morogh's snow trees lose their white plates and hard creases: model
textures authored clamp-to-edge were all sampled repeat-wrapped, so a
canopy's deliberate out-of-range margin wrapped back into opaque texels.
The sampler honours the authored address mode now, on this tree, a bad
bush, and hundreds of models like them.
- Odds and ends: the Blasted Lands lightning can actually strike (its
emitters sampled an animation slot that is silent for that model),
donation turn-in quests show their real Continue panel, boss emotes expand
their $name macros, and a rare one-in-256 login failure — a session key
the client hashed differently than the server does — is gone.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Entering the world used to show an uncovered, movable world before the screen
came up — seconds of it on a slower machine ("like the Stormwind intro
video", as one report with video put it). The screen also cleared onto bare
terrain with the buildings still streaming in, and could hang forever if you
arrived swimming or flying. It has a real lifecycle now: it rises at the
entry edges (character pick, transfer, teleport), clears only when the scene
is actually presentable — terrain, buildings, props and their collision all
resident — and its physics hold releases in every movement mode, not just
walking. The progress bar counts buildings too.
- A far teleport flashed a frame of the destination before the screen rose.
The "swap never flashes" guarantee existed only in comments — a streamer
rework had silently dropped the scheduling constraint that enforced it; it
is structural now. And logout got its missing cover: the original's plain
black cut, not a frame of torn-down world.
- Animation parking now governs everything with a rig. ~350 animated objects
(braziers, doors, chests) were sampling their loops off-screen forever, and
a patrolling parked mob kept writing pose data nothing could read — ~620 rig
refreshes a frame became 7, and creatures in rooms the camera can't reach
through any portal park too.
- The engine's own tax got measured: bare Bevy spends ~3.9 CPU ms a frame on
this machine drawing nothing at all, which resets what "fast enough"
honestly means for everything built on top of it. A shipping build profile
(fat LTO) landed alongside — worth about −1 ms at the pin, kept out of
everyday builds.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- An honest correction first: the previous snapshot's message announced the
owned skinning lane, but the code itself missed that snapshot by minutes —
two sessions landed at once and the export carried the older tree. The
skinning lane actually ships here, together with its follow-up.
- The follow-up is the bone-entity collapse. A creature's ~75-bone skeleton
existed as ~75 world entities, each paying transform propagation and
bookkeeping every frame, to serve the ~5 bones anything actually hangs off
(held weapons, glow emitters, the mount seat, overhead markers). A rig's pose
now lives in plain arrays on the model itself; only the consumer anchor
points remain as entities. At the crowded dungeon spot ~59,000 entities
became ~28,000 anchors (80k total → 50k), palette uploads coalesce into a
handful of writes, and another ~3 CPU ms came off the frame.
- The movement echo the server sends about your own character is applied now,
the way the original client always applied it — groundwork that GM flight
cashes in later today.
- The capture harness pins its clock per frame now, not just its frame count —
a slow run used to drift every animation out from under a golden image.
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>
- A pool belongs to a room now. Uldaman read as deep underwater because a
mushroom cave's pool 186 yards up claimed every position beneath it forever;
Undercity's NPCs swam on dry stone because Tirisfal's lake — 95 yards of rock
overhead — still answered for them, and the camera took the whole screen
underwater with it. Every liquid query (player, camera eye, every unit) is now
scoped to the building that owns the water, verified against the real 1.12.1
files at both reported spots.
- Druid forms work. A live display change — shapeshift, GM morph, revive — was
only ever read at spawn; now the model swaps instantly and a size change eases
over the real client's two seconds. A bear-form druid shows no weapon, exactly
like the original: only a character body attaches held items.
- 126 NPCs across the world were bald and earless. An amulet's display row sits
in their head slot, and its "tuck the hair under the helm" mask fired with no
helm to tuck under. A mask now needs an actual helm model; the gnome suppliers
get their pigtails, ears and earrings back.
- The pouring lava in Blackrock Mountain and the Great Forge came back. A prop
that spans several rooms (a lava fall is named by up to 19) was culled with
only the first room that names it, so it blinked in and out by camera angle.
A prop now draws while any of its rooms is visible.
- The Undercity entrance lightshafts dim to their authored 10% instead of
flooding the throne room with blinding white columns.
- An indoor pool fogs with its room now, instead of hazing with the outdoor
scene while the wall beside it hazed with the room. Magma and slime take fog
too — "fullbright" in the data meant unlit, never unfogged.
- Backing the camera out through the Deadmines entrance swirl no longer blanks
the whole dungeon: the sealed pocket behind the portal has a detail-only
floor the room-finder couldn't stand on, so it declared you outside. A third
fallback leg now names the room from the camera-collision faces.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Twenty of the game's forty-three maps are not made of terrain at all — Molten
Core, Onyxia's Lair, Dire Maul, Gnomeregan, Uldaman, the Deeprun Tram and both
Blackrocks among them. Their whole world is one building named by the map file,
and that line was being thrown away, so those maps loaded nothing and a teleport
in fell forever. The building is now placed as an ordinary WMO placement — so
collision, props, liquid, interior lighting and portals all come along on the
existing path — verified on seven of the twenty against the server's own
independent floor heights.
- Particles keep the model's time. Emitter rate and on/off now bake per animation
sequence and follow the clip that is actually playing, so a quest object's
explosion choreography no longer burns at full roar while the object idles. And
the flipbook cell ramp is computed the way the reference computes it: sheets
that play backwards no longer crash the client (a certain Winterspring brazier
fired this on every approach), the tail streak reads its own ramp instead of the
head's, and the per-segment repeat count works — the Insect Swarm's wings
finally flap.
- A culled dungeon room takes its furniture with it: lanterns, crates, barrels and
cobwebs now cull with the WMO group that owns them, instead of hanging lit in
the void where their room used to be. The group's own liquid goes along too.
- Under the floor: the archive chain pins that a file the patch deletes can never
fall through to the stale copy in a base archive — a silent failure mode that
would serve deleted content looking perfectly healthy.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Area triggers exist now, so portals work: every teleport pad, dungeon entrance
and enter-a-place quest volume reports the reference's own way — one exit latch,
first containing volume on the map wins, a sphere or a yawed box. Verified live:
Rut'theran to Darnassus, the Deadmines worldport, and a level-gated entrance
refusing with the server's own "You must be at least level 10 to enter."
- GameObjects animate. Every animated object arms its idle the moment it goes live
(doors and chests used to flash bind pose for a frame), a missing rest pose is
remapped the way the reference remaps it instead of playing nothing — the
Ahn'Qiraj gate's root tangle stood frozen for want of a Closed clip — and the
state machine covers the verified twenty of thirty-one object types instead of
three: fourteen hundred spawns' worth of traps, goobers, books and questgivers
now change pose off the wire.
- The flickering tent is still. Cloth you can see from both sides is authored as
two reversed copies of the same sheet, and the real client backface-culls each
copy from its wrong side so exactly one covers any pixel; we drew every building
batch two-sided, which left the winner to floating-point noise, flickering while
the camera crept. WMO materials now honor their cull flag.
- A sweep of long-standing visual bugs: effects respect the far-clip wall — a
ferry's deck lanterns were drawing from 7,000 yards away; the night-elf eye glow
goes out in first person instead of leaving two orbs burning in mid-air; the
goblins' stray white hair tuft is gone (a duplicated table key resolved last-wins
where the client scans first-wins); lava and slime finally have their own
submerged view — the dense fiery orange and dense green of the real thing, off
two fixed lighting rows nothing in the zone data points at; and the far-horizon
band overlaps the detailed terrain instead of leaving a strip of sky at lowered
view distance.
- Two caught at the keyboard: the backpack icon greys instead of vanishing while
the escape menu is up, and the world map is a real panel now — it can no longer
open over the menu, and ESC closes it first like everything else.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- The main menu bar's two empty recesses fill. The micro menu — the eight arched
buttons: character, spellbook, talents, quest log, socials, world map, main menu,
help — sits in the dark panel between the page arrows and the bags, transcribed
from the reference's own layout: the character button wears your portrait, a button
holds itself down while its panel is up, and the talent button appears at level 10.
The latency meter fills the one slot the bar art leaves transparent for exactly it,
tinted green/yellow/red on the reference's 300/600 ms thresholds and drawn UNDER
the bar art, seen through its window, the way 1.12 actually does it. The socials
and main-menu buttons find their panels one snapshot later; help still waits.
- The UI explains itself on hover: 1.12 ships its detailed two-line tooltips ON — a
FrameXML default, not the opt-in extra it is often remembered as — so the micro
buttons, your own portrait, the XP bar, the five bag buttons and the ping meter
all answer a hover with the reference's own explanations.
- The PvP flag, end to end: crossed swords on the player, target and party frames,
driven by the two descriptor bits the wire actually carries, and `/pvp` speaks —
the yellow toast plus the system chat line, the OFF sentence being the one that
warns the flag lingers for five minutes. It really does linger: turning it off
waits out the server's timer, which looks like a bug and is the reference.
- Quest markers stopped freezing. The grey `!` over a questgiver above your level
goes gold the moment you ding, an NPC re-entering view is asked afresh instead of
wearing a session-old answer, and the marker drops when the questgiver bit goes
off — the re-ask triggers mirror the reference's own set, plus one named addition
(your own level changing).
- Water and heights: swimming downhill no longer bounces between swim and fall ten
times a second — the surface line is a two-sided constraint, so the swimmer
settles with the river instead of being left behind by it. And collision height
is per-unit now, read from the unit's own model: a gnome used to swim with a
third of a yard of water over her head because five depth lines were quoting a
human's number.
- A round of pixel honesty in text and chat: the newest chat line no longer wears a
wider drop shadow than every line above it (shadows move in whole pixels now),
keeps its descenders, and hover boxes stop painting over the chat body. The chat
input's history browse survives programmatic edits, a failed script chunk warns
instead of vanishing, and recall deepens to 64 lines. Idle animation got honest
too: a model's idle is Stand resolved through its own lookup table — never
file order, which had the duel flag bobbing on its spawn clip — and an armed idle
is culled on the box its animation authors, not the bind pose, so the flag stops
vanishing at most camera angles.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Duels. Challenge another player from their right-click menu, or with `/duel`, and
`/forfeit` to give it up. Both popups are there — the challenge you accept or decline, and
the warning when you leave the field — with the flag countdown between them, and the outcome
printed in chat when someone is knocked out or flees. Read off the reference client's own
duel packets and the three globals it keeps client-side, which is why the challenger reads
"You have requested a duel." even though the server never echoes that back.
- Inspect. Right-click a player and open their paper doll: their nineteen publicly visible
equipment slots with icon, name, quality and a linkable item, and their body standing in
the pane, which follows along if you retarget while the window is open. No stack counts and
no durability — those are not fields another player publishes, which is exactly why the
reference client's inspect doll has never shown them either.
- Water knows where it stops. Swimming used to trigger in the dry tunnel thirty yards under
Stormwind's canal, and in mid-air over Blackrock's lava. A liquid is now the grid the map
file actually stores — one wet flag per cell, and the surface height a bilinear over the
four corners of the cell you are standing in, the same sample the reference client takes —
so the water starts at the bank and its surface sits where your eye puts it. Lava is a
liquid you swim in, an indoor liquid asks the building you are inside, and `/liquid` prints
every surface claiming your feet and where each one came from.
- Creature parts authored to appear only on death — the voidwalker, the banshee, the ooze,
the stone elemental, the infernal — were drawing the whole time: material alpha now bakes
per animation sequence and the unit lane actually evaluates it. The character and inspect
model panes are lit by the reference widget's own single light instead of blowing out white,
the rotate arrows spin while you hold them, and the transparent sort ladder had its sign
backwards, so overhead names draw over water again instead of being painted out by a canal
behind them. Underneath, the protocol writer's 95-verb drawer and its thousand-line spell
module split into per-family files — no behaviour change, just a tree you can find things in.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>