From f946382e382c4619c91df25fa1c87e83070c7cc4 Mon Sep 17 00:00:00 2001 From: alzeih Date: Sun, 30 May 2010 14:06:08 +1200 Subject: [PATCH] Split Radar and Power widgets --- OpenRA.Game/OpenRA.Game.csproj | 3 +- OpenRA.Game/Widgets/PowerBinWidget.cs | 102 ++++++++++++++++++++ OpenRA.Game/Widgets/RadarBinWidget.cs | 129 ++++++-------------------- mods/cnc/chrome.xml | 8 +- mods/cnc/menus.yaml | 2 + mods/ra/chrome.xml | 11 ++- mods/ra/menus.yaml | 2 + 7 files changed, 152 insertions(+), 105 deletions(-) create mode 100644 OpenRA.Game/Widgets/PowerBinWidget.cs diff --git a/OpenRA.Game/OpenRA.Game.csproj b/OpenRA.Game/OpenRA.Game.csproj index 3a8e3ceff5..35545cb786 100755 --- a/OpenRA.Game/OpenRA.Game.csproj +++ b/OpenRA.Game/OpenRA.Game.csproj @@ -1,4 +1,4 @@ - + Debug @@ -237,6 +237,7 @@ + diff --git a/OpenRA.Game/Widgets/PowerBinWidget.cs b/OpenRA.Game/Widgets/PowerBinWidget.cs new file mode 100644 index 0000000000..322f7ecb10 --- /dev/null +++ b/OpenRA.Game/Widgets/PowerBinWidget.cs @@ -0,0 +1,102 @@ +#region Copyright & License Information +/* + * Copyright 2007,2009,2010 Chris Forbes, Robert Pepperell, Matthew Bowra-Dean, Paul Chote, Alli Witheford. + * This file is part of OpenRA. + * + * OpenRA is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * OpenRA is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenRA. If not, see . + */ +#endregion + + +using System; +using System.Drawing; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Traits; + +namespace OpenRA.Widgets +{ + + public class PowerBinWidget : Widget + { + // Power bar + static float2 powerOrigin = new float2(42, 205); // Relative to radarOrigin + static Size powerSize = new Size(138, 5); + float? lastPowerProvidedPos; + float? lastPowerDrainedPos; + string powerCollection; + + public override Widget Clone() { throw new NotImplementedException("Why are you Cloning PowerBin?"); } + + public override void Draw(World world) + { + powerCollection = "power-" + world.LocalPlayer.Country.Race; + + var resources = world.LocalPlayer.PlayerActor.traits.Get(); + + // Nothing to draw + if (resources.PowerProvided == 0 + && resources.PowerDrained == 0) + return; + + var renderer = Game.chrome.renderer; + var lineRenderer = Game.chrome.lineRenderer; + var rgbaRenderer = renderer.RgbaSpriteRenderer; + + // Draw bar horizontally + var barStart = powerOrigin + RadarBinWidget.radarOrigin; + var barEnd = barStart + new float2(powerSize.Width, 0); + + float powerScaleBy = 100; + var maxPower = Math.Max(resources.PowerProvided, resources.PowerDrained); + while (maxPower >= powerScaleBy) powerScaleBy *= 2; + + // Current power supply + var powerLevelTemp = barStart.X + (barEnd.X - barStart.X) * (resources.PowerProvided / powerScaleBy); + lastPowerProvidedPos = float2.Lerp(lastPowerProvidedPos.GetValueOrDefault(powerLevelTemp), powerLevelTemp, .3f); + float2 powerLevel = new float2(lastPowerProvidedPos.Value, barStart.Y); + + var color = Color.LimeGreen; + if (resources.GetPowerState() == PowerState.Low) + color = Color.Orange; + if (resources.GetPowerState() == PowerState.Critical) + color = Color.Red; + + var colorDark = Graphics.Util.Lerp(0.25f, color, Color.Black); + for (int i = 0; i < powerSize.Height; i++) + { + color = (i - 1 < powerSize.Height / 2) ? color : colorDark; + float2 leftOffset = new float2(0, i); + float2 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; + } + lineRenderer.DrawLine(Game.viewport.Location + barStart + leftOffset, Game.viewport.Location + powerLevel + rightOffset, color, color); + } + lineRenderer.Flush(); + + // Power usage indicator + var indicator = ChromeProvider.GetImage(renderer, powerCollection, "power-indicator"); + var powerDrainedTemp = barStart.X + (barEnd.X - barStart.X) * (resources.PowerDrained / powerScaleBy); + lastPowerDrainedPos = float2.Lerp(lastPowerDrainedPos.GetValueOrDefault(powerDrainedTemp), powerDrainedTemp, .3f); + float2 powerDrainLevel = new float2(lastPowerDrainedPos.Value - indicator.size.X / 2, barStart.Y - 1); + + rgbaRenderer.DrawSprite(indicator, powerDrainLevel, "chrome"); + rgbaRenderer.Flush(); + } + } +} diff --git a/OpenRA.Game/Widgets/RadarBinWidget.cs b/OpenRA.Game/Widgets/RadarBinWidget.cs index 6d227ff5c2..56f8037fad 100644 --- a/OpenRA.Game/Widgets/RadarBinWidget.cs +++ b/OpenRA.Game/Widgets/RadarBinWidget.cs @@ -29,10 +29,9 @@ namespace OpenRA.Widgets { public class RadarBinWidget : Widget { - // Radar static float2 radarOpenOrigin = new float2(Game.viewport.Width - 215, 29); static float2 radarClosedOrigin = new float2(Game.viewport.Width - 215, -166); - static float2 radarOrigin = radarClosedOrigin; + public static float2 radarOrigin = radarClosedOrigin; float radarMinimapHeight; const int radarSlideAnimationLength = 15; const int radarActivateAnimationLength = 5; @@ -40,12 +39,6 @@ namespace OpenRA.Widgets bool radarAnimating = false; bool hasRadar = false; - // Power bar - static float2 powerOrigin = new float2(42, 205); // Relative to radarOrigin - static Size powerSize = new Size(138, 5); - float? lastPowerProvidedPos; - float? lastPowerDrainedPos; - string radarCollection; public override bool HandleInput(MouseInput mi) @@ -88,8 +81,34 @@ namespace OpenRA.Widgets public override void DrawInner(World world) { - DrawRadar(world); - DrawPower(world); + radarCollection = "radar-" + world.LocalPlayer.Country.Race; + + var hasNewRadar = world.Queries.OwnedBy[world.LocalPlayer] + .WithTrait() + .Any(a => a.Trait.IsActive); + + if (hasNewRadar != hasRadar) + radarAnimating = true; + + hasRadar = hasNewRadar; + + var renderer = Game.chrome.renderer; + var rgbaRenderer = renderer.RgbaSpriteRenderer; + + rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, radarCollection, "left"), radarOrigin, "chrome"); + rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, radarCollection, "right"), radarOrigin + new float2(201, 0), "chrome"); + rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, radarCollection, "bottom"), radarOrigin + new float2(0, 192), "chrome"); + + if (radarAnimating) + rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, radarCollection, "bg"), radarOrigin + new float2(9, 0), "chrome"); + + rgbaRenderer.Flush(); + + if (radarAnimationFrame >= radarSlideAnimationLength) + { + var mapRect = new RectangleF(radarOrigin.X + 9, radarOrigin.Y + (192 - radarMinimapHeight) / 2, 192, radarMinimapHeight); + world.Minimap.Draw(mapRect); + } } public override void Tick(World world) @@ -128,95 +147,5 @@ namespace OpenRA.Widgets if (radarAnimationFrame == (hasRadar ? radarSlideAnimationLength+radarActivateAnimationLength : 0)) radarAnimating = false; } - - void DrawRadar(World world) - { - radarCollection = "radar-" + world.LocalPlayer.Country.Race; - - var hasNewRadar = world.Queries.OwnedBy[world.LocalPlayer] - .WithTrait() - .Any(a => a.Trait.IsActive); - - if (hasNewRadar != hasRadar) - radarAnimating = true; - - hasRadar = hasNewRadar; - - var renderer = Game.chrome.renderer; - var rgbaRenderer = renderer.RgbaSpriteRenderer; - - rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, radarCollection, "left"), radarOrigin, "chrome"); - rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, radarCollection, "right"), radarOrigin + new float2(201, 0), "chrome"); - rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, radarCollection, "bottom"), radarOrigin + new float2(0, 192), "chrome"); - - if (radarAnimating) - rgbaRenderer.DrawSprite(ChromeProvider.GetImage(renderer, radarCollection, "bg"), radarOrigin + new float2(9, 0), "chrome"); - - rgbaRenderer.Flush(); - - if (radarAnimationFrame >= radarSlideAnimationLength) - { - var mapRect = new RectangleF(radarOrigin.X + 9, radarOrigin.Y + (192 - radarMinimapHeight) / 2, 192, radarMinimapHeight); - world.Minimap.Draw(mapRect); - } - } - - void DrawPower(World world) - { - var resources = world.LocalPlayer.PlayerActor.traits.Get(); - - // Nothing to draw - if (resources.PowerProvided == 0 - && resources.PowerDrained == 0) - return; - - var renderer = Game.chrome.renderer; - var lineRenderer = Game.chrome.lineRenderer; - var rgbaRenderer = renderer.RgbaSpriteRenderer; - - // Draw bar horizontally - var barStart = powerOrigin + radarOrigin; - var barEnd = barStart + new float2(powerSize.Width, 0); - - float powerScaleBy = 100; - var maxPower = Math.Max(resources.PowerProvided, resources.PowerDrained); - while (maxPower >= powerScaleBy) powerScaleBy *= 2; - - // Current power supply - var powerLevelTemp = barStart.X + (barEnd.X - barStart.X) * (resources.PowerProvided / powerScaleBy); - lastPowerProvidedPos = float2.Lerp(lastPowerProvidedPos.GetValueOrDefault(powerLevelTemp), powerLevelTemp, .3f); - float2 powerLevel = new float2(lastPowerProvidedPos.Value, barStart.Y); - - var color = Color.LimeGreen; - if (resources.GetPowerState() == PowerState.Low) - color = Color.Orange; - if (resources.GetPowerState() == PowerState.Critical) - color = Color.Red; - - var colorDark = Graphics.Util.Lerp(0.25f, color, Color.Black); - for (int i = 0; i < powerSize.Height; i++) - { - color = (i - 1 < powerSize.Height / 2) ? color : colorDark; - float2 leftOffset = new float2(0, i); - float2 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; - } - lineRenderer.DrawLine(Game.viewport.Location + barStart + leftOffset, Game.viewport.Location + powerLevel + rightOffset, color, color); - } - lineRenderer.Flush(); - - // Power usage indicator - var indicator = ChromeProvider.GetImage(renderer, radarCollection, "power-indicator"); - var powerDrainedTemp = barStart.X + (barEnd.X - barStart.X) * (resources.PowerDrained / powerScaleBy); - lastPowerDrainedPos = float2.Lerp(lastPowerDrainedPos.GetValueOrDefault(powerDrainedTemp), powerDrainedTemp, .3f); - float2 powerDrainLevel = new float2(lastPowerDrainedPos.Value - indicator.size.X / 2, barStart.Y - 1); - - rgbaRenderer.DrawSprite(indicator, powerDrainLevel, "chrome"); - rgbaRenderer.Flush(); - } } } diff --git a/mods/cnc/chrome.xml b/mods/cnc/chrome.xml index 8e86613229..4223aa0023 100644 --- a/mods/cnc/chrome.xml +++ b/mods/cnc/chrome.xml @@ -1,4 +1,4 @@ - + @@ -12,6 +12,9 @@ + + + @@ -52,6 +55,9 @@ + + + diff --git a/mods/cnc/menus.yaml b/mods/cnc/menus.yaml index 9eb6321f47..9ec0c3938b 100644 --- a/mods/cnc/menus.yaml +++ b/mods/cnc/menus.yaml @@ -542,6 +542,8 @@ Container: Id:INGAME_WORLD_TOOLTIP RadarBin@INGAME_RADAR_BIN: Id:INGAME_RADAR_BIN + PowerBin@INGAME_POWER_BIN: + Id:INGAME_POWER_BIN MoneyBin@INGAME_MONEY_BIN: Id:INGAME_MONEY_BIN X:WINDOW_RIGHT - WIDTH diff --git a/mods/ra/chrome.xml b/mods/ra/chrome.xml index 59d6457ba0..14c5402cc7 100644 --- a/mods/ra/chrome.xml +++ b/mods/ra/chrome.xml @@ -1,4 +1,4 @@ - + @@ -11,8 +11,10 @@ - - + + + + @@ -52,6 +54,9 @@ + + + diff --git a/mods/ra/menus.yaml b/mods/ra/menus.yaml index 9eb6321f47..9ec0c3938b 100644 --- a/mods/ra/menus.yaml +++ b/mods/ra/menus.yaml @@ -542,6 +542,8 @@ Container: Id:INGAME_WORLD_TOOLTIP RadarBin@INGAME_RADAR_BIN: Id:INGAME_RADAR_BIN + PowerBin@INGAME_POWER_BIN: + Id:INGAME_POWER_BIN MoneyBin@INGAME_MONEY_BIN: Id:INGAME_MONEY_BIN X:WINDOW_RIGHT - WIDTH