Round six raced all three machines (staging fix confirmed) and then exposed what happens when a pod leaves mid-mission - which arcade pods never did. The B crash dump named it exactly: VTV::TakeDamageMessageHandler resolved message->inflictingEntity to NULL (the entity belonged to the departed owner) and dereferenced it - Verify is compiled out in release. Collision damage from an entity that no longer exists is now ignored. And the race B and C were left in was a zombie: the owner (console) had aborted, so the mission clock would count up forever and the death/respawn flow hung with nobody to arbitrate. Lobby-member races now set gConsoleLossEndsMission: losing the console mid-mission posts StopMission locally, the pod tears down, and lands back in the lobby room. Arcade -net pods keep the re-listen-and-wait behavior. Loopback hosted race still green. For the drivers: the ampersand key is the arcade mission-abort - that was every crash-on-keypress so far; and a sleeping Bluetooth pad wakes on the Xbox button and hot-connects within 3 seconds (PadRIO re-probes). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
51 lines
1.4 KiB
C++
51 lines
1.4 KiB
C++
#pragma once
|
|
|
|
#include "app.h"
|
|
|
|
extern HWND ghWnd;
|
|
|
|
// per-frame observer called once per RunMissions frame, after the
|
|
// foreground pass (the single-player local-console marshal uses this)
|
|
extern void (*gPerFrameHook)();
|
|
|
|
// True when an in-process console marshals the launch: suppresses the
|
|
// no-console self-run in CheckLoadMessageHandler so a hosted network
|
|
// race stages at WaitingForLaunch until every pod is ready. Plain
|
|
// single player leaves it False and auto-runs exactly as always.
|
|
extern Logical gConsoleMarshalsLaunch;
|
|
|
|
// True for lobby-member races: losing the console mid-mission ends the
|
|
// mission (the owner left - without a console the timer counts up
|
|
// forever). Arcade -net pods leave it False and re-listen for their
|
|
// console to return, exactly as always.
|
|
extern Logical gConsoleLossEndsMission;
|
|
|
|
class ApplicationManager : public Node
|
|
{
|
|
public:
|
|
ApplicationManager(HINSTANCE hInstance, HWND hWnd, Scalar frame_rate);
|
|
~ApplicationManager();
|
|
|
|
void StartApplication(Application *new_app);
|
|
|
|
void RunMissions();
|
|
|
|
Scalar GetFrameRate()
|
|
{
|
|
Check(this);
|
|
return frameRate;
|
|
}
|
|
|
|
HINSTANCE GetHInstance() { return mHInstance; }
|
|
HWND GetHWnd() { return ghWnd; }
|
|
|
|
static ApplicationManager* GetCurrentManager() { return CurrentAppManager; }
|
|
|
|
protected:
|
|
static ApplicationManager* CurrentAppManager;
|
|
|
|
Scalar frameDuration, frameRate;
|
|
SChainOf<Application*> runningApplications;
|
|
HINSTANCE mHInstance;
|
|
};
|