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

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