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

__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