diff --git a/OpenRA.Mods.Common/Traits/Buildable.cs b/OpenRA.Mods.Common/Traits/Buildable.cs index 3b5955cc65..a93bb299f8 100644 --- a/OpenRA.Mods.Common/Traits/Buildable.cs +++ b/OpenRA.Mods.Common/Traits/Buildable.cs @@ -38,10 +38,13 @@ namespace OpenRA.Mods.Common.Traits [Desc("Sequence of the actor that contains the icon.")] public readonly string Icon = "icon"; - [PaletteReference] + [PaletteReference("IconPaletteIsPlayerPalette")] [Desc("Palette used for the production icon.")] public readonly string IconPalette = "chrome"; + [Desc("Custom palette is a player palette BaseName")] + public readonly bool IconPaletteIsPlayerPalette = false; + [Desc("Base build time in frames (-1 indicates to use the unit's Value).")] public readonly int BuildDuration = -1; diff --git a/OpenRA.Mods.Common/Traits/Player/PlayerStatistics.cs b/OpenRA.Mods.Common/Traits/Player/PlayerStatistics.cs index 61996c3b82..e3d929291c 100644 --- a/OpenRA.Mods.Common/Traits/Player/PlayerStatistics.cs +++ b/OpenRA.Mods.Common/Traits/Player/PlayerStatistics.cs @@ -164,6 +164,7 @@ namespace OpenRA.Mods.Common.Traits public readonly ActorInfo ActorInfo; public readonly Animation Icon; public readonly string IconPalette; + public readonly bool IconPaletteIsPlayerPalette; public readonly int ProductionQueueOrder; public readonly int BuildPaletteOrder; public readonly TooltipInfo TooltipInfo; @@ -189,6 +190,7 @@ namespace OpenRA.Mods.Common.Traits Icon = new Animation(owner.World, image); Icon.Play(BuildableInfo.Icon); IconPalette = BuildableInfo.IconPalette; + IconPaletteIsPlayerPalette = BuildableInfo.IconPaletteIsPlayerPalette; BuildPaletteOrder = BuildableInfo.BuildPaletteOrder; ProductionQueueOrder = queues.Where(q => BuildableInfo.Queue.Contains(q.Type)) .Select(q => q.DisplayOrder) diff --git a/OpenRA.Mods.Common/Widgets/ObserverArmyIconsWidget.cs b/OpenRA.Mods.Common/Widgets/ObserverArmyIconsWidget.cs index 9a28dcd741..75fcf4eddd 100644 --- a/OpenRA.Mods.Common/Widgets/ObserverArmyIconsWidget.cs +++ b/OpenRA.Mods.Common/Widgets/ObserverArmyIconsWidget.cs @@ -107,7 +107,8 @@ namespace OpenRA.Mods.Common.Widgets var iconTopLeft = RenderOrigin + topLeftOffset; var centerPosition = iconTopLeft; - WidgetUtils.DrawSHPCentered(icon.Image, centerPosition + 0.5f * iconSize, worldRenderer.Palette(unit.IconPalette), 0.5f); + var palette = unit.IconPaletteIsPlayerPalette ? unit.IconPalette + player.InternalName : unit.IconPalette; + WidgetUtils.DrawSHPCentered(icon.Image, centerPosition + 0.5f * iconSize, worldRenderer.Palette(palette), 0.5f); armyIcons.Add(new ArmyIcon { diff --git a/OpenRA.Mods.Common/Widgets/ObserverProductionIconsWidget.cs b/OpenRA.Mods.Common/Widgets/ObserverProductionIconsWidget.cs index a85045ee94..09c9018d63 100644 --- a/OpenRA.Mods.Common/Widgets/ObserverProductionIconsWidget.cs +++ b/OpenRA.Mods.Common/Widgets/ObserverProductionIconsWidget.cs @@ -146,7 +146,8 @@ namespace OpenRA.Mods.Common.Widgets var iconTopLeft = RenderOrigin + topLeftOffset; var centerPosition = iconTopLeft + 0.5f * iconSize; - WidgetUtils.DrawSHPCentered(icon.Image, centerPosition, worldRenderer.Palette(bi.IconPalette), 0.5f); + var palette = bi.IconPaletteIsPlayerPalette ? bi.IconPalette + player.InternalName : bi.IconPalette; + WidgetUtils.DrawSHPCentered(icon.Image, centerPosition, worldRenderer.Palette(palette), 0.5f); var rect = new Rectangle((int)iconTopLeft.X, (int)iconTopLeft.Y, (int)iconSize.X, (int)iconSize.Y); productionIcons.Add(new ProductionIcon diff --git a/OpenRA.Mods.Common/Widgets/ProductionPaletteWidget.cs b/OpenRA.Mods.Common/Widgets/ProductionPaletteWidget.cs index 495a5dd1b2..65da5d8c46 100644 --- a/OpenRA.Mods.Common/Widgets/ProductionPaletteWidget.cs +++ b/OpenRA.Mods.Common/Widgets/ProductionPaletteWidget.cs @@ -433,13 +433,15 @@ namespace OpenRA.Mods.Common.Widgets var bi = item.TraitInfo(); icon.Play(bi.Icon); + var palette = bi.IconPaletteIsPlayerPalette ? bi.IconPalette + producer.Actor.Owner.InternalName : bi.IconPalette; + var pi = new ProductionIcon() { Actor = item, Name = item.Name, Hotkey = DisplayedIconCount < HotkeyCount ? hotkeys[DisplayedIconCount] : null, Sprite = icon.Image, - Palette = worldRenderer.Palette(bi.IconPalette), + Palette = worldRenderer.Palette(palette), IconClockPalette = worldRenderer.Palette(ClockPalette), IconDarkenPalette = worldRenderer.Palette(NotBuildablePalette), Pos = new float2(rect.Location),