
Triad Wars shut down in 2016. The client remained. It still tries to connect to Square Enix servers and gets nothing but silence back.
The goal was simple: become that server.
How the client talks to the server
The game runs on plain HTTP and exchanges JSON data. Nothing exotic. That made the task significantly easier data structures are readable, and the logic can be reverse engineered incrementally.
On startup, the client sends several mandatory requests - authentication, profile load, territory state. If the server responds with valid JSON, the game launches. If not, it crashes or hangs on the loading screen.
The first working version of the server could do exactly one thing: respond to authentication. That was enough to see the main menu.

Where the data structures came from
There were no preserved logs from the original servers. Everything came purely from disassembling the client binary using IDA Pro.
Inside the binary you can see field names, parsing functions, and expected response structures. You look at a function that processes a server response and you understand exactly what needs to come back: which fields, which types, in what order. Sometimes a single endpoint took hours to reverse, sometimes the structure was readable in minutes.
Around 30 endpoints were restored this way. Some are fully functional, some return empty arrays - the structure is correct, the content just isn’t filled in yet.

What works right now
Authentication and save system - fully working. Everything persists between sessions.
Inventory and shop - 247 items from the original catalog, purchases save correctly.
Territory - buildings with upgrade levels, construction of 16 racket types across slots, upgrades functional.
Raid system - full five-step cycle: start, in-progress events, final result with rewards and XP. Five unique opponents with their own appearance, weapons and territories.
Living world - NPCs, traffic, police. Works via an injected DLL that enables spawning on the client side.


What’s still stubbed out
Errands, operations, world encounters, black market, commodity production - the endpoints exist and return empty data. The client handles this fine, just shows empty lists. The game doesn’t break.



What’s next
Immediate priority - territory economy. Production timers, money laundering, commodity flow between racket points. The structures are already documented through IDA, what remains is writing the server logic that populates and ticks them over time.
After that - errands and open world content. Then multiplayer: the game’s network protocol is partially studied, message formats are known.
The server is currently written in pure Python. The plan is to move to a proper framework and a real database instead of keeping everything in memory.
