Ejemplo n.º 1
0
        public void Deserialize()
        {
            if (Domain != null)
            {
                return;
            }

            var repo    = new EditorRepository();
            var handler = new BehaviorTreeCommandHandler();
            var domain  = new EditorDomain(repo, handler);

            domain.OnEventApplied += Domain_OnEventApplied;

            var treeId = BehaviorTreeState.GetId();
            var tree   = new BehaviorTreeState(domain, treeId);

            tree.Asset          = this;
            repo.States[treeId] = tree;

            if (bytes != null && bytes.Length > 0)
            {
                var treeDesc = BehaviorTreeSerializer.DeserializeDesc(bytes);
                tree.Title      = treeDesc.Title;
                tree.Comment    = treeDesc.Comment;
                tree.RootTaskId = treeDesc.RootTaskId;

                if (treeDesc.Tasks != null && treeDesc.Tasks.Length > 0)
                {
                    tree.NextTaskId = treeDesc.Tasks.Max(t => t.Id) + 1;

                    foreach (var taskDesc in treeDesc.Tasks)
                    {
                        var taskId = TaskState.GetId(taskDesc.Id);
                        var task   = new TaskState(domain, taskId);
                        if (taskDesc.Id != treeDesc.RootTaskId)
                        {
                            task.ParentTaskId = EditorHelper.FindParentTask(treeDesc.Tasks, taskDesc.Id).Id;
                        }
                        task.Desc            = taskDesc;
                        repo.States[task.Id] = task;
                    }
                }
            }

            Domain = domain;
            Tree   = tree;
        }
Ejemplo n.º 2
0
        private void OnTaskCreatedEvent(TaskCreatedEvent e)
        {
            Repository.States[e.NewTask.Id] = e.NewTask;

            if (Desc is DecoratorTaskDescWrapper)
            {
                var desc = (DecoratorTaskDescWrapper)Desc;
                desc.ChildTaskId = e.NewTask.Desc.Id;
            }
            else if (Desc is CompositeTaskDescWrapper)
            {
                var desc = (CompositeTaskDescWrapper)Desc;
                desc.ChildTaskIds.Add(e.NewTask.Desc.Id);
            }

            var tree = (BehaviorTreeState)Repository.States[BehaviorTreeState.GetId()];

            tree.NextTaskId = Math.Max(tree.NextTaskId, e.NewTask.Desc.Id) + 1;
            NodeLayoutHelper.Calculate(tree);
        }
        private void OnCreateTaskCommand(CreateTaskCommand command)
        {
            var parent       = Repository.States[command.Id];
            var parentTaskId = 0u;

            if (parent is BehaviorTreeState)
            {
                var tree = (BehaviorTreeState)parent;
                if (tree.RootTaskId > 0)
                {
                    parent.ApplyEvent(new TaskNotCreatedEvent(command.Id)
                    {
                        Reason = "Behavior tree already has root task"
                    });
                    return;
                }
            }
            else if (parent is TaskState)
            {
                var task = (TaskState)parent;
                if (task.Desc is LeafTaskDescWrapper)
                {
                    parent.ApplyEvent(new TaskNotCreatedEvent(command.Id)
                    {
                        Reason = "Leaf task cannot have child task"
                    });
                    return;
                }
                else if (task.Desc is DecoratorTaskDescWrapper)
                {
                    var desc = (DecoratorTaskDescWrapper)task.Desc;
                    if (desc.ChildTaskId != 0)
                    {
                        parent.ApplyEvent(new TaskNotCreatedEvent(command.Id)
                        {
                            Reason = "Decorator task can only has one child task"
                        });
                        return;
                    }
                }

                parentTaskId = task.Desc.Id;
            }
            else
            {
                throw new NotSupportedException(command.Id);
            }

            {
                var             tree = (BehaviorTreeState)Repository.States[BehaviorTreeState.GetId()];
                TaskDescWrapper taskDescWrapper;
                if (typeof(ILeafTaskDesc).IsAssignableFrom(command.TaskType))
                {
                    taskDescWrapper = new LeafTaskDescWrapper();
                }
                else if (typeof(IDecoratorTaskDesc).IsAssignableFrom(command.TaskType))
                {
                    taskDescWrapper = new DecoratorTaskDescWrapper();
                }
                else if (typeof(ICompositeTaskDesc).IsAssignableFrom(command.TaskType))
                {
                    taskDescWrapper = new CompositeTaskDescWrapper();
                }
                else
                {
                    throw new NotSupportedException(command.TaskType.ToString());
                }
                taskDescWrapper.Id         = tree.NextTaskId;
                taskDescWrapper.CustomDesc = (ITaskDesc)Activator.CreateInstance(command.TaskType);
                var taskState = new TaskState(Domain, TaskState.GetId(tree.NextTaskId));
                taskState.ParentTaskId = parentTaskId;
                taskState.Desc         = taskDescWrapper;

                parent.ApplyEvent(new TaskCreatedEvent(command.Id)
                {
                    NewTask = taskState
                });
            }
        }