1
0
forked from mirrors/0ad

Fix eslint rule 'prefer-const' in components/[A-B]*

eslint --no-config-lookup --fix --rule '"prefer-const": 1' \
    binaries/data/mods/public/simulation/components/A* \
    binaries/data/mods/public/simulation/components/B* \

Ref: #7812
Signed-off-by: Ralph Sennhauser <ralph.sennhauser@gmail.com>
This commit is contained in:
Ralph Sennhauser
2025-05-11 10:39:08 +02:00
parent 88eea5c7e3
commit 4c4f787c63
10 changed files with 240 additions and 240 deletions
@@ -30,7 +30,7 @@ AIInterface.prototype.EventNames = [
AIInterface.prototype.Init = function()
{
this.events = {};
for (let name of this.EventNames)
for (const name of this.EventNames)
this.events[name] = [];
this.changedEntities = {};
@@ -45,7 +45,7 @@ AIInterface.prototype.Init = function()
AIInterface.prototype.Serialize = function()
{
let state = {};
const state = {};
for (var key in this)
{
if (!this.hasOwnProperty(key))
@@ -61,7 +61,7 @@ AIInterface.prototype.Serialize = function()
AIInterface.prototype.Deserialize = function(data)
{
for (let key in data)
for (const key in data)
{
if (!data.hasOwnProperty(key))
continue;
@@ -78,7 +78,7 @@ AIInterface.prototype.Deserialize = function(data)
AIInterface.prototype.Disable = function()
{
this.enabled = false;
let nop = function(){};
const nop = function(){};
this.ChangedEntity = nop;
this.PushEvent = nop;
this.OnGlobalPlayerDefeated = nop;
@@ -90,15 +90,15 @@ AIInterface.prototype.Disable = function()
AIInterface.prototype.GetNonEntityRepresentation = function()
{
let cmpGuiInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface);
const cmpGuiInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface);
// Return the same game state as the GUI uses
let state = cmpGuiInterface.GetSimulationState();
const state = cmpGuiInterface.GetSimulationState();
// Add some extra AI-specific data
// add custom events and reset them for the next turn
state.events = {};
for (let name of this.EventNames)
for (const name of this.EventNames)
{
state.events[name] = this.events[name];
this.events[name] = [];
@@ -109,14 +109,14 @@ AIInterface.prototype.GetNonEntityRepresentation = function()
AIInterface.prototype.GetRepresentation = function()
{
let state = this.GetNonEntityRepresentation();
const state = this.GetNonEntityRepresentation();
// Add entity representations
Engine.ProfileStart("proxy representations");
state.entities = {};
for (let id in this.changedEntities)
for (const id in this.changedEntities)
{
let cmpAIProxy = Engine.QueryInterface(+id, IID_AIProxy);
const cmpAIProxy = Engine.QueryInterface(+id, IID_AIProxy);
if (cmpAIProxy)
state.entities[id] = cmpAIProxy.GetRepresentation();
}
@@ -136,17 +136,17 @@ AIInterface.prototype.GetRepresentation = function()
*/
AIInterface.prototype.GetFullRepresentation = function(flushEvents)
{
let state = this.GetNonEntityRepresentation();
const state = this.GetNonEntityRepresentation();
if (flushEvents)
for (let name of this.EventNames)
for (const name of this.EventNames)
state.events[name] = [];
// Add entity representations
Engine.ProfileStart("proxy representations");
state.entities = {};
// all entities are changed in the initial state.
for (let id of Engine.GetEntitiesWithInterface(IID_AIProxy))
for (const id of Engine.GetEntitiesWithInterface(IID_AIProxy))
state.entities[id] = Engine.QueryInterface(id, IID_AIProxy).GetFullRepresentation();
Engine.ProfileStop();
@@ -214,35 +214,35 @@ AIInterface.prototype.OnCeasefireEnded = function(msg)
*/
AIInterface.prototype.OnTemplateModification = function(msg)
{
let cmpTemplateManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager);
const cmpTemplateManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager);
if (!this.templates)
{
this.templates = [];
for (let templateName of cmpTemplateManager.FindAllTemplates(false))
for (const templateName of cmpTemplateManager.FindAllTemplates(false))
{
// Remove templates that we obviously don't care about.
if (templateName.startsWith("campaigns/") || templateName.startsWith("rubble/") ||
templateName.startsWith("skirmish/"))
continue;
let template = cmpTemplateManager.GetTemplateWithoutValidation(templateName);
const template = cmpTemplateManager.GetTemplateWithoutValidation(templateName);
if (!template || !template.Identity || !template.Identity.Civ)
continue;
this.templates.push(templateName);
}
}
for (let name of this.templates)
for (const name of this.templates)
{
let template = cmpTemplateManager.GetTemplateWithoutValidation(name);
const template = cmpTemplateManager.GetTemplateWithoutValidation(name);
if (!template || !template[msg.component])
continue;
for (let valName of msg.valueNames)
for (const valName of msg.valueNames)
{
// let's get the base template value.
let strings = valName.split("/");
const strings = valName.split("/");
let item = template;
let ended = true;
for (let str of strings)
for (const str of strings)
{
if (item !== undefined && item[str] !== undefined)
item = item[str];
@@ -252,7 +252,7 @@ AIInterface.prototype.OnTemplateModification = function(msg)
if (!ended)
continue;
// item now contains the template value for this.
let oldValue = +item == item ? +item : item;
const oldValue = +item == item ? +item : item;
let newValue = ApplyValueModificationsToTemplate(valName, oldValue, msg.player, template);
// Apply the same roundings as in the components
if (valName === "Player/MaxPopulation" || valName === "Cost/Population" ||
@@ -275,23 +275,23 @@ AIInterface.prototype.OnTemplateModification = function(msg)
AIInterface.prototype.OnGlobalValueModification = function(msg)
{
this.events.ValueModification.push(msg);
let cmpTemplateManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager);
for (let ent of msg.entities)
const cmpTemplateManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager);
for (const ent of msg.entities)
{
let templateName = cmpTemplateManager.GetCurrentTemplateName(ent);
const templateName = cmpTemplateManager.GetCurrentTemplateName(ent);
// if there's no template name, the unit is probably killed, ignore it.
if (!templateName || !templateName.length)
continue;
let template = cmpTemplateManager.GetTemplateWithoutValidation(templateName);
const template = cmpTemplateManager.GetTemplateWithoutValidation(templateName);
if (!template || !template[msg.component])
continue;
for (let valName of msg.valueNames)
for (const valName of msg.valueNames)
{
// let's get the base template value.
let strings = valName.split("/");
const strings = valName.split("/");
let item = template;
let ended = true;
for (let str of strings)
for (const str of strings)
{
if (item !== undefined && item[str] !== undefined)
item = item[str];
@@ -301,7 +301,7 @@ AIInterface.prototype.OnGlobalValueModification = function(msg)
if (!ended)
continue;
// "item" now contains the unmodified template value for this.
let oldValue = +item == item ? +item : item;
const oldValue = +item == item ? +item : item;
let newValue = ApplyValueModificationsToEntity(valName, oldValue, ent);
// Apply the same roundings as in the components
if (valName === "Player/MaxPopulation" || valName === "Cost/Population" ||
@@ -67,7 +67,7 @@ AIProxy.prototype.NotifyChange = function()
{
// not yet notified, be sure that the owner is set before doing so
// as the Create event is sent only on first ownership changed
let cmpOwnership = Engine.QueryInterface(this.entity, IID_Ownership);
const cmpOwnership = Engine.QueryInterface(this.entity, IID_Ownership);
if (!cmpOwnership || cmpOwnership.GetOwner() < 0)
return false;
}
@@ -159,7 +159,7 @@ AIProxy.prototype.OnProductionQueueChanged = function(msg)
{
if (!this.NotifyChange())
return;
let cmpProductionQueue = Engine.QueryInterface(this.entity, IID_ProductionQueue);
const cmpProductionQueue = Engine.QueryInterface(this.entity, IID_ProductionQueue);
this.changes.trainingQueue = cmpProductionQueue.GetQueue();
};
@@ -168,14 +168,14 @@ AIProxy.prototype.OnGarrisonedUnitsChanged = function(msg)
if (!this.NotifyChange())
return;
let cmpGarrisonHolder = Engine.QueryInterface(this.entity, IID_GarrisonHolder);
const cmpGarrisonHolder = Engine.QueryInterface(this.entity, IID_GarrisonHolder);
this.changes.garrisoned = cmpGarrisonHolder.GetEntities();
// Send a message telling a unit garrisoned or ungarrisoned.
// I won't check if the unit is still alive so it'll be up to the AI.
for (let ent of msg.added)
for (const ent of msg.added)
this.cmpAIInterface.PushEvent("Garrison", { "entity": ent, "holder": this.entity });
for (let ent of msg.removed)
for (const ent of msg.removed)
this.cmpAIInterface.PushEvent("UnGarrison", { "entity": ent, "holder": this.entity });
};
@@ -213,22 +213,22 @@ AIProxy.prototype.OnTerritoryDecayChanged = function(msg)
AIProxy.prototype.GetFullRepresentation = function()
{
this.needsFullGet = false;
let cmpTemplateManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager);
const cmpTemplateManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager);
let ret = {
const ret = {
// These properties are constant and won't need to be updated
"id": this.entity,
"template": cmpTemplateManager.GetCurrentTemplateName(this.entity)
};
let cmpPosition = Engine.QueryInterface(this.entity, IID_Position);
const cmpPosition = Engine.QueryInterface(this.entity, IID_Position);
if (cmpPosition)
{
// Updated by OnPositionChanged
if (cmpPosition.IsInWorld())
{
let pos = cmpPosition.GetPosition2D();
const pos = cmpPosition.GetPosition2D();
ret.position = [pos.x, pos.y];
ret.angle = cmpPosition.GetRotation().y;
}
@@ -239,25 +239,25 @@ AIProxy.prototype.GetFullRepresentation = function()
}
}
let cmpHealth = Engine.QueryInterface(this.entity, IID_Health);
const cmpHealth = Engine.QueryInterface(this.entity, IID_Health);
if (cmpHealth)
{
// Updated by OnHealthChanged
ret.hitpoints = cmpHealth.GetHitpoints();
}
let cmpResistance = Engine.QueryInterface(this.entity, IID_Resistance);
const cmpResistance = Engine.QueryInterface(this.entity, IID_Resistance);
if (cmpResistance)
ret.invulnerability = cmpResistance.IsInvulnerable();
let cmpOwnership = Engine.QueryInterface(this.entity, IID_Ownership);
const cmpOwnership = Engine.QueryInterface(this.entity, IID_Ownership);
if (cmpOwnership)
{
// Updated by OnOwnershipChanged
ret.owner = cmpOwnership.GetOwner();
}
let cmpUnitAI = Engine.QueryInterface(this.entity, IID_UnitAI);
const cmpUnitAI = Engine.QueryInterface(this.entity, IID_UnitAI);
if (cmpUnitAI)
{
// Updated by OnUnitIdleChanged
@@ -270,46 +270,46 @@ AIProxy.prototype.GetFullRepresentation = function()
ret.unitAIOrderData = cmpUnitAI.GetOrderData();
}
let cmpProductionQueue = Engine.QueryInterface(this.entity, IID_ProductionQueue);
const cmpProductionQueue = Engine.QueryInterface(this.entity, IID_ProductionQueue);
if (cmpProductionQueue)
{
// Updated by OnProductionQueueChanged
ret.trainingQueue = cmpProductionQueue.GetQueue();
}
let cmpFoundation = Engine.QueryInterface(this.entity, IID_Foundation);
const cmpFoundation = Engine.QueryInterface(this.entity, IID_Foundation);
if (cmpFoundation)
{
// Updated by OnFoundationProgressChanged
ret.foundationProgress = cmpFoundation.GetBuildPercentage();
}
let cmpResourceDropsite = Engine.QueryInterface(this.entity, IID_ResourceDropsite);
const cmpResourceDropsite = Engine.QueryInterface(this.entity, IID_ResourceDropsite);
if (cmpResourceDropsite)
{
// Updated by OnDropsiteSharingChanged
ret.sharedDropsite = cmpResourceDropsite.IsShared();
}
let cmpGarrisonHolder = Engine.QueryInterface(this.entity, IID_GarrisonHolder);
const cmpGarrisonHolder = Engine.QueryInterface(this.entity, IID_GarrisonHolder);
if (cmpGarrisonHolder)
{
// Updated by OnGarrisonedUnitsChanged
ret.garrisoned = cmpGarrisonHolder.GetEntities();
}
let cmpGarrisonable = Engine.QueryInterface(this.entity, IID_Garrisonable);
const cmpGarrisonable = Engine.QueryInterface(this.entity, IID_Garrisonable);
if (cmpGarrisonable)
{
// Updated by OnGarrisonedStateChanged
ret.garrisonHolderID = cmpGarrisonable.HolderID();
}
let cmpTerritoryDecay = Engine.QueryInterface(this.entity, IID_TerritoryDecay);
const cmpTerritoryDecay = Engine.QueryInterface(this.entity, IID_TerritoryDecay);
if (cmpTerritoryDecay)
ret.decaying = cmpTerritoryDecay.IsDecaying();
let cmpCapturable = Engine.QueryInterface(this.entity, IID_Capturable);
const cmpCapturable = Engine.QueryInterface(this.entity, IID_Capturable);
if (cmpCapturable)
ret.capturePoints = cmpCapturable.GetCapturePoints();
@@ -24,42 +24,42 @@ AlertRaiser.prototype.GetTargetClasses = function()
AlertRaiser.prototype.UnitFilter = function(unit)
{
let cmpIdentity = Engine.QueryInterface(unit, IID_Identity);
const cmpIdentity = Engine.QueryInterface(unit, IID_Identity);
return cmpIdentity && MatchesClassList(cmpIdentity.GetClassesList(), this.GetTargetClasses());
};
AlertRaiser.prototype.RaiseAlert = function()
{
let cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
const cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
if (cmpTimer.GetTime() == this.lastTime)
return;
this.lastTime = cmpTimer.GetTime();
PlaySound("alert_raise", this.entity);
let cmpOwnership = Engine.QueryInterface(this.entity, IID_Ownership);
const cmpOwnership = Engine.QueryInterface(this.entity, IID_Ownership);
if (!cmpOwnership || cmpOwnership.GetOwner() == INVALID_PLAYER)
return;
let owner = cmpOwnership.GetOwner();
const owner = cmpOwnership.GetOwner();
const cmpDiplomacy = QueryPlayerIDInterface(owner, IID_Diplomacy);
const mutualAllies = cmpDiplomacy ? cmpDiplomacy.GetMutualAllies() : [owner];
let cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
const cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
// Store the number of available garrison spots so that units don't try to garrison in buildings that will be full
let reserved = new Map();
const reserved = new Map();
let units = cmpRangeManager.ExecuteQuery(this.entity, 0, +this.template.RaiseAlertRange, [owner], IID_UnitAI, true).filter(ent => this.UnitFilter(ent));
for (let unit of units)
const units = cmpRangeManager.ExecuteQuery(this.entity, 0, +this.template.RaiseAlertRange, [owner], IID_UnitAI, true).filter(ent => this.UnitFilter(ent));
for (const unit of units)
{
let cmpGarrisonable = Engine.QueryInterface(unit, IID_Garrisonable);
const cmpGarrisonable = Engine.QueryInterface(unit, IID_Garrisonable);
if (!cmpGarrisonable)
continue;
let size = cmpGarrisonable.TotalSize();
let cmpUnitAI = Engine.QueryInterface(unit, IID_UnitAI);
const size = cmpGarrisonable.TotalSize();
const cmpUnitAI = Engine.QueryInterface(unit, IID_UnitAI);
let holder = cmpRangeManager.ExecuteQuery(unit, 0, +this.template.SearchRange, mutualAllies, IID_GarrisonHolder, true).find(ent => {
const holder = cmpRangeManager.ExecuteQuery(unit, 0, +this.template.SearchRange, mutualAllies, IID_GarrisonHolder, true).find(ent => {
// Ignore moving garrison holders
if (Engine.QueryInterface(ent, IID_UnitAI))
return false;
@@ -71,7 +71,7 @@ AlertRaiser.prototype.RaiseAlert = function()
if (!cmpUnitAI.CheckTargetVisible(ent))
return false;
let cmpGarrisonHolder = Engine.QueryInterface(ent, IID_GarrisonHolder);
const cmpGarrisonHolder = Engine.QueryInterface(ent, IID_GarrisonHolder);
if (!reserved.has(ent))
reserved.set(ent, cmpGarrisonHolder.GetCapacity() - cmpGarrisonHolder.OccupiedSlots());
@@ -91,27 +91,27 @@ AlertRaiser.prototype.RaiseAlert = function()
AlertRaiser.prototype.EndOfAlert = function()
{
let cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
const cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
if (cmpTimer.GetTime() == this.lastTime)
return;
this.lastTime = cmpTimer.GetTime();
PlaySound("alert_end", this.entity);
let cmpOwnership = Engine.QueryInterface(this.entity, IID_Ownership);
const cmpOwnership = Engine.QueryInterface(this.entity, IID_Ownership);
if (!cmpOwnership || cmpOwnership.GetOwner() == INVALID_PLAYER)
return;
let owner = cmpOwnership.GetOwner();
const owner = cmpOwnership.GetOwner();
const cmpDiplomacy = QueryPlayerIDInterface(owner, IID_Diplomacy);
const mutualAllies = cmpDiplomacy ? cmpDiplomacy.GetMutualAllies() : [owner];
let cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
const cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
// Units that are not garrisoned should go back to work
let units = cmpRangeManager.ExecuteQuery(this.entity, 0, +this.template.EndOfAlertRange, [owner], IID_UnitAI, true).filter(ent => this.UnitFilter(ent));
for (let unit of units)
const units = cmpRangeManager.ExecuteQuery(this.entity, 0, +this.template.EndOfAlertRange, [owner], IID_UnitAI, true).filter(ent => this.UnitFilter(ent));
for (const unit of units)
{
let cmpUnitAI = Engine.QueryInterface(unit, IID_UnitAI);
const cmpUnitAI = Engine.QueryInterface(unit, IID_UnitAI);
if (cmpUnitAI.HasWorkOrders() && cmpUnitAI.ShouldRespondToEndOfAlert())
cmpUnitAI.BackToWork();
else if (cmpUnitAI.ShouldRespondToEndOfAlert())
@@ -120,25 +120,25 @@ AlertRaiser.prototype.EndOfAlert = function()
}
// Units that are garrisoned should ungarrison and go back to work
let holders = cmpRangeManager.ExecuteQuery(this.entity, 0, +this.template.EndOfAlertRange, mutualAllies, IID_GarrisonHolder, true);
const holders = cmpRangeManager.ExecuteQuery(this.entity, 0, +this.template.EndOfAlertRange, mutualAllies, IID_GarrisonHolder, true);
if (Engine.QueryInterface(this.entity, IID_GarrisonHolder))
holders.push(this.entity);
for (let holder of holders)
for (const holder of holders)
{
if (Engine.QueryInterface(holder, IID_UnitAI))
continue;
let cmpGarrisonHolder = Engine.QueryInterface(holder, IID_GarrisonHolder);
let units = cmpGarrisonHolder.GetEntities().filter(ent => {
let cmpOwner = Engine.QueryInterface(ent, IID_Ownership);
const cmpGarrisonHolder = Engine.QueryInterface(holder, IID_GarrisonHolder);
const units = cmpGarrisonHolder.GetEntities().filter(ent => {
const cmpOwner = Engine.QueryInterface(ent, IID_Ownership);
return cmpOwner && cmpOwner.GetOwner() == owner && this.UnitFilter(ent);
});
for (let unit of units)
for (const unit of units)
if (cmpGarrisonHolder.Unload(unit))
{
let cmpUnitAI = Engine.QueryInterface(unit, IID_UnitAI);
const cmpUnitAI = Engine.QueryInterface(unit, IID_UnitAI);
if (cmpUnitAI.HasWorkOrders())
cmpUnitAI.BackToWork();
else
@@ -209,11 +209,11 @@ Attack.prototype.Init = function()
Attack.prototype.GetAttackTypes = function(wantedTypes)
{
let types = g_AttackTypes.filter(type => !!this.template[type]);
const types = g_AttackTypes.filter(type => !!this.template[type]);
if (!wantedTypes)
return types;
let wantedTypesReal = wantedTypes.filter(wtype => wtype.indexOf("!") != 0);
const wantedTypesReal = wantedTypes.filter(wtype => wtype.indexOf("!") != 0);
return types.filter(type => wantedTypes.indexOf("!" + type) == -1 &&
(!wantedTypesReal || !wantedTypesReal.length || wantedTypesReal.indexOf(type) != -1));
};
@@ -304,16 +304,16 @@ Attack.prototype.CanAttack = function(target, wantedTypes)
*/
Attack.prototype.GetPreference = function(target)
{
let cmpIdentity = Engine.QueryInterface(target, IID_Identity);
const cmpIdentity = Engine.QueryInterface(target, IID_Identity);
if (!cmpIdentity)
return undefined;
let targetClasses = cmpIdentity.GetClassesList();
const targetClasses = cmpIdentity.GetClassesList();
let minPref;
for (let type of this.GetAttackTypes())
for (const type of this.GetAttackTypes())
{
let preferredClasses = this.GetPreferredClasses(type);
const preferredClasses = this.GetPreferredClasses(type);
for (let pref = 0; pref < preferredClasses.length; ++pref)
{
if (MatchesClassList(targetClasses, preferredClasses[pref]))
@@ -333,10 +333,10 @@ Attack.prototype.GetPreference = function(target)
*/
Attack.prototype.GetFullAttackRange = function()
{
let ret = { "min": Infinity, "max": 0 };
for (let type of this.GetAttackTypes())
const ret = { "min": Infinity, "max": 0 };
for (const type of this.GetAttackTypes())
{
let range = this.GetRange(type);
const range = this.GetRange(type);
ret.min = Math.min(ret.min, range.min);
ret.max = Math.max(ret.max, range.max);
}
@@ -361,7 +361,7 @@ Attack.prototype.GetAttackEffectsData = function(type, splash)
*/
Attack.prototype.GetBestAttackAgainst = function(target, allowCapture)
{
let types = this.GetAttackTypes();
const types = this.GetAttackTypes();
if (Engine.QueryInterface(target, IID_Formation))
// TODO: Formation against formation needs review
return g_AttackTypes.find(attack => types.indexOf(attack) != -1);
@@ -394,8 +394,8 @@ Attack.prototype.GetBestAttackAgainst = function(target, allowCapture)
Attack.prototype.CompareEntitiesByPreference = function(a, b)
{
let aPreference = this.GetPreference(a);
let bPreference = this.GetPreference(b);
const aPreference = this.GetPreference(a);
const bPreference = this.GetPreference(b);
if (aPreference === null && bPreference === null) return 0;
if (aPreference === null) return 1;
@@ -487,19 +487,19 @@ Attack.prototype.StartAttacking = function(target, type, callerIID)
if (!cmpResistance || !cmpResistance.AddAttacker(this.entity))
return false;
let timings = this.GetTimers(type);
let cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
const timings = this.GetTimers(type);
const cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
// If the repeat time since the last attack hasn't elapsed,
// delay the action to avoid attacking too fast.
let prepare = timings.prepare;
if (this.lastAttacked)
{
let repeatLeft = this.lastAttacked + timings.repeat - cmpTimer.GetTime();
const repeatLeft = this.lastAttacked + timings.repeat - cmpTimer.GetTime();
prepare = Math.max(prepare, repeatLeft);
}
let cmpVisual = Engine.QueryInterface(this.entity, IID_Visual);
const cmpVisual = Engine.QueryInterface(this.entity, IID_Visual);
if (cmpVisual)
{
cmpVisual.SelectAnimation("attack_" + type.toLowerCase(), false, 1.0);
@@ -538,7 +538,7 @@ Attack.prototype.StopAttacking = function(reason)
if (!this.target)
return;
let cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
const cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
cmpTimer.CancelTimer(this.timer);
cmpTimer.CancelTimer(this.checkTimer);
delete this.timer;
@@ -550,18 +550,18 @@ Attack.prototype.StopAttacking = function(reason)
delete this.target;
let cmpVisual = Engine.QueryInterface(this.entity, IID_Visual);
const cmpVisual = Engine.QueryInterface(this.entity, IID_Visual);
if (cmpVisual)
cmpVisual.SelectAnimation("idle", false, 1.0);
// The callerIID component may start again,
// replacing the callerIID, hence save that.
let callerIID = this.callerIID;
const callerIID = this.callerIID;
delete this.callerIID;
if (reason && callerIID)
{
let component = Engine.QueryInterface(this.entity, callerIID);
const component = Engine.QueryInterface(this.entity, callerIID);
if (component)
component.ProcessMessage(reason, null);
}
@@ -583,7 +583,7 @@ Attack.prototype.Attack = function(type, lateness)
// ToDo: Enable entities to keep facing a target.
Engine.QueryInterface(this.entity, IID_UnitAI)?.FaceTowardsTarget(this.target);
let cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
const cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
this.lastAttacked = cmpTimer.GetTime() - lateness;
// BuildingAI has its own attack routine.
@@ -602,10 +602,10 @@ Attack.prototype.Attack = function(type, lateness)
if (this.resyncAnimation)
{
let cmpVisual = Engine.QueryInterface(this.entity, IID_Visual);
const cmpVisual = Engine.QueryInterface(this.entity, IID_Visual);
if (cmpVisual)
{
let repeat = this.GetTimers(type).repeat;
const repeat = this.GetTimers(type).repeat;
cmpVisual.SetAnimationSyncRepeat(repeat);
cmpVisual.SetAnimationSyncOffset(repeat);
}
@@ -620,22 +620,22 @@ Attack.prototype.Attack = function(type, lateness)
*/
Attack.prototype.PerformAttack = function(type, target)
{
let cmpPosition = Engine.QueryInterface(this.entity, IID_Position);
const cmpPosition = Engine.QueryInterface(this.entity, IID_Position);
if (!cmpPosition || !cmpPosition.IsInWorld())
return;
let selfPosition = cmpPosition.GetPosition();
const selfPosition = cmpPosition.GetPosition();
let cmpTargetPosition = Engine.QueryInterface(target, IID_Position);
const cmpTargetPosition = Engine.QueryInterface(target, IID_Position);
if (!cmpTargetPosition || !cmpTargetPosition.IsInWorld())
return;
let targetPosition = cmpTargetPosition.GetPosition();
const targetPosition = cmpTargetPosition.GetPosition();
let cmpOwnership = Engine.QueryInterface(this.entity, IID_Ownership);
const cmpOwnership = Engine.QueryInterface(this.entity, IID_Ownership);
if (!cmpOwnership)
return;
let attackerOwner = cmpOwnership.GetOwner();
const attackerOwner = cmpOwnership.GetOwner();
let data = {
const data = {
"type": type,
"attackData": this.GetAttackEffectsData(type),
"splash": this.GetSplashData(type),
@@ -648,20 +648,20 @@ Attack.prototype.PerformAttack = function(type, target)
if (this.template[type].Projectile)
{
let cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
let turnLength = cmpTimer.GetLatestTurnLength()/1000;
const cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
const turnLength = cmpTimer.GetLatestTurnLength()/1000;
// In the future this could be extended:
// * Obstacles like trees could reduce the probability of the target being hit
// * Obstacles like walls should block projectiles entirely
let horizSpeed = +this.template[type].Projectile.Speed;
let gravity = +this.template[type].Projectile.Gravity;
const horizSpeed = +this.template[type].Projectile.Speed;
const gravity = +this.template[type].Projectile.Gravity;
// horizSpeed /= 2; gravity /= 2; // slow it down for testing
// We will try to estimate the position of the target, where we can hit it.
// We first estimate the time-till-hit by extrapolating linearly the movement
// of the last turn. We compute the time till an arrow will intersect the target.
let targetVelocity = Vector3D.sub(targetPosition, cmpTargetPosition.GetPreviousPosition()).div(turnLength);
const targetVelocity = Vector3D.sub(targetPosition, cmpTargetPosition.GetPreviousPosition()).div(turnLength);
let timeToTarget = PositionHelper.PredictTimeToTarget(selfPosition, horizSpeed, targetPosition, targetVelocity);
@@ -674,14 +674,14 @@ Attack.prototype.PerformAttack = function(type, target)
{
// Don't predict too far in the future, but avoid threshold effects.
// After 1 second, always use the 'dumb' interpolated past-motion prediction.
let useUnitMotion = randBool(Math.max(0, 0.75 - timeToTarget / 1.333));
const useUnitMotion = randBool(Math.max(0, 0.75 - timeToTarget / 1.333));
if (useUnitMotion)
{
let cmpTargetUnitMotion = Engine.QueryInterface(target, IID_UnitMotion);
let cmpTargetUnitAI = Engine.QueryInterface(target, IID_UnitAI);
const cmpTargetUnitMotion = Engine.QueryInterface(target, IID_UnitMotion);
const cmpTargetUnitAI = Engine.QueryInterface(target, IID_UnitAI);
if (cmpTargetUnitMotion && (!cmpTargetUnitAI || !cmpTargetUnitAI.IsFormationMember()))
{
let pos2D = cmpTargetUnitMotion.EstimateFuturePosition(timeToTarget);
const pos2D = cmpTargetUnitMotion.EstimateFuturePosition(timeToTarget);
predictedPosition.x = pos2D.x;
predictedPosition.z = pos2D.y;
}
@@ -692,33 +692,33 @@ Attack.prototype.PerformAttack = function(type, target)
predictedPosition = Vector3D.mult(targetVelocity, timeToTarget).add(targetPosition);
}
let predictedHeight = cmpTargetPosition.GetHeightAt(predictedPosition.x, predictedPosition.z);
const predictedHeight = cmpTargetPosition.GetHeightAt(predictedPosition.x, predictedPosition.z);
// Add inaccuracy based on spread.
const distanceModifiedSpread = ApplyValueModificationsToEntity("Attack/" + type + "/Projectile/Spread", +this.template[type].Projectile.Spread, this.entity) *
predictedPosition.horizDistanceTo(selfPosition) / 100;
let randNorm = randomNormal2D();
let offsetX = randNorm[0] * distanceModifiedSpread;
let offsetZ = randNorm[1] * distanceModifiedSpread;
const randNorm = randomNormal2D();
const offsetX = randNorm[0] * distanceModifiedSpread;
const offsetZ = randNorm[1] * distanceModifiedSpread;
data.position = new Vector3D(predictedPosition.x + offsetX, predictedHeight, predictedPosition.z + offsetZ);
let realHorizDistance = data.position.horizDistanceTo(selfPosition);
const realHorizDistance = data.position.horizDistanceTo(selfPosition);
timeToTarget = realHorizDistance / horizSpeed;
delay += timeToTarget * 1000;
data.direction = Vector3D.sub(data.position, selfPosition).div(realHorizDistance);
let actorName = this.template[type].Projectile.ActorName || "";
let impactActorName = this.template[type].Projectile.ImpactActorName || "";
let impactAnimationLifetime = this.template[type].Projectile.ImpactAnimationLifetime || 0;
const impactActorName = this.template[type].Projectile.ImpactActorName || "";
const impactAnimationLifetime = this.template[type].Projectile.ImpactAnimationLifetime || 0;
// TODO: Use unit rotation to implement x/z offsets.
let deltaLaunchPoint = new Vector3D(0, +this.template[type].Projectile.LaunchPoint["@y"], 0);
const deltaLaunchPoint = new Vector3D(0, +this.template[type].Projectile.LaunchPoint["@y"], 0);
let launchPoint = Vector3D.add(selfPosition, deltaLaunchPoint);
let cmpVisual = Engine.QueryInterface(this.entity, IID_Visual);
const cmpVisual = Engine.QueryInterface(this.entity, IID_Visual);
if (cmpVisual)
{
// if the projectile definition is missing from the template
@@ -726,15 +726,15 @@ Attack.prototype.PerformAttack = function(type, target)
if (!actorName)
actorName = cmpVisual.GetProjectileActor();
let visualActorLaunchPoint = cmpVisual.GetProjectileLaunchPoint();
const visualActorLaunchPoint = cmpVisual.GetProjectileLaunchPoint();
if (visualActorLaunchPoint.length() > 0)
launchPoint = visualActorLaunchPoint;
}
let cmpProjectileManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_ProjectileManager);
const cmpProjectileManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_ProjectileManager);
data.projectileId = cmpProjectileManager.LaunchProjectileAtPoint(launchPoint, data.position, horizSpeed, gravity, actorName, impactActorName, impactAnimationLifetime);
let cmpSound = Engine.QueryInterface(this.entity, IID_Sound);
const cmpSound = Engine.QueryInterface(this.entity, IID_Sound);
data.attackImpactSound = cmpSound ? cmpSound.GetSoundGroup("attack_impact_" + type.toLowerCase()) : "";
data.friendlyFire = this.template[type].Projectile.FriendlyFire == "true";
@@ -746,7 +746,7 @@ Attack.prototype.PerformAttack = function(type, target)
}
if (delay)
{
let cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
const cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
cmpTimer.SetTimeout(SYSTEM_ENTITY, IID_DelayedDamage, "Hit", delay, data);
}
else
@@ -774,7 +774,7 @@ Attack.prototype.OnValueModification = function(msg)
if (msg.component != "Attack")
return;
let cmpUnitAI = Engine.QueryInterface(this.entity, IID_UnitAI);
const cmpUnitAI = Engine.QueryInterface(this.entity, IID_UnitAI);
if (!cmpUnitAI)
return;
@@ -788,9 +788,9 @@ Attack.prototype.GetRangeOverlays = function(type = "Ranged")
if (!this.template[type] || !this.template[type].RangeOverlay)
return [];
let range = this.GetRange(type);
let rangeOverlays = [];
for (let i in range)
const range = this.GetRange(type);
const rangeOverlays = [];
for (const i in range)
if ((i == "min" || i == "max") && range[i])
rangeOverlays.push({
"radius": range[i],
@@ -57,14 +57,14 @@ AttackDetection.prototype.OnGlobalAttacked = function(msg)
AttackDetection.prototype.AttackAlert = function(target, attacker, type, attackerOwner)
{
let playerID = Engine.QueryInterface(this.entity, IID_Player).GetPlayerID();
const playerID = Engine.QueryInterface(this.entity, IID_Player).GetPlayerID();
// Don't register attacks dealt against other players
if (Engine.QueryInterface(target, IID_Ownership).GetOwner() != playerID)
return;
let cmpAttackerOwnership = Engine.QueryInterface(attacker, IID_Ownership);
let atkOwner = cmpAttackerOwnership && cmpAttackerOwnership.GetOwner() != INVALID_PLAYER ? cmpAttackerOwnership.GetOwner() : attackerOwner;
const cmpAttackerOwnership = Engine.QueryInterface(attacker, IID_Ownership);
const atkOwner = cmpAttackerOwnership && cmpAttackerOwnership.GetOwner() != INVALID_PLAYER ? cmpAttackerOwnership.GetOwner() : attackerOwner;
// Don't register attacks dealt by myself
if (atkOwner == playerID)
return;
@@ -10,7 +10,7 @@ Auras.prototype.Init = function()
{
this.affectedPlayers = {};
for (let name of this.GetAuraNames())
for (const name of this.GetAuraNames())
this.affectedPlayers[name] = [];
// In case of autogarrisoning, this component can be called before ownership is set.
@@ -29,9 +29,9 @@ Auras.prototype.GetModifierIdentifier = function(name)
Auras.prototype.GetDescriptions = function()
{
var ret = {};
for (let auraID of this.GetAuraNames())
for (const auraID of this.GetAuraNames())
{
let aura = AuraTemplates.Get(auraID);
const aura = AuraTemplates.Get(auraID);
ret[auraID] = {
"name": {
"generic": aura.auraName
@@ -82,14 +82,14 @@ Auras.prototype.GetAffectedPlayers = function(name)
Auras.prototype.GetRangeOverlays = function()
{
let rangeOverlays = [];
const rangeOverlays = [];
for (let name of this.GetAuraNames())
for (const name of this.GetAuraNames())
{
if (!this.IsRangeAura(name) || !this[name].isApplied)
continue;
let rangeOverlay = AuraTemplates.Get(name).rangeOverlay;
const rangeOverlay = AuraTemplates.Get(name).rangeOverlay;
rangeOverlays.push(
rangeOverlay ?
@@ -127,10 +127,10 @@ Auras.prototype.CalculateAffectedPlayers = function(name)
const cmpDiplomacy = Engine.QueryInterface(this.entity, IID_Diplomacy) ??
QueryPlayerIDInterface(playerID, IID_Diplomacy);
let cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
for (let i of cmpPlayerManager.GetAllPlayers())
const cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
for (const i of cmpPlayerManager.GetAllPlayers())
{
let cmpAffectedPlayer = QueryPlayerIDInterface(i);
const cmpAffectedPlayer = QueryPlayerIDInterface(i);
if (!cmpAffectedPlayer || cmpAffectedPlayer.IsDefeated())
continue;
@@ -144,7 +144,7 @@ Auras.prototype.CanApply = function(name)
if (!AuraTemplates.Get(name).requiredTechnology)
return true;
let cmpTechnologyManager = QueryOwnerInterface(this.entity, IID_TechnologyManager);
const cmpTechnologyManager = QueryOwnerInterface(this.entity, IID_TechnologyManager);
if (!cmpTechnologyManager)
return false;
@@ -213,10 +213,10 @@ Auras.prototype.Clean = function()
{
var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
var auraNames = this.GetAuraNames();
let targetUnitsClone = {};
const targetUnitsClone = {};
let needVisualizationUpdate = false;
// remove all bonuses
for (let name of auraNames)
for (const name of auraNames)
{
targetUnitsClone[name] = [];
if (!this[name])
@@ -237,7 +237,7 @@ Auras.prototype.Clean = function()
cmpRangeManager.DestroyActiveQuery(this[name].rangeQuery);
}
for (let name of auraNames)
for (const name of auraNames)
{
// only calculate the affected players on re-applying the bonuses
// this makes sure the template bonuses are removed from the correct players
@@ -256,14 +256,14 @@ Auras.prototype.Clean = function()
this.ApplyTemplateAura(name, affectedPlayers);
// Only need to call ApplyAura for the aura icons, so skip it if there are none.
if (this.GetOverlayIcon(name))
for (let player of affectedPlayers)
for (const player of affectedPlayers)
this.ApplyAura(name, cmpRangeManager.GetEntitiesByPlayer(player));
continue;
}
if (this.IsPlayerAura(name))
{
let cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
const cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
this.ApplyAura(name, affectedPlayers.map(p => cmpPlayerManager.GetPlayerByID(p)));
continue;
}
@@ -296,7 +296,7 @@ Auras.prototype.Clean = function()
if (needVisualizationUpdate)
{
let cmpRangeOverlayManager = Engine.QueryInterface(this.entity, IID_RangeOverlayManager);
const cmpRangeOverlayManager = Engine.QueryInterface(this.entity, IID_RangeOverlayManager);
if (cmpRangeOverlayManager)
{
cmpRangeOverlayManager.UpdateRangeOverlays("Auras");
@@ -309,14 +309,14 @@ Auras.prototype.GiveMembersWithValidClass = function(auraName, entityList)
{
var match = this.GetClasses(auraName);
return entityList.filter(ent => {
let cmpIdentity = Engine.QueryInterface(ent, IID_Identity);
const cmpIdentity = Engine.QueryInterface(ent, IID_Identity);
return cmpIdentity && MatchesClassList(cmpIdentity.GetClassesList(), match);
});
};
Auras.prototype.OnRangeUpdate = function(msg)
{
for (let name of this.GetAuraNames().filter(n => this[n] && msg.tag == this[n].rangeQuery))
for (const name of this.GetAuraNames().filter(n => this[n] && msg.tag == this[n].rangeQuery))
{
this.ApplyAura(name, msg.added);
this.RemoveAura(name, msg.removed);
@@ -325,7 +325,7 @@ Auras.prototype.OnRangeUpdate = function(msg)
Auras.prototype.OnGarrisonedUnitsChanged = function(msg)
{
for (let name of this.GetAuraNames().filter(n => this.IsGarrisonedUnitsAura(n)))
for (const name of this.GetAuraNames().filter(n => this.IsGarrisonedUnitsAura(n)))
{
this.ApplyAura(name, msg.added);
this.RemoveAura(name, msg.removed);
@@ -334,7 +334,7 @@ Auras.prototype.OnGarrisonedUnitsChanged = function(msg)
Auras.prototype.OnTurretsChanged = function(msg)
{
for (let name of this.GetAuraNames().filter(n => this.IsTurretedUnitsAura(n)))
for (const name of this.GetAuraNames().filter(n => this.IsTurretedUnitsAura(n)))
{
this.ApplyAura(name, msg.added);
this.RemoveAura(name, msg.removed);
@@ -343,13 +343,13 @@ Auras.prototype.OnTurretsChanged = function(msg)
Auras.prototype.ApplyFormationAura = function(memberList)
{
for (let name of this.GetAuraNames().filter(n => this.IsFormationAura(n)))
for (const name of this.GetAuraNames().filter(n => this.IsFormationAura(n)))
this.ApplyAura(name, memberList);
};
Auras.prototype.ApplyGarrisonAura = function(structure)
{
for (let name of this.GetAuraNames().filter(n => this.IsGarrisonAura(n)))
for (const name of this.GetAuraNames().filter(n => this.IsGarrisonAura(n)))
this.ApplyAura(name, [structure]);
};
@@ -361,27 +361,27 @@ Auras.prototype.ApplyTemplateAura = function(name, players)
if (!this.IsGlobalAura(name))
return;
let derivedModifiers = DeriveModificationsFromTech({
const derivedModifiers = DeriveModificationsFromTech({
"modifications": this.GetModifications(name),
"affects": this.GetClasses(name)
});
let cmpModifiersManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_ModifiersManager);
let cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
const cmpModifiersManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_ModifiersManager);
const cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
let modifName = this.GetModifierIdentifier(name);
for (let player of players)
const modifName = this.GetModifierIdentifier(name);
for (const player of players)
cmpModifiersManager.AddModifiers(modifName, derivedModifiers, cmpPlayerManager.GetPlayerByID(player));
};
Auras.prototype.RemoveFormationAura = function(memberList)
{
for (let name of this.GetAuraNames().filter(n => this.IsFormationAura(n)))
for (const name of this.GetAuraNames().filter(n => this.IsFormationAura(n)))
this.RemoveAura(name, memberList);
};
Auras.prototype.RemoveGarrisonAura = function(structure)
{
for (let name of this.GetAuraNames().filter(n => this.IsGarrisonAura(n)))
for (const name of this.GetAuraNames().filter(n => this.IsGarrisonAura(n)))
this.RemoveAura(name, [structure]);
};
@@ -393,18 +393,18 @@ Auras.prototype.RemoveTemplateAura = function(name)
if (!this.IsGlobalAura(name))
return;
let derivedModifiers = DeriveModificationsFromTech({
const derivedModifiers = DeriveModificationsFromTech({
"modifications": this.GetModifications(name),
"affects": this.GetClasses(name)
});
let cmpModifiersManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_ModifiersManager);
let cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
const cmpModifiersManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_ModifiersManager);
const cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
let modifName = this.GetModifierIdentifier(name);
for (let player of this.GetAffectedPlayers(name))
const modifName = this.GetModifierIdentifier(name);
for (const player of this.GetAffectedPlayers(name))
{
let playerId = cmpPlayerManager.GetPlayerByID(player);
for (let modifierPath in derivedModifiers)
const playerId = cmpPlayerManager.GetPlayerByID(player);
for (const modifierPath in derivedModifiers)
cmpModifiersManager.RemoveModifier(modifierPath, modifName, playerId);
}
};
@@ -422,9 +422,9 @@ Auras.prototype.ApplyAura = function(name, ents)
// update status bars if this has an icon
if (this.GetOverlayIcon(name))
for (let ent of validEnts)
for (const ent of validEnts)
{
let cmpStatusBars = Engine.QueryInterface(ent, IID_StatusBars);
const cmpStatusBars = Engine.QueryInterface(ent, IID_StatusBars);
if (cmpStatusBars)
cmpStatusBars.AddAuraSource(this.entity, name);
}
@@ -434,15 +434,15 @@ Auras.prototype.ApplyAura = function(name, ents)
if (this.IsGlobalAura(name))
return;
let cmpModifiersManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_ModifiersManager);
const cmpModifiersManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_ModifiersManager);
let derivedModifiers = DeriveModificationsFromTech({
const derivedModifiers = DeriveModificationsFromTech({
"modifications": this.GetModifications(name),
"affects": this.GetClasses(name)
});
let modifName = this.GetModifierIdentifier(name);
for (let ent of validEnts)
const modifName = this.GetModifierIdentifier(name);
for (const ent of validEnts)
cmpModifiersManager.AddModifiers(modifName, derivedModifiers, ent);
};
@@ -459,9 +459,9 @@ Auras.prototype.RemoveAura = function(name, ents, skipModifications = false)
// update status bars if this has an icon
if (this.GetOverlayIcon(name))
for (let ent of validEnts)
for (const ent of validEnts)
{
let cmpStatusBars = Engine.QueryInterface(ent, IID_StatusBars);
const cmpStatusBars = Engine.QueryInterface(ent, IID_StatusBars);
if (cmpStatusBars)
cmpStatusBars.RemoveAuraSource(this.entity, name);
}
@@ -471,16 +471,16 @@ Auras.prototype.RemoveAura = function(name, ents, skipModifications = false)
if (this.IsGlobalAura(name))
return;
let cmpModifiersManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_ModifiersManager);
const cmpModifiersManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_ModifiersManager);
let derivedModifiers = DeriveModificationsFromTech({
const derivedModifiers = DeriveModificationsFromTech({
"modifications": this.GetModifications(name),
"affects": this.GetClasses(name)
});
let modifName = this.GetModifierIdentifier(name);
for (let ent of ents)
for (let modifierPath in derivedModifiers)
const modifName = this.GetModifierIdentifier(name);
for (const ent of ents)
for (const modifierPath in derivedModifiers)
cmpModifiersManager.RemoveModifier(modifierPath, modifName, ent);
};
@@ -503,9 +503,9 @@ Auras.prototype.OnGlobalResearchFinished = function(msg)
var cmpPlayer = Engine.QueryInterface(this.entity, IID_Player);
if ((!cmpPlayer || cmpPlayer.GetPlayerID() != msg.player) && !IsOwnedByPlayer(msg.player, this.entity))
return;
for (let name of this.GetAuraNames())
for (const name of this.GetAuraNames())
{
let requiredTech = AuraTemplates.Get(name).requiredTechnology;
const requiredTech = AuraTemplates.Get(name).requiredTechnology;
if (requiredTech && requiredTech == msg.tech)
{
this.Clean();
@@ -519,7 +519,7 @@ Auras.prototype.OnGlobalResearchFinished = function(msg)
*/
Auras.prototype.OnGlobalPlayerDefeated = function(msg)
{
let cmpPlayer = Engine.QueryInterface(this.entity, IID_Player);
const cmpPlayer = Engine.QueryInterface(this.entity, IID_Player);
if (cmpPlayer && cmpPlayer.GetPlayerID() == msg.playerId ||
this.GetAuraNames().some(name => this.GetAffectedPlayers(name).indexOf(msg.playerId) != -1))
this.Clean();
@@ -25,12 +25,12 @@ class AutoBuildable
if (this.timer || !this.rate)
return;
let cmpFoundation = Engine.QueryInterface(this.entity, IID_Foundation);
const cmpFoundation = Engine.QueryInterface(this.entity, IID_Foundation);
if (!cmpFoundation)
return;
cmpFoundation.AddBuilder(this.entity);
let cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
const cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
this.timer = cmpTimer.SetInterval(this.entity, IID_AutoBuildable, "AutoBuild", 0, 1000, undefined);
}
@@ -39,11 +39,11 @@ class AutoBuildable
if (!this.timer)
return;
let cmpFoundation = Engine.QueryInterface(this.entity, IID_Foundation);
const cmpFoundation = Engine.QueryInterface(this.entity, IID_Foundation);
if (cmpFoundation)
cmpFoundation.RemoveBuilder(this.entity);
let cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
const cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
cmpTimer.CancelTimer(this.timer);
delete this.timer;
}
@@ -55,7 +55,7 @@ class AutoBuildable
this.CancelTimer();
return;
}
let cmpFoundation = Engine.QueryInterface(this.entity, IID_Foundation);
const cmpFoundation = Engine.QueryInterface(this.entity, IID_Foundation);
if (!cmpFoundation)
{
this.CancelTimer();
@@ -241,10 +241,10 @@ BuildRestrictions.prototype.CheckPlacement = function()
}
}
let cmpTemplateManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager);
const cmpTemplateManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager);
let templateName = cmpTemplateManager.GetCurrentTemplateName(this.entity);
let template = cmpTemplateManager.GetTemplate(removeFiltersFromTemplateName(templateName));
const templateName = cmpTemplateManager.GetCurrentTemplateName(this.entity);
const template = cmpTemplateManager.GetTemplate(removeFiltersFromTemplateName(templateName));
// Check distance restriction
if (this.template.Distance)
@@ -260,10 +260,10 @@ BuildRestrictions.prototype.CheckPlacement = function()
if (this.template.Distance.MinDistance !== undefined)
{
let minDistance = ApplyValueModificationsToTemplate("BuildRestrictions/Distance/MinDistance", +this.template.Distance.MinDistance, cmpPlayer.GetPlayerID(), template);
const minDistance = ApplyValueModificationsToTemplate("BuildRestrictions/Distance/MinDistance", +this.template.Distance.MinDistance, cmpPlayer.GetPlayerID(), template);
if (cmpRangeManager.ExecuteQuery(this.entity, 0, minDistance, [cmpPlayer.GetPlayerID()], IID_BuildRestrictions, false).some(filter))
{
let result = markForPluralTranslation(
const result = markForPluralTranslation(
"%(name)s too close to a %(category)s, must be at least %(distance)s meter away",
"%(name)s too close to a %(category)s, must be at least %(distance)s meters away",
minDistance);
@@ -281,10 +281,10 @@ BuildRestrictions.prototype.CheckPlacement = function()
}
if (this.template.Distance.MaxDistance !== undefined)
{
let maxDistance = ApplyValueModificationsToTemplate("BuildRestrictions/Distance/MaxDistance", +this.template.Distance.MaxDistance, cmpPlayer.GetPlayerID(), template);
const maxDistance = ApplyValueModificationsToTemplate("BuildRestrictions/Distance/MaxDistance", +this.template.Distance.MaxDistance, cmpPlayer.GetPlayerID(), template);
if (!cmpRangeManager.ExecuteQuery(this.entity, 0, maxDistance, [cmpPlayer.GetPlayerID()], IID_BuildRestrictions, false).some(filter))
{
let result = markForPluralTranslation(
const result = markForPluralTranslation(
"%(name)s too far from a %(category)s, must be within %(distance)s meter",
"%(name)s too far from a %(category)s, must be within %(distance)s meters",
maxDistance);
@@ -33,21 +33,21 @@ Builder.prototype.GetEntitiesList = function()
if (!string)
return [];
let cmpPlayer = QueryOwnerInterface(this.entity);
const cmpPlayer = QueryOwnerInterface(this.entity);
if (!cmpPlayer)
return [];
string = ApplyValueModificationsToEntity("Builder/Entities/_string", string, this.entity);
let cmpIdentity = Engine.QueryInterface(this.entity, IID_Identity);
const cmpIdentity = Engine.QueryInterface(this.entity, IID_Identity);
if (cmpIdentity)
string = string.replace(/\{native\}/g, cmpIdentity.GetCiv());
const entities = string.replace(/\{civ\}/g, QueryOwnerInterface(this.entity, IID_Identity).GetCiv()).split(/\s+/);
let disabledTemplates = cmpPlayer.GetDisabledTemplates();
const disabledTemplates = cmpPlayer.GetDisabledTemplates();
let cmpTemplateManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager);
const cmpTemplateManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager);
return entities.filter(ent => !disabledTemplates[ent] && cmpTemplateManager.TemplateExists(ent));
};
@@ -55,7 +55,7 @@ Builder.prototype.GetEntitiesList = function()
Builder.prototype.GetRange = function()
{
let max = 2;
let cmpObstruction = Engine.QueryInterface(this.entity, IID_Obstruction);
const cmpObstruction = Engine.QueryInterface(this.entity, IID_Obstruction);
if (cmpObstruction)
max += cmpObstruction.GetSize();
@@ -73,12 +73,12 @@ Builder.prototype.GetRate = function()
*/
Builder.prototype.CanRepair = function(target)
{
let cmpFoundation = QueryMiragedInterface(target, IID_Foundation);
let cmpRepairable = QueryMiragedInterface(target, IID_Repairable);
const cmpFoundation = QueryMiragedInterface(target, IID_Foundation);
const cmpRepairable = QueryMiragedInterface(target, IID_Repairable);
if (!cmpFoundation && (!cmpRepairable || !cmpRepairable.IsRepairable()))
return false;
let cmpOwnership = Engine.QueryInterface(this.entity, IID_Ownership);
const cmpOwnership = Engine.QueryInterface(this.entity, IID_Ownership);
return cmpOwnership && IsOwnedByAllyOfPlayer(cmpOwnership.GetOwner(), target);
};
@@ -95,18 +95,18 @@ Builder.prototype.StartRepairing = function(target, callerIID)
if (!this.CanRepair(target))
return false;
let cmpBuilderList = QueryBuilderListInterface(target);
const cmpBuilderList = QueryBuilderListInterface(target);
if (cmpBuilderList)
cmpBuilderList.AddBuilder(this.entity);
let cmpVisual = Engine.QueryInterface(this.entity, IID_Visual);
const cmpVisual = Engine.QueryInterface(this.entity, IID_Visual);
if (cmpVisual)
cmpVisual.SelectAnimation("build", false, 1.0);
this.target = target;
this.callerIID = callerIID;
let cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
const cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
this.timer = cmpTimer.SetInterval(this.entity, IID_Builder, "PerformBuilding", this.BUILD_INTERVAL, this.BUILD_INTERVAL, null);
return true;
@@ -120,28 +120,28 @@ Builder.prototype.StopRepairing = function(reason)
if (!this.target)
return;
let cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
const cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
cmpTimer.CancelTimer(this.timer);
delete this.timer;
let cmpBuilderList = QueryBuilderListInterface(this.target);
const cmpBuilderList = QueryBuilderListInterface(this.target);
if (cmpBuilderList)
cmpBuilderList.RemoveBuilder(this.entity);
delete this.target;
let cmpVisual = Engine.QueryInterface(this.entity, IID_Visual);
const cmpVisual = Engine.QueryInterface(this.entity, IID_Visual);
if (cmpVisual)
cmpVisual.SelectAnimation("idle", false, 1.0);
// The callerIID component may start again,
// replacing the callerIID, hence save that.
let callerIID = this.callerIID;
const callerIID = this.callerIID;
delete this.callerIID;
if (reason && callerIID)
{
let component = Engine.QueryInterface(this.entity, callerIID);
const component = Engine.QueryInterface(this.entity, callerIID);
if (component)
component.ProcessMessage(reason, null);
}
@@ -168,14 +168,14 @@ Builder.prototype.PerformBuilding = function(data, lateness)
// ToDo: Enable entities to keep facing a target.
Engine.QueryInterface(this.entity, IID_UnitAI)?.FaceTowardsTarget(this.target);
let cmpFoundation = Engine.QueryInterface(this.target, IID_Foundation);
const cmpFoundation = Engine.QueryInterface(this.target, IID_Foundation);
if (cmpFoundation)
{
cmpFoundation.Build(this.entity, this.GetRate());
return;
}
let cmpRepairable = Engine.QueryInterface(this.target, IID_Repairable);
const cmpRepairable = Engine.QueryInterface(this.target, IID_Repairable);
if (cmpRepairable)
{
cmpRepairable.Repair(this.entity, this.GetRate());
@@ -189,8 +189,8 @@ Builder.prototype.PerformBuilding = function(data, lateness)
*/
Builder.prototype.IsTargetInRange = function(target)
{
let range = this.GetRange();
let cmpObstructionManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_ObstructionManager);
const range = this.GetRange();
const cmpObstructionManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_ObstructionManager);
return cmpObstructionManager.IsInTargetRange(this.entity, target, range.min, range.max, false);
};
@@ -200,7 +200,7 @@ Builder.prototype.OnValueModification = function(msg)
return;
// Token changes may require selection updates.
let cmpPlayer = QueryOwnerInterface(this.entity, IID_Player);
const cmpPlayer = QueryOwnerInterface(this.entity, IID_Player);
if (cmpPlayer)
Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface).SetSelectionDirty(cmpPlayer.GetPlayerID());
};
@@ -33,16 +33,16 @@ BuildingAI.prototype.Init = function()
BuildingAI.prototype.OnGarrisonedUnitsChanged = function(msg)
{
let classes = this.template.GarrisonArrowClasses;
for (let ent of msg.added)
const classes = this.template.GarrisonArrowClasses;
for (const ent of msg.added)
{
let cmpIdentity = Engine.QueryInterface(ent, IID_Identity);
const cmpIdentity = Engine.QueryInterface(ent, IID_Identity);
if (cmpIdentity && MatchesClassList(cmpIdentity.GetClassesList(), classes))
++this.archersGarrisoned;
}
for (let ent of msg.removed)
for (const ent of msg.removed)
{
let cmpIdentity = Engine.QueryInterface(ent, IID_Identity);
const cmpIdentity = Engine.QueryInterface(ent, IID_Identity);
if (cmpIdentity && MatchesClassList(cmpIdentity.GetClassesList(), classes))
--this.archersGarrisoned;
}
@@ -71,13 +71,13 @@ BuildingAI.prototype.OnDestroy = function()
{
if (this.timer)
{
let cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
const cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
cmpTimer.CancelTimer(this.timer);
this.timer = undefined;
}
// Clean up range queries.
let cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
const cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
if (this.enemyUnitsQuery)
cmpRangeManager.DestroyActiveQuery(this.enemyUnitsQuery);
if (this.gaiaUnitsQuery)
@@ -179,7 +179,7 @@ BuildingAI.prototype.OnRangeUpdate = function(msg)
if (msg.tag == this.gaiaUnitsQuery)
{
msg.added = msg.added.filter(e => {
let cmpUnitAI = Engine.QueryInterface(e, IID_UnitAI);
const cmpUnitAI = Engine.QueryInterface(e, IID_UnitAI);
return cmpUnitAI && (!cmpUnitAI.IsAnimal() || cmpUnitAI.IsDangerousAnimal());
});
}
@@ -187,14 +187,14 @@ BuildingAI.prototype.OnRangeUpdate = function(msg)
return;
// Add new targets.
for (let entity of msg.added)
for (const entity of msg.added)
if (cmpAttack.CanAttack(entity))
this.targetUnits.push(entity);
// Remove targets outside of vision-range.
for (let entity of msg.removed)
for (const entity of msg.removed)
{
let index = this.targetUnits.indexOf(entity);
const index = this.targetUnits.indexOf(entity);
if (index > -1)
this.targetUnits.splice(index, 1);
}
@@ -230,7 +230,7 @@ BuildingAI.prototype.GetMaxArrowCount = function()
if (!this.template.MaxArrowCount)
return Infinity;
let maxArrowCount = +this.template.MaxArrowCount;
const maxArrowCount = +this.template.MaxArrowCount;
return Math.round(ApplyValueModificationsToEntity("BuildingAI/MaxArrowCount", maxArrowCount, this.entity));
};
@@ -255,7 +255,7 @@ BuildingAI.prototype.GetGarrisonArrowClasses = function()
*/
BuildingAI.prototype.GetArrowCount = function()
{
let count = this.GetDefaultArrowCount() +
const count = this.GetDefaultArrowCount() +
Math.round(this.archersGarrisoned * this.GetGarrisonArrowMultiplier());
return Math.min(count, this.GetMaxArrowCount());
@@ -295,13 +295,13 @@ BuildingAI.prototype.FireArrows = function()
if (!this.timer)
return;
let cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
const cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
cmpTimer.CancelTimer(this.timer);
this.timer = undefined;
return;
}
let cmpAttack = Engine.QueryInterface(this.entity, IID_Attack);
const cmpAttack = Engine.QueryInterface(this.entity, IID_Attack);
if (!cmpAttack)
return;
@@ -329,7 +329,7 @@ BuildingAI.prototype.FireArrows = function()
// Add targets to a list.
let targets = [];
let addTarget = function(target)
const addTarget = function(target)
{
const pref = (cmpAttack.GetPreference(target) ?? 49);
targets.push({ "entityId": target, "preference": pref });
@@ -344,7 +344,7 @@ BuildingAI.prototype.FireArrows = function()
if (!this.focusTargets.length)
{
for (let target of this.targetUnits)
for (const target of this.targetUnits)
addTarget(target);
// Sort targets by preference and then by proximity.
targets.sort( (a, b) => {
@@ -372,7 +372,7 @@ BuildingAI.prototype.FireArrows = function()
while (firedArrows < arrowsToFire && targetIndex < targets.length)
{
let selectedTarget = targets[targetIndex].entityId;
const selectedTarget = targets[targetIndex].entityId;
if (this.CheckTargetVisible(selectedTarget) && cmpObstructionManager.IsInTargetParabolicRange(
this.entity,
selectedTarget,
@@ -408,7 +408,7 @@ BuildingAI.prototype.CheckTargetVisible = function(target)
return true;
// Either visible directly, or visible in fog.
let cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
const cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
return cmpRangeManager.GetLosVisibility(target, cmpOwnership.GetOwner()) != "hidden";
};