fighterTooltip.py (8589B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\fittingScreen\fighterTooltip.py 2 import dogma.data as dogma_data 3 import evetypes 4 from carbon.common.script.util.format import FmtDist 5 from carbon.common.script.util.timerstuff import AutoTimer 6 from eve.client.script.ui.inflight.shipModuleButton.moduleButtonTooltip import ModuleButtonTooltip 7 from eve.client.script.ui.inflight.squadrons.squadronController import SquadronController 8 from eve.client.script.ui.tooltips.tooltipsWrappers import TooltipBaseWrapper 9 from eve.common.script.mgt.fighterConst import TUBE_STATES_INSPACE 10 from fighters import ABILITY_SLOT_0, ABILITY_SLOT_2, GetAbilityNameID 11 from fighters import GetMaxSquadronSize 12 from localization import GetByLabel, GetByMessageID 13 from shipfitting.fittingDogmaLocationUtil import GetRangesForAbilitySlot, GetDamageForAbilitySlot 14 import carbonui.const as uiconst 15 from utillib import KeyVal 16 17 class TooltipFighterWrapper(TooltipBaseWrapper): 18 19 def CreateTooltip(self, parent, owner, idx): 20 self.tooltipPanel = FighterTooltip(parent=parent, owner=owner, idx=idx) 21 return self.tooltipPanel 22 23 24 class FighterTooltip(ModuleButtonTooltip): 25 infoFunctionNamesForCategories = {const.categoryFighter: 'AddFighterInfo'} 26 infoFunctionNames = {} 27 28 def LoadTooltip(self): 29 if not self.owner: 30 return 31 itemID = self.owner.GetFighterItemID() 32 if not itemID: 33 return 34 self.tubeFlagID = self.owner.tubeFlagID 35 self.moduleItemID = itemID 36 self.itemID = itemID 37 self.ownerGuid = 'Fighters' 38 if not self.moduleItemID: 39 return 40 if getattr(self.owner, 'tooltipIdentifier', '') == 'SimulatedFighterTooltip': 41 self.dogmaLocation = sm.GetService('fittingSvc').GetCurrentDogmaLocation() 42 self.isSimulated = True 43 else: 44 self.dogmaLocation = sm.GetService('clientDogmaIM').GetDogmaLocation() 45 self.isSimulated = False 46 self.moduleInfoItem = self.dogmaLocation.GetDogmaItem(self.itemID) 47 self.moduleGroupID = evetypes.GetGroupID(self.moduleInfoItem.typeID) 48 self.moduleCategoryID = evetypes.GetCategoryID(self.moduleInfoItem.typeID) 49 self.numSlaves = 0 50 if self.stateManager.GetDefaultEffect(self.moduleInfoItem.typeID): 51 self.moduleShortcut = self.GetModuleShortcut(self.moduleInfoItem) 52 else: 53 self.moduleShortcut = None 54 self.typeName = evetypes.GetName(self.moduleInfoItem.typeID) 55 self.onHUDModuleButton = False 56 self.UpdateToolTips() 57 self._toolTooltipUpdateTimer = AutoTimer(1000, self.UpdateToolTips) 58 59 def UpdateToolTips(self): 60 if self.destroyed or self.beingDestroyed or self.owner is None: 61 self._toolTooltipUpdateTimer = None 62 return 63 self.Flush() 64 typeText = self.GetTypeText() 65 self.AddTypeAndIcon(label=typeText, typeID=self.moduleInfoItem.typeID, moduleShortcut=self.moduleShortcut) 66 self.AddDamageInfo() 67 chargeInfoItem = None 68 if self.ShouldAddDps(chargeInfoItem): 69 self.AddDpsAndDamgeTypeInfo(self.moduleItemID, self.moduleInfoItem.typeID, self.moduleGroupID, chargeInfoItem, self.numSlaves) 70 self.AddGroupAndCategoryExtraInfo(chargeInfoItem) 71 72 def GetTypeText(self): 73 numInSquadron = self._GetNumInSquadron() 74 if numInSquadron > 1: 75 typeText = GetByLabel('UI/Inflight/ModuleRacks/TypeNameWithNumInGroup', numInGroup=numInSquadron, typeName=self.typeName) 76 else: 77 typeText = self.typeName 78 typeText = '<b>%s</b>' % typeText 79 return typeText 80 81 def _GetFightersForTube(self): 82 return self.dogmaLocation.GetFightersForTube(self.tubeFlagID) 83 84 def _GetNumInSquadron(self): 85 fighters = self._GetFightersForTube() 86 if fighters: 87 return fighters.squadronSize 88 else: 89 return 0 90 91 def AddFighterInfo(self, *args): 92 self.AddVelocity() 93 self.AddTargetingRange() 94 self.AddScanRes() 95 self.AddSignatureRadius() 96 97 def GetRanges(self, chargeInfoItem): 98 return (None, None, None, None) 99 100 def GetNumberOfSlaves(self, *args): 101 return 1 102 103 def ShouldAddDps(self, *args): 104 return True 105 106 def AddDpsAndDamgeTypeInfo(self, itemID, typeID, groupID, charge, numSlaves): 107 fighters = self.dogmaLocation.GetFightersForTube(self.tubeFlagID) 108 if fighters is None: 109 return 110 texturePath = 'res:/UI/Texture/Icons/drones.png' 111 for eachSlotID in (ABILITY_SLOT_0, ABILITY_SLOT_2): 112 dps, damage, abilityID = GetDamageForAbilitySlot(self.dogmaLocation, itemID, typeID, fighters.squadronSize, eachSlotID) 113 if dps: 114 abilityName = GetByMessageID(GetAbilityNameID(abilityID)) 115 text = GetByLabel('UI/Inflight/ModuleRacks/Tooltips/DamagePerSecondAbility', abilityName=abilityName, dps=dps) 116 self.AddRowWithIconAndText(text=text, texturePath=texturePath) 117 self.AddRangesForAbilitySlot(eachSlotID) 118 119 def AddActivityStatus(self): 120 pass 121 122 def GetModuleDamage(self, ownerGuid, moduleItemID): 123 return KeyVal(moduleDamage=None, repairingModuleDamage=None, repairTimeLeft=None) 124 125 def AddVelocity(self): 126 controller = SquadronController() 127 velocity = controller.GetSquadronVelocity(self.tubeFlagID) 128 if velocity is None: 129 return 130 text = GetByLabel('UI/Inflight/MetersPerSecond', speed=int(velocity)) 131 self.AddRowWithIconAndText(text=text, iconID=1389) 132 133 def AddTargetingRange(self): 134 iconID = dogma_data.get_attribute_icon_id(const.attributeMaxTargetRange) 135 attributeName = dogma_data.get_attribute_display_name(const.attributeMaxTargetRange) 136 targetingRange = self.GetEffectiveAttributeValue(self.itemID, const.attributeMaxTargetRange) 137 if targetingRange != 0: 138 formattedOptimalRange = FmtDist(targetingRange) 139 text = '%s: %s' % (attributeName, formattedOptimalRange) 140 self.AddRowWithIconAndText(text, iconID=iconID) 141 142 def AddRangesForAbilitySlot(self, abilitySlotID): 143 maxRange, falloff, abilityID = GetRangesForAbilitySlot(self.dogmaLocation, self.moduleItemID, self.moduleInfoItem.typeID, abilitySlotID) 144 if maxRange > 0: 145 self.AddRangeInfo(self.moduleInfoItem.typeID, optimalRange=maxRange, falloff=falloff) 146 147 def AddScanRes(self): 148 self.AddAttributeInfoWithAttributeName(itemID=self.itemID, attributeID=const.attributeScanResolution, labelPath='UI/Inflight/ModuleRacks/Tooltips/ScanResolution') 149 150 def AddSignatureRadius(self): 151 self.AddAttributeInfoWithAttributeName(itemID=self.itemID, attributeID=const.attributeSignatureRadius, labelPath='UI/Inflight/ModuleRacks/Tooltips/SignatureRadius') 152 153 def AddDamageInfo(self, damage = None): 154 numHealthyFighters, damage = self._GetNumHealthyFightersAndDamage() 155 if damage and damage < 0.99: 156 damageNumber = round((1.0 - damage) * 100) 157 hintText = GetByLabel('UI/Inventory/Fighters/SquadronModuleTooltipWitDamage', numFighters=int(numHealthyFighters), damagePercentage=damageNumber) 158 self.AddSpacer(height=0, width=0, colSpan=2) 159 self.AddLabelMedium(text=hintText, colSpan=self.columns, align=uiconst.CENTERLEFT, cellPadding=self.labelPadding) 160 161 def _GetNumHealthyFightersAndDamage(self): 162 if not self.moduleInfoItem.typeID: 163 return 0 164 damage = self._GetFighterDamage() 165 numHealthyFighters = 0 166 squadronMaxSize = GetMaxSquadronSize(self.moduleInfoItem.typeID) 167 squadronSize = self._GetNumInSquadron() 168 for i in xrange(1, squadronMaxSize + 1): 169 if i <= squadronSize: 170 if i == squadronSize and damage and damage < 0.99: 171 continue 172 else: 173 numHealthyFighters += 1 174 175 return (numHealthyFighters, damage) 176 177 def _GetFighterDamage(self): 178 if self.tubeFlagID is not None: 179 shipFighterState = sm.GetService('fighters').shipFighterState 180 tubeStatus = shipFighterState.GetTubeStatus(self.tubeFlagID) 181 if tubeStatus.statusID not in TUBE_STATES_INSPACE: 182 return 183 bp = sm.GetService('michelle').GetBallpark() 184 if bp is None: 185 return 186 damageState = bp.GetDamageState(self.itemID) 187 if damageState: 188 return damageState[0]