Support alternate sequence ordering for ts and d2k. Fixes #3333.

This commit is contained in:
Paul Chote
2013-05-27 21:11:44 +12:00
parent c149898592
commit bf3d337913

View File

@@ -19,6 +19,7 @@ namespace OpenRA.Graphics
{ {
readonly Sprite[] sprites; readonly Sprite[] sprites;
readonly int start, length, stride, facings, tick; readonly int start, length, stride, facings, tick;
readonly bool reverseFacings, transpose;
public readonly string Name; public readonly string Name;
public int Start { get { return start; } } public int Start { get { return start; } }
@@ -49,16 +50,23 @@ namespace OpenRA.Graphics
else else
stride = length; stride = length;
if(d.ContainsKey("Facings")) if (d.ContainsKey("Facings"))
facings = int.Parse(d["Facings"].Value); {
var f = int.Parse(d["Facings"].Value);
facings = Math.Abs(f);
reverseFacings = f < 0;
}
else else
facings = 1; facings = 1;
if(d.ContainsKey("Tick")) if (d.ContainsKey("Tick"))
tick = int.Parse(d["Tick"].Value); tick = int.Parse(d["Tick"].Value);
else else
tick = 40; tick = 40;
if (d.ContainsKey("Transpose"))
transpose = bool.Parse(d["Transpose"].Value);
if (length > stride) if (length > stride)
throw new InvalidOperationException( throw new InvalidOperationException(
"{0}: Sequence {1}.{2}: Length must be <= stride" "{0}: Sequence {1}.{2}: Length must be <= stride"
@@ -71,15 +79,22 @@ namespace OpenRA.Graphics
info.Nodes[0].Location)); info.Nodes[0].Location));
} }
public Sprite GetSprite( int frame ) public Sprite GetSprite(int frame)
{ {
return GetSprite( frame, 0 ); return GetSprite(frame, 0);
} }
public Sprite GetSprite(int frame, int facing) public Sprite GetSprite(int frame, int facing)
{ {
var f = Traits.Util.QuantizeFacing( facing, facings ); var f = Traits.Util.QuantizeFacing(facing, facings);
return sprites[ (f * stride) + ( frame % length ) + start ];
if (reverseFacings)
f = (facings - f) % facings;
int i = transpose ? (frame % length) * facings + f :
(f * stride) + (frame % length);
return sprites[start + i];
} }
} }
} }