diff --git a/binaries/data/config/default.cfg b/binaries/data/config/default.cfg
index 9493d2fca9..2f6b23ed70 100644
--- a/binaries/data/config/default.cfg
+++ b/binaries/data/config/default.cfg
@@ -168,7 +168,7 @@ session.showstatusbars = Tab ; Toggle display of status bars
session.highlightguarding = PgDn ; Toggle highlight of guarding units
session.highlightguarded = PgUp ; Toggle highlight of guarded units
session.toggleattackrange = "Alt+C" ; Toggle display of attack range overlays of selected defensive structures
-session.toggleaurarange = "Alt+V" ; Toggle display of aura range overlays of selected units and structures
+session.toggleaurasrange = "Alt+V" ; Toggle display of aura range overlays of selected units and structures
session.togglehealrange = "Alt+B" ; Toggle display of heal range overlays of selected units
; > HOTKEYS ONLY
@@ -348,7 +348,7 @@ camerajump.threshold = 40 ; How close do we have to be to the actual loc
timeelapsedcounter = false ; Show the game duration in the top right corner
batchtrainingsize = 5 ; Number of units to be trained per batch (when pressing the hotkey)
attackrange = true ; Display attack range overlays of selected defensive structures
-aurarange = true ; Display aura range overlays of selected units and structures
+aurasrange = true ; Display aura range overlays of selected units and structures
healrange = true ; Display heal range overlays of selected units
[gui.session.minimap]
diff --git a/binaries/data/mods/public/gui/session/hotkeys/misc.xml b/binaries/data/mods/public/gui/session/hotkeys/misc.xml
index 575837aa48..4ad8d8c592 100644
--- a/binaries/data/mods/public/gui/session/hotkeys/misc.xml
+++ b/binaries/data/mods/public/gui/session/hotkeys/misc.xml
@@ -101,8 +101,8 @@
toggleRangeOverlay("Attack");
-
- toggleRangeOverlay("Aura");
+
+ toggleRangeOverlay("Auras");
diff --git a/binaries/data/mods/public/gui/session/session.js b/binaries/data/mods/public/gui/session/session.js
index 21bc0e4b4c..12b3b661e6 100644
--- a/binaries/data/mods/public/gui/session/session.js
+++ b/binaries/data/mods/public/gui/session/session.js
@@ -797,7 +797,7 @@ function onSimulationUpdate()
handleNotifications();
updateGUIObjects();
- for (let type of ["Attack", "Aura", "Heal"])
+ for (let type of ["Attack", "Auras", "Heal"])
Engine.GuiInterfaceCall("EnableVisualRangeOverlayType", {
"type": type,
"enabled": Engine.ConfigDB_GetValue("user", "gui.session." + type.toLowerCase() + "range") == "true"
@@ -1280,7 +1280,7 @@ function toggleConfigBool(configName)
/**
* Toggles the display of range overlays of selected entities for the given range type.
- * @param {string} type - for example "Aura"
+ * @param {string} type - for example "Auras"
*/
function toggleRangeOverlay(type)
{
diff --git a/binaries/data/mods/public/simulation/components/Auras.js b/binaries/data/mods/public/simulation/components/Auras.js
index 53fe2610dd..b78dd4eb02 100644
--- a/binaries/data/mods/public/simulation/components/Auras.js
+++ b/binaries/data/mods/public/simulation/components/Auras.js
@@ -66,29 +66,6 @@ Auras.prototype.GetRange = function(name)
return undefined;
};
-/**
- * Return the names of any range auras - used to render their ranges.
- */
-Auras.prototype.GetVisualAuraRangeNames = function()
-{
- return this.GetAuraNames().filter(auraName => this.IsRangeAura(auraName) && this[auraName].isApplied);
-};
-
-Auras.prototype.GetLineTexture = function(name)
-{
- return this.auras[name].rangeOverlay ? this.auras[name].rangeOverlay.lineTexture : "outline_border.png";
-};
-
-Auras.prototype.GetLineTextureMask = function(name)
-{
- return this.auras[name].rangeOverlay ? this.auras[name].rangeOverlay.lineTextureMask : "outline_border_mask.png";
-};
-
-Auras.prototype.GetLineThickness = function(name)
-{
- return this.auras[name].rangeOverlay ? this.auras[name].rangeOverlay.lineThickness : 0.2;
-};
-
Auras.prototype.GetClasses = function(name)
{
return this.auras[name].affects;
@@ -104,6 +81,35 @@ Auras.prototype.GetAffectedPlayers = function(name)
return this.affectedPlayers[name];
};
+Auras.prototype.GetRangeOverlays = function()
+{
+ let rangeOverlays = [];
+
+ for (let name of this.GetAuraNames())
+ {
+ if (!this.IsRangeAura(name) || !this[name].isApplied)
+ continue;
+
+ rangeOverlays.push(
+ this.auras[name].rangeOverlay ?
+ {
+ "radius": this.GetRange(name),
+ "texture": this.auras[name].rangeOverlay.lineTexture,
+ "textureMask": this.auras[name].rangeOverlay.lineTextureMask,
+ "thickness": this.auras[name].rangeOverlay.lineThickness
+ } :
+ // Specify default in order not to specify it in about 40 auras
+ {
+ "radius": this.GetRange(name),
+ "texture": "outline_border.png",
+ "textureMask": "outline_border_mask.png",
+ "thickness": 0.2
+ });
+ }
+
+ return rangeOverlays;
+};
+
Auras.prototype.CalculateAffectedPlayers = function(name)
{
var affectedPlayers = this.auras[name].affectedPlayers || ["Player"];
@@ -278,7 +284,7 @@ Auras.prototype.Clean = function()
let cmpRangeVisualization = Engine.QueryInterface(this.entity, IID_RangeVisualization);
if (cmpRangeVisualization)
{
- cmpRangeVisualization.UpdateVisualAuraRanges();
+ cmpRangeVisualization.UpdateRangeOverlays("Auras");
cmpRangeVisualization.RegenerateRangeVisualizations(false);
}
}
diff --git a/binaries/data/mods/public/simulation/components/Heal.js b/binaries/data/mods/public/simulation/components/Heal.js
index 311d2fa766..ba7ebcd21f 100644
--- a/binaries/data/mods/public/simulation/components/Heal.js
+++ b/binaries/data/mods/public/simulation/components/Heal.js
@@ -87,19 +87,17 @@ Heal.prototype.GetHealableClasses = function()
return this.template.HealableClasses._string || "";
};
-Heal.prototype.GetLineTexture = function()
+Heal.prototype.GetRangeOverlays = function()
{
- return this.template.RangeOverlay ? this.template.RangeOverlay.LineTexture : "heal_overlay_range.png";
-};
+ if (!this.template.RangeOverlay)
+ return [];
-Heal.prototype.GetLineTextureMask = function()
-{
- return this.template.RangeOverlay ? this.template.RangeOverlay.LineTextureMask : "heal_overlay_range_mask.png";
-};
-
-Heal.prototype.GetLineThickness = function()
-{
- return this.template.RangeOverlay ? +this.template.RangeOverlay.LineThickness : 0.35;
+ return [{
+ "radius": this.GetRange().max,
+ "texture": this.template.RangeOverlay.LineTexture,
+ "textureMask": this.template.RangeOverlay.LineTextureMask,
+ "thickness": +this.template.RangeOverlay.LineThickness
+ }]
};
/**
diff --git a/binaries/data/mods/public/simulation/components/RangeVisualization.js b/binaries/data/mods/public/simulation/components/RangeVisualization.js
index 6fa145669f..e6c91a6d86 100644
--- a/binaries/data/mods/public/simulation/components/RangeVisualization.js
+++ b/binaries/data/mods/public/simulation/components/RangeVisualization.js
@@ -7,7 +7,7 @@ RangeVisualization.prototype.Init = function()
this.enabled = false;
this.enabledRangeTypes = {
"Attack": false,
- "Aura": false,
+ "Auras": false,
"Heal": false
};
@@ -22,42 +22,11 @@ RangeVisualization.prototype.Deserialize = function(data)
this.Init();
};
-RangeVisualization.prototype.UpdateVisualAttackRanges = function()
+RangeVisualization.prototype.UpdateRangeOverlays = function(componentName)
{
- let cmpAttack = Engine.QueryInterface(this.entity, IID_Attack);
- if (cmpAttack)
- this.rangeVisualizations.set("Attack", cmpAttack.GetRangeOverlays());
-};
-
-RangeVisualization.prototype.UpdateVisualAuraRanges = function()
-{
- let cmpAuras = Engine.QueryInterface(this.entity, IID_Auras);
- if (!cmpAuras)
- return;
-
- this.rangeVisualizations.set("Aura", []);
-
- for (let auraName of cmpAuras.GetVisualAuraRangeNames())
- this.rangeVisualizations.get("Aura").push({
- "radius": cmpAuras.GetRange(auraName),
- "texture": cmpAuras.GetLineTexture(auraName),
- "textureMask": cmpAuras.GetLineTextureMask(auraName),
- "thickness": cmpAuras.GetLineThickness(auraName),
- });
-};
-
-RangeVisualization.prototype.UpdateVisualHealRanges = function()
-{
- let cmpHeal = Engine.QueryInterface(this.entity, IID_Heal);
- if (!cmpHeal)
- return;
-
- this.rangeVisualizations.set("Heal", [{
- "radius": cmpHeal.GetRange().max,
- "texture": cmpHeal.GetLineTexture(),
- "textureMask": cmpHeal.GetLineTextureMask(),
- "thickness": cmpHeal.GetLineThickness(),
- }]);
+ let cmp = Engine.QueryInterface(this.entity, global["IID_" + componentName]);
+ if (cmp)
+ this.rangeVisualizations.set(componentName, cmp.GetRangeOverlays());
};
RangeVisualization.prototype.SetEnabled = function(enabled, enabledRangeTypes, forceUpdate)
@@ -95,7 +64,8 @@ RangeVisualization.prototype.OnOwnershipChanged = function(msg)
if (msg.to == -1)
return;
for (let type in this.enabledRangeTypes)
- this["UpdateVisual" + type + "Ranges"]();
+ this.UpdateRangeOverlays(type);
+
this.RegenerateRangeVisualizations(false);
};
@@ -106,7 +76,7 @@ RangeVisualization.prototype.OnValueModification = function(msg)
msg.valueNames.indexOf("Attack/Ranged/MaxRange") == -1)
return;
- this["UpdateVisual" + msg.component + "Ranges"]();
+ this.UpdateRangeOverlays(msg.component);
this.RegenerateRangeVisualizations(false);
};
@@ -116,7 +86,7 @@ RangeVisualization.prototype.OnValueModification = function(msg)
RangeVisualization.prototype.OnDeserialized = function(msg)
{
for (let type in this.enabledRangeTypes)
- this["UpdateVisual" + type + "Ranges"]();
+ this.UpdateRangeOverlays(type);
};
Engine.RegisterComponentType(IID_RangeVisualization, "RangeVisualization", RangeVisualization);
diff --git a/binaries/data/mods/public/simulation/components/tests/test_Heal.js b/binaries/data/mods/public/simulation/components/tests/test_Heal.js
index 5b07b6e487..db34d12902 100644
--- a/binaries/data/mods/public/simulation/components/tests/test_Heal.js
+++ b/binaries/data/mods/public/simulation/components/tests/test_Heal.js
@@ -53,11 +53,12 @@ TS_ASSERT_EQUALS(cmpHeal.GetHealableClasses(), "Support Infantry");
TS_ASSERT_EQUALS(cmpHeal.GetUnhealableClasses(), "Cavalry");
-TS_ASSERT_EQUALS(cmpHeal.GetLineTexture(), "heal_overlay_range.png");
-
-TS_ASSERT_EQUALS(cmpHeal.GetLineTextureMask(), "heal_overlay_range_mask.png");
-
-TS_ASSERT_EQUALS(cmpHeal.GetLineThickness(), 0.35);
+TS_ASSERT_UNEVAL_EQUALS(cmpHeal.GetRangeOverlays(), [{
+ "radius": 20 + 300,
+ "texture": "heal_overlay_range.png",
+ "textureMask": "heal_overlay_range_mask.png",
+ "thickness": 0.35
+}]);
// Test PerformHeal
let target = 70;
diff --git a/binaries/data/mods/public/simulation/templates/template_unit_hero_healer.xml b/binaries/data/mods/public/simulation/templates/template_unit_hero_healer.xml
index 17581ba52d..76c2524d4b 100644
--- a/binaries/data/mods/public/simulation/templates/template_unit_hero_healer.xml
+++ b/binaries/data/mods/public/simulation/templates/template_unit_hero_healer.xml
@@ -19,6 +19,11 @@
2000
Human
+
+ heal_overlay_range.png
+ heal_overlay_range_mask.png
+ 0.35
+
1000
diff --git a/binaries/data/mods/public/simulation/templates/template_unit_support_healer.xml b/binaries/data/mods/public/simulation/templates/template_unit_support_healer.xml
index 27fa1ba266..ac50459a6d 100644
--- a/binaries/data/mods/public/simulation/templates/template_unit_support_healer.xml
+++ b/binaries/data/mods/public/simulation/templates/template_unit_support_healer.xml
@@ -11,6 +11,11 @@
2000
Human
+
+ heal_overlay_range.png
+ heal_overlay_range_mask.png
+ 0.35
+
85