diff --git a/OpenRA.Game/ModData.cs b/OpenRA.Game/ModData.cs index 2998c86790..2cb98bf78d 100644 --- a/OpenRA.Game/ModData.cs +++ b/OpenRA.Game/ModData.cs @@ -61,29 +61,8 @@ namespace OpenRA RulesetCache.LoadingProgress += HandleLoadingProgress; MapCache = new MapCache(this); - var soundLoaders = new List(); - foreach (var format in Manifest.SoundFormats) - { - var loader = ObjectCreator.FindType(format + "Loader"); - if (loader == null || !loader.GetInterfaces().Contains(typeof(ISoundLoader))) - throw new InvalidOperationException("Unable to find a sound loader for type '{0}'.".F(format)); - - soundLoaders.Add((ISoundLoader)ObjectCreator.CreateBasic(loader)); - } - - SoundLoaders = soundLoaders.ToArray(); - - var spriteLoaders = new List(); - foreach (var format in Manifest.SpriteFormats) - { - var loader = ObjectCreator.FindType(format + "Loader"); - if (loader == null || !loader.GetInterfaces().Contains(typeof(ISpriteLoader))) - throw new InvalidOperationException("Unable to find a sprite loader for type '{0}'.".F(format)); - - spriteLoaders.Add((ISpriteLoader)ObjectCreator.CreateBasic(loader)); - } - - SpriteLoaders = spriteLoaders.ToArray(); + SoundLoaders = GetLoaders(Manifest.SoundFormats, "sound"); + SpriteLoaders = GetLoaders(Manifest.SpriteFormats, "sprite"); var sequenceFormat = Manifest.Get(); var sequenceLoader = ObjectCreator.FindType(sequenceFormat.Type + "Loader"); @@ -126,6 +105,21 @@ namespace OpenRA CursorProvider = new CursorProvider(this); } + TLoader[] GetLoaders(IEnumerable formats, string name) + { + var loaders = new List(); + foreach (var format in formats) + { + var loader = ObjectCreator.FindType(format + "Loader"); + if (loader == null || !loader.GetInterfaces().Contains(typeof(TLoader))) + throw new InvalidOperationException("Unable to find a {0} loader for type '{1}'.".F(name, format)); + + loaders.Add((TLoader)ObjectCreator.CreateBasic(loader)); + } + + return loaders.ToArray(); + } + public IEnumerable Languages { get; private set; } void LoadTranslations(Map map)