Launch with whoever connects + live roster display in the console
The operator no longer has to match the roster row count to the exact player count (or watch the "empty seats will STALL" warning). Two mechanisms: 1. PRESENCE BEACONS: the pod keeps its seat-request TCP connection open for the process lifetime; the relay reads a live beacon as "seated" and a pre-claim FIN frees the seat (no ghost seats -- a ghost stalls every pod at the connection gate). Reservation expiry spares beaconed seats. 2. TRIM-ON-LAUNCH (manual/GUI mode): operator LAUNCH before the roster fills shrinks the session to the seats present -- egg [pilots]/pages trimmed, seat ids REMAPPED by position (pods re-derive their host id from their tag's roster position, so walk-up prefs and beacons re-key consistently), roster/expected_ids shrink, eggs release, the launch pair fires as ACKs land. GUI: roster rows now update LIVE from the walk-up requests (SEAT n PRESENT/FREED lines -> callsign/mech cells + a blue "seated" status light), and LAUNCH MISSION enables from the first seated player with a "starts with whoever is here" banner. Verified 2-node: 2-of-4 trim ran the mission with the requested mechs; and the mid-roster GAP case -- three joined, the middle player quit pre-launch (beacon FIN freed the seat), trim remapped seat 4->3 with the survivor's callsign/mech following, both survivors registered under the remapped ids and ran the mission. Also: stdin reader guarded against sys.stdin=None spawn shapes (the GUI QProcess pipe is the supported operator channel). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
95735db5ae
commit
10eee05b20
@@ -1803,14 +1803,23 @@ Logical L4NetworkManager::RelayRequestSeat()
|
||||
}
|
||||
}
|
||||
}
|
||||
closesocket(seat_socket);
|
||||
if (got_seat)
|
||||
{
|
||||
// PRESENCE BEACON (2026-07-22, "launch with whoever connects"):
|
||||
// KEEP the seat socket open for the process lifetime. The relay
|
||||
// reads a live beacon as "this player is seated": the operator
|
||||
// can LAUNCH with the seats present, and if this pod closes
|
||||
// before launch the FIN frees the seat instead of ghosting it
|
||||
// (a ghost seat stalls every other pod at the connection gate).
|
||||
// The OS closes it at exit; the relay ignores its silence.
|
||||
static SOCKET s_seatBeacon = INVALID_SOCKET;
|
||||
s_seatBeacon = seat_socket;
|
||||
char joined[128];
|
||||
sprintf(joined, "\nSeat assigned (%s) -- joining!\n", relaySelf);
|
||||
BTRelayWaitStatus(joined);
|
||||
return True;
|
||||
}
|
||||
closesocket(seat_socket);
|
||||
if (roster_full && !full_shown)
|
||||
{
|
||||
BTRelayWaitStatus(
|
||||
|
||||
Reference in New Issue
Block a user