Ticket #2976: 2976.2.diff
File 2976.2.diff, 15.3 KB (added by , 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; 1 g_VictoryConditions.conquest = { 2 "name" : translate("Conquest"), 3 "description" : translate("Defeat all opponents"), 4 "scripts" : ["scripts/ConquestCommon.js", "scripts/TriggerHelper.js", "scripts/Conquest.js"] 12 5 }; 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
- + 1 g_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
- + 1 g_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; 1 g_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"] 12 5 }; 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 etc3 */4 Trigger.prototype.CheckConquestCriticalEntities = function()5 {6 if (this.checkingConquestCriticalEntities)7 return;8 // wait a turn for actually checking the players9 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 player20 var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);21 var cmpEndGameManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_EndGameManager);22 23 // Ignore gaia24 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 defeated31 // cache the cmpPlayer instances of the other players and search the allies32 for (var i = 1; i < numPlayers; i++)33 {34 // cmpPlayer should always exist for the player ids from 1 to numplayers35 // so no tests on the existance of cmpPlayer are needed36 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 else43 {44 if (!allies.length || cmpPlayers[allies[0]].IsMutualAlly(i))45 allies.push(i);46 else47 onlyAlliesLeft = false;48 }49 }50 51 // check if there are winners, or the game needs to continue52 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 players59 var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);60 cmpRangeManager.SetLosRevealAll(-1, true);61 };62 63 1 var cmpTrigger = Engine.QueryInterface(SYSTEM_ENTITY, IID_Trigger); 2 cmpTrigger.conquestClassFilter = "ConquestCritical"; 64 3 65 4 var 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; 5 cmpTrigger.RegisterTrigger("OnOwnershipChanged", "ConquestHandlerOwnerShipChanged", data); 6 cmpTrigger.RegisterTrigger("OnStructureBuilt", "ConquestAddStructure", data); 7 cmpTrigger.RegisterTrigger("OnTrainingFinished", "ConquestTrainingFinished", data); 70 8 9 cmpTrigger.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..9c204d8
- + 1 Trigger.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 33 Trigger.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 58 Trigger.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 72 Trigger.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 this.conquestEntitiesByPlayer[i] = {"entities" : []}; 88 this.conquestEntitiesByPlayer[i].player = elem; 89 let entities = cmpRangeManager.GetEntitiesByPlayer(i); 90 let filterEntity = ent => TriggerHelper.EntityHasClass(ent, this.conquestClassFilter) 91 && !Engine.QueryInterface(ent, IID_Foundation); 92 this.conquestEntitiesByPlayer[i].entities.push(...entities.filter(filterEntity)); 93 }); 94 95 this.conquestDataInit = true; 96 } 97 98 var cmpTrigger = Engine.QueryInterface(SYSTEM_ENTITY, IID_Trigger); 99 100 cmpTrigger.conquestEntitiesByPlayer = {}; 101 cmpTrigger.conquestDataInit = false; 102 cmpTrigger.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
- + 1 var cmpTrigger = Engine.QueryInterface(SYSTEM_ENTITY, IID_Trigger); 2 cmpTrigger.conquestClassFilter = "Structure"; 3 4 var data = {"enabled": true}; 5 cmpTrigger.RegisterTrigger("OnOwnershipChanged", "ConquestHandlerOwnerShipChanged", data); 6 cmpTrigger.RegisterTrigger("OnStructureBuilt", "ConquestAddStructure", data); 7 8 cmpTrigger.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
- + 1 var cmpTrigger = Engine.QueryInterface(SYSTEM_ENTITY, IID_Trigger); 2 cmpTrigger.conquestClassFilter = "Unit"; 3 4 var data = {"enabled": true}; 5 cmpTrigger.RegisterTrigger("OnOwnershipChanged", "ConquestHandlerOwnerShipChanged", data); 6 cmpTrigger.RegisterTrigger("OnTrainingFinished", "ConquestTrainingFinished", data); 7 8 cmpTrigger.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..59d0060 100644
a b EndGameManager.prototype.MarkPlayerAsWon = function(playerID) 50 50 if (playerID == cmpPlayer.GetPlayerID() || this.alliedVictory && cmpPlayer.IsMutualAlly(playerID)) 51 51 cmpPlayer.SetState("won") 52 52 else 53 Engine.PostMessage(playerEntityId, MT_PlayerDefeated, { "playerId": i } );53 Engine.PostMessage(playerEntityId, MT_PlayerDefeated, { "playerId": i, "skip": true } ); 54 54 } 55 55 56 56 // Reveal the map to all players … … EndGameManager.prototype.SetAlliedVictory = function(flag) 63 63 this.alliedVictory = flag; 64 64 }; 65 65 66 EndGameManager.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 cmpPlayerManager.GetAllPlayerEntities().forEach((elem, i) => { 78 if (i == 0) 79 return; 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 66 103 Engine.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() 27 27 this.teamsLocked = false; 28 28 this.state = "active"; // game state - one of "active", "defeated", "won" 29 29 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 class31 30 this.formations = []; 32 31 this.startCam = undefined; 33 32 this.controlAllUnits = false; … … Player.prototype.SetState = function(newState) 337 336 this.state = newState; 338 337 }; 339 338 340 Player.prototype.GetConquestCriticalEntitiesCount = function()341 {342 return this.conquestCriticalEntitiesCount;343 };344 345 339 Player.prototype.GetTeam = function() 346 340 { 347 341 return this.team; … … Player.prototype.OnGlobalOwnershipChanged = function(msg) 609 603 610 604 if (msg.from == this.playerID) 611 605 { 612 if (!cmpFoundation && cmpIdentity && cmpIdentity.HasClass("ConquestCritical"))613 this.conquestCriticalEntitiesCount--;614 615 606 if (cmpCost) 616 607 this.popUsed -= cmpCost.GetPopCost(); 617 608 … … Player.prototype.OnGlobalOwnershipChanged = function(msg) 625 616 } 626 617 if (msg.to == this.playerID) 627 618 { 628 if (!cmpFoundation && cmpIdentity && cmpIdentity.HasClass("ConquestCritical"))629 this.conquestCriticalEntitiesCount++;630 631 619 if (cmpCost) 632 620 this.popUsed += cmpCost.GetPopCost(); 633 621 -
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, { 78 78 GetLockTeams: function() { return false; }, 79 79 GetCheatsEnabled: function() { return false; }, 80 80 GetDiplomacy: function() { return [-1, 1]; }, 81 GetConquestCriticalEntitiesCount: function() { return 1; },82 81 IsAlly: function() { return false; }, 83 82 IsMutualAlly: function() { return false; }, 84 83 IsNeutral: function() { return false; }, … … AddMock(101, IID_Player, { 154 153 GetLockTeams: function() {return false; }, 155 154 GetCheatsEnabled: function() { return false; }, 156 155 GetDiplomacy: function() { return [-1, 1]; }, 157 GetConquestCriticalEntitiesCount: function() { return 1; },158 156 IsAlly: function() { return true; }, 159 157 IsMutualAlly: function() {return false; }, 160 158 IsNeutral: function() { return false; },