Ticket #2976: 2976.diff

File 2976.diff, 13.1 KB (added by trompetin17, 9 years ago)

Preview

  • 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..a8f953f 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;
    12 };
    13 */
    14 
    15 vc.scripts = ["scripts/Conquest.js"];
    16 
    17 g_VictoryConditions.conquest = vc;
    18 vc = null;
     1g_VictoryConditions.conquest = {
     2    "name" : translate("Conquest"),
     3    "description" : translate("Defeat all opponents"),
     4    "scripts" : ["scripts/ConquestBase.js", "scripts/TriggerHelper.js", "scripts/Conquest.js"]
     5};
     6 No newline at end of file
  • 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..ba8886c
    - +  
     1g_VictoryConditions.conquestStructure = {
     2    "name" : translate("Conquest Structure"),
     3    "description" : translate("Destroy all structures of enemies"),
     4    "scripts" : ["scripts/ConquestBase.js", "scripts/TriggerHelper.js", "scripts/ConquestStructures.js"]
     5};
     6 No newline at end of file
  • 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..421f457
    - +  
     1g_VictoryConditions.conquestStructure = {
     2    "name" : translate("Conquest Units"),
     3    "description" : translate("Destroy all units of enemies"),
     4    "scripts" : ["scripts/ConquestBase.js", "scripts/TriggerHelper.js", "scripts/ConquestUnits.js"]
     5};
     6 No newline at end of file
  • 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..65c2532 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;
    12 };
    13 */
    14 
    15 vc.scripts = ["scripts/Conquest.js", "scripts/WonderVictory.js"];
    16 
    17 g_VictoryConditions.wonder = vc;
    18 vc = null;
     1g_VictoryConditions.wonder = {
     2    "name" : translate("Wonder"),
     3    "description" : translate("Build a wonder to win"),
     4    "scripts" : ["scripts/Conquest.js", "scripts/WonderVictory.js"]
     5};
     6 No newline at end of file
  • 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..eda0de0 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.classFilter = "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", "HandlerOwnerShipChanged", data);
     6cmpTrigger.RegisterTrigger("OnStructureBuilt", "AddStructure", data);
     7cmpTrigger.RegisterTrigger("OnTrainingFinished", "TrainingFinished", data);
     8TrainingFinished
    709
     10cmpTrigger.DoAfterDelay(0, "StartGameCount", null);
  • new file inaries/data/mods/public/maps/scripts/ConquestBase.js

    diff --git a/binaries/data/mods/public/maps/scripts/ConquestBase.js b/binaries/data/mods/public/maps/scripts/ConquestBase.js
    new file mode 100644
    index 0000000..a6a3abc
    - +  
     1Trigger.prototype.HandlerOwnerShipChanged = function(msg)
     2{
     3    if (!this.dataInit || this.classFilter == "")
     4        return;
     5
     6    if (!TriggerHelper.EntityHasClass(msg.entity, this.classFilter))
     7        return;
     8
     9    if (msg.from == -1)
     10        return;
     11
     12    if (!this.entitiesByPlayer[msg.from])
     13    {
     14        warn("Unknow player " + msg.from);
     15        return;
     16    }
     17
     18    let entities = this.entitiesByPlayer[msg.from].entities;
     19    let index = entities.indexOf(msg.entity);
     20    if (index >= 0)
     21    {
     22        entities.splice(index, 1);
     23        if (entities.length == 0)
     24            Engine.PostMessage(this.entitiesByPlayer[msg.from].player, MT_PlayerDefeated, { "playerId": msg.from } );
     25    }
     26
     27    if (msg.to <= 0 || !this.entitiesByPlayer[msg.to])
     28        return;
     29
     30    let entitiesTo = this.entitiesByPlayer[msg.to].entities;
     31    entitiesTo.push(msg.entity);
     32}
     33
     34Trigger.prototype.AddStructure = function(msg)
     35{
     36    if (this.classFilter == "" || !TriggerHelper.EntityHasClass(msg.building, this.classFilter))
     37        return;
     38
     39    let cmpOwnership = Engine.QueryInterface(msg.building, IID_Ownership);
     40    if (!cmpOwnership)
     41    {
     42        warn("structure without Owner")
     43        return;
     44    }
     45
     46    let player = cmpOwnership.GetOwner();
     47    if (!this.entitiesByPlayer[player])
     48    {
     49        warn("Unknow player " + player);
     50        return;
     51    }
     52    this.entitiesByPlayer[player].entities.push(msg.building);
     53}
     54
     55Trigger.prototype.TrainingFinished = function(msg)
     56{
     57    if (this.classFilter == "" || !msg.entities.length || !msg.entities.every(elem => TriggerHelper.EntityHasClass(elem, this.classFilter)))
     58        return;
     59
     60    let player = msg.owner;
     61    if (!this.entitiesByPlayer[player])
     62    {
     63        warn("Unknow player " + player);
     64        return;
     65    }
     66    Array.prototype.push.apply(this.entitiesByPlayer[player].entities, msg.entities);
     67}
     68
     69Trigger.prototype.StartGameCount = function()
     70{
     71    if (this.classFilter == "")
     72    {
     73        warn("classFilter undefined");
     74        return;
     75    }
     76
     77    let cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
     78    let cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
     79    let numPlayers = cmpPlayerManager.GetNumPlayers();
     80    for (let i = 1; i < numPlayers; i++)
     81    {
     82        this.entitiesByPlayer[i] = {"entities" : []};
     83        this.entitiesByPlayer[i].player = cmpPlayerManager.GetPlayerByID(i);
     84        let entities = cmpRangeManager.GetEntitiesByPlayer(i);
     85        for (let entity of entities)
     86        {
     87            if (!TriggerHelper.EntityHasClass(+entity, this.classFilter))
     88                continue;
     89            if (Engine.QueryInterface(+entity, IID_Foundation))
     90                continue;
     91            this.entitiesByPlayer[i].entities.push(+entity);
     92        }
     93    }
     94    this.dataInit = true;
     95}
     96
     97var cmpTrigger = Engine.QueryInterface(SYSTEM_ENTITY, IID_Trigger);
     98
     99cmpTrigger.entitiesByPlayer = {};
     100cmpTrigger.dataInit = false;
     101cmpTrigger.classFilter = "";
     102 No newline at end of file
  • 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..4135fd4
    - +  
     1var cmpTrigger = Engine.QueryInterface(SYSTEM_ENTITY, IID_Trigger);
     2cmpTrigger.classFilter = "Structure";
     3
     4var data = {"enabled": true};
     5cmpTrigger.RegisterTrigger("OnOwnershipChanged", "HandlerOwnerShipChanged", data);
     6cmpTrigger.RegisterTrigger("OnStructureBuilt", "AddStructure", data);
     7
     8cmpTrigger.DoAfterDelay(0, "StartGameCount", null);
     9 No newline at end of file
  • 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..fd36133
    - +  
     1var cmpTrigger = Engine.QueryInterface(SYSTEM_ENTITY, IID_Trigger);
     2cmpTrigger.classFilter = "Unit";
     3
     4var data = {"enabled": true};
     5cmpTrigger.RegisterTrigger("OnOwnershipChanged", "HandlerOwnerShipChanged", data);
     6cmpTrigger.RegisterTrigger("OnTrainingFinished", "TrainingFinished", data);
     7
     8
     9cmpTrigger.DoAfterDelay(0, "StartGameCount", null);
     10 No newline at end of file
  • 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..062e32d 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   
     73    // Ignore gaia
     74    var numPlayers = cmpPlayerManager.GetNumPlayers();
     75    var cmpPlayers = [];
     76   
     77    var allies = [];
     78    var onlyAlliesLeft = true;
     79    // If the player is currently active but needs to be defeated,
     80    // mark that player as defeated
     81    // cache the cmpPlayer instances of the other players and search the allies
     82    for (var i = 1; i < numPlayers; i++)
     83    {
     84        // cmpPlayer should always exist for the player ids from 1 to numplayers
     85        // so no tests on the existance of cmpPlayer are needed
     86        var playerEntityId = cmpPlayerManager.GetPlayerByID(i);
     87        cmpPlayers[i] = Engine.QueryInterface(playerEntityId, IID_Player);
     88        if (cmpPlayers[i].GetState() != "active")
     89            continue;
     90
     91        if (!allies.length || cmpPlayers[allies[0]].IsMutualAlly(i))
     92            allies.push(i);
     93        else
     94            onlyAlliesLeft = false;
     95    }
     96
     97    // check if there are winners, or the game needs to continue
     98    if (!allies.length || !onlyAlliesLeft || !(this.alliedVictory || allies.length == 1))
     99        return;
     100
     101    for each (var p in allies)
     102        cmpPlayers[p].SetState("won");
     103
     104    // Reveal the map to all players
     105    var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
     106    cmpRangeManager.SetLosRevealAll(-1, true);
     107}
     108
    66109Engine.RegisterSystemComponentType(IID_EndGameManager, "EndGameManager", EndGameManager);
  • binaries/data/mods/public/simulation/components/Trigger.js

    diff --git a/binaries/data/mods/public/simulation/components/Trigger.js b/binaries/data/mods/public/simulation/components/Trigger.js
    index 99bbddb..343d72c 100644
    a b Trigger.prototype.eventNames =  
    1818    "PlayerCommand",
    1919    "Interval",
    2020    "Range",
    21     "TreasureCollected",
     21    "TreasureCollected"
    2222];
    2323
    2424Trigger.prototype.Init = function()