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))