DS2Revival/README.md
2026-10-27 22:43:22 -04:00

4.4 KiB

DS2 Revival

Plugins that bring Dungeon Siege II (Steam v2.3) and its expansion Broken World back to life on modern Windows: online and LAN multiplayer through a GameSpy-replacement server, borderless widescreen, and fixes. Player download and install guide: https://dsii.uk. Source code and releases: https://git.dsii.uk/dsii/DS2Revival.

Folder Plugin What it does
mods/multiplayer/ DS2Multiplayer.asi online/LAN play through the replacement server, relay for hosts behind routers, 8-player modes
mods/widescreen/ DS2Widescreen.asi borderless window at native resolution, menus at the correct aspect ratio, frame cap at the refresh rate, Hor+ field of view and camera options (zoom, pitch), the mouse pointer in the game's own exclusive fullscreen (ExclusiveCursor)
mods/fixes/ DS2Fixes.asi system-wide keyboard lag, cursor stutter, camera drag at high frame rates
mods/brokenworld/ DS2BrokenWorld.asi runs Broken World from a subfolder, imports Steam heroes, CPUID frame-rate fix
mods/modloader/ DS2ModLoader.asi drop-in mods: Mods\<name>\ tanks (.ds2res/.ds2map) and loose files, with a load order; glTF models (.glb/.gltf) used directly (converted in process into Mods\.cache; stb_image for PNG/JPEG)
mods/common/ shared helpers: signature search, import hooks, logging, ini

The plugins are plain C++ DLLs (renamed .asi) loaded by Ultimate ASI Loader (version.dll, MIT licence). They patch the running game in memory only: no game file is modified and nothing runs outside the game process.

Build

Requirements: Windows, Visual Studio 2022 or Build Tools with "Desktop development with C++", Python 3.10+.

  1. python mods/build.py builds build/mods/*.asi (x86, /O2 /MT, static CRT, Windows system libraries only).
  2. Put Ultimate ASI Loader's x86 dinput8.dll at build/asiloader/dinput8.dll.
  3. python tools/package.py writes dist/DS2Revival/ and dist/DS2Revival.zip.

On Linux (x86_64), python3 tools/ci_build.py does all three with clang-cl and lld-link (clang/lld 19 or newer; Ubuntu 24.04: apt install clang-20 lld-20): it downloads the x86 MSVC CRT and Windows SDK with xwin (pinned versions; this accepts Microsoft's license for them) and the pinned Ultimate ASI Loader release (SHA-256 checked), builds the five plugins with the same flags (mods/build.py --release --clang), checks them (x86 DLL, no CRT DLL imports) and writes dist/DS2Revival.zip and dist/DS2Revival.zip.sha256.

CI and releases

.forgejo/workflows/build.yml runs tools/ci_build.py on the project's own CI runner: every push to main uploads the zip as a workflow artifact, and every v* tag publishes a release with DS2Revival.zip and DS2Revival.zip.sha256 attached (tools/ci_release.py).

Release contents

File Source
version.dll Ultimate ASI Loader x86, unmodified upstream release (renamed dinput8.dll)
scripts/*.asi mods/, built by mods/build.py
Broken World/version.dll, Broken World/scripts/*.asi the loader and DS2Revival.asi (mods/revival_loader/), which loads the main scripts folder's plugins into the Broken World process (one set of plugins for both games; harmless without the expansion)
(no ini) DS2Revival.ini (next to DungeonSiege2.exe) is not in the zip: the plugins create it on the first start from the default text compiled into them (mods/common/DS2Revival.ini, turned into a header by mods/build.py), so a drag-and-drop update never overwrites the settings
firewall-setup.ps1, Firewall setup.cmd tools/firewall-setup.ps1 and a one-line launcher (optional: Windows Firewall rules for the game)
DS2Revival README.txt, THIRD-PARTY-NOTICES.txt written by tools/package.py; tools/third_party/

Tools

  • tools/tank.py: read, extract and write the game's Tank archives (.ds2res, .ds2map, .ds2party).
  • tools/siegelet.py: build a small playable map (siegelet) from regions of an existing map.
  • tools/bw_cpuid_sites.py: regenerates mods/brokenworld/cpuid_sites.h from a Broken World exe (needs capstone).

Network

DS2Multiplayer resolves the game's old GameSpy host names to the server in [Network] Server (default use1.dsii.uk) and connects only there; everything else is the game's own DirectPlay traffic.