Ticket #3970: lastmanstanding_v4.patch
File lastmanstanding_v4.patch, 8.4 KB (added by , 8 years ago) |
---|
-
binaries/data/mods/public/gui/gamesetup/gamesetup.js
494 494 "ExploreMap": "exploreMap", 495 495 "DisableTreasures": "disableTreasures", 496 496 "LockTeams": "lockTeams", 497 "LastManStanding" : "lastManStanding", 497 498 "CheatsEnabled": "enableCheats" 498 499 }; 499 500 … … 511 512 Engine.GetGUIObjectByName("lockTeams").enabled = !this.checked; 512 513 updateGameAttributes(); 513 514 }; 515 516 Engine.GetGUIObjectByName("lockTeams").onPress = function() { 517 g_GameAttributes.settings.LockTeams = this.checked; 518 g_GameAttributes.settings.LastManStanding = !this.checked ? this.checked : !this.checked; 519 updateGameAttributes(); 520 }; 514 521 } 515 522 516 523 /** … … 1151 1158 } 1152 1159 1153 1160 if (g_GameAttributes.mapType == "scenario") 1161 { 1154 1162 delete g_GameAttributes.settings.WonderDuration; 1163 delete g_GameAttributes.settings.LastManStanding; 1164 } 1155 1165 1156 1166 if (mapSettings.PlayerData) 1157 1167 sanitizePlayerData(mapSettings.PlayerData); … … 1362 1372 setGUIBoolean("exploreMap", "exploreMapText", !!mapSettings.ExploreMap); 1363 1373 setGUIBoolean("revealMap", "revealMapText", !!mapSettings.RevealMap); 1364 1374 setGUIBoolean("lockTeams", "lockTeamsText", !!mapSettings.LockTeams); 1375 setGUIBoolean("lastManStanding", "lastManStandingText", !!mapSettings.LastManStanding); 1365 1376 setGUIBoolean("enableRating", "enableRatingText", !!mapSettings.RatingEnabled); 1366 1377 1367 1378 Engine.GetGUIObjectByName("optionWonderDuration").hidden = … … 1372 1383 1373 1384 Engine.GetGUIObjectByName("enableCheats").enabled = !mapSettings.RatingEnabled; 1374 1385 Engine.GetGUIObjectByName("lockTeams").enabled = !mapSettings.RatingEnabled; 1386 Engine.GetGUIObjectByName("optionLastManStanding").hidden = mapSettings.LockTeams; 1375 1387 1376 1388 // Mapsize completely hidden for non-random maps 1377 1389 let isRandom = g_GameAttributes.mapType == "random"; … … 1384 1396 1385 1397 for (let ctrl of ["victoryCondition", "wonderDuration", "populationCap", 1386 1398 "startingResources", "ceasefire", "revealMap", 1387 "exploreMap", "disableTreasures", "lockTeams" ])1399 "exploreMap", "disableTreasures", "lockTeams", "lastManStanding"]) 1388 1400 hideControl(ctrl, ctrl + "Text", notScenario); 1389 1401 1390 1402 Engine.GetGUIObjectByName("civResetButton").hidden = !notScenario; -
binaries/data/mods/public/gui/gamesetup/gamesetup.xml
386 386 </object> 387 387 </object> 388 388 389 <object name="option Cheats" size="14 338 94% 366" hidden="true">389 <object name="optionLastManStanding" size="14 338 94% 366"> 390 390 <object size="0 0 40% 28" type="text" style="ModernRightLabelText"> 391 <translatableAttribute id="caption">Last Man Standing:</translatableAttribute> 392 </object> 393 <object name="lastManStandingText" size="40% 0 100% 28" type="text" style="ModernLeftLabelText"/> 394 <object name="lastManStanding" size="40%+10 5 40%+30 100%-5" type="checkbox" style="ModernTickBox" hidden="true" tooltip_style="onscreenToolTip"> 395 <translatableAttribute id="tooltip">Toggle whether the last remaining player or the last remaining set of allies wins.</translatableAttribute> 396 </object> 397 </object> 398 399 <object name="optionCheats" size="14 368 94% 396" hidden="true"> 400 <object size="0 0 40% 28" type="text" style="ModernRightLabelText"> 391 401 <translatableAttribute id="caption">Cheats:</translatableAttribute> 392 402 </object> 393 403 <object name="enableCheatsText" size="40% 0 100% 28" type="text" style="ModernLeftLabelText"/> … … 396 406 </object> 397 407 </object> 398 408 399 <object name="optionRating" size="14 3 68 94% 396" hidden="true">409 <object name="optionRating" size="14 398 94% 426" hidden="true"> 400 410 <object size="0 0 40% 28" hidden="false" type="text" style="ModernRightLabelText"> 401 411 <translatableAttribute id="caption">Rated Game:</translatableAttribute> 402 412 </object> -
binaries/data/mods/public/simulation/components/EndGameManager.js
19 19 this.wonderDuration = 10 * 60 * 1000; 20 20 21 21 // Allied victory means allied players can win if victory conditions are met for each of them 22 // Would be false for a "last man standing" game (when diplomacy is fully implemented)22 // False for a "last man standing" game 23 23 this.alliedVictory = true; 24 this.noAlliesLeftMessage = {}; 24 25 }; 25 26 26 27 EndGameManager.prototype.GetGameType = function() … … 75 76 this.alliedVictory = flag; 76 77 }; 77 78 78 EndGameManager.prototype.OnGlobalPlayerDefeated = function(msg)79 function LastManStandingCheck(onlyAlliesLeft) 79 80 { 80 if (msg.skip) 81 var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager); 82 var cmpGuiInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface); 83 var cmpEndGameManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_EndGameManager); 84 85 if (!cmpGuiInterface || !cmpPlayerManager) 81 86 return; 82 87 83 var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager); 84 var cmpPlayers = []; 88 if (cmpEndGameManager.alliedVictory) 89 { 90 cmpGuiInterface.DeleteTimeNotification(cmpEndGameManager.noAlliesLeftMessage); 91 return; 92 } 85 93 94 if (!cmpEndGameManager.alliedVictory && onlyAlliesLeft) 95 { 96 cmpGuiInterface.DeleteTimeNotification(cmpEndGameManager.noAlliesLeftMessage); 97 cmpEndGameManager.noAlliesLeftMessage = cmpGuiInterface.AddTimeNotification({ 98 "message": markForTranslation("Last player remaining wins."), 99 "translateMessage": true, 100 }, 90 * 60 * 1000); 101 } 102 103 else if (!cmpEndGameManager.alliedVictory && !onlyAlliesLeft) 104 cmpGuiInterface.DeleteTimeNotification(cmpEndGameManager.noAlliesLeftMessage); 105 106 }; 107 108 function OnlyAlliesLeft(msg) 109 { 110 var numPlayers = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager).GetNumPlayers(); 86 111 var allies = []; 87 112 var onlyAlliesLeft = true; 88 113 89 var numPlayers = cmpPlayerManager.GetNumPlayers();114 var cmpPlayers = []; 90 115 91 116 for (var i = 1; i < numPlayers; ++i) 92 117 { 93 118 cmpPlayers[i] = QueryPlayerIDInterface(i); 94 if (cmpPlayers[i].GetState() != "active" || i == msg.playerId) 119 if (cmpPlayers[i].GetState() != "active" || i == msg.playerId) 95 120 continue; 96 121 97 122 if (!allies.length || cmpPlayers[allies[0]].IsMutualAlly(i)) 98 123 allies.push(i); 99 124 else 100 onlyAlliesLeft =false;125 return false; 101 126 } 127 return allies; 128 } 102 129 130 EndGameManager.prototype.OnInitGame = function(msg) 131 { 132 LastManStandingCheck(OnlyAlliesLeft(msg)); 133 }; 134 135 EndGameManager.prototype.OnGlobalDiplomacyChanged = function(msg) 136 { 137 LastManStandingCheck(OnlyAlliesLeft(msg)); 138 }; 139 140 EndGameManager.prototype.OnGlobalPlayerDefeated = function(msg) 141 { 142 if (msg.skip) 143 return; 144 145 var numPlayers = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager).GetNumPlayers(); 146 var cmpGuiInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface); 147 var cmpPlayers = []; 148 149 for (var i = 1; i < numPlayers; ++i) 150 cmpPlayers[i] = QueryPlayerIDInterface(i); 151 152 let allies = OnlyAlliesLeft(msg); 153 LastManStandingCheck(allies); 154 103 155 // check if there are winners, or the game needs to continue 104 if (!allies.length || !onlyAlliesLeft || !this.alliedVictory) 105 return; 156 if (!allies.length || !allies || 157 !this.alliedVictory && cmpPlayers.filter(pData => pData.GetState() == "active").length != 1) 158 return; 106 159 160 cmpGuiInterface.DeleteTimeNotification(this.noAlliesLeftMessage); 161 107 162 for (var p of allies) 108 163 cmpPlayers[p].SetState("won"); 109 164 -
binaries/data/mods/public/simulation/helpers/Setup.js
51 51 cmpEndGameManager.SetGameType(settings.GameType); 52 52 if (settings.WonderDuration) 53 53 cmpEndGameManager.SetWonderDuration(settings.WonderDuration * 60 * 1000); 54 if (settings.LastManStanding) 55 cmpEndGameManager.SetAlliedVictory(false); 54 56 55 57 if (settings.Garrison) 56 58 {