- C++ 70.6%
- JavaScript 11.1%
- Python 9.7%
- HTML 4.8%
- Shell 1.4%
- Other 2.4%
|
All checks were successful
Build DS2 Seamless (splitux fork) / build (push) Successful in 45s
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. |
||
|---|---|---|
| .github/workflows | ||
| dist | ||
| docs | ||
| include | ||
| launcher | ||
| Release | ||
| server | ||
| src | ||
| third_party | ||
| tools | ||
| .gitignore | ||
| CHANGELOG.md | ||
| CMakeLists.txt | ||
| CODE_REVIEW.md | ||
| deploypc2_joiner.bat | ||
| DS2_CUSTOM_SERVER_TECHNICAL_BREAKDOWN.md | ||
| install.sh | ||
| LICENSE | ||
| mappc2.bat | ||
| PROCESS.md | ||
| README.md | ||
| tmp_probe.bat | ||
| tmp_probe2.bat | ||
| tmp_probe3.bat | ||
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
Install
- Extract the zip
- Copy
dinput8.dllinto your game folder:Steam\steamapps\common\Dark Souls II Scholar of the First Sin\Game\ - Launch Dark Souls 2 through Steam — the mod loads automatically
- To uninstall, delete
dinput8.dllfrom 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:
- Open the co-op menu — F12 on keyboard, Select+Start on a pad
- One of you clicks Host Session
- The other clicks Join Session
- White Sign Soapstone to summon each other — "Grant Soapstones" in the menu if you have none
- 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