diff --git a/OpenRA.Game/Widgets/WidgetUtils.cs b/OpenRA.Game/Widgets/WidgetUtils.cs index 9466a42fd3..334c2255e6 100644 --- a/OpenRA.Game/Widgets/WidgetUtils.cs +++ b/OpenRA.Game/Widgets/WidgetUtils.cs @@ -27,14 +27,14 @@ namespace OpenRA.Widgets Game.Renderer.RgbaSpriteRenderer.DrawSprite(s, pos); } - public static void DrawSHPCentered(Sprite s, float2 pos, WorldRenderer wr) + public static void DrawSHPCentered(Sprite s, float2 pos, PaletteReference p) { - Game.Renderer.SpriteRenderer.DrawSprite(s, pos - 0.5f * s.Size, wr.Palette("chrome")); + Game.Renderer.SpriteRenderer.DrawSprite(s, pos - 0.5f * s.Size, p); } - public static void DrawSHPCentered(Sprite s, float2 pos, WorldRenderer wr, float scale) + public static void DrawSHPCentered(Sprite s, float2 pos, PaletteReference p, float scale) { - Game.Renderer.SpriteRenderer.DrawSprite(s, pos - 0.5f * scale * s.Size, wr.Palette("chrome"), scale * s.Size); + Game.Renderer.SpriteRenderer.DrawSprite(s, pos - 0.5f * scale * s.Size, p, scale * s.Size); } public static void DrawPanel(string collection, Rectangle bounds) diff --git a/OpenRA.Mods.Common/Traits/Buildable.cs b/OpenRA.Mods.Common/Traits/Buildable.cs index 18fc7aba12..2f5d9aeb5b 100644 --- a/OpenRA.Mods.Common/Traits/Buildable.cs +++ b/OpenRA.Mods.Common/Traits/Buildable.cs @@ -35,6 +35,9 @@ namespace OpenRA.Mods.Common.Traits [Desc("Force a specific race variant, overriding the race of the producing actor.")] public readonly string ForceRace = null; + [Desc("Palette used for the production icon.")] + public readonly string IconPalette = "chrome"; + // TODO: UI fluff; doesn't belong here public readonly int BuildPaletteOrder = 9999; } diff --git a/OpenRA.Mods.Common/Traits/SupportPowers/SupportPower.cs b/OpenRA.Mods.Common/Traits/SupportPowers/SupportPower.cs index f7eef8729f..edaf6d0849 100644 --- a/OpenRA.Mods.Common/Traits/SupportPowers/SupportPower.cs +++ b/OpenRA.Mods.Common/Traits/SupportPowers/SupportPower.cs @@ -39,6 +39,9 @@ namespace OpenRA.Mods.Common.Traits public readonly bool DisplayTimer = false; + [Desc("Palette used for the icon.")] + public readonly string IconPalette = "chrome"; + [Desc("Beacons are only supported on the Airstrike and Nuke powers")] public readonly bool DisplayBeacon = false; public readonly string BeaconPalettePrefix = "player"; diff --git a/OpenRA.Mods.Common/Widgets/ObserverProductionIconsWidget.cs b/OpenRA.Mods.Common/Widgets/ObserverProductionIconsWidget.cs index 941ea90b37..e36069009d 100644 --- a/OpenRA.Mods.Common/Widgets/ObserverProductionIconsWidget.cs +++ b/OpenRA.Mods.Common/Widgets/ObserverProductionIconsWidget.cs @@ -75,15 +75,16 @@ namespace OpenRA.Mods.Common.Widgets var rsi = actor.Traits.Get(); var icon = new Animation(world, rsi.GetImage(actor, world.Map.SequenceProvider, race)); icon.Play(actor.Traits.Get().Icon); + var bi = actor.Traits.Get(); var location = new float2(RenderBounds.Location) + new float2(queue.i * (IconWidth + IconSpacing), 0); - WidgetUtils.DrawSHPCentered(icon.Image, location + 0.5f * iconSize, worldRenderer, 0.5f); + WidgetUtils.DrawSHPCentered(icon.Image, location + 0.5f * iconSize, worldRenderer.Palette(bi.IconPalette), 0.5f); var clock = clocks[queue.Trait]; clock.PlayFetchIndex("idle", () => current.TotalTime == 0 ? 0 : ((current.TotalTime - current.RemainingTime) * (clock.CurrentSequence.Length - 1) / current.TotalTime)); clock.Tick(); - WidgetUtils.DrawSHPCentered(clock.Image, location + 0.5f * iconSize, worldRenderer, 0.5f); + WidgetUtils.DrawSHPCentered(clock.Image, location + 0.5f * iconSize, worldRenderer.Palette(bi.IconPalette), 0.5f); var tiny = Game.Renderer.Fonts["Tiny"]; var text = GetOverlayForItem(current); diff --git a/OpenRA.Mods.Common/Widgets/ObserverSupportPowerIconsWidget.cs b/OpenRA.Mods.Common/Widgets/ObserverSupportPowerIconsWidget.cs index 2f95aed0c9..7541c3cf64 100644 --- a/OpenRA.Mods.Common/Widgets/ObserverSupportPowerIconsWidget.cs +++ b/OpenRA.Mods.Common/Widgets/ObserverSupportPowerIconsWidget.cs @@ -72,14 +72,14 @@ namespace OpenRA.Mods.Common.Widgets icon.Play(item.Info.Icon); var location = new float2(RenderBounds.Location) + new float2(power.i * (IconWidth + IconSpacing), 0); - WidgetUtils.DrawSHPCentered(icon.Image, location + 0.5f * iconSize, worldRenderer, 0.5f); + WidgetUtils.DrawSHPCentered(icon.Image, location + 0.5f * iconSize, worldRenderer.Palette(item.Info.IconPalette), 0.5f); var clock = clocks[power.a.Key]; clock.PlayFetchIndex("idle", () => item.TotalTime == 0 ? 0 : ((item.TotalTime - item.RemainingTime) * (clock.CurrentSequence.Length - 1) / item.TotalTime)); clock.Tick(); - WidgetUtils.DrawSHPCentered(clock.Image, location + 0.5f * iconSize, worldRenderer, 0.5f); + WidgetUtils.DrawSHPCentered(clock.Image, location + 0.5f * iconSize, worldRenderer.Palette(item.Info.IconPalette), 0.5f); var tiny = Game.Renderer.Fonts["Tiny"]; var text = GetOverlayForItem(item); diff --git a/OpenRA.Mods.Common/Widgets/ProductionPaletteWidget.cs b/OpenRA.Mods.Common/Widgets/ProductionPaletteWidget.cs index fb21df5db9..133890129e 100644 --- a/OpenRA.Mods.Common/Widgets/ProductionPaletteWidget.cs +++ b/OpenRA.Mods.Common/Widgets/ProductionPaletteWidget.cs @@ -26,6 +26,7 @@ namespace OpenRA.Mods.Common.Widgets public string Name; public Hotkey Hotkey; public Sprite Sprite; + public PaletteReference Palette; public float2 Pos; public List Queued; } @@ -312,12 +313,15 @@ namespace OpenRA.Mods.Common.Widgets var icon = new Animation(World, rsi.GetImage(item, World.Map.SequenceProvider, race)); icon.Play(item.Traits.Get().Icon); + var bi = item.Traits.Get(); + var pi = new ProductionIcon() { Actor = item, Name = item.Name, Hotkey = ks.GetProductionHotkey(DisplayedIconCount), Sprite = icon.Image, + Palette = worldRenderer.Palette(bi.IconPalette), Pos = new float2(rect.Location), Queued = CurrentQueue.AllQueued().Where(a => a.Item == item.Name).ToList() }; @@ -350,7 +354,7 @@ namespace OpenRA.Mods.Common.Widgets // Icons foreach (var icon in icons.Values) { - WidgetUtils.DrawSHPCentered(icon.Sprite, icon.Pos + iconOffset, worldRenderer); + WidgetUtils.DrawSHPCentered(icon.Sprite, icon.Pos + iconOffset, icon.Palette); // Build progress if (icon.Queued.Count > 0) @@ -361,10 +365,10 @@ namespace OpenRA.Mods.Common.Widgets * (clock.CurrentSequence.Length - 1) / first.TotalTime); clock.Tick(); - WidgetUtils.DrawSHPCentered(clock.Image, icon.Pos + iconOffset, worldRenderer); + WidgetUtils.DrawSHPCentered(clock.Image, icon.Pos + iconOffset, icon.Palette); } else if (!buildableItems.Any(a => a.Name == icon.Name)) - WidgetUtils.DrawSHPCentered(cantBuild.Image, icon.Pos + iconOffset, worldRenderer); + WidgetUtils.DrawSHPCentered(cantBuild.Image, icon.Pos + iconOffset, icon.Palette); } // Overlays diff --git a/OpenRA.Mods.Common/Widgets/SupportPowersWidget.cs b/OpenRA.Mods.Common/Widgets/SupportPowersWidget.cs index 9153ff7eee..7af9bef3b4 100644 --- a/OpenRA.Mods.Common/Widgets/SupportPowersWidget.cs +++ b/OpenRA.Mods.Common/Widgets/SupportPowersWidget.cs @@ -65,6 +65,7 @@ namespace OpenRA.Mods.Common.Widgets public SupportPowerInstance Power; public float2 Pos; public Sprite Sprite; + public PaletteReference Palette; public Hotkey Hotkey; } @@ -89,6 +90,7 @@ namespace OpenRA.Mods.Common.Widgets Power = p, Pos = new float2(rect.Location), Sprite = icon.Image, + Palette = worldRenderer.Palette(p.Info.IconPalette), Hotkey = ks.GetSupportPowerHotkey(IconCount) }; @@ -139,7 +141,7 @@ namespace OpenRA.Mods.Common.Widgets // Icons foreach (var p in icons.Values) { - WidgetUtils.DrawSHPCentered(p.Sprite, p.Pos + iconOffset, worldRenderer); + WidgetUtils.DrawSHPCentered(p.Sprite, p.Pos + iconOffset, p.Palette); // Charge progress var sp = p.Power; @@ -148,7 +150,7 @@ namespace OpenRA.Mods.Common.Widgets * (clock.CurrentSequence.Length - 1) / sp.TotalTime); clock.Tick(); - WidgetUtils.DrawSHPCentered(clock.Image, p.Pos + iconOffset, worldRenderer); + WidgetUtils.DrawSHPCentered(clock.Image, p.Pos + iconOffset, p.Palette); } // Overlay