Changelog¶
Player-facing changes only — internal refactors, test-only commits and doc-only commits are skipped unless a release shipped nothing else. Full commit history: GitHub compare view.
v0.2.3 — 2026-10-31¶
Stable release of the 0.2.2 and 0.2.3 betas (details in their entries below).
- More headroom in crowded fights: the game's locks and clock reads are 3–4× cheaper on a real console (Act V patrol: 6 % less work per frame).
- No more sound crackle or dropouts in crowded fights (output limiter, audio thread moved off the graphics core).
- Short presses are no longer lost when the frame rate drops, and a quick tap of the aim button attacks/clicks once (reported fixed by a player on console with 0.2.3-beta).
- The app version shown by the Vita now follows the release (
APP_VER00.23 instead of 00.00).
v0.2.3-beta — 2026-10-17¶
- No more sound crackle in crowded fights. With 10+ sounds at once
(Frost Nova in a pack, Baal's Throne) the mix went past full scale and was
clipped; an output limiter now lowers the whole mix for a moment instead.
D2_SONLIMIT=0inenv.txtrestores the old behaviour. - No more sound dropouts in heavy scenes: the audio thread moved to a
core where the graphics flush no longer delays it (
D2_SONCPU=1restores the old placement). - Short presses are no longer lost when the frame rate drops: every button and touch change between two slow frames is now seen, and a quick tap of the aim button attacks/clicks once.
Validation: sound — console (limiter: 7 passes, clipped samples ~49 000–500 000 → 16–399 per pass; audio core: 6 Baal's Throne passes, late sound packets 2/47 → 0/0; no fps cost on the Act V patrol). Controls — host tests and qemu with a simulated slow game (12/12 presses seen at ~3–5 fps, was 4/12); not yet tested on a console, please report how it feels. Freezing sound and the Maggot Lair freeze were not reproduced.
v0.2.2-beta — 2026-10-15¶
- More headroom in crowded fights. The game's locks and clock reads
(thousands per frame) no longer go through the runtime's global lock when
nothing else holds them: each call is 3–4× cheaper on a real console.
The Act V patrol needs 6 % less work per frame (22.7 → 21.3 ms); in heavy
scenes such as Baal's Throne with
/players 8the saving is larger in absolute terms (estimated ~3 ms per frame), which turns into fps where the game was dropping below 25. If anything looks wrong, addD2_FASTSYNC=0toenv.txt.
Validation: console (microbench and 3 vs 3 Act V patrol passes; the Throne passes did not land on comparable scenes, so the heavy-scene figure is an estimate); qemu (identical pixels and clock sequence). Online play was only checked against a local test server (login, lobby, game creation): please report anything odd on Battle.net.
v0.2.1 — 2026-10-09¶
Stable release of the 0.2.1 betas (0.2.1-beta and 0.2.1-beta2; details in their entries below). No change since 0.2.1-beta2.
- Smoother heavy spell scenes. Frozen Orb spam went from ~22 fps to the
game's 25 fps cap on a real console, with ~3 ms of headroom left per
frame: the Perspective floor tiles, missile lighting, the light-grid
rebuild and the floor texture bind now run natively. Each part can be
turned off in
env.txt(D2_F3NATIF=0,NATIVELIGHTDISC=0,NATIVELIGHTDYN=0,D2_GRIDCACHE=0,D2_F3TEXNAT=0). - The music volume is kept between launches. If yours is at 0, set it once more in Options → Sound.
- An old kubridge (before 0.3) no longer crashes the game at startup: a "TOO OLD" notice is shown and the game runs without it.
- Settings panel on the title screen (formerly "Controls"): a new
Game tab for the main
env.txtoptions, applied at the next launch.
Install the whole VPK (it ships the glide3x.dll the texture speed-up
needs). Validation: performance measured on console on the Frozen Orb bench
only (the Act V patrol was not re-run); music fix checked on console; the
kubridge check confirmed on console with kubridge 0.3.1, the old-kubridge
case taken from a player's crash dump; the Settings "Game" tab is tested on
the host only.
v0.2.1-beta2 — 2026-10-06¶
Two fixes on top of 0.2.1-beta:
- The music volume is kept. It was reset to 0 at every launch (D2 "restored" a volume it had never saved when the window got activated). If yours is at 0, set it once more in Options → Sound; it now stays.
- An old kubridge no longer crashes the game at startup. kubridge before 0.3 is loaded under the same name but lacks what D2Vita uses: the game closed with a C2 error right after launch. D2Vita now shows "KUBRIDGE PLUGIN TOO OLD (needs v0.3 or later)" and runs without it. Install kubridge 0.3.1 and reboot to get the full JIT cache back.
Validation: the music fix is checked on console (volume 50 kept, reset to 0 before) and with qemu (keyboard still works). The kubridge check is confirmed on console with kubridge 0.3.1 (still detected and used); the old-kubridge case comes from a player's crash dump and was not reproduced on hardware.
v0.2.1-beta — 2026-10-06¶
- Smoother heavy spell scenes. A level-99 Sorceress casting Frozen Orb
non-stop (dozens of orbs and ice shards on screen, each with its own light)
went from ~22 to the game's 25 fps cap on a real console, with ~3 ms of
headroom left per frame. Four more pieces of the game's own code now run
natively instead of translated x86: the Perspective floor tiles (was
opt-in, now on by default), the lighting of missiles, the light-grid
rebuild, and the floor texture bind. Every one is checked byte for byte
against the game's own result. If something looks wrong, each can be
turned off in
env.txt:D2_F3NATIF=0,NATIVELIGHTDISC=0,NATIVELIGHTDYN=0,D2_GRIDCACHE=0,D2_F3TEXNAT=0. - Settings panel on the title screen (the "Controls" tab is renamed
"Settings") gets a third tab, Game: resolution, 640 zoom, menu shape,
HUD fill, ladder runewords, Akara reset, sound, auto keyboard and its
opacity, private servers. Only the options you change are written to
env.txt; they apply at the next launch.
Install the whole VPK: the speed-up of the floor texture bind needs the
glide3x.dll shipped inside it (an old one simply falls back, slower).
Validation: the performance figures are console measurements on the new
Frozen Orb bench only — the Act V patrol was not re-run with these
defaults. The Settings "Game" tab is tested on the host only and has not
been run on a console yet. Feedback welcome.
v0.2.0 — 2026-10-03¶
First release of the 0.2 line: the new controller scheme and the aim assist are no longer experimental. Everything below is the sum of the 0.1.14–0.1.22 betas since the last stable release (0.1.13); the details are in each beta's entry.
- A new controller scheme with an aim assist. The right stick is a free
cursor; L (the aim button) walks to and attacks the best target — monster
nearest the centre of the aim cone, object, item, level exit or your
corpse — and does a plain left click when there is none. Hold Square and
press L to pick up the highlighted item. Remappable, with an
l+layer. - The Controls panel on the title screen is an editor. Reassign any
button (plain, with R, with L) and tune the aim cone, monster and object
reach (
hostile_reach), cursor speed, deadzone and walk rings by touch or D-pad; closing it saves only what you changed intocontrols.txt. controls.txtis friendlier: a fully-commented reference copy ships in the VPK, a bad line is named inboot_progress.txt, out-of-range numbers are refused,diamond=offhides the aim marker.- Display fixes: inventory, stash and character panels centered by default, multi-row belts no longer flicker, menus no longer cropped after a game played at 640×480, touch offset fixed in game.
- Two optional single-player options (off by default) — see v0.1.17-beta.
Validation: the pad logic and the panel are covered by host tests (ASan / UBSan) and the runtime by the qemu-arm boot gates; the aim assist was confirmed on console in the Den of Evil only, and the Controls editor, the cone targeting and the no-target click have not been run on console yet. Feedback welcome.
v0.1.22-beta — 2026-10-03¶
- The Controls panel on the title screen is now an editor. Reassign any
button (plain, with R held, with L held) and tune the aim cone, reach,
cursor speed, deadzone and walk rings, by touch or with the D-pad and
Cross. Changes apply at once; closing the panel saves only what you
changed into
controls.txt, comments kept. Bindingaimwhen it was not bound at launch needs a game restart. Host tests and a host render only: not yet tried on console. - The aim button targets the monster closest to the centre of the cone,
never one outside it, with a longer reach that you can set
(
hostile_reach, default 800, 100–2000). Not tested on console yet. - With no target, the aim button now does a plain left click at the cursor instead of nothing. Not tested on console yet.
v0.1.21-beta — 2026-10-02¶
- Menus no longer cropped after a game played at 640×480. The main menu, character select and Battle.net lobby are always 800×600, but leaving a game whose last video mode was 640×480 (or switching down to it mid-game, then leaving) put the screen back at 640×480: the right and bottom of the menus were cut off (no Exit Diablo II button). Confirmed on console offline (Save and Exit from a 640×480 game); the Battle.net lobby itself is not re-tested online yet.
- The aim button reaches your corpse from anywhere on screen. It used to be offered only within reach, so from farther away nothing happened. It stays the lowest priority: a monster, object, item or level exit in reach still wins. Not tested on console yet (host tests only).
v0.1.20-beta — 2026-10-02¶
- The aim button walks into level exits (cave mouths, stairs): the nearest exit is the last-resort target when no monster, object or item is in reach. Confirmed on console at the Den of Evil entrance.
- The aim button no longer chases invisible markers in dungeons (the
game's
dummyunits, which the Den of Evil is full of): a monster is only a target if the game itself flags it targetable. Confirmed on console. - No more endless auto-walk: when the target dies or vanishes while the aim button is held, the character stops instead of walking on.
v0.1.19-beta — 2026-10-01¶
- Stash, waypoint, chests, town portal and doors are targeted by the aim button again. An object the game flags as targetable is no longer written off for good after a slow hover (the game only answers after a rendered frame), and an object the game already hovers wins over our own hit box. Not confirmed on console yet.
- Packs of untargetable critters (Act III geckos) no longer hide the real monster behind them: the "game never hovers it" memory holds 32 units instead of 8.
- Hold Square, press L to pick up the highlighted ground item (Cross still works). L keeps its aim role when there is nothing to pick up.
diamond=offincontrols.txthides the aim diamond.controls.txtreading is stricter and safer: out-of-range numbers (orbit=1000from older builds,deadzone=15) are refused and reported inboot_progress.txtinstead of making the character uncontrollable; a typo inl=(l=lclik) no longer leaves L doing nothing;l=aim_assistis recognised; a UTF-8 BOM at the start of the file is ignored.
v0.1.18-beta — 2026-09-29¶
- New default controller scheme — please test it and give feedback on
Discord. L is now the aim assist (hold): in game it acts on the
best target (your corpse, what the cursor points at, an enemy in a cone,
the nearest chest/door/NPC); in menus, open panels and out of a game it
is a plain left click. The left stick only walks, the right stick is a
free cursor. Square is the item assist (ground labels, D-pad to
browse, Cross to pick up). L + Cross = inventory, L + Circle =
automap, L + Square = mercenary inventory. Stick speed 18, dead zone
0.15. Cross alone no longer clicks in menus — L does. To get the previous
scheme back, put
l=lclickincontrols.txt(with no otheraimbinding). The aim hooks are now installed by default and their frame-time cost is not measured yet. - Larzuk's add-socket window now accepts the aim click (it used to target the map behind it). First console test only.
- Title screen: the "Controls" help button opens only from its own small tab, no longer from the whole left edge.
- Touch offset fixed in game.
Beta: checked by hand on a console for menus, NPC windows and touch; the new defaults are not tested by the community yet. Includes the 0.1.17-beta options.
v0.1.17-beta — 2026-09-29¶
- Two single-player options, both off by default (add them to
env.txt): D2_RUNEWORDS_LADDER=1: the 23 ladder-only runewords (Spirit, Insight, Infinity…) can be made in single player.D2_RESPEC_UNLIMITED=1: Akara's "Reset Stat/Skill Points" stays available after use, once you have earned it (Den of Evil). Neither acts in TCP/IP, Open Battle.net or realm games, and no game file is changed. They depart from the unmodified game on purpose, which is why they are opt-in.
Beta: both were checked on a real console. Includes the 0.1.16-beta fixes.
v0.1.16-beta — 2026-09-28¶
- Multi-row belts no longer flicker. Hovering or dragging potions in an expanded 2–4 row belt made it flicker: the game got two different screen positions for the same belt slot. This is very likely also why potions sometimes refused to go into the upper belt rows — please confirm on Discord.
controls.txt: lines uncommented from the reference file now work. The reference file writes#l=lclick # comment; uncommenting a line kept the trailing comment, so the line was rejected (e.g.l=altleft L as a left click). Comments after#and extra spaces around=are now ignored.
Beta: both fixes were checked on a real console. Tell us on Discord if anything regressed compared to 0.1.15.
v0.1.15-beta — 2026-09-28¶
- Inventory, stash and character panels are centered by default now.
They used to be anchored to the screen edges, with a wide black gap
between two open panels; they now sit together as one 800-wide block
(the SGD2FreeRes model), which makes dragging items between an open
inventory and stash easier.
D2_RES_PANNEAUX=bords(oredges) inenv.txtrestores the previous edge anchoring.
Beta: the anchoring math itself hasn't changed and was already console-measured before becoming the default, but nobody's looked at two open panels side by side on this exact build yet. Tell us on Discord if anything looks or clicks wrong.
v0.1.14-beta — 2026-09-28¶
- Title-screen "Controls" tab. A small icon in the left letterbox band
of the title screen opens a full-screen panel listing every binding
currently in effect — defaults plus anything
controls.txtchanged — scrollable by D-pad or drag, closed with Circle or Start. - L, R and Select are now remappable, without touching their role as
combo-layer prefixes:
l=/r=/select=incontrols.txtchange what pressing them alone does (default: left click, right click, the radial menu). A newl+layer mirrors the existingr+one and starts entirely free, for players to fill in themselves. - A bad
controls.txtline now says so. An unknown button, an unknown action, or a combo Select doesn't have used to be silently ignored; every rejected line is now named inboot_progress.txt. - A fully-commented reference
controls.txtships inside the VPK and is copied toux0:data/d2vita/controls.txtthe very first time the game boots — it never overwrites a file a player already has.
Beta: boots cleanly on real hardware, but nobody has hand-tested every new
remap yet (l=, r=, select=, the l+ layer). Feedback wanted on
Discord before this becomes the default release.
v0.1.13 — 2026-09-28¶
- Act V stutter gone. On the scripted Harrogath patrol (real console,
110 s), frames over 60 ms drop from ~25 to 3 and the frame rate reaches
the game's own cap: 24.0 → 25.0 fps. The cause was ours: an engine-side
25 Hz frame cap written for online play also ran in solo (it armed
whenever
D2NETwas set, which the default config always sets). Solo Diablo II already draws exactly once per 40 ms simulation step; the cap waited a little longer than 40 ms every frame, drifted against the game's own clock, and the game then skipped a draw every few seconds. The cap is now off by default. Online: there is no engine cap either anymore — not re-measured online yet; if the game ever runs too fast in a Battle.net game,D2_ONLINE_CAP=25inenv.txtbrings the old cap back. - Less CPU per frame (~1.6 ms of game-thread work, ~5% of a frame).
The most frequent calls from the game into the runtime (clock reads,
critical sections — ~650 per frame) are now served from inside the
translated code instead of leaving it and coming back; the Glide ring
DLL copies Perspective vertices in line;
wsprintfAno longer allocates. Main core load on the patrol: ~77% → ~74%. Proven identical on qemu (pixel-identical image over 4000 frames, critical-section contention test) and measured on console with interleaved passes. - Fewer memory-card reads when new content streams in: a seek now reads 32 KiB ahead instead of 8 (~60% fewer card reads on the patrol), no extra RAM.
- Native Perspective floor (
D2_F3NATIF=1) faster, still opt-in: it is now served in line and writes its draws directly, another ~1.25 ms per frame on the patrol (0 divergence against the game's own code on 168,503 compared cells).
v0.1.12 — 2026-09-27¶
- Perspective floor no longer flickers. In heavy Perspective scenes (Harrogath's gate: ~1.3 MB of Glide records per frame) the render ring could not hold the frame being sent to the GPU on the second core and the next one, and the Glide DLL silently dropped the end of each frame — a patch of floor, different every frame. The flush thread now gives the ring space back as it walks the frame instead of at its end. Console, at the gate, Perspective ON: 0 dropped records, 24 fps (a first fix that sent those frames synchronously cured the flicker but fell to 9 fps there).
- The in-game Resolution option zooms again. 800×600 draws at the
Vita's native 960×544 as before; 640×480 now draws at 848×480 — the
original 640×480's height at the screen's shape — scaled ×1.13 to full
screen, so characters look as big as native 640×480. Before, choosing
640×480 only swapped the HUD art. Switching mid-game works in both
directions (the world used to stop two thirds across the screen after a
switch to 640).
D2_RES640=WxHforces another size,D2_RES640=0gives the original bordered 640×480. Confirmed on console. - HUD gaps filled at 640×480 too. The 640 bar and the column between two open panels are filled with stone taken from the game's own inventory panel, read from the game's already-loaded art at the first UI draw — no panel needs to be opened first, and no Blizzard art is added to the package. Not available for classic (non-Lord of Destruction) characters.
- HUD gaps no longer come back with Perspective OFF, and the black column between two open panels (character sheet + inventory) is filled again at 960×544 — its expected position had not followed the vertical centring of the panels. Confirmed on console, Perspective ON and OFF.
- Act V runs faster: the Glide driver now announces two texture units, which lifts D2's sprite cache from 3 MiB — it was re-sending ~50 known textures per frame. Console patrol bench: ~20 → ~24 fps (the game's own cap is 25).
- Blinking monsters (Death Maulers) fixed in the texture atlas: with two texture units the atlas could fill up in the wilds and a failed upload left the previous sprite bound. The atlas grows to 48 MiB, a failed upload now leaves the texture unbound instead of stale, and full size classes borrow unused pages from the others. Verified with the qemu texture oracle (718 wrong-texture draws → 0); console confirmation is still pending.
- The boot log (
boot_progress.txt) is now written asynchronously: its periodic reports no longer stall the game thread (30–107 ms each before).
v0.1.11-beta7 — 2026-09-24¶
- Explored map kept across waypoint trips (and across games). D2 keeps a
level's automap in
<character>.ma0/.ma1/.ma2(one per difficulty): it writes the file when leaving a level and reads it back on entry. The runtime answered "no such file" to every open of a missing automap — an old workaround for a fresh character's act load — which also refused the save, so the file never existed and every level entry started from a blank map. All automap opens are now honoured as on Windows (the game copes with the empty file itself, verified on console: no stall), and every automap open is logged inboot_progress.txt.
v0.1.11-beta6 — 2026-09-24¶
- Main menu no longer off-centre after Save & Exit. Returning from a
game, D2 calls neither
SetResolutionnorGetResolutionSizeand keeps its Glide window as is, so the 960x544 in-game switch stayed armed and the 800x600 menu art was drawn at the left of a 960-wide window with a black band on the right (reported by two players, reproduced on the maintainer's console). The runtime now notices Fog's menu loop running with the switch armed, restores the native 800x600 and the window size; the next game entry re-arms the switch.
Memory:
- Guest heap ceiling raised from ~32.9 to ~56.9 MiB: a 75-minute session
filled the old ceiling and died on a Blizzard "Unrecoverable internal
error" (Halt 904, crash report
SZDVJ7PNYRTOS54K). The room comes from the VirtualAlloc window (216 → 160 MiB; two long field sessions peaked at 97–98 MiB), not from the game's sprite cache, which stays at 64 MiB — no fps trade. - Host-side heap 38 → 46 MiB (was at 31.9 MiB with 624 KiB free at the end of that same session).
- Boot log:
alive:lines now carryheap=<used>/<ceiling>MBnext tova=, so a session that gets close to the wall shows it before it dies.
With the kubridge kernel plugin (v0.3 or later, optional but recommended — the one the big Vita ports already require; a notice at boot says when it is missing, X or 10 s to continue):
- JIT pool 16 → 32 MiB. The kernel caps
sceKernelAllocMemBlockForVMat 16 MiB per process (a second block is refused even with 220 MiB free), so every player session so far ran on a single 16 MiB segment and re-translated code late in a session. The pool now opens a second 16 MiB RWX segment outside that quota. Without the plugin it stays at 16 MiB, andboot_progress.txtsays which case applies (JIT: kubridge present/absent). - Crash reports carry the exact x86 state at the fault: a user-mode
abort handler records, before the kernel's dump, the faulting host address,
whether it was a read or a write, the dynablock and x86 instruction, and
the eight live x86 registers —
CRASH abort …inboot_progress.txtandcrash.log. - Win32 exception fidelity: a guest access violation is delivered to the
game's own structured exception handling — the frame handlers at
fs:[0]first, then the top-level filter — with anEXCEPTION_RECORDand aCONTEXTbuilt from the live x86 registers. Fog's filter writes its realCrash.txt(ACCESS_VIOLATION, call chain from the faulting instruction) and terminates the process as it does on Windows; the runtime exits cleanly and the report is picked up at the next boot — the reporter now reads Fog's exception summaries too. Until now such a fault was a bare kernel dump with no game-side report. - Guard pages under the guest heap: the 124 KiB null slack is now
PROT_NONE, so a null-plus-offset dereference by the game faults at the source — and gets recorded — instead of silently corrupting a neighbour. - Self-modifying-code write barrier: box86's
protectDBnow reaches a realmprotect, and a guest store into a translated page is served by the handler (blocks marked dirty, page reopened, store resumed) instead of going undetected. On by default — soaked on console with zero faults and unchanged fps;D2_PROTECTDB=0inenv.txtturns it off.
v0.1.11-beta5 — 2026-09-24¶
- Boot-time warning when a required game file's size doesn't match the
official 1.14d install (e.g. a
patch_d2.mpqfrom a different patch level) — shown on screen, requires pressing X to force startup anyway instead of silently loading a mismatched version.
v0.1.11-beta4 — 2026-09-23¶
- LiveArea background updated (community contribution, issue #19): adds the Blizzard Entertainment mark and moves the full "Diablo II: Lord of Destruction" logo to the top, same base art and border otherwise.
v0.1.11-beta3 — 2026-09-23¶
- On-screen build tag (top-right corner: version + commit hash) so a bug
report screenshot says exactly which build it's from.
D2VITA_BUILDTAG=0inenv.txthides it. - 960x544 panels centered vertically, matching the horizontal centering from v0.1.11-beta.
v0.1.11-beta2 — 2026-09-23¶
- JIT pool exhaustion crash fixed (signature
SMRD2J34ZXU2A55I, #1 crash by volume — 143 reports / 42 consoles as of 22/09). The pool's eviction-and-retry machinery (already shipped, v0.1.10) only triggered when the low-level allocator explicitly refused a request. It now also triggers directly on pool occupancy (≥95% full), closing a second path to the same crash the allocator counter alone couldn't see. Retry budget raised (8→24 eviction rounds, 64→192 graceful re-entries) as a low-risk measure — not yet proven by a field report, but the underlying retries were already bounded and lock-safe. - Guest VA window trimmed 220→216 MiB to hand the JIT pool a few more MiB of headroom (the pool was short by roughly that much, by two independent estimates).
- Not console-validated yet — watch for a drop in this signature's report count over the next few days.
v0.1.11-beta — 2026-09-23¶
- Fixed: at 960x544, on-screen clicks (panel close crosses, buttons, touch taps, L/R) landed on stale coordinates instead of what was drawn. The screen offset is now written where the game itself lays out the UI, so clicks and drawing always agree.
- Panels anchor to the screen edges by default; the old SGD2-style
centered layout is now an opt-in (
controls.txt).
v0.1.10 — 2026-09-22¶
- Image is no longer stretched: Glide renders at 800x600 and the old
projection mapped it affinely onto the whole screen (×1.2 in X, ×0.907
in Y — 32% too wide). Now isotropic by default (725×544, letterboxed);
D2_ASPECT=etirerestores the old stretched look. - Optional native 960x544 rendering (
D2_RES, off by default): the game draws directly at the Vita's screen resolution instead of upscaling 800x600 — one texel per pixel, no filtering. d2vGlideFlushmoved off the game thread onto its own core, and six settings that had been sitting in the reference config since early September became compiled defaults: +13% in real play, frame-time spikes cut ÷29 (measured on console, interleaved passes).- The 960x544 layout's remaining gaps filled in: panels now follow their background art (tables, clicks, frame, belt), and the black column/row between adjacent open panels is gone.
- box86's translated-code (JIT) pool and RW metadata heap made visible on the console heartbeat line and in crash diagnostics, ahead of the pool eviction work that shipped in v0.1.11-beta2.
- Removed
grab_checkrevision.pyand theD2_ALLOW_OFFICIALescape hatch it existed for.
v0.1.9 — 2026-09-21¶
- The virtual keyboard now opens automatically when a text field gets
focus (character name, Battle.net account/password, game name) — no
Win32 focus event exists for this, so it's read from D2's own UI state
directly. Manual open (R+Triangle) still works;
D2_KBAUTO=0inenv.txtdisables the automatic behavior. - Keyboard opacity is adjustable (
D2_KBALPHA=0-100, default 80% — translucent, character/menu stays visible behind it) and composes on the GPU rather than reading the framebuffer back on the CPU.
v0.1.8 — 2026-09-20¶
- Fixed the eight crash signatures still active on 0.1.6 (issue tracked in PR #15): unreported failed file reads/writes, an unvalidated write root, missing archive validation at boot, and a wrong crash-report directory.
- Guest heap ceiling raised to ~32.9 MiB (was hitting
ALLOC FAILand a Halt 904 on large allocations — Traditional Chinese installs' glyph atlas was the most common trigger). - Radial menu (Select) rendering moved entirely to the GPU: it was costing ~81 ms per frame while open (24.5 → 8.2 fps on console), ~70% of that just re-reading CDRAM from the CPU to blend. Now composited as textured quads with no framebuffer readback.
- First round of JIT pool exhaustion mitigations picked up from winx86 (segment requests step down instead of giving up outright; occupancy published on the heartbeat) — not yet the full fix, see v0.1.11-beta2.
v0.1.7 — 2026-09-20¶
- Mostly documentation and art this release:
keys.txt's layout documented (EN/FR), LiveArea artwork from a community contribution (issue #7).
v0.1.6 — 2026-09-19¶
- Guest heap ceiling raised to ~25 MiB (a 4.2 MB
HeapAllocwas being refused at the old 20 MiB cap while over 200 MB of other memory sat free) — the same class of fix carried further in v0.1.8. - Dynarec-fault reports now dump the faulting opcode bytes and region, making this whole family of crashes traceable instead of generic.
v0.1.5 — 2026-09-18¶
- Release-process fix only (VPK packaging margin after the first segment) — no player-facing changes.
v0.1.4 — 2026-09-20 (tag corrected after the fact — see note)¶
- The game now refuses to load anything but the official 1.14d
Game.exebefore running it, instead of failing later with Diablo's own cryptic "Unsupported graphics mode" error. (Root cause of a real report: a 1.14b executable that looked close enough to pass the version check.) - Crash-report admin tool: last-seen version per signature, dropdown filters.
Why v0.1.4 is dated after v0.1.5–v0.1.7
Its first release attempt failed CI (a VPK packaging issue); the tag was corrected and re-pushed after v0.1.5, v0.1.6 and v0.1.7 had already shipped, so its git history and publish date land later than its version number suggests. The content above is what v0.1.4 itself shipped, independent of when the tag was fixed.