Repository navigation
D2LoD Vanilla+0.0.7-R77
Pre-release
D2LoD Vanilla+ 0.0.7 (R77)
The shared-stash release. The Vanilla+ shared side-file stash doubles up — a second page with </> pager arrows and an outlined tab label — and the tab settles into its final home in the stash panel's top-right corner after two field-tuning rounds. The Shared Stash toggle moves into the in-game Vanilla+ Options page (no more ini editing), and under the hood the fork syncs to upstream's Ghidra-1792 regeneration — four merge artifacts caught and repaired, zero behavior change. Same drop-in 7z layout as 0.0.7: rebuilt client (ship as d2vp.exe) + the glide3x.dll Vulkan wrapper (Glide3xVK 0.4.6). All opt-in features still ship OFF — with no d2vp.ini the game behaves like retail. The first d2boot.log line reads Vanilla+0.0.7-R77, which pins the exact build.
Covers R67 → R77 — everything since the 0.0.7 tag, which shipped the R66 content state. The Vanilla+ gate suite ends the block at 299/299 with all four fork TUs compiling clean on the host toolchain.
Added
- Shared stash page 2 + pager arrows (R75). The shared stash now holds two full retail-shaped pages. The tab is a measured composite, right-aligned at the panel anchor:
Shared >on the personal page (white),< Shared 1 >/< Shared 2on the shared pages (green, the active color). The</>arrows step one page each way and disappear where there is nowhere to go; clicking the word enters the shared pages from personal and returns home from any shared page — the same muscle memory as 0.0.7, always a way back. Both pages deposit and withdraw items + gold from the one shared pool; page-to-page switches stay in memory until the next save or return to personal. - Outlined tab label (R75). The word and both arrows draw with a 1-px black halo — the retail shadow palette tone — under the color pass. White-on-bright-terrain wash-out is closed at the glyph level.
- Shared Stash toggle in the Vanilla+ Options page (R67). Esc → Options → Vanilla+ Options gained a sixth row, Shared Stash — the feature is no longer ini-only. Flipping it On summons the tab without touching
d2vp.ini(the client follows the same frame; the server half rides its ≤2 s poll). Toggle it Off and the tab hides; nothing is lost either way (the save flush parks the shared set and restores personal before any character-file write).
Fixed
- The pager's
<arrow drew on top of the gold amount text (R76). On a shared page the composite's leftmost element — the<tip — rode the tail of the retail gold-amount string. The whole tab (draw and click bands move together) nudged 12 px right, still clear of the right-panel art seam. - The
<arrow still kissed the gold text's last character (R77). Vertical separation finished it: the tab row lifted 45 px out of the retail gold rows into the empty band between the panel's top edge and the gold display. The tab now sits in the top-right corner, clear of the coin + amount display, the "Gold Max" text and every gold hit-rect (all of them live far left of the tab's span — verified against the retail draw sites). Click band geometry unchanged; no clicks can leak to the playfield.
Changed
- The "Shared" tab's final home is the stash panel's top-right corner (R77) — above the gold display, left of the right-panel art seam. (0.0.7 had it on the "Gold Max" text row.)
- Docs (no code changes): README restructured — Features (all six keys) moved to the second section, the Two Layers section removed, Status rewritten, the shipped-client naming is
d2vp.exeacross the docs; stale references to local release-notes files rewired to HISTORY.md and the GitHub releases page; the pre-R74 round journal archived to HISTORY.md (H30).
Internals
- Upstream sync: Ghidra 1792 (R72–R74). The 1784–1792 decompilation regeneration merged cleanly at the source level (5,870 of 14,642 functions byte-matching), then two compile-fix rounds on the Win11 toolchain:
- R73 — two declaration-merge artifacts that every text audit is blind to:
Inv.cpppNpcdouble-declared (upstream's hoisted declaration kept),SpellSel.cpppPlayerUnit_lcl×4 re-expressed on upstream's inlined receiver with every VP offset byte-identical. - R74 — three double-spliced pure-decompiled regions (the perspective wall-tile walk +
Direct3DCallBackinDirect3D.cpp, the startup-logcase 9/10pair inSFile.cpp), each replaced with upstream's shape verbatim — zero future merge surface. - First post-1792 build field-run green: "Builds. Runs. Went in game at 720p, Stash tab is visible and working."
- R73 — two declaration-merge artifacts that every text audit is blind to:
- Merge safety net: new
scripts/merge_site_syntax_sweep.sh(step 4e ofdocs/merge-upstream.md) syntax-checks all 46 merge-site TUs against both parents; v2 uses baseline diffing so the 64-bit-host noise floor cancels out. It catches all four artifact classes pre-build on replay. - The gate suite now compiles (R71).
tools/syntax-check.sh(+ thevp_host_shim/vp_host_apiheaders) runs all four fork-owned TUs through the host g++ in-fsyntax-onlywith the build's exact flag shape — full parse and name lookup, no objects. Run it beside the gate suite; a box without a compiler skips it. Text gates are never the last line of defense again. .sssv2 (R75). The_d2vp_shared.sssformat gained a second page: magicVPS2, a 28-byte header with a size/checksum pair per page, both item blocks after. v1 field files read back as page 1 — page 2 starts empty and the next save rewrites the file as v2; no converter, no data touched. A v1 latent (a sub-4-byte record storing a nonzero size → null memcpy on write) is closed. The atomic write +.bak+.bak-chase behavior is unchanged.- The wire (R75). Same 0x4F/0x7D packet as 0.0.7; the param word now carries the absolute desired page (0 personal / 1 / 2). The server keeps one block per page plus an active-page index; page-to-page switches serialize in memory with no file write, personal-to-shared keeps the v1 snapshot shape, and above-count requests log
page N out of range - ignored. - Rolled back by owner decision (
59ff645): the R67–R71 tab-polish experiments — the Font24 label (with its[ui] stash_tab_fonttuning), the floating row above the panel, and the R70 contrast pill. None of it ships here; R75 rebuilt the tab on the 0.0.7-released R66 design. The block's two survivors are the Options-page row and the syntax-check tool. - Gates 283 → 299 across the block. The two newest rows pin the R77 row position (
0x1cc : 0x108) and retire the old one as a must-NOT-match tripwire.
Known issues
- Three internal SMOKE items were still pending at cut time and are being run on this build: the
.d2sround-trip in a pure retail client (§H 25), the degraded-file drill (§H 27), and the pager walk + page-2 persistence / v1-upgrade checks added with R75 (§H 33–34). - Shared stash remains single-player v1 — the intercept is SP-scoped; TCP/IP and Battle.net are not wired.
- Documented edge: flipping Shared Stash Off while a shared page is active hides the tab, and the grid keeps showing the shared page until you leave the stash screen — the save flush parks the shared set and restores personal regardless, so nothing is lost.
Upgrade notes
- Extract over a 0.0.7 install; saves, realm logins and
d2vp.inicarry over. Ifd2vp.iniis missing, a documented all-defaults template is written next to the exe on the next start. _d2vp_shared.sssupgrades itself: an existing v1 file loads as page 1 (page 2 starts empty) and is rewritten as v2 on the next save. Fresh installs start on v2. Your.d2scharacters stay retail-pure — the shared pool lives only in the side file.- Where things live now: the Shared tab sits in the stash panel's top-right corner, above the gold display. Click the word to enter/leave the shared pages,
</>to page between them. The master switch is Esc → Options → Vanilla+ Options → Shared Stash. - Confirm the build via the first
d2boot.logline readingVanilla+0.0.7-R77.
Full Changelog: R74...R77