diff --git a/OpenRA.Game/Manifest.cs b/OpenRA.Game/Manifest.cs index 989a6442a4..7af552fdd6 100644 --- a/OpenRA.Game/Manifest.cs +++ b/OpenRA.Game/Manifest.cs @@ -70,6 +70,8 @@ namespace OpenRA public readonly ImmutableArray SpriteFormats = []; public readonly ImmutableArray PackageFormats = []; public readonly ImmutableArray VideoFormats = []; + public readonly string SpriteSequenceFormat; + public readonly string TerrainFormat; // TODO: This should be controlled by a user-selected translation bundle! public readonly string FluentCulture = "en"; @@ -81,7 +83,7 @@ namespace OpenRA "Sequences", "ModelSequences", "Cursors", "Chrome", "Assemblies", "ChromeLayout", "Weapons", "Voices", "Notifications", "Music", "FluentMessages", "TileSets", "ChromeMetrics", "Missions", "Hotkeys", "ServerTraits", "LoadScreen", "DefaultOrderGenerator", "SupportsMapsFrom", "SoundFormats", "SpriteFormats", "VideoFormats", - "RequiresMods", "PackageFormats", "AllowUnusedFluentMessagesInExternalPackages", "RendererConstants" + "SpriteSequenceFormat", "TerrainFormat", "RequiresMods", "PackageFormats", "AllowUnusedFluentMessagesInExternalPackages", "RendererConstants" }.ToFrozenSet(); public readonly FrozenDictionary GlobalModData; @@ -166,6 +168,12 @@ namespace OpenRA if (yaml.TryGetValue("VideoFormats", out entry)) VideoFormats = FieldLoader.GetValue>("VideoFormats", entry.Value); + if (yaml.TryGetValue("SpriteSequenceFormat", out entry)) + SpriteSequenceFormat = entry.Value; + + if (yaml.TryGetValue("TerrainFormat", out entry)) + TerrainFormat = entry.Value; + if (yaml.TryGetValue("AllowUnusedFluentMessagesInExternalPackages", out entry)) AllowUnusedFluentMessagesInExternalPackages = FieldLoader.GetValue("AllowUnusedFluentMessagesInExternalPackages", entry.Value); diff --git a/OpenRA.Game/ModData.cs b/OpenRA.Game/ModData.cs index 63f61d6fdc..031117a155 100644 --- a/OpenRA.Game/ModData.cs +++ b/OpenRA.Game/ModData.cs @@ -26,28 +26,6 @@ namespace OpenRA { public interface IGlobalModData { } - public sealed class TerrainFormat : IGlobalModData - { - public readonly string Type; - public readonly IReadOnlyDictionary Metadata; - public TerrainFormat(MiniYaml yaml) - { - Type = yaml.Value; - Metadata = new ReadOnlyDictionary(yaml.ToDictionary()); - } - } - - public sealed class SpriteSequenceFormat : IGlobalModData - { - public readonly string Type; - public readonly IReadOnlyDictionary Metadata; - public SpriteSequenceFormat(MiniYaml yaml) - { - Type = yaml.Value; - Metadata = new ReadOnlyDictionary(yaml.ToDictionary()); - } - } - public sealed class ModData : IDisposable { public readonly Manifest Manifest; @@ -129,23 +107,15 @@ namespace OpenRA SoundLoaders = ObjectCreator.GetLoaders(Manifest.SoundFormats, "sound"); SpriteLoaders = ObjectCreator.GetLoaders(Manifest.SpriteFormats, "sprite"); VideoLoaders = ObjectCreator.GetLoaders(Manifest.VideoFormats, "video"); + SpriteSequenceLoader = ObjectCreator.GetLoader(Manifest.SpriteSequenceFormat, "sequence"); - var terrainFormat = GetOrCreate(); - var terrainLoader = ObjectCreator.FindType(terrainFormat.Type + "Loader"); + var terrainLoader = ObjectCreator.FindType(Manifest.TerrainFormat + "Loader"); var terrainCtor = terrainLoader?.GetConstructor([typeof(ModData)]); if (terrainLoader == null || !terrainLoader.GetInterfaces().Contains(typeof(ITerrainLoader)) || terrainCtor == null) - throw new InvalidOperationException($"Unable to find a terrain loader for type '{terrainFormat.Type}'."); + throw new InvalidOperationException($"Unable to find a terrain loader for type '{Manifest.TerrainFormat}'."); TerrainLoader = (ITerrainLoader)terrainCtor.Invoke([this]); - var sequenceFormat = GetOrCreate(); - var sequenceLoader = ObjectCreator.FindType(sequenceFormat.Type + "Loader"); - var sequenceCtor = sequenceLoader?.GetConstructor([typeof(ModData)]); - if (sequenceLoader == null || !sequenceLoader.GetInterfaces().Contains(typeof(ISpriteSequenceLoader)) || sequenceCtor == null) - throw new InvalidOperationException($"Unable to find a sequence loader for type '{sequenceFormat.Type}'."); - - SpriteSequenceLoader = (ISpriteSequenceLoader)sequenceCtor.Invoke([this]); - Hotkeys = new HotkeyManager(ModFiles, Game.Settings.Keys, Manifest); Cursors = ParseCursors(Manifest, DefaultFileSystem); diff --git a/OpenRA.Mods.Cnc/Graphics/ClassicSpriteSequence.cs b/OpenRA.Mods.Cnc/Graphics/ClassicSpriteSequence.cs index 72c733899d..0d1a0a8c78 100644 --- a/OpenRA.Mods.Cnc/Graphics/ClassicSpriteSequence.cs +++ b/OpenRA.Mods.Cnc/Graphics/ClassicSpriteSequence.cs @@ -17,9 +17,6 @@ namespace OpenRA.Mods.Cnc.Graphics { public class ClassicSpriteSequenceLoader : DefaultSpriteSequenceLoader { - public ClassicSpriteSequenceLoader(ModData modData) - : base(modData) { } - public override ClassicSpriteSequence CreateSequence( ModData modData, string tileset, SpriteCache cache, string image, string sequence, MiniYaml data, MiniYaml defaults) { diff --git a/OpenRA.Mods.Cnc/Graphics/ClassicTilesetSpecificSpriteSequence.cs b/OpenRA.Mods.Cnc/Graphics/ClassicTilesetSpecificSpriteSequence.cs index 166c170702..21298216ac 100644 --- a/OpenRA.Mods.Cnc/Graphics/ClassicTilesetSpecificSpriteSequence.cs +++ b/OpenRA.Mods.Cnc/Graphics/ClassicTilesetSpecificSpriteSequence.cs @@ -20,9 +20,6 @@ namespace OpenRA.Mods.Cnc.Graphics { public class ClassicTilesetSpecificSpriteSequenceLoader : ClassicSpriteSequenceLoader { - public ClassicTilesetSpecificSpriteSequenceLoader(ModData modData) - : base(modData) { } - public override ClassicTilesetSpecificSpriteSequence CreateSequence( ModData modData, string tileset, SpriteCache cache, string image, string sequence, MiniYaml data, MiniYaml defaults) { diff --git a/OpenRA.Mods.Common/Graphics/DefaultSpriteSequence.cs b/OpenRA.Mods.Common/Graphics/DefaultSpriteSequence.cs index 815b9f5211..4a14460d1a 100644 --- a/OpenRA.Mods.Common/Graphics/DefaultSpriteSequence.cs +++ b/OpenRA.Mods.Common/Graphics/DefaultSpriteSequence.cs @@ -24,8 +24,6 @@ namespace OpenRA.Mods.Common.Graphics { static readonly MiniYaml NoData = new(null); - public DefaultSpriteSequenceLoader(ModData modData) { } - public virtual ISpriteSequence CreateSequence( ModData modData, string tileset, SpriteCache cache, string image, string sequence, MiniYaml data, MiniYaml defaults) { diff --git a/OpenRA.Mods.Common/Graphics/TilesetSpecificSpriteSequence.cs b/OpenRA.Mods.Common/Graphics/TilesetSpecificSpriteSequence.cs index aa82ef1a40..3aa4ba2a94 100644 --- a/OpenRA.Mods.Common/Graphics/TilesetSpecificSpriteSequence.cs +++ b/OpenRA.Mods.Common/Graphics/TilesetSpecificSpriteSequence.cs @@ -19,9 +19,6 @@ namespace OpenRA.Mods.Common.Graphics { public class TilesetSpecificSpriteSequenceLoader : DefaultSpriteSequenceLoader { - public TilesetSpecificSpriteSequenceLoader(ModData modData) - : base(modData) { } - public override TilesetSpecificSpriteSequence CreateSequence( ModData modData, string tileSet, SpriteCache cache, string image, string sequence, MiniYaml data, MiniYaml defaults) { diff --git a/OpenRA.Mods.D2k/Graphics/D2kSpriteSequence.cs b/OpenRA.Mods.D2k/Graphics/D2kSpriteSequence.cs index f1f11802f1..258105668d 100644 --- a/OpenRA.Mods.D2k/Graphics/D2kSpriteSequence.cs +++ b/OpenRA.Mods.D2k/Graphics/D2kSpriteSequence.cs @@ -18,9 +18,6 @@ namespace OpenRA.Mods.D2k.Graphics { public class D2kSpriteSequenceLoader : DefaultSpriteSequenceLoader { - public D2kSpriteSequenceLoader(ModData modData) - : base(modData) { } - public override D2kSpriteSequence CreateSequence( ModData modData, string tileset, SpriteCache cache, string image, string sequence, MiniYaml data, MiniYaml defaults) {