Ticket #3431: t3431_sanitize_matchsettings_v1.patch

File t3431_sanitize_matchsettings_v1.patch, 4.8 KB (added by elexis, 9 years ago)

Sanitizes the deprecated matchsettings.

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

     
    11////////////////////////////////////////////////////////////////////////////////////////////////
    22// Constants
     3const g_MatchSettings_SP = "config/matchsettings.json";
     4const g_MatchSettings_MP = "config/matchsettings.mp.json";
     5
     6// TODO: these constants actually don't have an effect and that is not a scenario map, remove them
    37const DEFAULT_NETWORKED_MAP = "Acropolis 01";
    48const DEFAULT_OFFLINE_MAP = "Acropolis 01";
    59
    610const g_Ceasefire = prepareForDropdown(g_Settings ? g_Settings.Ceasefire : undefined);
    711const g_GameSpeeds = prepareForDropdown(g_Settings ? g_Settings.GameSpeeds.filter(speed => !speed.ReplayOnly) : undefined);
    function loadMapData(name)  
    677681    }
    678682
    679683    return g_MapData[name];
    680684}
    681685
    682 const FILEPATH_MATCHSETTINGS_SP = "config/matchsettings.json";
    683 const FILEPATH_MATCHSETTINGS_MP = "config/matchsettings.mp.json";
    684686function loadGameAttributes()
    685687{
    686688    if (Engine.ConfigDB_GetValue("user", "persistmatchsettings") != "true")
    687689        return;
    688690
    689     var settingsFile = g_IsNetworked ? FILEPATH_MATCHSETTINGS_MP : FILEPATH_MATCHSETTINGS_SP;
     691    var settingsFile = g_IsNetworked ? g_MatchSettings_MP : g_MatchSettings_SP;
    690692    if (!Engine.FileExists(settingsFile))
    691693        return;
    692694
    693695    var attrs = Engine.ReadJSONFile(settingsFile);
    694696    if (!attrs || !attrs.settings)
    function loadGameAttributes()  
    735737        // Set player data
    736738        if (playerData)
    737739            mapSettings.PlayerData = playerData;
    738740    }
    739741
     742    if (mapSettings.PlayerData)
     743        sanitizePlayerData(mapSettings.PlayerData);
     744
    740745    var mapFilterSelection = Engine.GetGUIObjectByName("mapFilterSelection");
    741746    mapFilterSelection.selected = mapFilterSelection.list_data.indexOf(attrs.mapFilter);
    742747
    743748    Engine.GetGUIObjectByName("mapTypeSelection").selected = g_MapTypes.Name.indexOf(attrs.mapType);
    744749
    function loadGameAttributes()  
    785790}
    786791
    787792function saveGameAttributes()
    788793{
    789794    var attributes = Engine.ConfigDB_GetValue("user", "persistmatchsettings") == "true" ? g_GameAttributes : {};
    790     Engine.WriteJSONFile(g_IsNetworked ? FILEPATH_MATCHSETTINGS_MP : FILEPATH_MATCHSETTINGS_SP, attributes);
     795    Engine.WriteJSONFile(g_IsNetworked ? g_MatchSettings_MP : g_MatchSettings_SP, attributes);
     796}
     797
     798function sanitizePlayerData(playerData)
     799{
     800    // Ignore gaia
     801    if (playerData.length && !playerData[0])
     802        playerData.shift();
     803
     804    // Set default color if no color present
     805    playerData.forEach((pData, index) => {
     806        if (pData && !pData.Color)
     807            pData.Color = g_PlayerColors[index];
     808    });
     809
     810    // Replace colors with the best matching color of PlayerDefaults
     811    playerData.forEach((pData, index) => {
     812        let colorDistances = g_PlayerColors.map(color => colorDistance(color, pData.Color));
     813        let smallestDistance = colorDistances.find(distance => colorDistances.every(distance2 => (distance2 >= distance)));
     814        pData.Color = g_PlayerColors.find(color => colorDistance(color, pData.Color) == smallestDistance);
     815    });
     816
     817    ensureUniquePlayerColors(playerData);
    791818}
     819
    792820////////////////////////////////////////////////////////////////////////////////////////////////
    793821// GUI event handlers
    794822
    795823function cancelSetup()
    796824{
    function selectMap(name)  
    10261054        let victoryIdx = mapSettings.GameType !== undefined && g_VictoryConditions.Name.indexOf(mapSettings.GameType) != -1 ? g_VictoryConditions.Name.indexOf(mapSettings.GameType) : g_VictoryConditions.Default;
    10271055        g_GameAttributes.settings.GameType = g_VictoryConditions.Name[victoryIdx];
    10281056        g_GameAttributes.settings.VictoryScripts = g_VictoryConditions.Scripts[victoryIdx];
    10291057    }
    10301058
    1031     // Sanitize player data
    10321059    if (mapSettings.PlayerData)
    1033     {
    1034         // Ignore gaia
    1035         if (mapSettings.PlayerData.length && !mapSettings.PlayerData[0])
    1036             mapSettings.PlayerData.shift();
    1037 
    1038         // Set default color if no color present
    1039         mapSettings.PlayerData.forEach((pData, index) => {
    1040             if (pData && !pData.Color)
    1041                 pData.Color = g_PlayerColors[index];
    1042         });
    1043 
    1044         // Replace colors with the best matching color of PlayerDefaults
    1045         mapSettings.PlayerData.forEach((pData, index) => {
    1046             let colorDistances = g_PlayerColors.map(color => colorDistance(color, pData.Color));
    1047             let smallestDistance = colorDistances.find(distance => colorDistances.every(distance2 => (distance2 >= distance)));
    1048             pData.Color = g_PlayerColors.find(color => colorDistance(color, pData.Color) == smallestDistance);
    1049         });
    1050        
    1051         ensureUniquePlayerColors(mapSettings.PlayerData);
    1052     }
     1060        sanitizePlayerData(mapSettings.PlayerData);
    10531061
    10541062    // Copy any new settings
    10551063    g_GameAttributes.map = name;
    10561064    g_GameAttributes.script = mapSettings.Script;
    10571065    if (g_GameAttributes.map !== "random")