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");