diff --git a/OpenRA.Game/Traits/Activities/Fly.cs b/OpenRA.Game/Traits/Activities/Fly.cs index 05d2b61c7e..4eacfb4c81 100644 --- a/OpenRA.Game/Traits/Activities/Fly.cs +++ b/OpenRA.Game/Traits/Activities/Fly.cs @@ -44,21 +44,33 @@ namespace OpenRA.Traits.Activities var unit = self.traits.Get(); + var desiredFacing = Util.GetFacing(d, unit.Facing); + if (unit.Altitude == CruiseAltitude) + Util.TickFacing(ref unit.Facing, desiredFacing, + self.Info.Traits.Get().ROT); + if (unit.Altitude < CruiseAltitude) ++unit.Altitude; - var desiredFacing = Util.GetFacing(d, unit.Facing); - if (unit.Altitude == CruiseAltitude) - Util.TickFacing(ref unit.Facing, desiredFacing, self.Info.Traits.Get().ROT); + FlyUtil.Fly(self, CruiseAltitude); + return this; + } + + public void Cancel(Actor self) { isCanceled = true; NextActivity = null; } + } + + public static class FlyUtil + { + public static void Fly(Actor self, int desiredAltitude ) + { + var unit = self.traits.Get(); var speed = .2f * Util.GetEffectiveSpeed(self); var angle = unit.Facing / 128f * Math.PI; self.CenterLocation += speed * -float2.FromAngle((float)angle); self.Location = ((1 / 24f) * self.CenterLocation).ToInt2(); - return this; + unit.Altitude += Math.Sign(desiredAltitude - unit.Altitude); } - - public void Cancel(Actor self) { isCanceled = true; NextActivity = null; } } } diff --git a/OpenRA.Game/Traits/Activities/FlyTimed.cs b/OpenRA.Game/Traits/Activities/FlyTimed.cs index 5eacbb59ad..7458583340 100644 --- a/OpenRA.Game/Traits/Activities/FlyTimed.cs +++ b/OpenRA.Game/Traits/Activities/FlyTimed.cs @@ -22,7 +22,7 @@ using System; namespace OpenRA.Traits.Activities { - class FlyTimed : IActivity + public class FlyTimed : IActivity { public IActivity NextActivity { get; set; } int remainingTicks; @@ -32,22 +32,30 @@ namespace OpenRA.Traits.Activities public IActivity Tick(Actor self) { - if (remainingTicks == 0) - return NextActivity; - - --remainingTicks; - - var unit = self.traits.Get(); - var speed = .2f * Util.GetEffectiveSpeed(self); - var angle = unit.Facing / 128f * Math.PI; - - self.CenterLocation += speed * -float2.FromAngle((float)angle); - self.Location = ((1 / 24f) * self.CenterLocation).ToInt2(); - - unit.Altitude += Math.Sign(targetAltitude - unit.Altitude); + if (remainingTicks-- == 0) return NextActivity; + FlyUtil.Fly(self, targetAltitude); return this; } public void Cancel(Actor self) { remainingTicks = 0; NextActivity = null; } } + + public class FlyOffMap : IActivity + { + public IActivity NextActivity { get; set; } + readonly int targetAltitude; + bool isCanceled; + + public FlyOffMap(int targetAltitude) { this.targetAltitude = targetAltitude; } + + public IActivity Tick(Actor self) + { + if (isCanceled || !self.World.Map.IsInMap(self.Location)) return NextActivity; + FlyUtil.Fly(self, targetAltitude); + return this; + } + + public void Cancel(Actor self) { isCanceled = true; NextActivity = null; } + } + } diff --git a/OpenRA.Mods.RA/ParaDrop.cs b/OpenRA.Mods.RA/ParaDrop.cs index d3527dc00d..03c933cf39 100644 --- a/OpenRA.Mods.RA/ParaDrop.cs +++ b/OpenRA.Mods.RA/ParaDrop.cs @@ -73,9 +73,8 @@ namespace OpenRA.Mods.RA void FinishedDropping(Actor self) { - // this kindof sucks, actually. self.CancelActivity(); - self.QueueActivity(new Fly(Util.CenterOfCell(self.World.ChooseRandomEdgeCell()))); + self.QueueActivity(new FlyOffMap(20)); self.QueueActivity(new RemoveSelf()); } } diff --git a/OpenRA.Mods.RA/SpyPlanePower.cs b/OpenRA.Mods.RA/SpyPlanePower.cs index 44993f2473..af60553c72 100644 --- a/OpenRA.Mods.RA/SpyPlanePower.cs +++ b/OpenRA.Mods.RA/SpyPlanePower.cs @@ -51,7 +51,6 @@ namespace OpenRA.Mods.RA Game.controller.CancelInputMode(); var enterCell = self.World.ChooseRandomEdgeCell(); - var exitCell = self.World.ChooseRandomEdgeCell(); var plane = self.World.CreateActor("U2", enterCell, self.Owner); plane.CancelActivity(); @@ -59,7 +58,7 @@ namespace OpenRA.Mods.RA plane.QueueActivity(new CallFunc( () => Owner.Shroud.Explore(Owner.World, order.TargetLocation, (Info as SpyPlanePowerInfo).Range))); - plane.QueueActivity(new Fly(Util.CenterOfCell(exitCell))); + plane.QueueActivity(new FlyOffMap(20)); plane.QueueActivity(new RemoveSelf()); } }