Net: Steam lobby (btl4lobby) + launch-mode wiring (Workstream C.2)

Port RP412's RPL4LOBBY to BT: an ISteamMatchmaking room stands in for the
arcade Site-Management screen. Compiled both gates -- stubs without
BT412_STEAM, the full room under it (both configs build + link clean).

Lobby (game/reconstructed/btl4lobby.*):
- Room screen (green-on-black, like the menu), owner = console.
- Member data: FakeIP + fake console/game ports + persona + mech/color/badge
  (ip/cp/gp/nm/vh/cl/bd keys).
- Nonced "go" launch roster -> SteamNetTransport_RegisterPeer for every peer.
- Push/PullRaceResults over lobby data rebuild the shared score sheet.

Front end (btl4fe.*): HOST/JOIN buttons when BTLobby_Available() (Steam
transport up); the menu loop exits on a steam action and BTFrontEnd_Run
routes the lobby outcome -- host builds the egg with every member as a
[pilots] mesh entry (BTFrontEnd_SetHostedPilots), member returns launch
mode 2. Results screen prefers the marshal's collated result names.

Marshal (btl4console.*): add GetResultName / ClearResults / InjectResult so
the lobby owner can refill the sheet from the collated wire scores; Result
gains a name field.

WinMain (btl4main.cpp): install the Steam transport on BT412STEAM env
(before the front end, so the lobby is offered); branch on
BTFrontEnd_LastLaunchMode() -- host owns the marshal clock + joins the mesh,
member enters as a network pod on :1501 (SetNetworkCommonFlatAddress +
gConsoleLossEndsMission); Push (host) / Pull (member) results, then relaunch.

CMake: btl4lobby.cpp joins bt410_l4; that lib gets BT412_STEAM + the
Steamworks include under the gate. build-steam/ gitignored.

Deferred (untestable here -- needs Steam + multiple machines): the
host->member wire egg-feed marshal (InstallNetworkRace); a member currently
waits for a console connection nothing supplies, so a live host+member race
is blocked on it. The lobby object does not survive the per-mission
relaunch. docs/STEAM-3-MACHINE-TEST.md for BT not yet authored.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Cyd
2026-07-16 23:18:36 -05:00
co-authored by Claude Opus 4.8
parent 2f5870e486
commit a2949166ea
12 changed files with 769 additions and 31 deletions
+29 -9
View File
@@ -151,15 +151,19 @@ identical-to-baseline → take RP412's file verbatim, diverged → hand-apply th
fresh menu; `-egg DEV.EGG` stays unmarshaled (dev shortcut); btconsole.py external
feed still works; marshaled 2-instance loopback collects both score lines.
> **Status (2026-07-14): FOUNDATION DONE (5a egg builder); 5b/5c/5d remain.** The local
> egg builder (`game/reconstructed/btl4fe.*`) + front-end mode ship: a zero-argument
> launch builds `frontend.egg` from the default loadout (verified structurally identical
> to MP.EGG, GDI-rendered plasma name bitmaps) and boots a playable mission. Remaining:
> the interactive on-screen catalog menu, the in-process LocalConsole marshal (mission
> clock + StopMission at expiry + single-binary loop), and the score-intake/results
> screen — the last is NEW work (BT has no mission-end flow: msgID 0x18 is a stub,
> `scoreAward=0`; collect kills/deaths from the live Comm-MFD `pilotList` at stop).
> Details in `context/steamification.md`.
> **Status (2026-07-16): DONE (5a5d).** The zero-argument launch shows the interactive
> green-on-black catalog menu (`game/reconstructed/btl4fe.*`: map/mech/color/time/weather/
> length + pilot name), builds `frontend.egg` (verified structurally identical to MP.EGG,
> GDI-rendered plasma name bitmaps), and boots a playable mission. The in-process
> LocalConsole marshal (`game/reconstructed/btl4console.*`) owns the mission clock off the
> engine per-frame hook (`gPerFrameHook`, added to `APPMGR`) and dispatches
> `Application::StopMissionMessage` at the chosen length; it snapshots per-pilot
> kills/deaths at the stop (BT's own score model — msgID 0x18 stays a stub). The
> single-binary loop is a RELAUNCH per mission (`CreateProcessW`; avoids the stale
> `gBT*`-global re-init crash), showing a GDI "MISSION COMPLETE" scoreboard between races.
> WinMain (`game/btl4main.cpp`) wires front-end-mode detection, the marshal arm, the
> results screen + relaunch, and the launch-mode branch (solo/host/member). Details in
> `context/steamification.md`.
## Phase 6 — Steam lobby (Workstream C.2)
@@ -174,6 +178,22 @@ identical-to-baseline → take RP412's file verbatim, diverged → hand-apply th
kills/deaths → stop → results everywhere → rematch. Known MP fidelity gaps (peer
warp spheres, missile clusters, PNAME/PLACE billboards) do not block.
> **Status (2026-07-16): CODE LANDED; live 3-machine test DEFERRED (no Steam + multi-machine
> here).** `game/reconstructed/btl4lobby.*` ships (compiled both gates: stubs without
> `BT412_STEAM`, full ISteamMatchmaking room under it). Built: the room screen (green-on-black,
> like the menu), member data exchange (FakeIP + fake console/game ports + persona +
> mech/color/badge), the nonced "go" launch roster → `SteamNetTransport_RegisterPeer` all peers,
> and Push/PullRaceResults over lobby data. The menu shows HOST/JOIN when `BTLobby_Available()`
> (Steam transport up); a launch routes through `BTFrontEnd_LastLaunchMode()`: **host** builds the
> egg with every member as a `[pilots]` entry + owns the marshal clock, **member** enters as a
> network pod on `:1501` (`SetNetworkCommonFlatAddress` + `gConsoleLossEndsMission`). WinMain
> installs the Steam transport on `BT412STEAM` env. **Remaining / deferred:** the host→member
> **wire egg-feed marshal** (`InstallNetworkRace` — the owner streaming eggs to remote pods) is
> NOT built; a member currently waits for a console connection that only that marshal provides, so
> a live host+member race needs it. The lobby OBJECT does not survive the per-mission relaunch
> (documented single-binary limitation — everyone lands on a fresh menu, not back in the room).
> `docs/STEAM-3-MACHINE-TEST.md` for BT is not yet authored. Details in `context/steamification.md`.
## Phase 7 — Polish, packaging, release
- KeyLight RGB mirror: `L4KEYLIGHT.*` verbatim (C++/WinRT TU — per-file C++17 props),