61 lines
4.4 KiB
Markdown
61 lines
4.4 KiB
Markdown
# 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](https://github.com/ThirteenAG/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](https://github.com/Jake-Shadle/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.
|