From b2fdfeba53491833a191aa7bb4a7e7ca930b037b Mon Sep 17 00:00:00 2001 From: elexis Date: Wed, 20 Apr 2016 21:01:58 +0000 Subject: [PATCH] New gamesetup option enabling the host to vary the time required to win the wonder-gamemode. Patch by svott, fixes #3234. This was SVN commit r18075. --- .../data/mods/public/gui/common/settings.js | 22 +++++ .../mods/public/gui/gamesetup/gamesetup.js | 95 ++++++++++++++++--- .../mods/public/gui/gamesetup/gamesetup.xml | 32 ++++--- .../mods/public/maps/scripts/WonderVictory.js | 2 +- .../simulation/components/EndGameManager.js | 14 ++- .../public/simulation/components/Wonder.js | 12 ++- .../data/settings/wonder_times.json | 5 + .../mods/public/simulation/helpers/Setup.js | 2 + .../templates/template_structure_wonder.xml | 2 +- 9 files changed, 156 insertions(+), 30 deletions(-) create mode 100644 binaries/data/mods/public/simulation/data/settings/wonder_times.json diff --git a/binaries/data/mods/public/gui/common/settings.js b/binaries/data/mods/public/gui/common/settings.js index 3646beea9e..d142614197 100644 --- a/binaries/data/mods/public/gui/common/settings.js +++ b/binaries/data/mods/public/gui/common/settings.js @@ -32,6 +32,7 @@ function loadSettingsValues() "AIDescriptions": loadAIDescriptions(), "AIDifficulties": loadAIDifficulties(), "Ceasefire": loadCeasefire(), + "WonderDurations": loadWonderDuration(), "GameSpeeds": loadSettingValuesFile("game_speeds.json"), "MapTypes": loadMapTypes(), "MapSizes": loadSettingValuesFile("map_sizes.json"), @@ -130,6 +131,27 @@ function loadAIDifficulties() ]; } +/** + * Loads available wonder-victory times + */ +function loadWonderDuration() +{ + var jsonFile = "wonder_times.json"; + var json = Engine.ReadJSONFile(g_SettingsDirectory + jsonFile); + + if (!json || json.Default === undefined || !json.Times || !Array.isArray(json.Times)) + { + error("Could not load " + jsonFile); + return undefined; + } + + return json.Times.map(duration => ({ + "Duration": duration, + "Default": duration == json.Default, + "Title": sprintf(translatePluralWithContext("wonder victory", "%(min)s minute", "%(min)s minutes", duration), { "min": duration }) + })); +} + /** * Loads available ceasefire settings. * diff --git a/binaries/data/mods/public/gui/gamesetup/gamesetup.js b/binaries/data/mods/public/gui/gamesetup/gamesetup.js index f4862a5276..8e83693b0a 100644 --- a/binaries/data/mods/public/gui/gamesetup/gamesetup.js +++ b/binaries/data/mods/public/gui/gamesetup/gamesetup.js @@ -8,6 +8,7 @@ const g_MapTypes = prepareForDropdown(g_Settings && g_Settings.MapTypes); const g_PopulationCapacities = prepareForDropdown(g_Settings && g_Settings.PopulationCapacities); const g_StartingResources = prepareForDropdown(g_Settings && g_Settings.StartingResources); const g_VictoryConditions = prepareForDropdown(g_Settings && g_Settings.VictoryConditions); +const g_WonderDurations = prepareForDropdown(g_Settings && g_Settings.WonderDurations); /** * All selectable playercolors except gaia. @@ -248,6 +249,7 @@ function initGUIObjects() initPopulationCaps(); initStartingResources(); initCeasefire(); + initWonderDurations(); initVictoryConditions(); initMapSizes(); initRadioButtons(); @@ -300,22 +302,49 @@ function initMapFilters() } /** - * Sets the size of the more-options dialog. + * Remove empty space in case of hidden options (like cheats, rating or wonder duration) */ function resizeMoreOptionsWindow() { - // For singleplayer reduce the size of more options dialog by two options (cheats, rated game = 60px) - if (!g_IsNetworked) + const elementHeight = 30; + const elements = [ + "optionGameSpeed", + "optionVictoryCondition", + "optionWonderDuration", + "optionPopulationCap", + "optionStartingResources", + "optionCeasefire", + "optionRevealMap", + "optionExploreMap", + "optionDisableTreasures", + "optionLockTeams", + "optionCheats", + "optionRating", + "hideMoreOptions" + ]; + + let yPos = undefined; + for (let element of elements) { - Engine.GetGUIObjectByName("moreOptions").size = "50%-200 50%-195 50%+200 50%+160"; - Engine.GetGUIObjectByName("hideMoreOptions").size = "50%-70 310 50%+70 336"; - } - // For non-lobby multiplayergames reduce the size of the dialog by one option (rated game, 30px) - else if (!Engine.HasXmppClient()) - { - Engine.GetGUIObjectByName("moreOptions").size = "50%-200 50%-195 50%+200 50%+190"; - Engine.GetGUIObjectByName("hideMoreOptions").size = "50%-70 340 50%+70 366"; + let guiOption = Engine.GetGUIObjectByName(element); + let gSize = guiOption.size; + yPos = yPos || gSize.top; + + if (guiOption.hidden) + continue; + + gSize.top = yPos; + gSize.bottom = yPos + elementHeight - 2; + guiOption.size = gSize; + + yPos += elementHeight; } + + // Resize the vertically centered window containing the options + let moreOptions = Engine.GetGUIObjectByName("moreOptions"); + let mSize = moreOptions.size; + mSize.bottom = mSize.top + yPos + 20; + moreOptions.size = mSize; } function initNumberOfPlayers() @@ -406,6 +435,21 @@ function initVictoryConditions() victoryConditions.selected = g_VictoryConditions.Default; } +function initWonderDurations() +{ + let wonderConditions = Engine.GetGUIObjectByName("wonderDuration"); + wonderConditions.list = g_WonderDurations.Title; + wonderConditions.list_data = g_WonderDurations.Duration; + wonderConditions.onSelectionChange = function() + { + if (this.selected != -1) + g_GameAttributes.settings.WonderDuration = g_WonderDurations.Duration[this.selected]; + + updateGameAttributes(); + }; + wonderConditions.selected = g_WonderDurations.Default; +} + function initMapSizes() { let mapSize = Engine.GetGUIObjectByName("mapSize"); @@ -1090,6 +1134,9 @@ function selectMap(name) g_GameAttributes.settings.VictoryScripts = g_VictoryConditions.Scripts[victoryIdx]; } + if (g_GameAttributes.mapType == "scenario") + delete g_GameAttributes.settings.WonderDuration; + if (mapSettings.PlayerData) sanitizePlayerData(mapSettings.PlayerData); @@ -1243,6 +1290,7 @@ function updateGUIObjects() // These dropdowns might set the default (as they ignore g_IsInGuiUpdate) let mapSizeIdx = mapSettings.Size !== undefined ? g_MapSizes.Tiles.indexOf(mapSettings.Size) : g_MapSizes.Default; let victoryIdx = mapSettings.GameType !== undefined ? g_VictoryConditions.Name.indexOf(mapSettings.GameType) : g_VictoryConditions.Default; + let wonderDurationIdx = mapSettings.WonderDuration !== undefined ? g_WonderDurations.Duration.indexOf(mapSettings.WonderDuration) : g_WonderDurations.Default; let popIdx = mapSettings.PopulationCap !== undefined ? g_PopulationCapacities.Population.indexOf(mapSettings.PopulationCap) : g_PopulationCapacities.Default; let startingResIdx = mapSettings.StartingResources !== undefined ? g_StartingResources.Resources.indexOf(mapSettings.StartingResources) : g_StartingResources.Default; let ceasefireIdx = mapSettings.Ceasefire !== undefined ? g_Ceasefire.Duration.indexOf(mapSettings.Ceasefire) : g_Ceasefire.Default; @@ -1256,6 +1304,7 @@ function updateGUIObjects() Engine.GetGUIObjectByName("mapSize").selected = mapSizeIdx; Engine.GetGUIObjectByName("numPlayersSelection").selected = numPlayers - 1; Engine.GetGUIObjectByName("victoryCondition").selected = victoryIdx; + Engine.GetGUIObjectByName("wonderDuration").selected = wonderDurationIdx; Engine.GetGUIObjectByName("populationCap").selected = popIdx; Engine.GetGUIObjectByName("gameSpeed").selected = gameSpeedIdx; Engine.GetGUIObjectByName("ceasefire").selected = ceasefireIdx; @@ -1273,6 +1322,7 @@ function updateGUIObjects() Engine.GetGUIObjectByName("mapSizeText").caption = g_GameAttributes.mapType == "random" ? g_MapSizes.LongName[mapSizeIdx] : translate("Default"); Engine.GetGUIObjectByName("numPlayersText").caption = numPlayers; Engine.GetGUIObjectByName("victoryConditionText").caption = g_VictoryConditions.Title[victoryIdx]; + Engine.GetGUIObjectByName("wonderDurationText").caption = g_WonderDurations.Title[wonderDurationIdx]; Engine.GetGUIObjectByName("populationCapText").caption = g_PopulationCapacities.Title[popIdx]; Engine.GetGUIObjectByName("startingResourcesText").caption = g_StartingResources.Title[startingResIdx]; Engine.GetGUIObjectByName("ceasefireText").caption = g_Ceasefire.Title[ceasefireIdx]; @@ -1285,6 +1335,10 @@ function updateGUIObjects() setGUIBoolean("lockTeams", "lockTeamsText", !!mapSettings.LockTeams); setGUIBoolean("enableRating", "enableRatingText", !!mapSettings.RatingEnabled); + Engine.GetGUIObjectByName("optionWonderDuration").hidden = + g_GameAttributes.settings.GameType && + g_GameAttributes.settings.GameType != "wonder"; + Engine.GetGUIObjectByName("cheatWarningText").hidden = !g_IsNetworked || !mapSettings.CheatsEnabled; Engine.GetGUIObjectByName("enableCheats").enabled = !mapSettings.RatingEnabled; @@ -1299,6 +1353,7 @@ function updateGUIObjects() let notScenario = g_GameAttributes.mapType != "scenario" && g_IsController ; hideControl("victoryCondition", "victoryConditionText", notScenario); + hideControl("wonderDuration", "wonderDurationText", notScenario); hideControl("populationCap", "populationCapText", notScenario); hideControl("startingResources", "startingResourcesText", notScenario); hideControl("ceasefire", "ceasefireText", notScenario); @@ -1356,6 +1411,8 @@ function updateGUIObjects() pColorPicker.selected = g_PlayerColors.findIndex(col => sameColor(col, color)); } + resizeMoreOptionsWindow(); + g_IsInGuiUpdate = false; // Game attributes include AI settings, so update the player list @@ -1374,7 +1431,21 @@ function setMapDescription() let mapName = g_GameAttributes.map || ""; let victoryIdx = Math.max(0, g_VictoryConditions.Name.indexOf(g_GameAttributes.settings.GameType || "")); - let victoryTitle = g_VictoryConditions.Title[victoryIdx]; + let victoryTitle; + + if (g_VictoryConditions.Name[victoryIdx] == "wonder") + victoryTitle = sprintf( + translatePluralWithContext( + "victory condition", + "Wonder (%(min)s minute)", + "Wonder (%(min)s minutes)", + g_GameAttributes.settings.WonderDuration + ), + { "min": g_GameAttributes.settings.WonderDuration } + ); + else + victoryTitle = g_VictoryConditions.Title[victoryIdx]; + if (victoryIdx != g_VictoryConditions.Default) victoryTitle = "[color=\"" + g_VictoryColor + "\"]" + victoryTitle + "[/color]"; diff --git a/binaries/data/mods/public/gui/gamesetup/gamesetup.xml b/binaries/data/mods/public/gui/gamesetup/gamesetup.xml index 7699aea527..9ec03369d6 100644 --- a/binaries/data/mods/public/gui/gamesetup/gamesetup.xml +++ b/binaries/data/mods/public/gui/gamesetup/gamesetup.xml @@ -276,7 +276,7 @@ More Options - + Game Speed: @@ -286,7 +286,7 @@ - + Victory Condition: @@ -296,7 +296,17 @@ - + + + Wonder Victory: + + + + + + Population Cap: @@ -306,7 +316,7 @@ - + Starting Resources: @@ -316,7 +326,7 @@ - + Ceasefire: @@ -326,7 +336,7 @@ - + Revealed Map: @@ -336,7 +346,7 @@ - + Explored Map: @@ -346,7 +356,7 @@ - + Disable Treasures: @@ -356,7 +366,7 @@ - + Teams Locked: @@ -366,7 +376,7 @@ - -