Ticket #2130: endgame.4.diff
File endgame.4.diff, 6.3 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) 39 // for all other game types, defeat that player 40 var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager); 41 42 // Ignore gaia 43 var numPlayers = cmpPlayerManager.GetNumPlayers() - 1; 44 var cmpPlayers = new Array(numPlayers); 45 46 // If the player is currently active but needs to be defeated, 47 // mark that player as defeated 48 // cache the cmpPlayer instances of the other players 49 for (var i = 0; i < numPlayers; i++) 50 50 { 51 var cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer); 52 cmpTimer.CancelTimer(this.timer); 51 var playerEntityId = cmpPlayerManager.GetPlayerByID(i+1); 52 cmpPlayers[i] = Engine.QueryInterface(playerEntityId, IID_Player); 53 if (cmpPlayers[i].GetPlayerID() == playerID && cmpPlayers[i].GetState() == "active") 54 Engine.PostMessage(playerEntityId, MT_PlayerDefeated, { "playerId": i } ); 53 55 } 54 };55 56 56 EndGameManager.prototype.ProgressTimeout = function(data) 57 { 58 this.UpdatePlayerStates(); 59 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) 57 // search the first active player; 58 for (var i = 0; i < numPlayers; i++) 69 59 { 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++) 60 if (cmpPlayers[i].GetState() == "active") 79 61 { 80 var playerEntityId = cmpPlayerManager.GetPlayerByID(i+1); 81 cmpPlayers[i] = Engine.QueryInterface(playerEntityId, IID_Player); 82 if (cmpPlayers[i].GetState() == "active") 83 { 84 if (cmpPlayers[i].GetConquestCriticalEntitiesCount() == 0) 85 { // Defeated - notify AIs by sending playerId 86 Engine.PostMessage(playerEntityId, MT_PlayerDefeated, { "playerId": i } ); 87 } 88 } 62 var activePlayer = i; 63 break; 89 64 } 65 } 90 66 91 var onlyAlliesLeft = true; 92 var allies = []; 93 for (var i = 0; i < numPlayers && onlyAlliesLeft; i++) 67 // search all allied players, 68 var allies = [activePlayer]; 69 for (var i = activePlayer + 1; i < numPlayers; i++) 70 { 71 if (cmpPlayers[i].GetState() == "active") 94 72 { 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) 108 allies.push(i); 109 } 73 if (cmpPlayers[activePlayer].IsMutualAlly(i+1)) 74 allies.push(i); 75 else 76 return; // not only allies are left, nobody has won yet 110 77 } 78 } 111 79 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 } 80 // If only allies left and allied victory set (or only one player left) 81 if (!this.alliedVictory && allies.length != 1) 82 return; 119 83 120 // Reveal the map to all players 121 var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager); 122 cmpRangeManager.SetLosRevealAll(-1, true); 123 } 84 for each (var p in allies) 85 cmpPlayers[p].SetState("won"); 124 86 125 break; 126 127 default: 128 error("Invalid game type "+this.gameType); 129 break; 130 } 87 // Reveal the map to all players 88 var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager); 89 cmpRangeManager.SetLosRevealAll(-1, true); 131 90 }; 132 91 133 92 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);