# 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` (480 — Spacewar,
Valve's public dev AppID, replaced by the real one once the store page
exists) 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.

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 for AppID 480 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). Fix, either scope:

- Per game: Steam Library -> Spacewar -> Properties -> Controller ->
  Override for Spacewar: **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.
