diff --git a/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj b/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj index 0713fd3395..67d44f1880 100644 --- a/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj +++ b/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj @@ -102,7 +102,6 @@ - @@ -110,7 +109,6 @@ - diff --git a/OpenRA.Mods.Cnc/Widgets/Logic/CncIngameChromeLogic.cs b/OpenRA.Mods.Cnc/Widgets/Logic/CncIngameChromeLogic.cs index 0bc7b465f2..df979a5ff1 100644 --- a/OpenRA.Mods.Cnc/Widgets/Logic/CncIngameChromeLogic.cs +++ b/OpenRA.Mods.Cnc/Widgets/Logic/CncIngameChromeLogic.cs @@ -125,11 +125,12 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic siloBar.GetProvided = () => playerResources.OreCapacity; siloBar.GetUsed = () => playerResources.Ore; siloBar.TooltipFormat = "Silo Usage: {0}/{1}"; - siloBar.RightIndicator = true; siloBar.GetBarColor = () => { - if (playerResources.Ore == playerResources.OreCapacity) return Color.Red; - if (playerResources.Ore >= 0.8 * playerResources.OreCapacity) return Color.Orange; + if (playerResources.Ore == playerResources.OreCapacity) + return Color.Red; + if (playerResources.Ore >= 0.8 * playerResources.OreCapacity) + return Color.Orange; return Color.LimeGreen; }; @@ -137,11 +138,12 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic powerBar.GetProvided = () => powerManager.PowerProvided; powerBar.GetUsed = () => powerManager.PowerDrained; powerBar.TooltipFormat = "Power Usage: {0}/{1}"; - powerBar.RightIndicator = false; powerBar.GetBarColor = () => { - if (powerManager.PowerState == PowerState.Critical) return Color.Red; - if (powerManager.PowerState == PowerState.Low) return Color.Orange; + if (powerManager.PowerState == PowerState.Critical) + return Color.Red; + if (powerManager.PowerState == PowerState.Low) + return Color.Orange; return Color.LimeGreen; }; } diff --git a/OpenRA.Mods.Cnc/Widgets/ResourceBarWidget.cs b/OpenRA.Mods.Cnc/Widgets/ResourceBarWidget.cs deleted file mode 100755 index 7038fb46ba..0000000000 --- a/OpenRA.Mods.Cnc/Widgets/ResourceBarWidget.cs +++ /dev/null @@ -1,84 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation. For more information, - * see COPYING. - */ -#endregion - -using System; -using System.Drawing; -using OpenRA.FileFormats; -using OpenRA.Graphics; -using OpenRA.Traits; -using OpenRA.Widgets; - -namespace OpenRA.Mods.Cnc.Widgets -{ - public class ResourceBarWidget : Widget - { - public readonly string TooltipTemplate = "SIMPLE_TOOLTIP"; - public readonly string TooltipContainer; - Lazy tooltipContainer; - - public float LowStorageThreshold = 0.8f; - EWMA providedLerp = new EWMA(0.3f); - EWMA usedLerp = new EWMA(0.3f); - - public Func GetProvided = () => 0; - public Func GetUsed = () => 0; - public string TooltipFormat = ""; - public bool RightIndicator = false; - public Func GetBarColor = () => Color.White; - - [ObjectCreator.UseCtor] - public ResourceBarWidget(World world) - { - tooltipContainer = Lazy.New(() => - Ui.Root.Get(TooltipContainer)); - } - - public override void MouseEntered() - { - if (TooltipContainer == null) return; - Func getText = () => TooltipFormat.F(GetUsed(), GetProvided()); - tooltipContainer.Value.SetTooltip(TooltipTemplate, new WidgetArgs() {{ "getText", getText }}); - } - - public override void MouseExited() - { - if (TooltipContainer == null) return; - tooltipContainer.Value.RemoveTooltip(); - } - - public override void Draw() - { - var scaleBy = 100.0f; - var provided = GetProvided(); - var used = GetUsed(); - var max = Math.Max(provided, used); - while (max >= scaleBy) scaleBy *= 2; - - var providedFrac = providedLerp.Update(provided/scaleBy); - var usedFrac = usedLerp.Update(used/scaleBy); - - var color = GetBarColor(); - - var b = RenderBounds; - var rect = new RectangleF(b.X, float2.Lerp( b.Bottom, b.Top, providedFrac ), - b.Width, providedFrac*b.Height); - Game.Renderer.LineRenderer.FillRect(rect, color); - - var indicator = ChromeProvider.GetImage("sidebar-bits", - RightIndicator ? "right-indicator" : "left-indicator"); - - var indicatorX = RightIndicator ? (b.Right - indicator.size.X) : b.Left; - - var pos = new float2(indicatorX, float2.Lerp( b.Bottom, b.Top, usedFrac ) - indicator.size.Y / 2); - - Game.Renderer.RgbaSpriteRenderer.DrawSprite(indicator, pos); - } - } -} diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj index 6a187983c5..6713cdc609 100644 --- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj +++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj @@ -408,7 +408,6 @@ - @@ -456,6 +455,8 @@ + + diff --git a/OpenRA.Mods.RA/Widgets/Logic/IngameChromeLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/IngameChromeLogic.cs index 8d08ec3895..f5992b2efd 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/IngameChromeLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/IngameChromeLogic.cs @@ -11,6 +11,7 @@ using System.Drawing; using System.Linq; using OpenRA.Network; +using OpenRA.Mods.RA.Buildings; using OpenRA.Traits; using OpenRA.Widgets; @@ -119,6 +120,21 @@ namespace OpenRA.Mods.RA.Widgets.Logic radarBin.Get("RADAR_BIN_BG").GetImageCollection = () => "chrome-"+world.LocalPlayer.Country.Race; + var powerManager = world.LocalPlayer.PlayerActor.Trait(); + var powerBar = radarBin.Get("POWERBAR"); + powerBar.IndicatorCollection = "power-"+world.LocalPlayer.Country.Race; + powerBar.GetProvided = () => powerManager.PowerProvided; + powerBar.GetUsed = () => powerManager.PowerDrained; + powerBar.TooltipFormat = "Power Usage: {0}/{1}"; + powerBar.GetBarColor = () => + { + if (powerManager.PowerState == PowerState.Critical) + return Color.Red; + if (powerManager.PowerState == PowerState.Low) + return Color.Orange; + return Color.LimeGreen; + }; + var sidebarTicker = playerWidgets.Get("SIDEBAR_TICKER"); sidebarTicker.OnTick = () => { diff --git a/OpenRA.Mods.Cnc/Widgets/Logic/SimpleTooltipLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/SimpleTooltipLogic.cs similarity index 90% rename from OpenRA.Mods.Cnc/Widgets/Logic/SimpleTooltipLogic.cs rename to OpenRA.Mods.RA/Widgets/Logic/SimpleTooltipLogic.cs index 3939b26bce..f47a072bb6 100644 --- a/OpenRA.Mods.Cnc/Widgets/Logic/SimpleTooltipLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/SimpleTooltipLogic.cs @@ -1,6 +1,6 @@ #region Copyright & License Information /* - * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) + * Copyright 2007-2013 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation. For more information, @@ -11,7 +11,7 @@ using System; using OpenRA.Widgets; -namespace OpenRA.Mods.Cnc.Widgets.Logic +namespace OpenRA.Mods.RA.Widgets.Logic { public class SimpleTooltipLogic { diff --git a/OpenRA.Mods.RA/Widgets/PowerBinWidget.cs b/OpenRA.Mods.RA/Widgets/PowerBinWidget.cs deleted file mode 100755 index 120e8caff1..0000000000 --- a/OpenRA.Mods.RA/Widgets/PowerBinWidget.cs +++ /dev/null @@ -1,119 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation. For more information, - * see COPYING. - */ -#endregion - -using System; -using System.Drawing; -using OpenRA.Graphics; -using OpenRA.Mods.RA.Buildings; -using OpenRA.Widgets; - -namespace OpenRA.Mods.RA.Widgets -{ - public class PowerBinWidget : Widget - { - // Power bar - float2 powerOrigin = new float2(42, 205); // Relative to radarOrigin - Size powerSize = new Size(138, 5); - - float? lastPowerProvidedPos; - float? lastPowerDrainedPos; - string powerCollection; - - readonly string RadarBin = "INGAME_RADAR_BIN"; - readonly PowerManager power; - readonly World world; - - [ObjectCreator.UseCtor] - public PowerBinWidget(World world) - { - this.world = world; - - if (world.LocalPlayer != null) - power = world.LocalPlayer.PlayerActor.Trait(); - } - - static Color GetPowerColor(PowerManager pm) - { - if (pm.PowerState == PowerState.Critical) return Color.Red; - if (pm.PowerState == PowerState.Low) return Color.Orange; - return Color.LimeGreen; - } - - const float PowerBarLerpFactor = .2f; - - public override void Draw() - { - if( world.LocalPlayer == null ) return; - if( world.LocalPlayer.WinState != WinState.Undefined ) return; - - var radarBin = Ui.Root.Get(RadarBin); - - powerCollection = "power-" + world.LocalPlayer.Country.Race; - - // Nothing to draw - if (power.PowerProvided == 0 && power.PowerDrained == 0) - return; - - // Draw bar horizontally - var barStart = powerOrigin + radarBin.ChildOrigin; - var barEnd = barStart + new float2(powerSize.Width, 0); - - float powerScaleBy = 100; - var maxPower = Math.Max(power.PowerProvided, power.PowerDrained); - - while (maxPower >= powerScaleBy) powerScaleBy *= 2; - - // Current power supply - var powerLevelTemp = barStart.X + (barEnd.X - barStart.X) * (power.PowerProvided / powerScaleBy); - lastPowerProvidedPos = float2.Lerp(lastPowerProvidedPos.GetValueOrDefault(powerLevelTemp), powerLevelTemp, PowerBarLerpFactor); - var powerLevel = new float2(lastPowerProvidedPos.Value, barStart.Y); - - var color = GetPowerColor(power); - - var colorDark = Exts.ColorLerp(0.25f, color, Color.Black); - for (int i = 0; i < powerSize.Height; i++) - { - color = (i - 1 < powerSize.Height / 2) ? color : colorDark; - var leftOffset = new float2(0, i); - var rightOffset = new float2(0, i); - // Indent corners - if ((i == 0 || i == powerSize.Height - 1) && powerLevel.X - barStart.X > 1) - { - leftOffset.X += 1; - rightOffset.X -= 1; - } - Game.Renderer.LineRenderer.DrawLine(barStart + leftOffset, powerLevel + rightOffset, color, color); - } - - // Power usage indicator - var indicator = ChromeProvider.GetImage( powerCollection, "power-indicator"); - var powerDrainedTemp = barStart.X + (barEnd.X - barStart.X) * (power.PowerDrained / powerScaleBy); - lastPowerDrainedPos = float2.Lerp(lastPowerDrainedPos.GetValueOrDefault(powerDrainedTemp), powerDrainedTemp, PowerBarLerpFactor); - var powerDrainLevel = new float2(lastPowerDrainedPos.Value - indicator.size.X / 2, barStart.Y - 1); - - Game.Renderer.RgbaSpriteRenderer.DrawSprite(indicator, powerDrainLevel); - - // Render the tooltip - var rect = new Rectangle((int) barStart.X, (int) barStart.Y, powerSize.Width, powerSize.Height); - - if (rect.InflateBy(0, 5, 0, 5).Contains(Viewport.LastMousePos)) - { - var pos = new int2(rect.Left + 5, rect.Top + 5); - - var border = WidgetUtils.GetBorderSizes("dialog4"); - WidgetUtils.DrawPanel("dialog4", rect.InflateBy(0, 0, 0, 50 + border[1])); - - Game.Renderer.Fonts["Bold"].DrawText("Power", pos, Color.White); - pos += new int2(0, 20); - Game.Renderer.Fonts["Regular"].DrawText("Provided: {0}\nDrained: {1}".F(power.PowerProvided, power.PowerDrained), pos, Color.White); - } - } - } -} diff --git a/OpenRA.Mods.RA/Widgets/ResourceBarWidget.cs b/OpenRA.Mods.RA/Widgets/ResourceBarWidget.cs new file mode 100755 index 0000000000..32d0c28d5a --- /dev/null +++ b/OpenRA.Mods.RA/Widgets/ResourceBarWidget.cs @@ -0,0 +1,138 @@ +#region Copyright & License Information +/* + * Copyright 2007-2013 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation. For more information, + * see COPYING. + */ +#endregion + +using System; +using System.Drawing; +using OpenRA.FileFormats; +using OpenRA.Graphics; +using OpenRA.Traits; +using OpenRA.Widgets; + +namespace OpenRA.Mods.RA.Widgets +{ + public enum ResourceBarOrientation { Vertical, Horizontal } + public enum ResourceBarStyle { Flat, Bevelled } + public class ResourceBarWidget : Widget + { + public readonly string TooltipTemplate = "SIMPLE_TOOLTIP"; + public readonly string TooltipContainer; + Lazy tooltipContainer; + + public string TooltipFormat = ""; + public ResourceBarOrientation Orientation = ResourceBarOrientation.Vertical; + public ResourceBarStyle Style = ResourceBarStyle.Flat; + public string IndicatorCollection = "sidebar-bits"; + public string IndicatorImage = "indicator"; + + public Func GetProvided = () => 0; + public Func GetUsed = () => 0; + public Func GetBarColor = () => Color.White; + EWMA providedLerp = new EWMA(0.3f); + EWMA usedLerp = new EWMA(0.3f); + + [ObjectCreator.UseCtor] + public ResourceBarWidget(World world) + { + tooltipContainer = Lazy.New(() => + Ui.Root.Get(TooltipContainer)); + } + + public override void MouseEntered() + { + if (TooltipContainer == null) + return; + + Func getText = () => TooltipFormat.F(GetUsed(), GetProvided()); + tooltipContainer.Value.SetTooltip(TooltipTemplate, new WidgetArgs() {{ "getText", getText }}); + } + + public override void MouseExited() + { + if (TooltipContainer == null) + return; + tooltipContainer.Value.RemoveTooltip(); + } + + public override void Draw() + { + var scaleBy = 100.0f; + var provided = GetProvided(); + var used = GetUsed(); + var max = Math.Max(provided, used); + while (max >= scaleBy) + scaleBy *= 2; + + var providedFrac = providedLerp.Update(provided/scaleBy); + var usedFrac = usedLerp.Update(used/scaleBy); + + var b = RenderBounds; + var indicator = ChromeProvider.GetImage(IndicatorCollection, IndicatorImage); + + var color = GetBarColor(); + if (Orientation == ResourceBarOrientation.Vertical) + { + if (Style == ResourceBarStyle.Bevelled) + { + var colorDark = Exts.ColorLerp(0.25f, color, Color.Black); + for (var i = 0; i < b.Height; i++) + { + color = (i - 1 < b.Height / 2) ? color : colorDark; + var bottom = new float2(b.Left + i, b.Bottom); + var top = new float2(b.Left + i, b.Bottom + providedFrac*b.Height); + + // Indent corners + if ((i == 0 || i == b.Width - 1) && providedFrac*b.Height > 1) + { + bottom.Y += 1; + top.Y -= 1; + } + + Game.Renderer.LineRenderer.DrawLine(bottom, top, color, color); + } + } + else + Game.Renderer.LineRenderer.FillRect(new Rectangle(b.X, (int)float2.Lerp(b.Bottom, b.Top, providedFrac), + b.Width, (int)(providedFrac*b.Height)), color); + + var x = (b.Left + b.Right - indicator.size.X) / 2; + var y = float2.Lerp(b.Bottom, b.Top, usedFrac) - indicator.size.Y / 2; + Game.Renderer.RgbaSpriteRenderer.DrawSprite(indicator, new float2(x, y)); + } + else + { + if (Style == ResourceBarStyle.Bevelled) + { + var colorDark = Exts.ColorLerp(0.25f, color, Color.Black); + for (var i = 0; i < b.Height; i++) + { + color = (i - 1 < b.Height / 2) ? color : colorDark; + var left = new float2(b.Left, b.Top + i); + var right = new float2(b.Left + providedFrac*b.Width, b.Top + i); + + // Indent corners + if ((i == 0 || i == b.Height - 1) && providedFrac*b.Width > 1) + { + left.X += 1; + right.X -= 1; + } + + Game.Renderer.LineRenderer.DrawLine(left, right, color, color); + } + } + else + Game.Renderer.LineRenderer.FillRect(new Rectangle(b.X, b.Y, (int)(providedFrac*b.Width), b.Height), color); + + var x = float2.Lerp(b.Left, b.Right, usedFrac) - indicator.size.X / 2; + var y = (b.Bottom + b.Top - indicator.size.Y) / 2; + Game.Renderer.RgbaSpriteRenderer.DrawSprite(indicator, new float2(x, y)); + } + } + } +} diff --git a/artsrc/cnc/chrome.svg b/artsrc/cnc/chrome.svg index 56a282f7ca..7f653feeee 100644 --- a/artsrc/cnc/chrome.svg +++ b/artsrc/cnc/chrome.svg @@ -99,9 +99,9 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="15.999999" - inkscape:cx="385.97751" - inkscape:cy="397.09537" + inkscape:zoom="5.6568539" + inkscape:cx="371.83537" + inkscape:cy="425.37964" inkscape:document-units="px" inkscape:current-layer="svg2" showgrid="false" @@ -205,13 +205,6 @@ - - + x="403" + y="591.36224" /> + +