Ticket #3355: t3355_move_player_limit_v1.patch

File t3355_move_player_limit_v1.patch, 20.9 KB (added by elexis, 9 years ago)

Moves "MaxPlayers": 8 and MaxTeams": 4 and creates the settings.js file needed for all further patches.

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

     
     1// Used by lobby, gamesetup, session, and replay GUI
     2const g_Settings = loadAvailableSettings();
     3
     4function loadAvailableSettings()
     5{
     6    const rootDir = "simulation/data/settings/";
     7
     8    // Load Player Limits
     9    let settings = Engine.ReadJSONFile(rootDir + "player_limit.json");
     10    if (!settings)
     11        return false;
     12
     13    return settings;
     14}
     15
     16// Shows a message box and calls a function if the setting files couldn't be parsed
     17function validSettings(callback)
     18{
     19    if (!g_Settings && callback !== undefined)
     20        messageBox(400, 200, translate("Can't load game settings!"), translate("ERROR!"), 0, [translate("OK")], [callback]);
     21
     22    return Boolean(g_Settings);
     23}
  • binaries/data/mods/public/gui/gamesetup/gamesetup.js

     
    1616const STARTING_RESOURCES_DEFAULTIDX = 1;
    1717// Translation: Ceasefire.
    1818const CEASEFIRE = [translateWithContext("ceasefire", "No ceasefire"), translateWithContext("ceasefire", "5 minutes"), translateWithContext("ceasefire", "10 minutes"), translateWithContext("ceasefire", "15 minutes"), translateWithContext("ceasefire", "20 minutes"), translateWithContext("ceasefire", "30 minutes"), translateWithContext("ceasefire", "45 minutes"), translateWithContext("ceasefire", "60 minutes")];
    1919const CEASEFIRE_DATA = [0, 5, 10, 15, 20, 30, 45, 60];
    2020const CEASEFIRE_DEFAULTIDX = 0;
    21 // Max number of players for any map
    22 const MAX_PLAYERS = 8;
    2321
    2422////////////////////////////////////////////////////////////////////////////////////////////////
    2523
    2624// Is this is a networked game, or offline
    2725var g_IsNetworked;
     
    115113}
    116114
    117115// Called after the map data is loaded and cached
    118116function initMain()
    119117{
     118    if (!validSettings(cancelAndReturn))
     119        return;
     120
    120121    // Load AI list
    121122    g_AIs = Engine.GetAIs();
    122123
    123124    // Sort AIs by displayed name
    124125    g_AIs.sort(function (a, b) {
     
    164165        // for the lobby.
    165166        g_GameAttributes.matchID = Engine.GetMatchID();
    166167
    167168        initMapNameList();
    168169
    169         var numPlayersSelection = Engine.GetGUIObjectByName("numPlayersSelection");
    170         var players = [];
    171         for (var i = 1; i <= MAX_PLAYERS; ++i)
    172             players.push(i);
    173         numPlayersSelection.list = players;
    174         numPlayersSelection.list_data = players;
    175         numPlayersSelection.selected = MAX_PLAYERS - 1;
     170        let playersArray = Array(g_Settings.MaxPlayers).fill(0).map((v, i) => i + 1); // 1, 2, ..., MaxPlayers
     171        let numPlayersSelection = Engine.GetGUIObjectByName("numPlayersSelection");
     172        numPlayersSelection.list = playersArray;
     173        numPlayersSelection.list_data = playersArray;
     174        numPlayersSelection.selected = g_Settings.MaxPlayers - 1;
    176175
    177176        var gameSpeed = Engine.GetGUIObjectByName("gameSpeed");
    178177        gameSpeed.hidden = false;
    179178        Engine.GetGUIObjectByName("gameSpeedText").hidden = true;
    180179        gameSpeed.list = g_GameSpeeds.names;
     
    292291        Engine.GetGUIObjectByName("gameSpeedText").hidden = false;
    293292        Engine.GetGUIObjectByName("gameSpeed").hidden = true;
    294293
    295294        // Disable player and game options controls
    296295        // TODO: Shouldn't players be able to choose their own assignment?
    297         for (var i = 0; i < MAX_PLAYERS; ++i)
     296        for (let i = 0; i < g_Settings.MaxPlayers; ++i)
    298297        {
    299298            Engine.GetGUIObjectByName("playerAssignment["+i+"]").hidden = true;
    300299            Engine.GetGUIObjectByName("playerCiv["+i+"]").hidden = true;
    301300            Engine.GetGUIObjectByName("playerTeam["+i+"]").hidden = true;
    302301        }
     
    339338        }
    340339    }
    341340
    342341    // Settings for all possible player slots
    343342    var boxSpacing = 32;
    344     for (var i = 0; i < MAX_PLAYERS; ++i)
     343    for (let i = 0; i < g_Settings.MaxPlayers; ++i)
    345344    {
    346345        // Space player boxes
    347346        var box = Engine.GetGUIObjectByName("playerBox["+i+"]");
    348347        var boxSize = box.size;
    349348        var h = boxSize.bottom - boxSize.top;
    350349        boxSize.top = i * boxSpacing;
    351350        boxSize.bottom = i * boxSpacing + h;
    352351        box.size = boxSize;
    353352
    354353        // Populate team dropdowns
    355         var team = Engine.GetGUIObjectByName("playerTeam["+i+"]");
    356         team.list = [translateWithContext("team", "None"), "1", "2", "3", "4"];
    357         team.list_data = [-1, 0, 1, 2, 3];
     354        let team = Engine.GetGUIObjectByName("playerTeam["+i+"]");
     355        let teamsArray = Array(g_Settings.MaxTeams).fill(0).map((v, i) => i + 1); // 1, 2, ... MaxTeams
     356        team.list = [translateWithContext("team", "None")].concat(teamsArray); // "None", 1, 2, ..., maxTeams
     357        team.list_data = [-1].concat(teamsArray.map(player => player - 1)); // -1, 0, ..., (maxTeams-1)
    358358        team.selected = 0;
    359359
    360360        let playerSlot = i; // declare for inner function use
    361361        team.onSelectionChange = function() {
    362362            if (this.selected != -1)
     
    398398    }
    399399}
    400400
    401401function handleNetMessage(message)
    402402{
     403    if (!validSettings())
     404        return;
     405
    403406    log("Net message: "+uneval(message));
    404407
    405408    switch (message.type)
    406409    {
    407410    case "netstatus":
     
    571574    //  Add random civ to beginning of list
    572575    civListNames.unshift('[color="orange"]' + translateWithContext("civilization", "Random") + '[/color]');
    573576    civListCodes.unshift("random");
    574577
    575578    // Update the dropdowns
    576     for (var i = 0; i < MAX_PLAYERS; ++i)
     579    for (let i = 0; i < g_Settings.MaxPlayers; ++i)
    577580    {
    578581        var civ = Engine.GetGUIObjectByName("playerCiv["+i+"]");
    579582        civ.list = civListNames;
    580583        civ.list_data = civListCodes;
    581584        civ.selected = 0;
     
    787790    Engine.WriteJSONFile(g_IsNetworked ? FILEPATH_MATCHSETTINGS_MP : FILEPATH_MATCHSETTINGS_SP, attributes);
    788791}
    789792////////////////////////////////////////////////////////////////////////////////////////////////
    790793// GUI event handlers
    791794
     795function cancelAndReturn()
     796{
     797    cancelSetup();
     798    Engine.SwitchGuiPage(Engine.HasXmppClient() ? "page_lobby.xml" : "page_pregame.xml");
     799}
     800
    792801function cancelSetup()
    793802{
    794803    if (g_IsController)
    795804        saveGameAttributes();
    796805
     
    10081017
    10091018        for (var guid in g_PlayerAssignments)
    10101019        {   // Unassign extra players
    10111020            var player = g_PlayerAssignments[guid].player;
    10121021
    1013             if (player <= MAX_PLAYERS && player > numPlayers)
     1022            if (player <= g_Settings.MaxPlayers && player > numPlayers)
    10141023                Engine.AssignNetworkPlayer(player, "");
    10151024        }
    10161025    }
    10171026
    10181027    updateGameAttributes();
     
    11331142
    11341143////////////////////////////////////////////////////////////////////////////////////////////////
    11351144
    11361145function onGameAttributesChange()
    11371146{
     1147    if (!validSettings())
     1148        return;
     1149
    11381150    g_IsInGuiUpdate = true;
    11391151
    11401152    // Don't set any attributes here, just show the changes in GUI
    11411153
    11421154    var mapName = g_GameAttributes.map || "";
    11431155    var mapSettings = g_GameAttributes.settings;
    1144     var numPlayers = (mapSettings.PlayerData ? mapSettings.PlayerData.length : MAX_PLAYERS);
     1156    var numPlayers = mapSettings.PlayerData ? mapSettings.PlayerData.length : g_Settings.MaxPlayers;
    11451157
    11461158    // Update some controls for clients
    11471159    if (!g_IsController)
    11481160    {
    11491161        var mapFilterSelection = Engine.GetGUIObjectByName("mapFilterSelection");
     
    13821394    let victory = translate(victories.text[victoryIdx]);
    13831395    if (victoryIdx != VICTORY_DEFAULTIDX)
    13841396        victory = "[color=\"orange\"]" + victory + "[/color]";
    13851397    playerString += translate("Victory Condition:") + " " + victory + ".\n\n" + description;
    13861398
    1387     for (var i = 0; i < MAX_PLAYERS; ++i)
     1399    for (let i = 0; i < g_Settings.MaxPlayers; ++i)
    13881400    {
    13891401        // Show only needed player slots
    13901402        Engine.GetGUIObjectByName("playerBox["+i+"]").hidden = (i >= numPlayers);
    13911403
    13921404        // Show player data or defaults as necessary
     
    15191531    {
    15201532        if (ai.data.hidden)
    15211533        {
    15221534            // If the map uses a hidden AI then don't hide it
    15231535            var usedByMap = false;
    1524             for (var i = 0; i < MAX_PLAYERS; ++i)
     1536            for (let i = 0; i < g_Settings.MaxPlayers; ++i)
    15251537                if (i < g_GameAttributes.settings.PlayerData.length &&
    15261538                    g_GameAttributes.settings.PlayerData[i].AI == ai.id)
    15271539                {
    15281540                    usedByMap = true;
    15291541                    break;
     
    15401552
    15411553    noAssignment = hostNameList.length;
    15421554    hostNameList.push("[color=\"140 140 140 255\"]" + translate("Unassigned"));
    15431555    hostGuidList.push("");
    15441556
    1545     for (var i = 0; i < MAX_PLAYERS; ++i)
     1557    for (let i = 0; i < g_Settings.MaxPlayers; ++i)
    15461558    {
    15471559        let playerSlot = i;
    15481560        let playerID = i+1; // we don't show Gaia, so first slot is ID 1
    15491561
    15501562        var selection = assignments[playerID];
     
    17841796
    17851797function updateReadyUI()
    17861798{
    17871799    if (!g_IsNetworked)
    17881800        return; // Disabled for single-player games.
    1789     var isAI = new Array(MAX_PLAYERS + 1);
     1801    var isAI = new Array(g_Settings.MaxPlayers + 1);
    17901802    for (var i = 0; i < isAI.length; ++i)
    17911803        isAI[i] = true;
    17921804    var allReady = true;
    17931805    for (var guid in g_PlayerAssignments)
    17941806    {
     
    18051817            Engine.GetGUIObjectByName("playerName[" + (g_PlayerAssignments[guid].player - 1) + "]").caption = translate(getSetting(pData, pDefs, "Name"));
    18061818            allReady = false;
    18071819        }
    18081820    }
    18091821    // AIs are always ready.
    1810     for (var playerid = 0; playerid < MAX_PLAYERS; ++playerid)
    1811     {       
     1822    for (let playerid = 0; playerid < g_Settings.MaxPlayers; ++playerid)
     1823    {
    18121824        if (!g_GameAttributes.settings.PlayerData[playerid])
    18131825            continue;
    18141826        var pData = g_GameAttributes.settings.PlayerData ? g_GameAttributes.settings.PlayerData[playerid] : {};
    18151827        var pDefs = g_DefaultPlayerData ? g_DefaultPlayerData[playerid] : {};
    18161828        if (isAI[playerid + 1])
  • binaries/data/mods/public/gui/gamesetup/gamesetup.xml

     
    11<?xml version="1.0" encoding="utf-8"?>
    22
    33<objects>
    44
    5     <script file="gui/common/network.js"/>
    65    <script file="gui/common/functions_civinfo.js"/>
    76    <script file="gui/common/functions_global_object.js"/>
    87    <script file="gui/common/functions_utility.js"/>
     8    <script file="gui/common/network.js"/>
     9    <script file="gui/common/settings.js"/>
    910    <script file="gui/gamesetup/gamesetup.js"/>
    1011    <!-- After gamesetup.js which defines g_VictoryConditions -->
    1112    <script directory="gui/gamesetup/victory_conditions/"/>
    1213
    1314    <!-- Add a translucent black background to fade out the menu page -->
     
    237238                style="StoneButton"
    238239                size="100%-308 100%-52 100%-168 100%-24"
    239240                tooltip_style="onscreenToolTip"
    240241            >
    241242                <translatableAttribute id="caption">Back</translatableAttribute>
    242                 <action on="Press">
    243                     <![CDATA[
    244                         cancelSetup();
    245                         if(!Engine.HasXmppClient())
    246                             Engine.SwitchGuiPage("page_pregame.xml");
    247                         else
    248                             Engine.SwitchGuiPage("page_lobby.xml");
    249                     ]]>
    250                 </action>
     243                <action on="Press">cancelAndReturn();</action>
    251244            </object>
    252245
    253246            <!-- Options -->
    254247            <object name="gameOptionsBox" size="100%-425 529 100%-25 525">
    255248                <!-- More Options Button -->
  • binaries/data/mods/public/gui/lobby/lobby.js

     
    2020
    2121////////////////////////////////////////////////////////////////////////////////////////////////
    2222
    2323function init(attribs)
    2424{
     25    if (!validSettings(returnToMainMenu))
     26        return;
     27
    2528    // Play menu music
    2629    initMusic();
    2730    global.music.setState(global.music.states.MENU);
    2831
    2932    g_Name = Engine.LobbyGetNick();
     
    3437
    3538    var mapSizeFilter = Engine.GetGUIObjectByName("mapSizeFilter");
    3639    mapSizeFilter.list = g_mapSizes.shortNames;
    3740    mapSizeFilter.list_data = g_mapSizes.tiles;
    3841
     42    // Setup number-of-players filter
     43    var playersArray = Array(g_Settings.MaxPlayers).fill(0).map((v, i) => i + 1); // 1, 2, ... MaxPlayers
    3944    var playersNumberFilter = Engine.GetGUIObjectByName("playersNumberFilter");
    40     playersNumberFilter.list = [translateWithContext("player number", "Any"),2,3,4,5,6,7,8];
    41     playersNumberFilter.list_data = ["",2,3,4,5,6,7,8];
     45    playersNumberFilter.list = [translateWithContext("player number", "Any")].concat(playersArray);
     46    playersNumberFilter.list_data = [""].concat(playersArray);
    4247
    4348    var mapTypeFilter = Engine.GetGUIObjectByName("mapTypeFilter");
    4449    mapTypeFilter.list = [translateWithContext("map", "Any")].concat(g_mapTypesText);
    4550    mapTypeFilter.list_data = [""].concat(g_mapTypes);
    4651
     
    859864        break;
    860865    case "ban": // TODO: Split reason from nick and pass it too, for now just support "/ban nick"
    861866        Engine.LobbyBan(nick, "");
    862867        break;
    863868    case "quit":
    864         lobbyStop();
    865         Engine.SwitchGuiPage("page_pregame.xml");
     869        returnToMainMenu();
    866870        break;
    867871    case "say":
    868872    case "me":
    869873        return false;
    870874    default:
     
    10881092        }
    10891093    }
    10901094
    10911095}
    10921096
     1097function returnToMainMenu()
     1098{
     1099    lobbyStop();
     1100    Engine.SwitchGuiPage("page_pregame.xml");
     1101}
     1102
    10931103/* Utilities */
    10941104// Generate a (mostly) unique color for this player based on their name.
    10951105// See http://stackoverflow.com/questions/3426404/create-a-hexadecimal-colour-based-on-a-string-with-jquery-javascript
    10961106function getPlayerColor(playername)
    10971107{
  • binaries/data/mods/public/gui/lobby/lobby.xml

     
    11<?xml version="1.0" encoding="utf-8"?>
    22
    33<objects>
    44    <script file="gui/common/functions_global_object.js"/>
    55    <script file="gui/common/functions_utility.js"/>
    6     <script file="gui/common/timer.js"/>
    76    <script file="gui/common/music.js"/>
     7    <script file="gui/common/settings.js"/>
     8    <script file="gui/common/timer.js"/>
    89
    910    <script file="gui/lobby/lobby.js"/>
    1011
    1112    <object type="image" style="ModernWindow" size="0 0 100% 100%" name="lobbyWindow">
    1213
     
    161162                </action>
    162163            </object>
    163164
    164165            <object type="button" style="ModernButtonRed" size="0 100%-25 100% 100%">
    165166                <translatableAttribute id="caption">Main Menu</translatableAttribute>
    166                 <action on="Press">
    167                     lobbyStop();
    168                     Engine.SwitchGuiPage("page_pregame.xml");
    169                 </action>
     167                <action on="Press">returnToMainMenu();</action>
    170168            </object>
    171169        </object>
    172170
    173171        <!-- Middle panel: Filters, game list, chat box. -->
    174172        <object name="middlePanel" size="20%+5 5% 100%-255 97.2%">
  • binaries/data/mods/public/gui/session/session.js

     
    142142    }
    143143
    144144    return g_TechnologyData[technologyName];
    145145}
    146146
    147 // Init
    148147function init(initData, hotloadData)
    149148{
     149    if (!validSettings(() => { leaveGame(true); }))
     150        return;
     151
    150152    if (initData)
    151153    {
    152154        g_IsNetworked = initData.isNetworked; // Set network mode
    153155        g_IsController = initData.isController; // Set controller mode
    154156        g_PlayerAssignments = initData.playerAssignments;
     
    398400/**
    399401 * Called every frame.
    400402 */
    401403function onTick()
    402404{
     405    if (!validSettings())
     406        return;
     407
    403408    var now = new Date;
    404409    var tickLength = new Date - lastTickTime;
    405410    lastTickTime = now;
    406411
    407412    checkPlayerState();
  • binaries/data/mods/public/gui/session/session.xml

     
    66<script file="gui/common/functions_civinfo.js"/>
    77<script file="gui/common/functions_global_object.js"/>
    88<script file="gui/common/functions_utility.js"/>
    99<script file="gui/common/l10n.js"/>
    1010<script file="gui/common/music.js"/>
     11<script file="gui/common/settings.js"/>
    1112<script file="gui/common/timer.js"/>
    1213<script file="gui/common/tooltips.js"/>
    1314<!-- load all scripts in this directory -->
    1415<script directory="gui/session/"/>
    1516
  • binaries/data/mods/public/gui/summary/layout.js

     
    147147{
    148148    for (var h = 0; h < MAX_HEADINGTITLE; ++h)
    149149    {
    150150        Engine.GetGUIObjectByName("titleHeading["+ h +"]").hidden = true;
    151151        Engine.GetGUIObjectByName("Heading[" + h + "]").hidden = true;
    152         for (var p = 0; p < MAX_SLOTS; ++p)
     152        for (let p = 0; p < g_Settings.MaxPlayers; ++p)
    153153        {
    154154            Engine.GetGUIObjectByName("valueData[" + p + "][" + h + "]").hidden = true;
    155             for (var t = 0; t < MAX_TEAMS; ++t)
     155            for (let t = 0; t < g_Settings.MaxTeams; ++t)
    156156            {
    157157                Engine.GetGUIObjectByName("valueDataTeam[" + t + "][" + p + "][" + h + "]").hidden = true;
    158158                Engine.GetGUIObjectByName("valueDataTeam[" + t + "][" + h + "]").hidden = true;
    159159            }
    160160        }
     
    203203
    204204function updateGeneralPanelCounter(counters)
    205205{
    206206    var rowPlayerObjectWidth = 0;
    207207    var left = 0;
    208     for (var p = 0; p < MAX_SLOTS; ++p)
     208    for (let p = 0; p < g_Settings.MaxPlayers; ++p)
    209209    {
    210210        left = 240;
    211211        var counterObject;
    212212        for (var w in counters)
    213213        {
     
    218218        }
    219219        if (rowPlayerObjectWidth == 0)
    220220            rowPlayerObjectWidth = left;
    221221
    222222        var counterTotalObject;
    223         for (var t = 0; t < MAX_TEAMS; ++t)
     223        for (let t = 0; t < g_Settings.MaxTeams; ++t)
    224224        {
    225225            left = 240;
    226226            for (var w in counters)
    227227            {
    228228                counterObject = Engine.GetGUIObjectByName("valueDataTeam[" + t + "][" + p + "][" + w + "]");
     
    278278        Engine.GetGUIObjectByName("playerNameHeading").caption = "";
    279279}
    280280
    281281function updateObjectPlayerPosition()
    282282{
    283     for (var h = 0; h < MAX_SLOTS; ++h)
     283    for (let h = 0; h < g_Settings.MaxPlayers; ++h)
    284284    {
    285285        var playerBox = Engine.GetGUIObjectByName("playerBox[" + h + "]");
    286286        var boxSize = playerBox.size;
    287287        boxSize.top += h * (PLAYER_BOX_Y_SIZE + PLAYER_BOX_GAP);
    288288        boxSize.bottom = boxSize.top + PLAYER_BOX_Y_SIZE;
    289289        playerBox.size = boxSize;
    290290
    291         for (var i = 0; i < MAX_TEAMS; ++i)
     291        for (let i = 0; i < g_Settings.MaxTeams; ++i)
    292292        {
    293293            var playerBoxt = Engine.GetGUIObjectByName("playerBoxt[" + i + "][" + h + "]");
    294294            boxSize = playerBoxt.size;
    295295            boxSize.top += h * (PLAYER_BOX_Y_SIZE + PLAYER_BOX_GAP);
    296296            boxSize.bottom = boxSize.top + PLAYER_BOX_Y_SIZE;
  • binaries/data/mods/public/gui/summary/summary.js

     
    1 // Max player slots for any map (TODO: should read from config)
    2 const MAX_SLOTS = 8;
    3 const MAX_TEAMS = 4;
    41const MAX_HEADINGTITLE = 8;
    52
    63// const for filtering long collective headings
    74const LONG_HEADING_WIDTH = 250;
    85// Vertical size of player box
     
    4340 * Select active panel
    4441 * @param panelNumber Number of panel, which should get active state (integer)
    4542 */
    4643function selectPanel(panelNumber)
    4744{
     45    if (!validSettings())
     46        return;
     47
    4848    var panelNames = [ 'scorePanel', 'buildingsPanel', 'unitsPanel', 'resourcesPanel', 'marketPanel', 'miscPanel'];
    4949
    5050    function adjustTabDividers(tabSize)
    5151    {
    5252        var leftSpacer = Engine.GetGUIObjectByName("tabDividerLeft");
     
    130130        teamCounterFn(panelInfo.counters);
    131131}
    132132
    133133function init(data)
    134134{
     135    if (!validSettings())
     136        return;
     137
    135138    updateObjectPlayerPosition();
    136139    g_GameData = data;
    137140
    138141    // Map
    139142    var mapDisplayType = translate("Scenario");
  • binaries/data/mods/public/gui/summary/summary.xml

     
    88
    99<objects>
    1010    <script file="gui/common/functions_global_object.js"/>
    1111    <script file="gui/common/functions_civinfo.js"/>
    1212    <script file="gui/common/functions_utility.js"/>
     13    <script file="gui/common/settings.js"/>
    1314    <script file="gui/summary/counters.js"/>
    1415    <script file="gui/summary/layout.js"/>
    1516    <script file="gui/summary/summary.js"/>
    1617
    1718    <object type="image"
  • binaries/data/mods/public/simulation/data/settings/player_limit.json

     
     1{
     2    "MaxPlayers": 8,
     3    "MaxTeams": 4
     4}
  • source/tools/atlas/AtlasUI/ScenarioEditor/Sections/Player/Player.cpp

     
    517517            POST_MESSAGE(LoadPlayerSettings, (true));
    518518            m_MapSettings.NotifyObservers();
    519519        }
    520520    }
    521521
    522     // TODO: we shouldn't hardcode this, but instead dynamically create
    523     //  new player notebook pages on demand; of course the default data
    524     //  will be limited by the entries in player_defaults.json
     522    // TODO: Load value from player_limit.json
    525523    static const size_t MAX_NUM_PLAYERS = 8;
    526524
    527525    bool m_InGUIUpdate;
    528526    AtObj m_PlayerDefaults;
    529527    PlayerNotebook* m_Players;