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

patrol.py (7300B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\behaviors\trees\patrol.py
      2 from behaviors import composites
      3 from behaviors.actions import WaitAction
      4 from behaviors.actions.ballparks import SelectTargetToAnalyzeAction, OrbitAtDistanceAction
      5 from behaviors.actions.ballparks import FullStopAction, SelectCoordinateNearCoordinateAction
      6 from behaviors.actions.ballparks import ApproachCoordinatesAction
      7 from behaviors.actions.blackboards import BlackboardSendMyItemIdMessageAction
      8 from behaviors.blackboards.scopes import ScopeTypes
      9 from behaviors.conditions.ballparks import IsBallPresentInMyBubbleCondition, IsBallWithInDistanceCondition, IsCoordinateInSameBubbleCondition
     10 from behaviors.conditions.blackboards import BlackboardMessageAndMyItemIdEqualCondition
     11 from behaviors.monitors.ballparks import BubbleChangedMonitor
     12 from behaviors.monitors.blackboards import BlackboardMessageMonitorBlocking, BlackboardMessageMonitor
     13 from behaviors.monitors.timers import StartTimerBlocks
     14 from brennivin.itertoolsext import Bundle
     15 from inventorycommon import const as invConst
     16 WARP_TO_LOCATION_GROUP = (ScopeTypes.EntityGroup, 'WARP_TO_LOCATION_GROUP')
     17 PATROL_OBJECT_TIMER = (ScopeTypes.EntityGroup, 'PATROL_OBJECT_TIMER')
     18 PATROL_OBJECT_ID = (ScopeTypes.EntityGroup, 'PATROL_OBJECT_ID')
     19 PATROL_CONSIDER_LIST = (ScopeTypes.EntityGroup, 'PATROL_CONSIDER_LIST')
     20 IGNORED_CATEGORIES = {invConst.categoryDrone, invConst.categoryShip}
     21 IGNORED_GROUPS = {invConst.groupDeadspaceSleeperAwakenedDefender,
     22  invConst.groupDeadspaceSleeperSleeplessPatroller,
     23  invConst.groupDeadspaceSleeperSleeplessSentinel,
     24  invConst.groupDeadspaceSleeperSleeplessDefender,
     25  invConst.groupDeadspaceSleeperAwakenedPatroller,
     26  invConst.groupDeadspaceSleeperAwakenedSentinel,
     27  invConst.groupDeadspaceSleeperAwakenedDefender,
     28  invConst.groupDeadspaceSleeperEmergentPatroller,
     29  invConst.groupDeadspaceSleeperEmergentSentinel,
     30  invConst.groupDeadspaceSleeperEmergentDefender,
     31  invConst.groupRoamingSleepersCruiser,
     32  invConst.groupDrifterBattleship,
     33  invConst.groupStation,
     34  invConst.groupCloud,
     35  invConst.groupHarvestableCloud,
     36  invConst.groupPlanetaryCloud,
     37  invConst.groupTemporaryCloud,
     38  invConst.groupWarpDisruptionProbe,
     39  invConst.groupBeacon,
     40  invConst.groupInvisibleBeacon}
     41 TYPE_UNIDENTIFIED_WH = 34494
     42 IGNORED_TYPES = {TYPE_UNIDENTIFIED_WH}
     43 IDLE_ANCHOR = (ScopeTypes.EntityGroup, 'IDLE_ANCHOR')
     44 IDLE_GOTO_POINT = (ScopeTypes.EntityGroup, 'IDLE_GOTO_POINT')
     45 
     46 def CreateIdlePatrolBehavior():
     47     root = composites.PrioritySelector(Bundle(name='Idle'))
     48     root.AddSubTask(CreatePatrolBehavior())
     49     root.AddSubTask(CreateIdleFallback())
     50     return root
     51 
     52 
     53 def HaveAValidTarget(targetAddress = None, maxDistance = None):
     54     isValidTargetRoot = composites.Sequence(Bundle(name='Has Valid Target?'))
     55     isValidTargetRoot.AddSubTask(BlackboardMessageMonitorBlocking(Bundle(messageAddress=targetAddress)))
     56     isValidTargetRoot.AddSubTask(IsBallPresentInMyBubbleCondition(Bundle(ballIdAddress=targetAddress)))
     57     isValidTargetRoot.AddSubTask(IsBallWithInDistanceCondition(Bundle(ballIdAddress=targetAddress, maxDistance=maxDistance)))
     58     return isValidTargetRoot
     59 
     60 
     61 def CreatePatrolBehavior(patrolDistance = 100000, orbitRange = 10000, patrolInterval = 90.0):
     62     root = composites.Sequence(Bundle(name='Patrol Area'))
     63     root.AddSubTask(BubbleChangedMonitor(Bundle()))
     64 
     65     def SelectTargetAction(scanDistance):
     66         return SelectTargetToAnalyzeAction(Bundle(selectedTargetAddress=PATROL_OBJECT_ID, maxDistance=scanDistance, ignoredCategories=IGNORED_CATEGORIES, ignoredGroups=IGNORED_GROUPS, ignoredTypes=IGNORED_TYPES, shouldIgnoreMobileTargets=True))
     67 
     68     def SelectTargetToAnalyze(scanDistance):
     69         node = composites.Sequence(Bundle(name='Select Patrol Target'))
     70         node.AddSubTask(StartTimerBlocks(Bundle(timeoutSeconds=patrolInterval, timerAddress=PATROL_OBJECT_TIMER)))
     71         node.AddSubTask(SelectTargetAction(scanDistance))
     72         return node
     73 
     74     def PickObjectToPatrol():
     75         pickObjectRoot = composites.PrioritySelector(Bundle(name='Pick Object to Patrol'))
     76         pickObjectRoot.AddSubTask(SelectTargetToAnalyze(patrolDistance))
     77         pickObjectRoot.AddSubTask(HaveAValidTarget(targetAddress=PATROL_OBJECT_ID, maxDistance=patrolDistance))
     78         pickObjectRoot.AddSubTask(SelectTargetAction(patrolDistance))
     79         return pickObjectRoot
     80 
     81     root.AddSubTask(PickObjectToPatrol())
     82     root.AddSubTask(BlackboardMessageMonitor(Bundle(messageAddress=PATROL_OBJECT_TIMER)))
     83     root.AddSubTask(BlackboardMessageMonitor(Bundle(messageAddress=PATROL_OBJECT_ID)))
     84     root.AddSubTask(OrbitAtDistanceAction(Bundle(orbitTargetAddress=PATROL_OBJECT_ID, orbitRange=orbitRange, blocking=True, blockUntilRange=orbitRange * 1.5)))
     85     root.AddSubTask(WaitAction(Bundle(name='Patrolling object')))
     86     return root
     87 
     88 
     89 def CreateIdleFallback():
     90     root = composites.Sequence(Bundle(name='Idle Fallback'))
     91 
     92     def CreateSelectPointBehavior():
     93         selectPointRoot = composites.PrioritySelector(Bundle(name='Select Observation Point'))
     94 
     95         def CreateValidPointBehavior():
     96             isValidPointRoot = composites.Sequence()
     97             isValidPointRoot.AddSubTask(BlackboardMessageMonitorBlocking(Bundle(messageAddress=IDLE_GOTO_POINT)))
     98             isValidPointRoot.AddSubTask(IsCoordinateInSameBubbleCondition(Bundle(coordinateAddress=IDLE_GOTO_POINT)))
     99             return isValidPointRoot
    100 
    101         selectPointRoot.AddSubTask(CreateValidPointBehavior())
    102         selectPointRoot.AddSubTask(SelectCoordinateNearCoordinateAction(Bundle(sourceCoordinateAddress=WARP_TO_LOCATION_GROUP, destinationCoordinateAddress=IDLE_GOTO_POINT, minDistance=10000.0, maxDistance=20000.0)))
    103         return selectPointRoot
    104 
    105     root.AddSubTask(CreateSelectPointBehavior())
    106     root.AddSubTask(ApproachCoordinatesAction(Bundle(coordinateAddress=IDLE_GOTO_POINT, notifyRange=1000.0, blocking=True)))
    107 
    108     def PickAnchor():
    109         pickAnchorRoot = composites.PrioritySelector(Bundle(name='Pick Anchor'))
    110         pickAnchorRoot.AddSubTask(HaveAValidTarget(targetAddress=IDLE_ANCHOR, maxDistance=40000))
    111         pickAnchorRoot.AddSubTask(BlackboardSendMyItemIdMessageAction(Bundle(messageAddress=IDLE_ANCHOR)))
    112         return pickAnchorRoot
    113 
    114     root.AddSubTask(PickAnchor())
    115 
    116     def AnchorOrOrbit():
    117         anchorOrOrbitRoot = composites.PrioritySelector(Bundle(name='Anchor or Orbit'))
    118 
    119         def Anchor():
    120             anchorRoot = composites.Sequence(Bundle(name='Anchor'))
    121             anchorRoot.AddSubTask(BlackboardMessageAndMyItemIdEqualCondition(Bundle(name='Am I Anchor?', messageAddress=IDLE_ANCHOR)))
    122             anchorRoot.AddSubTask(FullStopAction(Bundle()))
    123             anchorRoot.AddSubTask(WaitAction(Bundle()))
    124             return anchorRoot
    125 
    126         anchorOrOrbitRoot.AddSubTask(Anchor())
    127 
    128         def OrbitByDefault():
    129             orbitRoot = composites.Sequence(Bundle(name='Orbit By Default'))
    130             orbitRoot.AddSubTask(OrbitAtDistanceAction(Bundle(orbitTargetAddress=IDLE_ANCHOR, orbitRange=3000.0, blocking=False, blockUntilRange=None)))
    131             orbitRoot.AddSubTask(WaitAction(Bundle()))
    132             return orbitRoot
    133 
    134         anchorOrOrbitRoot.AddSubTask(OrbitByDefault())
    135         return anchorOrOrbitRoot
    136 
    137     root.AddSubTask(AnchorOrOrbit())
    138     return root