Skip to content

D2LoD Vanilla+0.0.7-R77

Pre-release
Pre-release

Choose a tag to compare

@VTSTech VTSTech released this 01 Nov 20:23
· 159 commits to main since this release
image image image

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 2 on 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.exe across 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.cpp pNpc double-declared (upstream's hoisted declaration kept), SpellSel.cpp pPlayerUnit_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 + Direct3DCallBack in Direct3D.cpp, the startup-log case 9/10 pair in SFile.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."
  • Merge safety net: new scripts/merge_site_syntax_sweep.sh (step 4e of docs/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 (+ the vp_host_shim/vp_host_api headers) runs all four fork-owned TUs through the host g++ in -fsyntax-only with 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.
  • .sss v2 (R75). The _d2vp_shared.sss format gained a second page: magic VPS2, 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_font tuning), 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 .d2s round-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.ini carry over. If d2vp.ini is missing, a documented all-defaults template is written next to the exe on the next start.
  • _d2vp_shared.sss upgrades 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 .d2s characters 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.log line reading Vanilla+0.0.7-R77.

Full Changelog: R74...R77