Round reset + device-creation retry + load-time pump (rejoin trilogy)

1. ROUND RESET (the "picked Hellbringer, got a Blackhawk" field bug):
   trim/prefs finalize the session egg for ONE round, and that was
   permanent for the relay's lifetime -- a rejoin after a mission or
   crash got the stale finalized egg and its new callsign/mech request
   was recorded but never applied.  _maybe_reset_round() (both drop
   paths) restores the original egg/roster/launch state once every pod
   is gone; live beacons re-key by tag position (conn.seat_tag).
   Verified two-round e2e: blkhawk mission -> exit -> RESET -> lok1
   request -> egg rewritten -> the Hellbringer spawned.

2. DEVICE-CREATION RETRY: CreateDevice(HARDWARE_VERTEXPROCESSING) fails
   transiently when a just-exited instance still holds the adapter
   (caught live; also the parked "exit 139" join crash).  The old
   double-failure path called PostQuitMessage(1) -- which does NOT stop
   execution -- and the NULL mDevice deref right after was the real
   crash.  Now: HW->SW retry with 500ms backoff and a 20s deadline,
   then a clean error box + ExitProcess.

3. LOAD-TIME PUMP: mission load is thousands of back-to-back
   synchronous model loads; the starved message pump ghosted the window
   "Not Responding" mid-load.  BTLoadPump() (hooked from
   d3d_OBJECT::LoadObject) pumps + repaints the wait screen at most
   every 150ms pre-run; no-op once the scene is live.

Also: round-reset originals captured after the roster parse (the first
cut crashed the relay constructor -- caught by the two-round test).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
arcattack
2026-07-22 18:57:50 -05:00
co-authored by Claude Opus 4.8
parent 638cfca18d
commit 3a9b35fc06
4 changed files with 134 additions and 7 deletions
+20
View File
@@ -425,6 +425,26 @@ phase). Plan: `~/.claude/plans/partitioned-snuggling-piglet.md`.
deferrals so a wedged load still surfaces the original Fail. `[launch] ... deferred +1s`
log per deferral. Verified: the crashing shape deferred 104x through a ~50s load, then
launched and ran clean.
- **ROUND RESET (2026-07-22) [T2]**: trim/prefs FINALIZE the egg for one round -- and that used
to be permanent for the relay's lifetime, so a REJOIN after a mission (or crash) was served
the stale finalized egg and its new callsign/mech request was recorded but never applied (the
field "picked Hellbringer, got a Blackhawk"). Now `_maybe_reset_round()` (triggered from both
drop paths) restores the ORIGINAL egg/roster/launch state once every pod is gone; live beacons
(players already waiting for the next round) re-key by their TAG's position in the restored
roster (`conn.seat_tag`, captured at assign). Verified two-round e2e: round 1 blkhawk mission
-> pod exit -> RESET -> round 2 requested lok1 -> egg rewritten vehicle=lok1 -> the pod
spawned the Hellbringer. Operator flow for code updates: the relay is spawned per Start
Session -- a session RESTART picks up new btconsole code.
- **DEVICE-CREATION RETRY (2026-07-22) [T2]**: `CreateDevice(HARDWARE_VERTEXPROCESSING)` can
fail TRANSIENTLY (a just-exited instance still holds the adapter -- caught live: a round-2
pod died while round-1 tore down; also the parked "exit 139 during join"). The old code had
no retry AND its double-failure path called PostQuitMessage(1) which does NOT stop execution
-- the NULL mDevice deref right after was the actual crash. Now: HW->SW retry loop, 500ms
backoff, 20s deadline, then a clean MessageBox + ExitProcess (L4VIDEO.cpp).
- **LOAD-TIME PUMP (2026-07-22) [T2]**: the mission load is thousands of small synchronous
model loads back-to-back -- the message pump starved and the window ghosted "Not Responding"
mid-load. `BTLoadPump()` (L4VIDEO, hooked from `d3d_OBJECT::LoadObject`) pumps + repaints the
wait screen at most every 150ms during pre-run states; no-op once the scene is live.
- **PATIENT WALK-UP (2026-07-18) [T2]**: a pod dialed at a relay that isn't up yet no longer
aborts (release `Fail()` is a bare `abort()` = looked like a "crash", field report). Both the
seat request (`RelayRequestSeat`) and LAN discovery (`BT_RELAY=auto`) now RETRY (2s dials, 30