Two things that travel together, because the packaging script carries both. STEAMWORKS 1.65 replaces 1.64. steam_api.dll goes 10.51.08.25 -> 10.87.46.89. Vendored the same way - headers and the win32 redistributable only, examples and other platforms left out - and 1.64 is gone rather than left beside it, since nothing referenced it any more: both include paths, the library path, the DLL the packaging script copies, and the docs that name the folder all moved over. The vendoring rules also gained a line they always needed. The redistributable DLL is caught by the global *.dll rule at the repo root, so it only ever got in by a git add -f, and a fresh checkout could not produce a package without noticing the DLL was missing. It is now re-included by name. OUR OWN APPID, 5108000, replaces Spacewar's 480. steam_appid.txt is what tells the Steam client which game this is when a build is started straight from its folder, which is how every tester runs it. The consequence worth knowing before the next test night: 480 was Valve's public one and every account effectively had it. 5108000 is ours, so the Steam account has to actually have Red Planet on it. An account without it gets the plain TCP fallback - the same quiet symptom as a missing appid file - so the handbook, the environ.ini template, the README and the three-machine test doc all now say to check that first. Nothing in the code hardcodes the number; the file is the whole story. Retail builds launched BY the Steam client need no such file at all. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
96 lines
4.2 KiB
Markdown
96 lines
4.2 KiB
Markdown
# Steam multiplayer — three-machine test procedure
|
|
|
|
The full end-to-end: three machines, three Steam accounts, one lobby,
|
|
one marshaled race over Steam Datagram Relay. Written 2026-07-12 for
|
|
the first live test.
|
|
|
|
## Per machine (all three)
|
|
|
|
1. Steam client installed, logged in (different account per machine),
|
|
and RUNNING.
|
|
2. Copy the `dist\` folder onto the machine.
|
|
3. Start with `start-windowed.bat` as usual.
|
|
|
|
The packed dist already contains `steam_appid.txt` (5108000 — Red
|
|
Planet's own AppID; builds before that ran under Spacewar, 480) and ships
|
|
`RP412STEAM=1` in `environ.ini`. If a machine has an older dist, check
|
|
both before blaming the network: a missing appid file makes
|
|
SteamAPI_Init fail and the game quietly falls back to TCP.
|
|
|
|
Now that the AppID is ours rather than Valve's public one, the Steam
|
|
account on each machine has to actually have Red Planet on it. An account
|
|
without it gets the TCP fallback — same silent symptom as a missing
|
|
appid file, so check library access first when one machine will not join
|
|
the mesh.
|
|
|
|
Sanity check per machine: `rpl4.log` should show
|
|
`SteamNetTransport: up as 169.254.x.y (fake ports N console, M game)`.
|
|
If it says "staying on TCP", Steam isn't running / not logged in / the
|
|
appid file is missing.
|
|
|
|
## The test
|
|
|
|
1. **Machine A (host):** pick a track, vehicle, color, pilot name on
|
|
the setup menu, then click **HOST STEAM RACE**. The lobby room
|
|
appears with A listed as `[HOST]`.
|
|
2. **Machines B and C:** click **JOIN STEAM RACE** on the setup menu.
|
|
(It joins the first open RP412 lobby it finds — pick loadouts on the
|
|
menu BEFORE joining; the lobby publishes them.)
|
|
3. When all three names show bright in A's room (bright = FakeIP
|
|
published), A clicks **L A U N C H R A C E**.
|
|
4. All three pods leave the room and boot the mission. Expect in logs:
|
|
- every pod: `SteamNetTransport: peer registered` x3
|
|
- members: `SteamNetTransport: listening on engine port 1501/1502`
|
|
- A: `LocalConsole: connecting to pod 169.254...` then
|
|
`egg sent`, `EGG ACK (mesh complete)` per member
|
|
- everyone: `All connections completed!` then the race
|
|
5. The race runs for the length A picked; A's console stops everyone;
|
|
A gets the results screen with all three personas and scores.
|
|
6. Everyone lands back in the lobby room. A can launch again —
|
|
different track, same lobby, no restarts.
|
|
|
|
## Controllers: disable Steam Input (once per machine)
|
|
|
|
Steam Input intercepts Xbox controllers the moment the game initializes
|
|
SteamAPI, hiding them from XInput entirely - the pad works everywhere
|
|
else and is invisible only in-game (reproduced A/B on the dev box, under
|
|
Spacewar; nothing about it was specific to that AppID). Fix, either
|
|
scope:
|
|
|
|
- Per game: Steam Library -> Red Planet -> Properties -> Controller ->
|
|
Override: **Disable Steam Input**.
|
|
- Global: Steam -> Settings -> Controller -> uncheck **Enable Steam
|
|
Input for Xbox controllers**.
|
|
|
|
PadRIO re-probes every 3 seconds, so the pad hot-connects the moment
|
|
Steam releases it - no restart needed. (Our own AppID will configure
|
|
this server-side; test machines need the client setting.)
|
|
|
|
## The abort key
|
|
|
|
**Alt+Q** aborts your mission deliberately - score banked, back to the
|
|
lobby room. If the host presses it, the race ends for everyone.
|
|
|
|
(History: the legacy abort was the '&' character, and the Win32 key
|
|
channel made the UP ARROW - the hat look key! - collide with it. That
|
|
was every mystery abort in rounds five and six. Plain arrow keys are
|
|
now safe; debug keys like wireframe/frame-dump need RP412DEVKEYS=1.)
|
|
|
|
## Notes and knowns
|
|
|
|
- All pods use engine ports 1501/1502 by convention under Steam; the
|
|
transport maps them to the Steam-assigned fake ports per peer.
|
|
- FakeIPs are allocated per session — they are exchanged live through
|
|
lobby member data, never configured by hand.
|
|
- Same-LAN machines may get a direct route from SDR; different
|
|
networks relay. Both are fine.
|
|
- Two instances under ONE Steam account cannot mesh (one identity per
|
|
account) — hence three machines.
|
|
- If a member joins after A already launched once, it will answer the
|
|
NEXT launch only (launch signals are nonced).
|
|
|
|
## What to collect if something breaks
|
|
|
|
`rpl4.log` from each machine (each dist folder), plus which step of
|
|
the sequence above diverged.
|