[CO-OP] Cataclysm: Dark Days Ahead — Multiplayer Co-op
A two-player co-op fork of CDDA.
Why die alone when you can die together?_
tracks CDDA experimental (0.I+)
art by Delicadeath
Download
Community
- discord CDDA CO-OP
- issues bug report & feature request
Launch
- Unzip anywhere
- macOS: Open
Cddacoop.app— first launch needs right-click → Open to bypass Gatekeeper (unsigned app). If nothing happens, runxattr -cr Cddacoop.appin Terminal first. - Windows: Run
cataclysm-tiles.exe. SmartScreen may warn — click More info → Run anyway. - Linux: Extract the tarball and run
./cddacoop.shfrom inside theCddacoop/folder — the launcher loads the bundled libraries, so don't runcataclysm-tilesdirectly. Built on Ubuntu 22.04, so you need glibc 2.35+ (most current distros). If it won't start, make it executable first:chmod +x cddacoop.sh cataclysm-tiles.
The main menu is straight experimental CDDA, kept up to date, pretty much. The CO-OP menu item is new. Otherwise this plays as single-player CDDA.
- [2026-07-06]
- > Tilesets included now — all the tilesets ship in every release, like the upstream CDDA download
- > Custom hosting port — hosts can now set a custom listen port from the host menu (or `CDDA_MP_PORT` env var for the nerds) instead of defaulting to 8080.
- > Better reconnect logic — Connection hiccups of different sorts should now be noticed better and reconnect, eventually. Testing shows the game surviving 5–15 second drops in both directions (client losing the host, host losing the client).
- > A 'busy' host no longer blocks client from joining — Previously a client couldn't join if the host in that moment had their inventory or morale dialog up, (other panels too caused this).
- > Co-op kill tally in the HUD☠ — a running count of monsters killed for both players
- > Non-US build crash fix? — fixed a crash in non-US builds related to float number parsing (commas vs periods)
- > TCP optimizations — host now compresses world updates that it sends every turn; packs its messages into fewer packets and also sends them off immediately instead of waiting around to send a batch. Should be noticeable moreso over VPNs and long distance play.
- > Rejoining after a disconnect follows you properly now — if the host moved around while you were disconnected, rejoining used to leave you stuck at your old spot, unable to move, with your partner's info blank on the HUD. Reconnecting now properly catches you back up to where they are.
- [2026-06-29]
- > Killing monsters as the client is fixed — monsters you kill as the joining player no longer resurrect or drop duplicate corpses, hopefully.
- > Better partner stats + ping — the co-op panel now shows your partner's **mood**, **health** (worst-hurt body part), and **ping** in ms.
- > Monsters aggro on both players fairly — monsters used to prefer the client instead of whoever's actually closer... they should no longer pile onto the client player.
- > Construction works in co-op — small changes to make construction mostly usable. In-progress tiles now sync both directions, and build progress stays in sync.
- > Fewer co-op crashes & lockups — fixed a crash when a mutated character (e.g. with a tail) joined; the host can now save & quit and toggle Safe Mode even while waiting on a locked turn; the host survives the client disconnecting.
- > Movement & stamina match the host — client move costs and the stamina burned from smashing now behave the same as on the host.
- [2026-06-21]
- > Aiming and firing fixed for clients — the joining player can aim and shoot again: no more missing aim panel, dropped keys or the client locking up when entering aim mode.
- > Joining drops you more reliably into your host's world... — a joining player could spawn in a separate, mismatched world instead of next to the host. Hopefully this is vanquished.
- [2026-06-17]
- > Z-level fixes — when you and your partner are on different z-levels, the ground should sync correctly and the overmap should match up. Ramps/bridges should not impede the client anymore.
- > In-game text chat! — Bind `Co-op chat` to a key and chat w/ your partner. Kept in messages and a new 3-line area above the co-op panel bottom left. (Alternately you can yell a sentence if you're close enough)
- [2026-06-13]
- > Co-op warns you about untested mods — any enabled mod that isn't bundled with the game (third-party / downloaded mods) now shows a co-op warning in the mod menu instead of silently passing. A mod mismatch between host and client is a common cause of the joining player crashing, so both players should run the exact same mods.
- > Merge with upstream CDDA — 371 commits of upstream changes: new content, balance and fixes
- > Now on itch.io — releases now mirror to itch.io alongside the downloads here
- [2026-06-09]
- > macOS: co-op keeps its own save folder now — (Windows and Linux were already separate). Co-op no longer shares its saves, fonts, and options with single-player CDDA (both used the same folder). If your menus showed the wrong sans-serif font, that was single-player’s config bleeding in, now fixed. Also: co-op reads from this new folder, so existing co-op worlds won’t appear automatically. Copy them over yourself from `~/Library/Application Support/Cataclysm/save/<world>` into `~/Library/Application Support/Cddacoop/save/`. (The app never touches your single-player folder on its own.)
- [2026-06-08]
- > Debug: new random monster spawn — good luck!
- > Better recovery from players deadlocking — a client whose action got stuck mid-turn now recovers on its own instead of forcing a quit.
- > More visibility on game version — your build's commit hash now shows in the title bar and the in-game bug report (debug menu), so you can confirm you're on the same version as your partner
- [2026-06-05]
- > Linux build — native Linux x64 download now ready... Untested so please give feedback.
- > Stamina fix for the joining player (client) — the client's stamina now recovers at the proper rate instead of crawling, and you no longer rack up extra bleeding, pain, or thirst while it's not your turn. Hopefully.
- [2026-06-04]
- > Maps now match, finally — the host's overmap is streamed to the client on join so both players reliably see the same towns, roads, and regions on the minimap and overmap.
- > Debug: new random item spawn — debug spawn menu drops a random item, for fun
- [2026-06-01]
- > Combat messages full synced — Your partner's hit/kill/event messages now correctly show up, either host or client.
- [2026-05-31]
- > One macOS download for every Mac — the mac build is now a universal binary that runs on both Silicon and Intel Macs (macOS 10.15+)
- > High-five your partner — new co-op "High five" option! Slap skin for a quick mutual morale boost. Bindable in options and added to the bump partner menu alongside trade, push, pass item, etc.
- [2026-05-27]
- > Trading between players — totally works
- > Pass item -- new feature for co-op! bump into your partner and see a new option called "Pass item" (g) to hand over one item without the full trade menu. Like throwing your man a loaded Saiga. Bindable in options menu.
- > Overmap note sync — any map notes and custom markers show on both players' maps
- [2026-05-25]
- > Grab & haul — client can grab furniture and push/pull/shift it; hauling items works for both players
- > Turn indicators — red/green co-op panel border shows whose turn it is at a glance
- > Vehicle construction — client can install and remove vehicle parts
- [2026-05-23 — 2026-05-24]
- > CO-OP main menu — self-contained Host/Join flow replaces the old shell-script launcher; worlds tagged as co-op get a badge
- > Partner help — new menu item "Help with task" in the partner menu (when you bump into them) lets you assist with crafting, construction, and vehicle work
- > Fast-forward — if both players are in passive activities (sleep, wait) or longer activities turns skip ahead quickly
- > Host driving sync — vehicles driven by the host broadcast per-tile position updates to the client; both players can drive now, even SEPARATE VEHICLES.
- > Recent hosts — join screen remembers the last few IPs
- > Partner activity and health status bar -- see your buddy's health (calculated as worst bodypart) and what they're doing in the new co-op panel (also move mode so you can run when they do)
- [2026-05-16 — 2026-05-18]
- > Lockstep turn system — grant/wait cycle keeps both players synchronized; host waits for client before advancing monsters
- > Activity sync — long actions (eating, dropping, reloading) work for both players with proper lockstep integration
- > Partner menu — new partner menu item (when you bump into them) called 'Tap on shoulder' which interrupts their waiting ('wait for several minutes` action)
- [2026-05-07 — 2026-05-12]
- > Initial multiplayer — TCP server/client, NPC proxy used as framework for remote/client player, tile/monster/field sync, movement dispatch
- > Combat — both players can attack in turn against the same enemy... or multiple. melee and ranged damage forwarded and applied server-side w/ proper kill attribution
- > Vehicles — client can drive, turn, toggle engine; vehicle state (part HP, fuel) synced to client
- > Traps & graffiti — synced in tile broadcast; client triggers traps server-side
- > Appearance sync — skin tone, hair, clothing, wielded weapon, and sprite facing all mirrored between players
- > The Dream Begins
Play
Every co-op game is the same two steps, the only thing that changes is which IP the host shares, and that depends on where you're playing (below).
- Host: CO-OP > Host > New character (or Load existing character). Pick or create a world, then share your IP with your partner.
- Join: CO-OP > Join > paste the host’s IP (recent hosts are remembered; port defaults to 8080). New character or Load existing character.
Same computer (two windows or two monitors)
Both players on one machine? Nothing to set up, just launch the app
twice. One window/monitor hosts; the other joins using 127.0.0.1
(the host computer itself).
Same Wi-Fi or LAN
On the same network you don't need a VPN, the host just
shares its local IP (looks like 192.168.x.y).
# host on macOS, find your local ip (try en1 if en0 is empty) ipconfig getifaddr en0 # host on Windows, find your local ip (use the IPv4 Address) ipconfig # client, in CO-OP > Join, paste the host's local ip # (looks like 192.168.x.y, port defaults to 8080)
Over the internet (different networks)
This is for different networks, anywhere in the world. You need a way to reach the host across
the internet and get an open port. The smoothest is
Tailscale,
a free mesh VPN that gives both machines a stable private IP
(100.x.y.z) and treats them like they're on the same
network. No manual port forwarding setup no router config. Install on both machines
and sign in (free for personal use).
To add your partner to your Tailscale account:
- Go to the Machines page on your Tailscale admin console
- Find the PC or server hosting the game. Click the menu (three dots) next to it and select Share this machine. Type in your friend's Tailscale email address.
- Your friend will receive an email or link. Once they accept, they will see your device in their Tailscale app.
The host and client IPs should also show in the Tailscale app under Devices, or in the admin console under Machines at Tailscale Admin. With CLI you can do `tailscale ip -4` as the host and send that to the client for their Join IP.
Tailscale is the smoothest option, but it’s not the only one:
> ZeroTier (alternative mesh VPN)
Same idea as Tailscale, different vendor. Free, peer-to-peer by default, no port forwarding. Useful if a partner already uses ZeroTier for something else.
# both: install zerotier from zerotier.com # one player: create a free network at my.zerotier.com, # grab its 16-character network id, approve both members # both: join that network using the id # host, find your zerotier ip (usually 10.x.x.x) zerotier-cli listnetworks # client, paste the host's zerotier ip into CO-OP > Join
> ngrok tunnel (no install on the client)
The host runs a one-line tunnel that gives the connection a public address. The client just needs the URL, no VPN install on their end. Free tier disconnects after a few hours, fine for a session.
# host: sign up at ngrok.com (free), install ngrok # host: launch the app and arm Host from the in-game CO-OP menu # host: in a terminal ngrok tcp 8080 # ngrok prints something like # Forwarding tcp://2.tcp.ngrok.io:14721 -> localhost:8080 # client, paste whatever ngrok printed into CO-OP > Join
> Router port forwarding (direct, no third party)
Most involved option, but nothing extra to install or sign up for.
Won’t work behind carrier-grade NAT (most mobile hotspots, some
rural ISPs, university dorms). If your public IP starts with
100.64. or 10., you’re on CGNAT and
should use one of the options above instead.
# host: log into your router (usually 192.168.1.1) # forward TCP port 8080 to your computer's local ip # host: find your public ip and send it to your partner curl ifconfig.me # client, paste the host's public ip into CO-OP > Join
Optional: a free dynamic DNS service like duckdns.org gives you a hostname that keeps working when your ISP rotates your IP.
What works
- Movement, melee combat, smashing terrain and furniture
- Vehicle driving by client and host (including being a passenger)
- Item pickup, drop, wear, wield, use (single-tile and adjacent)
- Eating, drinking, short consumption activities (both players simultaneously)
- Host and client appear as NPC proxies in each other's world with correct clothing and skin tone
- Monster sync with damage messages
- Client ranged / thrown / spell damage forwarded and applied server-side
- Field sync (blood, fire, acid)
- Tile sync (terrain, furniture, items, graffiti)
- Trap sync — client triggers traps server-side
- Vehicle state sync — part HP, fuel, name messages
- Vehicle construction — install and remove parts
- Drop-into-vehicle (drop items into the storage of a vehicle you're standing on)
- In-game text chat: bind
Co-op chatto a key to message your partner... yelling still works too - Trading: full trade menu between players (in addition to the new "Pass item" action, below)
- Different z-levels — ground and overmap stay in sync when players are on different levels; ramps and bridges work now as expected
- Separate vehicles — both players can drive their own vehicles
- Fast-forward — turns skip ahead when both players are in long waits or long activities
- Co-op HUD — bottom-left panel showing partner name, movement mode, mood, worst-body-part HP bar, current activity + progress, and ping in ms
- Partner menu co-op special actions — bump into your partner to open i: "*Tap on shoulder*" interrupts their wait, "*Help with task*" works like single-player NPC help, "*Pass item*" quickly tosses them one thing and "*High five*" gives a small morale bonus (just like real life)
Known limitations
- Same reality bubble (for now), centered on the host. There's only one simulated area (not one per player), so you have to stay near each other, within about 60 tiles. You'll get escalating warnings as you drift apart, and past about 68 tiles you leave the host's simulated zone and things break (vehicle physics especially). The world does not auto-pause... so try and close the gap when the warning shows.
- The host has to stay running. It's a listen server, not a dedicated one: if the host quits or loses connection, the session ends for both players.
- Sleep should work, but isn't fully developed yet. Coordinate sleep times with your partner or expect the occasional issue.
- Does CO-OP change hardware requirements?
- > It's about the same as single-player CDDA. The simulation is CPU-bound and single-threaded, RAM is modest (~0.5 to 2 GB), and the tiles renderer barely touches the GPU.
- > Co-op does not double the CPU cost. There is one shared simulation area centered on the host, not one per player, so the host runs roughly single-player plus a little overhead, not 2x.
- > Obviously the new requirement is the network; the host streams world updates to the client every turn, so a faster connection and hardware helps here.
- So the better computer/connection should be the host?
- > Yes. The host runs the full world simulation, serializes the changed state every turn, and uploads it to the client, so it does the heavy lifting.
- > The client mostly renders what the host sends and waits its turn, so it is lighter on CPU; and memory use is similar to single-player.
- How does it work under the hood?
- > One machine is the host: it runs the real game. The client sends actions over a TCP connection and gets back the world state to draw, tiles, monsters, the other player.
- > The second player is wired in as a special NPC on the host (like a proxy), so existing systems like combat, driving and melee already treat them as a real character. The client's input is intercepted at the same point the game already routes keypresses, then run on the host.
- > There is one shared simulation bubble centered on the host, and a per-turn grant/wait handshake keeps both players in lockstep so the world does not desync.
- How does saving work?
- > The host's save holds the shared world (map, your partner's inventory, kill count, everything simulated), and each player's own local save holds their character (stats, skills, appearance + mutations). That's what "Load existing character" restores when you join.
- > Quicksave: the most reliable option, both players get an on-screen confirmation once the host's copy is up to date, so you know it worked. Save & quit: also saves everything on both sides, just without the round-trip confirmation. If you're the one joining save & quit periodically so your character carries over. Ideally you quicksave together right before you stop for the day, so both saves are fresh and in sync.
- Is it free?
- > Free and open source. It's a fork of the experimental branch of CDDA.
- What version of CDDA is this based on?
- > It's a fork of CDDA experimental, kept current with the upstream code. This means everything in the 0.I release plus current experimental (June 2026 and any future updates).
Survivors before us
Forked from CleverRaven/Cataclysm-DDA experimental.