Reimplement sequence Defaults parsing:
The previous MiniYaml.Merge implementation interacted poorly with yaml inheritance, making it complicated (or impossible) to override certain keys from Defaults. The new implementation is simpler: If a key is defined it will be used. If it isn't, the default (if defined) will be used. Defaults can be masked by making sure the same key is defined (even with an empty value) in the sequence. This also fixes naming within the sequence code to distinguish between images (a group of sequences), sequences (defining a specific sprite/animation), and filenames for a specific sprite/animation.
This commit is contained in:
@@ -35,9 +35,9 @@ namespace OpenRA.Mods.Common.Graphics
|
||||
TilesetCodes = yaml.ToDictionary(kv => kv.Value);
|
||||
}
|
||||
|
||||
public override ISpriteSequence CreateSequence(ModData modData, string tileSet, SpriteCache cache, string sequence, string animation, MiniYaml info)
|
||||
public override ISpriteSequence CreateSequence(ModData modData, string tileSet, SpriteCache cache, string image, string sequence, MiniYaml data, MiniYaml defaults)
|
||||
{
|
||||
return new TilesetSpecificSpriteSequence(modData, tileSet, cache, this, sequence, animation, info);
|
||||
return new TilesetSpecificSpriteSequence(modData, tileSet, cache, this, image, sequence, data, defaults);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -59,42 +59,35 @@ namespace OpenRA.Mods.Common.Graphics
|
||||
[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);
|
||||
|
||||
public TilesetSpecificSpriteSequence(ModData modData, string tileSet, SpriteCache cache, ISpriteSequenceLoader loader, string sequence, string animation, MiniYaml info)
|
||||
: base(modData, tileSet, cache, loader, sequence, animation, info) { }
|
||||
public TilesetSpecificSpriteSequence(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, Dictionary<string, MiniYaml> d)
|
||||
static string ResolveTilesetId(string tileset, MiniYaml data, MiniYaml defaults)
|
||||
{
|
||||
if (d.TryGetValue(nameof(TilesetOverrides), out var yaml))
|
||||
{
|
||||
var tsNode = yaml.Nodes.FirstOrDefault(n => n.Key == tileSet);
|
||||
if (tsNode != null)
|
||||
tileSet = tsNode.Value.Value;
|
||||
}
|
||||
|
||||
return tileSet;
|
||||
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 GetSpriteSrc(ModData modData, string tileSet, string sequence, string animation, string sprite, Dictionary<string, MiniYaml> d)
|
||||
protected override string GetSpriteFilename(ModData modData, string tileset, string image, string sequence, MiniYaml data, MiniYaml defaults)
|
||||
{
|
||||
var loader = (TilesetSpecificSpriteSequenceLoader)Loader;
|
||||
var filename = data.Value ?? defaults.Value ?? image;
|
||||
|
||||
var spriteName = sprite ?? sequence;
|
||||
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(d, UseTilesetCode))
|
||||
if (LoadField(AddExtension, data, defaults))
|
||||
{
|
||||
if (loader.TilesetCodes.TryGetValue(ResolveTilesetId(tileSet, d), out var code))
|
||||
spriteName = spriteName.Substring(0, 1) + code + spriteName.Substring(2, spriteName.Length - 2);
|
||||
if (LoadField(UseTilesetExtension, data, defaults))
|
||||
if (loader.TilesetExtensions.TryGetValue(ResolveTilesetId(tileset, data, defaults), out var tilesetExtension))
|
||||
return filename + tilesetExtension;
|
||||
|
||||
return filename + loader.DefaultSpriteExtension;
|
||||
}
|
||||
|
||||
if (LoadField(d, AddExtension))
|
||||
{
|
||||
if (LoadField(d, UseTilesetExtension) && loader.TilesetExtensions.TryGetValue(ResolveTilesetId(tileSet, d), out var tilesetExtension))
|
||||
return spriteName + tilesetExtension;
|
||||
|
||||
return spriteName + loader.DefaultSpriteExtension;
|
||||
}
|
||||
|
||||
return spriteName;
|
||||
return filename;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user