From 5f80e93aee97768332f52db78f59d9f2dd1b8b60 Mon Sep 17 00:00:00 2001 From: penev92 Date: Mon, 9 Jan 2023 23:28:17 +0200 Subject: [PATCH] Added ITilesetSpecificPaletteInfo for linting --- OpenRA.Game/Traits/TraitsInterfaces.cs | 6 ++++++ OpenRA.Mods.Common/Lint/CheckPalettes.cs | 9 ++++----- OpenRA.Mods.Common/Traits/Palettes/PaletteFromFile.cs | 4 +++- .../Traits/Palettes/PaletteFromGrayscale.cs | 4 +++- OpenRA.Mods.Common/Traits/Palettes/PaletteFromPng.cs | 4 +++- OpenRA.Mods.Common/Traits/Palettes/PaletteFromRGBA.cs | 4 +++- 6 files changed, 22 insertions(+), 9 deletions(-) diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index b56dbcf947..2811ceb8f5 100644 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -244,6 +244,12 @@ namespace OpenRA.Traits IEnumerable ModifyScreenBounds(Actor self, WorldRenderer wr, IEnumerable r); } + [RequireExplicitImplementation] + public interface ITilesetSpecificPaletteInfo : ITraitInfoInterface + { + string Tileset { get; } + } + [RequireExplicitImplementation] public interface IProvidesCursorPaletteInfo : ITraitInfoInterface { diff --git a/OpenRA.Mods.Common/Lint/CheckPalettes.cs b/OpenRA.Mods.Common/Lint/CheckPalettes.cs index 98c4089550..836a71bd6a 100644 --- a/OpenRA.Mods.Common/Lint/CheckPalettes.cs +++ b/OpenRA.Mods.Common/Lint/CheckPalettes.cs @@ -12,7 +12,6 @@ using System; using System.Collections.Generic; using System.Linq; -using OpenRA.Mods.Common.Traits; using OpenRA.Server; using OpenRA.Traits; @@ -146,11 +145,11 @@ namespace OpenRA.Mods.Common.Lint } else { - // 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) + // Tileset-specific palettes can share a name, so check combinations. + // NOTE: This does not check PaletteFromGimpOrJascFile! + if (traitInfo is ITilesetSpecificPaletteInfo tilesetSpecificPaletteInfo && tilesetSpecificPaletteInfo.Tileset != null) { - var tilesetPalette = (paletteFromFileInfo.Tileset, value); + var tilesetPalette = (tilesetSpecificPaletteInfo.Tileset, value); if (tilesetPalettes.Contains(tilesetPalette)) emitError($"Duplicate palette definition for palette name {value}"); else diff --git a/OpenRA.Mods.Common/Traits/Palettes/PaletteFromFile.cs b/OpenRA.Mods.Common/Traits/Palettes/PaletteFromFile.cs index f309626cf5..397878dc39 100644 --- a/OpenRA.Mods.Common/Traits/Palettes/PaletteFromFile.cs +++ b/OpenRA.Mods.Common/Traits/Palettes/PaletteFromFile.cs @@ -19,7 +19,7 @@ namespace OpenRA.Mods.Common.Traits { [TraitLocation(SystemActors.World | SystemActors.EditorWorld)] [Desc("Load VGA palette (.pal) registers.")] - class PaletteFromFileInfo : TraitInfo, IProvidesCursorPaletteInfo + class PaletteFromFileInfo : TraitInfo, ITilesetSpecificPaletteInfo, IProvidesCursorPaletteInfo { [PaletteDefinition] [FieldLoader.Require] @@ -46,6 +46,8 @@ namespace OpenRA.Mods.Common.Traits public override object Create(ActorInitializer init) { return new PaletteFromFile(init.World, this); } + string ITilesetSpecificPaletteInfo.Tileset => Tileset; + string IProvidesCursorPaletteInfo.Palette => CursorPalette ? Name : null; ImmutablePalette IProvidesCursorPaletteInfo.ReadPalette(IReadOnlyFileSystem fileSystem) diff --git a/OpenRA.Mods.Common/Traits/Palettes/PaletteFromGrayscale.cs b/OpenRA.Mods.Common/Traits/Palettes/PaletteFromGrayscale.cs index 0c617b7b36..379f6f2ec4 100644 --- a/OpenRA.Mods.Common/Traits/Palettes/PaletteFromGrayscale.cs +++ b/OpenRA.Mods.Common/Traits/Palettes/PaletteFromGrayscale.cs @@ -19,7 +19,7 @@ namespace OpenRA.Mods.Common.Traits { [TraitLocation(SystemActors.World | SystemActors.EditorWorld)] [Desc("Creates a greyscale palette without any base palette file.")] - class PaletteFromGrayscaleInfo : TraitInfo + class PaletteFromGrayscaleInfo : TraitInfo, ITilesetSpecificPaletteInfo { [PaletteDefinition] [FieldLoader.Require] @@ -34,6 +34,8 @@ namespace OpenRA.Mods.Common.Traits [Desc("Index set to be fully transparent/invisible.")] public readonly int TransparentIndex = 0; + string ITilesetSpecificPaletteInfo.Tileset => Tileset; + public override object Create(ActorInitializer init) { return new PaletteFromGrayscale(init.World, this); } } diff --git a/OpenRA.Mods.Common/Traits/Palettes/PaletteFromPng.cs b/OpenRA.Mods.Common/Traits/Palettes/PaletteFromPng.cs index b1b84ed6b7..c32bc734dd 100644 --- a/OpenRA.Mods.Common/Traits/Palettes/PaletteFromPng.cs +++ b/OpenRA.Mods.Common/Traits/Palettes/PaletteFromPng.cs @@ -20,7 +20,7 @@ namespace OpenRA.Mods.Common.Traits { [TraitLocation(SystemActors.World | SystemActors.EditorWorld)] [Desc("Load a PNG and use its embedded palette.")] - class PaletteFromPngInfo : TraitInfo, IProvidesCursorPaletteInfo + class PaletteFromPngInfo : TraitInfo, ITilesetSpecificPaletteInfo, IProvidesCursorPaletteInfo { [PaletteDefinition] [FieldLoader.Require] @@ -44,6 +44,8 @@ namespace OpenRA.Mods.Common.Traits public override object Create(ActorInitializer init) { return new PaletteFromPng(init.World, this); } + string ITilesetSpecificPaletteInfo.Tileset => Tileset; + string IProvidesCursorPaletteInfo.Palette => CursorPalette ? Name : null; ImmutablePalette IProvidesCursorPaletteInfo.ReadPalette(IReadOnlyFileSystem fileSystem) diff --git a/OpenRA.Mods.Common/Traits/Palettes/PaletteFromRGBA.cs b/OpenRA.Mods.Common/Traits/Palettes/PaletteFromRGBA.cs index a0aa5db518..3850615bb0 100644 --- a/OpenRA.Mods.Common/Traits/Palettes/PaletteFromRGBA.cs +++ b/OpenRA.Mods.Common/Traits/Palettes/PaletteFromRGBA.cs @@ -19,7 +19,7 @@ namespace OpenRA.Mods.Common.Traits { [TraitLocation(SystemActors.World | SystemActors.EditorWorld)] [Desc("Creates a single color palette without any base palette file.")] - class PaletteFromRGBAInfo : TraitInfo + class PaletteFromRGBAInfo : TraitInfo, ITilesetSpecificPaletteInfo { [PaletteDefinition] [FieldLoader.Require] @@ -46,6 +46,8 @@ namespace OpenRA.Mods.Common.Traits [Desc("Index set to be fully transparent/invisible.")] public readonly int TransparentIndex = 0; + string ITilesetSpecificPaletteInfo.Tileset => Tileset; + public override object Create(ActorInitializer init) { return new PaletteFromRGBA(init.World, this); } }