SULFUR Together
Co-op multiplayer for SULFUR: host-authoritative synced runs, enemies, bosses, downed/revive, in-game connect UI (Direct IP + Steam). Public Beta. All players must run the same version.
| Date uploaded | 2 weeks ago |
| Version | 1.0.1 |
| Download link | ryuka_labs-SULFUR_Together-1.0.1.zip |
| Downloads | 133 |
| Dependency string | ryuka_labs-SULFUR_Together-1.0.1 |
This mod requires the following mods to function
BepInEx-BepInExPack
BepInEx pack for Mono Unity games. Preconfigured and ready to use.
Preferred version: 5.4.2100ryuka_labs-SULFUR_Native_UI_Lib
A native Options screen UI library for SULFUR BepInEx mods.
Preferred version: 0.10.1README
SULFUR Together
Co-op multiplayer for SULFUR.
Language: English · 简体中文 · 日本語
Version 1.0.1 — Public Beta bugfix release. It works, but it is still being polished. Expect bugs, back up your saves, and make sure everyone runs the same version.
English
SULFUR Together lets you play SULFUR co-op. Explore the same procedurally generated levels, fight enemies together, revive downed teammates, see each other's weapons and attacks, break objects in the world, and drop items for each other.
You connect inside the game now — there is a built-in menu for hosting and joining over Direct IP or Steam. No config-file editing.
⚠️ Public Beta notice
This is a public test build. The main loop works from start to finish, but many systems are still being optimized and there is a lot left to refine.
- Bugs, visual desyncs, and the occasional broken boss or level transition can happen.
- Back up your save files before playing.
- Every player must use the same version of SULFUR and the same version of SULFUR Together.
This release is for players who are happy to test unfinished multiplayer and report problems.
Requirements
- SULFUR (Steam)
- BepInEx 5 — installed automatically as a dependency
- SULFUR Native UI Lib 0.10.1 — installed automatically as a dependency. It powers the in-game connect menu, notifications, and translations.
You do not have to install these by hand if you use a mod manager (below).
How to install (recommended: Gale)
Gale is a free, beginner-friendly mod manager. If you have never modded a game before, use this.
- Download Gale from its official page: https://github.com/Kesomannen/gale — open the Releases section and grab the latest installer for your system.
- Install and open Gale. When it asks which game to manage, choose SULFUR.
- Open the Browse mods tab and search for SULFUR Together.
- Click Install. Gale automatically pulls in everything it needs (BepInEx and SULFUR Native UI Lib) — you do not need to install those separately.
- Press the Launch game (modded) button inside Gale. The first launch takes a little longer while BepInEx sets itself up.
- Every player who wants to join must do the same steps and install the same version.
That's it — you're ready to host or join from inside the game.
Manual install (advanced, without a mod manager)
- Install BepInEx 5 for SULFUR.
- Download SULFUR Native UI Lib and SULFUR Together from Thunderstore.
- Put
SULFUR Together.dll,LiteNetLib.dll, and thelangfolder intoBepInEx/plugins/SULFUR Together/, and install the UI Lib into its ownBepInEx/plugins/folder the same way. - Launch the game.
How to connect
Co-op is hosted and joined from inside a loaded save (not from the title screen).
- Load into your game (the hub or any level).
- Open the Options menu and go to the SULFUR Together page.
- Set your Player name.
- To host: press Create game. Then either:
- Steam: press Invite Friends via Steam — no port forwarding needed; or
- Direct IP: share the LAN address shown on the page (and, over the internet, forward the UDP port or use a VPN LAN). Everyone must use the same Connection key.
- To join:
- Steam: accept the invite (it joins automatically once you load a save), or paste the host's Steam ID and press Join via Steam; or
- Direct IP: enter the host's address, port, and connection key, then press Join game.
- Use Close room (host) or Leave (client) to end the session.
Your settings save automatically as you type. Quick keys still exist: Page Down links/follows the host, Page Up unlinks and returns you to solo play.
Features
- Host-authoritative multiplayer over LiteNetLib
- Synced procedural level generation, seeds, and level transitions
- Remote players, held weapons, and player projectiles
- Enemy movement/combat sync; host-authoritative enemy damage, deaths, and ranged attacks
- Co-op downed / revive / death flow with an on-screen rescue prompt
- Boss-encounter sync for several bosses (Cousin, Witch, Lucia, Desert boss, …)
- Synced destructible objects and player-dropped items
- Independent per-player character, inventory, equipment, progression, and save
- Friendly-fire session setting (chosen by the host)
- End-of-run stats cards and join/leave notifications
- 14-language interface
Saves, inventory, and loot
SULFUR Together does not use a shared character save. Each player keeps their own character, inventory, equipment, progression, personal loot, and save data. Items you deliberately drop into the world can be picked up by others. Shared-loot options are planned for a future version.
No-pause multiplayer
The world does not pause while multiplayer is active — opening the inventory, the pause menu, dialogue, or moving the window out of focus does not stop the game. This is intentional, so players don't desync. Get to a safe spot before opening menus.
Known issues
- A client that loads a boss level ahead of the host can desync (e.g. Cousin "infinite dialogue").
- Some enemies may briefly snap, teleport, or animate incorrectly.
- Bosses beyond the tested set may have serious sync problems.
- Blood, particles, sounds, and some animations are not always synchronized.
- Player collision is experimental; remote sprites/weapons are still being refined.
- Sessions with 4+ players are untested — 2 players is the most predictable.
This list is not exhaustive.
Feedback & bug reports
Thunderstore does not support bug reports or comments, so please report elsewhere:
- GitHub Issues (recommended): https://github.com/ryuka-dev/SULFUR-Together/issues
- Nexus Mods: the mod's Bug Reports section
A good report includes: both host and client LogOutput.log files, who hosted, where it happened (level/boss), who triggered the event, what each player saw, whether it reproduces, and your other installed mods. Reports with both logs are far more useful than one side alone.
Disclaimer
This is an unofficial, fan-made mod. It is not affiliated with or endorsed by Perfect Random or the SULFUR developers. SULFUR and its assets are the property of their respective owners.
简体中文
SULFUR Together 是一个让你和好友联机合作游玩 SULFUR 的模组。一起探索相同的随机生成关卡、并肩作战、救起倒地的队友、看到彼此的武器和攻击、破坏场景物件,并为对方丢下物品。
现在在游戏内即可联机——内置菜单支持通过 直连 IP 或 Steam 创建/加入房间,无需手动改配置文件。
⚠️ 公开测试版说明
这是一个 公开测试版(Public Beta)。主体流程已能从头玩到尾,但许多系统仍在优化中,还有大量待打磨的部分。
- 可能出现 Bug、画面不同步,偶尔会有 Boss 或关卡切换异常。
- 游玩前请备份你的存档。
- 所有玩家必须使用相同版本的 SULFUR 和相同版本的 SULFUR Together。
本版本面向愿意测试未完成的联机功能并反馈问题的玩家。
环境要求
- SULFUR(Steam 版)
- BepInEx 5——作为依赖自动安装
- SULFUR Native UI Lib 0.10.1——作为依赖自动安装。它提供游戏内联机菜单、通知与多语言翻译。
如果使用下面推荐的模组管理器,你无需手动安装这些依赖。
安装教程(推荐使用 Gale)
Gale 是一个免费、对新手友好的模组管理器。如果你此前从未给游戏装过模组,请使用它。
- 从官方页面下载 Gale:https://github.com/Kesomannen/gale ——打开 Releases(发行版) 一栏,下载适合你系统的最新安装包。
- 安装并打开 Gale。当它询问要管理哪个游戏时,选择 SULFUR。
- 打开 Browse mods(浏览模组) 标签页,搜索 SULFUR Together。
- 点击 Install(安装)。Gale 会自动装好所需的一切(BepInEx 和 SULFUR Native UI Lib),你无需另行安装。
- 在 Gale 内点击 Launch game(启动游戏,已加载模组) 按钮。首次启动会因为 BepInEx 初始化而稍慢一些。
- 每一位想加入的玩家都要做同样的步骤,并安装相同的版本。
完成后,你就可以在游戏内创建或加入房间了。
手动安装(进阶,不使用模组管理器)
- 为 SULFUR 安装 BepInEx 5。
- 从 Thunderstore 下载 SULFUR Native UI Lib 和 SULFUR Together。
- 把
SULFUR Together.dll、LiteNetLib.dll和lang文件夹放进BepInEx/plugins/SULFUR Together/,并用同样方式把 UI Lib 装进它自己的BepInEx/plugins/目录。 - 启动游戏。
如何联机
联机需要在已载入的存档中进行(不能在标题界面)。
- 载入你的游戏(大厅或任意关卡)。
- 打开 Options(设置) 菜单,进入 SULFUR Together 页面。
- 设置你的 Player name(玩家名)。
- 作为房主: 点击 Create game(创建游戏),然后二选一:
- Steam: 点击 Invite Friends via Steam(通过 Steam 邀请好友)——无需端口转发;或
- 直连 IP: 把页面上显示的 LAN 地址 分享给队友(跨公网时需转发 UDP 端口或使用虚拟局域网)。所有人必须使用相同的 Connection key(连接密钥)。
- 作为加入者:
- Steam: 接受邀请(载入存档后会自动加入),或粘贴房主的 Steam ID 后点击 Join via Steam;或
- 直连 IP: 填入房主的地址、端口和连接密钥,再点击 Join game(加入游戏)。
- 用 Close room(关闭房间,房主) 或 Leave(离开,客机) 结束会话。
设置会在你输入时自动保存。快捷键依然可用:Page Down 链接并跟随房主,Page Up 取消链接、回到单人游玩。
功能一览
- 基于 LiteNetLib 的主机权威联机
- 同步的随机关卡生成、种子与关卡切换
- 远程玩家、手持武器与玩家子弹同步
- 敌人移动/战斗同步;主机权威的敌人伤害、死亡与远程攻击
- 合作的倒地/救援/死亡流程,附带屏幕救援提示
- 多个 Boss 的战斗同步(大表哥、女巫、Lucia、沙漠 Boss……)
- 可破坏物件与玩家丢落物品的同步
- 每位玩家独立的角色、背包、装备、进度与存档
- 友军伤害(友伤)会话开关(由房主决定)
- 结算统计卡片与加入/离开通知
- 14 种语言界面
存档、背包与掉落
SULFUR Together 不使用共享角色存档。每位玩家保留自己的角色、背包、装备、进度、个人掉落与存档数据。你主动丢到世界里的物品可以被其他人捡起。共享掉落等选项计划在未来版本加入。
联机不暂停
联机进行时游戏世界不会暂停——打开背包、暂停菜单、对话或把窗口切到后台都不会让游戏停下。这是有意为之,以避免玩家之间不同步。打开菜单前请先到安全的位置。
已知问题
- 客机若比房主提前进入 Boss 关,可能不同步(例如表亲“无限对话”)。
- 部分敌人可能出现瞬移、抽动或动画错误。
- 已测试之外的 Boss 可能存在严重同步问题。
- 血液、粒子、音效与部分动画不一定同步。
- 玩家碰撞仍是实验性的;远程贴图/武器仍在打磨中。
- 4 人及以上的会话未经测试——2 人最为稳定。
以上并非完整清单。
反馈与错误报告
Thunderstore 不支持提交反馈或评论,因此请通过以下渠道反馈:
- GitHub Issues(推荐): https://github.com/ryuka-dev/SULFUR-Together/issues
- Nexus Mods: 模组页面的 Bug Reports 栏目
一份好的报告应包含:房主与客机双方的 LogOutput.log 日志、谁是房主、问题发生在哪里(关卡/Boss)、由谁触发、每位玩家各自看到了什么、能否复现,以及你安装的其他模组。同时提供双方日志的报告远比只有一方的有用。
免责声明
这是一个非官方的粉丝制作模组,并非由 Perfect Random 或 SULFUR 开发者授权或认可。SULFUR 及其素材归各自的权利人所有。
日本語
SULFUR Together は、SULFUR を**協力プレイ(Co-op)**で遊ぶためのMODです。同じ自動生成ステージを一緒に探索し、敵と共に戦い、倒れた仲間を蘇生し、お互いの武器や攻撃を確認し、オブジェクトを破壊し、アイテムを落として渡し合えます。
接続はゲーム内で完結します——ダイレクトIPまたはSteamでホスト/参加できる専用メニューを内蔵。設定ファイルを編集する必要はもうありません。
⚠️ パブリックベータについて
これは**公開テスト版(Public Beta)**です。メインの流れは最初から最後まで動作しますが、多くのシステムはまだ調整中で、改善すべき点が数多く残っています。
- バグ、表示のずれ、ボスやステージ遷移の不具合が起きることがあります。
- プレイ前にセーブデータをバックアップしてください。
- 全プレイヤーが同じバージョンの SULFUR と同じバージョンの SULFUR Together を使用する必要があります。
本リリースは、未完成のマルチプレイをテストし、問題を報告してくださる方向けです。
動作環境
- SULFUR(Steam版)
- BepInEx 5——依存関係として自動でインストールされます
- SULFUR Native UI Lib 0.10.1——依存関係として自動でインストールされます。ゲーム内の接続メニュー・通知・翻訳を担います。
下記のMODマネージャーを使えば、これらを手動でインストールする必要はありません。
インストール方法(Gale を推奨)
Gale は無料で初心者にも扱いやすいMODマネージャーです。MODを入れるのが初めての方は、これを使ってください。
- 公式ページから Gale をダウンロード:https://github.com/Kesomannen/gale ——Releases の項目を開き、お使いの環境向けの最新版を入手します。
- Gale をインストールして起動します。管理するゲームを尋ねられたら SULFUR を選びます。
- Browse mods タブを開き、SULFUR Together を検索します。
- Install をクリックします。Gale が必要なもの(BepInEx と SULFUR Native UI Lib)を自動でまとめて導入するので、個別に入れる必要はありません。
- Gale 内の Launch game(MOD適用で起動) ボタンを押します。初回起動は BepInEx の初期化のため少し時間がかかります。
- 参加したいプレイヤー全員が同じ手順を行い、同じバージョンをインストールしてください。
これで、ゲーム内からホスト/参加できます。
手動インストール(上級者向け・マネージャーなし)
- SULFUR に BepInEx 5 をインストールします。
- Thunderstore から SULFUR Native UI Lib と SULFUR Together をダウンロードします。
SULFUR Together.dll、LiteNetLib.dll、langフォルダをBepInEx/plugins/SULFUR Together/に入れ、UI Lib も同様にそれ専用のBepInEx/plugins/フォルダへ入れます。- ゲームを起動します。
接続方法
Co-op はセーブをロードした状態でホスト/参加します(タイトル画面では不可)。
- ゲームをロードします(ハブまたは任意のステージ)。
- Options(設定) メニューを開き、SULFUR Together ページへ進みます。
- Player name(プレイヤー名) を設定します。
- ホストする場合: Create game(ゲームを作成) を押し、次のいずれかを選びます:
- Steam: Invite Friends via Steam(Steamでフレンドを招待) を押す——ポート開放は不要;または
- ダイレクトIP: ページに表示される LANアドレス を共有します(インターネット越しの場合はUDPポートの開放、またはVPN LANを使用)。全員が同じ Connection key(接続キー) を使う必要があります。
- 参加する場合:
- Steam: 招待を承認する(セーブをロードすると自動で参加)か、ホストの Steam ID を貼り付けて Join via Steam を押す;または
- ダイレクトIP: ホストのアドレス・ポート・接続キーを入力し、Join game(参加) を押します。
- Close room(ホスト) または Leave(クライアント) でセッションを終了します。
入力した設定は自動保存されます。ショートカットも利用可能です:Page Down でホストにリンクして追従、Page Up でリンク解除してソロに戻ります。
主な機能
- LiteNetLib によるホスト権威型マルチプレイ
- ステージ自動生成・シード・ステージ遷移の同期
- リモートプレイヤー、手持ち武器、プレイヤーの弾丸の同期
- 敵の移動/戦闘同期、ホスト権威の敵ダメージ・死亡・遠距離攻撃
- ダウン/蘇生/死亡の協力フロー(画面上の救助プロンプト付き)
- 複数ボスの戦闘同期(カズン、ウィッチ、Lucia、砂漠ボス ほか)
- 破壊可能オブジェクトとプレイヤーが落としたアイテムの同期
- プレイヤーごとに独立したキャラクター・インベントリ・装備・進行・セーブ
- フレンドリーファイア(同士討ち)のセッション設定(ホストが決定)
- リザルト統計カードと参加/退出の通知
- 14言語対応のインターフェース
セーブ・インベントリ・戦利品
SULFUR Together は共有キャラクターセーブを使いません。各プレイヤーは自分のキャラクター・インベントリ・装備・進行・個人戦利品・セーブデータを保持します。あなたが意図的にワールドへ落としたアイテムは他のプレイヤーが拾えます。共有戦利品などのオプションは今後のバージョンで予定しています。
一時停止しないマルチプレイ
マルチプレイ中はゲーム世界が停止しません——インベントリ、ポーズメニュー、会話を開いても、ウィンドウを非アクティブにしてもゲームは止まりません。これはプレイヤー間のずれを防ぐための意図的な仕様です。メニューを開く前に安全な場所へ移動してください。
既知の問題
- クライアントがホストより先にボスステージへ入ると同期がずれることがあります(例:カズンの「無限会話」)。
- 一部の敵が瞬間移動・カクつき・アニメーション不正を起こすことがあります。
- テスト済み以外のボスは深刻な同期問題を抱えている場合があります。
- 血・パーティクル・効果音・一部アニメーションは必ずしも同期しません。
- プレイヤー同士の当たり判定は実験的で、リモートのスプライト/武器は調整中です。
- 4人以上のセッションは未検証です——2人が最も安定します。
これは完全な一覧ではありません。
フィードバックと不具合報告
Thunderstore は不具合報告やコメントに対応していません。以下からご報告ください:
- GitHub Issues(推奨): https://github.com/ryuka-dev/SULFUR-Together/issues
- Nexus Mods: MODページの Bug Reports セクション
良い報告には、ホストとクライアント両方の LogOutput.log、誰がホストか、どこで起きたか(ステージ/ボス)、誰が何を起こしたか、各プレイヤーに何が見えたか、再現するか、導入している他のMODが含まれます。両方のログがある報告は、片方だけよりはるかに有用です。
免責事項
これは非公式のファンメイドMODであり、Perfect Random や SULFUR 開発者と提携・承認されたものではありません。SULFUR およびその素材は、それぞれの権利者に帰属します。
CHANGELOG
Changelog
1.2.4 — Support for companion mods
Co-op itself is unchanged. This release only adds three small hooks that let another mod make its own content work inside a session — raised while getting False Gods to run in co-op. The network protocol is untouched, so a 1.2.4 session behaves exactly like a 1.2.3 one. Everyone should still run the same version, and the same set of mods.
None of these hooks name a specific mod: SULFUR Together does not learn about any mod, it just lets a mod say something about itself.
Added:
- A mod can hand its own spawns to the host. Enemies that a mod summons during a fight only existed on the screen of whoever's game created them — a boss could call in minions and one player would be fighting an empty room. A mod can now declare that only the host creates its units, and from then on they are mirrored to everyone and fought, hit, and killed like any other enemy.
- A mod can keep its own breakables out of the shared mirror. Destructible objects are matched between players by where they were created, which works for the level's own scenery but not for objects a mod builds at runtime and stacks in one place: breaking one could destroy an unrelated one on the other screen, including objects still flying through the air, so crates burst in mid-air and loot appeared in a run where nobody had fired. A mod can now exclude its own objects and replicate them itself.
- A mod can ask whether a player is out of the fight. A mod that picks its own targets could keep attacking someone who was already down — hitting a helpless player, and wasting attacks that should have gone to whoever could still fight back. It can now ask, and leave a downed player alone.
1.2.3 — Desert crypt co-op
The desert crypt — the locked room with the key and the timed trial — now works in co-op from the door to the reward room. Before this, only the player carrying the key could get in, the two sides were given different trials, and finishing one could leave someone shut in. This release changes the network protocol, so everyone in a session must update together.
Fixed:
- You can no longer be shut inside the crypt after finishing it. Stepping on the crypt's exit was mistaken for entering a sealed combat room, so the way out was closed again a few seconds later — with nothing that could ever reopen it. Whoever had not already stepped through was trapped for the rest of the level. Room exits are no longer treated as arena seals.
- The crypt key door now opens for everyone. Only one key exists in a run, and the door opened only for the player who used it — everyone else walked into an invisible wall and could never enter. The door now opens on every screen, and nobody else needs a key.
- Both players now get the same trial. The trial was picked from unsynced randomness, so one player could be hunting chickens while the other was killing enemies in the same room. The trial is now decided by the level seed, like the rest of the level.
- Crypt enemies are now run by the host. Each side used to spawn its own, so the same spot could hold a different enemy for each player. When the host killed one, the other player's enemy did not die — it just lost its AI and stood there. Crypt enemies are now spawned once by the host and mirrored, so a kill lands for everyone.
- The reward room now opens for everyone. Completing the trial opened the reward room — which holds the way out — only for the host. Everyone now gets it.
- A failed trial is now shared. A failure used to punish only the host. Now the whole group fails together.
- The trial progress bar is now visible to everyone. Only the host could see what the trial was or how long was left. The bar now shows on every screen, in your own language.
- The Protect trial's altars are now visible to everyone. The altars you have to defend — and their highlight — only appeared for the host, leaving everyone else with nothing to protect.
- The statue at the crypt entrance no longer slides around. It could be mistaken for an enemy and dragged across the room by whatever that enemy was doing.
1.2.2 — Desync, desert and status-effect fixes
A round of sync fixes from player reports: repeated maps, the loading-screen desync, invisible ghosts, and enemies that ignored a status effect. This release changes the network protocol, so everyone in a session must update together.
New:
- The four-player limit is gone. Sessions no longer cap the number of players — a fifth player used to sit on "joining" forever, on both Steam and Direct IP. There is no artificial limit now; the practical ceiling is your host's connection and CPU.
Fixed:
- Levels no longer repeat for a player who joined a host. After following the host into a level once, that player's own later levels were all generated from the host's old seed, so the same map kept coming back. Each level now rolls a fresh layout again.
- Walking ahead while someone is still on the loading screen no longer desyncs the run. If a player was sitting on the "press to continue" screen and someone else took the exit, players, map and enemies would drift apart until the next level reset it. That screen is now handled as its own state: the waiting player is led along properly, and the abandoned loading step is shut down instead of running its ending against the level that replaced it.
- Ghosts are no longer invisible to other players. Ghost enemies picked their species from unsynced randomness, so two out of three times the host and the other players disagreed about what a ghost was — the enemy stayed invisible on one side while still attacking. Ghost species now follows the level seed like the rest of the level does.
- Status effects from a weapon enchantment now actually affect the enemy. A Petrification enchantment used by anyone but the host would show the petrified look and shatter effect while the enemy kept walking. Status effects are now applied on the host, for every player, and are shown on everyone's screen — including effects the host applied, which used to be invisible to the others.
- Desert sandworms no longer throw players out of the map or freeze the game. The ambushing sandworms in the desert are now run by the host and mirrored properly: they emerge and land the same way for everyone, standing on a landing spot no longer launches you across the level, their riders are no longer fought over by two machines, and the frame-long freezes around them are gone. A non-host player can also trigger a sandworm ambush now.
1.2.1 — Endless boss fixes
Fixes for Endless Mode bosses in co-op. Updating is recommended for everyone in a session.
Fixed:
- Endless bosses can now be fought in co-op. A boss could die almost the instant it appeared: a second player's shots were bypassing the boss's entrance invulnerability, so a strong weapon could kill it before its fight even started and the stage would just move on. Bosses now stay invulnerable through their intro exactly as they do in single-player, so the fight begins properly.
- Fixed a duplicate and leftover boss health bar in Endless. A second health bar could appear during a boss fight and stay stuck on screen into later stages. Endless bosses now show a single health bar that clears correctly when the boss dies.
1.2.0 — Endless Mode co-op
Endless Mode can now be played in co-op. Both players share the same arena, waves, and enemies (the host runs the world), and the host chooses whether each player progresses independently — keeping their own XP, level, and cards — or shares one progression track with a group card vote. This release also fixes several multiplayer sync problems. All players must update to the same version before joining the same session.
New:
- Endless Mode co-op — Independent progression. Endless Mode now stays in sync between players: everyone shares the same arena, waves, and enemies (the host runs the world), while each player keeps their own XP, level, and card picks. Experience is awarded to whoever killed an enemy — the reward orb flies straight to the killer, even on a long-range shot — and the host can choose whether the kill credit goes to the player who dealt the first hit or the last hit (default: last hit). Leveling up no longer freezes the game for the other player: the world keeps running while you pick your card, and you stand safely still (invulnerable, and enemies stop targeting you) until you choose. Enemies also pick their target by distance now, so they no longer all pile onto the host.
- Endless Mode co-op — Shared progression card vote. In Shared mode both players now see the same floating cards on level-up and vote together on which one to take: aim at a card and fire to cast your vote, and your name is stamped onto the card you picked (your own stamp in gold, teammates' in red). The most-voted card wins — ties are broken by the host — and the chosen card is applied for everyone. There's no timer until someone casts the first vote, so you can take your time discussing. You can also vote to Skip or Reroll — a Skip gives each player their pass reward, and a winning Reroll deals a fresh set of cards for everyone to vote on again (the reroll card is unavailable once your shared rerolls run out). You can also vote to banish a card you don't want — aim at its dismiss button and fire; it counts as your one vote, competing with everyone's picks. If a banish wins, that card is removed for everyone (spending one shared banish) and you vote again on the rest. You can change or cancel your vote at any time by re-selecting, and the countdown only runs once at least one vote has been cast. In Shared mode you also level from one shared XP pool — everyone levels together — and the rewards a card drops into the world (loot, companions, shops, chests, and service stations) are shared too: single objects both players see in the same place, rather than a separate copy on each screen. (Shop purchases and service-station stock stay per-player for now.)
Fixed:
- The Cousin boss fight no longer freezes every player after the boss dies. In co-op the boss could lock all other players in place once it was defeated; the fight now ends cleanly for everyone.
- Fixed a level-generation desync when two players reach an exit at the same time. Taking an exit while the host was already changing levels could build the level twice and leave players in differently-shaped copies of the same map. The duplicate transition is now suppressed.
- A player who falls behind during a level change now catches up to the host's level instead of getting stuck or reloading a different version of the level.
- Steam joins are faster and more reliable. Joining by Steam ID no longer requires the host to press Invite Friends first, connects noticeably faster, and fails quickly instead of hanging on a bad attempt. — https://github.com/ryuka-dev/SULFUR-Together/issues/7
- Fixed hosting from the hub a second time failing to bring joiners in. After hosting, closing the room, and hosting again from the hub, joining players could be left behind; the host now keeps the level-generation information it needs to pull them to the hub.
Polish:
- Join flow. A "Connecting to host…" notification now appears on every way of joining, the "linked" notification no longer fires the moment you press the button, and if a joined player hasn't linked to the host a hint shows the key to press instead of silently leaving them on their own map.
Known issues:
- In Shared Endless Mode, a level-up card can occasionally show the wrong artwork or text on one player's screen. The vote and the reward you receive are always correct — only that card's appearance is affected. — https://github.com/ryuka-dev/SULFUR-Together/issues/16
- The known issues from previous releases still apply (occasional enemy snapping, boss desyncs when a client loads ahead, unsynced blood/particles/sounds, and 4+ players untested).
1.1.1 — Co-op fixes and polish
A small update with multiplayer fixes and quality-of-life improvements. All players must update to the same version before joining the same session.
Fixed:
- Players now stay together in non-standard levels. When the host loaded a level that isn't one of the normal story chapters — such as a developer/debug level opened from the dev menu — other players could be left behind on a different map. The follow-the-host logic now covers these levels too.
- Reviving a downed teammate is more forgiving. The Hold [E] prompt now appears as soon as you are in range (from a slightly larger distance), and briefly releasing the key — or tapping it — no longer resets the progress to zero, so the revive fills up reliably.
New:
- Shared damage numbers on the practice target dummy. Damage dealt to the ChurchHub target dummy now shows its flying numbers and running total to every player, including hits dealt by other players.
Polish:
- Dropped items now glide smoothly into their resting spot for other players instead of snapping into place.
1.1.0 — SULFUR 0.18.3 support, shared loot, and fixes
This update makes SULFUR Together compatible with SULFUR 0.18.3 (Qiosk's Plenty), adds optional shared world loot, and fixes several multiplayer problems. All players must update to the same version before joining the same session.
New:
- Shared world loot (optional, chosen by the host). Turn on Shared loot on the connect page and enemy, crate, chest, and hatbox/register loot is shared — the host rolls it and the first player to grab each item takes it. Off by default (each player keeps their own loot, as before).
- Developer mode is now host-gated. It is a session setting that only turns on when every player has dev access or a session vote passes, so a single player can no longer force it on for everyone. — https://github.com/ryuka-dev/SULFUR-Together/issues/8
- Inter-chunk doors are synced. The hold-to-open doors added in SULFUR 0.18 now open for everyone when one player opens them.
- Thrown knives are visible to other players — you can see the knife fly and stick. — https://github.com/ryuka-dev/SULFUR-Together/issues/10
- External mod channel. A public API so other mods can send data over the co-op session and read basic session info.
Fixed:
- Updated for SULFUR 0.18.3 (Qiosk's Plenty). Re-bound the damage/hit chain, fixed a host-side enemy-AI freeze, and reconnected hooks the update renamed — combat, enemy deaths, and the client→host hit path work again on the new game version.
- Dropped items could become permanently un-collectable for everyone — fixed. — https://github.com/ryuka-dev/SULFUR-Together/issues/11
- Dropped items now rest in the same place for everyone and no longer pile into an indistinguishable tower.
Known issues:
- With shared loot on, the food/material hatbox and cash-register open animations do not replay on other players' screens (the loot itself is correct and shared). — https://github.com/ryuka-dev/SULFUR-Together/issues/14
- The 1.0.0 beta known issues below still apply (occasional enemy snapping, boss desyncs when a client loads ahead, unsynced blood/particles/sounds, 4+ players untested).
1.0.1 - Bugfix update
This update fixes several multiplayer sync problems found in the first public beta. All players must update to the same version before joining the same session.
Fixed:
- Fixed client poison/fire ground hazards causing excessive duplicate damage.
- Synced throwable landing effects such as poison, fire, and explosions across peers.
- Synced in-flight throwable visuals so other players can see where grenades and flasks are thrown.
- Fixed client weapon XP not being credited on kills.
- Fixed one-shot trigger spawns creating separate local encounters for each player.
- Fixed goblin civilians briefly playing spearman attack animations on clients.
1.0.0 — Version 1.0, Public Beta
First public Beta of SULFUR Together, a co-op multiplayer mod for SULFUR.
This is a public test build. The core loop works end-to-end, but many systems are still being polished — expect rough edges. Every player must run the same version of SULFUR and of SULFUR Together.
New since the early preview:
- In-game connect menu — set up and join sessions from Options → SULFUR Together. No more editing config files.
- Steam connectivity — invite friends / join by Steam ID, no port forwarding needed (works alongside Direct IP).
- Direct IP — host shows its LAN address; clients join with address + port + key.
- 14-language localization for all on-screen text (via SULFUR Native UI Lib).
- Friendly fire as a host-authoritative session setting.
- End-of-run stats cards on the return-to-hub screen.
- Join / leave toasts and a live player list.
Working:
- Host-authoritative networked sessions over LiteNetLib.
- Synced level generation / seeds and scene transitions.
- Remote player proxies, held weapons, and projectiles.
- Enemy state mirroring; host-authoritative enemy damage, deaths, and ranged attacks.
- Downed / revive / death co-op flow with an on-screen rescue prompt.
- Boss-encounter authority for several bosses (Cousin, Witch, Lucia, Desert boss, …).
- Synced destructibles and world item drops.
- Independent per-player character, inventory, equipment, progression, and save.
- No-pause multiplayer (the world keeps running while menus are open).
Known issues:
- Clients that load a boss level ahead of the host can desync (e.g. Cousin "infinite dialogue").
- Some enemies may briefly snap, teleport, or animate incorrectly.
- Bosses beyond the tested set may have gameplay-affecting sync problems.
- Blood, particles, sounds, and some animations are not always synchronized.
- Sessions with 4+ players are untested; 2 players is the most predictable.
Dependencies: BepInEx 5, SULFUR Native UI Lib 0.10.1 (both installed automatically through Thunderstore / Gale).
⚠️ Public Beta — expect bugs. Back up your saves. Report issues on GitHub (not Thunderstore, which has no bug tracker). Host and all clients must run the same mod version.