dungeonbosstree.py (4115B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\behaviors\trees\dungeonboss\dungeonbosstree.py 2 from behaviors import composites 3 from behaviors.actions import WaitAction 4 from behaviors.actions.ballparks import FindPointToExplore 5 from behaviors.actions.blackboards import BlackboardSetMessageToBooleanValueAction 6 from behaviors.actions.combatnavigation import DEFAULT_COMBAT_ATTACK_RANGE, DEFAULT_COMBAT_ORBIT_RANGE 7 from behaviors.actions.damage import SetArmorRatio 8 from behaviors.behaviortree import BehaviorTree 9 from behaviors.blackboards.scopes import ScopeTypes 10 from behaviors.conditions.blackboards import IsBlackboardValueTrue 11 from behaviors.const.combat import SIZE_TARGET_EVALUATOR 12 from behaviors.decorators.timers import CooldownTimer 13 from behaviors.monitors.damage import ArmorDamageThresholdMonitor 14 from behaviors.trees.combat import CreateCombatBehavior, CreateTargetSwitchingBehavior 15 from behaviors.trees.explore import CreateExplorationBehavior 16 from behaviors.trees.guardobject import CreateGuardObjectBehavior, CreateGuardCurrentLocationBehavior 17 from behaviors.trees.travel import CreateWarpToNewLocationBehavior, WARP_TO_LOCATION_GROUP 18 from brennivin.itertoolsext import Bundle 19 from evedungeons.common.constants import ARCHETYPE_HIDDEN_WORMHOLE_DUNGEON 20 from inventorycommon.const import groupPlanet 21 ESCAPE_TIMER = (ScopeTypes.Item, 'ESCAPE_TIMER') 22 ESCAPE_TRIGGER_ADDRESS = (ScopeTypes.Item, 'ESCAPE_TRIGGER') 23 COMBAT_ORBIT_VELOCITY = 1500 24 BOSS_EXPLORATION_SITE_GROUP_IDS = [groupPlanet] 25 BOSS_EXPLORATION_TIME = 3600 26 BOSS_GUARD_RANGE = 500000 27 BOSS_GUARD_REPLACEMENT_RANGE = 100000 28 BOSS_ESCAPE_INTERVAL_SECONDS = 1200 29 BOSS_ESCAPE_ARMOR_RATIO = 0.2 30 BOSS_ESCAPE_EMERGENCY_ARMOR_RATIO_BUFFER = 0.05 31 32 def CreateFindNewEscapeLocation(): 33 return FindPointToExplore(Bundle(name='Find Point To Escape-warp to', locationMessage=WARP_TO_LOCATION_GROUP, groupsOfInterest=BOSS_EXPLORATION_SITE_GROUP_IDS, dungeonArchetypesOfInterest=[ARCHETYPE_HIDDEN_WORMHOLE_DUNGEON], dungeonsOfInterest=[], pickSpecificChance=0.0, shouldConsiderUnspawnedDungeons=False)) 34 35 36 def CreateEscapeBehavior(escapeIntervalSeconds = BOSS_ESCAPE_INTERVAL_SECONDS, escapeArmorRatio = BOSS_ESCAPE_ARMOR_RATIO): 37 root = composites.Sequence(Bundle(name='Escape')) 38 root.AddSubTask(ArmorDamageThresholdMonitor(Bundle(armorRatioThreshold=escapeArmorRatio, thresholdReachedAddress=ESCAPE_TRIGGER_ADDRESS))) 39 root.AddSubTask(IsBlackboardValueTrue(Bundle(valueAddress=ESCAPE_TRIGGER_ADDRESS))) 40 root.AddSubTask(CooldownTimer(Bundle(timerAddress=ESCAPE_TIMER, timeoutSeconds=escapeIntervalSeconds)).AddSubTask(composites.Sequence().AddSubTask(CreateFindNewEscapeLocation()).AddSubTask(CreateWarpToNewLocationBehavior()).AddSubTask(SetArmorRatio(Bundle(name='Assign emergency armor value to prevent re-triggering', armorRatio=escapeArmorRatio + BOSS_ESCAPE_EMERGENCY_ARMOR_RATIO_BUFFER))).AddSubTask(BlackboardSetMessageToBooleanValueAction(Bundle(name='Reset trigger', messageAddress=ESCAPE_TRIGGER_ADDRESS, value=False))))) 41 return root 42 43 44 def CreateDungeonBossBehaviorTree(): 45 root = composites.PrioritySelector(Bundle(name='Dungeon Boss Root')) 46 root.AddSubTask(CreateGuardCurrentLocationBehavior(guardRange=BOSS_GUARD_RANGE, guardReplacementRange=BOSS_GUARD_REPLACEMENT_RANGE)) 47 root.AddSubTask(CreateEscapeBehavior(escapeIntervalSeconds=BOSS_ESCAPE_INTERVAL_SECONDS, escapeArmorRatio=BOSS_ESCAPE_ARMOR_RATIO)) 48 root.AddSubTask(CreateTargetSwitchingBehavior(targetEvaluationFunction=SIZE_TARGET_EVALUATOR)) 49 root.AddSubTask(CreateCombatBehavior(orbitVelocity=COMBAT_ORBIT_VELOCITY, orbitRange=DEFAULT_COMBAT_ORBIT_RANGE, attackRange=DEFAULT_COMBAT_ATTACK_RANGE)) 50 root.AddSubTask(CreateExplorationBehavior(groupsOfInterest=BOSS_EXPLORATION_SITE_GROUP_IDS, dungeonArchetypesOfInterest=[ARCHETYPE_HIDDEN_WORMHOLE_DUNGEON], explorationIntervalSeconds=BOSS_EXPLORATION_TIME)) 51 root.AddSubTask(CreateGuardObjectBehavior()) 52 root.AddSubTask(WaitAction(Bundle(name='Do nothing'))) 53 behaviorTree = BehaviorTree() 54 behaviorTree.StartRootTask(root) 55 return behaviorTree