Files
RP412/MUNGA/APPMGR.h
T
CydandClaude Fable 5 3f691cacb3 Departed-pod resilience: collision guard + console loss ends the race
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>
2026-07-13 00:02:54 -05:00

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;
};