## Cactus <img src="https://i.imgur.com/mSwZJmr.png" height="35"/>

***A Modern Diablo II Worldstone Manager (Original, Not Resurrected)***

***By: [Jonathan Vasquez (fearedbliss)](https://xyinn.org/)***

***License: [Simplified BSD License](LICENSE.txt)***

***Bundle Version: 2026-07-12-2130***

***Cactus Version: 5.6.0***

[**Videos**](https://youtube.com/@fearedbliss) | [**Forum**](https://themovingcaravan.com/) | [**Project Sunrise**](<./Sunrise/README.md>) | <a href="https://liberapay.com/fearedbliss/donate"><img alt="Donate using Liberapay" src="https://liberapay.com/assets/widgets/donate.svg"></a>

## Screenshots

### Main

![](Images/Main.png)

### Dark Mode

![](Images/Dark.png)

### Create Shard

![](Images/Create.png)

### Modify Shard

![](Images/Modify.png)

### Settings

![](Images/Settings.png)

### About

![](Images/About.png)

### Desktop

![](Images/Desktop.png)

## Download

This is the main Cactus repository and contains only the source code. You'll
want to download the complete bundle below which contains everything you need
to start playing Diablo II on Linux. You'll just need to provide your own MPQs
from a legally purchased copy of Diablo II (Original, Not Resurrected) from
Blizzard.

The complete bundle is available as a direct download from The Moving Caravan,
and also can be downloaded from my server (uptime is not guaranteed).

- ### [Download Cactus: Primary Mirror](https://themovingcaravan.com/diablo/Cactus.tar.xz)
  - #### [Latest Release Hash](https://themovingcaravan.com/diablo/Cactus.tar.xz.SHA512.txt)
- ### [Download Cactus: Secondary Mirror](https://xyinn.org/diablo/Cactus.tar.xz)
  - #### [Latest Release Hash](https://xyinn.org/diablo/Cactus.tar.xz.SHA512.txt)

## Updating

To update Cactus, you just need to re-download the latest bundle and replace the
**`Cactus`** binary with the new **`Cactus`** binary. That's it. I try to maintain
backwards compatibility with the **`Cactus.json`** file and existing behavior as
much as possible. If there is an operation that requires user intervention, I
will mention it in the patch notes. You should still continue to download the
entire bundle even if you just replace the binary so that you can always have
the latest documentation and everything else, all locally available and offline.

## Description

Cactus is ***A Modern Diablo II Worldstone Manager*** for the ***Original***
version of the game created by **Blizzard North**, not **Resurrected**. A
worldstone manager is an application of existential power, coming from
[Anu](https://diablo.fandom.com/wiki/Anu) himself. The worldstone manager allows
you to easily create separate isolated universes of Diablo II across space and
time. You can play any version of the game from the very first **1.00** release,
all the way up to the latest version of the game **1.13d**. We are excluding
**1.14** due to the removal of the **DirectDraw** driver, and the merging of all
of the DLLs into a single binary. Patches **1.13d** and **1.14** are
**`Patch_D2.mpq`** identical.

The worldstone manager has the following features:

- ***Written In [Zig](https://ziglang.org) + [DVUI](https://github.com/david-vanderson/dvui) And Designed For Linux***

   - Cactus has been re-written, re-designed, and re-imagined from the ground up
     for full Linux integration and compatibility, and is fully written in Zig
     and DVUI <3.

- ***Runs Completely Offline Even In An Isolated Environment With No Telemetry***

	- Cactus does not require an internet connection and runs completely offline
    even in an isolated environment. There is also absolutely no telemetry
    collection. I'm not really interested in tracking my users and I perform my
    own testing and user experience tests since I'm the primary user of Cactus.
    I'm happy to receive feedback from the community on a voluntary basis either
    through email or messages posted at The Moving Caravan.
	 
- ***Runs on X11 and Wayland***

	- Thanks to the hard work of the community, Cactus, Wine, and Diablo II all
	  already work on both X11 and Wayland. Cactus will automatically detect
	  your display server on first launch and set things up appropriately. You
	  can manually override the option in the settings afterwards since Wayland
	  may give you the wrong result in different cases and you may wish to use
	  XWayland instead, or skip Wayland altogether if you are on X11.

- ***Maximize Disk Space Savings***

   - Cactus is extremely efficient with disk space. Every shard exclusively uses
     symbolic links to intelligently link back to the Core MPQs and any other
     files the shard uses. This means that you could have thousands of shards
     taking up just a few megabytes.

- ***Easy Shard Management and Modding Support***

   - Cactus allows you to easily create and manage multiple shards that are all
     derived from a combination of Core, Worldstone, and Overlay data. The
     Worldstones contain all the files needed to spin up an universe in that
     version. Worldstones can be additionally modified in a safe way locally by
     applying Overlays. This allows a deeper level of customization for the user
     since they can have all of their modifications in overlays without having
     to modify the original worldstone files. With this architecture and level
     of isolation, Cactus is designed to be the perfect platform for mods.

     A mod's compatibility depends on a variety of factors, but if it works on
     Windows, then it most likely will also work on Linux depending on how some
     particular internals were implemented. You can find a curated list of mods
     in [Project Sunrise](<./Sunrise/README.md>). Mod makers can include all of
     their customizations in a worldstone, and Cactus will intelligently apply
     the layering.

     The file layering order is as follows: **`Core < Worldstones < Overlays`**.

     Therefore files in **`Worldstones`** will shadow files in **`Core`**, and
     files in **`Overlays`** will shadow files in **`Worldstones`**.

- ***Parallel Execution Support***

   - Due to Cactus' improved architecture and isolation, you can run multiple
     versions of the game (and even multiple mods) all at the same exact time!
     There is no restriction to the number of parallel executions you can run
     other than your machine's resources.

- ***Automatic Backup Support***

   - Cactus will automatically back up your characters on the last exit of a 
     particular shard. So if you are running a 1.09b shard, and have three
     3 windows open for the same shard, Cactus will automatically take a snapshot
     of your characters when you close all of them, and will automatically timestamp
     them. This allows you to easily restore your characters if they ever were
     to get corrupted. The automatic backup feature can be disabled and you can
     run manual backups as well by clicking the **`Backup`** button. You can also
     set the backup path in the **`Settings`** to any location you have read, write,
     and execute permissions for. This could be used to place your backups in a
     folder that is synced up to the cloud or a folder on an external drive.

- ***Full Wine Integration***

   - Cactus is fully integrated with Wine and essentially acts as a highly
     specialized Wine Frontend completely dedicated to this purpose. Wine is
     what allows us to play our beautiful Diablo II, on Linux. As part of this
     integration, Cactus is responsible for automatically creating separate
     Wine Prefixes, communicating our registry updates to the correct prefix,
     and launching the game with the correct prefix information. Save data
     information is also properly routed correctly so that Saves don't end up
     inside of the prefix, but rather inside our own architecture. If Cactus
     does what it's supposed to do, and everything goes well and is compatible
     with your machine, you should never really need to interact with Wine
     directly.

- ***Beautiful Themes For Light and Dark Mode***

    - Cactus comes with a beautiful light and dark mode theme to allow you to
      chill with some good vibes and rest your eyes when needed. We got a lot
      of playing to do.

If you download the Cactus Bundle (recommended), it will also include the following:

- ***All Vanilla Worldstones For Every Version Of The Game (1.00 - 1.13d)***

   - The bundle includes all the files for every version of the game. All of the
     files are in their vanilla state with the exception of the following two
     modifications:

     - The CD requirement has been removed since modern computers no longer use
       CD drives.

     - The MPQ fix has been directly applied to all affected versions of the game
       that failed to work with Blizzard's New MPQ Format used in their modern
       1.14d installer. What this means is that it doesn't matter if you use
       the MPQs from the original CDs or the new modern installer, it will work
       seamlessly. There were 13 versions (including 3 betas) affected by this
       format update: 1.08 - 1.13d, and the 1.10b (Beta 1), 1.10s (Beta 2), and
       1.13a (Beta) versions.

- ***Modern DirectDraw Implementation And Sound Implementation***

   - The bundle comes with [**cnc-ddraw**](README-RENDERERS.md) and
     [**DSOAL w/ OpenAL Soft**](README-3D-SOUND.md). cnc-ddraw allows us to have
     a modern DirectDraw implementation that works beautifully on Linux and Wine.
     DSOAL allows us to restore the previously lost in game audio functionality
     of **`3D Sound`**, **`Environmental Effects`**, and **`3D Bias`**. I've also
     curated a small list of Shaders that are used by cnc-ddraw. If you have
     your own **`glsl`** shaders, you can try to use them as well.

- ***Sunrise: [Singling](Sunrise/Overlays/Platinum/Singling/README.md)***

  - Singling is a collection of non-gameplay modifications and fixes in order to
    improve the Vanilla Diablo II Single Player & TCP/IP Experience.

- ***Sunrise: [Succulent](Sunrise/Worldstones/Platinum/Succulent/README.md)***

  - Succulent is a **Diablo II: 1.09b** modification tailored for Single Player.
    Succulent is influenced by my Time Traveling adventures within
    **Diablo II (1.00 - 1.10)**, and by **Diablo I**.

## Runtime Requirements

- **Linux (x86_64)**
- **Wine**
    - Most versions should be fine but I've tested Wine 9, 10, and 11.
- **Diablo II (Original, Not Resurrected)**
	- We only need the 10 Required MPQs (6 Classic + 4 Expansion) listed in the
    installation section below.

## Tested On

| Status | Name | Bitness | DE / WM | Display Server | Wine Version | Kernel | Tested On | Tested By | Notes |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| **<span style="color:green">Works</span>** | Fedora 44 | x86_64 | GNOME 50 | Wayland | 11.0 | 7.0.14-201.fc44.x86_64 | 2026-07-01 | fearedbliss | |
| **<span style="color:green">Works</span>** | Linux Mint 22.3 (Zena) | x86_64 | Cinnamon 6.6.7 | X11 | 9.0 | 6.17.0-35-generic | 2026-07-01 | fearedbliss | |
| **<span style="color:green">Works</span>** | CachyOS | x86_64 | Plasma 6.7.2 | Wayland | 11.12 | 7.1.3-1-cachyos | 2026-07-06 | fearedbliss | |
| **<span style="color:green">Works</span>** | Ubuntu 26.04 LTS | x86_64 | GNOME 50 | Wayland | 10.0 | 7.0.0-27-generic | 2026-07-06 | fearedbliss | |
| **<span style="color:green">Works\*</span>** | Pop!_OS 24.04 LTS | x86_64 | COSMIC | XWayland | 9.0 | 7.0.11-76070011-generic | 2026-07-11 | fearedbliss | Uncheck: **Use Wine Wayland Driver** |
| **<span style="color:green">Works</span>** | Nobara Linux 43 | x86_64 | Plasma 6.6.4 | Wayland | 11.7 | 7.0.0-200.nobara.fc43.x86_64 | 2026-07-11 | fearedbliss | |
| **<span style="color:green">Works</span>** | MX Linux 25.2 (AHS) | x86_64 | XFCE 4.20.1 | X11 | 10.18 | 7.0.9-2-liquorix-amd64 | 2026-07-11 | fearedbliss | |

## Installation ([Video](https://youtu.be/9liyvpSO088))

### Install Wine

Install **`wine`** through your distribution's package manager. Most versions
of Wine at this point should run Diablo II perfectly fine given that the game
is 26 years old at the time of writing. The lowest I've tested on is Wine 9
and the latest Wine 11. After installation, you should be able to run the
following command as a normal user:

```
$ wine --version
```

### Download Bundle And Run Cactus

Download the Cactus Bundle and double click **Cactus** to open the program.
By default, it will place its files in the directory Cactus is running in.
If you want to change the Cactus Root Directory location, you can run the
following command in the command line:

```
$ ./Cactus <path to directory>
```

When Cactus launches, it will automatically create its default folder structure
and settings if needed. Also note that Cactus ***does not require root privileges***
and ***should not be ran as root***. Everything Cactus does will be done inside
of its own directory (with the exception of the backup path if you've adjusted
this to point outside of the Cactus folder).

You can also run Cactus from the command line if you want to monitor the logs.
This is important if something goes wrong and need more information on what
is happening. There is also a desktop entry that is provided as well. You'll
need to adjust the absolute paths to your local setup. Setting **`Terminal=true`**
will allow the app to both have the terminal window with the logs and the
GUI app itself both launch at the same time.

### Place Required MPQs In The Common/Core Directory

These 10 MPQs are the only files you need to provide Cactus. Place them inside
the **`Common/Core`** directory. All relevant files placed in these directories
will be automatically shared and linked to any relevant shards you create.

```
// Classic MPQs

- d2char.mpq
- d2data.mpq
- d2music.mpq
- d2sfx.mpq
- d2speech.mpq
- d2video.mpq

// Expansion MPQs

- d2exp.mpq
- d2xmusic.mpq
- d2xvideo.mpq
- d2xtalk.mpq
```

The **`Common/Core`** directory already includes **`D2.LNG`**, the cnc-ddraw
files used for the video system, and the DSOAL w/ OpenAL files that are used
for the sound system. The files in this directory are shared across all shards.

The **`Common/Worldstones`** directory includes all of the version specific files
for each version of the game. They are primarily just DLLs and the Patch_D2.mpq
file. If you download a worldstone from the Ether (a mod), the worldstone should
have at least this minimum set of files. Cactus will verify and ensure that these
files exist:

```
- binkw32.dll
- Bnclient.dll
- D2Client.dll
- D2CMP.dll
- D2Common.dll
- D2DDraw.dll
- D2Direct3D.dll
- D2Game.dll
- D2Gdi.dll
- D2gfx.dll
- D2Glide.dll
- D2Lang.dll
- D2Launch.dll
- D2MCPClient.dll
- D2Multi.dll
- D2Net.dll
- D2sound.dll
- D2Win.dll
- Fog.dll
- Game.exe
- ijl11.dll
- Patch_D2.mpq
- SmackW32.dll
- Storm.dll
```

The **`Common/Overlays`** directory starts empty by default and is the location
where users can safely apply local customizations to their worldstones. This
means that you can safely alter worldstone behavior without having to touch the
original worldstone files, facilitating installation and rollback.

### Create And Run The Shard

You can now **`Create`** a shard by clicking the Magic Wand icon on the bottom
left corner. Enter the **Worldstone**, **Name**, and **Launcher** to use for
the shard. These are required and are shown with an asterisk.

The worldstone will be a name that matches a folder in **`Common/Worldstones`**.

The shard will be the name you are giving to your specific isolated instance of
the game world. shards are separated from each other and have their own Save
directory, shard directory, and Prefix directory.

The launcher is the name of the executable. This will usually be **`Game.exe`**
unless you are using a third party launcher.

When ready, click **`Create`**. Cactus will automatically verify and install all
required files and link them into the relevant shard. Once this is done, you are
ready to play by either double clicking the new shard or selecting it and clicking
**`Summon`**.

You might get a message from Wine asking you to install **Wine Mono**. This
isn't necessary since we don't use .NET at all, but I'll recommend just to
install it for simplicity so that Wine doesn't keep annoying you to install it
on every shard creation. You only need to install it once for the question to
go away.

### One More Thing (Automatic Wayland/X11 Detection)

Lastly, Cactus will automatically detect the display server you are using and
appropriately pick either the X11 or Wayland driver on first launch. This
is determined via **`XDG_SESSION_TYPE`**. If the value is **`wayland`**, it
will use the Wine Wayland Driver. If it is **`x11`**, it will use its normal
driver. Anything else will default to X11. You can manually adjust this setting
by navigating to the **Settings** window and toggling the
**`Use Wine Wayland Driver`** option. Given the weirdness between X11, Wayland,
and Wine, and depending on whether you are going to be playing in Full Screen
or Window Mode, you'll want to play around with it until you get something
that works. You can play with the size of the game window and other options
by modifying the **`Common/Core/ddraw.ini`** file. You can switch between
Full Screen and Window Mode by pressing **`[Alt] + [Enter]`**.

## AI Policy And Code Contributions

***This project is made by humans for humans.*** Therefore all AI generated code
is ***not allowed***. You may use AI in an ancillary capacity as you normally
would use a search engine, for your own brainstorming and research. However, any
code that would be contributed must be handcoded and will be judged as such.

In addition, while Cactus has been and always will be an Open Source project
released under a permissive license, I'm not actively looking for code contributions.
I do however encourage forking, so if you are itching to make a change, feel free
to make it in your own branch. Go wild!

## Donations

If you enjoy using Cactus, please feel free to send a donation, every little bit
is appreciated. You can donate by either clicking the [donate](https://liberapay.com/fearedbliss/donate)
button at the top, or inside of Cactus. Thank you!

## Build Requirements

- Zig 0.16.0

## Build Instructions

If you want to build from source, you just need to download the required zig
version from the [Zig Download](https://ziglang.org/download/) page, and then
run the following for a production build:

**`$ zig build -Dtarget=x86_64-linux-gnu -Doptimize=ReleaseSafe`**

This should produce a generic x86_64 linux binary linked for glibc that should
run on most Linux distros. I would like to eventually have a statically linked
binary with musl but there are some current limitations between musl and SDL
that are preventing this.

The binary will be located at **`zig-out/bin/Cactus`**.

## Frequently Asked Questions

### How do I mule on the same machine?

Diablo II normally only allows a single instance of the game to run. Therefore,
in order for you to mule you will need to install [Singling](./Sunrise/Overlays/Platinum/Singling/README.md)
since it contains the changes necessary to allow multiple instances of the game.
If you don't you will get the following message when you try to run the same
shard twice:

![](Images/Only_One_Diablo_II_Instance.png)

Once Singling is installed, you can simply just launch the same shard twice to
get two game instances running. Once both of the instances are running, you can
create a TCP/IP game with the first game instance and join with your first
character. You can then join that same TCP/IP game with the second instance. You
can easily join the TCP/IP game by using either **`localhost`** or **`127.0.0.1`**
as the host IP address. That's it. Make sure to always leave the game with the
client characters first and then the host character. If you leave the game with
the host character first, all client characters will be forced disconnected and
you may experience data loss.

When opening up multiple instances, you may want to have two different
shard aliases. The first shard will have sound as normal, and the second shard
alias (same worldstone, same shard name) will have the **`-ns`** flag. This
allows you to run multiple instances without having all of them generating
overlapping sound.

Lastly, it's much easier and enjoyable to mule when you are playing in Window Mode,
so you may wish to pair these instructions with the below instructions to have
two comfortably sized windows for both gaming and muling.

### The game window is small on my high resolution monitor. How can I fix this?

Diablo II's original internal resolution is **`640x480`** and with the expansion
it was increased to **`800x600`**. Since I have a high resolution monitor and I
also only play in Window Mode, I've adjusted the size of the game window itself.
This allows me to have a comfortable game window size for my monitor's size,
resolution, and distance from my seat, while still maintaining the original
game's internal resolution. You'll want to only use **4:3** aspect ratio
resolutions for this, and edit the **`Common/Core/ddraw.ini`** file as follows:

```
width=1024
height=768
fullscreen=false
windowed=true
```

This should make the game always start in Window Mode with a **1024x768** game
window size. You'll want to play around with this until you find something you
like. Below are some 4:3 aspect ratios to try:

| Resolution | Width | Height |
| --- | --- | --- |
| VGA   | 640  | 480  |
| SVGA  | 800  | 600  |
| XGA   | 1024 | 768  |
| SXGA- | 1280 | 960  |
| SXGA+ | 1400 | 1050 |
| UXGA  | 1600 | 1200 |

### Do you have a desktop entry icon I can use?

Yes. You can use the included **`Cactus.desktop`** entry provided by me. However,
you need to adjust the absolute paths for your local setup. Also note that Cactus
by default will use the location its launched from as its root path. This is not
compatible with how Linux distros normally put things inside of **`/usr/bin`**
or FreeBSD's **`/usr/local/bin`**. You therefore need to pass in the Cactus
root path. The desktop entry provided already passes in the argument as an example.
Once you are done editing, you may need to give it execute permissions by doing:

**`$ chmod u+x Cactus.desktop`**

### What does the "Reset" button do?

The reset button will delete your shard's respective **`Shard`** and **`Prefix`**
folder, it will then automatically create these directories, re-link any files
the shard needs, and reconfigure the prefix. Essentially this is a shard
reinstallation button. The **`Saves`** folder is ***not*** affected. You'll need
to use this button if you've added any new files to your **`Core`**,
**`Worldstones`**, and/or **`Overlay`** directories. Resetting a shard is also
a good way to delete any extra ancillary files that Diablo II may have created
over time like game logs, screenshots, etc.

### How do I update files for an existing shard?

If you want to update any files for your shard, you should modify the files
in the **`Common/Core`**, **`Common/Worldstones`**, and **`Common/Overlays`**
folders. Since every shard is just linking to those files, they will automatically
pick up those changes on the next summon. Avoid changing files in the **`Common`**
directories that are being actively used. If you want to add files to a shard,
follow the reset instructions so that things can get re-created and re-linked,
which will include linking to your newly added files.

### A lot of my shards need updating after my changes. What's the fastest way to Reset?

The fastest way to reset many shards is simply to just delete the **`Shards`**
directory. This will cause the Shards to be recreated the next time you run them.
You can also delete the **`Prefixes`** directory as well if you want a complete
reset. Do not delete the **`Saves`** directory unless you don't care about your
saves anymore.

### What do I need to do to move Cactus to a new computer or to a different location on my machine?

If you want to move everything to a different computer or to a different location
on your machine, you can just move it over. All of the shard links are relatively
done, and the old Save Paths that are inside of the Wine prefixes will automatically
be healed the next time you summon your shard. So you should still be able to
see your characters with no issues. Just make sure you install Wine again on
the new machine if it isn't already done so.

### I'm using GNOME and I keep seeing the "Application is not responding" window. Anything I can do about this?

![](Images/Mutter_Not_Responding.png)

The reason this happens is that by default GNOME's Mutter has a ***way too short***
setting to check if an application is not responding. By default it expects process
operations (like launching a process to tell wine to create a prefix) to finish
in just 5 seconds. The prefix installation usually finishes a few seconds after
that so this is outside of its expected range. You can increase the mutter check
time so that this issue completely goes away. You can get the current timeout by
running the following:

**`$ gsettings get org.gnome.mutter check-alive-timeout`**

and you can set a new one like this (I recommend setting it to 30 seconds).

**`$ gsettings set org.gnome.mutter check-alive-timeout 30000`**

### How do I unlock all of the cinematics?

If you moved Cactus to a new computer, or you did a fresh install, you can unlock
all of the cinematics by doing the following:

1. Open the **`user.reg`** file located inside your specific prefix's folder.
1. Go to **`Software\\Blizzard Entertainment\\Diablo II`**.
1. Add the following key: **`"Aux Battle.net"="216.148.246.35"`**
1. Congrats! All of your cinematics are now unlocked.

### Where can I get the older Windows version of Cactus?

The older version of Cactus is no longer supported and no technical support will
be provided for it. However, you can download the last available release from
[here](https://themovingcaravan.com/diablo/windows/Cactus_4.0.0.zip).

### What about FreeBSD Support?

When I started thinking about the new rewrite, the goal was for Cactus to run
on both FreeBSD and Linux. However, there are some current limitations with DVUI's
dependencies that are preventing it to cross compile to FreeBSD (15-RELEASE).
If the ecosystem ends up fixing all of the issues, I would be happy to have
a build for FreeBSD officially distributed. I already tested that Wine and Diablo II
works on FreeBSD, and I know that the Cactus backend should work on FreeBSD with
minor changes given Zig 0.16.0 already runs there. So the last layer is DVUI and
its dependencies.

We can try cross compiling with the following target to find out what needs
to be fixed:

**`$ zig build -Dtarget=x86_64-freebsd-gnu -Doptimize=ReleaseSafe`**

### I'm using an immutable distro. Can I use Cactus on it?

I'm not sure lol. I tried using Bazzite to test and it was difficult even
getting a basic wine installation running. I ended up just giving up and moving
on. I would recommend avoiding all immutable distros and stick to a distro using
a traditional architecture. Immutable distros have their place (like on a phone
or kiosk), but I don't think they are that beneficial for a regular personal
computer. If anything you are restricting yourself and losing a lot of power and
freedom using them. Given that Cactus runs everything within its own folder, it
should theoretically be possible for it to work, the biggest problem may be
getting wine installed. Don't expect much technical support from me on these
types of distros.
