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

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]