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:
parent
3f7ea11059
commit
14da2f841f
@ -195,7 +195,7 @@ Trigger.prototype.debugLog = function(txt)
|
||||
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");
|
||||
|
||||
@ -210,22 +210,14 @@ Trigger.prototype.GarrisonAllGallicBuildings = function(gaiaEnts)
|
||||
/**
|
||||
* 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));
|
||||
|
||||
for (let gaiaEnt of gaiaEnts)
|
||||
{
|
||||
let cmpIdentity = Engine.QueryInterface(gaiaEnt, IID_Identity);
|
||||
if (!cmpIdentity || !cmpIdentity.HasClass("CivCentre"))
|
||||
continue;
|
||||
|
||||
this.civicCenters.add(gaiaEnt);
|
||||
|
||||
for (let ent of this.civicCenters)
|
||||
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");
|
||||
}
|
||||
};
|
||||
|
||||
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
|
||||
* 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))
|
||||
this.ritualEnts.add(ent);
|
||||
|
||||
@ -336,7 +324,7 @@ Trigger.prototype.SpawnShips = function()
|
||||
gaulPlayer)[0]);
|
||||
|
||||
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", {});
|
||||
|
||||
@ -408,13 +396,8 @@ Trigger.prototype.AttackAndPatrol = function(attackers, targetClass, triggerPoin
|
||||
if (!attackers.length)
|
||||
return;
|
||||
|
||||
let allTargets = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager).GetNonGaiaEntities().filter(ent => {
|
||||
let cmpIdentity = Engine.QueryInterface(ent, IID_Identity);
|
||||
return cmpIdentity && MatchesClassList(cmpIdentity.GetClassesList(), targetClass);
|
||||
});
|
||||
|
||||
let targets = allTargets.sort((ent1, ent2) =>
|
||||
DistanceBetweenEntities(attackers[0], ent1) - DistanceBetweenEntities(attackers[0], ent2)).slice(0, targetCount);
|
||||
let targets = TriggerHelper.MatchEntitiesByClass(TriggerHelper.GetAllPlayersEntities(), targetClass).sort(
|
||||
(ent1, ent2) => DistanceBetweenEntities(attackers[0], ent1) - DistanceBetweenEntities(attackers[0], ent2)).slice(0, targetCount);
|
||||
|
||||
this.debugLog(debugName + " " + uneval(attackers) + " attack " + uneval(targets));
|
||||
|
||||
@ -458,12 +441,8 @@ Trigger.prototype.GetActiveRiversides = function()
|
||||
let left = 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))
|
||||
left = true;
|
||||
else
|
||||
@ -603,7 +582,7 @@ Trigger.prototype.InitDanubius = function()
|
||||
this.heroes = new Set();
|
||||
|
||||
// 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
|
||||
this.shipTarget = {};
|
||||
@ -616,10 +595,9 @@ Trigger.prototype.InitDanubius = function()
|
||||
Engine.QueryInterface(this.GetTriggerPoints(triggerPointRiverDirection)[0], IID_Position).GetPosition2D(),
|
||||
this.mapCenter);
|
||||
|
||||
let gaiaEnts = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager).GetEntitiesByPlayer(0);
|
||||
this.StartCelticRitual(gaiaEnts);
|
||||
this.GarrisonAllGallicBuildings(gaiaEnts);
|
||||
this.SpawnInitialCCDefenders(gaiaEnts);
|
||||
this.StartCelticRitual();
|
||||
this.GarrisonAllGallicBuildings();
|
||||
this.SpawnInitialCCDefenders();
|
||||
this.SpawnCCAttackers();
|
||||
|
||||
this.SpawnShips();
|
||||
|
@ -1,3 +1,5 @@
|
||||
var elephantinePlayerID = 0;
|
||||
|
||||
Trigger.prototype.InitElephantine = function()
|
||||
{
|
||||
this.InitElephantine_DefenderStance();
|
||||
@ -6,12 +8,8 @@ Trigger.prototype.InitElephantine = function()
|
||||
|
||||
Trigger.prototype.InitElephantine_DefenderStance = function()
|
||||
{
|
||||
for (let ent of Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager).GetEntitiesByPlayer(0))
|
||||
{
|
||||
let cmpIdentity = Engine.QueryInterface(ent, IID_Identity);
|
||||
if (cmpIdentity && cmpIdentity.HasClass("Soldier"))
|
||||
TriggerHelper.SetUnitStance(ent, "defensive");
|
||||
}
|
||||
for (let ent of TriggerHelper.GetPlayerEntitiesByClass(elephantinePlayerID, "Soldier"))
|
||||
TriggerHelper.SetUnitStance(ent, "defensive")
|
||||
};
|
||||
|
||||
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 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"])
|
||||
TriggerHelper.SpawnAndGarrisonAtClasses(0, identityClass, kushInfantryUnits.concat(kushSupportUnits), 1);
|
||||
TriggerHelper.SpawnAndGarrisonAtClasses(elephantinePlayerID, identityClass, kushInfantryUnits.concat(kushSupportUnits), 1);
|
||||
};
|
||||
|
||||
{
|
||||
|
@ -148,23 +148,11 @@ Trigger.prototype.SetDisableTemplates = function()
|
||||
*/
|
||||
Trigger.prototype.InitStartingUnits = function()
|
||||
{
|
||||
let cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
|
||||
for (let i = 1; i < TriggerHelper.GetNumberOfPlayers(); ++i)
|
||||
for (let playerID = 1; playerID < TriggerHelper.GetNumberOfPlayers(); ++playerID)
|
||||
{
|
||||
let playerEntities = cmpRangeManager.GetEntitiesByPlayer(i);
|
||||
|
||||
for (let entity of playerEntities)
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
this.playerCivicCenter[playerID] = TriggerHelper.GetPlayerEntitiesByClass(playerID, "CivilCentre")[0];
|
||||
this.treasureFemale[playerID] = TriggerHelper.GetPlayerEntitiesByClass(playerID, "FemaleCitizen")[0];
|
||||
Engine.QueryInterface(this.treasureFemale[playerID], IID_DamageReceiver).SetInvulnerability(true);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -21,6 +21,16 @@ TriggerHelper.GetOwner = function(ent)
|
||||
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)
|
||||
{
|
||||
let cmpUnitAI = Engine.QueryInterface(ent, IID_UnitAI);
|
||||
@ -212,12 +222,27 @@ TriggerHelper.GetNumberOfPlayers = function()
|
||||
* See globalscripts/Templates.js for details of MatchesClassList.
|
||||
*
|
||||
* @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);
|
||||
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);
|
||||
};
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user