Ticket #1580: 1580.2.diff
File 1580.2.diff, 9.9 KB (added by , 9 years ago) |
---|
-
binaries/data/mods/public/gui/common/settings.js
31 31 { 32 32 var settings = { 33 33 "Ceasefire": loadCeasefire(), 34 "PlayerColors": loadPlayerColors(), 34 35 "PopulationCapacities": loadPopulationCapacities(), 35 36 "StartingResources": loadSettingValuesFile("starting_resources.json") 36 37 }; … … 88 89 } 89 90 90 91 /** 92 * Loads available colors settings. 93 * 94 * @returns {Array|undefined} 95 */ 96 function 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 /** 91 110 * Loads available population capacities. 92 111 * 93 112 * @returns {Array|undefined} -
binaries/data/mods/public/gui/gamesetup/gamesetup.js
6 6 const VICTORY_DEFAULTIDX = 1; 7 7 8 8 const g_Ceasefire = prepareForDropdown(g_Settings ? g_Settings.Ceasefire : undefined); 9 const g_PlayerColors = prepareForDropdown(g_Settings ? g_Settings.PlayerColors : undefined); 9 10 const g_PopulationCapacities = prepareForDropdown(g_Settings ? g_Settings.PopulationCapacities : undefined); 10 11 const g_StartingResources = prepareForDropdown(g_Settings ? g_Settings.StartingResources : undefined); 11 12 … … 50 51 51 52 var g_AIs = []; 52 53 54 var g_PlayerColorsSorted = []; 55 var g_PlayerColorIdsSorted = []; 56 var g_PlayerColorDisplayNamesSorted = []; 57 53 58 var g_ChatMessages = []; 54 59 55 60 // Data caches … … 381 386 updateGameAttributes(); 382 387 }; 383 388 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 384 420 // Set events 385 421 var civ = Engine.GetGUIObjectByName("playerCiv["+i+"]"); 386 422 civ.onSelectionChange = function() { … … 414 450 } 415 451 } 416 452 453 // Returns the index of the specified color. 454 function 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 467 function 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 492 function 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. 528 function 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. 542 function 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. 556 function 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. 562 function copyRgbValuesFromColorIntoColor(color1, color2) 563 { 564 color2.r = color1.r; 565 color2.g = color1.g; 566 color2.b = color1.b; 567 } 568 417 569 function handleNetMessage(message) 418 570 { 419 571 log("Net message: " + uneval(message)); … … 1422 1574 var pTeam = Engine.GetGUIObjectByName("playerTeam["+i+"]"); 1423 1575 var pTeamText = Engine.GetGUIObjectByName("playerTeamText["+i+"]"); 1424 1576 var pColor = Engine.GetGUIObjectByName("playerColor["+i+"]"); 1577 var pColorPicker = Engine.GetGUIObjectByName("playerColorPicker["+i+"]") 1425 1578 1426 1579 // Player data / defaults 1427 1580 var pData = mapSettings.PlayerData ? mapSettings.PlayerData[i] : {}; … … 1428 1581 var pDefs = g_DefaultPlayerData ? g_DefaultPlayerData[i] : {}; 1429 1582 1430 1583 // 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"; 1433 1586 pName.caption = translate(getSetting(pData, pDefs, "Name")); 1434 1587 1435 1588 var team = getSetting(pData, pDefs, "Team"); … … 1449 1602 { 1450 1603 pCivText.hidden = false; 1451 1604 pCiv.hidden = true; 1605 pColorPicker.hidden = true; 1452 1606 pTeamText.hidden = false; 1453 1607 pTeam.hidden = true; 1454 1608 // Set text values … … 1462 1616 { 1463 1617 pCivText.hidden = true; 1464 1618 pCiv.hidden = false; 1619 pColorPicker.hidden = false; 1465 1620 pTeamText.hidden = true; 1466 1621 pTeam.hidden = false; 1467 1622 // Set dropdown values 1468 1623 pCiv.selected = (civ ? pCiv.list_data.indexOf(civ) : 0); 1624 pColorPicker.selected = getIndexOfColor(color); 1469 1625 pTeam.selected = (team !== undefined && team >= 0) ? team+1 : 0; 1470 1626 } 1471 1627 } -
binaries/data/mods/public/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="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> 75 78 <object name="playerAssignment[n]" type="dropdown" style="ModernDropDown" size="22%+5 2 50%+35 30" tooltip_style="onscreenToolTip"> 76 79 <translatableAttribute id="tooltip">Select player.</translatableAttribute> 77 80 </object> … … 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>