Ticket #2130: endgame.6.diff
File endgame.6.diff, 6.1 KB (added by , 11 years ago) |
---|
-
binaries/data/mods/public/simulation/components/EndGameManager.js
31 31 this.alliedVictory = flag; 32 32 }; 33 33 34 /** 35 * Begin checking the end-game conditions. 36 * Must be called once, after calling SetGameType. 37 */ 38 EndGameManager.prototype.Start = function() 34 EndGameManager.prototype.PlayerLostAllConquestCriticalEntities = function(playerID) 39 35 { 40 if (this.gameType != "endless") 41 { 42 var cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer); 43 this.timer = cmpTimer.SetTimeout(this.entity, IID_EndGameManager, "ProgressTimeout", g_ProgressInterval, {}); 44 } 45 }; 36 if (this.gameType == "endless") 37 return; 46 38 47 EndGameManager.prototype.OnDestroy = function() 48 { 49 if (this.timer) 50 { 51 var cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer); 52 cmpTimer.CancelTimer(this.timer); 53 } 54 }; 55 56 EndGameManager.prototype.ProgressTimeout = function(data) 57 { 58 this.UpdatePlayerStates(); 39 // for all other game types, defeat that player 40 var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager); 59 41 60 // Repeat the timer 61 var cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer); 62 this.timer = cmpTimer.SetTimeout(this.entity, IID_EndGameManager, "ProgressTimeout", g_ProgressInterval, data); 63 }; 64 65 EndGameManager.prototype.UpdatePlayerStates = function() 66 { 67 var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager); 68 switch (this.gameType) 42 // Ignore gaia 43 var numPlayers = cmpPlayerManager.GetNumPlayers() - 1; 44 var cmpPlayers = []; 45 46 var allies = []; 47 var onlyAlliesLeft = true; 48 // If the player is currently active but needs to be defeated, 49 // mark that player as defeated 50 // cache the cmpPlayer instances of the other players and search the allies 51 for (var i = 0; i < numPlayers; i++) 69 52 { 70 case "conquest": 71 72 // Ignore gaia 73 var numPlayers = cmpPlayerManager.GetNumPlayers() - 1; 74 var cmpPlayers = new Array(numPlayers); 75 76 // If a player is currently active but has no suitable units left, 77 // mark that player as defeated 78 for (var i = 0; i < numPlayers; i++) 53 var playerEntityId = cmpPlayerManager.GetPlayerByID(i+1); 54 cmpPlayers[i] = Engine.QueryInterface(playerEntityId, IID_Player); 55 if (cmpPlayers[i].GetState() == "active") // cmpPlayer should always exist 79 56 { 80 var playerEntityId = cmpPlayerManager.GetPlayerByID(i+1);81 cmpPlayers[i] = Engine.QueryInterface(playerEntityId, IID_Player);82 if (cmpPlayers[i].GetState() == "active")57 if (cmpPlayers[i].GetPlayerID() == playerID) 58 Engine.PostMessage(playerEntityId, MT_PlayerDefeated, { "playerId": i } ); 59 else 83 60 { 84 if (cmpPlayers[i].GetConquestCriticalEntitiesCount() == 0) 85 { // Defeated - notify AIs by sending playerId 86 Engine.PostMessage(playerEntityId, MT_PlayerDefeated, { "playerId": i } ); 87 } 88 } 89 } 90 91 var onlyAlliesLeft = true; 92 var allies = []; 93 for (var i = 0; i < numPlayers && onlyAlliesLeft; i++) 94 { 95 if (cmpPlayers[i].GetState() == "active") 96 { //Active player 97 for (var j = 0; j < numPlayers && onlyAlliesLeft; j++) 98 { 99 if (cmpPlayers[j].GetState() == "active" 100 && (cmpPlayers[i].IsEnemy(j+1) || cmpPlayers[j].IsEnemy(i+1) 101 || cmpPlayers[i].IsNeutral(j+1) || cmpPlayers[j].IsNeutral(i+1))) 102 { // Only need to find an active non-allied player 103 onlyAlliesLeft = false; 104 } 105 } 106 107 if (onlyAlliesLeft) 61 if (!allies.length || cmpPlayers[allies[0]].IsMutualAlly(i+1)) 108 62 allies.push(i); 63 else 64 onlyAlliesLeft = false; 109 65 } 110 66 } 67 } 111 68 112 // If only allies left and allied victory set (or only one player left) 113 if (onlyAlliesLeft && (this.alliedVictory || allies.length == 1)) 114 { 115 for each (var p in allies) 116 { 117 cmpPlayers[p].SetState("won"); 118 } 69 if (!allies.length || !onlyAlliesLeft) 70 return; // mark nobody as won 119 71 120 // Reveal the map to all players 121 var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager); 122 cmpRangeManager.SetLosRevealAll(-1, true); 123 } 72 // If only allies left and allied victory set (or only one player left) 73 if (!this.alliedVictory && allies.length != 1) 74 return; 124 75 125 break; 76 for each (var p in allies) 77 cmpPlayers[p].SetState("won"); 126 78 127 default: 128 error("Invalid game type "+this.gameType); 129 break; 130 } 79 // Reveal the map to all players 80 var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager); 81 cmpRangeManager.SetLosRevealAll(-1, true); 131 82 }; 132 83 133 84 Engine.RegisterComponentType(IID_EndGameManager, "EndGameManager", EndGameManager); -
binaries/data/mods/public/simulation/components/Player.js
482 482 if (cmpIdentity && cmpIdentity.HasClass("ConquestCritical")) 483 483 this.conquestCriticalEntitiesCount--; 484 484 485 if (this.conquestCriticalEntitiesCount == 0) 486 { 487 // end game when needed 488 var cmpEndGameManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_EndGameManager); 489 cmpEndGameManager.PlayerLostAllConquestCriticalEntities(this.playerID); 490 } 491 485 492 if (cmpCost) 486 493 { 487 494 this.popUsed -= cmpCost.GetPopCost(); -
binaries/data/mods/public/simulation/helpers/Setup.js
38 38 39 39 var cmpEndGameManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_EndGameManager); 40 40 if (settings.GameType) 41 {42 41 cmpEndGameManager.SetGameType(settings.GameType); 43 }44 cmpEndGameManager.Start();45 42 } 46 43 47 44 Engine.RegisterGlobal("LoadMapSettings", LoadMapSettings);