Ticket #1580: customColorSupport.patch
File customColorSupport.patch, 10.7 KB (added by , 11 years ago) |
---|
-
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 = []; 43 43 44 44 var g_ChatMessages = []; 45 45 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. 53 var 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 ]; 64 var g_PlayerColorsSorted = []; 65 var g_PlayerColorIdsSorted = []; 66 var g_PlayerColorDisplayNamesSorted = []; 67 46 68 // Data caches 47 69 var g_MapData = {}; 48 70 var g_CivData = {}; … … function initMain() 301 323 updateGameAttributes(); 302 324 }; 303 325 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 304 357 // Set events 305 358 var civ = getGUIObjectByName("playerCiv["+i+"]"); 306 359 civ.onSelectionChange = function() … … function handleNetMessage(message) 386 439 } 387 440 } 388 441 442 // Returns the index of the specified color. 443 function 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 458 function 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. 517 function 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. 531 function 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. 545 function 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. 551 function copyRgbValuesFromColorIntoColor(color1, color2) 552 { 553 color2.r = color1.r; 554 color2.g = color1.g; 555 color2.b = color1.b; 556 } 557 389 558 // Get display name from map data 390 559 function getMapDisplayName(map) 391 560 { … … function onGameAttributesChange() 1075 1244 var pTeam = getGUIObjectByName("playerTeam["+i+"]"); 1076 1245 var pTeamText = getGUIObjectByName("playerTeamText["+i+"]"); 1077 1246 var pColor = getGUIObjectByName("playerColour["+i+"]"); 1247 var pColorPicker = getGUIObjectByName("playerColorPicker["+i+"]"); 1078 1248 1079 1249 // Player data / defaults 1080 1250 var pData = mapSettings.PlayerData ? mapSettings.PlayerData[i] : {}; 1081 1251 var pDefs = g_DefaultPlayerData ? g_DefaultPlayerData[i] : {}; 1082 1252 1083 1253 // 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"; 1086 1256 pName.caption = getSetting(pData, pDefs, "Name"); 1087 1257 1088 1258 var team = getSetting(pData, pDefs, "Team"); … … function onGameAttributesChange() 1095 1265 pCiv.hidden = true; 1096 1266 pTeamText.hidden = false; 1097 1267 pTeam.hidden = true; 1268 pColorPicker.hidden = true; 1098 1269 // Set text values 1099 1270 if (civ == "random") 1100 1271 pCivText.caption = "[color=\"orange\"]Random"; … … function onGameAttributesChange() 1108 1279 pCiv.hidden = false; 1109 1280 pTeamText.hidden = true; 1110 1281 pTeam.hidden = false; 1282 pColorPicker.hidden = false; 1111 1283 // Set dropdown values 1112 1284 pCiv.selected = (civ ? pCiv.list_data.indexOf(civ) : 0); 1113 1285 pTeam.selected = (team !== undefined && team >= 0) ? team+1 : 0; 1286 pColorPicker.selected = getIndexOfColor(color); 1114 1287 } 1115 1288 } 1116 1289 -
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 59 59 <!-- Player assignments --> 60 60 <object size="24 59 100%-440 358" type="image" sprite="BackgroundIndentFillDark" name="playerAssignmentsPannel"> 61 61 <object size="0 6 100% 30"> 62 <object name="playerNameHeading" type="text" style="CenteredLabelText" size="0 0 2 5% 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> 65 65 <object name="civInfoButton" 66 66 type="button" 67 67 sprite="iconInfoGold" … … 80 80 <repeat count="8"> 81 81 <object name="playerBox[n]" size="0 0 100% 32" hidden="true"> 82 82 <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" 86 87 tooltip_style="onscreenToolTip" 87 88 tooltip="Configure AI settings." 88 89 font="serif-bold-stroke-12" 89 90 >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"/> 92 93 <object name="playerTeam[n]" type="dropdown" style="StoneDropDown" size="85%+5 2 100%-5 30" tooltip_style="onscreenToolTip" tooltip="Select player's team."/> 93 94 <object name="playerTeamText[n]" type="text" style="CenteredLabelText" size="85%+5 0 100%-5 100%"/> 94 95 </object>