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");
|
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();
|
||||||
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user