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