Added Conquest Strutures and Conquest Units in victory modes, fixes #2976, refs #1649

This was SVN commit r16634.
This commit is contained in:
trompetin17 2015-05-08 03:06:14 +00:00
parent 399daeddbf
commit e4a5d5b4dd
11 changed files with 176 additions and 115 deletions

View file

@ -1,18 +1,5 @@
var vc = {};
vc.name = translate("Conquest");
vc.description = translate("Defeat all opponents");
/*
NOT SUPPORTED YET
vc.requirementsCheck = function(mapSettings)
{
// nothing required
return true;
g_VictoryConditions.conquest = {
"name" : translate("Conquest"),
"description" : translate("Defeat all opponents"),
"scripts" : ["scripts/ConquestCommon.js", "scripts/TriggerHelper.js", "scripts/Conquest.js"]
};
*/
vc.scripts = ["scripts/Conquest.js"];
g_VictoryConditions.conquest = vc;
vc = null;

View file

@ -0,0 +1,5 @@
g_VictoryConditions.conquestStructure = {
"name" : translate("Conquest Structure"),
"description" : translate("Destroy all structures of enemies"),
"scripts" : ["scripts/ConquestCommon.js", "scripts/TriggerHelper.js", "scripts/ConquestStructures.js"]
};

View file

@ -0,0 +1,5 @@
g_VictoryConditions.conquestUnits = {
"name" : translate("Conquest Units"),
"description" : translate("Destroy all units of enemies"),
"scripts" : ["scripts/ConquestCommon.js", "scripts/TriggerHelper.js", "scripts/ConquestUnits.js"]
};

View file

@ -1,18 +1,5 @@
var vc = {};
vc.name = translate("Wonder");
vc.description = translate("Build a wonder to win");
/*
NOT SUPPORTED YET
vc.requirementsCheck = function(mapSettings)
{
// nothing required
return true;
g_VictoryConditions.wonder = {
"name" : translate("Wonder"),
"description" : translate("Build a wonder to win"),
"scripts" : ["scripts/ConquestCommon.js", "scripts/TriggerHelper.js", "scripts/Conquest.js", "scripts/WonderVictory.js"]
};
*/
vc.scripts = ["scripts/Conquest.js", "scripts/WonderVictory.js"];
g_VictoryConditions.wonder = vc;
vc = null;

View file

@ -1,70 +1,9 @@
/*
* Check players the next turn. Avoids problems in Atlas, with promoting entities etc
*/
Trigger.prototype.CheckConquestCriticalEntities = function()
{
if (this.checkingConquestCriticalEntities)
return;
// wait a turn for actually checking the players
this.DoAfterDelay(0, "CheckConquestCriticalEntitiesNow", null);
this.checkingConquestCriticalEntities = true;
};
/*
* Check players immediately. Might cause problems with converting/promoting entities.
*/
Trigger.prototype.CheckConquestCriticalEntitiesNow = function()
{
this.checkingConquestCriticalEntities = false;
// for all other game types, defeat that player
var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
var cmpEndGameManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_EndGameManager);
// Ignore gaia
var numPlayers = cmpPlayerManager.GetNumPlayers();
var cmpPlayers = [];
var allies = [];
var onlyAlliesLeft = true;
// If the player is currently active but needs to be defeated,
// mark that player as defeated
// cache the cmpPlayer instances of the other players and search the allies
for (var i = 1; i < numPlayers; i++)
{
// cmpPlayer should always exist for the player ids from 1 to numplayers
// so no tests on the existance of cmpPlayer are needed
var playerEntityId = cmpPlayerManager.GetPlayerByID(i);
cmpPlayers[i] = Engine.QueryInterface(playerEntityId, IID_Player);
if (cmpPlayers[i].GetState() != "active")
continue;
if (cmpPlayers[i].GetConquestCriticalEntitiesCount() == 0)
Engine.PostMessage(playerEntityId, MT_PlayerDefeated, { "playerId": i } );
else
{
if (!allies.length || cmpPlayers[allies[0]].IsMutualAlly(i))
allies.push(i);
else
onlyAlliesLeft = false;
}
}
// check if there are winners, or the game needs to continue
if (!allies.length || !onlyAlliesLeft || !(cmpEndGameManager.alliedVictory || allies.length == 1))
return;
for each (var p in allies)
cmpPlayers[p].SetState("won");
// Reveal the map to all players
var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
cmpRangeManager.SetLosRevealAll(-1, true);
};
var cmpTrigger = Engine.QueryInterface(SYSTEM_ENTITY, IID_Trigger);
cmpTrigger.conquestClassFilter = "ConquestCritical";
var data = {"enabled": true};
cmpTrigger.RegisterTrigger("OnOwnershipChanged", "CheckConquestCriticalEntities", data);
// also check at the start of the game
cmpTrigger.DoAfterDelay(0, "CheckConquestCriticalEntitiesNow", null);
cmpTrigger.checkingConquestCriticalEntities = false;
cmpTrigger.RegisterTrigger("OnOwnershipChanged", "ConquestHandlerOwnerShipChanged", data);
cmpTrigger.RegisterTrigger("OnStructureBuilt", "ConquestAddStructure", data);
cmpTrigger.RegisterTrigger("OnTrainingFinished", "ConquestTrainingFinished", data);
cmpTrigger.DoAfterDelay(0, "ConquestStartGameCount", null);

