diff --git a/OpenRa.Game/Graphics/Animation.cs b/OpenRa.Game/Graphics/Animation.cs
index 6155ef979e..ebda4b49e0 100644
--- a/OpenRa.Game/Graphics/Animation.cs
+++ b/OpenRa.Game/Graphics/Animation.cs
@@ -42,16 +42,10 @@ namespace OpenRa.Game.Graphics
PlayThen( sequenceName, () => PlayRepeating( sequenceName ) );
}
- public void PlayRepeatingPreservingPosition(string sequenceName)
- {
- var f = frame;
- PlayThen(sequenceName, () => PlayRepeating(sequenceName));
- frame = f % CurrentSequence.Length;
- }
-
public void ReplaceAnim(string sequenceName)
{
CurrentSequence = SequenceProvider.GetSequence(name, sequenceName);
+ frame %= CurrentSequence.Length;
}
public void PlayThen( string sequenceName, Action after )
diff --git a/OpenRa.Game/OpenRa.Game.csproj b/OpenRa.Game/OpenRa.Game.csproj
index 417e091eec..859e7a8d31 100644
--- a/OpenRa.Game/OpenRa.Game.csproj
+++ b/OpenRa.Game/OpenRa.Game.csproj
@@ -186,7 +186,6 @@
-
@@ -198,6 +197,7 @@
+
diff --git a/OpenRa.Game/Traits/Activities/Fly.cs b/OpenRa.Game/Traits/Activities/Fly.cs
index 7ff53f9ca1..b2718a88c5 100644
--- a/OpenRa.Game/Traits/Activities/Fly.cs
+++ b/OpenRa.Game/Traits/Activities/Fly.cs
@@ -173,9 +173,6 @@ namespace OpenRa.Game.Traits.Activities
w2 = c2 + f;
w3 = approachStart;
landPoint = landPos;
-
- var rup = self.traits.Get();
- rup.wps = new[] { self.CenterLocation, w1, w2, w3, landPoint, c1, c2 };
}
public IActivity Tick(Actor self)
diff --git a/OpenRa.Game/Traits/RenderUnitPlane.cs b/OpenRa.Game/Traits/RenderUnitPlane.cs
deleted file mode 100644
index 3bc981a584..0000000000
--- a/OpenRa.Game/Traits/RenderUnitPlane.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using OpenRa.Game.Graphics;
-using OpenRa.Game.Traits.Activities;
-
-namespace OpenRa.Game.Traits
-{
- class RenderUnitPlane : RenderUnit
- {
- Animation debug = new Animation("litning");
- public float2[] wps;
-
- public RenderUnitPlane(Actor self)
- : base(self) { debug.PlayRepeating("bright"); debug.Tick(); }
-
- public override IEnumerable> Render(Actor self)
- {
- var unit = self.traits.Get();
-
- yield return Util.CenteredShadow(self, anim.Image, self.CenterLocation);
- var p = self.CenterLocation - new float2(0, unit.Altitude);
- yield return Util.Centered(self, anim.Image, p);
-
- if (wps != null)
- foreach (var w in wps)
- yield return Tuple.New(debug.Image, w - .5f * debug.Image.size, 0);
- }
- }
-}
diff --git a/OpenRa.Game/Traits/RenderUnitRotor.cs b/OpenRa.Game/Traits/RenderUnitRotor.cs
index dee1f255c7..dec9beef10 100755
--- a/OpenRa.Game/Traits/RenderUnitRotor.cs
+++ b/OpenRa.Game/Traits/RenderUnitRotor.cs
@@ -24,20 +24,11 @@ namespace OpenRa.Game.Traits
{
var unit = self.traits.Get();
- yield return Util.CenteredShadow(self, anim.Image, self.CenterLocation);
- yield return Util.CenteredShadow(self, rotorAnim.Image, self.CenterLocation
- + Util.GetTurretPosition(self, unit, self.Info.PrimaryOffset, 0));
- if (self.Info.SecondaryOffset != null)
- yield return Util.CenteredShadow(self, (secondRotorAnim ?? rotorAnim).Image, self.CenterLocation
- + Util.GetTurretPosition(self, unit, self.Info.SecondaryOffset, 0));
-
- var p = self.CenterLocation - new float2( 0, unit.Altitude );
-
- yield return Util.Centered(self, anim.Image, p);
- yield return Util.Centered(self, rotorAnim.Image, p
+ yield return Util.Centered(self, anim.Image, self.CenterLocation);
+ yield return Util.Centered(self, rotorAnim.Image, self.CenterLocation
+ Util.GetTurretPosition( self, unit, self.Info.PrimaryOffset, 0 ) );
if (self.Info.SecondaryOffset != null)
- yield return Util.Centered(self, (secondRotorAnim ?? rotorAnim).Image, p
+ yield return Util.Centered(self, (secondRotorAnim ?? rotorAnim).Image, self.CenterLocation
+ Util.GetTurretPosition( self, unit, self.Info.SecondaryOffset, 0 ) );
}
@@ -55,9 +46,9 @@ namespace OpenRa.Game.Traits
if (isFlying ^ (rotorAnim.CurrentSequence.Name != "rotor"))
return;
- rotorAnim.PlayRepeatingPreservingPosition(isFlying ? "rotor" : "slow-rotor");
+ rotorAnim.ReplaceAnim(isFlying ? "rotor" : "slow-rotor");
if (secondRotorAnim != null)
- secondRotorAnim.PlayRepeatingPreservingPosition(isFlying ? "rotor2" : "slow-rotor2");
+ secondRotorAnim.ReplaceAnim(isFlying ? "rotor2" : "slow-rotor2");
}
}
}
diff --git a/OpenRa.Game/Traits/WithShadow.cs b/OpenRa.Game/Traits/WithShadow.cs
new file mode 100644
index 0000000000..2c61805ded
--- /dev/null
+++ b/OpenRa.Game/Traits/WithShadow.cs
@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using OpenRa.Game.Graphics;
+
+namespace OpenRa.Game.Traits
+{
+ class WithShadow : IRenderModifier
+ {
+ public WithShadow(Actor self) {}
+
+ public IEnumerable> ModifyRender(Actor self, IEnumerable> r)
+ {
+ var unit = self.traits.Get();
+ var shadowSprites = r.Select( a => Tuple.New( a.a, a.b, 8 ));
+ var flyingSprites = r.Select( a => Tuple.New( a.a, a.b - new float2( 0, unit.Altitude ), a.c ));
+ return shadowSprites.Concat(flyingSprites);
+ }
+ }
+}
diff --git a/units.ini b/units.ini
index d5b744341b..66c0779622 100755
--- a/units.ini
+++ b/units.ini
@@ -155,13 +155,13 @@ HIND
[MIG]
Description=Mig Attack Plane
BuiltAt=afld
-Traits=Unit, Plane, RenderUnitPlane
+Traits=Unit, Plane, RenderUnit, WithShadow
InitialFacing=192
LongDesc=Fast Ground-Attack Plane.\n Strong vs Buildings\n Weak vs Infantry, Light Vehicles
[YAK]
Description=Yak Attack Plane
BuiltAt=afld
-Traits=Unit, Plane, RenderUnitPlane
+Traits=Unit, Plane, RenderUnit, WithShadow
InitialFacing=192
LongDesc=Anti-Tanks & Anti-Infantry Plane.\n Strong vs Infantry, Tanks\n Weak vs Buildings
[TRAN]
@@ -169,21 +169,21 @@ Description=Transport Helicopter
PrimaryOffset=0,14,0,-4
SecondaryOffset=0,-14,0,-2
BuiltAt=hpad
-Traits=Unit, Helicopter, RenderUnitRotor
+Traits=Unit, Helicopter, RenderUnitRotor, WithShadow
SecondaryAnim=rotor2
InitialFacing=20
LongDesc=Fast Infantry Transport Helicopter.\n Unarmed
[HELI]
Description=Longbow
BuiltAt=hpad
-Traits=Unit, Helicopter, RenderUnitRotor
+Traits=Unit, Helicopter, RenderUnitRotor, WithShadow
PrimaryOffset=0,0,0,-2
InitialFacing=20
LongDesc=Helicopter Gunship with AG Missiles.\n Strong vs Buildings, Tanks\n Weak vs Infantry
[HIND]
Description=Hind
BuiltAt=hpad
-Traits=Unit, Helicopter, RenderUnitRotor
+Traits=Unit, Helicopter, RenderUnitRotor, WithShadow
InitialFacing=20
LongDesc=Helicopter Gunship with Chainguns.\n Strong vs Infantry, Light Vehicles.\n Weak vs Tanks