Treat only the exact legacy hotkeys blob size as the old format and validate the new-format header and payload before reading them. Keep the legacy scroll regression test aligned with actual scroll availability so the first cast path is verified after load.
Recognize legacy hotkeys blobs by their exact payload size so the loader does not misinterpret them as the newer header-based format. Update the legacy scroll regression test to validate selection preservation against engine-backed scroll availability without depending on UI redraw side effects.
Introduce SyncPlayerSpellStateFromSelections and call it in hotkey load paths so queued/executed spell metadata and spellFrom are reset consistently after sanitization.
This centralizes post-load spell-state normalization, removes duplicated per-call-site resync code, and adds writehero regression tests for missing hotkeys data and legacy 4-slot hotkeys format handling.
Add a slot-aware LoadHotkeys overload and use it in player load paths so hero data and hotkeys are always read from the same save number.
This removes the saveNum/gSaveNumber mismatch risk in pfile_read_player_from_save while keeping the existing wrapper for current-player call sites.
Move hotkey loading out of InitPlayer so it runs only after spell sources are rebuilt. Also make LoadHotkeys sanitize the selected spell and hotkeys itself, including when the sidecar hotkeys file is missing, and resync queuedSpell in the player load paths.
Expose ValidatePlayer directly instead of routing load-time validation through a one-off wrapper.
Add a persisted-state regression test that rewrites a Hellfire-origin save under Diablo and verifies invalid spell selections stay cleared after saving and reloading hotkeys.
Asio 1.11.0
- Conversion between IP address types, and conversion from string to
address, is now supported via the address_cast<>(), make_address(),
make_address_v4() and make_address_v6() free functions. The from_string(),
to_v4(), to_v6() and v4_mapped() member functions have been deprecated.