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

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