1
0
forked from 0ad/0ad

TriggerHelper functions to retrieve entities by player and by class.

Removes repetitive RangeManager and Identity component querying from
triggerscripts.
It means that mostly map specific logic remains in the triggerscript.
This should bring TriggerScript coding a bit closer to map authors who
aren't exactly software developers.
Call the RangeManager entity getters on Danubius and Survival multiple
times on init to further simplify code, as these microseconds on init
are irrelevant.

This was SVN commit r21459.
This commit is contained in:
elexis 2018-03-07 13:54:58 +00:00
parent 3f7ea11059
commit 14da2f841f
4 changed files with 52 additions and 63 deletions

View File

@ -195,7 +195,7 @@ Trigger.prototype.debugLog = function(txt)
Math.round(Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer).GetTime() / 60 / 1000) + "] " + txt + "\n"); Math.round(Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer).GetTime() / 60 / 1000) + "] " + txt + "\n");
}; };
Trigger.prototype.GarrisonAllGallicBuildings = function(gaiaEnts) Trigger.prototype.GarrisonAllGallicBuildings = function()
{ {
this.debugLog("Garrisoning all gallic buildings"); this.debugLog("Garrisoning all gallic buildings");
@ -210,22 +210,14 @@ Trigger.prototype.GarrisonAllGallicBuildings = function(gaiaEnts)
/** /**
* Spawn units of the template at each gaia Civic Center and set them to defensive. * Spawn units of the template at each gaia Civic Center and set them to defensive.
*/ */
Trigger.prototype.SpawnInitialCCDefenders = function(gaiaEnts) Trigger.prototype.SpawnInitialCCDefenders = function()
{ {
this.debugLog("To defend CCs, spawning " + uneval(ccDefenders)); this.debugLog("To defend CCs, spawning " + uneval(ccDefenders));
for (let gaiaEnt of gaiaEnts) for (let ent of this.civicCenters)
{
let cmpIdentity = Engine.QueryInterface(gaiaEnt, IID_Identity);
if (!cmpIdentity || !cmpIdentity.HasClass("CivCentre"))
continue;
this.civicCenters.add(gaiaEnt);
for (let ccDefender of ccDefenders) for (let ccDefender of ccDefenders)
for (let ent of TriggerHelper.SpawnUnits(gaiaEnt, pickRandom(ccDefender.templates), ccDefender.count, gaulPlayer)) for (let ent of TriggerHelper.SpawnUnits(ent, pickRandom(ccDefender.templates), ccDefender.count, gaulPlayer))
TriggerHelper.SetUnitStance(ent, "defensive"); TriggerHelper.SetUnitStance(ent, "defensive");
}
}; };
Trigger.prototype.SpawnCCAttackers = function() Trigger.prototype.SpawnCCAttackers = function()
@ -270,14 +262,10 @@ Trigger.prototype.SpawnCCAttackers = function()
* Remember most Humans present at the beginning of the match (before spawning any unit) and * Remember most Humans present at the beginning of the match (before spawning any unit) and
* make them defensive. * make them defensive.
*/ */
Trigger.prototype.StartCelticRitual = function(gaiaEnts) Trigger.prototype.StartCelticRitual = function()
{ {
for (let ent of gaiaEnts) for (let ent of TriggerHelper.GetPlayerEntitiesByClass(gaulPlayer, "Human"))
{ {
let cmpIdentity = Engine.QueryInterface(ent, IID_Identity);
if (!cmpIdentity || !cmpIdentity.HasClass("Human"))
continue;
if (randBool(ritualProbability)) if (randBool(ritualProbability))
this.ritualEnts.add(ent); this.ritualEnts.add(ent);
@ -336,7 +324,7 @@ Trigger.prototype.SpawnShips = function()
gaulPlayer)[0]); gaulPlayer)[0]);
for (let ship of this.ships) for (let ship of this.ships)
this.AttackAndPatrol([ship], shipTargetClass, triggerPointShipPatrol, "Ships"); this.AttackAndPatrol([ship], shipTargetClass, triggerPointShipPatrol, "Ship");
this.DoAfterDelay(shipRespawnTime(time) * 60 * 1000, "SpawnShips", {}); this.DoAfterDelay(shipRespawnTime(time) * 60 * 1000, "SpawnShips", {});
@ -408,13 +396,8 @@ Trigger.prototype.AttackAndPatrol = function(attackers, targetClass, triggerPoin
if (!attackers.length) if (!attackers.length)
return; return;
let allTargets = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager).GetNonGaiaEntities().filter(ent => { let targets = TriggerHelper.MatchEntitiesByClass(TriggerHelper.GetAllPlayersEntities(), targetClass).sort(
let cmpIdentity = Engine.QueryInterface(ent, IID_Identity); (ent1, ent2) => DistanceBetweenEntities(attackers[0], ent1) - DistanceBetweenEntities(attackers[0], ent2)).slice(0, targetCount);
return cmpIdentity && MatchesClassList(cmpIdentity.GetClassesList(), targetClass);
});
let targets = allTargets.sort((ent1, ent2) =>
DistanceBetweenEntities(attackers[0], ent1) - DistanceBetweenEntities(attackers[0], ent2)).slice(0, targetCount);
this.debugLog(debugName + " " + uneval(attackers) + " attack " + uneval(targets)); this.debugLog(debugName + " " + uneval(attackers) + " attack " + uneval(targets));
@ -458,12 +441,8 @@ Trigger.prototype.GetActiveRiversides = function()
let left = false; let left = false;
let right = false; let right = false;
for (let ent of Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager).GetNonGaiaEntities()) for (let ent of TriggerHelper.GetAllPlayersEntitiesByClass(siegeTargetClass))
{ {
let cmpIdentity = Engine.QueryInterface(ent, IID_Identity);
if (!cmpIdentity || !cmpIdentity.HasClass(siegeTargetClass))
continue;
if (this.IsLeftRiverside(ent)) if (this.IsLeftRiverside(ent))
left = true; left = true;
else else
@ -603,7 +582,7 @@ Trigger.prototype.InitDanubius = function()
this.heroes = new Set(); this.heroes = new Set();
// Remember gaia CCs to spawn attackers from // Remember gaia CCs to spawn attackers from
this.civicCenters = new Set(); this.civicCenters = new Set(TriggerHelper.GetPlayerEntitiesByClass(gaulPlayer, "CivCentre"))
// Maps from gaia ship entity ID to ungarrison trigger point entity ID and land patrol triggerpoint name // Maps from gaia ship entity ID to ungarrison trigger point entity ID and land patrol triggerpoint name
this.shipTarget = {}; this.shipTarget = {};
@ -616,10 +595,9 @@ Trigger.prototype.InitDanubius = function()
Engine.QueryInterface(this.GetTriggerPoints(triggerPointRiverDirection)[0], IID_Position).GetPosition2D(), Engine.QueryInterface(this.GetTriggerPoints(triggerPointRiverDirection)[0], IID_Position).GetPosition2D(),
this.mapCenter); this.mapCenter);
let gaiaEnts = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager).GetEntitiesByPlayer(0); this.StartCelticRitual();
this.StartCelticRitual(gaiaEnts); this.GarrisonAllGallicBuildings();
this.GarrisonAllGallicBuildings(gaiaEnts); this.SpawnInitialCCDefenders();
this.SpawnInitialCCDefenders(gaiaEnts);
this.SpawnCCAttackers(); this.SpawnCCAttackers();
this.SpawnShips(); this.SpawnShips();

