diff --git a/OpenRA.Mods.Common/Traits/World/ColorPickerManager.cs b/OpenRA.Mods.Common/Traits/World/ColorPickerManager.cs index 8084963af6..44a6e4d3ef 100644 --- a/OpenRA.Mods.Common/Traits/World/ColorPickerManager.cs +++ b/OpenRA.Mods.Common/Traits/World/ColorPickerManager.cs @@ -31,6 +31,15 @@ namespace OpenRA.Mods.Common.Traits [PaletteReference] public readonly string PaletteName = "colorpicker"; + [ActorReference] + [Desc("Actor type to show in the color picker. This can be overriden for specific factions with FactionPreviewActors.")] + public readonly string PreviewActor = null; + + [SequenceReference(dictionaryReference: LintDictionaryReference.Values)] + [Desc("Actor type to show in the color picker for specific factions. Overrides PreviewActor.", + "A dictionary of [faction name]: [actor name].")] + public readonly Dictionary FactionPreviewActors = new Dictionary(); + public readonly int[] RemapIndices = { }; public readonly float Ramp = 0.05f; public Color Color { get; private set; } diff --git a/OpenRA.Mods.Common/Widgets/Logic/ColorPickerLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/ColorPickerLogic.cs index 43ce3ea72e..6060fed3cb 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/ColorPickerLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/ColorPickerLogic.cs @@ -28,21 +28,6 @@ namespace OpenRA.Mods.Common.Widgets.Logic public ColorPickerLogic(Widget widget, ModData modData, World world, Color initialColor, string initialFaction, Action onChange, Dictionary logicArgs) { - if (initialFaction == null || !ChromeMetrics.TryGet("ColorPickerActorType-" + initialFaction, out string actorType)) - actorType = ChromeMetrics.Get("ColorPickerActorType"); - - var preview = widget.GetOrNull("PREVIEW"); - var actor = world.Map.Rules.Actors[actorType]; - - var td = new TypeDictionary(); - td.Add(new OwnerInit(world.WorldActor.Owner)); - td.Add(new FactionInit(world.WorldActor.Owner.PlayerReference.Faction)); - foreach (var api in actor.TraitInfos()) - foreach (var o in api.ActorPreviewInits(actor, ActorPreviewType.ColorPicker)) - td.Add(o); - - preview?.SetPreview(actor, td); - var hueSlider = widget.Get("HUE"); var mixer = widget.Get("MIXER"); var randomButton = widget.GetOrNull("RANDOM_BUTTON"); @@ -71,6 +56,34 @@ namespace OpenRA.Mods.Common.Widgets.Logic mixer.Set(initialColor); hueSlider.Value = HueFromColor(initialColor); + if (initialFaction == null || !colorManager.FactionPreviewActors.TryGetValue(initialFaction, out var actorType)) + actorType = colorManager.PreviewActor; + + if (actorType == null) + { + var message = "ColorPickerManager does not define a preview actor"; + if (initialFaction != null) + message += " for faction " + initialFaction; + message += "!"; + + throw new YamlException(message); + } + + var preview = widget.GetOrNull("PREVIEW"); + var actor = world.Map.Rules.Actors[actorType]; + + var td = new TypeDictionary + { + new OwnerInit(world.WorldActor.Owner), + new FactionInit(world.WorldActor.Owner.PlayerReference.Faction) + }; + + foreach (var api in actor.TraitInfos()) + foreach (var o in api.ActorPreviewInits(actor, ActorPreviewType.ColorPicker)) + td.Add(o); + + preview?.SetPreview(actor, td); + // HACK: the value returned from the color mixer will generally not // be equal to the given initialColor due to its internal RGB -> HSL -> RGB // conversion. This conversion can sometimes convert a valid initial value diff --git a/mods/cnc/metrics.yaml b/mods/cnc/metrics.yaml index 14c6fe2fbf..89222bdaf4 100644 --- a/mods/cnc/metrics.yaml +++ b/mods/cnc/metrics.yaml @@ -4,5 +4,4 @@ Metrics: ButtonDepth: 0 ButtonFont: Bold CheckboxPressedState: true - ColorPickerActorType: fact.colorpicker TextfieldColorHighlight: 800000 diff --git a/mods/cnc/rules/world.yaml b/mods/cnc/rules/world.yaml index 8c000d5e63..7a421a3114 100644 --- a/mods/cnc/rules/world.yaml +++ b/mods/cnc/rules/world.yaml @@ -255,6 +255,7 @@ World: ScriptTriggers: TimeLimitManager: ColorPickerManager: + PreviewActor: fact.colorpicker RemapIndices: 176, 178, 180, 182, 184, 186, 189, 191, 177, 179, 181, 183, 185, 187, 188, 190 TeamColorPresets: f70606, ff7a22, f8d3b3, f8e947, 94b319, f335a0, a64d6c, ce08f9, f5b2db, 12b572, 502048, 1d06f7, 328dff, 78dbf8, cef6b1, 391d1d diff --git a/mods/d2k/metrics.yaml b/mods/d2k/metrics.yaml index 0442528d70..1804f16608 100644 --- a/mods/d2k/metrics.yaml +++ b/mods/d2k/metrics.yaml @@ -1,6 +1,5 @@ # General dumping-ground for UI element sizes, etc. Metrics: - ColorPickerActorType: carryall.colorpicker FactionSuffix-fremen: atreides FactionSuffix-corrino: harkonnen FactionSuffix-smuggler: ordos diff --git a/mods/d2k/rules/world.yaml b/mods/d2k/rules/world.yaml index 36d02a4118..c07d651492 100644 --- a/mods/d2k/rules/world.yaml +++ b/mods/d2k/rules/world.yaml @@ -236,6 +236,7 @@ World: StartGameNotification: TimeLimitManager: ColorPickerManager: + PreviewActor: carryall.colorpicker RemapIndices: 255, 254, 253, 252, 251, 250, 249, 248, 247, 246, 245, 244, 243, 242, 241, 240 TeamColorPresets: 9023cd, f53333, ffae00, fff830, 87f506, f872ad, da06f3, ddb8ff, def7b2, 39c46f, 200738, 280df6, 2f86f2, 76d2f8, 498221, 392929 diff --git a/mods/ra/metrics.yaml b/mods/ra/metrics.yaml index 05835f2e52..47db2b8907 100644 --- a/mods/ra/metrics.yaml +++ b/mods/ra/metrics.yaml @@ -1,7 +1,6 @@ # General dumping-ground for UI element sizes, etc. Metrics: - ColorPickerActorType: fact.colorpicker FactionSuffix-allies: allies FactionSuffix-england: allies FactionSuffix-france: allies diff --git a/mods/ra/rules/world.yaml b/mods/ra/rules/world.yaml index 57e9965c26..3d1c5c500b 100644 --- a/mods/ra/rules/world.yaml +++ b/mods/ra/rules/world.yaml @@ -281,6 +281,7 @@ World: 2: WarningTwoMinutesRemaining 1: WarningOneMinuteRemaining ColorPickerManager: + PreviewActor: fact.colorpicker RemapIndices: 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95 TeamColorPresets: f7b3b3, f50606, 98331f, f57606, f7bb06, f861a4, da06f3, ddb8ff, 06f739, cef7b2, 200738, 280df6, 2f86f2, 76d2f8, 34ba93, 391d1d diff --git a/mods/ts/metrics.yaml b/mods/ts/metrics.yaml index b458e1790e..cf38ecf039 100644 --- a/mods/ts/metrics.yaml +++ b/mods/ts/metrics.yaml @@ -1,4 +1,3 @@ # General dumping-ground for UI element sizes, etc. Metrics: - ColorPickerActorType: mmch.colorpicker TextfieldColorHighlight: 1a1a1a diff --git a/mods/ts/rules/world.yaml b/mods/ts/rules/world.yaml index 291d2f3939..e34cd2dd58 100644 --- a/mods/ts/rules/world.yaml +++ b/mods/ts/rules/world.yaml @@ -381,6 +381,7 @@ World: ScriptTriggers: TimeLimitManager: ColorPickerManager: + PreviewActor: mmch.colorpicker RemapIndices: 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31 TeamColorPresets: f70606, ff7a22, f8d3b3, f8e947, 94b319, f335a0, a64d6c, ce08f9, f5b2db, 12b572, 4A1948, 1d06f7, 328dff, 78dbf8, cef6b1, 391d1d