Ticket #1580: 1580.diff

File 1580.diff, 11.1 KB (added by Stan, 9 years ago)

WIP patch, it's currently broken for some reason, help is appreciated. I can't get the drop down to appear

  • gui/common/settings.js

     
    3232    var settings = {};
    3333
    3434    settings.Ceasefire = loadCeasefire();
     35    settings.Player_Colors =  loadPlayerColors();
    3536    if (!settings.Ceasefire)
    3637        return undefined;
    3738
     
    6263}
    6364
    6465/**
     66 * Loads available colors settings.
     67 *
     68 * @returns {Array|undefined}
     69 */
     70function loadPlayerColors()
     71{
     72    var json = Engine.ReadJSONFile("simulation/data/player_defaults.json");
     73
     74    if (!json || !json.PlayerData || !Array.isArray(json.PlayerData))
     75    {
     76        error("Could not load player_defaults.json");
     77        return undefined;
     78    }
     79   
     80    return json.PlayerData.map(player => player.Color);
     81}
     82
     83/**
    6584 * Creates an object with all values of that property of the given setting and
    6685 * finds the index of the default value.
    6786 *
  • gui/gamesetup/gamesetup.js

     
    1616const STARTING_RESOURCES_DEFAULTIDX = 1;
    1717
    1818const g_Ceasefire = prepareForDropdown(g_Settings ? g_Settings.Ceasefire : undefined);
     19const g_PlayerColors = prepareForDropdown(g_Settings ? g_Settings.Player_Colors : undefined);
    1920
    2021////////////////////////////////////////////////////////////////////////////////////////////////
    2122
     
    6061
    6162var g_ChatMessages = [];
    6263
     64var g_PlayerColorsSorted = [];
     65var g_PlayerColorIdsSorted = [];
     66var g_PlayerColorDisplayNamesSorted = [];
    6367// Data caches
    6468var g_MapData = {};
    6569var g_CivData = {};
     
    389393            updateGameAttributes();
    390394        };
    391395
     396        // Populate color drop-down lists.
     397        var colorPicker = Engine.GetGUIObjectByName("playerColorPicker["+i+"]");
     398        colorPicker.list = getPlayerColorLabelsSorted();
     399        colorPicker.list_data = getPlayerColorIdsSorted();
     400        colorPicker.selected = -1;
     401        colorPicker.onSelectionChange = function()
     402        {       // Update color
     403            if (this.selected !== -1)
     404            {
     405                var numPlayers = g_GameAttributes.settings.PlayerData.length;
     406                var used = 0;
     407                var playerColorsSorted = getPlayerColorsSorted();
     408                for (var o = 0; o < numPlayers; o++)
     409                {
     410                    if (rgbValuesMatch(playerColorsSorted[this.list_data[this.selected]], g_GameAttributes.settings.PlayerData[o].Color))
     411                    {
     412                        ++used;
     413                        break;
     414                    }
     415                }
     416                if (!used)
     417                {
     418                    copyRgbValuesFromColorIntoColor(playerColorsSorted[this.list_data[this.selected]], g_GameAttributes.settings.PlayerData[playerSlot].Color);
     419                }
     420            }
     421            if (!g_IsInGuiUpdate)
     422            {
     423                updateGameAttributes();
     424            }
     425        };
     426
    392427        // Set events
    393428        var civ = Engine.GetGUIObjectByName("playerCiv["+i+"]");
    394429        civ.onSelectionChange = function() {
     
    421456        updateGameAttributes();
    422457    }
    423458}
     459// Returns the index of the specified color.
     460function getIndexOfColor(color)
     461{
     462    for (var i = 0; i < g_PlayerColors.length; ++i)
     463    {
     464        var playerColorsSorted = getPlayerColorsSorted();
     465        if (rgbValuesMatch(playerColorsSorted[i], color))
     466        {
     467            return i;
     468        }
     469    }
     470    return -1;
     471}
    424472
     473function rgbToHsl(color){
     474        var r = color.r/255, g = color.g/255, b = color.b/255;
     475        var max = Math.max(r, g, b), min = Math.min(r, g, b);
     476        var h, s, l = (max + min) / 2;
     477        if (max === min)
     478        {
     479                h = s = 0; // achromatic
     480        }
     481        else
     482        {
     483                var d = max - min;
     484                s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
     485                switch(max)
     486                {
     487                        case r: h = (g - b) / d + (g < b ? 6 : 0); break;
     488                        case g: h = (b - r) / d + 2; break;
     489                        case b: h = (r - g) / d + 4; break;
     490                }
     491                h /= 6;
     492        }
     493        return new Array(h * 360, s * 100, l * 100);
     494}
     495
     496// Get list of player colors sorted by color value.
     497// See http://stackoverflow.com/a/11923973/939364
     498function getPlayerColorsSorted()
     499{
     500    if (g_PlayerColorsSorted.length === 0)
     501    {
     502        var hslArray = new Array();
     503        for (var i = 0; i < g_PlayerColors.length; ++i)
     504        {
     505            //Transforming rgb to hsl
     506            //`hslArray[i][1]` (`i`) is a reference to the rgb color, in order to retrieve it later
     507            hslArray[i] = [rgbToHsl(g_PlayerColors[i]),i];
     508        }
     509
     510        var sortedHslArray = new Array();
     511        outerloop:
     512        for (var i = 0; i < hslArray.length; ++i)
     513        {
     514            for (var j = 0; j < sortedHslArray.length; ++j)
     515            {
     516                if (sortedHslArray[j][0][0] > hslArray[i][0][0])
     517                {
     518                    sortedHslArray.splice(j, 0, hslArray[i]);
     519                    continue outerloop;
     520                }
     521            }
     522            sortedHslArray.push(hslArray[i]);
     523        }
     524
     525        for (var i = 0; i < sortedHslArray.length; ++i)
     526        {
     527            g_PlayerColorsSorted[i] = g_PlayerColors[sortedHslArray[i][1]];
     528        }
     529    }
     530    return g_PlayerColorsSorted;
     531}
     532
     533// Get a list of player color display names.
     534function getPlayerColorLabelsSorted()
     535{
     536    if (g_PlayerColorDisplayNamesSorted.length === 0)
     537    {
     538        var playerColorsSorted = getPlayerColorsSorted();
     539        for (var i = 0; i < playerColorsSorted.length; ++i)
     540        {
     541            g_PlayerColorDisplayNamesSorted[i] = "[color=\"" + playerColorsSorted[i].r + " " + playerColorsSorted[i].g + " " + playerColorsSorted[i].b + " 255\"]" + playerColorsSorted[i].displayName;
     542        }
     543    }
     544    return g_PlayerColorDisplayNamesSorted;
     545}
     546
     547// Get a simple list of color IDs, basically a list of indexes that has as many members as colors there are.
     548function getPlayerColorIdsSorted()
     549{
     550    if (g_PlayerColorIdsSorted.length === 0)
     551    {
     552        var playerColorsSorted = getPlayerColorsSorted();
     553        for (var i = 0; i < playerColorsSorted.length; ++i)
     554        {
     555          g_PlayerColorIdsSorted[i] = i;
     556        }
     557    }
     558    return g_PlayerColorIdsSorted;
     559}
     560
     561// Determine whether two specified variables contain the same RGB data.
     562function rgbValuesMatch(color1, color2)
     563{
     564    return color1.r === color2.r && color1.g === color2.g && color1.b === color2.b;
     565}
     566
     567// Copy the RGB data from the first color into the second color.
     568function copyRgbValuesFromColorIntoColor(color1, color2)
     569{
     570    color2.r = color1.r;
     571        color2.g = color1.g;
     572    color2.b = color1.b;
     573}
     574
    425575function handleNetMessage(message)
    426576{
    427577    log("Net message: " + uneval(message));
     
    14301580        var pTeam = Engine.GetGUIObjectByName("playerTeam["+i+"]");
    14311581        var pTeamText = Engine.GetGUIObjectByName("playerTeamText["+i+"]");
    14321582        var pColor = Engine.GetGUIObjectByName("playerColor["+i+"]");
     1583        var pColorPicker = Engine.GetGUIObjectByName("playerColorPicker["+i+"]")
    14331584
    14341585        // Player data / defaults
    14351586        var pData = mapSettings.PlayerData ? mapSettings.PlayerData[i] : {};
     
    14361587        var pDefs = g_DefaultPlayerData ? g_DefaultPlayerData[i] : {};
    14371588
    14381589        // Common to all game types
    1439         var color = rgbToGuiColor(getSetting(pData, pDefs, "Color"));
    1440         pColor.sprite = "color:" + color + " 100";
     1590        var color = getSetting(pData, pDefs, "Color");
     1591        pColor.sprite = "color:" + rgbToGuiColor(color) + " 100";
    14411592        pName.caption = translate(getSetting(pData, pDefs, "Name"));
    14421593
    14431594        var team = getSetting(pData, pDefs, "Team");
     
    14591610            pCiv.hidden = true;
    14601611            pTeamText.hidden = false;
    14611612            pTeam.hidden = true;
     1613            pColorPicker.hidden = true;
    14621614            // Set text values
    14631615            if (civ == "random")
    14641616                pCivText.caption = "[color=\"orange\"]" + translateWithContext("civilization", "Random");
     
    14721624            pCiv.hidden = false;
    14731625            pTeamText.hidden = true;
    14741626            pTeam.hidden = false;
     1627            pColorPicker.hidden = false;
    14751628            // Set dropdown values
    14761629            pCiv.selected = (civ ? pCiv.list_data.indexOf(civ) : 0);
    14771630            pTeam.selected = (team !== undefined && team >= 0) ? team+1 : 0;
     1631            pColorPicker.selected = getIndexOfColor(color);
    14781632        }
    14791633    }
    14801634
  • gui/gamesetup/gamesetup.xml

     
    7272                        <object name="playerBox[n]" size="0 0 100% 32" hidden="true">
    7373                            <object name="playerColor[n]" type="image" size="0 0 100% 100%"/>
    7474                            <object name="playerName[n]" type="text" style="ModernLabelText" size="0 2 22% 30"/>
    75                             <object name="playerAssignment[n]" type="dropdown" style="ModernDropDown" size="22%+5 2 50%+35 30" tooltip_style="onscreenToolTip">
     75                            <object name="playerAssignment[n]" type="dropdown" style="ModernDropDown" size="20%+5 2 50%+35 30" tooltip_style="onscreenToolTip">
    7676                                <translatableAttribute id="tooltip">Select player.</translatableAttribute>
    7777                            </object>
     78                            <object name="playerColorPicker[n]" type="dropdown" style="ModernLabelText" size="20%+5 2 50%+35 30" tooltip_style="onscreenToolTip">
     79                            <translatableAttribute id="tooltip">Pick Color.</translatableAttribute>
     80                            </object>
    7881                            <object name="playerAssignmentText[n]" type="text" style="ModernLabelText" size="22%+5 0 50%+35 30"/>
    7982                            <object name="playerConfig[n]" type="button" style="StoneButton" size="50%+40 4 50%+64 28"
    8083                                tooltip_style="onscreenToolTip"
     
    152155                    tooltip_style="onscreenToolTip">
    153156                    <translatableAttribute id="tooltip">Select a map to play on.</translatableAttribute>
    154157                    <action on="SelectionChange">
    155                         if (this.list_data[this.selected]) 
     158                        if (this.list_data[this.selected])
    156159                            selectMap(this.list_data[this.selected]);
    157160                    </action>
    158161                </object>
     
    179182
    180183            <!-- Map Description -->
    181184            <object size="100%-425 529 100%-25 100%-60">
    182                 <object name="mapInfoName" type="text" style="ModernLeftLabelText" size="0 0 100%-120 30"/> 
     185                <object name="mapInfoName" type="text" style="ModernLeftLabelText" size="0 0 100%-120 30"/>
    183186                <object type="image" sprite="ModernDarkBoxGold" size="0 30 100% 100%">
    184187                    <object name="mapInfoDescription" type="text" style="MapDescription" size="0 0 100% 100%"/>
    185188                </object>
  • simulation/data/settings/player_colors.json

     
     1{
     2    "Comment": "Default colors are Blue, Red, Green, Yellow, Cyan, Purple, Orange, Grey, Fandango",
     3    "Data": [
     4        {
     5            "r": 46,
     6            "g": 46,
     7            "b": 200
     8        },
     9        {
     10            "r": 150,
     11            "g": 20,
     12            "b": 20
     13        },
     14        {
     15            "r": 50,
     16            "g": 165,
     17            "b": 5
     18        },
     19        {
     20            "r": 230,
     21            "g": 230,
     22            "b": 75
     23        },
     24        {
     25            "r": 50,
     26            "g": 170,
     27            "b": 170
     28        },
     29        {
     30            "r": 160,
     31            "g": 80,
     32            "b": 200
     33        },
     34        {
     35            "r": 235,
     36            "g": 120,
     37            "b": 20
     38        },
     39        {
     40            "r": 64,
     41            "g": 64,
     42            "b": 64
     43        },
     44        {
     45            "r": 230,
     46            "g": 60,
     47            "b": 105
     48        }
     49    ]
     50}