Ticket #2976: 2976.3.diff

File 2976.3.diff, 15.2 KB (added by trompetin17, 9 years ago)
  • binaries/data/mods/public/gui/gamesetup/victory_conditions/conquest.js

    diff --git a/binaries/data/mods/public/gui/gamesetup/victory_conditions/conquest.js b/binaries/data/mods/public/gui/gamesetup/victory_conditions/conquest.js
    index b168bee..9664d69 100644
    a b  
    1 var vc = {};
    2 
    3 vc.name = translate("Conquest");
    4 vc.description = translate("Defeat all opponents");
    5 
    6 /*
    7 NOT SUPPORTED YET
    8 vc.requirementsCheck = function(mapSettings)
    9 {
    10     // nothing required
    11     return true;
     1g_VictoryConditions.conquest = {
     2    "name" : translate("Conquest"),
     3    "description" : translate("Defeat all opponents"),
     4    "scripts" : ["scripts/ConquestCommon.js", "scripts/TriggerHelper.js", "scripts/Conquest.js"]
    125};
    13 */
    14 
    15 vc.scripts = ["scripts/Conquest.js"];
    16 
    17 g_VictoryConditions.conquest = vc;
    18 vc = null;
  • new file inaries/data/mods/public/gui/gamesetup/victory_conditions/conquestStructures.js

    diff --git a/binaries/data/mods/public/gui/gamesetup/victory_conditions/conquestStructures.js b/binaries/data/mods/public/gui/gamesetup/victory_conditions/conquestStructures.js
    new file mode 100644
    index 0000000..6810466
    - +  
     1g_VictoryConditions.conquestStructure = {
     2    "name" : translate("Conquest Structure"),
     3    "description" : translate("Destroy all structures of enemies"),
     4    "scripts" : ["scripts/ConquestCommon.js", "scripts/TriggerHelper.js", "scripts/ConquestStructures.js"]
     5};
  • new file inaries/data/mods/public/gui/gamesetup/victory_conditions/conquestUnits.js

    diff --git a/binaries/data/mods/public/gui/gamesetup/victory_conditions/conquestUnits.js b/binaries/data/mods/public/gui/gamesetup/victory_conditions/conquestUnits.js
    new file mode 100644
    index 0000000..1249732
    - +  
     1g_VictoryConditions.conquestUnits = {
     2    "name" : translate("Conquest Units"),
     3    "description" : translate("Destroy all units of enemies"),
     4    "scripts" : ["scripts/ConquestCommon.js", "scripts/TriggerHelper.js", "scripts/ConquestUnits.js"]
     5};
  • binaries/data/mods/public/gui/gamesetup/victory_conditions/wonder.js

    diff --git a/binaries/data/mods/public/gui/gamesetup/victory_conditions/wonder.js b/binaries/data/mods/public/gui/gamesetup/victory_conditions/wonder.js
    index 9e0034b..c38b9b9 100644
    a b  
    1 var vc = {};
    2 
    3 vc.name = translate("Wonder");
    4 vc.description = translate("Build a wonder to win");
    5 
    6 /*
    7 NOT SUPPORTED YET
    8 vc.requirementsCheck = function(mapSettings)
    9 {
    10     // nothing required
    11     return true;
     1g_VictoryConditions.wonder = {
     2    "name" : translate("Wonder"),
     3    "description" : translate("Build a wonder to win"),
     4    "scripts" : ["scripts/ConquestCommon.js", "scripts/TriggerHelper.js", "scripts/Conquest.js", "scripts/WonderVictory.js"]
    125};
    13 */
    14 
    15 vc.scripts = ["scripts/Conquest.js", "scripts/WonderVictory.js"];
    16 
    17 g_VictoryConditions.wonder = vc;
    18 vc = null;
  • binaries/data/mods/public/maps/scripts/Conquest.js

    diff --git a/binaries/data/mods/public/maps/scripts/Conquest.js b/binaries/data/mods/public/maps/scripts/Conquest.js
    index 867fa20..704b4c9 100644
    a b  
    1 /*
    2  * Check players the next turn. Avoids problems in Atlas, with promoting entities etc
    3  */
    4 Trigger.prototype.CheckConquestCriticalEntities = function()
    5 {
    6     if (this.checkingConquestCriticalEntities)
    7         return;
    8     // wait a turn for actually checking the players
    9     this.DoAfterDelay(0, "CheckConquestCriticalEntitiesNow", null);
    10     this.checkingConquestCriticalEntities = true;
    11 };
    12 
    13 /*
    14  * Check players immediately. Might cause problems with converting/promoting entities.
    15  */
    16 Trigger.prototype.CheckConquestCriticalEntitiesNow = function()
    17 {
    18     this.checkingConquestCriticalEntities = false;
    19     // for all other game types, defeat that player
    20     var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
    21     var cmpEndGameManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_EndGameManager);
    22    
    23     // Ignore gaia
    24     var numPlayers = cmpPlayerManager.GetNumPlayers();
    25     var cmpPlayers = [];
    26    
    27     var allies = [];
    28     var onlyAlliesLeft = true;
    29     // If the player is currently active but needs to be defeated,
    30     // mark that player as defeated
    31     // cache the cmpPlayer instances of the other players and search the allies
    32     for (var i = 1; i < numPlayers; i++)
    33     {
    34         // cmpPlayer should always exist for the player ids from 1 to numplayers
    35         // so no tests on the existance of cmpPlayer are needed
    36         var playerEntityId = cmpPlayerManager.GetPlayerByID(i);
    37         cmpPlayers[i] = Engine.QueryInterface(playerEntityId, IID_Player);
    38         if (cmpPlayers[i].GetState() != "active")
    39             continue;
    40         if (cmpPlayers[i].GetConquestCriticalEntitiesCount() == 0)
    41             Engine.PostMessage(playerEntityId, MT_PlayerDefeated, { "playerId": i } );
    42         else
    43         {
    44             if (!allies.length || cmpPlayers[allies[0]].IsMutualAlly(i))
    45                 allies.push(i);
    46             else
    47                 onlyAlliesLeft = false;
    48         }
    49     }
    50 
    51     // check if there are winners, or the game needs to continue
    52     if (!allies.length || !onlyAlliesLeft || !(cmpEndGameManager.alliedVictory || allies.length == 1))
    53         return;
    54 
    55     for each (var p in allies)
    56         cmpPlayers[p].SetState("won");
    57 
    58     // Reveal the map to all players
    59     var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
    60     cmpRangeManager.SetLosRevealAll(-1, true);
    61 };
    62 
    631var cmpTrigger = Engine.QueryInterface(SYSTEM_ENTITY, IID_Trigger);
     2cmpTrigger.conquestClassFilter = "ConquestCritical";
    643
    654var data = {"enabled": true};
    66 cmpTrigger.RegisterTrigger("OnOwnershipChanged", "CheckConquestCriticalEntities", data);
    67 // also check at the start of the game
    68 cmpTrigger.DoAfterDelay(0, "CheckConquestCriticalEntitiesNow", null);
    69 cmpTrigger.checkingConquestCriticalEntities = false;
     5cmpTrigger.RegisterTrigger("OnOwnershipChanged", "ConquestHandlerOwnerShipChanged", data);
     6cmpTrigger.RegisterTrigger("OnStructureBuilt", "ConquestAddStructure", data);
     7cmpTrigger.RegisterTrigger("OnTrainingFinished", "ConquestTrainingFinished", data);
    708
     9cmpTrigger.DoAfterDelay(0, "ConquestStartGameCount", null);
  • new file inaries/data/mods/public/maps/scripts/ConquestCommon.js

    diff --git a/binaries/data/mods/public/maps/scripts/ConquestCommon.js b/binaries/data/mods/public/maps/scripts/ConquestCommon.js
    new file mode 100644
    index 0000000..c8427e3
    - +  
     1Trigger.prototype.ConquestHandlerOwnerShipChanged = function(msg)
     2{
     3    if (!this.conquestDataInit || !this.conquestClassFilter)
     4        return;
     5
     6    if (!TriggerHelper.EntityHasClass(msg.entity, this.conquestClassFilter))
     7        return;
     8
     9    if (msg.from == -1)
     10        return;
     11
     12    if (msg.to > 0 && this.conquestEntitiesByPlayer[msg.to])
     13        this.conquestEntitiesByPlayer[msg.to].entities.push(msg.entity);
     14
     15    if (!this.conquestEntitiesByPlayer[msg.from])
     16    {
     17        if (msg.from)
     18            warn("ConquestHandlerOwnerShipChanged: Unknow player " + msg.from);
     19        return;
     20    }
     21
     22    let entities = this.conquestEntitiesByPlayer[msg.from].entities;
     23    let index = entities.indexOf(msg.entity);
     24
     25    if (index >= 0)
     26    {
     27        entities.splice(index, 1);
     28        if (!entities.length)
     29            Engine.PostMessage(this.conquestEntitiesByPlayer[msg.from].player, MT_PlayerDefeated, { "playerId": msg.from } );
     30    }
     31}
     32
     33Trigger.prototype.ConquestAddStructure = function(msg)
     34{
     35    if (!this.conquestClassFilter || !TriggerHelper.EntityHasClass(msg.building, this.conquestClassFilter))
     36        return;
     37
     38    let cmpOwnership = Engine.QueryInterface(msg.building, IID_Ownership);
     39    if (!cmpOwnership)
     40    {
     41        warn("ConquestAddStructure: Structure without Owner");
     42        return;
     43    }
     44
     45    let player = cmpOwnership.GetOwner();
     46    if (!this.conquestEntitiesByPlayer[player])
     47    {
     48        warn("ConquestAddStructure: Unknown player " + player);
     49        return;
     50    }
     51
     52    if (this.conquestEntitiesByPlayer[player].entities.indexOf(msg.building) >= 0)
     53        return;
     54
     55    this.conquestEntitiesByPlayer[player].entities.push(msg.building);
     56}
     57
     58Trigger.prototype.ConquestTrainingFinished = function(msg)
     59{
     60    if (msg.owner == 0 || !this.conquestClassFilter || !msg.entities.length || !msg.entities.every(elem => TriggerHelper.EntityHasClass(elem, this.conquestClassFilter)))
     61        return;
     62
     63    let player = msg.owner;
     64    if (!this.conquestEntitiesByPlayer[player])
     65    {
     66        warn("ConquestTrainingFinished: Unknown player " + player);
     67        return;
     68    }
     69    this.conquestEntitiesByPlayer[player].entities.push(...msg.entities);
     70}
     71
     72Trigger.prototype.ConquestStartGameCount = function()
     73{
     74    if (!this.conquestClassFilter)
     75    {
     76        warn("ConquestStartGameCount: conquestClassFilter undefined");
     77        return;
     78    }
     79
     80    let cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
     81    let cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
     82
     83    cmpPlayerManager.GetAllPlayerEntities().forEach((elem, i) => {
     84        if (i == 0)
     85            return;
     86
     87        let filterEntity = ent => TriggerHelper.EntityHasClass(ent, this.conquestClassFilter)
     88            && !Engine.QueryInterface(ent, IID_Foundation);
     89        this.conquestEntitiesByPlayer[i] = {"player" : elem, "entities" : [...cmpRangeManager.GetEntitiesByPlayer(i).filter(filterEntity)]};
     90    });
     91
     92    this.conquestDataInit = true;
     93}
     94
     95var cmpTrigger = Engine.QueryInterface(SYSTEM_ENTITY, IID_Trigger);
     96
     97cmpTrigger.conquestEntitiesByPlayer = {};
     98cmpTrigger.conquestDataInit = false;
     99cmpTrigger.conquestClassFilter = "";
  • new file inaries/data/mods/public/maps/scripts/ConquestStructures.js

    diff --git a/binaries/data/mods/public/maps/scripts/ConquestStructures.js b/binaries/data/mods/public/maps/scripts/ConquestStructures.js
    new file mode 100644
    index 0000000..90672c4
    - +  
     1var cmpTrigger = Engine.QueryInterface(SYSTEM_ENTITY, IID_Trigger);
     2cmpTrigger.conquestClassFilter = "Structure";
     3
     4var data = {"enabled": true};
     5cmpTrigger.RegisterTrigger("OnOwnershipChanged", "ConquestHandlerOwnerShipChanged", data);
     6cmpTrigger.RegisterTrigger("OnStructureBuilt", "ConquestAddStructure", data);
     7
     8cmpTrigger.DoAfterDelay(0, "ConquestStartGameCount", null);
  • new file inaries/data/mods/public/maps/scripts/ConquestUnits.js

    diff --git a/binaries/data/mods/public/maps/scripts/ConquestUnits.js b/binaries/data/mods/public/maps/scripts/ConquestUnits.js
    new file mode 100644
    index 0000000..5d3754a
    - +  
     1var cmpTrigger = Engine.QueryInterface(SYSTEM_ENTITY, IID_Trigger);
     2cmpTrigger.conquestClassFilter = "Unit";
     3
     4var data = {"enabled": true};
     5cmpTrigger.RegisterTrigger("OnOwnershipChanged", "ConquestHandlerOwnerShipChanged", data);
     6cmpTrigger.RegisterTrigger("OnTrainingFinished", "ConquestTrainingFinished", data);
     7
     8cmpTrigger.DoAfterDelay(0, "ConquestStartGameCount", null);
  • binaries/data/mods/public/simulation/components/EndGameManager.js

    diff --git a/binaries/data/mods/public/simulation/components/EndGameManager.js b/binaries/data/mods/public/simulation/components/EndGameManager.js
    index 1b75b48..8209e0b 100644
    a b EndGameManager.prototype.MarkPlayerAsWon = function(playerID)  
    5050        if (playerID == cmpPlayer.GetPlayerID() || this.alliedVictory && cmpPlayer.IsMutualAlly(playerID))
    5151            cmpPlayer.SetState("won")
    5252        else
    53             Engine.PostMessage(playerEntityId, MT_PlayerDefeated, { "playerId": i } );
     53            Engine.PostMessage(playerEntityId, MT_PlayerDefeated, { "playerId": i, "skip": true } );
    5454    }
    5555
    5656    // Reveal the map to all players
    EndGameManager.prototype.SetAlliedVictory = function(flag)  
    6363    this.alliedVictory = flag;
    6464};
    6565
     66EndGameManager.prototype.OnGlobalPlayerDefeated = function(msg)
     67{
     68    if (msg.skip)
     69        return;
     70
     71    var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
     72    var cmpPlayers = [];
     73
     74    var allies = [];
     75    var onlyAlliesLeft = true;
     76
     77    var numPlayers = cmpPlayerManager.GetNumPlayers();
     78
     79    for (var i = 1; i < numPlayers; ++i)
     80    {
     81        cmpPlayers[i] = QueryPlayerIDInterface(i);
     82        if (cmpPlayers[i].GetState() != "active" || i == msg.playerId)
     83            return;
     84
     85        if (!allies.length || cmpPlayers[allies[0]].IsMutualAlly(i))
     86            allies.push(i);
     87        else
     88            onlyAlliesLeft = false;
     89    }
     90
     91    // check if there are winners, or the game needs to continue
     92    if (!allies.length || !onlyAlliesLeft || !(this.alliedVictory || allies.length == 1))
     93        return;
     94
     95    for each (var p in allies)
     96        cmpPlayers[p].SetState("won");
     97
     98    // Reveal the map to all players
     99    var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
     100    cmpRangeManager.SetLosRevealAll(-1, true);
     101}
     102
    66103Engine.RegisterSystemComponentType(IID_EndGameManager, "EndGameManager", EndGameManager);
  • binaries/data/mods/public/simulation/components/Player.js

    diff --git a/binaries/data/mods/public/simulation/components/Player.js b/binaries/data/mods/public/simulation/components/Player.js
    index 8406191..8bed7c2 100644
    a b Player.prototype.Init = function()  
    2727    this.teamsLocked = false;
    2828    this.state = "active"; // game state - one of "active", "defeated", "won"
    2929    this.diplomacy = [];    // array of diplomatic stances for this player with respect to other players (including gaia and self)
    30     this.conquestCriticalEntitiesCount = 0; // number of owned units with ConquestCritical class
    3130    this.formations = [];
    3231    this.startCam = undefined;
    3332    this.controlAllUnits = false;
    Player.prototype.SetState = function(newState)  
    337336    this.state = newState;
    338337};
    339338
    340 Player.prototype.GetConquestCriticalEntitiesCount = function()
    341 {
    342     return this.conquestCriticalEntitiesCount;
    343 };
    344 
    345339Player.prototype.GetTeam = function()
    346340{
    347341    return this.team;
    Player.prototype.OnGlobalOwnershipChanged = function(msg)  
    609603
    610604    if (msg.from == this.playerID)
    611605    {
    612         if (!cmpFoundation && cmpIdentity && cmpIdentity.HasClass("ConquestCritical"))
    613             this.conquestCriticalEntitiesCount--;
    614 
    615606        if (cmpCost)
    616607            this.popUsed -= cmpCost.GetPopCost();
    617608
    Player.prototype.OnGlobalOwnershipChanged = function(msg)  
    625616    }
    626617    if (msg.to == this.playerID)
    627618    {
    628         if (!cmpFoundation && cmpIdentity && cmpIdentity.HasClass("ConquestCritical"))
    629             this.conquestCriticalEntitiesCount++;
    630 
    631619        if (cmpCost)
    632620            this.popUsed += cmpCost.GetPopCost();
    633621
  • binaries/data/mods/public/simulation/components/tests/test_GuiInterface.js

    diff --git a/binaries/data/mods/public/simulation/components/tests/test_GuiInterface.js b/binaries/data/mods/public/simulation/components/tests/test_GuiInterface.js
    index eedb54d..fe3a7b4 100644
    a b AddMock(100, IID_Player, {  
    7878    GetLockTeams: function() { return false; },
    7979    GetCheatsEnabled: function() { return false; },
    8080    GetDiplomacy: function() { return [-1, 1]; },
    81     GetConquestCriticalEntitiesCount: function() { return 1; },
    8281    IsAlly: function() { return false; },
    8382    IsMutualAlly: function() { return false; },
    8483    IsNeutral: function() { return false; },
    AddMock(101, IID_Player, {  
    154153    GetLockTeams: function() {return false; },
    155154    GetCheatsEnabled: function() { return false; },
    156155    GetDiplomacy: function() { return [-1, 1]; },
    157     GetConquestCriticalEntitiesCount: function() { return 1; },
    158156    IsAlly: function() { return true; },
    159157    IsMutualAlly: function() {return false; },
    160158    IsNeutral: function() { return false; },