diff --git a/binaries/data/mods/public/art/textures/ui/session/icons/supply_bg.png b/binaries/data/mods/public/art/textures/ui/session/icons/supply_bg.png
new file mode 100644
index 0000000000..58a106a4cc
--- /dev/null
+++ b/binaries/data/mods/public/art/textures/ui/session/icons/supply_bg.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:541834ea6672d8d9d4853673ca066745078eccf53ff7a41cf5dbca98ee87cf7f
+size 112
diff --git a/binaries/data/mods/public/art/textures/ui/session/icons/supply_fg.png b/binaries/data/mods/public/art/textures/ui/session/icons/supply_fg.png
new file mode 100644
index 0000000000..a191d6a312
--- /dev/null
+++ b/binaries/data/mods/public/art/textures/ui/session/icons/supply_fg.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a547b4b35b1d2481a6fb7d2cbb225cb07244a25e41656df8c6dfa22faebef412
+size 119
diff --git a/binaries/data/mods/public/art/textures/ui/session/icons/textures.xml b/binaries/data/mods/public/art/textures/ui/session/icons/textures.xml
index e808281b94..66cb610f64 100644
--- a/binaries/data/mods/public/art/textures/ui/session/icons/textures.xml
+++ b/binaries/data/mods/public/art/textures/ui/session/icons/textures.xml
@@ -1,4 +1,5 @@
+
diff --git a/binaries/data/mods/public/gui/session_new/input.js b/binaries/data/mods/public/gui/session_new/input.js
index 3fc7c24b66..b29ed582e9 100644
--- a/binaries/data/mods/public/gui/session_new/input.js
+++ b/binaries/data/mods/public/gui/session_new/input.js
@@ -471,8 +471,21 @@ function handleInputAfterGui(ev)
switch (ev.type)
{
case "mousemotion":
+ // Highlight the first hovered entities, if it's not a unit
var ents = Engine.PickEntitiesAtPoint(ev.x, ev.y);
- g_Selection.setHighlightList(ents);
+ if (ents.length == 0)
+ {
+ g_Selection.setHighlightList([]);
+ }
+ else
+ {
+ var entState = GetEntityState(ents[0]);
+ if (entState && !isUnit(entState))
+ g_Selection.setHighlightList([ents[0]]);
+ else
+ g_Selection.setHighlightList([]);
+ }
+
return false;
case "mousebuttondown":
diff --git a/binaries/data/mods/public/simulation/components/ResourceSupply.js b/binaries/data/mods/public/simulation/components/ResourceSupply.js
index 45414a1203..622c3f90c3 100644
--- a/binaries/data/mods/public/simulation/components/ResourceSupply.js
+++ b/binaries/data/mods/public/simulation/components/ResourceSupply.js
@@ -56,6 +56,8 @@ ResourceSupply.prototype.TakeResources = function(rate)
if (this.amount == 0)
Engine.DestroyEntity(this.entity);
+ Engine.PostMessage(this.entity, MT_ResourceSupplyChanged, { "from": old, "to": this.amount });
+
return { "amount": change, "exhausted": (old == 0) };
};
diff --git a/binaries/data/mods/public/simulation/components/StatusBars.js b/binaries/data/mods/public/simulation/components/StatusBars.js
index 2a10f0539f..fdf13e1785 100644
--- a/binaries/data/mods/public/simulation/components/StatusBars.js
+++ b/binaries/data/mods/public/simulation/components/StatusBars.js
@@ -1,6 +1,12 @@
function StatusBars() {}
StatusBars.prototype.Schema =
+ "" +
+ "" +
+ "" +
+ "" +
+ "" +
+ "" +
"" +
"" +
"";
@@ -34,6 +40,12 @@ StatusBars.prototype.OnHealthChanged = function(msg)
this.RegenerateSprites();
};
+StatusBars.prototype.OnResourceSupplyChanged = function(msg)
+{
+ if (this.enabled)
+ this.RegenerateSprites();
+};
+
StatusBars.prototype.ResetSprites = function()
{
var cmpOverlayRenderer = Engine.QueryInterface(this.entity, IID_OverlayRenderer);
@@ -46,28 +58,42 @@ StatusBars.prototype.RegenerateSprites = function()
cmpOverlayRenderer.Reset();
// Size of health bar (in world-space units)
- var width = 2;
- var height = 1/3;
+ var width = +this.template.BarWidth;
+ var height = +this.template.BarHeight;
- // Offset from the unit's position
+ // World-space offset from the unit's position
var offset = { "x": 0, "y": +this.template.HeightOffset, "z": 0 };
+ // Billboard offset of next bar
+ var yoffset = 0;
+
+ var AddBar = function(type, amount)
+ {
+ cmpOverlayRenderer.AddSprite(
+ "art/textures/ui/session/icons/"+type+"_bg.png",
+ { "x": -width/2, "y": -height/2 + yoffset }, { "x": width/2, "y": height/2 + yoffset },
+ offset
+ );
+
+ cmpOverlayRenderer.AddSprite(
+ "art/textures/ui/session/icons/"+type+"_fg.png",
+ { "x": -width/2, "y": -height/2 + yoffset }, { "x": width*(amount - 0.5), "y": height/2 + yoffset },
+ offset
+ );
+
+ yoffset -= height * 1.2;
+ };
+
var cmpHealth = Engine.QueryInterface(this.entity, IID_Health);
if (cmpHealth)
{
- var filled = cmpHealth.GetHitpoints() / cmpHealth.GetMaxHitpoints();
+ AddBar("health", cmpHealth.GetHitpoints() / cmpHealth.GetMaxHitpoints());
+ }
- cmpOverlayRenderer.AddSprite(
- "art/textures/ui/session/icons/health_bg.png",
- { "x": -width/2, "y": -height/2 }, { "x": width/2, "y": height/2 },
- offset
- );
-
- cmpOverlayRenderer.AddSprite(
- "art/textures/ui/session/icons/health_fg.png",
- { "x": -width/2, "y": -height/2 }, { "x": width*(filled - 0.5), "y": height/2 },
- offset
- );
+ var cmpResourceSupply = Engine.QueryInterface(this.entity, IID_ResourceSupply);
+ if (cmpResourceSupply)
+ {
+ AddBar("supply", cmpResourceSupply.GetCurrentAmount() / cmpResourceSupply.GetMaxAmount());
}
};
diff --git a/binaries/data/mods/public/simulation/components/interfaces/ResourceSupply.js b/binaries/data/mods/public/simulation/components/interfaces/ResourceSupply.js
index 5b63e5ea10..017d762a1f 100644
--- a/binaries/data/mods/public/simulation/components/interfaces/ResourceSupply.js
+++ b/binaries/data/mods/public/simulation/components/interfaces/ResourceSupply.js
@@ -1 +1,5 @@
Engine.RegisterInterface("ResourceSupply");
+
+// Message of the form { "from": 100, "to", 90 },
+// sent whenever supply level changes.
+Engine.RegisterMessageType("ResourceSupplyChanged");
diff --git a/binaries/data/mods/public/simulation/templates/template_gaia.xml b/binaries/data/mods/public/simulation/templates/template_gaia.xml
index 9102795053..e0070c6c68 100644
--- a/binaries/data/mods/public/simulation/templates/template_gaia.xml
+++ b/binaries/data/mods/public/simulation/templates/template_gaia.xml
@@ -8,4 +8,10 @@
0
true
+
+ 2.0
+ 0.333
+ 5.0
+
+
diff --git a/binaries/data/mods/public/simulation/templates/template_structure.xml b/binaries/data/mods/public/simulation/templates/template_structure.xml
index 1d0b86e86c..6eba937ced 100644
--- a/binaries/data/mods/public/simulation/templates/template_structure.xml
+++ b/binaries/data/mods/public/simulation/templates/template_structure.xml
@@ -44,6 +44,8 @@
10.0
+ 8.0
+ 0.666
12.0
diff --git a/binaries/data/mods/public/simulation/templates/template_unit.xml b/binaries/data/mods/public/simulation/templates/template_unit.xml
index d2f12271cb..328207aa9f 100644
--- a/binaries/data/mods/public/simulation/templates/template_unit.xml
+++ b/binaries/data/mods/public/simulation/templates/template_unit.xml
@@ -55,6 +55,8 @@
default
+ 2.0
+ 0.333
5.0
diff --git a/source/simulation2/components/CCmpTemplateManager.cpp b/source/simulation2/components/CCmpTemplateManager.cpp
index 0fae9a8fdf..e5a2b7f2f6 100644
--- a/source/simulation2/components/CCmpTemplateManager.cpp
+++ b/source/simulation2/components/CCmpTemplateManager.cpp
@@ -462,6 +462,8 @@ void CCmpTemplateManager::CopyFoundationSubset(CParamNode& out, const CParamNode
permittedComponentTypes.insert("Footprint");
permittedComponentTypes.insert("Armour");
permittedComponentTypes.insert("Health");
+ permittedComponentTypes.insert("StatusBars");
+ permittedComponentTypes.insert("OverlayRenderer");
permittedComponentTypes.insert("Decay");
permittedComponentTypes.insert("Cost");
permittedComponentTypes.insert("Sound");