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