From e0ecebf2041eb4702cd20c84e8fdf62b698a53a0 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Fri, 26 Feb 2010 21:05:35 +1300 Subject: [PATCH] IChromeButton support & RA rules change for it --- OpenRa.Game/Chrome.cs | 50 +++++--------------- OpenRa.Game/OpenRa.Game.csproj | 1 + OpenRa.Game/Traits/Chrome/PowerDownButton.cs | 47 ++++++++++++++++++ OpenRa.Game/Traits/TraitsInterfaces.cs | 8 ++++ mods/ra/rules.yaml | 4 +- 5 files changed, 70 insertions(+), 40 deletions(-) create mode 100644 OpenRa.Game/Traits/Chrome/PowerDownButton.cs diff --git a/OpenRa.Game/Chrome.cs b/OpenRa.Game/Chrome.cs index 0de8adb4da..3cd9c7f175 100644 --- a/OpenRa.Game/Chrome.cs +++ b/OpenRa.Game/Chrome.cs @@ -685,50 +685,22 @@ namespace OpenRa rgbaRenderer.Flush(); } + const int chromeButtonGap = 2; + void DrawButtons( World world ) { - int2 buttonOrigin = new int2(Game.viewport.Width - 320, 2); - // Repair - Rectangle repairRect = new Rectangle(buttonOrigin.X, buttonOrigin.Y, repairButton.Image.bounds.Width, repairButton.Image.bounds.Height); - var repairDrawPos = new float2(repairRect.Location); - - var hasFact = world.Queries.OwnedBy[world.LocalPlayer].WithTrait().Any(); - - if (Game.Settings.RepairRequiresConyard && !hasFact) - repairButton.ReplaceAnim("disabled"); - else - { - repairButton.ReplaceAnim(Game.controller.orderGenerator is RepairOrderGenerator ? "pressed" : "normal"); - AddButton(repairRect, isLmb => Game.controller.ToggleInputMode()); - } - shpRenderer.DrawSprite(repairButton.Image, repairDrawPos, "chrome"); + var origin = new int2(Game.viewport.Width - 200, 2); - // Sell - Rectangle sellRect = new Rectangle(buttonOrigin.X+40, buttonOrigin.Y, - sellButton.Image.bounds.Width, sellButton.Image.bounds.Height); - - var sellDrawPos = new float2(sellRect.Location); - - sellButton.ReplaceAnim(Game.controller.orderGenerator is SellOrderGenerator ? "pressed" : "normal"); - - AddButton(sellRect, isLmb => Game.controller.ToggleInputMode()); - shpRenderer.DrawSprite(sellButton.Image, sellDrawPos, "chrome"); - shpRenderer.Flush(); - - if (Game.Settings.PowerDownBuildings) + foreach (var cb in world.WorldActor.traits.WithInterface()) { - // Power Down - Rectangle pwrdownRect = new Rectangle(buttonOrigin.X+80, buttonOrigin.Y, - pwrdownButton.Image.bounds.Width, pwrdownButton.Image.bounds.Height); - - var pwrdownDrawPos = new float2(pwrdownRect.Location); - - pwrdownButton.ReplaceAnim(Game.controller.orderGenerator is PowerDownOrderGenerator ? "pressed" : "normal"); - - AddButton(pwrdownRect, isLmb => Game.controller.ToggleInputMode()); - shpRenderer.DrawSprite(pwrdownButton.Image, pwrdownDrawPos, "chrome"); + var button = cb; + var anim = new Animation(cb.Image); + anim.Play(cb.Enabled ? cb.Pressed ? "pressed" : "normal" : "disabled"); + origin.X -= (int)anim.Image.size.X + chromeButtonGap; + shpRenderer.DrawSprite(anim.Image, origin, "chrome"); + AddButton(new RectangleF(origin.X, origin.Y, anim.Image.size.X, anim.Image.size.Y), + _ => { if (button.Enabled) button.OnClick(); }); } - shpRenderer.Flush(); //Options Rectangle optionsRect = new Rectangle(0,0, optionsButton.Image.bounds.Width, diff --git a/OpenRa.Game/OpenRa.Game.csproj b/OpenRa.Game/OpenRa.Game.csproj index 1e887ff951..384a786273 100644 --- a/OpenRa.Game/OpenRa.Game.csproj +++ b/OpenRa.Game/OpenRa.Game.csproj @@ -108,6 +108,7 @@ + diff --git a/OpenRa.Game/Traits/Chrome/PowerDownButton.cs b/OpenRa.Game/Traits/Chrome/PowerDownButton.cs new file mode 100644 index 0000000000..c8fafdf6bd --- /dev/null +++ b/OpenRa.Game/Traits/Chrome/PowerDownButton.cs @@ -0,0 +1,47 @@ +using System; +using System.Linq; +using OpenRa.Orders; + +namespace OpenRa.Traits +{ + class PowerDownButtonInfo : StatelessTraitInfo { } + + class PowerDownButton : IChromeButton + { + public string Image { get { return "repair"; } } // todo: art + public bool Enabled { get { return true; } } + public bool Pressed { get { return Game.controller.orderGenerator is PowerDownOrderGenerator; } } + public void OnClick() { Game.controller.ToggleInputMode(); } + } + + class SellButtonInfo : StatelessTraitInfo { } + + class SellButton : IChromeButton + { + public string Image { get { return "sell"; } } + public bool Enabled { get { return true; } } + public bool Pressed { get { return Game.controller.orderGenerator is SellOrderGenerator; } } + public void OnClick() { Game.controller.ToggleInputMode(); } + } + + class RepairButtonInfo : StatelessTraitInfo { } + + class RepairButton : IChromeButton + { + public string Image { get { return "repair"; } } // todo: art + public bool Enabled + { + get + { + if (!Game.Settings.RepairRequiresConyard) + return true; + + return Game.world.Queries.OwnedBy[Game.world.LocalPlayer] + .WithTrait().Any(); + } + } + + public bool Pressed { get { return Game.controller.orderGenerator is RepairOrderGenerator; } } + public void OnClick() { Game.controller.ToggleInputMode(); } + } +} diff --git a/OpenRa.Game/Traits/TraitsInterfaces.cs b/OpenRa.Game/Traits/TraitsInterfaces.cs index 97600f814b..5c7f8302ea 100644 --- a/OpenRa.Game/Traits/TraitsInterfaces.cs +++ b/OpenRa.Game/Traits/TraitsInterfaces.cs @@ -132,4 +132,12 @@ namespace OpenRa.Traits IActivity Tick(Actor self); void Cancel(Actor self); } + + public interface IChromeButton + { + string Image { get; } + bool Enabled { get; } + bool Pressed { get; } + void OnClick(); + } } diff --git a/mods/ra/rules.yaml b/mods/ra/rules.yaml index 4beb750fb0..be513ffc77 100644 --- a/mods/ra/rules.yaml +++ b/mods/ra/rules.yaml @@ -188,7 +188,9 @@ World: Country@7: Name: Spain Race: allies - + SellButton: + RepairButton: + PowerDownButton: MGG: GeneratesGap: