diff --git a/OpenRa.Game/OpenRa.Game.csproj b/OpenRa.Game/OpenRa.Game.csproj index 8d34a4ebf1..0f4e25dde5 100644 --- a/OpenRa.Game/OpenRa.Game.csproj +++ b/OpenRa.Game/OpenRa.Game.csproj @@ -117,6 +117,7 @@ + diff --git a/OpenRa.Game/Traits/Activities/HeliReturn.cs b/OpenRa.Game/Traits/Activities/HeliReturn.cs new file mode 100644 index 0000000000..8da692e3f7 --- /dev/null +++ b/OpenRa.Game/Traits/Activities/HeliReturn.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using OpenRa.Game.GameRules; + +namespace OpenRa.Game.Traits.Activities +{ + class HeliReturn : IActivity + { + public IActivity NextActivity { get; set; } + bool isCanceled; + + static Actor ChooseHelipad(Actor self) + { + return Game.world.Actors.FirstOrDefault( + a => a.Info == Rules.UnitInfo["HPAD"] && + a.Owner == self.Owner && + !Reservable.IsReserved(a)); + } + + public IActivity Tick(Actor self) + { + if (isCanceled) return NextActivity; + var dest = ChooseHelipad(self); + + if (dest == null) + return Util.SequenceActivities( + new Turn(self.Info.InitialFacing), + new HeliLand(true), + NextActivity); + + var res = dest.traits.GetOrDefault(); + if (res != null) + self.traits.Get().reservation = res.Reserve(self); + + var offset = (dest.Info as BuildingInfo).SpawnOffset; + var offsetVec = new float2(offset[0], offset[1]); + + return Util.SequenceActivities( + new HeliFly(dest.CenterLocation + offsetVec), + new Turn(self.Info.InitialFacing), + new HeliLand(false), + new Rearm(), + NextActivity); + } + + public void Cancel(Actor self) { isCanceled = true; NextActivity = null; } + } +} diff --git a/OpenRa.Game/Traits/AttackHeli.cs b/OpenRa.Game/Traits/AttackHeli.cs index f68bd33532..4749edc089 100644 --- a/OpenRa.Game/Traits/AttackHeli.cs +++ b/OpenRa.Game/Traits/AttackHeli.cs @@ -10,7 +10,7 @@ namespace OpenRa.Game.Traits { target = order.TargetActor; self.QueueActivity(new HeliAttack(order.TargetActor)); - // todo: fly home + self.QueueActivity(new HeliReturn()); } } }