From 8a71bf36c34eb130f12085c95776296855afa94b Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Tue, 29 Dec 2009 19:47:08 +1300 Subject: [PATCH] planes return to base after attacking --- OpenRa.Game/Traits/Activities/FlyAttack.cs | 3 ++- OpenRa.Game/Traits/Activities/ReturnToBase.cs | 25 ++++++++++++++++++- OpenRa.Game/Traits/AttackPlane.cs | 4 ++- OpenRa.Game/Traits/Plane.cs | 2 +- OpenRa.Game/Traits/Util.cs | 2 +- 5 files changed, 31 insertions(+), 5 deletions(-) diff --git a/OpenRa.Game/Traits/Activities/FlyAttack.cs b/OpenRa.Game/Traits/Activities/FlyAttack.cs index 0d47d92685..21baf5cba4 100644 --- a/OpenRa.Game/Traits/Activities/FlyAttack.cs +++ b/OpenRa.Game/Traits/Activities/FlyAttack.cs @@ -14,7 +14,8 @@ namespace OpenRa.Game.Traits.Activities public IActivity Tick(Actor self) { - if (Target == null || Target.IsDead) return NextActivity; + if (Target == null || Target.IsDead) + return NextActivity; var limitedAmmo = self.traits.GetOrDefault(); if (limitedAmmo != null && !limitedAmmo.HasAmmo()) diff --git a/OpenRa.Game/Traits/Activities/ReturnToBase.cs b/OpenRa.Game/Traits/Activities/ReturnToBase.cs index ee7af24ef4..991bd37f3f 100644 --- a/OpenRa.Game/Traits/Activities/ReturnToBase.cs +++ b/OpenRa.Game/Traits/Activities/ReturnToBase.cs @@ -7,14 +7,37 @@ namespace OpenRa.Game.Traits.Activities { class ReturnToBase : IActivity { + // todo: defer decision-making until we are first scheduled! public IActivity NextActivity { get; set; } bool isCanceled; readonly float2 w1, w2, w3; /* tangent points to turn circles */ readonly float2 landPoint; - public ReturnToBase(Actor self, float2 landPos) + public ReturnToBase(Actor self) + : this( self, null ) {} + + Actor ChooseAirfield(Actor self) { + // todo: handle reservations + + var airfield = Game.world.Actors + .Where(a => a.Info == Rules.UnitInfo["AFLD"] + && a.Owner == self.Owner) + .FirstOrDefault(); + + if (airfield == null) + throw new NotImplementedException("nowhere to land; what to do?"); + + return airfield; + } + + public ReturnToBase(Actor self, Actor dest) + { + if (dest == null) + dest = ChooseAirfield(self); + + var landPos = dest.CenterLocation; var unit = self.traits.Get(); var speed = .2f * Util.GetEffectiveSpeed(self); var approachStart = landPos - new float2(unit.Altitude * speed, 0); diff --git a/OpenRa.Game/Traits/AttackPlane.cs b/OpenRa.Game/Traits/AttackPlane.cs index 47a51d61b2..0c2d0e0553 100644 --- a/OpenRa.Game/Traits/AttackPlane.cs +++ b/OpenRa.Game/Traits/AttackPlane.cs @@ -31,8 +31,10 @@ namespace OpenRa.Game.Traits protected override void QueueAttack(Actor self, Order order) { - self.QueueActivity(new FlyAttack(order.TargetActor)); + self.CancelActivity(); target = order.TargetActor; + self.QueueActivity(new FlyAttack(order.TargetActor)); + self.QueueActivity(new ReturnToBase(self)); } } } diff --git a/OpenRa.Game/Traits/Plane.cs b/OpenRa.Game/Traits/Plane.cs index 064662ee06..aca90b5998 100644 --- a/OpenRa.Game/Traits/Plane.cs +++ b/OpenRa.Game/Traits/Plane.cs @@ -36,7 +36,7 @@ namespace OpenRa.Game.Traits if (order.OrderString == "Enter") { self.CancelActivity(); - self.QueueActivity(new ReturnToBase(self, order.TargetActor.CenterLocation)); + self.QueueActivity(new ReturnToBase(self, order.TargetActor)); } } diff --git a/OpenRa.Game/Traits/Util.cs b/OpenRa.Game/Traits/Util.cs index b578fa3ff6..fa918b337d 100755 --- a/OpenRa.Game/Traits/Util.cs +++ b/OpenRa.Game/Traits/Util.cs @@ -139,7 +139,7 @@ namespace OpenRa.Game.Traits public static IActivity SequenceActivities(params IActivity[] acts) { - return acts.Reverse().Aggregate((IActivity)null, + return acts.Reverse().Aggregate( (next, a) => { a.NextActivity = next; return a; }); } }