Add UseClassicFacingFudge flag for TD/RA.

This commit is contained in:
Paul Chote
2016-01-14 19:46:54 +00:00
parent fe60f5a77f
commit 608b5d1674
3 changed files with 37 additions and 4 deletions

View File

@@ -75,7 +75,7 @@ namespace OpenRA.Mods.Common.Graphics
{ {
static readonly WDist DefaultShadowSpriteZOffset = new WDist(-5); static readonly WDist DefaultShadowSpriteZOffset = new WDist(-5);
readonly Sprite[] sprites; readonly Sprite[] sprites;
readonly bool reverseFacings, transpose; readonly bool reverseFacings, transpose, useClassicFacingFudge;
protected readonly ISpriteSequenceLoader Loader; protected readonly ISpriteSequenceLoader Loader;
@@ -129,6 +129,8 @@ namespace OpenRA.Mods.Common.Graphics
Tick = LoadField(d, "Tick", 40); Tick = LoadField(d, "Tick", 40);
transpose = LoadField(d, "Transpose", false); transpose = LoadField(d, "Transpose", false);
Frames = LoadField<int[]>(d, "Frames", null); Frames = LoadField<int[]>(d, "Frames", null);
useClassicFacingFudge = LoadField(d, "UseClassicFacingFudge", false);
var flipX = LoadField(d, "FlipX", false); var flipX = LoadField(d, "FlipX", false);
var flipY = LoadField(d, "FlipY", false); var flipY = LoadField(d, "FlipY", false);
@@ -139,6 +141,11 @@ namespace OpenRA.Mods.Common.Graphics
Facings = -Facings; Facings = -Facings;
} }
if (useClassicFacingFudge && Facings != 32)
throw new InvalidOperationException(
"{0}: Sequence {1}.{2}: UseClassicFacingFudge is only valid for 32 facings"
.F(info.Nodes[0].Location, sequence, animation));
var offset = LoadField(d, "Offset", float2.Zero); var offset = LoadField(d, "Offset", float2.Zero);
var blendMode = LoadField(d, "BlendMode", BlendMode.Alpha); var blendMode = LoadField(d, "BlendMode", BlendMode.Alpha);
@@ -237,8 +244,7 @@ namespace OpenRA.Mods.Common.Graphics
protected virtual Sprite GetSprite(int start, int frame, int facing) protected virtual Sprite GetSprite(int start, int frame, int facing)
{ {
var f = Util.QuantizeFacing(facing, Facings); var f = Util.QuantizeFacing(facing, Facings, useClassicFacingFudge);
if (reverseFacings) if (reverseFacings)
f = (Facings - f) % Facings; f = (Facings - f) % Facings;

View File

@@ -24,6 +24,9 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Fudge the coordinate system angles like the early games.")] [Desc("Fudge the coordinate system angles like the early games.")]
public readonly bool UseClassicPerspectiveFudge = true; public readonly bool UseClassicPerspectiveFudge = true;
[Desc("Fudge the coordinate system angles like the early games.")]
public readonly bool UseClassicFacingFudge = false;
public WVec LocalToWorld(WVec vec) public WVec LocalToWorld(WVec vec)
{ {
// Rotate by 90 degrees // Rotate by 90 degrees
@@ -50,7 +53,7 @@ namespace OpenRA.Mods.Common.Traits
public int QuantizeFacing(int facing, int facings) public int QuantizeFacing(int facing, int facings)
{ {
return Util.QuantizeFacing(facing, facings) * (256 / facings); return Util.QuantizeFacing(facing, facings, UseClassicFacingFudge) * (256 / facings);
} }
public object Create(ActorInitializer init) { return new BodyOrientation(init, this); } public object Create(ActorInitializer init) { return new BodyOrientation(init, this); }

View File

@@ -48,6 +48,30 @@ namespace OpenRA.Mods.Common
return a / step; return a / step;
} }
public static int QuantizeFacing(int facing, int numFrames, bool useClassicFacingFudge)
{
if (!useClassicFacingFudge || numFrames != 32)
return Util.QuantizeFacing(facing, numFrames);
// TD and RA divided the facing artwork into 3 frames from (north|south) to (north|south)-(east|west)
// and then 5 frames from (north|south)-(east|west) to (east|west)
var quadrant = ((facing + 31) & 0xFF) / 64;
if (quadrant == 0 || quadrant == 2)
{
var frame = Util.QuantizeFacing(facing, 24);
if (frame > 18)
return frame + 6;
if (frame > 4)
return frame + 3;
return frame;
}
else
{
var frame = Util.QuantizeFacing(facing, 40);
return frame < 20 ? frame - 3 : frame - 8;
}
}
public static WPos BetweenCells(World w, CPos from, CPos to) public static WPos BetweenCells(World w, CPos from, CPos to)
{ {
return WPos.Lerp(w.Map.CenterOfCell(from), w.Map.CenterOfCell(to), 1, 2); return WPos.Lerp(w.Map.CenterOfCell(from), w.Map.CenterOfCell(to), 1, 2);