Ticket #2130: endgame.3.diff

File endgame.3.diff, 6.2 KB (added by sanderd17, 11 years ago)
  • binaries/data/mods/public/simulation/components/EndGameManager.js

     
    3131    this.alliedVictory = flag;
    3232};
    3333
    34 /**
    35  * Begin checking the end-game conditions.
    36  * Must be called once, after calling SetGameType.
    37  */
    38 EndGameManager.prototype.Start = function()
     34EndGameManager.prototype.PlayerLostAllConquestCriticalEntities = function(playerID)
    3935{
    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;
    4638
    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++)
    5050    {
    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 } );
    5355    }
    54 };
    5556
    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    var allies = [];
     58    for (var i = 0; i < numPlayers; i++)
    6959    {
    70     case "conquest":
     60        if (cmpPlayers[i].GetState() != "active")
     61            continue; // search for the first active player
    7162
    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++)
     63        for (var j = 0; j < numPlayers; j++)
    7964        {
    80             var playerEntityId = cmpPlayerManager.GetPlayerByID(i+1);
    81             cmpPlayers[i] = Engine.QueryInterface(playerEntityId, IID_Player);
    82             if (cmpPlayers[i].GetState() == "active")
     65            if (cmpPlayers[j].GetState() == "active")
    8366            {
    84                 if (cmpPlayers[i].GetConquestCriticalEntitiesCount() == 0)
    85                 {   // Defeated - notify AIs by sending playerId
    86                     Engine.PostMessage(playerEntityId, MT_PlayerDefeated, { "playerId": i } );
    87                 }
     67                if (i == j || cmpPlayers[i].IsMutualAlly(j+1))
     68                    allies.push(j);
     69                else
     70                    return;
    8871            }
    8972        }
     73        break;
     74    }
    9075
    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)
    108                     allies.push(i);
    109             }
    110         }
     76    // If only allies left and allied victory set (or only one player left)
     77    if (!this.alliedVictory && allies.length != 1)
     78        return;
     79    for each (var p in allies)
     80        cmpPlayers[p].SetState("won");
    11181
    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             }
    119 
    120             // Reveal the map to all players
    121             var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
    122             cmpRangeManager.SetLosRevealAll(-1, true);
    123         }
    124 
    125         break;
    126 
    127     default:
    128         error("Invalid game type "+this.gameType);
    129         break;
    130     }
     82    // Reveal the map to all players
     83    var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
     84    cmpRangeManager.SetLosRevealAll(-1, true);
    13185};
    13286
    13387Engine.RegisterComponentType(IID_EndGameManager, "EndGameManager", EndGameManager);
  • binaries/data/mods/public/simulation/components/Player.js

     
    482482        if (cmpIdentity && cmpIdentity.HasClass("ConquestCritical"))
    483483            this.conquestCriticalEntitiesCount--;
    484484
     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
    485492        if (cmpCost)
    486493        {
    487494            this.popUsed -= cmpCost.GetPopCost();
  • binaries/data/mods/public/simulation/helpers/Setup.js

     
    3838
    3939    var cmpEndGameManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_EndGameManager);
    4040    if (settings.GameType)
    41     {
    4241        cmpEndGameManager.SetGameType(settings.GameType);
    43     }
    44     cmpEndGameManager.Start();
    4542}
    4643
    4744Engine.RegisterGlobal("LoadMapSettings", LoadMapSettings);