View file

@ -0,0 +1,99 @@
Trigger.prototype.ConquestHandlerOwnerShipChanged = function(msg)
{
if (!this.conquestDataInit || !this.conquestClassFilter)
return;
if (!TriggerHelper.EntityHasClass(msg.entity, this.conquestClassFilter))
return;
if (msg.from == -1)
return;
if (msg.to > 0 && this.conquestEntitiesByPlayer[msg.to])
this.conquestEntitiesByPlayer[msg.to].entities.push(msg.entity);
if (!this.conquestEntitiesByPlayer[msg.from])
{
if (msg.from)
warn("ConquestHandlerOwnerShipChanged: Unknow player " + msg.from);
return;
}
let entities = this.conquestEntitiesByPlayer[msg.from].entities;
let index = entities.indexOf(msg.entity);
if (index >= 0)
{
entities.splice(index, 1);
if (!entities.length)
Engine.PostMessage(this.conquestEntitiesByPlayer[msg.from].player, MT_PlayerDefeated, { "playerId": msg.from } );
}
}
Trigger.prototype.ConquestAddStructure = function(msg)
{
if (!this.conquestClassFilter || !TriggerHelper.EntityHasClass(msg.building, this.conquestClassFilter))
return;
let cmpOwnership = Engine.QueryInterface(msg.building, IID_Ownership);
if (!cmpOwnership)
{
warn("ConquestAddStructure: Structure without Owner");
return;
}
let player = cmpOwnership.GetOwner();
if (!this.conquestEntitiesByPlayer[player])
{
warn("ConquestAddStructure: Unknown player " + player);
return;
}
if (this.conquestEntitiesByPlayer[player].entities.indexOf(msg.building) >= 0)
return;
this.conquestEntitiesByPlayer[player].entities.push(msg.building);
}
Trigger.prototype.ConquestTrainingFinished = function(msg)
{
if (msg.owner == 0 || !this.conquestClassFilter || !msg.entities.length || !msg.entities.every(elem => TriggerHelper.EntityHasClass(elem, this.conquestClassFilter)))
return;
let player = msg.owner;
if (!this.conquestEntitiesByPlayer[player])
{
warn("ConquestTrainingFinished: Unknown player " + player);
return;
}
this.conquestEntitiesByPlayer[player].entities.push(...msg.entities);
}
Trigger.prototype.ConquestStartGameCount = function()
{
if (!this.conquestClassFilter)
{
warn("ConquestStartGameCount: conquestClassFilter undefined");
return;
}
let cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
let cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
cmpPlayerManager.GetAllPlayerEntities().forEach((elem, i) => {
if (i == 0)
return;
let filterEntity = ent => TriggerHelper.EntityHasClass(ent, this.conquestClassFilter)
&& !Engine.QueryInterface(ent, IID_Foundation);
this.conquestEntitiesByPlayer[i] = {"player" : elem, "entities" : [...cmpRangeManager.GetEntitiesByPlayer(i).filter(filterEntity)]};
});
this.conquestDataInit = true;
}
var cmpTrigger = Engine.QueryInterface(SYSTEM_ENTITY, IID_Trigger);
cmpTrigger.conquestEntitiesByPlayer = {};
cmpTrigger.conquestDataInit = false;
cmpTrigger.conquestClassFilter = "";

View file

@ -0,0 +1,8 @@
var cmpTrigger = Engine.QueryInterface(SYSTEM_ENTITY, IID_Trigger);
cmpTrigger.conquestClassFilter = "Structure";
var data = {"enabled": true};
cmpTrigger.RegisterTrigger("OnOwnershipChanged", "ConquestHandlerOwnerShipChanged", data);
cmpTrigger.RegisterTrigger("OnStructureBuilt", "ConquestAddStructure", data);
cmpTrigger.DoAfterDelay(0, "ConquestStartGameCount", null);

