Ticket #1580: customColorSupport.patch

File customColorSupport.patch, 10.7 KB (added by Adrián Chaves, 11 years ago)

Patch based on the work started by Spahbod.

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

    diff --git a/binaries/data/mods/public/gui/gamesetup/gamesetup.js b/binaries/data/mods/public/gui/gamesetup/gamesetup.js
    index 6ce3102..4950cf5 100644
    a b var g_AIs = [];  
    4343
    4444var g_ChatMessages = [];
    4545
     46// List of supported player colors. There should be at least as many as the sum of the maximum number of players plus
     47// one, so that players can always change color (you can only change to a color that no one else has).
     48// That is: 8 + 1 = 9 minimum colors.
     49//
     50// Note: Player default colors are defined in <mod>/simulation/data/player_defaults.json. These are just colors that you
     51// can select manually. It would be great to keep both lists in sync (have here all colors in player_defaults.json plus
     52// some more), but it is not mandatory.
     53var g_PlayerColors = [
     54    { "r":  46, "g":  46, "b": 200, "displayName": "Blue" },
     55    { "r": 150, "g":  20, "b":  20, "displayName": "Red" },
     56    { "r":  50, "g": 165, "b":   5, "displayName": "Green" },
     57    { "r": 230, "g": 230, "b":  75, "displayName": "Yellow" },
     58    { "r":  50, "g": 170, "b": 170, "displayName": "Cyan" },
     59    { "r": 160, "g":  80, "b": 200, "displayName": "Purple" },
     60    { "r": 235, "g": 120, "b":  20, "displayName": "Orange" },
     61    { "r":  64, "g":  64, "b":  64, "displayName": "Gray" },
     62    { "r": 230, "g":  60, "b": 105, "displayName": "Fandango" }
     63];
     64var g_PlayerColorsSorted = [];
     65var g_PlayerColorIdsSorted = [];
     66var g_PlayerColorDisplayNamesSorted = [];
     67
    4668// Data caches
    4769var g_MapData = {};
    4870var g_CivData = {};
    function initMain()  
    301323                updateGameAttributes();
    302324        };
    303325
     326        // Populate color drop-down lists.
     327        var colorPicker = getGUIObjectByName("playerColorPicker["+i+"]");
     328        colorPicker.list = getPlayerColorLabelsSorted();
     329        colorPicker.list_data = getPlayerColorIdsSorted();
     330        colorPicker.selected = -1;
     331        colorPicker.onSelectionChange = function()
     332        {       // Update color
     333            if (this.selected !== -1)
     334            {
     335                var numPlayers = g_GameAttributes.settings.PlayerData.length;
     336                var used = 0;
     337                var playerColorsSorted = getPlayerColorsSorted();
     338                for (var o = 0; o < numPlayers; o++)
     339                {
     340                    if (rgbValuesMatch(playerColorsSorted[this.list_data[this.selected]], g_GameAttributes.settings.PlayerData[o].Colour))
     341                    {
     342                        ++used;
     343                        break;
     344                    }
     345                }
     346                if (!used)
     347                {
     348                    copyRgbValuesFromColorIntoColor(playerColorsSorted[this.list_data[this.selected]], g_GameAttributes.settings.PlayerData[playerSlot].Colour);
     349                }
     350            }
     351            if (!g_IsInGuiUpdate)
     352            {
     353                updateGameAttributes();
     354            }
     355        };
     356
    304357        // Set events
    305358        var civ = getGUIObjectByName("playerCiv["+i+"]");
    306359        civ.onSelectionChange = function()
    function handleNetMessage(message)  
    386439    }
    387440}
    388441
     442// Returns the index of the specified color.
     443function getIndexOfColor(color)
     444{
     445    for (var i = 0; i < g_PlayerColors.length; ++i)
     446    {
     447        var playerColorsSorted = getPlayerColorsSorted();
     448        if (rgbValuesMatch(playerColorsSorted[i], color))
     449        {
     450            return i;
     451        }
     452    }
     453    return -1;
     454}
     455
     456// Get list of player colors sorted by color value.
     457// See http://stackoverflow.com/a/11923973/939364
     458function getPlayerColorsSorted()
     459{
     460    if (g_PlayerColorsSorted.length === 0)
     461    {
     462        function rgbToHsl(color){
     463            var r = color.r/255, g = color.g/255, b = color.b/255;
     464            var max = Math.max(r, g, b), min = Math.min(r, g, b);
     465            var h, s, l = (max + min) / 2;
     466            if (max === min)
     467            {
     468                h = s = 0; // achromatic
     469            }
     470            else
     471            {
     472                var d = max - min;
     473                s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
     474                switch(max)
     475                {
     476                    case r: h = (g - b) / d + (g < b ? 6 : 0); break;
     477                    case g: h = (b - r) / d + 2; break;
     478                    case b: h = (r - g) / d + 4; break;
     479                }
     480                h /= 6;
     481            }
     482            return new Array(h * 360, s * 100, l * 100);
     483        }
     484
     485        var hslArray = new Array();
     486        for (var i = 0; i < g_PlayerColors.length; ++i)
     487        {
     488            //Transforming rgb to hsl
     489            //`hslArray[i][1]` (`i`) is a reference to the rgb color, in order to retrieve it later
     490            hslArray[i] = [rgbToHsl(g_PlayerColors[i]),i];
     491        }
     492
     493        var sortedHslArray = new Array();
     494        outerloop:
     495        for (var i = 0; i < hslArray.length; ++i)
     496        {
     497            for (var j = 0; j < sortedHslArray.length; ++j)
     498            {
     499                if (sortedHslArray[j][0][0] > hslArray[i][0][0])
     500                {
     501                    sortedHslArray.splice(j, 0, hslArray[i]);
     502                    continue outerloop;
     503                }
     504            }
     505            sortedHslArray.push(hslArray[i]);
     506        }
     507
     508        for (var i = 0; i < sortedHslArray.length; ++i)
     509        {
     510            g_PlayerColorsSorted[i] = g_PlayerColors[sortedHslArray[i][1]];
     511        }
     512    }
     513    return g_PlayerColorsSorted;
     514}
     515
     516// Get a list of player color display names.
     517function getPlayerColorLabelsSorted()
     518{
     519    if (g_PlayerColorDisplayNamesSorted.length === 0)
     520    {
     521        var playerColorsSorted = getPlayerColorsSorted();
     522        for (var i = 0; i < playerColorsSorted.length; ++i)
     523        {
     524            g_PlayerColorDisplayNamesSorted[i] = "[color=\"" + playerColorsSorted[i].r + " " + playerColorsSorted[i].g + " " + playerColorsSorted[i].b + " 255\"]" + playerColorsSorted[i].displayName;
     525        }
     526    }
     527    return g_PlayerColorDisplayNamesSorted;
     528}
     529
     530// Get a simple list of color IDs, basically a list of indexes that has as many members as colors there are.
     531function getPlayerColorIdsSorted()
     532{
     533    if (g_PlayerColorIdsSorted.length === 0)
     534    {
     535        var playerColorsSorted = getPlayerColorsSorted();
     536        for (var i = 0; i < playerColorsSorted.length; ++i)
     537        {
     538            g_PlayerColorIdsSorted[i] = i;
     539        }
     540    }
     541    return g_PlayerColorIdsSorted;
     542}
     543
     544// Determine whether two specified variables contain the same RGB data.
     545function rgbValuesMatch(color1, color2)
     546{
     547    return color1.r === color2.r && color1.g === color2.g && color1.b === color2.b;
     548}
     549
     550// Copy the RGB data from the first color into the second color.
     551function copyRgbValuesFromColorIntoColor(color1, color2)
     552{
     553    color2.r = color1.r;
     554    color2.g = color1.g;
     555    color2.b = color1.b;
     556}
     557
    389558// Get display name from map data
    390559function getMapDisplayName(map)
    391560{
    function onGameAttributesChange()  
    10751244        var pTeam = getGUIObjectByName("playerTeam["+i+"]");
    10761245        var pTeamText = getGUIObjectByName("playerTeamText["+i+"]");
    10771246        var pColor = getGUIObjectByName("playerColour["+i+"]");
     1247        var pColorPicker = getGUIObjectByName("playerColorPicker["+i+"]");
    10781248
    10791249        // Player data / defaults
    10801250        var pData = mapSettings.PlayerData ? mapSettings.PlayerData[i] : {};
    10811251        var pDefs = g_DefaultPlayerData ? g_DefaultPlayerData[i] : {};
    10821252
    10831253        // Common to all game types
    1084         var color = iColorToString(getSetting(pData, pDefs, "Colour"));
    1085         pColor.sprite = "colour:"+color+" 100";
     1254        var color = getSetting(pData, pDefs, "Colour");
     1255        pColor.sprite = "colour:" + iColorToString(color) + " 100";
    10861256        pName.caption = getSetting(pData, pDefs, "Name");
    10871257
    10881258        var team = getSetting(pData, pDefs, "Team");
    function onGameAttributesChange()  
    10951265            pCiv.hidden = true;
    10961266            pTeamText.hidden = false;
    10971267            pTeam.hidden = true;
     1268            pColorPicker.hidden = true;
    10981269            // Set text values
    10991270            if (civ == "random")
    11001271                pCivText.caption = "[color=\"orange\"]Random";
    function onGameAttributesChange()  
    11081279            pCiv.hidden = false;
    11091280            pTeamText.hidden = true;
    11101281            pTeam.hidden = false;
     1282            pColorPicker.hidden = false;
    11111283            // Set dropdown values
    11121284            pCiv.selected = (civ ? pCiv.list_data.indexOf(civ) : 0);
    11131285            pTeam.selected = (team !== undefined && team >= 0) ? team+1 : 0;
     1286            pColorPicker.selected = getIndexOfColor(color);
    11141287        }
    11151288    }
    11161289
  • binaries/data/mods/public/gui/gamesetup/gamesetup.xml

    diff --git a/binaries/data/mods/public/gui/gamesetup/gamesetup.xml b/binaries/data/mods/public/gui/gamesetup/gamesetup.xml
    index 157afc5..2d6839c 100644
    a b  
    5959            <!-- Player assignments -->
    6060            <object size="24 59 100%-440 358" type="image" sprite="BackgroundIndentFillDark" name="playerAssignmentsPannel">
    6161                <object size="0 6 100% 30">
    62                     <object name="playerNameHeading" type="text" style="CenteredLabelText" size="0 0 25% 100%">Player Name</object>
    63                     <object name="playerPlacementHeading" type="text" style="CenteredLabelText" size="25%+5 0 55% 100%">Player Placement</object>
    64                     <object name="playerCivHeading" type="text" style="CenteredLabelText" size="55%+65 0 85% 100%">Civilization</object>
     62                    <object name="playerNameHeading" type="text" style="CenteredLabelText" size="0 0 20% 100%">Player Name</object>
     63                    <object name="playerPlacementHeading" type="text" style="CenteredLabelText" size="35%+5 0 60% 100%">Player Placement</object>
     64                    <object name="playerCivHeading" type="text" style="CenteredLabelText" size="60%+65 0 85% 100%">Civilization</object>
    6565                    <object name="civInfoButton"
    6666                        type="button"
    6767                        sprite="iconInfoGold"
     
    8080                    <repeat count="8">
    8181                        <object name="playerBox[n]" size="0 0 100% 32" hidden="true">
    8282                            <object name="playerColour[n]" type="image" size="0 0 100% 100%"/>
    83                             <object name="playerName[n]" type="text" style="CenteredLabelText" size="0 2 25% 30"/>
    84                             <object name="playerAssignment[n]" type="dropdown" style="StoneDropDown" size="25%+5 2 55% 30" tooltip_style="onscreenToolTip" tooltip="Select player."/>
    85                             <object name="playerConfig[n]" type="button" style="StoneButton" size="55%+5 6 55%+60 26"
     83                            <object name="playerName[n]" type="text" style="CenteredLabelText" size="0 2 20% 30"/>
     84                            <object name="playerColorPicker[n]" type="dropdown" style="StoneDropDown" size="20%+5 2 35% 30" tooltip_style="onscreenToolTip" tooltip="Select color."/>
     85                            <object name="playerAssignment[n]" type="dropdown" style="StoneDropDown" size="35%+5 2 60% 30" tooltip_style="onscreenToolTip" tooltip="Select player."/>
     86                            <object name="playerConfig[n]" type="button" style="StoneButton" size="60%+5 6 60%+60 26"
    8687                                tooltip_style="onscreenToolTip"
    8788                                tooltip="Configure AI settings."
    8889                                font="serif-bold-stroke-12"
    8990                            >Settings</object>
    90                             <object name="playerCiv[n]" type="dropdown" style="StoneDropDown" size="55%+65 2 85% 30" tooltip_style="onscreenToolTip" tooltip="Select player's civilization."/>
    91                             <object name="playerCivText[n]" type="text" style="CenteredLabelText" size="55%+65 0 85% 30"/>
     91                            <object name="playerCiv[n]" type="dropdown" style="StoneDropDown" size="60%+65 2 85% 30" tooltip_style="onscreenToolTip" tooltip="Select player's civilization."/>
     92                            <object name="playerCivText[n]" type="text" style="CenteredLabelText" size="60%+65 0 85% 30"/>
    9293                            <object name="playerTeam[n]" type="dropdown" style="StoneDropDown" size="85%+5 2 100%-5 30" tooltip_style="onscreenToolTip" tooltip="Select player's team."/>
    9394                            <object name="playerTeamText[n]" type="text" style="CenteredLabelText" size="85%+5 0 100%-5 100%"/>
    9495                        </object>