diff --git a/OpenRA.Game/Traits/Activities/Drag.cs b/OpenRA.Game/Traits/Activities/Drag.cs index 62824bed87..6c7f6e0265 100644 --- a/OpenRA.Game/Traits/Activities/Drag.cs +++ b/OpenRA.Game/Traits/Activities/Drag.cs @@ -8,7 +8,7 @@ */ #endregion -using OpenRA.Traits; +using System.Collections.Generic; namespace OpenRA.Traits.Activities { @@ -48,5 +48,10 @@ namespace OpenRA.Traits.Activities else NextActivity = activity; } + + public IEnumerable GetCurrentPath() + { + yield return endLocation; + } } } diff --git a/OpenRA.Game/Traits/Activities/Idle.cs b/OpenRA.Game/Traits/Activities/Idle.cs index 362150cdc5..02b93ea256 100644 --- a/OpenRA.Game/Traits/Activities/Idle.cs +++ b/OpenRA.Game/Traits/Activities/Idle.cs @@ -10,19 +10,8 @@ namespace OpenRA.Traits.Activities { - class Idle : IActivity + class Idle : CancelableActivity { - IActivity NextActivity { get; set; } - - public IActivity Tick(Actor self) { return NextActivity; } - public void Cancel(Actor self) {} - - public void Queue( IActivity activity ) - { - if( NextActivity != null ) - NextActivity.Queue( activity ); - else - NextActivity = activity; - } + public override IActivity Tick(Actor self) { return NextActivity; } } } diff --git a/OpenRA.Game/Traits/Activities/Move.cs b/OpenRA.Game/Traits/Activities/Move.cs index 1c44e4fc39..094d5342b1 100755 --- a/OpenRA.Game/Traits/Activities/Move.cs +++ b/OpenRA.Game/Traits/Activities/Move.cs @@ -247,9 +247,17 @@ namespace OpenRA.Traits.Activities return nextCell; } - protected override void OnCancel() + protected override bool OnCancel() { path = new List(); + return true; + } + + public override IEnumerable GetCurrentPath() + { + if( path == null ) + return new float2[ 0 ]; + return Enumerable.Reverse(path).Select( c => Util.CenterOfCell(c) ); } abstract class MovePart : IActivity @@ -312,6 +320,11 @@ namespace OpenRA.Traits.Activities } protected abstract MovePart OnComplete( Actor self, Mobile mobile, Move parent ); + + public IEnumerable GetCurrentPath() + { + return move.GetCurrentPath(); + } } class MoveFirstHalf : MovePart diff --git a/OpenRA.Game/Traits/Activities/Sell.cs b/OpenRA.Game/Traits/Activities/Sell.cs index c4491905d0..860f43cafd 100644 --- a/OpenRA.Game/Traits/Activities/Sell.cs +++ b/OpenRA.Game/Traits/Activities/Sell.cs @@ -8,6 +8,8 @@ */ #endregion +using System.Collections.Generic; + namespace OpenRA.Traits.Activities { class Sell : IActivity @@ -63,5 +65,10 @@ namespace OpenRA.Traits.Activities else NextActivity = activity; } + + public IEnumerable GetCurrentPath() + { + yield break; + } } } diff --git a/OpenRA.Game/Traits/Mobile.cs b/OpenRA.Game/Traits/Mobile.cs index 3df6876ed4..8f7c7b3c69 100644 --- a/OpenRA.Game/Traits/Mobile.cs +++ b/OpenRA.Game/Traits/Mobile.cs @@ -321,14 +321,6 @@ namespace OpenRA.Traits return Info.Speed * Info.TerrainSpeeds[type].Speed * modifier / 100f; } - public IEnumerable GetCurrentPath(Actor self) - { - var move = self.GetCurrentActivity() as Move; - if (move == null || move.path == null) return new float2[] { }; - - return Enumerable.Reverse(move.path).Select( c => Util.CenterOfCell(c) ); - } - public void AddInfluence() { uim.Add( self, this ); diff --git a/OpenRA.Game/Traits/Selectable.cs b/OpenRA.Game/Traits/Selectable.cs index 0b4769a3f6..96d3bc216a 100644 --- a/OpenRA.Game/Traits/Selectable.cs +++ b/OpenRA.Game/Traits/Selectable.cs @@ -164,7 +164,7 @@ namespace OpenRA.Traits if (mobile != null) { var alt = new float2(0, -mobile.Altitude); - var path = mobile.GetCurrentPath(self); + var path = self.GetCurrentActivity().GetCurrentPath(); var start = self.CenterLocation + alt; var c = Color.Green; diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index 445e40f870..f5e834bbbd 100644 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -113,7 +113,6 @@ namespace OpenRA.Traits public interface IMove : ITeleportable { float MovementSpeedForCell(Actor self, int2 cell); - IEnumerable GetCurrentPath(Actor self); int Altitude { get; set; } } @@ -173,6 +172,7 @@ namespace OpenRA.Traits IActivity Tick(Actor self); void Cancel(Actor self); void Queue(IActivity activity); + IEnumerable GetCurrentPath(); } public abstract class CancelableActivity : IActivity @@ -181,13 +181,15 @@ namespace OpenRA.Traits protected bool IsCanceled { get; private set; } public abstract IActivity Tick( Actor self ); - protected virtual void OnCancel() {} + protected virtual bool OnCancel() { return true; } public void Cancel( Actor self ) { - IsCanceled = true; - NextActivity = null; - OnCancel(); + IsCanceled = OnCancel(); + if( IsCanceled ) + NextActivity = null; + else + NextActivity.Cancel( self ); } public void Queue( IActivity activity ) @@ -197,6 +199,11 @@ namespace OpenRA.Traits else NextActivity = activity; } + + public virtual IEnumerable GetCurrentPath() + { + yield break; + } } public interface IRenderOverlay { void Render(); } diff --git a/OpenRA.Mods.RA/Activities/CallFunc.cs b/OpenRA.Mods.RA/Activities/CallFunc.cs index 092d0a5af4..caea771b16 100644 --- a/OpenRA.Mods.RA/Activities/CallFunc.cs +++ b/OpenRA.Mods.RA/Activities/CallFunc.cs @@ -9,6 +9,7 @@ #endregion using System; +using System.Collections.Generic; using OpenRA.Traits; namespace OpenRA.Mods.RA.Activities @@ -48,5 +49,10 @@ namespace OpenRA.Mods.RA.Activities else NextActivity = activity; } + + public IEnumerable GetCurrentPath() + { + yield break; + } } } diff --git a/OpenRA.Mods.RA/Activities/DeliverOre.cs b/OpenRA.Mods.RA/Activities/DeliverOre.cs index c6202faba0..f6ee49d942 100755 --- a/OpenRA.Mods.RA/Activities/DeliverOre.cs +++ b/OpenRA.Mods.RA/Activities/DeliverOre.cs @@ -8,6 +8,7 @@ */ #endregion +using System.Collections.Generic; using OpenRA.Traits; using OpenRA.Traits.Activities; @@ -60,5 +61,10 @@ namespace OpenRA.Mods.RA.Activities else NextActivity = activity; } + + public IEnumerable GetCurrentPath() + { + yield break; + } } } diff --git a/OpenRA.Mods.RA/Activities/Fly.cs b/OpenRA.Mods.RA/Activities/Fly.cs index 7810e01c3d..3f9c23d473 100644 --- a/OpenRA.Mods.RA/Activities/Fly.cs +++ b/OpenRA.Mods.RA/Activities/Fly.cs @@ -9,7 +9,7 @@ #endregion using System; -using System.Linq; +using System.Collections.Generic; using OpenRA.Traits; namespace OpenRA.Mods.RA.Activities @@ -43,6 +43,11 @@ namespace OpenRA.Mods.RA.Activities FlyUtil.Fly(self, cruiseAltitude); return this; } + + public override IEnumerable GetCurrentPath() + { + yield return Pos; + } } public static class FlyUtil diff --git a/OpenRA.Mods.RA/Activities/FlyTimed.cs b/OpenRA.Mods.RA/Activities/FlyTimed.cs index 48ead5d901..035382b2e1 100644 --- a/OpenRA.Mods.RA/Activities/FlyTimed.cs +++ b/OpenRA.Mods.RA/Activities/FlyTimed.cs @@ -28,35 +28,21 @@ namespace OpenRA.Mods.RA.Activities } } - public class FlyOffMap : IActivity + public class FlyOffMap : CancelableActivity { - IActivity NextActivity { get; set; } - bool isCanceled; public bool Interruptible = true; - public IActivity Tick(Actor self) + public override IActivity Tick(Actor self) { var targetAltitude = self.Info.Traits.Get().CruiseAltitude; - if (isCanceled || !self.World.Map.IsInMap(self.Location)) return NextActivity; + if (IsCanceled || !self.World.Map.IsInMap(self.Location)) return NextActivity; FlyUtil.Fly(self, targetAltitude); return this; } - public void Cancel(Actor self) + protected override bool OnCancel() { - if (Interruptible) - { - isCanceled = true; - NextActivity = null; - } - } - - public void Queue( IActivity activity ) - { - if( NextActivity != null ) - NextActivity.Queue( activity ); - else - NextActivity = activity; + return Interruptible; } } } diff --git a/OpenRA.Mods.RA/Activities/Harvest.cs b/OpenRA.Mods.RA/Activities/Harvest.cs index 2a7bfe4e0f..c772372d61 100755 --- a/OpenRA.Mods.RA/Activities/Harvest.cs +++ b/OpenRA.Mods.RA/Activities/Harvest.cs @@ -15,14 +15,14 @@ using OpenRA.Traits.Activities; namespace OpenRA.Mods.RA.Activities { - public class Harvest : IActivity + public class Harvest : CancelableActivity { - IActivity NextActivity { get; set; } bool isHarvesting = false; - public IActivity Tick( Actor self ) + public override IActivity Tick( Actor self ) { if( isHarvesting ) return this; + if( IsCanceled ) return NextActivity; if( NextActivity != null ) return NextActivity; var harv = self.Trait(); @@ -72,15 +72,5 @@ namespace OpenRA.Mods.RA.Activities })); self.QueueActivity(new Harvest()); } - - public void Cancel(Actor self) { } - - public void Queue( IActivity activity ) - { - if( NextActivity != null ) - NextActivity.Queue( activity ); - else - NextActivity = activity; - } } } diff --git a/OpenRA.Mods.RA/Activities/HeliFly.cs b/OpenRA.Mods.RA/Activities/HeliFly.cs index 5bfcb68fec..9a49bf2434 100644 --- a/OpenRA.Mods.RA/Activities/HeliFly.cs +++ b/OpenRA.Mods.RA/Activities/HeliFly.cs @@ -9,7 +9,7 @@ #endregion using System; -using System.Linq; +using System.Collections.Generic; using OpenRA.Traits; namespace OpenRA.Mods.RA.Activities @@ -53,5 +53,10 @@ namespace OpenRA.Mods.RA.Activities return this; } + + public override IEnumerable GetCurrentPath() + { + yield return Dest; + } } } diff --git a/OpenRA.Mods.RA/Activities/IdleAnimation.cs b/OpenRA.Mods.RA/Activities/IdleAnimation.cs index 23738512a0..95d4b42722 100644 --- a/OpenRA.Mods.RA/Activities/IdleAnimation.cs +++ b/OpenRA.Mods.RA/Activities/IdleAnimation.cs @@ -6,11 +6,11 @@ * as published by the Free Software Foundation. For more information, * see LICENSE. */ -#endregion - -using System; +#endregion + +using System.Collections.Generic; +using OpenRA.Mods.RA.Render; using OpenRA.Traits; -using OpenRA.Mods.RA.Render; namespace OpenRA.Mods.RA.Activities { @@ -51,5 +51,10 @@ namespace OpenRA.Mods.RA.Activities else NextActivity = activity; } + + public IEnumerable GetCurrentPath() + { + yield break; + } } } diff --git a/OpenRA.Mods.RA/Activities/Leap.cs b/OpenRA.Mods.RA/Activities/Leap.cs index 55797661e9..06d6bf68f4 100644 --- a/OpenRA.Mods.RA/Activities/Leap.cs +++ b/OpenRA.Mods.RA/Activities/Leap.cs @@ -33,9 +33,11 @@ namespace OpenRA.Mods.RA.Activities public override IActivity Tick(Actor self) { - if (IsCanceled) return NextActivity; + if( t == 0 && IsCanceled ) return NextActivity; if (!target.IsValid) return NextActivity; + self.Trait().IsLeaping = true; + t += (1f / delay); self.CenterLocation = float2.Lerp(initialLocation, target.CenterLocation, t); @@ -47,6 +49,7 @@ namespace OpenRA.Mods.RA.Activities if (target.IsActor) target.Actor.Kill(self); + self.Trait().IsLeaping = false; return NextActivity; } diff --git a/OpenRA.Mods.RA/Activities/Wait.cs b/OpenRA.Mods.RA/Activities/Wait.cs index 23cf985e15..678b595e88 100644 --- a/OpenRA.Mods.RA/Activities/Wait.cs +++ b/OpenRA.Mods.RA/Activities/Wait.cs @@ -12,11 +12,10 @@ using OpenRA.Traits; namespace OpenRA.Mods.RA.Activities { - public class Wait : IActivity + public class Wait : CancelableActivity { int remainingTicks; bool interruptable = true; - IActivity NextActivity { get; set; } public Wait(int period) { remainingTicks = period; } public Wait(int period, bool interruptable) @@ -25,27 +24,17 @@ namespace OpenRA.Mods.RA.Activities this.interruptable = interruptable; } - public virtual IActivity Tick(Actor self) + public override IActivity Tick(Actor self) { if (remainingTicks-- == 0) return NextActivity; return this; } - public void Cancel(Actor self) + protected override bool OnCancel() { - if (!interruptable) - return; - + if( !interruptable ) return false; remainingTicks = 0; - NextActivity = null; - } - - public void Queue( IActivity activity ) - { - if( NextActivity != null ) - NextActivity.Queue( activity ); - else - NextActivity = activity; + return true; } } } diff --git a/OpenRA.Mods.RA/Aircraft.cs b/OpenRA.Mods.RA/Aircraft.cs index 2de181476f..9247451d25 100755 --- a/OpenRA.Mods.RA/Aircraft.cs +++ b/OpenRA.Mods.RA/Aircraft.cs @@ -70,14 +70,6 @@ namespace OpenRA.Mods.RA || Info.RepairBuildings.Contains( a.Info.Name ); } - public virtual IEnumerable GetCurrentPath(Actor self) - { - var move = self.GetCurrentActivity() as Activities.Fly; - if (move == null) return new float2[] { }; - - return new float2[] { move.Pos }; - } - public bool CanEnterCell(int2 location) { return true; } public float MovementSpeedForCell(Actor self, int2 cell) diff --git a/OpenRA.Mods.RA/AttackLeap.cs b/OpenRA.Mods.RA/AttackLeap.cs index 9639b68135..9d56fb3d67 100644 --- a/OpenRA.Mods.RA/AttackLeap.cs +++ b/OpenRA.Mods.RA/AttackLeap.cs @@ -19,6 +19,8 @@ namespace OpenRA.Mods.RA class AttackLeap : AttackBase { + internal bool IsLeaping; + public AttackLeap(Actor self) : base(self) {} @@ -27,7 +29,7 @@ namespace OpenRA.Mods.RA base.Tick(self); if (!target.IsValid) return; - if (self.GetCurrentActivity() is Leap) return; + if (IsLeaping) return; var weapon = self.Trait().Weapons[0].Info; if (weapon.Range * Game.CellSize * weapon.Range * Game.CellSize diff --git a/OpenRA.Mods.RA/Helicopter.cs b/OpenRA.Mods.RA/Helicopter.cs index 18dfff345a..4a8da63cdd 100644 --- a/OpenRA.Mods.RA/Helicopter.cs +++ b/OpenRA.Mods.RA/Helicopter.cs @@ -171,13 +171,5 @@ namespace OpenRA.Mods.RA return float2.FromAngle((float)self.World.SharedRandom.NextDouble() * 3.14f); return (5 / d.LengthSquared) * d; } - - public override IEnumerable GetCurrentPath(Actor self) - { - var move = self.GetCurrentActivity() as Activities.HeliFly; - if (move == null) return new float2[] { }; - - return new float2[] { move.Dest }; - } } }