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

fightersHealthGaugeCont.py (9870B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\inflight\squadrons\fightersHealthGaugeCont.py
      2 import math
      3 from math import cos, sin
      4 import utillib
      5 from carbonui.primitives.container import Container
      6 from carbonui.primitives.sprite import Sprite
      7 from carbonui.primitives.vectorlinetrace import VectorLineTrace
      8 from carbonui.util import colorblind
      9 from eve.client.script.ui.control.eveIcon import Icon
     10 from eve.client.script.ui.inflight.squadrons.shipFighterState import GetShipFighterState
     11 from eve.common.script.mgt.fighterConst import DAMAGED_FIGHTER_HIGH, DAMAGED_FIGHTER_LOW, DAMAGED_FIGHTER_MEDIUM, DEAD_FIGHTER, HEALTHY_FIGHTER_SPACE, HEALTHY_FIGHTER_TUBE, HINTTEXT_BY_ROLE, TUBE_STATES_INSPACE
     12 import evetypes
     13 from fighters import GetMaxSquadronSize, GetSquadronRole
     14 from fighters.client import GetSquadronSizeFromSlimItem, GetSquadronRoleResPath
     15 from localization import GetByLabel
     16 import trinity
     17 import carbonui.const as uiconst
     18 
     19 class FightersHealthGauge(Container):
     20     default_height = 86
     21     default_width = 86
     22     default_align = uiconst.TOPLEFT
     23     default_state = uiconst.UI_PICKCHILDREN
     24     isDragObject = True
     25 
     26     def ApplyAttributes(self, attributes):
     27         Container.ApplyAttributes(self, attributes)
     28         self.shipFighterState = GetShipFighterState()
     29         self.typeID = None
     30         self.squadronSize = None
     31         self.squadronMaxSize = None
     32         self.noHealthyFighters = 0
     33         self.squadronState = attributes.get('state', None)
     34         self.tubeFlagID = attributes.get('tubeFlagID', None)
     35         dashColors = self.GetDashColors()
     36         self.classIcon = Sprite(name='classIcon', parent=self, align=uiconst.CENTERBOTTOM, width=16, height=16, top=18)
     37         self.classIcon.OnMouseEnter = self.OnMouseEnter
     38         self.classIcon.OnMouseExit = self.OnMouseExit
     39         self.classIcon.GetDragData = self.GetDragData
     40         self.fightersGauge = FighterHealthGaugeLine(parent=self, dashColors=dashColors, align=uiconst.CENTER)
     41         Sprite(parent=self, align=uiconst.CENTER, width=86, height=86, texturePath='res:/UI/Texture/classes/ShipUI/Fighters/fighterItemOverlay.png', state=uiconst.UI_DISABLED)
     42         self.fighterIcon = Icon(parent=self, align=uiconst.CENTER, width=52, height=52, state=uiconst.UI_DISABLED, blendMode=1, textureSecondaryPath='res:/UI/Texture/classes/ShipUI/Fighters/fighterItemMask.png', spriteEffect=trinity.TR2_SFX_MODULATE)
     43         Sprite(parent=self, align=uiconst.CENTER, width=86, height=86, texturePath='res:/UI/Texture/classes/ShipUI/Fighters/fighterItemUnderlay.png', state=uiconst.UI_DISABLED)
     44         self.hilite = Sprite(parent=self, name='hilite', width=86, height=86, align=uiconst.CENTER, state=uiconst.UI_DISABLED, texturePath='res:/UI/Texture/classes/ShipUI/Fighters/fighterItemUnderlayOver.png')
     45         self.hilite.display = False
     46 
     47     def LoadFighterToSquadron(self, typeID):
     48         if typeID == self.typeID:
     49             return
     50         self.typeID = typeID
     51         self.fighterIcon.LoadIconByTypeID(typeID=typeID)
     52         self.squadronMaxSize = GetMaxSquadronSize(self.typeID)
     53         roleTexturePath = GetSquadronRoleResPath(self.typeID)
     54         self.classIcon.LoadTexture(roleTexturePath)
     55         hintString = HINTTEXT_BY_ROLE[GetSquadronRole(self.typeID)]
     56         self.classIcon.hint = GetByLabel(hintString)
     57         self.UpdateHint()
     58 
     59     def ClearFighters(self):
     60         self.fightersGauge.ClearFighters()
     61 
     62     def UpdateHint(self, damage = None):
     63         typeName = evetypes.GetName(self.typeID)
     64         if self.tubeFlagID is not None:
     65             tubeStatus = self.shipFighterState.GetTubeStatus(self.tubeFlagID)
     66             if tubeStatus.statusID not in TUBE_STATES_INSPACE:
     67                 damage = None
     68         if damage and damage < 0.99:
     69             damageNumber = round((1.0 - damage) * 100)
     70             hintText = GetByLabel('UI/Inventory/Fighters/SquadronHintWithDamage', typeName=typeName, numFighters=int(self.noHealthyFighters), damagePercentage=damageNumber)
     71         else:
     72             hintText = GetByLabel('UI/Inventory/Fighters/SquadronHint', typeName=typeName, numFighters=int(self.noHealthyFighters))
     73         self.hint = hintText
     74 
     75     def SetSquadronSize(self, squadronSize):
     76         self.squadronSize = squadronSize
     77         self.UpdateFighters()
     78 
     79     def GetDashColors(self, damage = None):
     80         self.noHealthyFighters = 0
     81         dashColors = []
     82         if self.tubeFlagID is not None:
     83             tubeStatus = self.shipFighterState.GetTubeStatus(self.tubeFlagID)
     84             if tubeStatus.statusID not in TUBE_STATES_INSPACE:
     85                 damage = None
     86         if not self.typeID:
     87             return dashColors
     88         for i in xrange(1, self.squadronMaxSize + 1):
     89             if i <= self.squadronSize:
     90                 self.noHealthyFighters += 1
     91                 dashColor = self.GetHealthyFighterColor()
     92                 if damage and damage < 0.99:
     93                     if i == self.squadronSize:
     94                         if damage < 0.33:
     95                             dashColor = DAMAGED_FIGHTER_HIGH
     96                         elif damage < 0.67:
     97                             dashColor = DAMAGED_FIGHTER_MEDIUM
     98                         else:
     99                             dashColor = DAMAGED_FIGHTER_LOW
    100                         self.noHealthyFighters -= 1
    101             else:
    102                 dashColor = DEAD_FIGHTER
    103             dashColor = colorblind.CheckReplaceColor(dashColor)
    104             dashColors.append(dashColor)
    105 
    106         return dashColors
    107 
    108     def GetHealthyFighterColor(self):
    109         if self.tubeFlagID is None:
    110             return HEALTHY_FIGHTER_SPACE
    111         else:
    112             tubeStatus = self.shipFighterState.GetTubeStatus(self.tubeFlagID)
    113             if tubeStatus.statusID in TUBE_STATES_INSPACE:
    114                 return HEALTHY_FIGHTER_SPACE
    115             return HEALTHY_FIGHTER_TUBE
    116 
    117     def GetDragData(self):
    118         if self.squadronState is not None:
    119             squadronData = utillib.KeyVal()
    120             squadronData.tubeFlagID = self.tubeFlagID
    121             squadronData.squadronState = self.squadronState
    122             squadronData.typeID = self.typeID
    123             squadronData.__guid__ = 'uicls.FightersHealthGauge'
    124             return [squadronData]
    125         else:
    126             return []
    127 
    128     def UpdateFighters(self, damage = None):
    129         if not self.typeID:
    130             return
    131         dashColors = self.GetDashColors(damage)
    132         self.fightersGauge.UpdateFighterColors(dashColors)
    133         self.UpdateHint(damage)
    134 
    135     def LoadBySlimItem(self, slimItem):
    136         self.LoadFighterToSquadron(slimItem.typeID)
    137         squadronSize = GetSquadronSizeFromSlimItem(slimItem)
    138         self.SetSquadronSize(squadronSize)
    139         self.UpdateFighters()
    140 
    141     def OnMouseEnter(self, *args):
    142         self.hilite.display = True
    143 
    144     def OnMouseExit(self, *args):
    145         self.hilite.display = False
    146 
    147 
    148 class FighterHealthGaugeLine(VectorLineTrace):
    149     __notifyevents__ = ['OnUIScalingChange']
    150     demoCount = 0
    151     default_state = uiconst.UI_PICKCHILDREN
    152 
    153     def ApplyAttributes(self, attributes):
    154         VectorLineTrace.ApplyAttributes(self, attributes)
    155         self.dashSizeFactor = attributes.dashSizeFactor or 6.0
    156         self.startAngle = attributes.startAngle or math.radians(138)
    157         self.range = attributes.range or math.radians(265)
    158         self.radius = attributes.radius or 30
    159         self.lineWidth = attributes.lineWidth or 2.5
    160         self.gapEnds = attributes.gapEnds or True
    161         self.dashColors = attributes.dashColors or None
    162         self.PlotFighters()
    163         sm.RegisterNotify(self)
    164 
    165     def ClearFighters(self):
    166         self.dashColors = None
    167         self.Flush()
    168 
    169     def UpdateFighterColors(self, dashColors):
    170         self.dashColors = dashColors
    171         self.Flush()
    172         self.PlotFighters()
    173 
    174     def PlotFighters(self):
    175         if not self.dashColors:
    176             return
    177         dashCount = len(self.dashColors)
    178         circum = self.radius * self.range
    179         if self.gapEnds:
    180             gapStepRad = self.range / (dashCount * (self.dashSizeFactor + 1))
    181         else:
    182             gapStepRad = self.range / (dashCount * (self.dashSizeFactor + 1) - 1)
    183         dashStepRad = gapStepRad * self.dashSizeFactor
    184         pixelRad = self.range / circum
    185         centerOffset = self.radius + self.lineWidth * 0.5
    186         jointOffset = min(gapStepRad / 3, pixelRad / 2)
    187         rot = self.startAngle
    188         if self.gapEnds:
    189             rot += gapStepRad / 2
    190         for i, color in enumerate(self.dashColors):
    191             r, g, b, a = color
    192             point = (centerOffset + self.radius * cos(rot - jointOffset), centerOffset + self.radius * sin(rot - jointOffset))
    193             self.AddPoint(point, (r,
    194              g,
    195              b,
    196              0.0))
    197             point = (centerOffset + self.radius * cos(rot + jointOffset), centerOffset + self.radius * sin(rot + jointOffset))
    198             self.AddPoint(point, color)
    199             smoothRad = pixelRad * 4 + jointOffset
    200             while smoothRad < dashStepRad - jointOffset:
    201                 point = (centerOffset + self.radius * cos(rot + smoothRad), centerOffset + self.radius * sin(rot + smoothRad))
    202                 self.AddPoint(point, color)
    203                 smoothRad += pixelRad * 4
    204 
    205             rot += dashStepRad
    206             point = (centerOffset + self.radius * cos(rot - jointOffset), centerOffset + self.radius * sin(rot - jointOffset))
    207             self.AddPoint(point, color)
    208             point = (centerOffset + self.radius * cos(rot + jointOffset), centerOffset + self.radius * sin(rot + jointOffset))
    209             self.AddPoint(point, (r,
    210              g,
    211              b,
    212              0.0))
    213             rot += gapStepRad
    214 
    215         self.width = self.height = centerOffset * 2
    216 
    217     def OnUIScalingChange(self, *args):
    218         if not self.destroyed:
    219             self.Flush()
    220             self.PlotFighters()