Ticket #4248: gamesetup_unassigned_player_fix_v2.patch

File gamesetup_unassigned_player_fix_v2.patch, 3.3 KB (added by elexis, 8 years ago)

Revert the persistance of playersettings in r18458, keeps the code simplification and removal of duplicate code. (Includes previous patch for easier testing).

  • binaries/data/mods/public/gui/gamesetup/gamesetup.js

    function sanitizePlayerData(playerData)  
    993993        playerData.shift();
    994994
    995995    playerData.forEach((pData, index) => {
    996996        pData.Color = pData.Color || g_PlayerColors[index];
    997997        pData.Civ = pData.Civ || "random";
    998         pData.AI = pData.AI || "";
     998
     999        // Use default AI if the map doesn't specify any explicitly
     1000        if (!("AI" in pData))
     1001            pData.AI = g_DefaultPlayerData[index].AI;
     1002
     1003        if (!("AIDiff" in pData))
     1004            pData.AIDiff = g_DefaultPlayerData[index].AIDiff;
    9991005    });
    10001006
    10011007    // Replace colors with the best matching color of PlayerDefaults
    10021008    if (g_GameAttributes.mapType != "scenario")
    10031009    {
    function onTick()  
    10731079}
    10741080
    10751081/**
    10761082 * Called when the map or the number of players changes.
    10771083 */
    1078 function resizePlayerData(targetPlayerData, maxPlayers)
     1084function unassignInvalidPlayers(maxPlayers)
    10791085{
    10801086    if (g_IsNetworked)
    10811087    {
    10821088        // Remove invalid playerIDs from the servers playerassignments copy
    10831089        for (let playerID = +maxPlayers + 1; playerID <= g_MaxPlayers; ++playerID)
    function resizePlayerData(targetPlayerDa  
    10891095            "local": {
    10901096                "name": singleplayerName(),
    10911097                "player": 1
    10921098            }
    10931099        };
    1094 
    1095     let pData = g_GameAttributes.settings.PlayerData;
    1096     return maxPlayers > pData.length ?
    1097         pData.concat(targetPlayerData.slice(pData.length, maxPlayers)) :
    1098         pData.slice(0, maxPlayers);
    10991100}
    11001101
    11011102/**
    11021103 * Called when the host choses the number of players on a random map.
    11031104 * @param {Number} num
    function resizePlayerData(targetPlayerDa  
    11051106function selectNumPlayers(num)
    11061107{
    11071108    if (g_IsInGuiUpdate || !g_IsController || g_GameAttributes.mapType != "random")
    11081109        return;
    11091110
    1110     g_GameAttributes.settings.PlayerData = resizePlayerData(g_DefaultPlayerData, num);
     1111    let pData = g_GameAttributes.settings.PlayerData;
     1112    g_GameAttributes.settings.PlayerData =
     1113        num > pData.length ?
     1114            pData.concat(g_DefaultPlayerData.slice(pData.length, num)) :
     1115            pData.slice(0, num);
     1116
     1117    unassignInvalidPlayers(num);
    11111118
    11121119    updateGameAttributes();
    11131120}
    11141121
    11151122/**
    function selectMap(name)  
    12161223    }
    12171224
    12181225    if (mapSettings.PlayerData)
    12191226        sanitizePlayerData(mapSettings.PlayerData);
    12201227
    1221     // Persist player data
    1222     if (g_GameAttributes.mapType == "skirmish")
    1223         mapSettings.PlayerData = resizePlayerData(mapSettings.PlayerData, mapSettings.PlayerData.length);
    1224 
    12251228    // Copy any new settings
    12261229    g_GameAttributes.map = name;
    12271230    g_GameAttributes.script = mapSettings.Script;
    12281231    if (g_GameAttributes.map !== "random")
    12291232        for (let prop in mapSettings)
    12301233            g_GameAttributes.settings[prop] = mapSettings[prop];
    12311234
    1232     // Use default AI if the map doesn't specify any explicitly
    1233     for (let i in g_GameAttributes.settings.PlayerData)
    1234     {
    1235         if (!('AI' in g_GameAttributes.settings.PlayerData[i]))
    1236             g_GameAttributes.settings.PlayerData[i].AI = g_DefaultPlayerData[i].AI;
    1237         if (!('AIDiff' in g_GameAttributes.settings.PlayerData[i]))
    1238             g_GameAttributes.settings.PlayerData[i].AIDiff = g_DefaultPlayerData[i].AIDiff;
    1239     }
     1235    unassignInvalidPlayers(g_GameAttributes.settings.PlayerData.length);
    12401236
    12411237    updateGameAttributes();
    12421238}
    12431239
    12441240function launchGame()