Descent Co-op on Two PCs: DXX-Redux Fixed Multiplayer in One Try

We wanted to play Descent 1 and Descent 2 in co-op mode. Two PCs, one LAN. Keyboard and mouse. No cloud services, no subscriptions.

Descent is a 1995 first-person space shooter from Parallax. It has six degrees of freedom. You fly through mines, fight robots, and destroy reactors. Source ports keep it playable on modern Windows.

First Attempt: DXX-Rebirth

We started with DXX-Rebirth. This port served the community for years. The upstream project retired in 2020.

The game ran. The network did not. We spent an evening finding out why.

What We Tested

We checked the network in layers:

  1. Firewall. We opened inbound UDP port 42424 on both PCs. We scoped the rules to the LAN subnet and the Tailscale range. All profiles. The rules were named “DXX-Rebirth UDP 42424”.
  2. Transport. We built a test: a UDP server on the laptop and a UDP client on the office PC. The client sent game-like probe packets. The server received them. Both directions passed. The network path was fine.
  3. Packet capture. We ran pktmon on the host during a join attempt. Zero packets arrived from the joining PC. The joiner sent nothing.

The network worked. The game did not use it.

What Actually Broke

Four separate problems stacked up:

  • Socket wedge. DXX-Rebirth has a known bug: the socket wedges after a host, join, and abort cycle. The game process runs for hours and then sends nothing on join. The fix is to quit fully and relaunch. See issue #289 on GitHub.
  • Broken LAN scan. The game announces itself over IPv6 multicast. Windows Firewall dropped those packets. The in-game “Find LAN Games” list stayed empty. Manual IP entry was the only path.
  • Dead tracker. The Rebirth tracker server did not answer. The game warned “no ack from tracker” every time. This warning is cosmetic for LAN play. It still confused us.
  • Join field trap. The “Game address” field on the join screen defaults to localhost. If you leave it, the game tries to join itself. It sends nothing. We typed the host IP every time.

We also found the joystick caused a crash. SDL2 crashed during gamepad enumeration on both PCs. The workaround is a -nojoystick line in the ini file. Keyboard and mouse work well for Descent.

None of this was the network. The engine refused to cooperate.

The Switch: DXX-Redux

DXX-Redux is a fork of DXX-Retro. It is actively maintained. Version 1.1 released in January 2025. The community uses it for multiplayer. The r/descent getting-started guide calls it the recommended port for multiplayer.

We dropped the same game data files into the Redux folder. We kept the same firewall rules. Same UDP port 42424.

The join worked on the first try.

The difference matters:

  • Maintained code. Redux fixes the socket and join bugs that Rebirth carried for years.
  • Better logging. Redux supports -netlog. Every run writes a netlog.txt file with network traffic. You can see what the game sent and received. Rebirth has no such feature.
  • Stable SDL. Redux uses SDL 1.2. The joystick crash from Rebirth did not appear.
  • Working community tracker. Redux points at a live community tracker. Not needed for LAN play. Useful for internet play.

Setup Steps

Follow these steps on both PCs.

  1. Install DXX-Redux 1.1 on each PC. Use the same game data files.
  2. Allow inbound UDP port 42424 in Windows Firewall on both PCs.
  3. Start the game on the host PC. Select Multiplayer, then Host Game.
  4. Pick Co-op mode. Pick a level. Press Start Game. The host enters the mine. The game is now open.
  5. On the joining PC, select Multiplayer, then Join Game.
  6. Type the host IP address. Do not leave localhost.
  7. Press Enter. The joiner appears in the mine.

Port 42424 is the default game port on both screens. Leave “My port” at 42424.

For play over the internet, use Tailscale. Both PCs join the tailnet. The joiner types the host’s Tailscale IP (100.x.x.x). No port forwarding needed.

Co-op Saves and Player Inventory

Descent co-op has one save system. The host controls it. It stores every player’s inventory.

How the Save Works

In co-op mode, the host presses F3 (or uses the menu) to save. The game writes a file named pilot.mg0 through mg9 in the game folder.

The save file contains:

  • The level state: robots, doors, triggers, and reactor state.
  • Every player’s full ship state: weapons, ammo, shields, energy, lives, score, and keys.

The save matches players by callsign (pilot name). Each pilot name must be unique and spelled the same every session. Matching is case-sensitive.

How to Resume a Session

  1. The host starts a new co-op game on the same level.
  2. All players join the game first.
  3. The host loads the save file.
  4. The game restores each player’s inventory by callsign.

Two rules prevent lost inventory:

  • Join before the host loads. The save only restores players who are connected when the host loads it. A player who joins later gets a default ship. Players connected but missing from the save get disconnected.
  • Keep the pilot name. A player who changes their pilot name does not match the save. They get a default ship.

The .plr File

Each pilot also has a local file named pilot.plr in the game folder. The game writes it when a player exits. It holds control settings and single-player progress.

In co-op, the host’s .mg save is the authority for inventory. The .plr file does not restore co-op inventory on its own.

Backing Up the Co-op Campaign

Copy these files from the host PC:

  • pilot.mg0 to pilot.mg9 – the co-op save slots.
  • The pilot .plr files from each PC – settings and single-player progress.

Store them in the same game folder to restore. Both PCs must run the same Redux version.

Troubleshooting Notes

SymptomCauseFix
Join hangs, nothing happensJoin address is localhostType the host IP
“No ack from tracker”Tracker offlineIgnore for LAN play
LAN game list emptyIPv6 multicast droppedJoin by manual IP
Firewall prompt keeps appearingBlock rules from declined promptsDelete block rules, add exe allow rule
Game crashes at startSDL joystick enumeration crashAdd -nojoystick to the ini
Second session will not connectSocket wedge (Rebirth only)Quit game fully, relaunch

Block rules beat allow rules in Windows Firewall. If someone declined the firewall prompt, the block rule kills the game silently. Check Get-NetFirewallRule -Action Block for Descent rules and delete them.

Summary

  • DXX-Rebirth is retired. Its multiplayer path broke in ways that looked like network problems.
  • DXX-Redux fixed every problem on the first try. Same port, same firewall rules, same data files.
  • Co-op saves are host-side .mg files. They hold every player’s inventory, matched by pilot name.
  • All players must join before the host loads the save. Pilot names must stay the same.

Leave a Reply

Your email address will not be published. Required fields are marked *