Ticket #1580: 1580.diff
File 1580.diff, 11.1 KB (added by , 9 years ago) |
---|
-
gui/common/settings.js
32 32 var settings = {}; 33 33 34 34 settings.Ceasefire = loadCeasefire(); 35 settings.Player_Colors = loadPlayerColors(); 35 36 if (!settings.Ceasefire) 36 37 return undefined; 37 38 … … 62 63 } 63 64 64 65 /** 66 * Loads available colors settings. 67 * 68 * @returns {Array|undefined} 69 */ 70 function 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 /** 65 84 * Creates an object with all values of that property of the given setting and 66 85 * finds the index of the default value. 67 86 * -
gui/gamesetup/gamesetup.js
16 16 const STARTING_RESOURCES_DEFAULTIDX = 1; 17 17 18 18 const g_Ceasefire = prepareForDropdown(g_Settings ? g_Settings.Ceasefire : undefined); 19 const g_PlayerColors = prepareForDropdown(g_Settings ? g_Settings.Player_Colors : undefined); 19 20 20 21 //////////////////////////////////////////////////////////////////////////////////////////////// 21 22 … … 60 61 61 62 var g_ChatMessages = []; 62 63 64 var g_PlayerColorsSorted = []; 65 var g_PlayerColorIdsSorted = []; 66 var g_PlayerColorDisplayNamesSorted = []; 63 67 // Data caches 64 68 var g_MapData = {}; 65 69 var g_CivData = {}; … … 389 393 updateGameAttributes(); 390 394 }; 391 395 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 392 427 // Set events 393 428 var civ = Engine.GetGUIObjectByName("playerCiv["+i+"]"); 394 429 civ.onSelectionChange = function() { … … 421 456 updateGameAttributes(); 422 457 } 423 458 } 459 // Returns the index of the specified color. 460 function 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 } 424 472 473 function 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 498 function 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. 534 function 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. 548 function 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. 562 function 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. 568 function copyRgbValuesFromColorIntoColor(color1, color2) 569 { 570 color2.r = color1.r; 571 color2.g = color1.g; 572 color2.b = color1.b; 573 } 574 425 575 function handleNetMessage(message) 426 576 { 427 577 log("Net message: " + uneval(message)); … … 1430 1580 var pTeam = Engine.GetGUIObjectByName("playerTeam["+i+"]"); 1431 1581 var pTeamText = Engine.GetGUIObjectByName("playerTeamText["+i+"]"); 1432 1582 var pColor = Engine.GetGUIObjectByName("playerColor["+i+"]"); 1583 var pColorPicker = Engine.GetGUIObjectByName("playerColorPicker["+i+"]") 1433 1584 1434 1585 // Player data / defaults 1435 1586 var pData = mapSettings.PlayerData ? mapSettings.PlayerData[i] : {}; … … 1436 1587 var pDefs = g_DefaultPlayerData ? g_DefaultPlayerData[i] : {}; 1437 1588 1438 1589 // 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"; 1441 1592 pName.caption = translate(getSetting(pData, pDefs, "Name")); 1442 1593 1443 1594 var team = getSetting(pData, pDefs, "Team"); … … 1459 1610 pCiv.hidden = true; 1460 1611 pTeamText.hidden = false; 1461 1612 pTeam.hidden = true; 1613 pColorPicker.hidden = true; 1462 1614 // Set text values 1463 1615 if (civ == "random") 1464 1616 pCivText.caption = "[color=\"orange\"]" + translateWithContext("civilization", "Random"); … … 1472 1624 pCiv.hidden = false; 1473 1625 pTeamText.hidden = true; 1474 1626 pTeam.hidden = false; 1627 pColorPicker.hidden = false; 1475 1628 // Set dropdown values 1476 1629 pCiv.selected = (civ ? pCiv.list_data.indexOf(civ) : 0); 1477 1630 pTeam.selected = (team !== undefined && team >= 0) ? team+1 : 0; 1631 pColorPicker.selected = getIndexOfColor(color); 1478 1632 } 1479 1633 } 1480 1634 -
gui/gamesetup/gamesetup.xml
72 72 <object name="playerBox[n]" size="0 0 100% 32" hidden="true"> 73 73 <object name="playerColor[n]" type="image" size="0 0 100% 100%"/> 74 74 <object name="playerName[n]" type="text" style="ModernLabelText" size="0 2 22% 30"/> 75 <object name="playerAssignment[n]" type="dropdown" style="ModernDropDown" size="2 2%+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"> 76 76 <translatableAttribute id="tooltip">Select player.</translatableAttribute> 77 77 </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> 78 81 <object name="playerAssignmentText[n]" type="text" style="ModernLabelText" size="22%+5 0 50%+35 30"/> 79 82 <object name="playerConfig[n]" type="button" style="StoneButton" size="50%+40 4 50%+64 28" 80 83 tooltip_style="onscreenToolTip" … … 152 155 tooltip_style="onscreenToolTip"> 153 156 <translatableAttribute id="tooltip">Select a map to play on.</translatableAttribute> 154 157 <action on="SelectionChange"> 155 if (this.list_data[this.selected]) 158 if (this.list_data[this.selected]) 156 159 selectMap(this.list_data[this.selected]); 157 160 </action> 158 161 </object> … … 179 182 180 183 <!-- Map Description --> 181 184 <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"/> 183 186 <object type="image" sprite="ModernDarkBoxGold" size="0 30 100% 100%"> 184 187 <object name="mapInfoDescription" type="text" style="MapDescription" size="0 0 100% 100%"/> 185 188 </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 }