- Decode 5-bit character progression from MCP 0x19 33-byte statstring via
(statBytes[27] >>> 1) & 0x1f per D2Game.dll CLIENTS_FillCharacterPreviewInfo
(0x6FC32810) and Fog.#10085 FOG_Encode14BitsToString, fixing doubled
progression values in parseMcpCharStatString and charSummaryToRosterCharacter.
- Do not trigger spurious [D2MissingArt] reports in LevelView enrichDraws or
WorldRenderer wall drawing on legitimate blockCount === 0 collision/marker
DT1 tiles (such as baallair\floor.dt1 tileIndex=109 in Worldstone Keep L2).
- Add regression tests for progression decoding and 136-level zero-missing-art
LevelView construction.
Closes#738Closes#739
- Align plugins/README.md, src/client/README.md, and README.md with actual plugin architecture, file inventories, and test paths
- Rethrow initial repository read failures in StatsPage.init() and expose ready: false on window.__d2StatsApp in bootStatsApp()
- Remove duplicate PLUGIN_CONFIG_STORAGE_KEY storage listener branch in src/client/plugin-host/api.ts
- Serialize cross-tab reload reconciliation onto record.queue and unconditionally clear record.error in resetAllToDefaults()
- Align localized strings in plugins/kill-stats/index.ts with plugin contract
- Extend tools/verify-plugin-menu-browser.ts with Steps 4-7 (corrupt JSON alert banner, raw storage preservation, and reset recovery)
- Add comprehensive unit tests in plugin-config-store.test.ts, plugin-menu.test.ts, plugin-host.test.ts, kill-stats-view.test.ts, and registry.test.ts
TAG=agy
CONV=2cf150d5-78df-48ac-be0c-42ef1694a004
- Decouple discrete simulation stepping (missiles, overlays, frameCount) in ClientWorld to fixed 25Hz ticks (40ms) via accumulator, preventing animation speedup at high refresh rates (120Hz/144Hz/240Hz).
- Continuous movement interpolation for moving units using exact (safeDt / 1000) * 10 without Math.max(1, ...).
- Guard held mouse / repeat clicks from interrupting active cast animation every 100ms via CommandMapper.isPlayerBusyCasting.
- Preserve locally-predicted cast timing and avoid animation restart when server 0x4C SkillCast echo arrives.
- Drive fallback cast overlay in unit-drawables using elapsedTicks and animRate instead of global display tick.
- Add comprehensive vitest coverage in tests/client/char-anim-speed-loop.test.ts.
- Translate HUD mouse-move, click, drag, and drop coordinates across all 4 viewport profiles (800x600, 1024x768, 1068x600, 1280x720) using toControlBarLocal, toLeftDockLocal, fromLeftDockLocal, toRightDockLocal, and fromRightDockLocal
- Make HudManager.leftPanel and HudManager.rightPanel getters/setters that keep charSheet.visible, inventory.visible, and skillTree.visible synchronized on direct assignment (e.g., HudModel.syncFromWorld)
- Draw SkillTreePanel tooltips on the top-most HUD tooltip layer with minLocalX = 8 - deltaRight so they are never occluded by the bottom control bar/globes/belt and never clamp over column-1 skill nodes on widescreen viewports
- Swap belt.draw before hotkeys.draw so right-hand speedbar popups and skill tooltips render above the belt
- Route both left-click and right-click on HUD regions in CommandMapper.handlePointerDown to HudManager.handleClick
- Reverse-translate Mercenary, Trade, and Quest Reward (Imbue/Add Sockets/Personalize) left-dock item hover tooltips and clamp NPC dialog menus, Area Entry Banner, and Death Overlay against active viewport dimensions
Closes#557Closes#542