Ticket #1580: 1580.2.diff

File 1580.2.diff, 9.9 KB (added by Stan, 9 years ago)

WIP2

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

     
    3131{
    3232    var settings = {
    3333        "Ceasefire": loadCeasefire(),
     34        "PlayerColors": loadPlayerColors(),
    3435        "PopulationCapacities": loadPopulationCapacities(),
    3536        "StartingResources": loadSettingValuesFile("starting_resources.json")
    3637    };
     
    8889}
    8990
    9091/**
     92* Loads available colors settings.
     93*
     94* @returns {Array|undefined}
     95*/
     96function loadPlayerColors()
     97{
     98    var json = Engine.ReadJSONFile("simulation/data/player_defaults.json");
     99
     100    if (!json || !json.PlayerData || !Array.isArray(json.PlayerData))
     101    {
     102        error("Could not load player_defaults.json");
     103        return undefined;
     104    }
     105
     106    return json.PlayerData.map(player => player.Color);
     107}
     108
     109/**
    91110 * Loads available population capacities.
    92111 *
    93112 * @returns {Array|undefined}
  • binaries/data/mods/public/gui/gamesetup/gamesetup.js

     
    66const VICTORY_DEFAULTIDX = 1;
    77
    88const g_Ceasefire = prepareForDropdown(g_Settings ? g_Settings.Ceasefire : undefined);
     9const g_PlayerColors = prepareForDropdown(g_Settings ? g_Settings.PlayerColors : undefined);
    910const g_PopulationCapacities = prepareForDropdown(g_Settings ? g_Settings.PopulationCapacities : undefined);
    1011const g_StartingResources = prepareForDropdown(g_Settings ? g_Settings.StartingResources : undefined);
    1112
     
    5051
    5152var g_AIs = [];
    5253
     54var g_PlayerColorsSorted = [];
     55var g_PlayerColorIdsSorted = [];
     56var g_PlayerColorDisplayNamesSorted = [];
     57
    5358var g_ChatMessages = [];
    5459
    5560// Data caches
     
    381386            updateGameAttributes();
    382387        };
    383388
     389        // Populate color drop-down lists.
     390        var colorPicker = Engine.GetGUIObjectByName("playerColorPicker["+i+"]");
     391        colorPicker.list = getPlayerColorLabelsSorted();
     392        colorPicker.list_data = getPlayerColorIdsSorted();
     393        colorPicker.selected = -1;
     394        colorPicker.onSelectionChange = function()
     395        {       // Update color
     396            if (this.selected !== -1)
     397            {
     398                var numPlayers = g_GameAttributes.settings.PlayerData.length;
     399                var used = 0;
     400                var playerColorsSorted = getPlayerColorsSorted();
     401                for (var o = 0; o < numPlayers; o++)
     402                {
     403                    if (rgbValuesMatch(playerColorsSorted[this.list_data[this.selected]], g_GameAttributes.settings.PlayerData[o].Color))
     404                    {
     405                        ++used;
     406                        break;
     407                    }
     408                }
     409                if (!used)
     410                {
     411                    copyRgbValuesFromColorIntoColor(playerColorsSorted[this.list_data[this.selected]], g_GameAttributes.settings.PlayerData[playerSlot].Color);
     412                }
     413            }
     414            if (!g_IsInGuiUpdate)
     415            {
     416                updateGameAttributes();
     417            }
     418        };
     419
    384420        // Set events
    385421        var civ = Engine.GetGUIObjectByName("playerCiv["+i+"]");
    386422        civ.onSelectionChange = function() {
     
    414450    }
    415451}
    416452
     453// Returns the index of the specified color.
     454function getIndexOfColor(color)
     455{
     456    for (var i = 0; i < g_PlayerColors.length; ++i)
     457    {
     458        var playerColorsSorted = getPlayerColorsSorted();
     459        if (rgbValuesMatch(playerColorsSorted[i], color))
     460        {
     461            return i;
     462        }
     463    }
     464    return -1;
     465}
     466
     467function rgbToHsl(color){
     468        var r = color.r/255, g = color.g/255, b = color.b/255;
     469        var max = Math.max(r, g, b), min = Math.min(r, g, b);
     470        var h, s, l = (max + min) / 2;
     471        if (max === min)
     472        {
     473                h = s = 0; // achromatic
     474        }
     475        else
     476        {
     477                var d = max - min;
     478                s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
     479                switch(max)
     480                {
     481                        case r: h = (g - b) / d + (g < b ? 6 : 0); break;
     482                        case g: h = (b - r) / d + 2; break;
     483                        case b: h = (r - g) / d + 4; break;
     484                }
     485                h /= 6;
     486        }
     487        return [h * 360, s * 100, l * 100];
     488}
     489
     490// Get list of player colors sorted by color value.
     491// See http://stackoverflow.com/a/11923973/939364
     492function getPlayerColorsSorted()
     493{
     494    if (g_PlayerColorsSorted.length === 0)
     495    {
     496        var hslArray = [];
     497        for (var i = 0; i < g_PlayerColors.length; ++i)
     498        {
     499            //Transforming rgb to hsl
     500            //`hslArray[i][1]` (`i`) is a reference to the rgb color, in order to retrieve it later
     501            hslArray[i] = [rgbToHsl(g_PlayerColors[i]),i];
     502        }
     503
     504        var sortedHslArray = [];
     505        outerloop:
     506        for (var i = 0; i < hslArray.length; ++i)
     507        {
     508            for (var j = 0; j < sortedHslArray.length; ++j)
     509            {
     510                if (sortedHslArray[j][0][0] > hslArray[i][0][0])
     511                {
     512                    sortedHslArray.splice(j, 0, hslArray[i]);
     513                    continue outerloop;
     514                }
     515            }
     516            sortedHslArray.push(hslArray[i]);
     517        }
     518
     519        for (var i = 0; i < sortedHslArray.length; ++i)
     520        {
     521            g_PlayerColorsSorted[i] = g_PlayerColors[sortedHslArray[i][1]];
     522        }
     523    }
     524    return g_PlayerColorsSorted;
     525}
     526
     527// Get a list of player color display names.
     528function getPlayerColorLabelsSorted()
     529{
     530    if (g_PlayerColorDisplayNamesSorted.length === 0)
     531    {
     532        var playerColorsSorted = getPlayerColorsSorted();
     533        for (var i = 0; i < playerColorsSorted.length; ++i)
     534        {
     535            g_PlayerColorDisplayNamesSorted[i] = "[color=\"" + playerColorsSorted[i].r + " " + playerColorsSorted[i].g + " " + playerColorsSorted[i].b + " 255\"]" + "█";
     536        }
     537    }
     538    return g_PlayerColorDisplayNamesSorted;
     539}
     540
     541// Get a simple list of color IDs, basically a list of indexes that has as many members as colors there are.
     542function getPlayerColorIdsSorted()
     543{
     544    if (g_PlayerColorIdsSorted.length === 0)
     545    {
     546        var playerColorsSorted = getPlayerColorsSorted();
     547        for (var i = 0; i < playerColorsSorted.length; ++i)
     548        {
     549          g_PlayerColorIdsSorted[i] = i;
     550        }
     551    }
     552    return g_PlayerColorIdsSorted;
     553}
     554
     555// Determine whether two specified variables contain the same RGB data.
     556function rgbValuesMatch(color1, color2)
     557{
     558    return color1.r === color2.r && color1.g === color2.g && color1.b === color2.b;
     559}
     560
     561// Copy the RGB data from the first color into the second color.
     562function copyRgbValuesFromColorIntoColor(color1, color2)
     563{
     564    color2.r = color1.r;
     565    color2.g = color1.g;
     566    color2.b = color1.b;
     567}
     568
    417569function handleNetMessage(message)
    418570{
    419571    log("Net message: " + uneval(message));
     
    14221574        var pTeam = Engine.GetGUIObjectByName("playerTeam["+i+"]");
    14231575        var pTeamText = Engine.GetGUIObjectByName("playerTeamText["+i+"]");
    14241576        var pColor = Engine.GetGUIObjectByName("playerColor["+i+"]");
     1577        var pColorPicker = Engine.GetGUIObjectByName("playerColorPicker["+i+"]")
    14251578
    14261579        // Player data / defaults
    14271580        var pData = mapSettings.PlayerData ? mapSettings.PlayerData[i] : {};
     
    14281581        var pDefs = g_DefaultPlayerData ? g_DefaultPlayerData[i] : {};
    14291582
    14301583        // Common to all game types
    1431         var color = rgbToGuiColor(getSetting(pData, pDefs, "Color"));
    1432         pColor.sprite = "color:" + color + " 100";
     1584        var color = getSetting(pData, pDefs, "Color");
     1585        pColor.sprite = "color:" + rgbToGuiColor(color) + " 100";
    14331586        pName.caption = translate(getSetting(pData, pDefs, "Name"));
    14341587
    14351588        var team = getSetting(pData, pDefs, "Team");
     
    14491602        {
    14501603            pCivText.hidden = false;
    14511604            pCiv.hidden = true;
     1605            pColorPicker.hidden = true;
    14521606            pTeamText.hidden = false;
    14531607            pTeam.hidden = true;
    14541608            // Set text values
     
    14621616        {
    14631617            pCivText.hidden = true;
    14641618            pCiv.hidden = false;
     1619            pColorPicker.hidden = false;
    14651620            pTeamText.hidden = true;
    14661621            pTeam.hidden = false;
    14671622            // Set dropdown values
    14681623            pCiv.selected = (civ ? pCiv.list_data.indexOf(civ) : 0);
     1624            pColorPicker.selected = getIndexOfColor(color);
    14691625            pTeam.selected = (team !== undefined && team >= 0) ? team+1 : 0;
    14701626        }
    14711627    }
  • binaries/data/mods/public/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="playerColorPicker[n]" type="dropdown" style="ModernDropDown" size="16%+5 2 20%+5 30" tooltip_style="onscreenToolTip">
     76                                <translatableAttribute id="tooltip">Pick Color.</translatableAttribute>
     77                            </object>
    7578                            <object name="playerAssignment[n]" type="dropdown" style="ModernDropDown" size="22%+5 2 50%+35 30" tooltip_style="onscreenToolTip">
    7679                                <translatableAttribute id="tooltip">Select player.</translatableAttribute>
    7780                            </object>
     
    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>