__init__.py (5720B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\behaviors\trees\fighters\__init__.py 2 from behaviors.actions import WaitAction 3 from behaviors.actions.ballparks import AlignToCoordinatesAction 4 from behaviors.actions.blackboards import BlackboardSetMessageAsNoneAction 5 from behaviors.actions.combat import KamikazeAttack 6 from behaviors.actions.fighterabilities import StopAbilityEffectOnTarget, NotifyAbilityActivationFailure, ActivateAbilityEffectOnPoint 7 from behaviors.behaviortree import BehaviorTree 8 from behaviors.blackboards.scopes import ScopeTypes 9 from behaviors.composites import PrioritySelector, Sequence 10 from behaviors.conditions.blackboards import IsBlackboardValueNotNone, IsBlackboardValue3dVector 11 from behaviors.conditions.effects import IsEffectByAddressActive 12 from behaviors.decorators.modifiers import ForceSuccess, Uninterruptible 13 from behaviors.monitors.blackboards import BlackboardMessageMonitor 14 from brennivin.itertoolsext import Bundle 15 import ccpProfile 16 from fighters import ABILITY_SLOT_0, ABILITY_SLOT_1, ABILITY_SLOT_2 17 KAMIKAZE_ADDRESS = (ScopeTypes.Item, 'KAMIKAZE_ADDRESS') 18 KAMIKAZE_ABORT_ADDRESS = (ScopeTypes.Item, 'KAMIKAZE_ABORT_ADDRESS') 19 ABILITY_TARGET_SLOT0_ADDRESS = (ScopeTypes.Item, 'ABILITY_TARGET_SLOT0_ADDRESS') 20 ABILITY_START_EFFECTID_SLOT0_ADDRESS = (ScopeTypes.Item, 'ABILITY_START_EFFECTID_SLOT0_ADDRESS') 21 ABILITY_STOP_EFFECTID_SLOT0_ADDRESS = (ScopeTypes.Item, 'ABILITY_STOP_EFFECTID_SLOT0_ADDRESS') 22 ABILITY_TARGET_SLOT1_ADDRESS = (ScopeTypes.Item, 'ABILITY_TARGET_SLOT1_ADDRESS') 23 ABILITY_START_EFFECTID_SLOT1_ADDRESS = (ScopeTypes.Item, 'ABILITY_START_EFFECTID_SLOT1_ADDRESS') 24 ABILITY_STOP_EFFECTID_SLOT1_ADDRESS = (ScopeTypes.Item, 'ABILITY_STOP_EFFECTID_SLOT1_ADDRESS') 25 ABILITY_TARGET_SLOT2_ADDRESS = (ScopeTypes.Item, 'ABILITY_TARGET_SLOT2_ADDRESS') 26 ABILITY_START_EFFECTID_SLOT2_ADDRESS = (ScopeTypes.Item, 'ABILITY_START_EFFECTID_SLOT2_ADDRESS') 27 ABILITY_STOP_EFFECTID_SLOT2_ADDRESS = (ScopeTypes.Item, 'ABILITY_STOP_EFFECTID_SLOT2_ADDRESS') 28 ADDRESSES_BY_SLOT_ID = {ABILITY_SLOT_0: (ABILITY_TARGET_SLOT0_ADDRESS, ABILITY_START_EFFECTID_SLOT0_ADDRESS, ABILITY_STOP_EFFECTID_SLOT0_ADDRESS), 29 ABILITY_SLOT_1: (ABILITY_TARGET_SLOT1_ADDRESS, ABILITY_START_EFFECTID_SLOT1_ADDRESS, ABILITY_STOP_EFFECTID_SLOT1_ADDRESS), 30 ABILITY_SLOT_2: (ABILITY_TARGET_SLOT2_ADDRESS, ABILITY_START_EFFECTID_SLOT2_ADDRESS, ABILITY_STOP_EFFECTID_SLOT2_ADDRESS)} 31 ACTIVATION_FAILURE_REASON_ADDRESSES = {ABILITY_SLOT_0: (ScopeTypes.Item, 'ABILITY_FAILURE_REASON_SLOT0_ADDRESS'), 32 ABILITY_SLOT_1: (ScopeTypes.Item, 'ABILITY_FAILURE_REASON_SLOT1_ADDRESS'), 33 ABILITY_SLOT_2: (ScopeTypes.Item, 'ABILITY_FAILURE_REASON_SLOT2_ADDRESS')} 34 35 @ccpProfile.TimedFunction('behaviour::fighters::CreateFighterBehavior') 36 def CreateFighterBehavior(): 37 root = Sequence() 38 root.AddSubTask(_CreateAbilitySlotBehavior(ABILITY_SLOT_0)) 39 root.AddSubTask(_CreateAbilitySlotBehavior(ABILITY_SLOT_1)) 40 root.AddSubTask(_CreateAbilitySlotBehavior(ABILITY_SLOT_2)) 41 root.AddSubTask(Sequence(Bundle(name='Kamikaze')).AddSubTask(BlackboardMessageMonitor(Bundle(messageAddress=KAMIKAZE_ADDRESS))).AddSubTask(ForceSuccess().AddSubTask(PrioritySelector().AddSubTask(Sequence(Bundle(name='Kamikaze')).AddSubTask(IsBlackboardValueNotNone(Bundle(valueAddress=KAMIKAZE_ADDRESS))).AddSubTask(KamikazeAttack(Bundle(name='Kamikaze', selectedTargetAddress=KAMIKAZE_ADDRESS, shouldAbortAddress=KAMIKAZE_ABORT_ADDRESS))).AddSubTask(BlackboardSetMessageAsNoneAction(Bundle(messageAddress=KAMIKAZE_ADDRESS))))))) 42 root.AddSubTask(WaitAction(Bundle())) 43 return root 44 45 46 @ccpProfile.TimedFunction('behaviour::fighters::_CreateAbilitySlotBehavior') 47 def _CreateAbilitySlotBehavior(abilitySlotID): 48 description = 'Slot %s' % (abilitySlotID,) 49 targetAddress, startEffectIDAddress, stopEffectIDAddress = ADDRESSES_BY_SLOT_ID[abilitySlotID] 50 failureReasonAddress = ACTIVATION_FAILURE_REASON_ADDRESSES[abilitySlotID] 51 root = Sequence(Bundle(name='Ability effect [%s]' % description)) 52 root.AddSubTask(BlackboardMessageMonitor(Bundle(messageAddress=startEffectIDAddress))) 53 root.AddSubTask(BlackboardMessageMonitor(Bundle(messageAddress=stopEffectIDAddress))) 54 root.AddSubTask(ForceSuccess().AddSubTask(PrioritySelector().AddSubTask(Sequence(Bundle(name='Start point-targeted-effect ability')).AddSubTask(IsBlackboardValueNotNone(Bundle(valueAddress=startEffectIDAddress))).AddSubTask(IsBlackboardValue3dVector(Bundle(valueAddress=targetAddress))).AddSubTask(PrioritySelector().AddSubTask(Uninterruptible().AddSubTask(Sequence().AddSubTask(AlignToCoordinatesAction(Bundle(coordinateAddress=targetAddress, timeoutSeconds=10, acceptableAngleDeviationDegrees=1))).AddSubTask(PrioritySelector().AddSubTask(IsEffectByAddressActive(Bundle(effectIDAddress=startEffectIDAddress))).AddSubTask(ActivateAbilityEffectOnPoint(Bundle(effectIDAddress=startEffectIDAddress, targetPoint=targetAddress, abilitySlotID=abilitySlotID, failureReasonAddress=failureReasonAddress)))))).AddSubTask(NotifyAbilityActivationFailure(Bundle(abilitySlotID=abilitySlotID)))).AddSubTask(BlackboardSetMessageAsNoneAction(Bundle(messageAddress=startEffectIDAddress)))).AddSubTask(Sequence(Bundle(name='Stop effect ability')).AddSubTask(IsBlackboardValueNotNone(Bundle(valueAddress=stopEffectIDAddress))).AddSubTask(StopAbilityEffectOnTarget(Bundle(effectIDAddress=stopEffectIDAddress, abilitySlotID=abilitySlotID, failureReasonAddress=failureReasonAddress))).AddSubTask(BlackboardSetMessageAsNoneAction(Bundle(messageAddress=stopEffectIDAddress)))))) 55 return root 56 57 58 def CreateFighterBehaviorTree(): 59 behaviorTree = BehaviorTree() 60 behaviorTree.StartRootTask(CreateFighterBehavior()) 61 return behaviorTree