示例#1
0
 internal LeafTaskBuilder(LeafTaskDescWrapper task)
     : base(task)
 {
 }
        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
                });
            }
        }