splitux fork of scheissgeist/Seamless — config-driven auto host/join for unattended 2-instance co-op
  • C++ 70.6%
  • JavaScript 11.1%
  • Python 9.7%
  • HTML 4.8%
  • Shell 1.4%
  • Other 2.4%
Find a file
gabrielgad 1f97319b36
All checks were successful
Build DS2 Seamless (splitux fork) / build (push) Successful in 45s
install: seed the ini, because a launcher patches it before first run
The mod writes a full commented ini on first run when none exists, so I had
install.sh write nothing — one definition of the defaults, in the code that
reads them.

That is wrong for the multi-instance case, and only checking the handler found
it. A launcher running several copies configures them by patching this file at
launch, which happens BEFORE the mod has ever run and had a chance to create
it. With no file to patch, every instance keeps the default port — and the host
is derived from 'port == host_port', so all of them would decide they were the
host. Removing the vendored ini from the handler repo would have broken exactly
that on a fresh install.

So: a stub, not a copy of the defaults. It names only the key a launcher varies;
everything absent still falls back to the mod's own default, so there is no
second copy to drift. An existing ini is never touched.
2026-08-15 09:20:40 -04:00
.github/workflows auto co-op: host/join from config, no overlay flipping 2026-08-09 07:28:48 -04:00
dist Restore Hamachi IP in joiner ini template 2026-04-06 22:31:20 -07:00
docs sync: aim at the guest's phantom state, and correct two facts that pointed elsewhere 2026-08-11 18:27:31 -04:00
include build: stamp a build id from git, and let the mod install itself 2026-08-15 09:15:08 -04:00
launcher Dark Souls 2: Seamless Co-op Mod - initial release 2026-03-17 18:07:09 -07:00
Release Disable anti-cheat thresholds, zero disconnect penalty score 2026-04-01 23:34:13 -07:00
server Remove leaked RSA private key, regenerate keypair, update .gitignore 2026-03-18 20:56:18 -07:00
src build: stamp a build id from git, and let the mod install itself 2026-08-15 09:15:08 -04:00
third_party Dark Souls 2: Seamless Co-op Mod - initial release 2026-03-17 18:07:09 -07:00
tools tools: index the whole RTTI graph, and add a greppable dump 2026-08-12 07:29:40 -04:00
.gitignore Add ds3os/build/ to gitignore 2026-04-01 21:24:04 -07:00
CHANGELOG.md sync: aim at the guest's phantom state, and correct two facts that pointed elsewhere 2026-08-11 18:27:31 -04:00
CMakeLists.txt build: stamp a build id from git, and let the mod install itself 2026-08-15 09:15:08 -04:00
CODE_REVIEW.md Save current state before custom server branch 2026-03-18 11:50:27 -07:00
deploypc2_joiner.bat Add Apr 16 session log + Batcomputer deploy scripts 2026-04-16 22:41:57 -07:00
DS2_CUSTOM_SERVER_TECHNICAL_BREAKDOWN.md ds3os custom server built and configured for DS2 2026-03-18 14:07:18 -07:00
install.sh install: seed the ini, because a launcher patches it before first run 2026-08-15 09:20:40 -04:00
LICENSE Dark Souls 2: Seamless Co-op Mod - initial release 2026-03-17 18:07:09 -07:00
mappc2.bat Add Apr 16 session log + Batcomputer deploy scripts 2026-04-16 22:41:57 -07:00
PROCESS.md Disable unverified memory offsets to stop crashes 2026-03-17 22:03:21 -07:00
README.md build: stamp a build id from git, and let the mod install itself 2026-08-15 09:15:08 -04:00
tmp_probe.bat Add Apr 16 session log + Batcomputer deploy scripts 2026-04-16 22:41:57 -07:00
tmp_probe2.bat Add Apr 16 session log + Batcomputer deploy scripts 2026-04-16 22:41:57 -07:00
tmp_probe3.bat Add Apr 16 session log + Batcomputer deploy scripts 2026-04-16 22:41:57 -07:00

Dark Souls 2: Seamless Co-op

Play through the entirety of Dark Souls 2: Scholar of the First Sin with friends. Boss kills, deaths, bonfires, fog gates — nothing disconnects you. One summon, the whole game.

Download

Get the latest release

Install

  1. Extract the zip
  2. Copy dinput8.dll into your game folder:
    Steam\steamapps\common\Dark Souls II Scholar of the First Sin\Game\
    
  3. Launch Dark Souls 2 through Steam — the mod loads automatically
  4. To uninstall, delete dinput8.dll from the game folder

You do not need to copy an ini. The mod writes ds2_seamless_coop.ini with its own defaults the first time it runs and never overwrites one you already have.

Installing it from something else

