__init__.py (2316B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\behaviors\composites\__init__.py 2 from behaviors import status 3 from behaviors.tasks import Task 4 from ccpProfile import TimedFunction 5 6 class Composite(Task): 7 8 def __init__(self, attributes = None): 9 super(Composite, self).__init__(attributes) 10 self._subTasks = [] 11 12 @TimedFunction('behaviors::composites::Composite::OnEnter') 13 def OnEnter(self): 14 if not self._subTasks: 15 raise NoSubTasksError() 16 self.SetStatusToSuspended() 17 self.behaviorTree.StartTask(self.GetInitialTask()) 18 19 def GetInitialTask(self): 20 return self._subTasks[0] 21 22 def AddSubTask(self, task): 23 task.SetExitObserver(self.OnSubTaskCompleted) 24 self._subTasks.append(task) 25 return self 26 27 @TimedFunction('behaviors::composites::Composite::OnSubTaskCompleted') 28 def OnSubTaskCompleted(self, task): 29 self.DoSubTaskCompleted(task) 30 self.status.OnUpdated(self) 31 32 def DoSubTaskCompleted(self, task): 33 raise NotImplementedError 34 35 def IsLastSubTask(self, task): 36 return task is self._subTasks[-1] 37 38 def GetNextSubTask(self, task): 39 return self._subTasks[self._subTasks.index(task) + 1] 40 41 def CleanUp(self): 42 for subTask in self._subTasks: 43 if subTask.status is not status.TaskInvalidStatus: 44 subTask.CleanUp() 45 46 self.SetStatusToInvalid() 47 48 def GetSubTasks(self): 49 return self._subTasks 50 51 def HasSubTasks(self): 52 return True 53 54 def SubTaskCount(self): 55 return len(self._subTasks) 56 57 58 class Sequence(Composite): 59 60 def DoSubTaskCompleted(self, task): 61 if task.status is status.TaskFailureStatus: 62 self.SetStatusToFailed() 63 elif self.IsLastSubTask(task): 64 self.SetStatusToSuccess() 65 else: 66 self.behaviorTree.StartTask(self.GetNextSubTask(task)) 67 68 69 class PrioritySelector(Composite): 70 71 def DoSubTaskCompleted(self, task): 72 if task.status is status.TaskSuccessStatus: 73 self.SetStatusToSuccess() 74 elif self.IsLastSubTask(task): 75 self.SetStatusToFailed() 76 else: 77 self.behaviorTree.StartTask(self.GetNextSubTask(task)) 78 79 80 class NoSubTasksError(Exception): 81 pass