Skip to content

Networking and Save Formats

LordBlacksun edited this page Sep 9, 2026 · 1 revision

Networking & Save Formats

All [verified] by reading the decompilation.

Multiplayer — DirectPlay

Addr Role
0x004B5C50 DPInitCoCreateInstance(DirectPlay) + address object; provider switch DAT_005DB8D8: 0 = IPX, 2 = TCP/IP (IP + port), 3 = modem/serial (baud table 9600…256000).
0x004B6A80 DPSYS handler — message dwType 0x03/0x05/0x21/0x31/0x101/0x103/0x109 = create / destroy / delete player, SESSION-LOST, HOST, SET-NAME, CHAT. Player tables DAT_005DB8F0 (stride 0xFC) and DAT_005DB650 (stride 0x3C); 0x20-byte names.
0x004B51D0 DPERR (0x8877xxxx) → string decoder.
0x004BC390 Winsock-2.0 capability check ("The game requires Winsock 2.0").

Source modules: lancer\game\DPBits.cpp, DPSession.cpp, deathmatch.cpp. Lobby support targets the MSN Gaming Zone ("started by the zone").

Saved games — EA-IFF

Saves are standard EA-IFF: each chunk is { FOURCC tag, u32 size } with word-aligned bodies.

  • 'FORM' = 0x4D524F46; top-level form 'SAVE' = 0x45564153; mission chunk 'MISS' = 0x5353494D.
  • Path: saves\%sGAME%02d.IFF (the %s prefix is the active profile name).
  • Reader stack: FUN_00490930 / FUN_004909D0 / FUN_00490C40 / FUN_0045E8D0.
  • Writer: FUN_00475650 (gameflow.cpp, 0x1400 buffer).
  • Loader FUN_00475430 walks a { FOURCC, dest, size } dispatch table at PTR_DAT_00500A24.

Profile & pilots

  • profile.bin = a single 0xD0 (208) byte blob (DAT_00562CF8; FUN_004751B0 / FUN_00475390 / FUN_004753F0). It leads with the profile name (DAT_00562CFC), which becomes the %s prefix for save files.
  • Pilot files pilots\%s.fm8 — referenced by FUN_00453DE0 (the mission-end killer-record writer).

Config (cross-ref)

Key/joystick binds live in [KeyConfig]/[JoyConfig] (defaults in sdefault.txt); audio in [Sound]; display in [Device] + dmodes.bin. See Audio, Video & Input and Renderer, Display & Widescreen.

[open] The byte-level layout inside the IFF 'MISS' chunk and the 0xD0 profile blob were not fully field-mapped; that needs diffing real save/profile files against the field accessors.

Clone this wiki locally