Simplify tileset-specific sequence definitions.
All magic behaviour for constructing sprite filenames has been removed in favour of an explicit Filename (and TilesetFilenames for tileset-specific sequences) property.
This commit is contained in:
@@ -18,23 +18,8 @@ namespace OpenRA.Mods.Cnc.Graphics
|
||||
{
|
||||
public class ClassicTilesetSpecificSpriteSequenceLoader : ClassicSpriteSequenceLoader
|
||||
{
|
||||
public readonly string DefaultSpriteExtension = ".shp";
|
||||
public readonly Dictionary<string, string> TilesetExtensions = new Dictionary<string, string>();
|
||||
public readonly Dictionary<string, string> TilesetCodes = new Dictionary<string, string>();
|
||||
|
||||
public ClassicTilesetSpecificSpriteSequenceLoader(ModData modData)
|
||||
: base(modData)
|
||||
{
|
||||
var metadata = modData.Manifest.Get<SpriteSequenceFormat>().Metadata;
|
||||
if (metadata.TryGetValue("DefaultSpriteExtension", out var yaml))
|
||||
DefaultSpriteExtension = yaml.Value;
|
||||
|
||||
if (metadata.TryGetValue("TilesetExtensions", out yaml))
|
||||
TilesetExtensions = yaml.ToDictionary(kv => kv.Value);
|
||||
|
||||
if (metadata.TryGetValue("TilesetCodes", out yaml))
|
||||
TilesetCodes = yaml.ToDictionary(kv => kv.Value);
|
||||
}
|
||||
: base(modData) { }
|
||||
|
||||
public override ISpriteSequence CreateSequence(ModData modData, string tileset, SpriteCache cache, string image, string sequence, MiniYaml data, MiniYaml defaults)
|
||||
{
|
||||
@@ -46,49 +31,23 @@ namespace OpenRA.Mods.Cnc.Graphics
|
||||
"that come with first-generation Westwood titles.")]
|
||||
public class ClassicTilesetSpecificSpriteSequence : ClassicSpriteSequence
|
||||
{
|
||||
[Desc("Dictionary of <string: string> with tileset name to override -> tileset name to use instead.")]
|
||||
static readonly SpriteSequenceField<Dictionary<string, string>> TilesetOverrides = new SpriteSequenceField<Dictionary<string, string>>(nameof(TilesetOverrides), null);
|
||||
|
||||
[Desc("Use `TilesetCodes` as defined in `mod.yaml` to add a letter as a second character " +
|
||||
"into the sprite filename like the Westwood 2.5D titles did for tileset-specific variants.")]
|
||||
static readonly SpriteSequenceField<bool> UseTilesetCode = new SpriteSequenceField<bool>(nameof(UseTilesetCode), false);
|
||||
|
||||
[Desc("Append a tileset-specific extension to the file name " +
|
||||
"- either as defined in `mod.yaml`'s `TilesetExtensions` (if `UseTilesetExtension` is used) " +
|
||||
"or the default hardcoded one for this sequence type (.shp).")]
|
||||
static readonly SpriteSequenceField<bool> AddExtension = new SpriteSequenceField<bool>(nameof(AddExtension), true);
|
||||
|
||||
[Desc("Whether `mod.yaml`'s `TilesetExtensions` should be used with the sequence's file name.")]
|
||||
static readonly SpriteSequenceField<bool> UseTilesetExtension = new SpriteSequenceField<bool>(nameof(UseTilesetExtension), false);
|
||||
[Desc("Dictionary of <tileset name>: filename to override the Filename key.")]
|
||||
static readonly SpriteSequenceField<Dictionary<string, string>> TilesetFilenames = new SpriteSequenceField<Dictionary<string, string>>(nameof(TilesetFilenames), null);
|
||||
|
||||
public ClassicTilesetSpecificSpriteSequence(ModData modData, string tileset, SpriteCache cache, ISpriteSequenceLoader loader, string image, string sequence, MiniYaml data, MiniYaml defaults)
|
||||
: base(modData, tileset, cache, loader, image, sequence, data, defaults) { }
|
||||
|
||||
static string ResolveTilesetId(string tileset, MiniYaml data, MiniYaml defaults)
|
||||
{
|
||||
var node = data.Nodes.FirstOrDefault(n => n.Key == TilesetOverrides.Key) ?? defaults.Nodes.FirstOrDefault(n => n.Key == TilesetOverrides.Key);
|
||||
var overrideNode = node?.Value.Nodes.FirstOrDefault(n => n.Key == tileset);
|
||||
return overrideNode?.Value.Value ?? tileset;
|
||||
}
|
||||
|
||||
protected override string GetSpriteFilename(ModData modData, string tileset, string image, string sequence, MiniYaml data, MiniYaml defaults)
|
||||
{
|
||||
var loader = (ClassicTilesetSpecificSpriteSequenceLoader)Loader;
|
||||
var filename = data.Value ?? defaults.Value ?? image;
|
||||
if (LoadField(UseTilesetCode, data, defaults))
|
||||
if (loader.TilesetCodes.TryGetValue(ResolveTilesetId(tileset, data, defaults), out var tilesetCode))
|
||||
filename = filename.Substring(0, 1) + tilesetCode + filename.Substring(2, filename.Length - 2);
|
||||
|
||||
if (LoadField(AddExtension, data, defaults))
|
||||
var node = data.Nodes.FirstOrDefault(n => n.Key == TilesetFilenames.Key) ?? defaults.Nodes.FirstOrDefault(n => n.Key == TilesetFilenames.Key);
|
||||
if (node != null)
|
||||
{
|
||||
if (LoadField(UseTilesetExtension, data, defaults))
|
||||
if (loader.TilesetExtensions.TryGetValue(ResolveTilesetId(tileset, data, defaults), out var tilesetExtension))
|
||||
return filename + tilesetExtension;
|
||||
|
||||
return filename + loader.DefaultSpriteExtension;
|
||||
var tilesetNode = node.Value.Nodes.FirstOrDefault(n => n.Key == tileset);
|
||||
if (tilesetNode != null)
|
||||
return tilesetNode.Value.Value;
|
||||
}
|
||||
|
||||
return filename;
|
||||
return base.GetSpriteFilename(modData, tileset, image, sequence, data, defaults);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user