Join wait: animate through EVERY pre-mission state

Two follow-ups to the waiting-screen work, both user-reported:

1. "Animation frozen after connecting": once the console seats the player
   and sends the egg, the state advances LoadingMission -> WaitingForLaunch
   -- where NOTHING presents until the operator's RunMission, so the last
   idle frame froze on screen with the mission audio already running.
   ExecuteForeground now keeps the idle clear + overlay alive through
   LoadingMission/WaitingForLaunch/LaunchingMission (no early return -- the
   load/replication work continues), and ExecuteIdle picks per-state text:
     WaitingForEgg    "WAITING FOR MISSION ASSIGNMENT"
     Loading/Launching "LOADING MISSION / stand by"
     WaitingForLaunch "MISSION READY / waiting for the operator to launch"

2. The roster-full retry pause was a raw Sleep(3000) -- with the relay up
   and answering SEAT_FULL instantly, the process spent ~95% of its time
   unpumped (IsHungAppWindow TRUE, spinner frozen).  Now 30 pumped 100ms
   slices with the reason on screen ("session is FULL -- waiting for a
   seat to free up").

Verified live against the running operator relay: roster-full wait shows
the reason text, spinner advances across 500ms captures, IsHungAppWindow
false on every sample.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
arcattack
2026-07-22 08:40:55 -05:00
co-authored by Claude Opus 4.8
parent a1c9a71898
commit f0918c66b0
3 changed files with 42 additions and 3 deletions
+15 -2
View File
@@ -8846,8 +8846,21 @@ void DPLRenderer::ExecuteIdle()
// repainted after every Present; join/join_lan UX fix 2026-07-22).
{
HRESULT present_hr = mDevice->Present(NULL, NULL, NULL, NULL);
BTWaitScreenPaint("WAITING FOR MISSION ASSIGNMENT",
"the operator starts the session from the console");
const char *wait_line1 = "WAITING FOR MISSION ASSIGNMENT";
const char *wait_line2 = "the operator starts the session from the console";
switch (application ? application->GetApplicationState() : -1)
{
case Application::LoadingMission:
case Application::LaunchingMission:
wait_line1 = "LOADING MISSION";
wait_line2 = "stand by";
break;
case Application::WaitingForLaunch:
wait_line1 = "MISSION READY";
wait_line2 = "waiting for the operator to launch";
break;
}
BTWaitScreenPaint(wait_line1, wait_line2);
if (present_hr == D3DERR_DEVICELOST)
{
int bbCount = mPresentParams.BackBufferCount;