Merge pull request #7732 from pchote/tsra2-reverses

Clean up sequence key loading and add Reverses field for TS/RA2.
This commit is contained in:
reaperrr
2015-03-25 06:41:44 +01:00
2 changed files with 42 additions and 61 deletions

View File

@@ -60,6 +60,7 @@ namespace OpenRA.Mods.Common.Graphics
public class DefaultSpriteSequence : ISpriteSequence
{
static readonly WRange DefaultShadowSpriteZOffset = new WRange(-5);
readonly Sprite[] sprites;
readonly bool reverseFacings, transpose;
@@ -76,9 +77,18 @@ namespace OpenRA.Mods.Common.Graphics
public int ShadowZOffset { get; private set; }
public int[] Frames { get; private set; }
protected virtual string GetSpriteSrc(ModData modData, TileSet tileSet, string sequence, string animation, MiniYaml info, Dictionary<string, MiniYaml> d)
protected virtual string GetSpriteSrc(ModData modData, TileSet tileSet, string sequence, string animation, string sprite, Dictionary<string, MiniYaml> d)
{
return info.Value ?? sequence;
return sprite ?? sequence;
}
protected static T LoadField<T>(Dictionary<string, MiniYaml> d, string key, T fallback)
{
MiniYaml value;
if (d.TryGetValue(key, out value))
return FieldLoader.GetValue<T>(key, value.Value);
return fallback;
}
public DefaultSpriteSequence(ModData modData, TileSet tileSet, SpriteCache cache, ISpriteSequenceLoader loader, string sequence, string animation, MiniYaml info)
@@ -86,78 +96,48 @@ namespace OpenRA.Mods.Common.Graphics
Name = animation;
Loader = loader;
var d = info.ToDictionary();
var offset = float2.Zero;
var blendMode = BlendMode.Alpha;
try
{
if (d.ContainsKey("Start"))
Start = Exts.ParseIntegerInvariant(d["Start"].Value);
Start = LoadField<int>(d, "Start", 0);
ShadowStart = LoadField<int>(d, "ShadowStart", -1);
ShadowZOffset = LoadField<WRange>(d, "ShadowZOffset", DefaultShadowSpriteZOffset).Range;
ZOffset = LoadField<WRange>(d, "ZOffset", WRange.Zero).Range;
Tick = LoadField<int>(d, "Tick", 40);
transpose = LoadField<bool>(d, "Transpose", false);
Frames = LoadField<int[]>(d, "Frames", null);
if (d.ContainsKey("Offset"))
offset = FieldLoader.GetValue<float2>("Offset", d["Offset"].Value);
Facings = LoadField<int>(d, "Facings", 1);
if (Facings < 0)
{
reverseFacings = true;
Facings = -Facings;
}
if (d.ContainsKey("BlendMode"))
blendMode = FieldLoader.GetValue<BlendMode>("BlendMode", d["BlendMode"].Value);
var offset = LoadField<float2>(d, "Offset", float2.Zero);
var blendMode = LoadField<BlendMode>(d, "BlendMode", BlendMode.Alpha);
// Apply offset to each sprite in the sequence
// Different sequences may apply different offsets to the same frame
var src = GetSpriteSrc(modData, tileSet, sequence, animation, info, d);
var src = GetSpriteSrc(modData, tileSet, sequence, animation, info.Value, d);
sprites = cache[src].Select(
s => new Sprite(s.Sheet, s.Bounds, s.Offset + offset, s.Channel, blendMode)).ToArray();
if (!d.ContainsKey("Length"))
Length = 1;
else if (d["Length"].Value == "*")
MiniYaml length;
if (d.TryGetValue("Length", out length) && length.Value == "*")
Length = sprites.Length - Start;
else
Length = Exts.ParseIntegerInvariant(d["Length"].Value);
Length = LoadField<int>(d, "Length", 1);
if (d.ContainsKey("Stride"))
Stride = Exts.ParseIntegerInvariant(d["Stride"].Value);
else
Stride = Length;
if (d.ContainsKey("Facings"))
// Plays the animation forwards, and then in reverse
if (LoadField<bool>(d, "Reverses", false))
{
var f = Exts.ParseIntegerInvariant(d["Facings"].Value);
Facings = Math.Abs(f);
reverseFacings = f < 0;
var frames = Frames ?? Exts.MakeArray(Length, i => Start + i);
Frames = frames.Concat(frames.Skip(1).Take(frames.Length - 2).Reverse()).ToArray();
Length = 2 * Length - 2;
}
else
Facings = 1;
if (d.ContainsKey("Tick"))
Tick = Exts.ParseIntegerInvariant(d["Tick"].Value);
else
Tick = 40;
if (d.ContainsKey("Transpose"))
transpose = bool.Parse(d["Transpose"].Value);
if (d.ContainsKey("Frames"))
Frames = Array.ConvertAll<string, int>(d["Frames"].Value.Split(','), Exts.ParseIntegerInvariant);
if (d.ContainsKey("ShadowStart"))
ShadowStart = Exts.ParseIntegerInvariant(d["ShadowStart"].Value);
else
ShadowStart = -1;
if (d.ContainsKey("ShadowZOffset"))
{
WRange r;
if (WRange.TryParse(d["ShadowZOffset"].Value, out r))
ShadowZOffset = r.Range;
}
else
ShadowZOffset = -5;
if (d.ContainsKey("ZOffset"))
{
WRange r;
if (WRange.TryParse(d["ZOffset"].Value, out r))
ZOffset = r.Range;
}
Stride = LoadField<int>(d, "Stride", Length);
if (Length > Stride)
throw new InvalidOperationException(

View File

@@ -358,12 +358,13 @@ garadr:
ShadowStart: 5
Tick: 400
idle-dish: gtradr_a
Frames: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1
Length: 28
Length: 15
Reverses: True
Tick: 200
damaged-idle-dish: gtradr_a
Frames: 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16
Length: 28
Start: 15
Length: 15
Reverses: True
Tick: 240
make: gtradrmk
Length: 20