View file

@ -0,0 +1,8 @@
var cmpTrigger = Engine.QueryInterface(SYSTEM_ENTITY, IID_Trigger);
cmpTrigger.conquestClassFilter = "Unit";
var data = {"enabled": true};
cmpTrigger.RegisterTrigger("OnOwnershipChanged", "ConquestHandlerOwnerShipChanged", data);
cmpTrigger.RegisterTrigger("OnTrainingFinished", "ConquestTrainingFinished", data);
cmpTrigger.DoAfterDelay(0, "ConquestStartGameCount", null);

View file

@ -50,7 +50,7 @@ EndGameManager.prototype.MarkPlayerAsWon = function(playerID)
if (playerID == cmpPlayer.GetPlayerID() || this.alliedVictory && cmpPlayer.IsMutualAlly(playerID))
cmpPlayer.SetState("won")
else
Engine.PostMessage(playerEntityId, MT_PlayerDefeated, { "playerId": i } );
Engine.PostMessage(playerEntityId, MT_PlayerDefeated, { "playerId": i, "skip": true } );
}
// Reveal the map to all players
@ -63,4 +63,41 @@ EndGameManager.prototype.SetAlliedVictory = function(flag)
this.alliedVictory = flag;
};
EndGameManager.prototype.OnGlobalPlayerDefeated = function(msg)
{
if (msg.skip)
return;
var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
var cmpPlayers = [];
var allies = [];
var onlyAlliesLeft = true;
var numPlayers = cmpPlayerManager.GetNumPlayers();
for (var i = 1; i < numPlayers; ++i)
{
cmpPlayers[i] = QueryPlayerIDInterface(i);
if (cmpPlayers[i].GetState() != "active" || i == msg.playerId)
return;
if (!allies.length || cmpPlayers[allies[0]].IsMutualAlly(i))
allies.push(i);
else
onlyAlliesLeft = false;
}
// check if there are winners, or the game needs to continue
if (!allies.length || !onlyAlliesLeft || !(this.alliedVictory || allies.length == 1))
return;
for each (var p in allies)
cmpPlayers[p].SetState("won");
// Reveal the map to all players
var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
cmpRangeManager.SetLosRevealAll(-1, true);
}
Engine.RegisterSystemComponentType(IID_EndGameManager, "EndGameManager", EndGameManager);

View file

@ -27,7 +27,6 @@ Player.prototype.Init = function()
this.teamsLocked = false;
this.state = "active"; // game state - one of "active", "defeated", "won"
this.diplomacy = []; // array of diplomatic stances for this player with respect to other players (including gaia and self)
this.conquestCriticalEntitiesCount = 0; // number of owned units with ConquestCritical class
this.formations = [];
this.startCam = undefined;
this.controlAllUnits = false;
@ -337,11 +336,6 @@ Player.prototype.SetState = function(newState)
this.state = newState;
};
Player.prototype.GetConquestCriticalEntitiesCount = function()
{
return this.conquestCriticalEntitiesCount;
};
Player.prototype.GetTeam = function()
{
return this.team;
@ -609,9 +603,6 @@ Player.prototype.OnGlobalOwnershipChanged = function(msg)
if (msg.from == this.playerID)
{
if (!cmpFoundation && cmpIdentity && cmpIdentity.HasClass("ConquestCritical"))
this.conquestCriticalEntitiesCount--;
if (cmpCost)
this.popUsed -= cmpCost.GetPopCost();
@ -625,9 +616,6 @@ Player.prototype.OnGlobalOwnershipChanged = function(msg)
}
if (msg.to == this.playerID)
{
if (!cmpFoundation && cmpIdentity && cmpIdentity.HasClass("ConquestCritical"))
this.conquestCriticalEntitiesCount++;
if (cmpCost)
this.popUsed += cmpCost.GetPopCost();

View file

@ -78,7 +78,6 @@ AddMock(100, IID_Player, {
GetLockTeams: function() { return false; },
GetCheatsEnabled: function() { return false; },
GetDiplomacy: function() { return [-1, 1]; },
GetConquestCriticalEntitiesCount: function() { return 1; },
IsAlly: function() { return false; },
IsMutualAlly: function() { return false; },
IsNeutral: function() { return false; },
@ -154,7 +153,6 @@ AddMock(101, IID_Player, {
GetLockTeams: function() {return false; },
GetCheatsEnabled: function() { return false; },
GetDiplomacy: function() { return [-1, 1]; },
GetConquestCriticalEntitiesCount: function() { return 1; },
IsAlly: function() { return true; },
IsMutualAlly: function() {return false; },
IsNeutral: function() { return false; },