LAN multiplayer MelonLoader mod for SIGNALIS.
v0.5.1 — protocol v10. Host owns world and story; the client is a real Elster whose interactions go to the host and apply via native game methods (including UnityEvents and world FMOD).
Formerly labeled 1.2.x-dev. That was optimistic. This is still early co-op.
- SIGNALIS (Steam or a second install)
- MelonLoader with Managed assemblies (
MelonLoader\Managed, Unhollower-style) - Same chapter/scene on every peer
- Same mod DLL on every peer (protocol 10)
- Install MelonLoader in the SIGNALIS folder.
- Build or copy
SyncRADation.dll+LiteNetLib.dll→SIGNALIS/Mods/. - Launch once so assemblies generate if needed.
export DOTNET_ROOT="$HOME/Unity/Hub/Editor/6000.6.0f1/Editor/Data/DotNetSdk"
export PATH="$DOTNET_ROOT:$PATH"
cd "$HOME/Work/MyProjects/SyncRADation (SIGNALIS MP REMAKE)"
dotnet build SyncRADation.csproj -c DebugOverride install paths:
dotnet build -p:SignalisDir="$HOME/Work/MyProjects/SIGNALIS" \
-p:ClientSignalisDir="$HOME/.local/share/Steam/steamapps/common/SIGNALIS"Debug builds copy into both $(SignalisDir)/Mods (client copy) and $(ClientSignalisDir)/Mods (Steam host) when those dirs exist.
- Host: Steam SIGNALIS (Proton) — MelonLoader 0.5.7 under
steamapps/common/SIGNALIS. Launch options:WINEDLLOVERRIDES="version=n,b" %command% -screen-fullscreen 0 -screen-width 2560 -screen-height 720 - Client:
secondsignalis→~/Work/MyProjects/SIGNALIS(same windowed half-height; separate Proton prefixcompatdata/syncradation-client) - Hyprland stacks them: host top half, client bottom half (same workspace)
- Both need
boot.configsingle-instance=0
- Everyone loads the same chapter scene.
- Host: F2 → Host Game (UDP
7777, keySyncRADation). - Each client: F2 → IP → Connect, or F3 with the saved address.
- Host dumps world state to that joiner. If doors/pickups look wrong → Resync world.
- SCENE MISMATCH means the client is loading the host chapter automatically (SceneFollow). If it sticks, load the same chapter manually.
| Key | Action |
|---|---|
| F2 | Multiplayer menu (Host / Connect / Resync / status) |
| F3 | Quick connect (saved IP/port) |
| G | Drop highlighted inventory slot (or DROP in the item command list) |
| F6 | Item giver |
| F7 | Location teleporter (chapters + rooms in the current level) |
| F11 | Entity spawner (any replika type; host-authoritative) |
Walk up to a player-dropped prop for the native TAKE prompt (yes/no inspect, ammo count). No extra pickup key.
| Area | Authority | Notes |
|---|---|---|
| Avatar proxy, anim, bones, weapons | Peer | State + bones ~30 Hz |
| Enemies | Host | WorldId snaps; native TakeDamage; client hits Harmony → host |
| Doors (double / sliding) | Any peer emit, host relay | Visual open/close via native methods |
| ConnectedDoors (room links) | Lock only | Never sync traverse / StartA/StartB — room entry is local |
| Story (Dialoguer, cutscenes, SProgress) | Host | Flags commit; books/notes/EventScreen inspect stay local; story Dialoguer Start/Continue/End from the client plays on the host |
| Puzzles / locks / elevators / radio module / storage / event zones | Host + client emit | WorldId-keyed; storage contents shared; protocol-10 GunCase/AraNest/RifleQuest/Microfiche |
| World ItemPickups | Host claim/grant | Claimer gets the item; unique Key/Object go on the party key ring |
| Player-dropped items | Peer + relay | G / inventory DROP; sits on the floor; native TAKE inspect (yes/no + count); join dump |
| Death | Asymmetric | Native HurtElster; client downed (drops bag); host death reloads last save for both |
| Bosses (END / Chimera / Mynah / Kolibri / Adler) | Host | Light-field sync |
| Friendly fire | Opt-in | Default off |
| Inventories | Independent | By design |
World objects are identified by hash(scene + hierarchy path) — never GetInstanceID(). Layout: Domains/ (see Domains/README.md); agent rules in AGENTS.md.
Dual-instance soak is your gate. Code for protocol 10 is in this build. Do not treat any of this as proven until you play it.
| Role | Install | MelonLoader log |
|---|---|---|
| Host | Steam SIGNALIS | ~/.local/share/Steam/steamapps/common/SIGNALIS/MelonLoader/Latest.log |
| Client | ~/Work/MyProjects/SIGNALIS |
~/Work/MyProjects/SIGNALIS/MelonLoader/Latest.log |
Prefs (each): .../SIGNALIS/UserData/MelonPreferences.cfg → [SyncRADation] VerboseLogging.
- Always-on:
[Story][Interact][KeyRing][Scene][Door][Puzzle][Pickup][Hitch][Enemy]… (boot banner lists all). Lines prefixedH/Cwhen connected. - VerboseLogging: leave false for soak; set true on both installs only when hunting FMOD / proxy clone / puzzle diffs; restart or re-Host after flip.
- Hitch (spike-only):
frame/send gap/recv/ Cost tagspuzzleenemybosspickupweaponClone/5ssummary. Full table inAGENTS.md→ Diagnosis. - Look for
Handshake OK,[Harmony] patched,WorldRegistry,full world snapshot. Identical lines collapse for 3s.
| Key | Default | Meaning |
|---|---|---|
| ConnectAddress | 127.0.0.1 | F3 IP |
| ConnectPort | 7777 | UDP |
| FriendlyFire | false | PvP damage |
| SyncPuzzles | true | Puzzles / radio / elevators / etc. |
| SyncWorldPickups | true | Scene ItemPickup |
| SyncPlayerVitals | true | HP / death packets |
| VerboseLogging | false | OFF unless diagnosing (FMOD/proxy/puzzle diffs); both installs |
Dual-instance LAN, same protocol-10 build. Steam host + copy client, same chapter. This is the remaining work. Do not treat any of this as proven until you play it.
After this correctness pass:
- Penrose: photo inspect local; cryo pattern; BrokenKey does not hide photo; Tape+BrokenKey on client; both walk airlock independently; host staying in wreck does not yank
- Key door: one unique key, both traverse; no-key locked links stay red NO ENTRY
- Ammo/health pickup: partner
hasItemstays false - Enemy: host HP not double; client hit registers on host; host death reloads both
- Client downed → disconnect → can move and take damage again
- Notes/books stay local; a real story Dialoguer line started by the client plays on host
- Chapter load via int and string; LoadingScreen does not dump
- Elevator flags (no remote ride cinematic); radio lock frequency; FMOD loop present on late join
Then Chapter 1 (Reeducation → Mines elevator) notepad: both deal damage; neither yanked through doors; one Dialoguer with VO; one cutscene with audio; storage box host-put / client-take.
GitHub zip is the publish path until that run is enjoyable. Nexus waits on that approval.
Copyright (C) 2026 Warexpor.
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
The full license text is in LICENSE.