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