Files
BT412/game/reconstructed/btl4console.hpp
T
CydandClaude Opus 4.8 a2949166ea 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>
2026-07-16 23:18:36 -05:00

38 lines
1.7 KiB
C++

//===========================================================================//
// btl4console.hpp -- BT412 in-process LocalConsole marshal.
//
// A front-end-launched solo mission has no operator console, so the mission
// clock would count up forever. This marshal plays the console's role in
// process: it watches the mission via the engine's per-frame hook
// (gPerFrameHook, called on the game thread in RunMissions) and dispatches
// StopMissionMessage when the selected length expires, exactly as the arcade
// console did. The single-binary WinMain loop then collects the result and
// cycles back to the setup menu.
//===========================================================================//
#ifndef BTL4CONSOLE_HPP
#define BTL4CONSOLE_HPP
// Arm the marshal for the next mission: it stops the mission after
// `mission_seconds` (0 = endless -- never auto-stops). Registers the
// per-frame hook.
void BTLocalConsole_Install(int mission_seconds);
// True once the marshaled mission has stopped (time expired, or ended some
// other way while armed) -- the WinMain loop cycles back to the menu.
int BTLocalConsole_MissionCompleted();
// Final scores snapshotted at the stop (roster order; slot 0 = local pilot).
int BTLocalConsole_ResultCount();
int BTLocalConsole_GetResult(int index, int *kills, int *deaths);
const char *BTLocalConsole_GetResultName(int index);
// Lobby (owner) rebuilds the sheet from the collated wire scores before the
// shared results screen: clear, then inject each pod's name/kills/deaths.
void BTLocalConsole_ClearResults();
void BTLocalConsole_InjectResult(int slot, int kills, int deaths, const char *name);
// Drop the marshal + clear the per-frame hook.
void BTLocalConsole_Uninstall();
#endif // BTL4CONSOLE_HPP