Index: ps/trunk/binaries/data/mods/public/gui/gamesetup/Controls/GameSettingsControl.js =================================================================== --- ps/trunk/binaries/data/mods/public/gui/gamesetup/Controls/GameSettingsControl.js +++ ps/trunk/binaries/data/mods/public/gui/gamesetup/Controls/GameSettingsControl.js @@ -8,7 +8,7 @@ { this.startGameControl = startGameControl; this.mapCache = mapCache; - this.gameSettingsFile = new GameSettingsFile(setupWindow); + this.gameSettingsFile = new GameSettingsFile(this); this.previousMap = undefined; this.depth = 0; @@ -28,6 +28,8 @@ startGameControl.registerLaunchGameHandler(this.onLaunchGame.bind(this)); + setupWindow.registerClosePageHandler(this.onClose.bind(this)); + if (g_IsNetworked) netMessages.registerNetMessageHandler("gamesetup", this.onGamesetupMessage.bind(this)); } @@ -134,6 +136,12 @@ } } + onClose() + { + if (!this.autostart) + this.gameSettingsFile.saveFile(); + } + onGetHotloadData(object) { object.gameAttributes = g_GameAttributes; @@ -183,9 +191,18 @@ if (g_GameAttributes.map && this.previousMap != g_GameAttributes.map && g_GameAttributes.mapType) { this.previousMap = g_GameAttributes.map; - let mapData = this.mapCache.getMapData(g_GameAttributes.mapType, g_GameAttributes.map); - for (let handler of this.mapChangeHandlers) - handler(mapData); + // Use a try..catch to avoid completely failing in case of an error + // as this prevents even going back to the main menu. + try + { + let mapData = this.mapCache.getMapData(g_GameAttributes.mapType, g_GameAttributes.map); + for (let handler of this.mapChangeHandlers) + handler(mapData); + } catch(err) { + // Report the error regardless so that the underlying bug gets fixed. + error(err); + error(err.stack); + } } for (let handler of this.gameAttributesChangeHandlers) Index: ps/trunk/binaries/data/mods/public/gui/gamesetup/Controls/GameSettingsFile.js =================================================================== --- ps/trunk/binaries/data/mods/public/gui/gamesetup/Controls/GameSettingsFile.js +++ ps/trunk/binaries/data/mods/public/gui/gamesetup/Controls/GameSettingsFile.js @@ -3,7 +3,7 @@ */ class GameSettingsFile { - constructor(setupWindow) + constructor(GameSettingsControl) { this.filename = g_IsNetworked ? this.GameAttributesFileMultiplayer : @@ -11,8 +11,6 @@ this.engineInfo = Engine.GetEngineInfo(); this.enabled = Engine.ConfigDB_GetValue("user", this.ConfigName) == "true"; - - setupWindow.registerClosePageHandler(this.saveFile.bind(this)); } loadFile() Index: ps/trunk/binaries/data/mods/public/gui/gamesetup/Pages/GameSetupPage/GameSettings/Single/Dropdowns/PopulationCap.js =================================================================== --- ps/trunk/binaries/data/mods/public/gui/gamesetup/Pages/GameSetupPage/GameSettings/Single/Dropdowns/PopulationCap.js +++ ps/trunk/binaries/data/mods/public/gui/gamesetup/Pages/GameSetupPage/GameSettings/Single/Dropdowns/PopulationCap.js @@ -30,7 +30,7 @@ this.perPlayer = isScenario && - mapData.settings.PlayerData && + mapData && mapData.settings && mapData.settings.PlayerData && mapData.settings.PlayerData.some(pData => pData && pData.PopulationLimit !== undefined); this.setEnabled(!isScenario && !this.perPlayer); Index: ps/trunk/binaries/data/mods/public/gui/gamesetup/Pages/GameSetupPage/GameSettings/Single/Dropdowns/StartingResources.js =================================================================== --- ps/trunk/binaries/data/mods/public/gui/gamesetup/Pages/GameSetupPage/GameSettings/Single/Dropdowns/StartingResources.js +++ ps/trunk/binaries/data/mods/public/gui/gamesetup/Pages/GameSetupPage/GameSettings/Single/Dropdowns/StartingResources.js @@ -40,7 +40,7 @@ this.perPlayer = isScenario && - mapData.settings.PlayerData && + mapData && mapData.settings && mapData.settings.PlayerData && mapData.settings.PlayerData.some(pData => pData && pData.Resources !== undefined); this.setEnabled(!isScenario && !this.perPlayer);