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; }
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 }); } }