On Linux, or from a launcher or test harness, use the installer rather than reimplementing it:

./install.sh "/path/to/Dark Souls II Scholar of the First Sin/Game"
./install.sh --from-release v1.0.16-splitux "/path/to/.../Game"

This is the whole integration contract. Which files the mod consists of, that its load vector is named dinput8.dll, and what its config file is called are this project's business — a caller passes a game directory and gets a working install. Nothing outside this repository should carry a copy of the DLL or need to know its layout.

To assert that a given DLL is this mod, and which build, look for the literal prefix DS2-Seamless-splitux/ in the binary or in the first line of the log; it is stamped from git describe at build time. Do not grep for feature strings — a downstream provisioner checked for Auto co-op: to identify this build, and broke the day v1.0.13 removed that feature.

How to play

Load into the world first — both of you. Past the login, past the save, standing somewhere. The Host and Join buttons stay greyed out until you are, and that is not a formality: hosting from the title screen turns the session's protobuf filtering on before the game has run its own login, and that login then dies at the login server. The game sits on "logging in to the Dark Souls II game servers" forever and nothing in the menu recovers it.

Then:

  1. Open the co-op menu — F12 on keyboard, Select+Start on a pad
  2. One of you clicks Host Session
  3. The other clicks Join Session
  4. White Sign Soapstone to summon each other — "Grant Soapstones" in the menu if you have none
  5. Play

Joining the session is not the summon. The session is the link that keeps you together; getting into each other's world is still the game's own soapstone. One player lays a sign, the other activates it, and after that one summon the session carries you through bosses, deaths and fog gates.

Two things DS2 requires that this mod does not override:

  • The player doing the summoning must be Human. Hollow players cannot summon. Burn an effigy first. (The mod's hollowing clear is disabled — it wrote to the wrong offset and crashed, and has not been re-verified.)
  • Both players must be in the same area for the sign to be visible.

Laying a sign works fine while Hollow. Only the summoner is restricted.

No password, no IP. Both buttons act on ds2_seamless_coop.ini, which every instance shares.

On a pad

Select+Start opens and closes the menu, d-pad or left stick moves, A selects, B goes back and closes from the top. The chord is masked from the game, so opening the co-op menu does not also open the game's pause menu.

While the menu is open the pad is held back from the game — navigating does not swing your weapon. The keyboard key stays configurable via overlay_key; the pad chord does not.

Two instances on one machine

Both copies share one ini. The role is derived, not configured: the instance whose port equals host_port is the one that can bind it, and Join Session always dials 127.0.0.1:host_port. Give each instance its own port — under splitux that is game_patches_per_instance with "{instance+27015}" — and instance 0 lands on 27015 and hosts while instance 1 gets 27016 and joins. Two instances cannot both bind the host port, and there is no per-instance boolean to get backwards.

Leave password= empty. It is matched between peers, not verified against anything.

Connecting to friends

Use Host remote... / Join remote... for anyone off your machine — those keep the typed address form. A password is still optional; the address is not.

Setup What to do
Same network Use the LAN IP from the host menu
Over the internet Host forwards UDP port 27015 on their router, friends use the Public IP
No port forwarding Everyone installs Hamachi or ZeroTier, joins the same network, host shares the VPN IP

IPs are hidden by default in the menu for streamer safety. Click to reveal.

Features

  • Sessions survive boss kills, player deaths, bonfires, fog gates, and area transitions
  • In-game overlay menu (no alt-tabbing, no config editing)
  • One-click host and join for two instances on one machine
  • Full gamepad navigation, with the pad held back from the game while the menu is open
  • Optional session password
  • Real character names shown in player list
  • Player count displayed in the HUD
  • Join/leave notifications
  • Soapstone granting (uses the game's own ItemGive function)
  • Phantom timer automatically maxed (summons never expire)
  • Public and LAN IP with copy-to-clipboard
  • Auto-loads on game start (dinput8 proxy)

How it works

The mod hooks the game's protobuf serialization layer to intercept and block disconnect messages. When the game tries to end your co-op session after a boss kill, death, or transition, the message is silently dropped and the session continues. This is the same technique used by ds3os for Dark Souls 3 and by LukeYui's Seamless Co-op for Elden Ring.

Compatibility

  • Dark Souls 2: Scholar of the First Sin (Steam)
  • Windows 10 / 11
  • Linux via Proton — two instances under splitux, verified 2026-08-09
  • Tested on Ver 1.03, Calibrations 2.02

Building from source

Requires Visual Studio 2022 (C++ Desktop workload) and CMake 3.20+.

mkdir build && cd build
cmake ..
cmake --build . --config Release

Credits

  • ds3os by TLeonardUK — protobuf interception technique
  • Dear ImGui — in-game UI
  • MinHook — function hooking

License

MIT