NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

__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