Skip to content

Releases: baclo-san/4PSoku

4PSoku 4P rollback test build 1

Pre-release

Choose a tag to compare

@baclo-san baclo-san released this 07 Sep 20:19

Test build of the 4PSoku mod and its relay server, for four-player rollback netplay. Not working end to end yet — see below.

Built from 4p-rollback-netplay. This is a fork of SokuDev/4PSoku; local play is unaffected.

You also need

  • giuroll.dll from giuroll-hagb v0.6.18-4p-test-8 — always take the newest giuroll release; the artifacts here have not changed since test 1
  • All four players must run matching builds. Version skew has already cost us two test sessions.

Install

  • 4PSoku.dll and assets.dat both go in Soku/modules/4PSoku/. Every player needs both.

    assets.dat is the mod's own art and menu layouts. It is unchanged from upstream 4PSoku, and it was missing from this release until 2026-09-08 -- if you installed before then and have no assets.dat next to your 4PSoku.dll, the game crashes on the profile screen. The mod repoints the engine at data/menu/menuProfile_4p.dat, which lives inside that archive; when the file cannot be opened the loader returns null and the engine dereferences it without checking. Nothing in the log says so, you just get a crash dump.

  • 2v2Server.exe is the relay. Only whoever hosts runs it; the other three just connect.

If you host the relay on the same machine you play on, that is supported — but note the relay then announces your client to everyone else as 127.0.0.1, so your pair with each other player falls back to relaying instead of a direct connection. It works, it is just a hop slower. Hosting the relay on a machine nobody plays on avoids that.

Relay fixes in this build

  • Character-select freeze. The game's input codec works out of an 80-byte scratch buffer, so 36 inputs is the most it can read. The relay was sending 124 on the first packet after the character-select unlock, every time, and all four clients froze together. Replies are now capped at 8 frames.
  • Black screen after stage select. netmanager+0x98 is a single frame counter shared by character select and battle, and the game never resets it across the scene change. Four free-running relay streams left every client rejecting every battle packet, and none of them could leave CBattleCL::onActivate — which blocks the game's main thread until an input packet arrives. Battle input is now numbered in each client's own sequence.
  • Battle replies are built in the shape 4PSoku's own four-player input distribution expects, rather than reflecting one client's 1v1-shaped packet to the others.
  • giuroll's 0x6b battle packets are relayed instead of being dropped as an unknown type, which restores the fallback for any pair that cannot be hole-punched.
  • A late LOADING_READY from one player no longer knocks another back a state.
  • State transitions, character-select progress and the first battle frame per client are logged, deduplicated. If something goes wrong, send the relay console output.

Mod fixes

  • Fixed a dangling end-of-storage pointer in activePlayers. Only begin and last were updated after a reallocation, leaving the capacity pointer aimed at freed memory. Normal play never reads it; anything that does — such as a rollback savestate — dies.
  • loadDeckData traces to 4psoku-load.log next to th123.exe. It runs on the game's asset worker thread, so it is the one part of the mod that can hang the game with nothing else noticing.

Building the relay

2v2Server.exe now builds without SFML via the bundled MiniNet.hpp, so self-hosting does not pull a 30 MB dependency for twelve symbols.

Known state

Character select, stage select and battle loading all pass. The battle then stalls within about twenty frames. A peer-accounting bug behind the last observed stall is fixed on the giuroll side but has not yet been confirmed live.