// Represents a series of ActionSequences // that are mutually exclusive. Typically // this is designed to represent multiple ActionSequences // that act on the same set of blocks, such as an // "Extend" and "Retract" action for a multi-stage mechanical // construction, or perhaps "Open" and "Close" sequences for a set of // mechanical doors. using System.Collections.Generic; using System.Linq; namespace IngameScript { partial class Program { public class ActionGroup { public string Name { get; private set; } public bool Running { get; private set; } = false; private Dictionary _actions = new Dictionary(); private IConsole _console; public ActionGroup(IConsole console, string name) { // Todo: use a PrefixedConsole here? _console = console; Name = name; } // Add an action to the sequence called actionName, which will be created if it doesn't already exist. public void AddActionBlock(string actionName, int step, IBlockAction actionBlock) { if (!_actions.ContainsKey(actionName)) _actions[actionName] = new ActionSequence(actionName); _actions[actionName].Add(step, actionBlock); } public IEnumerator RunAction(string actionName) { if (Running) { _console.Print($"Ignoring action '{actionName}' on '{Name}'. Already running an action."); yield break; } if (!_actions.ContainsKey(actionName)) { _console.Print($"No action '{actionName}' defined for '{Name}'"); yield break; } Running = true; IEnumerator job = _actions[actionName].Run(); while (job.MoveNext()) yield return true; Running = false; } } } }