idle.py (6964B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\behaviors\trees\drifters\idle.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 behaviors.trees.scoutsidle import IGNORED_TYPES, IGNORED_GROUPS 17 from brennivin.itertoolsext import Bundle 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 IDLE_ANCHOR = (ScopeTypes.EntityGroup, 'IDLE_ANCHOR') 23 IDLE_GOTO_POINT = (ScopeTypes.EntityGroup, 'IDLE_GOTO_POINT') 24 SCANNER_STRETCH_EFFECT = 'effects.SleeperScannerStretch' 25 SCANNER_SHIP_EFFECT = 'effects.SleeperScannerShip' 26 SCANNER_EFFECT_DURATION_MSEC = 10000 27 28 def CreateIdleBehavior(): 29 root = composites.PrioritySelector(Bundle(name='Idle')) 30 root.AddSubTask(CreateAnalyzeBehavior()) 31 root.AddSubTask(CreateIdleFallback()) 32 return root 33 34 35 def HaveAValidTarget(targetAddress = None, maxDistance = None): 36 isValidTargetRoot = composites.Sequence(Bundle(name='Has Valid Target?')) 37 isValidTargetRoot.AddSubTask(BlackboardMessageMonitorBlocking(Bundle(messageAddress=targetAddress))) 38 isValidTargetRoot.AddSubTask(IsBallPresentInMyBubbleCondition(Bundle(ballIdAddress=targetAddress))) 39 isValidTargetRoot.AddSubTask(IsBallWithInDistanceCondition(Bundle(ballIdAddress=targetAddress, maxDistance=maxDistance))) 40 return isValidTargetRoot 41 42 43 def CreateAnalyzeBehavior(): 44 analyzeRoot = composites.Sequence(Bundle(name='Analyze Objects')) 45 analyzeRoot.AddSubTask(BubbleChangedMonitor(Bundle())) 46 47 def SelectTargetAction(scanDistance): 48 return SelectTargetToAnalyzeAction(Bundle(selectedTargetAddress=ANALYZE_OBJECT_ID, maxDistance=scanDistance, ignoredCategories=[], ignoredGroups=IGNORED_GROUPS, ignoredTypes=IGNORED_TYPES, shouldIgnoreMobileTargets=False)) 49 50 def SelectTargetToAnalyze(scanDistance): 51 node = composites.Sequence(Bundle(name='Select Analyze Target')) 52 node.AddSubTask(StartTimerBlocks(Bundle(timeoutSeconds=30.0, timerAddress=ANALYZE_OBJECT_TIMER))) 53 node.AddSubTask(SelectTargetAction(scanDistance)) 54 return node 55 56 def PickObjectToAnalyze(): 57 pickObjectRoot = composites.PrioritySelector(Bundle(name='Pick Object')) 58 scanDistance = 75000 59 pickObjectRoot.AddSubTask(SelectTargetToAnalyze(scanDistance)) 60 pickObjectRoot.AddSubTask(HaveAValidTarget(targetAddress=ANALYZE_OBJECT_ID, maxDistance=scanDistance)) 61 pickObjectRoot.AddSubTask(SelectTargetAction(scanDistance)) 62 return pickObjectRoot 63 64 analyzeRoot.AddSubTask(PickObjectToAnalyze()) 65 analyzeRoot.AddSubTask(OrbitAtDistanceAction(Bundle(orbitTargetAddress=ANALYZE_OBJECT_ID, orbitRange=4000.0, blocking=True, blockUntilRange=7000))) 66 analyzeRoot.AddSubTask(effects.PlayOneShotStretchEffectAction(Bundle(effectDuration=SCANNER_EFFECT_DURATION_MSEC, effectName=SCANNER_STRETCH_EFFECT, effectTargetAddress=ANALYZE_OBJECT_ID))) 67 analyzeRoot.AddSubTask(effects.PlayOneShotTargetedShipEffectAction(Bundle(effectDuration=SCANNER_EFFECT_DURATION_MSEC, effectName=SCANNER_SHIP_EFFECT, effectTargetAddress=ANALYZE_OBJECT_ID))) 68 analyzeRoot.AddSubTask(SucceedAfterTimeoutAction(Bundle(timeoutSeconds=SCANNER_EFFECT_DURATION_MSEC / 1000.0))) 69 return analyzeRoot 70 71 72 def CreateIdleFallback(): 73 fallbackRoot = composites.Sequence(Bundle(name='Idle Fallback')) 74 75 def CreateSelectPointBehavior(): 76 selectPointRoot = composites.PrioritySelector(Bundle(name='Select Observation Point')) 77 78 def CreateValidPointBehavior(): 79 isValidPointRoot = composites.Sequence() 80 isValidPointRoot.AddSubTask(BlackboardMessageMonitorBlocking(Bundle(messageAddress=IDLE_GOTO_POINT))) 81 isValidPointRoot.AddSubTask(IsCoordinateInSameBubbleCondition(Bundle(coordinateAddress=IDLE_GOTO_POINT))) 82 return isValidPointRoot 83 84 selectPointRoot.AddSubTask(CreateValidPointBehavior()) 85 selectPointRoot.AddSubTask(SelectCoordinateNearCoordinateAction(Bundle(sourceCoordinateAddress=WARP_TO_LOCATION_GROUP, destinationCoordinateAddress=IDLE_GOTO_POINT, minDistance=10000.0, maxDistance=20000.0))) 86 return selectPointRoot 87 88 fallbackRoot.AddSubTask(CreateSelectPointBehavior()) 89 fallbackRoot.AddSubTask(ApproachCoordinatesAction(Bundle(coordinateAddress=IDLE_GOTO_POINT, notifyRange=1000.0, blocking=True))) 90 91 def PickAnchor(): 92 pickAnchorRoot = composites.PrioritySelector(Bundle(name='Pick Anchor')) 93 pickAnchorRoot.AddSubTask(HaveAValidTarget(targetAddress=IDLE_ANCHOR, maxDistance=40000)) 94 pickAnchorRoot.AddSubTask(BlackboardSendMyItemIdMessageAction(Bundle(messageAddress=IDLE_ANCHOR))) 95 return pickAnchorRoot 96 97 fallbackRoot.AddSubTask(PickAnchor()) 98 99 def AnchorOrOrbit(): 100 anchorOrOrbitRoot = composites.PrioritySelector(Bundle(name='Anchor or Orbit')) 101 102 def Anchor(): 103 anchorRoot = composites.Sequence(Bundle(name='Anchor')) 104 anchorRoot.AddSubTask(BlackboardMessageAndMyItemIdEqualCondition(Bundle(name='Am I Anchor?', messageAddress=IDLE_ANCHOR))) 105 anchorRoot.AddSubTask(FullStopAction(Bundle())) 106 anchorRoot.AddSubTask(WaitAction(Bundle())) 107 return anchorRoot 108 109 anchorOrOrbitRoot.AddSubTask(Anchor()) 110 111 def OrbitByDefault(): 112 orbitRoot = composites.Sequence(Bundle(name='Orbit By Default')) 113 orbitRoot.AddSubTask(OrbitAtDistanceAction(Bundle(orbitTargetAddress=IDLE_ANCHOR, orbitRange=3000.0, blocking=False, blockUntilRange=None))) 114 orbitRoot.AddSubTask(WaitAction(Bundle())) 115 return orbitRoot 116 117 anchorOrOrbitRoot.AddSubTask(OrbitByDefault()) 118 return anchorOrOrbitRoot 119 120 fallbackRoot.AddSubTask(AnchorOrOrbit()) 121 return fallbackRoot 122 123 124 def CreateAnalyzeTree(): 125 tree = BehaviorTree() 126 tree.StartRootTask(CreateAnalyzeBehavior()) 127 return tree