View File

@ -1,3 +1,5 @@
var elephantinePlayerID = 0;
Trigger.prototype.InitElephantine = function() Trigger.prototype.InitElephantine = function()
{ {
this.InitElephantine_DefenderStance(); this.InitElephantine_DefenderStance();
@ -6,12 +8,8 @@ Trigger.prototype.InitElephantine = function()
Trigger.prototype.InitElephantine_DefenderStance = function() Trigger.prototype.InitElephantine_DefenderStance = function()
{ {
for (let ent of Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager).GetEntitiesByPlayer(0)) for (let ent of TriggerHelper.GetPlayerEntitiesByClass(elephantinePlayerID, "Soldier"))
{ TriggerHelper.SetUnitStance(ent, "defensive")
let cmpIdentity = Engine.QueryInterface(ent, IID_Identity);
if (cmpIdentity && cmpIdentity.HasClass("Soldier"))
TriggerHelper.SetUnitStance(ent, "defensive");
}
}; };
Trigger.prototype.InitElephantine_GarrisonBuildings = function() Trigger.prototype.InitElephantine_GarrisonBuildings = function()
@ -19,10 +17,10 @@ Trigger.prototype.InitElephantine_GarrisonBuildings = function()
let kushInfantryUnits = TriggerHelper.GetTemplateNamesByClasses("CitizenSoldier+Infantry", "kush", undefined, "Elite", true); let kushInfantryUnits = TriggerHelper.GetTemplateNamesByClasses("CitizenSoldier+Infantry", "kush", undefined, "Elite", true);
let kushSupportUnits = TriggerHelper.GetTemplateNamesByClasses("FemaleCitizen Healer", "kush", undefined, "Elite", true); let kushSupportUnits = TriggerHelper.GetTemplateNamesByClasses("FemaleCitizen Healer", "kush", undefined, "Elite", true);
TriggerHelper.SpawnAndGarrisonAtClasses(0, "Tower", kushInfantryUnits, 1); TriggerHelper.SpawnAndGarrisonAtClasses(elephantinePlayerID, "Tower", kushInfantryUnits, 1);
for (let identityClass of ["Wonder", "Temple", "Pyramid"]) for (let identityClass of ["Wonder", "Temple", "Pyramid"])
TriggerHelper.SpawnAndGarrisonAtClasses(0, identityClass, kushInfantryUnits.concat(kushSupportUnits), 1); TriggerHelper.SpawnAndGarrisonAtClasses(elephantinePlayerID, identityClass, kushInfantryUnits.concat(kushSupportUnits), 1);
}; };
{ {

View File

@ -148,23 +148,11 @@ Trigger.prototype.SetDisableTemplates = function()
*/ */
Trigger.prototype.InitStartingUnits = function() Trigger.prototype.InitStartingUnits = function()
{ {
let cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager); for (let playerID = 1; playerID < TriggerHelper.GetNumberOfPlayers(); ++playerID)
for (let i = 1; i < TriggerHelper.GetNumberOfPlayers(); ++i)
{ {
let playerEntities = cmpRangeManager.GetEntitiesByPlayer(i); this.playerCivicCenter[playerID] = TriggerHelper.GetPlayerEntitiesByClass(playerID, "CivilCentre")[0];
this.treasureFemale[playerID] = TriggerHelper.GetPlayerEntitiesByClass(playerID, "FemaleCitizen")[0];
for (let entity of playerEntities) Engine.QueryInterface(this.treasureFemale[playerID], IID_DamageReceiver).SetInvulnerability(true);
{
if (TriggerHelper.EntityMatchesClassList(entity, "CivilCentre"))
this.playerCivicCenter[i] = entity;
else if (TriggerHelper.EntityMatchesClassList(entity, "FemaleCitizen"))
{
this.treasureFemale[i] = entity;
let cmpDamageReceiver = Engine.QueryInterface(entity, IID_DamageReceiver);
cmpDamageReceiver.SetInvulnerability(true);
}
}
} }
}; };

View File

@ -21,6 +21,16 @@ TriggerHelper.GetOwner = function(ent)
return -1; return -1;
}; };
TriggerHelper.GetEntitiesByPlayer = function(playerID)
{
return Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager).GetEntitiesByPlayer(playerID);
};
TriggerHelper.GetAllPlayersEntities = function()
{
return Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager).GetNonGaiaEntities();
};
TriggerHelper.SetUnitStance = function(ent, stance) TriggerHelper.SetUnitStance = function(ent, stance)
{ {
let cmpUnitAI = Engine.QueryInterface(ent, IID_UnitAI); let cmpUnitAI = Engine.QueryInterface(ent, IID_UnitAI);
@ -212,12 +222,27 @@ TriggerHelper.GetNumberOfPlayers = function()
* See globalscripts/Templates.js for details of MatchesClassList. * See globalscripts/Templates.js for details of MatchesClassList.
* *
* @param entity - ID of the entity that we want to check for classes. * @param entity - ID of the entity that we want to check for classes.
* @param classlist - List of the classes we are checking if the entity matches. * @param classes - List of the classes we are checking if the entity matches.
*/ */
TriggerHelper.EntityMatchesClassList = function(entity, classlist) TriggerHelper.EntityMatchesClassList = function(entity, classes)
{ {
let cmpIdentity = Engine.QueryInterface(entity, IID_Identity); let cmpIdentity = Engine.QueryInterface(entity, IID_Identity);
return cmpIdentity && MatchesClassList(cmpIdentity.GetClassesList(), classlist); return cmpIdentity && MatchesClassList(cmpIdentity.GetClassesList(), classes);
};
TriggerHelper.MatchEntitiesByClass = function(entities, classes)
{
return entities.filter(ent => TriggerHelper.EntityMatchesClassList(ent, classes));
};
TriggerHelper.GetPlayerEntitiesByClass = function(playerID, classes)
{
return TriggerHelper.MatchEntitiesByClass(TriggerHelper.GetEntitiesByPlayer(playerID), classes);
};
TriggerHelper.GetAllPlayersEntitiesByClass = function(playerID, classes)
{
return TriggerHelper.MatchEntitiesByClass(TriggerHelper.GetAllPlayersEntities(), classes);
}; };
/** /**