diff --git a/OpenRA.FileFormats/Exts.cs b/OpenRA.FileFormats/Exts.cs index c5444c9791..f23ef1b56c 100755 --- a/OpenRA.FileFormats/Exts.cs +++ b/OpenRA.FileFormats/Exts.cs @@ -149,5 +149,10 @@ namespace OpenRA // this is probably a shockingly-slow way to do this, but it's concise. return xs.Except(ys).Concat(ys.Except(xs)); } + + public static IEnumerable Iterate( this T t, Func f ) + { + for(;;) { yield return t; t = f(t); } + } } } diff --git a/OpenRA.Game/Traits/Activities/CancelableActivity.cs b/OpenRA.Game/Traits/Activities/CancelableActivity.cs index 0c394f3cd8..0f6f3ce8f4 100755 --- a/OpenRA.Game/Traits/Activities/CancelableActivity.cs +++ b/OpenRA.Game/Traits/Activities/CancelableActivity.cs @@ -32,10 +32,19 @@ namespace OpenRA.Traits.Activities else NextActivity = activity; } - - public virtual IEnumerable GetTargetQueue( Actor self ) + + public virtual IEnumerable GetTargets( Actor self ) { yield break; } } + + public static class ActivityExts + { + public static IEnumerable GetTargetQueue( this Actor self ) + { + return self.GetCurrentActivity().Iterate( u => u.NextActivity ).TakeWhile( u => u != null ) + .SelectMany( u => u.GetTargets( self ) ); + } + } } diff --git a/OpenRA.Game/Traits/Selectable.cs b/OpenRA.Game/Traits/Selectable.cs index f5387c3427..4c48e327a9 100644 --- a/OpenRA.Game/Traits/Selectable.cs +++ b/OpenRA.Game/Traits/Selectable.cs @@ -237,7 +237,7 @@ namespace OpenRA.Traits if (activity != null && mobile != null) { var alt = new float2(0, -mobile.Altitude); - var targets = activity.GetTargetQueue(self); + var targets = activity.GetTargets(self); var start = self.CenterLocation + alt; var c = Color.Green; diff --git a/OpenRA.Mods.Cnc/Activities/HarvesterDockSequence.cs b/OpenRA.Mods.Cnc/Activities/HarvesterDockSequence.cs index 9b198e34dd..7c4250260a 100644 --- a/OpenRA.Mods.Cnc/Activities/HarvesterDockSequence.cs +++ b/OpenRA.Mods.Cnc/Activities/HarvesterDockSequence.cs @@ -86,7 +86,7 @@ namespace OpenRA.Mods.Cnc return true; } - public override IEnumerable GetTargetQueue( Actor self ) + public override IEnumerable GetTargets( Actor self ) { yield return Target.FromActor(proc); } diff --git a/OpenRA.Mods.RA/Activities/CallFunc.cs b/OpenRA.Mods.RA/Activities/CallFunc.cs index ed73b3ddf0..5b5cc5c05b 100644 --- a/OpenRA.Mods.RA/Activities/CallFunc.cs +++ b/OpenRA.Mods.RA/Activities/CallFunc.cs @@ -41,16 +41,5 @@ namespace OpenRA.Mods.RA.Activities a = null; return true; } - - public override IEnumerable GetTargetQueue( Actor self ) - { - if (NextActivity != null) - foreach (var target in NextActivity.GetTargetQueue(self)) - { - yield return target; - } - - yield break; - } } } diff --git a/OpenRA.Mods.RA/Activities/DeliverOre.cs b/OpenRA.Mods.RA/Activities/DeliverOre.cs index 8ff8ae9248..50d838e1f1 100755 --- a/OpenRA.Mods.RA/Activities/DeliverOre.cs +++ b/OpenRA.Mods.RA/Activities/DeliverOre.cs @@ -54,16 +54,5 @@ namespace OpenRA.Mods.RA.Activities // TODO: allow canceling of deliver orders? return false; } - - public override IEnumerable GetTargetQueue( Actor self ) - { - if (NextActivity != null) - foreach (var target in NextActivity.GetTargetQueue(self)) - { - yield return target; - } - - yield break; - } } } diff --git a/OpenRA.Mods.RA/Activities/Harvest.cs b/OpenRA.Mods.RA/Activities/Harvest.cs index 23aade8ff6..2d72e74418 100755 --- a/OpenRA.Mods.RA/Activities/Harvest.cs +++ b/OpenRA.Mods.RA/Activities/Harvest.cs @@ -76,7 +76,7 @@ namespace OpenRA.Mods.RA.Activities self.QueueActivity(new Harvest()); } - public override IEnumerable GetTargetQueue( Actor self ) + public override IEnumerable GetTargets( Actor self ) { yield return Target.FromPos(self.Location); } diff --git a/OpenRA.Mods.RA/Activities/QueuedActivity.cs b/OpenRA.Mods.RA/Activities/QueuedActivity.cs index fe2e58b375..e81907e2c1 100644 --- a/OpenRA.Mods.RA/Activities/QueuedActivity.cs +++ b/OpenRA.Mods.RA/Activities/QueuedActivity.cs @@ -43,16 +43,5 @@ namespace OpenRA.Mods.RA.Activities activity.Queue(NextActivity); NextActivity = activity; } - - public override IEnumerable GetTargetQueue( Actor self ) - { - if (NextActivity != null) - foreach (var target in NextActivity.GetTargetQueue(self)) - { - yield return target; - } - - yield break; - } } } diff --git a/OpenRA.Mods.RA/Activities/RAHarvesterDockSequence.cs b/OpenRA.Mods.RA/Activities/RAHarvesterDockSequence.cs index 9f1d452ecd..7582faa9f1 100644 --- a/OpenRA.Mods.RA/Activities/RAHarvesterDockSequence.cs +++ b/OpenRA.Mods.RA/Activities/RAHarvesterDockSequence.cs @@ -76,7 +76,7 @@ namespace OpenRA.Mods.RA return true; } - public override IEnumerable GetTargetQueue( Actor self ) + public override IEnumerable GetTargets( Actor self ) { yield return Target.FromActor(proc); } diff --git a/OpenRA.Mods.RA/Air/Fly.cs b/OpenRA.Mods.RA/Air/Fly.cs index 8926d61efe..f598025997 100755 --- a/OpenRA.Mods.RA/Air/Fly.cs +++ b/OpenRA.Mods.RA/Air/Fly.cs @@ -47,7 +47,7 @@ namespace OpenRA.Mods.RA.Air return this; } - public override IEnumerable GetTargetQueue( Actor self ) + public override IEnumerable GetTargets( Actor self ) { yield return Target.FromPos(Pos); } diff --git a/OpenRA.Mods.RA/Air/HeliFly.cs b/OpenRA.Mods.RA/Air/HeliFly.cs index ae263fef49..c8e54f99cb 100755 --- a/OpenRA.Mods.RA/Air/HeliFly.cs +++ b/OpenRA.Mods.RA/Air/HeliFly.cs @@ -50,7 +50,7 @@ namespace OpenRA.Mods.RA.Air return this; } - public override IEnumerable GetTargetQueue( Actor self ) + public override IEnumerable GetTargets( Actor self ) { yield return Target.FromPos(Dest); } diff --git a/OpenRA.Mods.RA/Move/Drag.cs b/OpenRA.Mods.RA/Move/Drag.cs index 3d1cc1552c..71bf4edfc2 100755 --- a/OpenRA.Mods.RA/Move/Drag.cs +++ b/OpenRA.Mods.RA/Move/Drag.cs @@ -47,7 +47,7 @@ namespace OpenRA.Mods.RA.Move return false; } - public override IEnumerable GetTargetQueue( Actor self ) + public override IEnumerable GetTargets( Actor self ) { yield return Target.FromPos(endLocation); } diff --git a/OpenRA.Mods.RA/Move/Move.cs b/OpenRA.Mods.RA/Move/Move.cs index 32dcb92184..14ed6e9b73 100755 --- a/OpenRA.Mods.RA/Move/Move.cs +++ b/OpenRA.Mods.RA/Move/Move.cs @@ -239,7 +239,7 @@ namespace OpenRA.Mods.RA.Move return true; } - public override IEnumerable GetTargetQueue( Actor self ) + public override IEnumerable GetTargets( Actor self ) { if( path != null ) return Enumerable.Reverse(path).Select( c => Target.FromCell(c) ); @@ -315,9 +315,9 @@ namespace OpenRA.Mods.RA.Move protected abstract MovePart OnComplete( Actor self, Mobile mobile, Move parent ); - public override IEnumerable GetTargetQueue( Actor self ) + public override IEnumerable GetTargets( Actor self ) { - return move.GetTargetQueue(self); + return move.GetTargets(self); } }