private bool ExecuteAction(IAIAction action, Token token)
 {
     if (action is IAIAction.IConditional conditional)
     {
         return(ExecuteAction(action, conditional, token));
     }
     else if (action.Execute(token))
     {
         if (cancelableAction != null && cancelableAction != action)
         {
             cancelableAction.Cancel(new IAIAction.ICancelable.Token(Source));
             cancelableAction = null;
         }
         if (action is IAIAction.ICancelable cancelAction)
         {
             cancelableAction = cancelAction;
         }
         if (currentAIAction != action && action is IAIAction.IStartable startableAction)
         {
             startableAction.Start(new IAIAction.IStartable.Token(Source));
         }
         currentAIAction = action;
         return(true);
     }
     else if (cancelableAction == action)
     {
         cancelableAction.Cancel(new IAIAction.ICancelable.Token(Source));
         cancelableAction = null;
     }
     return(false);
 }
 public void CancelAction()
 {
     if (cancelableAction == null)
     {
         return;
     }
     cancelableAction.Cancel(new IAIAction.ICancelable.Token(Source));
     cancelableAction = null;
     currentAIAction  = null;
 }
        public bool Execute()
        {
            Token token = new Token(Source);

            foreach (IAIAction action in Actions)
            {
                if (ExecuteAction(action, token))
                {
                    return(true);
                }
            }
            if (cancelableAction != null)
            {
                cancelableAction.Cancel(new IAIAction.ICancelable.Token(Source));
                cancelableAction = null;
            }
            currentAIAction = null;
            return(false);
        }
 public void RemoveAction(IAIAction action)
 {
     if (cancelableAction == action)
     {
         cancelableAction.Cancel(new IAIAction.ICancelable.Token(Source));
         cancelableAction = null;
     }
     if (action is IAIAction.IReinitialize reinitializeAction)
     {
         reinitializeActions.Remove(reinitializeAction);
     }
     if (action is IAIAction.IStartable startableAction)
     {
         startableActions.Remove(startableAction);
     }
     if (action is IAIAction.IRemove removeAction)
     {
         removeAction.Remove();
     }
     actions.Remove(action);
 }