diff --git a/OpenRA.Mods.RA/Activities/QueuedActivity.cs b/OpenRA.Mods.RA/Activities/QueuedActivity.cs new file mode 100644 index 0000000000..37cef3dc9a --- /dev/null +++ b/OpenRA.Mods.RA/Activities/QueuedActivity.cs @@ -0,0 +1,82 @@ +#region Copyright & License Information +/* + * Copyright 2007-2010 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation. For more information, + * see LICENSE. + */ +#endregion + +using System; +using System.Collections.Generic; +using OpenRA.Traits; + +namespace OpenRA.Mods.RA.Activities +{ + public class QueuedActivity : IActivity + { + public QueuedActivity(Action a) { this.a = a; } + public QueuedActivity(bool runChildOnFirstTick, Action a) : this(a, true, runChildOnFirstTick) { } + + public QueuedActivity(Action a, bool interruptable, bool runChildOnFirstTick) + { + this.a = a; + this.interruptable = interruptable; + runChildOnFirstTick = runChildOnFirstTick; + } + + Action a; + private bool interruptable = true; + private bool runChild = false; + public IActivity NextActivity { get; set; } + + public IActivity Tick(Actor self) { return Run(self); } + + public IActivity Run(Actor self) + { + if (a != null) + a(this); + if (runChild && NextActivity != null) + return NextActivity.Tick(self); + + return NextActivity; + } + + public void Insert(IActivity activity) + { + if (activity == null) + return; + activity.Queue(NextActivity); + NextActivity = activity; + } + + public void Cancel(Actor self) + { + if (!interruptable) + return; + + a = null; + NextActivity = null; + } + + public void Queue( IActivity activity ) + { + if( NextActivity != null ) + NextActivity.Queue( activity ); + else + NextActivity = activity; + } + + public IEnumerable GetCurrentPath() + { + if (NextActivity != null) + foreach (var path in NextActivity.GetCurrentPath()) + { + yield return path; + } + + yield break; + } + } +} diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj index 3354aa0606..10a4e47150 100644 --- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj +++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj @@ -55,6 +55,7 @@ +