From 16de5c75ac7d5dafc10e82bd471bd2b846ed06ab Mon Sep 17 00:00:00 2001 From: historic_bruno Date: Wed, 3 Apr 2013 23:24:22 +0000 Subject: [PATCH] Adds game speed option to match setup, adds in-game control for single player games, fixes #785. Refactors some GUI utility functions. This was SVN commit r13340. --- .../public/gui/common/functions_utility.js | 106 ++++++++++++------ .../mods/public/gui/gamesetup/gamesetup.js | 32 +++++- .../mods/public/gui/gamesetup/gamesetup.xml | 24 ++-- binaries/data/mods/public/gui/session/menu.js | 6 + .../data/mods/public/gui/session/session.js | 29 ++++- .../data/mods/public/gui/session/session.xml | 25 ++++- .../public/simulation/data/game_speeds.json | 30 +++++ source/gui/scripting/ScriptFunctions.cpp | 8 +- source/ps/Game.cpp | 4 + source/ps/Game.h | 7 +- 10 files changed, 214 insertions(+), 57 deletions(-) create mode 100644 binaries/data/mods/public/simulation/data/game_speeds.json diff --git a/binaries/data/mods/public/gui/common/functions_utility.js b/binaries/data/mods/public/gui/common/functions_utility.js index e1748e4dfe..1c1a049df3 100644 --- a/binaries/data/mods/public/gui/common/functions_utility.js +++ b/binaries/data/mods/public/gui/common/functions_utility.js @@ -134,29 +134,43 @@ function toTitleCase (string) // ==================================================================== -// Load default player data, for when it's not otherwise specified -function initPlayerDefaults() +// Parse and return JSON data from file in simulation/data/* +// returns valid object or undefined on error +function parseJSONFromDataFile(filename) { - var filename = "simulation/data/player_defaults.json"; - var defaults = []; - var rawData = readFile(filename); + var path = "simulation/data/"+filename; + var rawData = readFile(path); if (!rawData) - error("Failed to read player defaults file: "+filename); - + error("Failed to read file: "+path); + try - { // Catch nasty errors from JSON parsing + { + // Catch nasty errors from JSON parsing // TODO: Need more info from the parser on why it failed: line number, position, etc! var data = JSON.parse(rawData); - if (!data || !data.PlayerData) - error("Failed to parse player defaults in: "+filename+" (check for valid JSON data)"); - - defaults = data.PlayerData; + return data; } catch(err) { - error(err.toString()+": parsing player defaults in "+filename); + error(err.toString()+": parsing JSON data in "+path); } - + + return undefined; +} + +// ==================================================================== + +// Load default player data, for when it's not otherwise specified +function initPlayerDefaults() +{ + var defaults = []; + + var data = parseJSONFromDataFile("player_defaults.json"); + if (!data || !data.PlayerData) + error("Failed to parse player defaults in player_defaults.json (check for valid JSON data)"); + else + defaults = data.PlayerData; + return defaults; } @@ -165,40 +179,60 @@ function initPlayerDefaults() // Load map size data function initMapSizes() { - var filename = "simulation/data/map_sizes.json"; var sizes = { - names: [], - tiles: [], - default: 0 + "names":[], + "tiles": [], + "default": 0 }; - var rawData = readFile(filename); - if (!rawData) - error("Failed to read map sizes file: "+filename); - - try - { // Catch nasty errors from JSON parsing - // TODO: Need more info from the parser on why it failed: line number, position, etc! - var data = JSON.parse(rawData); - if (!data || !data.Sizes) - error("Failed to parse map sizes in: "+filename+" (check for valid JSON data)"); - + + var data = parseJSONFromDataFile("map_sizes.json"); + if (!data || !data.Sizes) + error("Failed to parse map sizes in map_sizes.json (check for valid JSON data)"); + else + { for (var i = 0; i < data.Sizes.length; ++i) { sizes.names.push(data.Sizes[i].LongName); sizes.tiles.push(data.Sizes[i].Tiles); - + if (data.Sizes[i].Default) - sizes.default = i; + sizes["default"] = i; } } - catch(err) - { - error(err.toString()+": parsing map sizes in "+filename); - } - + return sizes; } +// ==================================================================== + +// Load game speed data +function initGameSpeeds() +{ + var gameSpeeds = { + "names": [], + "speeds": [], + "default": 0 + }; + + var data = parseJSONFromDataFile("game_speeds.json"); + if (!data || !data.Speeds) + error("Failed to parse game speeds in game_speeds.json (check for valid JSON data)"); + else + { + for (var i = 0; i < data.Speeds.length; ++i) + { + gameSpeeds.names.push(data.Speeds[i].Name); + gameSpeeds.speeds.push(data.Speeds[i].Speed); + + if (data.Speeds[i].Default) + gameSpeeds["default"] = i; + } + } + + return gameSpeeds; +} + + // ==================================================================== // Convert integer color values to string (for use in GUI objects) diff --git a/binaries/data/mods/public/gui/gamesetup/gamesetup.js b/binaries/data/mods/public/gui/gamesetup/gamesetup.js index 0140725a52..56534ce98d 100644 --- a/binaries/data/mods/public/gui/gamesetup/gamesetup.js +++ b/binaries/data/mods/public/gui/gamesetup/gamesetup.js @@ -36,6 +36,7 @@ var g_GameAttributes = { settings: {} }; +var g_GameSpeeds = {}; var g_MapSizes = {}; var g_AIs = []; @@ -97,7 +98,8 @@ function initMain() g_DefaultPlayerData.shift(); for (var i = 0; i < g_DefaultPlayerData.length; i++) g_DefaultPlayerData[i].Civ = "random"; - + + g_GameSpeeds = initGameSpeeds(); g_MapSizes = initMapSizes(); // Init civs @@ -135,6 +137,22 @@ function initMain() numPlayersSelection.list = players; numPlayersSelection.list_data = players; numPlayersSelection.selected = MAX_PLAYERS - 1; + + var gameSpeed = getGUIObjectByName("gameSpeed"); + gameSpeed.hidden = false; + getGUIObjectByName("gameSpeedText").hidden = true; + gameSpeed.list = g_GameSpeeds.names; + gameSpeed.list_data = g_GameSpeeds.speeds; + gameSpeed.onSelectionChange = function() + { + // Update attributes so other players can see change + if (this.selected != -1) + g_GameAttributes.gameSpeed = g_GameSpeeds.speeds[this.selected]; + + if (!g_IsInGuiUpdate) + updateGameAttributes(); + } + gameSpeed.selected = g_GameSpeeds["default"]; var populationCaps = getGUIObjectByName("populationCap"); populationCaps.list = POPULATION_CAP; @@ -245,7 +263,9 @@ function initMain() getGUIObjectByName("mapSelection").hidden = true; getGUIObjectByName("victoryConditionText").hidden = false; getGUIObjectByName("victoryCondition").hidden = true; - + getGUIObjectByName("gameSpeedText").hidden = false; + getGUIObjectByName("gameSpeed").hidden = true; + // Disable player and game options controls // TODO: Shouldn't players be able to choose their own assignment? for (var i = 0; i < MAX_PLAYERS; ++i) @@ -955,15 +975,19 @@ function onGameAttributesChange() var enableCheatsText = getGUIObjectByName("enableCheatsText"); var populationCapText = getGUIObjectByName("populationCapText"); var startingResourcesText = getGUIObjectByName("startingResourcesText"); - - var sizeIdx = (g_MapSizes.tiles.indexOf(mapSettings.Size) != -1 ? g_MapSizes.tiles.indexOf(mapSettings.Size) : g_MapSizes.default); + var gameSpeedText = getGUIObjectByName("gameSpeedText"); + + var sizeIdx = (g_MapSizes.tiles.indexOf(mapSettings.Size) != -1 ? g_MapSizes.tiles.indexOf(mapSettings.Size) : g_MapSizes["default"]); + var speedIdx = (g_GameAttributes.gameSpeed !== undefined && g_GameSpeeds.speeds.indexOf(g_GameAttributes.gameSpeed) != -1) ? g_GameSpeeds.speeds.indexOf(g_GameAttributes.gameSpeed) : g_GameSpeeds["default"]; var victoryIdx = (VICTORY_DATA.indexOf(mapSettings.GameType) != -1 ? VICTORY_DATA.indexOf(mapSettings.GameType) : VICTORY_DEFAULTIDX); enableCheats.checked = (g_GameAttributes.settings.CheatsEnabled === undefined || !g_GameAttributes.settings.CheatsEnabled ? false : true) enableCheatsText.caption = (enableCheats.checked ? "Yes" : "No"); + gameSpeedText.caption = g_GameSpeeds.names[speedIdx]; populationCap.selected = (POPULATION_CAP_DATA.indexOf(mapSettings.PopulationCap) != -1 ? POPULATION_CAP_DATA.indexOf(mapSettings.PopulationCap) : POPULATION_CAP_DEFAULTIDX); populationCapText.caption = POPULATION_CAP[populationCap.selected]; startingResources.selected = (STARTING_RESOURCES_DATA.indexOf(mapSettings.StartingResources) != -1 ? STARTING_RESOURCES_DATA.indexOf(mapSettings.StartingResources) : STARTING_RESOURCES_DEFAULTIDX); startingResourcesText.caption = STARTING_RESOURCES[startingResources.selected]; + // Handle map type specific logic switch (g_GameAttributes.mapType) { diff --git a/binaries/data/mods/public/gui/gamesetup/gamesetup.xml b/binaries/data/mods/public/gui/gamesetup/gamesetup.xml index 3b13670554..871123adb6 100644 --- a/binaries/data/mods/public/gui/gamesetup/gamesetup.xml +++ b/binaries/data/mods/public/gui/gamesetup/gamesetup.xml @@ -178,20 +178,28 @@ -