From 28adb915f5da418d30a6bf1c69e47ce19c5034c8 Mon Sep 17 00:00:00 2001 From: abcdefg30 Date: Wed, 14 Sep 2022 13:02:47 +0200 Subject: [PATCH] Make CheckPalettes report duplicate palettes --- OpenRA.Mods.Common/Lint/CheckPalettes.cs | 37 ++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/OpenRA.Mods.Common/Lint/CheckPalettes.cs b/OpenRA.Mods.Common/Lint/CheckPalettes.cs index 25e62bb849..98c4089550 100644 --- a/OpenRA.Mods.Common/Lint/CheckPalettes.cs +++ b/OpenRA.Mods.Common/Lint/CheckPalettes.cs @@ -12,6 +12,7 @@ using System; using System.Collections.Generic; using System.Linq; +using OpenRA.Mods.Common.Traits; using OpenRA.Server; using OpenRA.Traits; @@ -33,7 +34,7 @@ namespace OpenRA.Mods.Common.Lint { var palettes = new List(); var playerPalettes = new List(); - GetPalettes(rules, palettes, playerPalettes); + GetPalettes(rules, palettes, playerPalettes, emitError); foreach (var actorInfo in rules.Actors) { @@ -119,10 +120,11 @@ namespace OpenRA.Mods.Common.Lint } } - void GetPalettes(Ruleset rules, List palettes, List playerPalettes) + void GetPalettes(Ruleset rules, List palettes, List playerPalettes, Action emitError) { // Palettes are only defined on the world actor var worldActorInfo = rules.Actors[SystemActors.World]; + var tilesetPalettes = new List<(string Tileset, string PaletteName)>(); foreach (var traitInfo in worldActorInfo.TraitInfos()) { var fields = traitInfo.GetType().GetFields(); @@ -136,9 +138,38 @@ namespace OpenRA.Mods.Common.Lint foreach (var value in values) { if (paletteDefinition.IsPlayerPalette) + { + if (playerPalettes.Contains(value)) + emitError($"Duplicate player palette definition for palette name {value}"); + playerPalettes.Add(value); + } else - palettes.Add(value); + { + // PaletteFromFile might only be active for a single tileset + // So ignore any duplicate palette names as long as they are on different tilesets + if (traitInfo is PaletteFromFileInfo paletteFromFileInfo && paletteFromFileInfo.Tileset != null) + { + var tilesetPalette = (paletteFromFileInfo.Tileset, value); + if (tilesetPalettes.Contains(tilesetPalette)) + emitError($"Duplicate palette definition for palette name {value}"); + else + { + tilesetPalettes.Add(tilesetPalette); + + // Only add the basic palette name once + if (!palettes.Contains(value)) + palettes.Add(value); + } + } + else + { + if (palettes.Contains(value)) + emitError($"Duplicate palette definition for palette name {value}"); + + palettes.Add(value); + } + } } } }