mirror of
https://gitea.wildfiregames.com/0ad/0ad
synced 2026-08-15 14:43:32 -07:00
149 lines
3.9 KiB
JavaScript
149 lines
3.9 KiB
JavaScript
/**
|
|
* This class stores the GameSetupPage and every subpage that is shown in the game setup.
|
|
*/
|
|
class SetupWindowPages
|
|
{
|
|
}
|
|
|
|
/**
|
|
* The SetupWindow is the root class owning all other class instances.
|
|
* The class shall be ineligible to perform any GUI object logic and shall defer that task to owned classes.
|
|
*/
|
|
class SetupWindow
|
|
{
|
|
constructor(initData, hotloadData, closePageCallback)
|
|
{
|
|
if (!g_Settings)
|
|
return;
|
|
|
|
Engine.ProfileStart("SetupWindow");
|
|
|
|
this.loadHandlers = new Set();
|
|
this.closePageHandlers = new Set();
|
|
this.getHotloadDataHandlers = new Set();
|
|
|
|
if (initData?.backPage)
|
|
this.backPage = initData.backPage;
|
|
|
|
const savedGame = initData?.savedGame;
|
|
const isSavedGame = !!savedGame;
|
|
|
|
const mapCache = new MapCache();
|
|
g_GameSettings = new GameSettings();
|
|
g_GameSettings.init(mapCache, g_IsController ? savedGame : undefined);
|
|
if (initData?.gameName)
|
|
g_GameSettings.gameName.value = initData.gameName;
|
|
if (initData?.hostName)
|
|
g_GameSettings.hostName.value = initData.hostName;
|
|
|
|
|
|
const netMessages = new NetMessages();
|
|
const mapFilters = new MapFilters(mapCache);
|
|
const playerAssignmentsController =
|
|
new PlayerAssignmentsController(this, netMessages, isSavedGame);
|
|
const gameSettingsController = new GameSettingsController(this, netMessages,
|
|
playerAssignmentsController, mapCache, closePageCallback, isSavedGame);
|
|
const readyController = new ReadyController(netMessages, gameSettingsController, playerAssignmentsController);
|
|
const lobbyGameRegistrationController = g_IsController && Engine.HasXmppClient() &&
|
|
new LobbyGameRegistrationController(initData, this, netMessages, mapCache, playerAssignmentsController);
|
|
|
|
// These class instances control central data and do not manage any GUI Object.
|
|
this.controls = {
|
|
"gameSettingsController": gameSettingsController,
|
|
"playerAssignmentsController": playerAssignmentsController,
|
|
"mapCache": mapCache,
|
|
"mapFilters": mapFilters,
|
|
"readyController": readyController,
|
|
"netMessages": netMessages,
|
|
"lobbyGameRegistrationController": lobbyGameRegistrationController
|
|
};
|
|
|
|
// These are the pages within the setup window that may use the controls defined above
|
|
this.pages = {};
|
|
for (const name in SetupWindowPages)
|
|
{
|
|
this.pages[name] = new SetupWindowPages[name](this, isSavedGame,
|
|
this.closePage.bind(this, closePageCallback));
|
|
}
|
|
|
|
netMessages.registerNetMessageHandler("netwarn", addNetworkWarning);
|
|
setTimeout(displayGamestateNotifications, 1000);
|
|
Engine.GetGUIObjectByName("setupWindow").onTick = () => this.onTick();
|
|
|
|
// This event is triggered after all classes have been instantiated and subscribed to each others events
|
|
for (const handler of this.loadHandlers)
|
|
handler(initData, hotloadData);
|
|
|
|
Engine.ProfileStop();
|
|
}
|
|
|
|
registerLoadHandler(handler)
|
|
{
|
|
this.loadHandlers.add(handler);
|
|
}
|
|
|
|
unregisterLoadHandler(handler)
|
|
{
|
|
this.loadHandlers.delete(handler);
|
|
}
|
|
|
|
registerClosePageHandler(handler)
|
|
{
|
|
this.closePageHandlers.add(handler);
|
|
}
|
|
|
|
unregisterClosePageHandler(handler)
|
|
{
|
|
this.closePageHandlers.delete(handler);
|
|
}
|
|
|
|
registerGetHotloadDataHandler(handler)
|
|
{
|
|
this.getHotloadDataHandlers.add(handler);
|
|
}
|
|
|
|
unregisterGetHotloadDataHandler(handler)
|
|
{
|
|
this.getHotloadDataHandlers.delete(handler);
|
|
}
|
|
|
|
getHotloadData()
|
|
{
|
|
const object = {};
|
|
for (const handler of this.getHotloadDataHandlers)
|
|
handler(object);
|
|
return object;
|
|
}
|
|
|
|
onTick()
|
|
{
|
|
updateTimers();
|
|
}
|
|
|
|
closePage(closePageCallback)
|
|
{
|
|
for (const handler of this.closePageHandlers)
|
|
handler();
|
|
|
|
Engine.DisconnectNetworkGame();
|
|
|
|
if (this.backPage)
|
|
{
|
|
closePageCallback({ [Engine.openRequest]: {
|
|
"page": this.backPage.page,
|
|
"argument": this.backPage?.data
|
|
} });
|
|
}
|
|
if (Engine.HasXmppClient())
|
|
{
|
|
closePageCallback({ [Engine.openRequest]: {
|
|
"page": "page_lobby.xml",
|
|
"argument": { "dialog": false }
|
|
} });
|
|
}
|
|
closePageCallback({ [Engine.openRequest]: {
|
|
"page": "page_pregame.xml"
|
|
} });
|
|
|
|
}
|
|
}
|