Ticket #3355: t3355_move_gametypes_v2.patch

File t3355_move_gametypes_v2.patch, 16.5 KB (added by elexis, 9 years ago)

Derives the name element from the filename and changes variable names to "victory conditions", as we might support having multiple of them simultaneously in the future.

  • binaries/data/mods/public/gui/common/settings.js

     
    3131{
    3232    var settings = {
    3333        "Ceasefire": loadCeasefire(),
    3434        "GameSpeeds": loadSettingValuesFile("game_speeds.json"),
    3535        "PopulationCapacities": loadPopulationCapacities(),
    36         "StartingResources": loadSettingValuesFile("starting_resources.json")
     36        "StartingResources": loadSettingValuesFile("starting_resources.json"),
     37        "VictoryConditions": loadVictoryConditions()
    3738    };
    3839
    3940    if (Object.keys(settings).some(key => settings[key] === undefined))
    4041        return undefined;
    4142
     
    8788            sprintf(translatePluralWithContext("ceasefire", "%(minutes)s minute", "%(minutes)s minutes", timeout), { "minutes": timeout })
    8889    }));
    8990}
    9091
    9192/**
     93 * Loads available gametypes.
     94 *
     95 * @returns {Array|undefined}
     96 */
     97function loadVictoryConditions()
     98{
     99    const subdir = "victory_conditions/"
     100
     101    const files = Engine.BuildDirEntList(g_SettingsDirectory + subdir, "*.json", false).map(
     102        file => file.substr(g_SettingsDirectory.length));
     103
     104    var victoryConditions = files.map(file => {
     105        let vc = loadSettingValuesFile(file);
     106        if (vc)
     107            vc.Name = file.substr(subdir.length, file.length - (subdir + ".json").length);
     108        return vc;
     109    });
     110
     111    if (victoryConditions.some(vc => vc == undefined))
     112        return undefined;
     113
     114    // TODO: We might support enabling victory conditions separately sometime.
     115    // Until then, we supplement the endless gametype here.
     116    victoryConditions.push({
     117        "Name": "endless",
     118        "Title": translate("None"),
     119        "Description": translate("Endless Game"),
     120        "Scripts": []
     121    });
     122
     123    return victoryConditions;
     124}
     125
     126/**
    92127 * Loads available population capacities.
    93128 *
    94129 * @returns {Array|undefined}
    95130 */
    96131function loadPopulationCapacities()
  • binaries/data/mods/public/gui/gamesetup/gamesetup.js

     
    11////////////////////////////////////////////////////////////////////////////////////////////////
    22// Constants
    33const DEFAULT_NETWORKED_MAP = "Acropolis 01";
    44const DEFAULT_OFFLINE_MAP = "Acropolis 01";
    55
    6 const VICTORY_DEFAULTIDX = 1;
    7 
    86const g_Ceasefire = prepareForDropdown(g_Settings ? g_Settings.Ceasefire : undefined);
    97const g_GameSpeeds = prepareForDropdown(g_Settings ? g_Settings.GameSpeeds.filter(speed => !speed.ReplayOnly) : undefined);
     8const g_VictoryConditions = prepareForDropdown(g_Settings ? g_Settings.VictoryConditions : undefined);
    109const g_PopulationCapacities = prepareForDropdown(g_Settings ? g_Settings.PopulationCapacities : undefined);
    1110const g_StartingResources = prepareForDropdown(g_Settings ? g_Settings.StartingResources : undefined);
    1211
    1312////////////////////////////////////////////////////////////////////////////////////////////////
    1413
     
    6463// To prevent the display locking up while we load the map metadata,
    6564// we'll start with a 'loading' message and switch to the main screen in the
    6665// tick handler
    6766var g_LoadingState = 0; // 0 = not started, 1 = loading, 2 = loaded
    6867
    69 // Filled by scripts in victory_conditions/
    70 var g_VictoryConditions = {};
    71 
    7268////////////////////////////////////////////////////////////////////////////////////////////////
    7369
    7470function init(attribs)
    7571{
    7672    if (!g_Settings)
     
    224220
    225221            updateGameAttributes();
    226222        }
    227223
    228224        var victoryConditions = Engine.GetGUIObjectByName("victoryCondition");
    229         var victories = getVictoryConditions();
    230         victoryConditions.list = victories.text;
    231         victoryConditions.list_data = victories.data;
     225        victoryConditions.list = g_VictoryConditions.Title;
     226        victoryConditions.list_data = g_VictoryConditions.Name;
    232227        victoryConditions.onSelectionChange = function() {
    233228            if (this.selected != -1)
    234229            {
    235                 g_GameAttributes.settings.GameType = victories.data[this.selected];
    236                 g_GameAttributes.settings.VictoryScripts = victories.scripts[this.selected];
     230                g_GameAttributes.settings.GameType = g_VictoryConditions.Name[this.selected];
     231                g_GameAttributes.settings.VictoryScripts = g_VictoryConditions.Scripts[this.selected];
    237232            }
    238233
    239234            updateGameAttributes();
    240235        };
    241         victoryConditions.selected = VICTORY_DEFAULTIDX;
     236        victoryConditions.selected = g_VictoryConditions.Default;
    242237
    243238        var mapSize = Engine.GetGUIObjectByName("mapSize");
    244239        mapSize.list = g_MapSizes.names;
    245240        mapSize.list_data = g_MapSizes.tiles;
    246241        mapSize.onSelectionChange = function() {
     
    12211216    var gameSpeedText = Engine.GetGUIObjectByName("gameSpeedText");
    12221217    var gameSpeedBox = Engine.GetGUIObjectByName("gameSpeed");
    12231218
    12241219    // We have to check for undefined on these properties as not all maps define them.
    12251220    var sizeIdx = (mapSettings.Size !== undefined && g_MapSizes.tiles.indexOf(mapSettings.Size) != -1 ? g_MapSizes.tiles.indexOf(mapSettings.Size) : g_MapSizes["default"]);
    1226     var victories = getVictoryConditions();
    1227     var victoryIdx = (mapSettings.GameType !== undefined && victories.data.indexOf(mapSettings.GameType) != -1 ? victories.data.indexOf(mapSettings.GameType) : VICTORY_DEFAULTIDX);
     1221    var victoryIdx = mapSettings.GameType !== undefined && g_VictoryConditions.Name.indexOf(mapSettings.GameType) != -1 ? g_VictoryConditions.Name.indexOf(mapSettings.GameType) : g_VictoryConditions.Default;
    12281222    enableCheats.checked = (mapSettings.CheatsEnabled === undefined || !mapSettings.CheatsEnabled ? false : true);
    12291223    enableCheatsText.caption = (enableCheats.checked ? translate("Yes") : translate("No"));
    12301224    if (mapSettings.RatingEnabled !== undefined)
    12311225    {
    12321226        enableRating.checked = mapSettings.RatingEnabled;
     
    12951289            numPlayersText.caption = numPlayers;
    12961290            mapSizeText.caption = g_MapSizes.names[sizeIdx];
    12971291            revealMapText.caption = (mapSettings.RevealMap ? translate("Yes") : translate("No"));
    12981292            exploreMapText.caption = (mapSettings.ExporeMap ? translate("Yes") : translate("No"));
    12991293            disableTreasuresText.caption = (mapSettings.DisableTreasures ? translate("Yes") : translate("No"));
    1300             victoryConditionText.caption = victories.text[victoryIdx];
     1294            victoryConditionText.caption = g_VictoryConditions.Title[victoryIdx];
    13011295            lockTeamsText.caption = (mapSettings.LockTeams ? translate("Yes") : translate("No"));
    13021296        }
    13031297
    13041298        break;
    13051299
     
    13341328        {
    13351329            // Client
    13361330            revealMapText.caption = (mapSettings.RevealMap ? translate("Yes") : translate("No"));
    13371331            exploreMapText.caption = (mapSettings.ExploreMap ? translate("Yes") : translate("No"));
    13381332            disableTreasuresText.caption = (mapSettings.DisableTreasures ? translate("Yes") : translate("No"));
    1339             victoryConditionText.caption = victories.text[victoryIdx];
     1333            victoryConditionText.caption = g_VictoryConditions.Title[victoryIdx];
    13401334            lockTeamsText.caption = (mapSettings.LockTeams ? translate("Yes") : translate("No"));
    13411335        }
    13421336
    13431337        break;
    13441338
     
    13701364        numPlayersText.caption = numPlayers;
    13711365        mapSizeText.caption = translate("Default");
    13721366        revealMapText.caption = (mapSettings.RevealMap ? translate("Yes") : translate("No"));
    13731367        exploreMapText.caption = (mapSettings.ExploreMap ? translate("Yes") : translate("No"));
    13741368        disableTreasuresText.caption = translate("No");
    1375         victoryConditionText.caption = victories.text[victoryIdx];
     1369        victoryConditionText.caption = g_VictoryConditions.Title[victoryIdx];
    13761370        lockTeamsText.caption = (mapSettings.LockTeams ? translate("Yes") : translate("No"));
    13771371
    13781372        startingResourcesText.caption = translate("Determined by scenario");
    13791373        populationCapText.caption = translate("Determined by scenario");
    13801374        ceasefireText.caption = translate("Determined by scenario");
     
    13981392    // Load the description from the map file, if there is one
    13991393    var description = mapSettings.Description ? translate(mapSettings.Description) : translate("Sorry, no description available.");
    14001394
    14011395    // Describe the number of players and the victory conditions
    14021396    var playerString = sprintf(translatePlural("%(number)s player. ", "%(number)s players. ", numPlayers), { "number": numPlayers });
    1403     let victory = translate(victories.text[victoryIdx]);
    1404     if (victoryIdx != VICTORY_DEFAULTIDX)
     1397    let victory = g_VictoryConditions.Title[victoryIdx];
     1398    if (victoryIdx != g_VictoryConditions.Default)
    14051399        victory = "[color=\"orange\"]" + victory + "[/color]";
    14061400    playerString += translate("Victory Condition:") + " " + victory + ".\n\n" + description;
    14071401
    14081402    for (let i = 0; i < g_MaxPlayers; ++i)
    14091403    {
     
    19891983        "tnbp": tnbp,
    19901984        "players": players
    19911985    };
    19921986    Engine.SendRegisterGame(gameData);
    19931987}
    1994 
    1995 function getVictoryConditions()
    1996 {
    1997     var r = {};
    1998     r.text = [translate("None")];
    1999     r.data = ["endless"];
    2000     r.scripts = [[]];
    2001     for (var vc in g_VictoryConditions)
    2002     {
    2003         r.data.push(vc);
    2004         r.text.push(g_VictoryConditions[vc].name);
    2005         r.scripts.push(g_VictoryConditions[vc].scripts);
    2006     }
    2007     return r;
    2008 }
  • binaries/data/mods/public/gui/gamesetup/gamesetup.xml

     
    99    <script file="gui/common/settings.js"/>
    1010
    1111    <!-- After settings.js, which defines g_Settings -->
    1212    <script file="gui/gamesetup/gamesetup.js"/>
    1313
    14     <!-- After gamesetup.js which defines g_VictoryConditions -->
    15     <script directory="gui/gamesetup/victory_conditions/"/>
    16 
    1714    <!-- Add a translucent black background to fade out the menu page -->
    1815    <object type="image" style="ModernWindow" size="0 0 100% 100%">
    1916
    2017        <object style="TitleText" type="text" size="50%-128 4 50%+128 36">
    2118            <translatableAttribute id="caption">Match Setup</translatableAttribute>
  • binaries/data/mods/public/gui/gamesetup/victory_conditions/conquest.js

     
    1 g_VictoryConditions.conquest = {
    2     "name" : translate("Conquest"),
    3     "description" : translate("Defeat all opponents"),
    4     "scripts" : ["scripts/ConquestCommon.js", "scripts/TriggerHelper.js", "scripts/Conquest.js"]
    5 };
  • binaries/data/mods/public/gui/gamesetup/victory_conditions/conquestStructures.js

     
    1 g_VictoryConditions.conquestStructure = {
    2     "name" : translate("Conquest Structures"),
    3     "description" : translate("Destroy all structures of enemies"),
    4     "scripts" : ["scripts/ConquestCommon.js", "scripts/TriggerHelper.js", "scripts/ConquestStructures.js"]
    5 };
  • binaries/data/mods/public/gui/gamesetup/victory_conditions/conquestUnits.js

     
    1 g_VictoryConditions.conquestUnits = {
    2     "name" : translate("Conquest Units"),
    3     "description" : translate("Destroy all units of enemies"),
    4     "scripts" : ["scripts/ConquestCommon.js", "scripts/TriggerHelper.js", "scripts/ConquestUnits.js"]
    5 };
  • binaries/data/mods/public/gui/gamesetup/victory_conditions/wonder.js

     
    1 g_VictoryConditions.wonder = {
    2     "name" : translate("Wonder"),
    3     "description" : translate("Build a wonder to win"),
    4     "scripts" : ["scripts/ConquestCommon.js", "scripts/TriggerHelper.js", "scripts/Conquest.js", "scripts/WonderVictory.js"]
    5 };
  • binaries/data/mods/public/l10n/messages.json

     
    471471                }
    472472            },
    473473            {
    474474                "extractor": "json",
    475475                "filemasks": [
     476                    "simulation/data/settings/victory_conditions/*.json"
     477                ],
     478                "options": {
     479                    "keywords": ["Title", "Description"]
     480                }
     481            },
     482            {
     483                "extractor": "json",
     484                "filemasks": [
    476485                    "simulation/data/settings/starting_resources.json"
    477486                ],
    478487                "options": {
    479488                    "keywords": ["Title"],
    480489                    "context": "startingResources"
  • binaries/data/mods/public/simulation/data/settings/victory_conditions/conquest.json

     
     1{
     2    "TranslatedKeys": ["Title", "Description"],
     3    "Data":
     4    {
     5        "Title": "Conquest",
     6        "Description": "Defeat all opponents",
     7        "Scripts":
     8        [
     9            "scripts/TriggerHelper.js",
     10            "scripts/ConquestCommon.js",
     11            "scripts/Conquest.js"
     12        ],
     13        "Default": true
     14    }
     15}
  • binaries/data/mods/public/simulation/data/settings/victory_conditions/conquest_structures.json

     
     1{
     2    "TranslatedKeys": ["Title", "Description"],
     3    "Data":
     4    {
     5        "Title": "Conquest Structures",
     6        "Description": "Destroy all structures of enemies",
     7        "Scripts":
     8        [
     9            "scripts/TriggerHelper.js",
     10            "scripts/ConquestCommon.js",
     11            "scripts/ConquestStructures.js"
     12        ]
     13    }
     14}
  • binaries/data/mods/public/simulation/data/settings/victory_conditions/conquest_units.json

     
     1{
     2    "TranslatedKeys": ["Title", "Description"],
     3    "Data":
     4    {
     5        "Title": "Conquest Units",
     6        "Description": "Kill all enemy units",
     7        "Scripts":
     8        [
     9            "scripts/TriggerHelper.js",
     10            "scripts/ConquestCommon.js",
     11            "scripts/ConquestUnits.js"
     12        ]
     13    }
     14}
  • binaries/data/mods/public/simulation/data/settings/victory_conditions/wonder.json

     
     1{
     2    "TranslatedKeys": ["Title", "Description"],
     3    "Data":
     4    {
     5        "Title": "Wonder",
     6        "Description": "Build and protect a wonder to win",
     7        "Scripts":
     8        [
     9            "scripts/TriggerHelper.js",
     10            "scripts/ConquestCommon.js",
     11            "scripts/Conquest.js",
     12            "scripts/WonderVictory.js"
     13        ]
     14    }
     15}
  • source/tools/atlas/AtlasUI/ScenarioEditor/Sections/Map/Map.cpp

     
    139139    sizer->Add(Tooltipped(new wxTextCtrl(this, ID_MapDescription, wxEmptyString, wxDefaultPosition, wxSize(-1, 100), wxTE_MULTILINE),
    140140            _("Short description used on the map selection screen")), wxSizerFlags().Expand());
    141141
    142142    sizer->AddSpacer(5);
    143143
     144    // TODO: load from binaries/data/mods/public/simulation/data/settings/victory_conditions/
    144145    wxArrayString gameTypes;
    145146    gameTypes.Add(_T("conquest"));
     147    gameTypes.Add(_T("conquestStructures"));
     148    gameTypes.Add(_T("conquestUnits"));
    146149    gameTypes.Add(_T("wonder"));
    147150    gameTypes.Add(_T("endless"));
    148151
    149152    wxFlexGridSizer* gridSizer = new wxFlexGridSizer(2, 5, 5);
    150153    gridSizer->AddGrowableCol(1);