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

panelFighterAbilities.py (7789B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\info\panels\panelFighterAbilities.py
      2 from appConst import defaultPadding
      3 from carbonui.primitives.container import Container
      4 from dogma import units
      5 from dogma.attributes.format import FormatValue, GetFormattedAttributeAndValue
      6 import dogma.const as dogmaConst
      7 from eve.client.script.ui.control.entries.header import Header
      8 from eve.client.script.ui.control.entries.label_text import LabelTextSides, LabelTextSidesAttributes
      9 from eve.client.script.ui.control.entries.util import GetFromClass
     10 from eve.client.script.ui.control.eveScroll import Scroll
     11 from eve.client.script.ui.shared.fitting.fittingUtil import ModifiedAttribute
     12 from fighters import IterTypeAbilities
     13 import fighters
     14 from fighters.abilityAttributes import GetDogmaAttributeIDsForAbilityID, GetAbilityRangeAndFalloffAttributeIDs, GetAbilityDurationAttributeID, GetDamageMultiplierAttributeFromAbilityID, FIGHTER_DAMAGE_ATTRIBUTES
     15 from localization import GetByLabel, GetByMessageID
     16 from shipfitting.fittingDogmaLocationUtil import GetDamageForSquadron
     17 
     18 class PanelFighterAbilities(Container):
     19 
     20     def ApplyAttributes(self, attributes):
     21         Container.ApplyAttributes(self, attributes)
     22         self.itemID = attributes.get('itemID', None)
     23         self.typeID = attributes.typeID
     24         self.infoSvc = sm.GetService('info')
     25         self.dogmaStaticMgr = sm.GetService('clientDogmaStaticSvc')
     26         self.dogmaLocation = attributes.dogmaLocation
     27 
     28     def Load(self):
     29         self.Flush()
     30         self.scroll = Scroll(name='abilityScroll', parent=self, padding=defaultPadding)
     31         contentList = self._GetContentList()
     32         self.scroll.Load(contentList=contentList)
     33 
     34     def _GetContentList(self):
     35         contentList = []
     36         for slotID, typeAbility in IterTypeAbilities(self.typeID):
     37             if typeAbility is not None:
     38                 abilityID = typeAbility.abilityID
     39                 ability = fighters.AbilityStorage()[abilityID]
     40                 self._AddAbilityHeader(contentList, ability)
     41                 self._AddRestrictionEntries(contentList, ability)
     42                 self._AddRangeEntries(contentList, abilityID)
     43                 self._AddDurationEntry(contentList, abilityID)
     44                 self._AddCooldownEntry(contentList, typeAbility)
     45                 self._AddChargeCountEntry(contentList, typeAbility)
     46                 self._AddAttributeEntries(contentList, abilityID)
     47 
     48         return contentList
     49 
     50     def _AddAbilityHeader(self, contentList, ability):
     51         contentList.append(GetFromClass(Header, {'label': GetByMessageID(ability.displayNameID)}))
     52 
     53     def _AddRestrictionEntries(self, contentList, ability):
     54         if ability.disallowInHighSec:
     55             contentList.append(GetFromClass(LabelTextSides, {'label': GetByLabel('UI/Fighters/AbilityDisallowedInHighSec'),
     56              'text': '',
     57              'iconID': '77_12'}))
     58         if ability.disallowInLowSec:
     59             contentList.append(GetFromClass(LabelTextSides, {'label': GetByLabel('UI/Fighters/AbilityDisallowedInLowSec'),
     60              'text': '',
     61              'iconID': '77_12'}))
     62 
     63     def _AddRangeEntries(self, contentList, abilityID):
     64         rangeAttributeID, falloffAttributeID = GetAbilityRangeAndFalloffAttributeIDs(self.dogmaStaticMgr, abilityID)
     65         contentList.extend(self.infoSvc.GetAttributeScrollListForItem(self.itemID, self.typeID, attrList=[rangeAttributeID, falloffAttributeID]))
     66 
     67     def _AddDurationEntry(self, contentList, abilityID):
     68         durationAttributeID = GetAbilityDurationAttributeID(self.dogmaStaticMgr, abilityID)
     69         contentList.extend(self.infoSvc.GetAttributeScrollListForItem(self.itemID, self.typeID, attrList=[durationAttributeID]))
     70 
     71     def _AddCooldownEntry(self, contentList, typeAbility):
     72         if typeAbility.cooldownSeconds:
     73             contentList.append(GetFromClass(LabelTextSides, {'label': GetByLabel('UI/Fighters/AbilityCooldown'),
     74              'text': FmtFSDTimeAttribute(typeAbility.cooldownSeconds),
     75              'iconID': '22_16'}))
     76 
     77     def _AddChargeCountEntry(self, contentList, typeAbility):
     78         if typeAbility.charges is not None:
     79             contentList.append(GetFromClass(LabelTextSides, {'label': GetByLabel('UI/Fighters/AbilityChargeCount'),
     80              'text': typeAbility.charges.chargeCount,
     81              'iconID': '22_21'}))
     82             contentList.append(GetFromClass(LabelTextSides, {'label': GetByLabel('UI/Fighters/RearmTimePerCharge'),
     83              'text': FmtFSDTimeAttribute(typeAbility.charges.rearmTimeSeconds),
     84              'iconID': '22_16'}))
     85 
     86     def _AddAttributeEntries(self, contentList, abilityID):
     87         abilityAttributeIDs = GetDogmaAttributeIDsForAbilityID(abilityID)
     88         dogmaLocation = self.infoSvc.GetDogmaLocation(self.itemID)
     89         damageFromAbility, dpsFromAbility = GetDamageForSquadron(dogmaLocation, self.itemID, 1, abilityID)
     90         if damageFromAbility:
     91             banAttrs = FIGHTER_DAMAGE_ATTRIBUTES
     92             entryList = self.TryGetDamageEntry(abilityAttributeIDs, abilityID, damageFromAbility)
     93         else:
     94             banAttrs = []
     95             entryList = []
     96         if abilityAttributeIDs:
     97             contentList.extend(self.infoSvc.GetAttributeScrollListForItem(self.itemID, self.typeID, attrList=abilityAttributeIDs, banAttrs=banAttrs))
     98         if entryList:
     99             contentList += entryList
    100 
    101     def TryGetDamageEntry(self, abilityAttributeIDs, abilityID, damageFromAbility):
    102         entryList = []
    103         damageMultiplierAttributeID = GetDamageMultiplierAttributeFromAbilityID(abilityID)
    104         if self.itemID and damageMultiplierAttributeID:
    105             dogmaLocation = self.infoSvc.GetDogmaLocation(self.itemID)
    106             damageAttributesForAbility = [ x for x in abilityAttributeIDs if x in FIGHTER_DAMAGE_ATTRIBUTES ]
    107             for eachDmgAttributeID in damageAttributesForAbility:
    108                 dmgValue = dogmaLocation.GetAttributeValue(self.itemID, eachDmgAttributeID)
    109                 if dmgValue == 0:
    110                     continue
    111                 entry = self.GetCustomDamageEntry(damageFromAbility, eachDmgAttributeID, damageMultiplierAttributeID)
    112                 entryList.append(entry)
    113 
    114         return entryList
    115 
    116     def GetCustomDamageEntry(self, value, attributeID, damageMultiplierAttributeID):
    117         formatInfo = GetFormattedAttributeAndValue(attributeID, value)
    118         if not formatInfo:
    119             return
    120         if self.itemID and formatInfo.infoTypeID and self.typeID != formatInfo.infoTypeID:
    121             itemID = None
    122         else:
    123             itemID = self.itemID
    124         baseValue = self.dogmaStaticMgr.GetTypeAttribute(self.typeID, attributeID)
    125         modifiedValue = ModifiedAttribute(value, oldValue=baseValue, attributeID=attributeID, higherIsBetter=True)
    126         return GetFromClass(LabelTextSidesAttributes, {'attributeID': attributeID,
    127          'line': 1,
    128          'label': formatInfo.displayName,
    129          'text': formatInfo.value,
    130          'iconID': formatInfo.iconID,
    131          'typeID': formatInfo.infoTypeID,
    132          'itemID': itemID,
    133          'modifiedAttribute': modifiedValue,
    134          'OnClick': (self.OnCustomDamageEntryClicked,
    135                      attributeID,
    136                      itemID,
    137                      damageMultiplierAttributeID)})
    138 
    139     def OnCustomDamageEntryClicked(self, attributeID, itemID, damageMultiplierAttributeID):
    140         self.infoSvc.OnAttributeClick(attributeID, itemID)
    141         self.infoSvc.OnAttributeClick(damageMultiplierAttributeID, itemID)
    142 
    143 
    144 def FmtFSDTimeAttribute(valueSeconds):
    145     numberText = FormatValue(valueSeconds * 1000, dogmaConst.unitMilliseconds)
    146     return GetByLabel('UI/InfoWindow/ValueAndUnit', value=numberText, unit=units.get_display_name(dogmaConst.unitMilliseconds))