mirror of
https://gitea.wildfiregames.com/0ad/0ad
synced 2026-07-10 00:45:47 -07:00
d0fc8ff67d / D2759 made ranges account for entity size, making auras
larger than they needed to be. This accounts for that.
Units haven't been changed, the delta is not worth modifying imo.
As discussed with Nescio, this means that, for a given aura, larger
buildings will now have a larger "aura area". This particularly affects
oblong buildings.
A proper solution for this would be to not approximate some structures
as a circle, but remains to be implemented.
Note that for current 0 A.D., this effect is unlikely to be a
significant gameplay advantage to one civilisation over another.
Reviewed By: Nescio
Differential Revision: https://code.wildfiregames.com/D3169
This was SVN commit r24349.
95 lines
2.6 KiB
JavaScript
95 lines
2.6 KiB
JavaScript
function RangeOverlayManager() {}
|
|
|
|
RangeOverlayManager.prototype.Schema = "<empty/>";
|
|
|
|
RangeOverlayManager.prototype.Init = function()
|
|
{
|
|
this.enabled = false;
|
|
this.enabledRangeTypes = {
|
|
"Attack": false,
|
|
"Auras": false,
|
|
"Heal": false
|
|
};
|
|
|
|
this.rangeVisualizations = new Map();
|
|
};
|
|
|
|
// The GUI enables visualizations
|
|
RangeOverlayManager.prototype.Serialize = null;
|
|
|
|
RangeOverlayManager.prototype.Deserialize = function(data)
|
|
{
|
|
this.Init();
|
|
};
|
|
|
|
RangeOverlayManager.prototype.UpdateRangeOverlays = function(componentName)
|
|
{
|
|
let cmp = Engine.QueryInterface(this.entity, global["IID_" + componentName]);
|
|
if (cmp)
|
|
this.rangeVisualizations.set(componentName, cmp.GetRangeOverlays());
|
|
};
|
|
|
|
RangeOverlayManager.prototype.SetEnabled = function(enabled, enabledRangeTypes, forceUpdate)
|
|
{
|
|
this.enabled = enabled;
|
|
this.enabledRangeTypes = enabledRangeTypes;
|
|
|
|
this.RegenerateRangeOverlays(forceUpdate);
|
|
};
|
|
|
|
RangeOverlayManager.prototype.RegenerateRangeOverlays = function(forceUpdate)
|
|
{
|
|
let cmpRangeOverlayRenderer = Engine.QueryInterface(this.entity, IID_RangeOverlayRenderer);
|
|
if (!cmpRangeOverlayRenderer)
|
|
return;
|
|
|
|
cmpRangeOverlayRenderer.ResetRangeOverlays();
|
|
|
|
if (!this.enabled && !forceUpdate)
|
|
return;
|
|
|
|
let cmpObstruction = Engine.QueryInterface(this.entity, IID_Obstruction);
|
|
let rangeBonus = cmpObstruction ? cmpObstruction.GetSize() : 0;
|
|
|
|
// Only render individual range types that have been enabled
|
|
for (let rangeOverlayType of this.rangeVisualizations.keys())
|
|
if (this.enabledRangeTypes[rangeOverlayType])
|
|
for (let rangeOverlay of this.rangeVisualizations.get(rangeOverlayType))
|
|
cmpRangeOverlayRenderer.AddRangeOverlay(
|
|
rangeOverlay.radius + rangeBonus,
|
|
rangeOverlay.texture,
|
|
rangeOverlay.textureMask,
|
|
rangeOverlay.thickness);
|
|
};
|
|
|
|
RangeOverlayManager.prototype.OnOwnershipChanged = function(msg)
|
|
{
|
|
if (msg.to == INVALID_PLAYER)
|
|
return;
|
|
for (let type in this.enabledRangeTypes)
|
|
this.UpdateRangeOverlays(type);
|
|
|
|
this.RegenerateRangeOverlays(false);
|
|
};
|
|
|
|
RangeOverlayManager.prototype.OnValueModification = function(msg)
|
|
{
|
|
if (msg.valueNames.indexOf("Heal/Range") == -1 &&
|
|
msg.valueNames.indexOf("Attack/Ranged/MinRange") == -1 &&
|
|
msg.valueNames.indexOf("Attack/Ranged/MaxRange") == -1)
|
|
return;
|
|
|
|
this.UpdateRangeOverlays(msg.component);
|
|
this.RegenerateRangeOverlays(false);
|
|
};
|
|
|
|
/**
|
|
* RangeOverlayManager component is deserialized before the TechnologyManager, so need to update the ranges here
|
|
*/
|
|
RangeOverlayManager.prototype.OnDeserialized = function(msg)
|
|
{
|
|
for (let type in this.enabledRangeTypes)
|
|
this.UpdateRangeOverlays(type);
|
|
};
|
|
|
|
Engine.RegisterComponentType(IID_RangeOverlayManager, "RangeOverlayManager", RangeOverlayManager);
|