diff --git a/OpenRA.Game/Traits/AI/ReturnOnIdle.cs b/OpenRA.Game/Traits/AI/ReturnOnIdle.cs index 072c1a09f3..fabd10d54e 100644 --- a/OpenRA.Game/Traits/AI/ReturnOnIdle.cs +++ b/OpenRA.Game/Traits/AI/ReturnOnIdle.cs @@ -20,6 +20,7 @@ using System; using OpenRA.Traits.Activities; +using System.Drawing; namespace OpenRA.Traits.AI { @@ -34,8 +35,17 @@ namespace OpenRA.Traits.AI var altitude = self.traits.Get().Altitude; if (altitude == 0) return; // we're on the ground, let's stay there. - self.QueueActivity(new ReturnToBase(self, null)); - self.QueueActivity(new Rearm()); + var airfield = ReturnToBase.ChooseAirfield(self); + if (airfield != null) + { + self.QueueActivity(new ReturnToBase(self, airfield)); + self.QueueActivity(new Rearm()); + } + else + { + Game.chat.AddLine(Color.White, "Debug", "Plane has nowhere to land; flying away"); + self.QueueActivity(new FlyOffMap()); + } } } } diff --git a/OpenRA.Game/Traits/Activities/FlyAttack.cs b/OpenRA.Game/Traits/Activities/FlyAttack.cs index 4444d7b8d5..0a8fed8f67 100644 --- a/OpenRA.Game/Traits/Activities/FlyAttack.cs +++ b/OpenRA.Game/Traits/Activities/FlyAttack.cs @@ -38,7 +38,7 @@ namespace OpenRA.Traits.Activities return Util.SequenceActivities( new Fly(Target.CenterLocation), - new FlyTimed(50, 20), + new FlyTimed(50), this); } @@ -60,7 +60,7 @@ namespace OpenRA.Traits.Activities return Util.SequenceActivities( new Fly(Util.CenterOfCell(Target)), - new FlyTimed(50, 20), + new FlyTimed(50), this); } diff --git a/OpenRA.Game/Traits/Activities/FlyTimed.cs b/OpenRA.Game/Traits/Activities/FlyTimed.cs index 7458583340..10dca7742f 100644 --- a/OpenRA.Game/Traits/Activities/FlyTimed.cs +++ b/OpenRA.Game/Traits/Activities/FlyTimed.cs @@ -26,12 +26,12 @@ namespace OpenRA.Traits.Activities { public IActivity NextActivity { get; set; } int remainingTicks; - int targetAltitude; - public FlyTimed(int ticks, int targetAltitude) { remainingTicks = ticks; this.targetAltitude = targetAltitude; } + public FlyTimed(int ticks) { remainingTicks = ticks; } public IActivity Tick(Actor self) { + var targetAltitude = self.Info.Traits.Get().CruiseAltitude; if (remainingTicks-- == 0) return NextActivity; FlyUtil.Fly(self, targetAltitude); return this; @@ -43,19 +43,25 @@ namespace OpenRA.Traits.Activities public class FlyOffMap : IActivity { public IActivity NextActivity { get; set; } - readonly int targetAltitude; bool isCanceled; + public bool Interruptible = true; - public FlyOffMap(int targetAltitude) { this.targetAltitude = targetAltitude; } - public IActivity Tick(Actor self) { + var targetAltitude = self.Info.Traits.Get().CruiseAltitude; 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; } + public void Cancel(Actor self) + { + if (Interruptible) + { + isCanceled = true; + NextActivity = null; + } + } } } diff --git a/OpenRA.Game/Traits/Activities/ReturnToBase.cs b/OpenRA.Game/Traits/Activities/ReturnToBase.cs index 6d5befb87e..c1e1e1219c 100644 --- a/OpenRA.Game/Traits/Activities/ReturnToBase.cs +++ b/OpenRA.Game/Traits/Activities/ReturnToBase.cs @@ -34,17 +34,12 @@ namespace OpenRA.Traits.Activities float2 w1, w2, w3; /* tangent points to turn circles */ float2 landPoint; - Actor ChooseAirfield(Actor self) + public static Actor ChooseAirfield(Actor self) { - var airfield = self.World.Queries.OwnedBy[self.Owner] + return self.World.Queries.OwnedBy[self.Owner] .Where(a => a.Info.Name == "afld" && !Reservable.IsReserved(a)) .FirstOrDefault(); - - if (airfield == null) - throw new NotImplementedException("nowhere to land; what to do?"); - - return airfield; } void Calculate(Actor self) diff --git a/OpenRA.Game/Traits/Attack/AttackPlane.cs b/OpenRA.Game/Traits/Attack/AttackPlane.cs index dd91bd4308..775af3774a 100644 --- a/OpenRA.Game/Traits/Attack/AttackPlane.cs +++ b/OpenRA.Game/Traits/Attack/AttackPlane.cs @@ -35,8 +35,6 @@ namespace OpenRA.Traits { target = order.TargetActor; self.QueueActivity(new FlyAttack(order.TargetActor)); - self.QueueActivity(new ReturnToBase(self, null)); - self.QueueActivity(new Rearm()); } } } diff --git a/OpenRA.Game/Traits/Plane.cs b/OpenRA.Game/Traits/Plane.cs index 78cd38cd46..928d20c862 100644 --- a/OpenRA.Game/Traits/Plane.cs +++ b/OpenRA.Game/Traits/Plane.cs @@ -73,8 +73,6 @@ namespace OpenRA.Traits { self.CancelActivity(); self.QueueActivity(new Fly(Util.CenterOfCell(order.TargetLocation))); - self.QueueActivity(new ReturnToBase(self, null)); - self.QueueActivity(new Rearm()); } if (order.OrderString == "Enter") diff --git a/OpenRA.Mods.RA/ParaDrop.cs b/OpenRA.Mods.RA/ParaDrop.cs index a1480a244b..b3455336d8 100644 --- a/OpenRA.Mods.RA/ParaDrop.cs +++ b/OpenRA.Mods.RA/ParaDrop.cs @@ -74,7 +74,7 @@ namespace OpenRA.Mods.RA void FinishedDropping(Actor self) { self.CancelActivity(); - self.QueueActivity(new FlyOffMap(20)); + self.QueueActivity(new FlyOffMap { Interruptible = false }); self.QueueActivity(new RemoveSelf()); } } diff --git a/OpenRA.Mods.RA/SpyPlanePower.cs b/OpenRA.Mods.RA/SpyPlanePower.cs index e73ef62881..cf457f7c4f 100644 --- a/OpenRA.Mods.RA/SpyPlanePower.cs +++ b/OpenRA.Mods.RA/SpyPlanePower.cs @@ -60,7 +60,7 @@ namespace OpenRA.Mods.RA plane.QueueActivity(new CallFunc( () => Owner.Shroud.Explore(Owner.World, order.TargetLocation, (Info as SpyPlanePowerInfo).Range))); - plane.QueueActivity(new FlyOffMap(20)); + plane.QueueActivity(new FlyOffMap { Interruptible = false }); plane.QueueActivity(new RemoveSelf()); } } diff --git a/mods/ra/rules.yaml b/mods/ra/rules.yaml index 189c866a20..89cc91a051 100755 --- a/mods/ra/rules.yaml +++ b/mods/ra/rules.yaml @@ -1149,6 +1149,7 @@ MIG: LimitedAmmo: Ammo: 3 IronCurtainable: + ReturnOnIdle: YAK: Inherits: ^Plane @@ -1177,6 +1178,7 @@ YAK: LimitedAmmo: Ammo: 15 IronCurtainable: + ReturnOnIdle: TRAN: Inherits: ^Plane