Index: binaries/data/mods/public/gui/gamesetup/Controls/GameSettingsControl.js =================================================================== --- binaries/data/mods/public/gui/gamesetup/Controls/GameSettingsControl.js +++ binaries/data/mods/public/gui/gamesetup/Controls/GameSettingsControl.js @@ -10,7 +10,6 @@ this.mapCache = mapCache; this.gameSettingsFile = new GameSettingsFile(setupWindow); - this.previousMap = undefined; this.depth = 0; // This property may be read from publicly @@ -21,7 +20,6 @@ this.gameAttributesFinalizeHandlers = new Set(); this.pickRandomItemsHandlers = new Set(); this.assignPlayerHandlers = new Set(); - this.mapChangeHandlers = new Set(); setupWindow.registerLoadHandler(this.onLoad.bind(this)); setupWindow.registerGetHotloadDataHandler(this.onGetHotloadData.bind(this)); @@ -32,16 +30,6 @@ netMessages.registerNetMessageHandler("gamesetup", this.onGamesetupMessage.bind(this)); } - registerMapChangeHandler(handler) - { - this.mapChangeHandlers.add(handler); - } - - unregisterMapChangeHandler(handler) - { - this.mapChangeHandlers.delete(handler); - } - /** * This message is triggered everytime g_GameAttributes change. * Handlers may subsequently change g_GameAttributes and trigger this message again. @@ -178,16 +166,6 @@ g_GameAttributes.settings.PlayerData[i] = {}; } - // Map change handlers are triggered first, so that GameSettingControls can update their - // gameAttributes model prior to applying that model in their gameAttributesChangeHandler. - 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); - } - for (let handler of this.gameAttributesChangeHandlers) handler(); Index: binaries/data/mods/public/gui/gamesetup/Pages/GameSetupPage/GameSettings/GameSettingControl.js =================================================================== --- binaries/data/mods/public/gui/gamesetup/Pages/GameSetupPage/GameSettings/GameSettingControl.js +++ binaries/data/mods/public/gui/gamesetup/Pages/GameSetupPage/GameSettings/GameSettingControl.js @@ -60,13 +60,13 @@ this.setHidden(false); if (this.onMapChange) - this.gameSettingsControl.registerMapChangeHandler(this.onMapChange.bind(this)); + this.previousMap = undefined; if (this.onLoad) this.setupWindow.registerLoadHandler(this.onLoad.bind(this)); if (this.onGameAttributesChange) - this.gameSettingsControl.registerGameAttributesChangeHandler(this.onGameAttributesChange.bind(this)); + this.gameSettingsControl.registerGameAttributesChangeHandler(this.onGameAttributesChangeSuper.bind(this)); if (this.onGameAttributesBatchChange) this.gameSettingsControl.registerGameAttributesBatchChangeHandler(this.onGameAttributesBatchChange.bind(this)); @@ -84,6 +84,20 @@ this.playerAssignmentsControl.registerPlayerAssignmentsChangeHandler(this.onPlayerAssignmentsChange.bind(this)); } + onGameAttributesChangeSuper() + { + // Map change handlers are triggered first, so that GameSettingControls can update their + // gameAttributes model prior to applying that model in their gameAttributesChangeHandler. + if (this.onMapChange && 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); + this.onMapChange(mapData); + } + + this.onGameAttributesChange(); + } + setTitle(titleCaption) { this.autocompleteTitle = titleCaption; Index: binaries/data/mods/public/gui/gamesetup/Pages/GameSetupPage/GameSettings/GameSettingsLayout.js =================================================================== --- binaries/data/mods/public/gui/gamesetup/Pages/GameSetupPage/GameSettings/GameSettingsLayout.js +++ binaries/data/mods/public/gui/gamesetup/Pages/GameSetupPage/GameSettings/GameSettingsLayout.js @@ -13,6 +13,7 @@ "Landscape", "Biome", "Daytime", + "SeaLevelRiseTime", "TriggerDifficulty", "Nomad", "Treasures", Index: binaries/data/mods/public/gui/gamesetup/Pages/GameSetupPage/GameSettings/Single/Sliders/SeaLevelRiseTime.js =================================================================== --- /dev/null +++ binaries/data/mods/public/gui/gamesetup/Pages/GameSetupPage/GameSettings/Single/Sliders/SeaLevelRiseTime.js @@ -0,0 +1,84 @@ +GameSettingControls.SeaLevelRiseTime = class extends GameSettingControlSlider +{ + constructor(...args) + { + super(...args); + + this.values = undefined; + this.sprintfValue = {}; + } + + onMapChange(mapData) + { + this.values = + mapData && + mapData.settings && + mapData.settings.SeaLevelRiseTime || undefined; + + if (this.values) + { + this.slider.min_value = this.values.Min; + this.slider.max_value = this.values.Max; + this.gameSettingsControl.updateGameAttributes(); + } + + this.setHidden(!this.values); + this.setEnabled(g_GameAttributes.mapType != "scenario"); + } + + onGameAttributesChange() + { + if (this.values) + { + if (g_GameAttributes.settings.SeaLevelRiseTime === undefined) + { + g_GameAttributes.settings.SeaLevelRiseTime = this.values.Default; + this.gameSettingsControl.updateGameAttributes(); + } + } + else if (g_GameAttributes.settings.SeaLevelRiseTime !== undefined) + { + delete g_GameAttributes.settings.SeaLevelRiseTime; + this.gameSettingsControl.updateGameAttributes(); + } + } + + onGameAttributesBatchChange() + { + if (!this.values) + return; + + let value = Math.round(g_GameAttributes.settings.SeaLevelRiseTime); + this.sprintfValue.minutes = value; + + this.setSelectedValue( + g_GameAttributes.settings.SeaLevelRiseTime, + sprintf(this.SeaLevelRiseTimeCaption(value), this.sprintfValue)); + } + + onValueChange(value) + { + g_GameAttributes.settings.SeaLevelRiseTime = value; + this.gameSettingsControl.updateGameAttributes(); + this.gameSettingsControl.setNetworkGameAttributes(); + } + + onGameAttributesFinalize() + { + if (this.values) + g_GameAttributes.settings.SeaLevelRiseTime = Math.round(g_GameAttributes.settings.SeaLevelRiseTime); + } +}; + +GameSettingControls.SeaLevelRiseTime.prototype.TitleCaption = + translate("Sea Level Rise Time"); + +GameSettingControls.SeaLevelRiseTime.prototype.Tooltip = + translate("Set the time when the water will start to rise."); + +GameSettingControls.SeaLevelRiseTime.prototype.SeaLevelRiseTimeCaption = + minutes => translatePluralWithContext("sea level rise time", "%(minutes)s minute", "%(minutes)s minutes", minutes); + +GameSettingControls.SeaLevelRiseTime.prototype.MinValue = 0; + +GameSettingControls.SeaLevelRiseTime.prototype.MaxValue = 60; Index: binaries/data/mods/public/gui/gamesetup/Pages/GameSetupPage/Panels/MapPreview.js =================================================================== --- binaries/data/mods/public/gui/gamesetup/Pages/GameSetupPage/Panels/MapPreview.js +++ binaries/data/mods/public/gui/gamesetup/Pages/GameSetupPage/Panels/MapPreview.js @@ -8,12 +8,20 @@ this.mapInfoName = Engine.GetGUIObjectByName("mapInfoName"); this.mapPreview = Engine.GetGUIObjectByName("mapPreview"); - this.gameSettingsControl.registerMapChangeHandler(this.onMapChange.bind(this)); + this.previousMap = undefined; + + this.gameSettingsControl.registerGameAttributesChangeHandler(this.onGameAttributesChange.bind(this)); this.gameSettingsControl.registerGameAttributesBatchChangeHandler(this.onGameAttributesBatchChange.bind(this)); } - onMapChange(mapData) + onGameAttributesChange() { + if (!g_GameAttributes.map || this.previousMap == g_GameAttributes.map || !g_GameAttributes.mapType) + return; + + this.previousMap = g_GameAttributes.map; + let mapData = this.mapCache.getMapData(g_GameAttributes.mapType, g_GameAttributes.map); + let preview = mapData && mapData.settings && mapData.settings.Preview; if (!g_GameAttributes.settings.Preview || g_GameAttributes.settings.Preview != preview) { Index: binaries/data/mods/public/maps/random/extinct_volcano.json =================================================================== --- binaries/data/mods/public/maps/random/extinct_volcano.json +++ binaries/data/mods/public/maps/random/extinct_volcano.json @@ -9,6 +9,11 @@ "Keywords": ["trigger"], "CircularMap" : true, "Preview" : "extinctvolcano.png", + "SeaLevelRiseTime": { + "Min": 0, + "Max": 60, + "Default": 25 + }, "TriggerScripts": [ "scripts/TriggerHelper.js", "random/extinct_volcano_triggers.js" Index: binaries/data/mods/public/maps/random/extinct_volcano_triggers.js =================================================================== --- binaries/data/mods/public/maps/random/extinct_volcano_triggers.js +++ binaries/data/mods/public/maps/random/extinct_volcano_triggers.js @@ -9,12 +9,6 @@ var debugWaterRise = false; /** - * Time in minutes when the water level starts to rise. - * Allow players to build up the economy and military for some time. - */ -var waterRiseStartTime = [22, 26]; - -/** * Duration in minutes for which the notification will be shown that states that the water will rise soon. */ var waterRiseNotificationDuration = 1; @@ -190,7 +184,7 @@ { - let waterRiseTime = debugWaterRise ? 0 : randFloat(...waterRiseStartTime); + let waterRiseTime = debugWaterRise ? 0 : (InitAttributes.settings.SeaLevelRiseTime || 25); let cmpTrigger = Engine.QueryInterface(SYSTEM_ENTITY, IID_Trigger); cmpTrigger.GarrisonWoodenTowers(); cmpTrigger.DoAfterDelay((waterRiseTime - waterRiseNotificationDuration) * 60 * 1000, "RaisingWaterNotification", {});