Esempio n. 1
0
        public IEnumerable <AIResult> Selector(AIExecutionContext context)
        {
            bool succeedOut = false;

            foreach (var child in context.children)
            {
                foreach (var result in child.Call(context))
                {
                    if (result == AIResult.Running)
                    {
                        yield return(AIResult.Running);
                    }
                    else if (result == AIResult.Success)
                    {
                        succeedOut = true;
                    }
                    else if (result == AIResult.Failure)
                    {
                        continue;
                    }

                    if (succeedOut)
                    {
                        break;
                    }
                }

                if (succeedOut)
                {
                    break;
                }
            }

            yield return(succeedOut ? AIResult.Success : AIResult.Failure);
        }
Esempio n. 2
0
 public IEnumerable <AIResult> PrintMemoryCell(AIExecutionContext context, object cell)
 {
     Debug.Log($"Printing Cell: {cell?.ToString()}");
     if (cell != null)
     {
         yield return(AIResult.Success);
     }
     else
     {
         yield return(AIResult.Failure);
     }
 }
Esempio n. 3
0
        public IEnumerable <AIResult> Running(AIExecutionContext context, int frameCount, float timeCount)
        {
            var children   = context.children;
            var log        = context.log;
            var memoryMap  = context.memoryMap;
            var gameObject = context.gameObject;

            float startTime = Time.time;

            for (int i = 0; i < frameCount; i++)
            {
                yield return(AIResult.Running);
            }

            while (Time.time <= startTime + timeCount)
            {
                yield return(AIResult.Running);
            }

            if (children.Length > 0)
            {
                var firstChild = children[0];
                if (firstChild != null)
                {
                    bool breakChildLoop = false;

                    foreach (var result in firstChild.Call(context))
                    {
                        switch (result)
                        {
                        case AIResult.Success:
                        case AIResult.Failure:
                            yield return(result);

                            breakChildLoop = true;
                            break;

                        case AIResult.Running:
                            yield return(AIResult.Running);

                            break;
                        }
                        if (breakChildLoop)
                        {
                            break;
                        }
                    }
                }
            }
        }
Esempio n. 4
0
 public IEnumerable <AIResult> Succeed(AIExecutionContext context)
 {
     foreach (var child in context.children)
     {
         foreach (var result in child.Call(context))
         {
             if (result == AIResult.Running)
             {
                 yield return(result);
             }
         }
     }
     yield return(AIResult.Success);
 }
Esempio n. 5
0
        public IEnumerable <AIResult> Loop(AIExecutionContext context, int count)
        {
            var children   = context.children;
            var log        = context.log;
            var memoryMap  = context.memoryMap;
            var gameObject = context.gameObject;

            bool failBreak = false;

            for (int i = 0; i < count; i++)
            {
                foreach (var child in children)
                {
                    foreach (var result in child.Call(context))
                    {
                        switch (result)
                        {
                        case AIResult.Success:
                            continue;

                        case AIResult.Failure:
                            failBreak = true;
                            break;

                        case AIResult.Running:
                            yield return(AIResult.Running);

                            break;
                        }
                        if (failBreak)
                        {
                            break;
                        }
                    }
                    if (failBreak)
                    {
                        break;
                    }
                }
                if (failBreak)
                {
                    break;
                }
            }

            yield return(failBreak ? AIResult.Failure : AIResult.Success);
        }
Esempio n. 6
0
        public IEnumerable <AIResult> Call(AIExecutionContext context)
        {
            context = new AIExecutionContext(context.gameObject, context.log, children, context.memoryMap);
            context.log.AppenTreeNode(guid);
            var itterator = methodBinding.Bind <AIResult>(context.gameObject, context.memoryMap, context.log, ("context", context));

            foreach (var value in itterator)
            {
                if (value == AIResult.Success || value == AIResult.Failure)
                {
                    yield return(value);

                    break;
                }
                else if (value == AIResult.Running)
                {
                    yield return(AIResult.Running);
                }
            }
        }
Esempio n. 7
0
        private IEnumerable <AIResult> ProcessIfThenChild(AITreeNode node, AIExecutionContext context)
        {
            if (node == null)
            {
                yield return(AIResult.Failure);
            }

            bool breakLoop = false;

            foreach (var result in node.Call(context))
            {
                switch (result)
                {
                case AIResult.Success:
                    yield return(AIResult.Success);

                    breakLoop = true;
                    break;

                case AIResult.Failure:
                    yield return(AIResult.Failure);

                    breakLoop = true;
                    break;

                case AIResult.Running:
                    yield return(AIResult.Running);

                    break;
                }

                if (breakLoop)
                {
                    break;
                }
            }
        }
Esempio n. 8
0
        public IEnumerable <AIResult> IfElse(AIExecutionContext context)
        {
            GameObject gameObject = context.gameObject;

            AITreeNode[]   children = context.children;
            AIExecutionLog log      = context.log;
            IReadOnlyDictionary <object, object> memoryMap = context.memoryMap;

            AITreeNode ifChild = null, thenChild = null, elseChild = null;

            if (children.Length >= 1)
            {
                ifChild = children[0];
            }
            if (children.Length >= 2)
            {
                thenChild = children[1];
            }
            if (children.Length >= 3)
            {
                elseChild = children[2];
            }

            bool?success = false;

            if (ifChild != null)
            {
                bool breakIfElseLoop = false;
                foreach (var result in ifChild.Call(context))
                {
                    switch (result)
                    {
                    case AIResult.Success:
                        success         = true;
                        breakIfElseLoop = true;
                        break;

                    case AIResult.Failure:
                        success         = false;
                        breakIfElseLoop = true;
                        break;

                    case AIResult.Running:
                        break;
                    }

                    if (breakIfElseLoop)
                    {
                        break;
                    }
                }
            }

            if (success == null)
            {
                yield return(AIResult.Failure);
            }
            else
            {
                foreach (var result in ProcessIfThenChild(success.Value ? thenChild : elseChild, context))
                {
                    // Process if then child method will ensure appropriate returns
                    yield return(result);
                }
            }
        }
Esempio n. 9
0
 public IEnumerable <AIResult> Call(AIExecutionContext context, AITreeAsset asset, params (string argName, object argValue)[] arguments)
Esempio n. 10
0
 public IEnumerable <AIResult> Failure(AIExecutionContext context)
 {
     Debug.Log("Failure");
     yield return(AIResult.Failure);
 }