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

squadronManagementCont.py (15496B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\inflight\squadrons\squadronManagementCont.py
      2 from carbon.common.lib.const import SEC
      3 from carbonui.primitives.container import Container
      4 from carbonui.primitives.fill import Fill
      5 import carbonui.const as uiconst
      6 from carbonui.primitives.sprite import Sprite
      7 from carbonui.util.color import Color
      8 from carbonui.control.buttonIcon import ButtonIcon
      9 from eve.client.script.ui.control.eveLabel import EveHeaderSmall, EveLabelSmall
     10 from eve.client.script.ui.control.gauge import Gauge
     11 from eve.client.script.ui.inflight.squadrons.fightersHealthGaugeCont import FightersHealthGauge
     12 from eve.client.script.ui.inflight.squadrons.shipFighterState import GetShipFighterState
     13 from eve.client.script.ui.inflight.squadrons.squadronManagementController import SquadronMgmtController
     14 from eve.common.script.mgt.fighterConst import TUBE_STATE_EMPTY, COLOR_BY_STATE, LABEL_BY_STATE, TUBE_STATE_RECALLING, TUBE_STATE_LAUNCHING, COLOR_INSPACE, COLOR_RETURNING, TUBE_STATE_READY, TUBE_STATE_INSPACE, COLOR_OPEN, TUBE_STATE_LANDING
     15 from fighters import SLOTNUMBER_BY_TUBEFLAG
     16 import gametime
     17 from localization import GetByLabel
     18 from carbonui.uicore import uicore
     19 from eve.client.script.ui.inflight.squadrons.squadronMenu import GetSquadronMenu
     20 
     21 class FighterLaunchControlCont(Container):
     22     default_height = 196
     23     default_width = 86
     24     default_align = uiconst.TOLEFT
     25 
     26     def ApplyAttributes(self, attributes):
     27         Container.ApplyAttributes(self, attributes)
     28         self.controller = SquadronMgmtController()
     29         self.shipFighterState = GetShipFighterState()
     30         self.tubeFlagID = attributes.tubeFlagID
     31         self.leftTube = Sprite(parent=self, texturePath='res:/UI/Texture/classes/CarrierBay/tubeSideElement.png', align=uiconst.TOLEFT_NOPUSH, width=15)
     32         self.rightTube = Sprite(parent=self, texturePath='res:/UI/Texture/classes/CarrierBay/tubeSideElementRIGHT.png', align=uiconst.TORIGHT_NOPUSH, width=15)
     33         inSpaceCont = Container(name='inSpaceCont', parent=self, height=86, align=uiconst.TOTOP)
     34         inSpaceCont.OnDropData = self.OnDropToSpace
     35         inSpaceCont.GetMenu = self.GetMenu
     36         self.squadronNumber = SquadronNumber(parent=inSpaceCont, top=1, left=1)
     37         self.squadronNumber.SetText(self.tubeFlagID)
     38         self.inStationCont = Container(parent=inSpaceCont, align=uiconst.TOALL)
     39         cantLaunchIcon = Sprite(parent=self.inStationCont, width=44, height=44, align=uiconst.CENTER, texturePath='res:/UI/Texture/classes/CarrierBay/unableToLaunch.png')
     40         self.stateCont = Container(name='stateCont', parent=self, height=24, align=uiconst.TOTOP, state=uiconst.UI_NORMAL)
     41         self.stateContBG = Fill(bgParent=self.stateCont, color=(0, 0, 0, 0))
     42         deckCont = Container(parent=self, height=86, align=uiconst.TOTOP, state=uiconst.UI_NORMAL)
     43         deckCont.OnDropData = self.OnDropToTube
     44         deckCont.GetMenu = self.GetMenu
     45         self.tubeStatusLabel = EveHeaderSmall(parent=self.stateCont, align=uiconst.CENTER, text='')
     46         self.loadingGauge = Gauge(parent=self.stateCont, align=uiconst.CENTERBOTTOM, backgroundColor=(0, 0, 0, 1), color=(0.2, 0.2, 0.2, 0.5), padLeft=1, padRight=1, top=1, width=75, value=0.0, useRealTime=False)
     47         self.loadingGauge.display = False
     48         spaceColor = Color(*COLOR_INSPACE)
     49         spaceColor.a = 1.0
     50         self.launchIcon = ButtonIcon(name='launchIcon', parent=inSpaceCont, align=uiconst.CENTER, width=86, height=86, iconSize=44, texturePath='res:/UI/Texture/classes/CarrierBay/tubeLaunch_Up.png', downTexture='res:/UI/Texture/classes/CarrierBay/tubeLaunch_Down.png', hoverTexture='res:/UI/Texture/classes/CarrierBay/tubeLaunch_Over.png', iconColor=spaceColor.GetRGBA(), showGlow=False, hint=GetByLabel('UI/Inventory/Fighters/LaunchFighterHint'))
     51         self.launchIcon.OnClick = self.LaunchFightersFromTube
     52         self.launchIcon.OnDropData = self.OnDropToSpace
     53         returnColor = Color(*COLOR_RETURNING)
     54         returnColor.a = 1.0
     55         self.scoopIcon = ButtonIcon(parent=deckCont, name='scoopIcon', align=uiconst.CENTER, width=86, height=86, iconSize=44, texturePath='res:/UI/Texture/classes/CarrierBay/tubeRecall_Up.png', downTexture='res:/UI/Texture/classes/CarrierBay/tubeRecall_Down.png', hoverTexture='res:/UI/Texture/classes/CarrierBay/tubeRecall_Over.png', iconColor=returnColor.GetRGBA(), showGlow=False, hint=GetByLabel('UI/Inventory/Fighters/RecallFighterHint'))
     56         self.scoopIcon.OnClick = self.RecallFighterToTube
     57         self.scoopIcon.OnDropData = self.OnDropToTube
     58         self.landingStrip = LandingStrip(parent=deckCont)
     59         self.landingStrip.display = False
     60         self.emptyTubeIcon = ButtonIcon(parent=deckCont, name='emptyTubeIcon', align=uiconst.CENTER, width=86, height=86, iconSize=44, texturePath='res:/UI/Texture/classes/CarrierBay/tubeOpen_Up.png', downTexture='res:/UI/Texture/classes/CarrierBay/tubeOpen_Down.png', hoverTexture='res:/UI/Texture/classes/CarrierBay/tubeOpen_Over.png', showGlow=False, hint=GetByLabel('UI/Inventory/Fighters/AddFighterHint'))
     61         self.emptyTubeIcon.OnDropData = self.OnDropToTube
     62         self.emptyTubeIcon.GetMenu = self.GetMenu
     63         self.squadronInSpace = FightersHealthGauge(name='squadronInSpace', parent=inSpaceCont, align=uiconst.CENTER, width=86, height=86, state=TUBE_STATE_INSPACE, tubeFlagID=self.tubeFlagID)
     64         self.squadronInSpace.display = False
     65         self.squadronInSpace.GetMenu = self.GetMenu
     66         self.squadronInTube = FightersHealthGauge(name='squadronInTube', parent=deckCont, align=uiconst.CENTER, width=86, height=86, state=TUBE_STATE_READY, tubeFlagID=self.tubeFlagID)
     67         self.squadronInTube.OnDropData = self.OnDropToTube
     68         self.squadronInTube.display = False
     69         self.squadronInTube.GetMenu = self.GetMenu
     70         self.launchingStrip = LaunchingStrip(parent=inSpaceCont)
     71         self.launchingStrip.display = False
     72         self.UpdateLaunchTubeContentUI()
     73         self.UpdateLaunchTubeStateUI()
     74         self.UpdateInSpaceUI()
     75         self.shipFighterState.signalOnFighterTubeStateUpdate.connect(self.OnFighterTubeStateUpdate)
     76         self.shipFighterState.signalOnFighterTubeContentUpdate.connect(self.OnFighterTubeContentUpdate)
     77         self.shipFighterState.signalOnFighterInSpaceUpdate.connect(self.OnFighterInSpaceUpdate)
     78         self.shipFighterState.signalOnShipLocationChange.connect(self.OnShipLocationChange)
     79 
     80     def Close(self):
     81         self.shipFighterState.signalOnFighterTubeStateUpdate.disconnect(self.OnFighterTubeStateUpdate)
     82         self.shipFighterState.signalOnFighterTubeContentUpdate.disconnect(self.OnFighterTubeContentUpdate)
     83         self.shipFighterState.signalOnFighterInSpaceUpdate.disconnect(self.OnFighterInSpaceUpdate)
     84         self.shipFighterState.signalOnShipLocationChange.disconnect(self.OnShipLocationChange)
     85 
     86     def LaunchFightersFromTube(self):
     87         self.controller.LaunchFightersFromTube(self.tubeFlagID)
     88 
     89     def RecallFighterToTube(self):
     90         fighterInSpace = self.shipFighterState.GetFightersInSpace(self.tubeFlagID)
     91         self.controller.RecallFighterToTube(fighterInSpace.itemID)
     92 
     93     def ReturnAndOrbit(self):
     94         fighterInSpace = self.shipFighterState.GetFightersInSpace(self.tubeFlagID)
     95         sm.GetService('fighters').CmdReturnAndOrbit([fighterInSpace.itemID])
     96 
     97     def OnDropToSpace(self, dragSource, dragData):
     98         data = dragData[0]
     99         if getattr(data, 'tubeFlagID', None) == self.tubeFlagID and getattr(data, 'squadronState', None) == TUBE_STATE_READY:
    100             self.LaunchFightersFromTube()
    101 
    102     def OnDropToTube(self, dragSource, dragData):
    103         data = dragData[0]
    104         guid = getattr(data, '__guid__', None)
    105         if guid == 'uicls.FightersHealthGauge':
    106             if data.tubeFlagID == self.tubeFlagID and data.squadronState == TUBE_STATE_INSPACE:
    107                 self.RecallFighterToTube()
    108         elif guid in ('xtriui.InvItem', 'listentry.InvItem'):
    109             tubeStatus = self.shipFighterState.GetTubeStatus(self.tubeFlagID)
    110             if tubeStatus.statusID in (TUBE_STATE_EMPTY, TUBE_STATE_READY):
    111                 fighterID = data.itemID
    112                 self.controller.LoadFightersToTube(fighterID, self.tubeFlagID)
    113 
    114     def UnloadTubeToFighterBay(self):
    115         self.controller.UnloadTubeToFighterBay(self.tubeFlagID)
    116 
    117     def UpdateLaunchTubeContentUI(self):
    118         fighterInTube = self.shipFighterState.GetFightersInTube(self.tubeFlagID)
    119         if fighterInTube is not None:
    120             self.squadronInTube.display = True
    121             if not ShouldShowDockedUI():
    122                 self.launchIcon.display = True
    123             self.scoopIcon.display = False
    124             self.landingStrip.display = False
    125             self.squadronInTube.LoadFighterToSquadron(fighterInTube.typeID)
    126             self.squadronInTube.SetSquadronSize(fighterInTube.squadronSize)
    127         else:
    128             self.squadronInTube.display = False
    129             self.launchIcon.display = False
    130 
    131     def ShowStationUI(self):
    132         self.inStationCont.display = True
    133         self.launchIcon.display = False
    134 
    135     def UpdateLaunchTubeStateUI(self):
    136         tubeStatus = self.shipFighterState.GetTubeStatus(self.tubeFlagID)
    137         self.UpdateStatusUI(tubeStatus)
    138         if tubeStatus.endTime:
    139             if tubeStatus.statusID in (TUBE_STATE_RECALLING, TUBE_STATE_LANDING):
    140                 self.landingStrip.display = True
    141                 self.scoopIcon.display = False
    142             elif tubeStatus.statusID == TUBE_STATE_LAUNCHING:
    143                 self.launchingStrip.display = True
    144                 self.launchIcon.display = False
    145             else:
    146                 self.loadingGauge.display = True
    147                 now = gametime.GetSimTime()
    148                 duration = float(tubeStatus.endTime - tubeStatus.startTime)
    149                 loadingProgress = max(0.0, min(1.0, (now - tubeStatus.startTime) / duration))
    150                 self.loadingGauge.SetValue(loadingProgress, animate=False)
    151                 remainingTime = tubeStatus.endTime - now
    152                 remainingTimeSeconds = max(float(remainingTime) / SEC, 0.1)
    153                 self.loadingGauge.SetValueTimed(1.0, remainingTimeSeconds)
    154                 self.tubeStatusLabel.top = -2
    155         else:
    156             self.loadingGauge.SetValue(0)
    157             self.loadingGauge.display = False
    158             self.landingStrip.display = False
    159             self.launchingStrip.display = False
    160             self.tubeStatusLabel.top = 0
    161         if tubeStatus.statusID == TUBE_STATE_EMPTY:
    162             self.emptyTubeIcon.display = True
    163             self.scoopIcon.display = False
    164             self.squadronNumber.SetColor(True)
    165         else:
    166             self.emptyTubeIcon.display = False
    167             self.squadronNumber.SetColor(False)
    168 
    169     def UpdateStatusUI(self, tubeStatus):
    170         stateText = LABEL_BY_STATE[tubeStatus.statusID]
    171         self.tubeStatusLabel.text = GetByLabel(stateText)
    172         if ShouldShowDockedUI():
    173             stateColor = Color(*COLOR_OPEN)
    174         else:
    175             stateColor = Color(*COLOR_BY_STATE[tubeStatus.statusID])
    176         self.leftTube.SetRGBA(*stateColor.GetRGBA())
    177         self.rightTube.SetRGBA(*stateColor.GetRGBA())
    178         stateColor.a = 0.8
    179         self.tubeStatusLabel.SetTextColor(stateColor.GetRGBA())
    180         self.loadingGauge.SetColor(stateColor.GetRGBA())
    181 
    182     def UpdateInSpaceUI(self):
    183         if ShouldShowDockedUI():
    184             self.ShowStationUI()
    185             return
    186         self.inStationCont.display = False
    187         fighterInSpace = self.shipFighterState.GetFightersInSpace(self.tubeFlagID)
    188         if fighterInSpace is not None:
    189             self.scoopIcon.display = True
    190             self.squadronInSpace.display = True
    191             self.squadronInSpace.LoadFighterToSquadron(fighterInSpace.typeID)
    192             self.squadronInSpace.SetSquadronSize(fighterInSpace.squadronSize)
    193         else:
    194             self.scoopIcon.display = False
    195             self.squadronInSpace.display = False
    196 
    197     def GetMenu(self):
    198         return GetSquadronMenu(self)
    199 
    200     def OnFighterTubeStateUpdate(self, tubeFlagID):
    201         if tubeFlagID == self.tubeFlagID:
    202             self.UpdateLaunchTubeStateUI()
    203 
    204     def OnFighterTubeContentUpdate(self, tubeFlagID):
    205         if tubeFlagID == self.tubeFlagID:
    206             self.UpdateLaunchTubeContentUI()
    207 
    208     def OnFighterInSpaceUpdate(self, fighterID, tubeFlagID):
    209         if tubeFlagID == self.tubeFlagID:
    210             self.UpdateInSpaceUI()
    211 
    212     def OnShipLocationChange(self):
    213         self.UpdateLaunchTubeContentUI()
    214         self.UpdateLaunchTubeStateUI()
    215         self.UpdateInSpaceUI()
    216 
    217     def LoadFighterToTube(self, fighterID):
    218         self.controller.LoadFightersToTube(fighterID, self.tubeFlagID)
    219 
    220     def AbandonFighter(self):
    221         fighterInSpace = self.shipFighterState.GetFightersInSpace(self.tubeFlagID)
    222         sm.GetService('fighters').AbandonFighter(fighterInSpace.itemID)
    223 
    224 
    225 class StripCont(Container):
    226     default_height = 86
    227     default_width = 86
    228     default_align = uiconst.TOPLEFT
    229     default_lightTexture = None
    230     default_gradientTexture = None
    231     default_startVal = (0.0, -1.0)
    232     default_endVal = (0.0, 1.0)
    233     default_textureAlign = uiconst.CENTERTOP
    234 
    235     def ApplyAttributes(self, attributes):
    236         Container.ApplyAttributes(self, attributes)
    237         stripHeight = 9
    238         top = 6
    239         for i in xrange(8):
    240             sprite = Sprite(parent=self, align=self.default_textureAlign, width=35, height=stripHeight, top=top, texturePath=self.default_lightTexture, state=uiconst.UI_DISABLED)
    241             offset = 0.1 * i
    242             uicore.animations.SpMaskTo(sprite, startVal=self.default_startVal, endVal=self.default_endVal, texturePath=self.default_gradientTexture, duration=1.0, loops=uiconst.ANIM_REPEAT, timeOffset=offset)
    243             top += stripHeight
    244 
    245 
    246 class LandingStrip(StripCont):
    247     default_lightTexture = 'res:/UI/Texture/classes/CarrierBay/animLightsLanding.png'
    248     default_gradientTexture = 'res:/UI/Texture/Classes/Animations/maskToGradientDown.png'
    249     default_startVal = (0.0, -1.0)
    250     default_endVal = (0.0, 1.0)
    251     default_textureAlign = uiconst.CENTERTOP
    252 
    253 
    254 class LaunchingStrip(StripCont):
    255     default_lightTexture = 'res:/UI/Texture/classes/CarrierBay/animLightsLaunch.png'
    256     default_gradientTexture = 'res:/UI/Texture/Classes/Animations/maskToGradientUp.png'
    257     default_startVal = (0.0, 1.0)
    258     default_endVal = (0.0, -1.0)
    259     default_textureAlign = uiconst.CENTERBOTTOM
    260 
    261 
    262 class SquadronNumber(Container):
    263     default_width = 14
    264     default_height = 14
    265     default_align = uiconst.TOPLEFT
    266 
    267     def ApplyAttributes(self, attributes):
    268         Container.ApplyAttributes(self, attributes)
    269         self.squadNrText = EveLabelSmall(parent=self, left=4, top=2)
    270         self.squadNrSprite = Sprite(parent=self, align=uiconst.TOPLEFT, texturePath='res:/UI/Texture/classes/ShipUI/Fighters/squadNumberFlag.png', pos=(1, 1, 14, 14))
    271 
    272     def SetText(self, tubeFlagID):
    273         squadronNumber = SLOTNUMBER_BY_TUBEFLAG[tubeFlagID]
    274         self.squadNrText.text = squadronNumber
    275 
    276     def SetColor(self, isEmpty = False):
    277         if isEmpty or ShouldShowDockedUI():
    278             self.squadNrSprite.color = (0.5, 0.5, 0.5, 0.5)
    279         else:
    280             self.squadNrSprite.color = COLOR_INSPACE
    281             self.squadNrSprite.SetAlpha(0.7)
    282 
    283 
    284 def ShouldShowDockedUI():
    285     if session.stationid:
    286         return True
    287     if session.structureid and session.shipid != session.structureid:
    288         return True
    289     return False