KB: step-4 closeout -- Steam wire documented, live-test procedure, router
docs/GLASS_COCKPIT.md gains the step-4 ledger (seam/transport/lobby + THE FAKEIP LESSON); NEW context/steam-networking.md topic (+ router row) and docs/STEAM_TEST.md (the 2-machine live procedure = the step-4 exit criterion on user hardware). context/glass-cockpit.md: steps 3+4 status. Final purity re-check: pod build clean, forced-walk mission runs, ZERO glass/steam tags in the pod log. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -61,9 +61,15 @@ copied from them.
|
||||
(`BT_BUTTON_TRAP=1` restores) — each `[FAIL]` log = a missing L4 override to reconstruct.
|
||||
Verified: authentic-path input (engine push → streamed `.CTL` → mapper), panel-click
|
||||
survival, 2-node loopback MP un-regressed on the pod build. Detail: `docs/GLASS_COCKPIT.md`.
|
||||
- Step 3 (miniconsole): pending. Architecture: the console stays a WIRE PEER — an in-process
|
||||
worker-thread console client over loopback; no engine-loop hooks.
|
||||
- Step 4 (Steam): pending.
|
||||
- **Step 3 (miniconsole): DONE 2026-07-17 [T2].** `game/glass/btl4fe.*` (menu + console-shape
|
||||
egg writer, golden-tested vs MP.EGG) + `btl4console.*` (the marshal: a worker-thread console
|
||||
CLIENT speaking the btconsole.py wire verbatim; `content\marshal.log`). ZERO engine hooks —
|
||||
the engine runs the stock console ladder. Per-mission process relaunch; `BT_FE_*` env arms the
|
||||
marshal (menu relaunches clear it). Verified: solo cycle (menu→mission→60s clock→stop→menu)
|
||||
and menu-hosted 2-node LAN.
|
||||
- **Step 4 (Steam): CODE COMPLETE 2026-07-18 [T2 single-machine].** See [[steam-networking]] —
|
||||
the wire seam + `L4STEAMNET` identity-token transport + `btl4lobby`. Live 2-account
|
||||
cross-machine session pending (`docs/STEAM_TEST.md`).
|
||||
|
||||
## Key Relationships
|
||||
- Extends: [[pod-hardware]] (RIO input path) · Uses: [[gauges-hud]] dev-gauge modes ·
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
---
|
||||
id: steam-networking
|
||||
title: "Steam networking — the BT_STEAM wire (transport + lobby)"
|
||||
status: living
|
||||
source_sections: "docs/GLASS_COCKPIT.md §4; docs/STEAM_TEST.md; commits e79e8fa/48ede2f/f703bb1"
|
||||
related_topics: [glass-cockpit, multiplayer]
|
||||
key_terms: [PadRIO, miniconsole]
|
||||
open_questions: ["live 2-account cross-machine session (docs/STEAM_TEST.md) — the step-4 exit criterion"]
|
||||
---
|
||||
# Steam networking — the BT_STEAM wire
|
||||
|
||||
Internet MP for the glass cockpit (dev tooling; gate `BT_STEAM`, requires `BT_GLASS`).
|
||||
**Status: CODE COMPLETE 2026-07-18; single-machine verified; live 2-machine test pending.**
|
||||
|
||||
## The three layers
|
||||
1. **The wire seam** (`L4NET.CPP`, always compiled): file-local `BTNetSend/Recv/Accept/Close`
|
||||
wrappers around the 9 raw Winsock sites — pure code motion when OFF; under `BT_STEAM` each
|
||||
offers the op to the transport first. Est. delegates: `CheckSocket` (peer address),
|
||||
`OpenConnection` TCP_OPEN head, `GetMyAddress` (self token).
|
||||
2. **The transport** (`engine/MUNGA_L4/L4STEAMNET.*`, gated): `ISteamNetworkingSockets`
|
||||
pseudo-SOCKETs (`0x5EA0xxxx`); engine TCP byte stream over reliable-NoNagle messages with
|
||||
per-connection reassembly rings (recv: empty→`WSAEWOULDBLOCK`, closed→0); listen channels
|
||||
console=0 / game=1 (`CreateListenSocketP2P`); install on env `BT_STEAM_NET=1`; degrades to
|
||||
Winsock at every failure. Pump = `SteamAPI_RunCallbacks` AND sockets `RunCallbacks` (the
|
||||
general dispatch carries the async results — sockets-only pumping stalls).
|
||||
3. **The lobby** (`game/glass/btl4lobby.*`, gated): ISteamMatchmaking room (`btl4=1` list
|
||||
filter); pilots publish name/mech/color; the host's GO mints the roster and signals.
|
||||
|
||||
## THE TOKEN MODEL (the FakeIP lesson) [T2]
|
||||
FakeIP does NOT survive the per-mission process relaunch (live-disproven prior-art assumption:
|
||||
menu and mission processes got different FakeIPs; the pod timed out dialing its own stale
|
||||
address). Roster addresses are therefore **opaque ipv4-shaped tokens** — `169.254.77.N`, port
|
||||
1501=console / 1502=game — minted by the HOST at GO and mapped to **Steam identities**;
|
||||
connections ride `ConnectP2P(identity, channel)`. Handoff to mission processes via env:
|
||||
`BT_FE_MYFAKE` (own token → `GetMyAddress` self-match) + `BT_FE_STEAMMAP`
|
||||
(`ip=steamid64;...`). The engine's roster matching, Waterloo swap logic, and self-identification
|
||||
all run UNCHANGED on tokens.
|
||||
|
||||
## Testing
|
||||
Single-machine (verified): lobby-of-1 GO → token map → egg roster token → mission runs over the
|
||||
stock console ladder. Live 2-machine procedure + checklist: `docs/STEAM_TEST.md`. AppID 480
|
||||
(Spacewar) via auto-written gitignored `content/steam_appid.txt`.
|
||||
|
||||
## Key Relationships
|
||||
- Rides: [[glass-cockpit]] miniconsole (marshal has a Steam-wire branch) · Extends:
|
||||
[[multiplayer]] (the arcade mesh, unchanged above the seam)
|
||||
Reference in New Issue
Block a user