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

sovHubEntryController.py (20572B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\shared\neocom\Alliances\sovHubs\sovHubEntryController.py
      2 import eveformat
      3 import eveicon
      4 import locks
      5 from carbon.common.script.util.format import FmtAmt
      6 from eve.client.script.ui import eveColor
      7 from eve.client.script.ui.shared.sov.sovHub.sovHubWnd import OpenSovHubWnd
      8 from signals import Signal
      9 from sovereignty.client.quasarCallWrapper import DATA_NOT_AVAILABLE
     10 from localization import GetByLabel
     11 from sovDashboard import CalculateStructureStatusCampaignStateAndVulnerability, dashboardConst, CalculateStructureStatusFromStructureInfo, GetStructureStatusString
     12 import inventorycommon.const as invConst
     13 from sovereignty.client.sovHub.dataTypes import UpgradeData
     14 from sovereignty.client.sovHub.hubUtil import GetTimeLeftTextForTypeID, GetFuelStatus, GetHoursLeftProgress, GetTexturePathForWorkforceMode, GetStartupCostForPendingUpgrades, GetWorkforceProductionForUpgrades
     15 from sovereignty.workforce import workforceConst
     16 from sovereignty.workforce.client.workforceController import WorkforceController
     17 from sovereignty.workforce.workforceConst import LABELPATH_BY_MODE
     18 UNDEFINED = 'undefinedValue'
     19 
     20 class ValueStorage(object):
     21 
     22     def __init__(self):
     23         self.upgradeTextLong = UNDEFINED
     24         self.upgradeTextShort = UNDEFINED
     25         self.upgradeSortValue = UNDEFINED
     26         self.powerText = UNDEFINED
     27         self.powerSortValue = UNDEFINED
     28         self.workforceColumnText = UNDEFINED
     29         self.workforceSortValue = UNDEFINED
     30         self.workforceText = UNDEFINED
     31         self.worceforceMode = UNDEFINED
     32         self.iceText = UNDEFINED
     33         self.lavaText = UNDEFINED
     34         self.installedUpgrades = UNDEFINED
     35         self.availableResources = UNDEFINED
     36         self.allReagentsByTypeID = UNDEFINED
     37         self.workforceState = UNDEFINED
     38 
     39 
     40 class SovHubEntryController(object):
     41 
     42     def __init__(self, itemID, typeID, solarSystemID, campaignState, vulnerabilityState, sovHubInfo, quasarCallWrapper):
     43         self.sovereigntyResourceSvc = sm.GetService('sovereigntyResourceSvc')
     44         self.quasarCallWrapper = quasarCallWrapper
     45         self._itemID = itemID
     46         self._typeID = typeID
     47         self._solarSystemID = solarSystemID
     48         self._constellationID = None
     49         self._regionID = None
     50         self._campaignState = campaignState
     51         self._sovHubInfo = sovHubInfo
     52         self._vulnerabilityState = vulnerabilityState
     53         self.workforceController = WorkforceController(self.itemID, self.quasarCallWrapper, solarSystemID)
     54         self.valueStorage = ValueStorage()
     55         self.on_legend_moused_over = Signal(signalName='on_legend_moused_over')
     56 
     57     @property
     58     def itemID(self):
     59         return self._itemID
     60 
     61     @property
     62     def typeID(self):
     63         return self._typeID
     64 
     65     @property
     66     def solarSystemID(self):
     67         return self._solarSystemID
     68 
     69     @property
     70     def regionID(self):
     71         if self._regionID is None:
     72             self._regionID = cfg.mapSystemCache.Get(self._solarSystemID).regionID
     73         return self._regionID
     74 
     75     @property
     76     def constellationID(self):
     77         if self._constellationID is None:
     78             self._constellationID = cfg.mapSystemCache.Get(self._solarSystemID).regionID
     79         return self._constellationID
     80 
     81     @property
     82     def sovHubInfo(self):
     83         return self._sovHubInfo
     84 
     85     @property
     86     def vulnerabilityState(self):
     87         return self._vulnerabilityState
     88 
     89     def GetJumpText(self):
     90         return self.GetNumJumps()
     91 
     92     def GetNumJumps(self):
     93         return sm.GetService('clientPathfinderService').GetJumpCountFromCurrent(self._solarSystemID)
     94 
     95     def GetStructureName(self):
     96         return self.GetSolarSystemName()
     97 
     98     def GetTexturePath(self):
     99         return eveicon.sov_hub
    100 
    101     def GetSolarSystemName(self):
    102         return cfg.evelocations.Get(self._solarSystemID).name
    103 
    104     def GetRegionName(self):
    105         return cfg.evelocations.Get(self.regionID).name
    106 
    107     def GetVulnerabilityStateText(self):
    108         structureStatus = CalculateStructureStatusCampaignStateAndVulnerability(self._campaignState, self.vulnerabilityState)
    109         if structureStatus == dashboardConst.STATUS_VULNERABLE:
    110             return GetByLabel('UI/Sovereignty/Status/VulnerableNowType', typeName='')
    111         if structureStatus == dashboardConst.STATUS_VULNERABLE_OVERTIME:
    112             return GetByLabel('UI/Sovereignty/Status/VulnerableType', typeName='')
    113         if structureStatus == dashboardConst.STATUS_REINFORCED:
    114             return GetByLabel('UI/Sovereignty/Status/ReinforcedType', typeName='')
    115         if structureStatus == dashboardConst.STATUS_INVULNERABLE:
    116             return GetByLabel('UI/Sovereignty/Status/InvulnerableType', typeName='')
    117         if structureStatus == dashboardConst.STATUS_NODEFIGHT:
    118             return GetByLabel('UI/Sovereignty/Status/ContestedType', typeName='')
    119         return '-'
    120 
    121     def GetHubName(self):
    122         return GetByLabel('UI/Sovereignty/SovHub/HubWnd/SovHubName', solarSystemName=self.GetSolarSystemName())
    123 
    124     def GetLocation(self):
    125         return '%s > %s > %s' % (cfg.evelocations.Get(self.regionID).name, cfg.evelocations.Get(self.constellationID).name, self.GetSolarSystemName())
    126 
    127     def OpenSovHubWindow(self):
    128         OpenSovHubWnd(self._itemID, self._solarSystemID)
    129 
    130     def GetNumSkyhooks(self):
    131         allCorpSkyhooks = sm.GetService('sovereigntyResourceSvc').GetMyCorporationSkyhooksMemoized()
    132         return len([ x for x in allCorpSkyhooks if x.solarSystemID == self.solarSystemID ])
    133 
    134     def GetVulnerabilityTime(self):
    135         currentStatus = CalculateStructureStatusFromStructureInfo(self.sovHubInfo)
    136         textColor = dashboardConst.PRIMARYCOLOR_BY_STATUS.get(currentStatus)
    137         self.color = textColor
    138         _, timeString = GetStructureStatusString(self.sovHubInfo, getTimeString=True)
    139         timeString = timeString.replace('<br>', ' ')
    140         return timeString
    141 
    142     def GetLockName(self, functionName):
    143         return 'HubPage_%s_%s' % (self.itemID, functionName)
    144 
    145     def GetUpgradesTextLong(self):
    146         if self.valueStorage.upgradeTextLong != UNDEFINED:
    147             return self.valueStorage.upgradeTextLong
    148         text = self._GetUpgradesText(longText=True)
    149         self.valueStorage.upgradeTextLong = text
    150         return text
    151 
    152     def GetUpgradesTextShort(self):
    153         if self.valueStorage.upgradeTextShort != UNDEFINED:
    154             return self.valueStorage.upgradeTextShort
    155         text = self._GetUpgradesText(longText=False)
    156         self.valueStorage.upgradeTextShort = text
    157         return text
    158 
    159     def _GetUpgradesText(self, longText):
    160         installedUpgrades = self.GetInstalledUpgrades()
    161         if installedUpgrades == DATA_NOT_AVAILABLE:
    162             return self.GetNotAvailableText()
    163         numOnline = len([ x for x in installedUpgrades if x.isPowerStateFunctional ])
    164         self.valueStorage.upgradeSortValue = (numOnline, len(installedUpgrades))
    165         if longText:
    166             text = GetByLabel('UI/Sovereignty/HubPage/NumUpgradesOnline', online=numOnline, installed=len(installedUpgrades))
    167         else:
    168             text = GetByLabel('UI/Sovereignty/HubPage/NumUpgradesOnlineShort', online=numOnline, installed=len(installedUpgrades))
    169         return text
    170 
    171     def GetInstalledUpgrades(self):
    172         self.PrimeInstalledUpgrades()
    173         return self.valueStorage.installedUpgrades
    174 
    175     def GetPowerAllocated(self):
    176         availableResources = self._GetAvailableResources()
    177         if availableResources == DATA_NOT_AVAILABLE:
    178             return DATA_NOT_AVAILABLE
    179         return availableResources.power_allocated
    180 
    181     def GetPowerAllocatedText(self):
    182         availablePower = self.GetPowerAllocated()
    183         if availablePower == DATA_NOT_AVAILABLE:
    184             self.valueStorage.powerText = self.GetNotAvailableText()
    185         else:
    186             return FmtAmt(availablePower)
    187 
    188     def GetPowerColumnText(self):
    189         if self.valueStorage.powerText != UNDEFINED:
    190             return self.valueStorage.powerText
    191         availablePower = self.GetTotalAvailablePower()
    192         maxPower = self.GetTotalMaxPower()
    193         if availablePower == DATA_NOT_AVAILABLE:
    194             self.valueStorage.powerSortValue = DATA_NOT_AVAILABLE
    195             self.valueStorage.powerText = self.GetNotAvailableText()
    196         else:
    197             self.valueStorage.powerSortValue = (availablePower, maxPower)
    198             self.valueStorage.powerText = '%s/%s' % (availablePower, maxPower)
    199         return self.valueStorage.powerText
    200 
    201     def GetWorkforceColumnText(self):
    202         if self.valueStorage.workforceColumnText != UNDEFINED:
    203             return self.valueStorage.workforceColumnText
    204         availableWorkforce = self.GetTotalAvailableWorkforce()
    205         maxWorkforce = self.GetTotalMaxWorkforce()
    206         if availableWorkforce == DATA_NOT_AVAILABLE:
    207             self.valueStorage.workforceSortValue = DATA_NOT_AVAILABLE
    208             self.valueStorage.workforceColumnText = self.GetNotAvailableText()
    209         else:
    210             self.valueStorage.workforceSortValue = (availableWorkforce, maxWorkforce)
    211             self.valueStorage.workforceColumnText = '%s/%s' % (availableWorkforce, maxWorkforce)
    212         return self.valueStorage.workforceColumnText
    213 
    214     def GetWorkforce(self):
    215         availableResources = self._GetAvailableResources()
    216         if availableResources == DATA_NOT_AVAILABLE:
    217             return DATA_NOT_AVAILABLE
    218         return availableResources.workforce_allocated
    219 
    220     def GetWorkforceText(self):
    221         if self.valueStorage.workforceText != UNDEFINED:
    222             return self.valueStorage.workforceText
    223         workforce = self.GetWorkforce()
    224         if workforce == DATA_NOT_AVAILABLE:
    225             self.valueStorage.workforceText = self.GetNotAvailableText()
    226             self.valueStorage.workforceSortValue = DATA_NOT_AVAILABLE
    227         else:
    228             self.valueStorage.workforceText = FmtAmt(workforce)
    229             self.valueStorage.workforceSortValue = workforce
    230         return self.valueStorage.workforceText
    231 
    232     def _GetAvailableResources(self):
    233         self.PrimeAvailableResources()
    234         return self.valueStorage.availableResources
    235 
    236     def GetIceFuelLabel(self):
    237         return self.GetTimeLeftTextForAllConfiguredOnline(invConst.typeColonyReagentIce)
    238 
    239     def GetLavaFuelLabel(self):
    240         return self.GetTimeLeftTextForAllConfiguredOnline(invConst.typeColonyReagentLava)
    241 
    242     def GetTransitMode(self):
    243         if self.valueStorage.worceforceMode != UNDEFINED:
    244             return self.valueStorage.worceforceMode
    245         self.PrimeWorkforceState()
    246         workforceState = self.valueStorage.workforceState
    247         if workforceState == DATA_NOT_AVAILABLE:
    248             self.valueStorage.worceforceMode = DATA_NOT_AVAILABLE
    249             return self.valueStorage.worceforceMode
    250         mode = workforceState.get_mode()
    251         hintList = [GetByLabel(LABELPATH_BY_MODE.get(mode, ''))]
    252         if mode == workforceConst.MODE_IMPORT:
    253             importState = workforceState.import_state
    254             for iSystemID, iAmount in importState.amount_by_source_system_id.iteritems():
    255                 amountText = iAmount
    256                 if not iAmount:
    257                     amountText = eveformat.color(amountText, eveColor.DANGER_RED_HEX)
    258                 systemNameAndAmount = ' - %s (%s)' % (cfg.evelocations.Get(iSystemID).name, amountText)
    259                 hintList.append(systemNameAndAmount)
    260 
    261         if mode == workforceConst.MODE_EXPORT:
    262             exportState = workforceState.export_state
    263             destID = exportState.destination_system_id
    264             amountText = exportState.amount
    265             if not exportState.amount:
    266                 amountText = eveformat.color(amountText, eveColor.DANGER_RED_HEX)
    267             if destID:
    268                 systemName = cfg.evelocations.Get(destID).name
    269             else:
    270                 systemName = GetByLabel('UI/Sovereignty/HubPage/NotAvailable', color=eveColor.DANGER_RED)
    271             systemNameAndAmount = ' - %s (%s)' % (systemName, amountText)
    272             hintList.append(systemNameAndAmount)
    273         texturePath = GetTexturePathForWorkforceMode(mode)
    274         hintText = '<br>'.join(hintList)
    275         self.valueStorage.worceforceMode = (texturePath, hintText, None)
    276         return self.valueStorage.worceforceMode
    277 
    278     def GetOriginalPower(self):
    279         pass
    280 
    281     def GetAvailablePower(self):
    282         availableResources = self._GetAvailableResources()
    283         if availableResources == DATA_NOT_AVAILABLE:
    284             return DATA_NOT_AVAILABLE
    285         return availableResources.power_available
    286 
    287     def GetTotalMaxPower(self):
    288         return self.maxPower + self.GetPowerProduction()
    289 
    290     def GetTotalAvailablePower(self):
    291         return self.GetAvailablePower() + self.GetPowerProduction()
    292 
    293     def GetTotalAvailablePowerText(self):
    294         available = self.GetTotalAvailablePower()
    295         if available == DATA_NOT_AVAILABLE:
    296             return self.GetNotAvailableText()
    297         return FmtAmt(available)
    298 
    299     def GetSimulatedPowerProduction(self):
    300         return self.GetPowerProduction()
    301 
    302     def GetLocalWorkforce(self):
    303         availableResources = self._GetAvailableResources()
    304         if availableResources == DATA_NOT_AVAILABLE:
    305             return DATA_NOT_AVAILABLE
    306         return availableResources.workforce_local_harvest
    307 
    308     def GetPowerLowStateUpgrades(self):
    309         return None
    310 
    311     @property
    312     def maxPower(self):
    313         maxPower, _ = self.sovereigntyResourceSvc.GetMaxPowerAndWorkforce(self._solarSystemID)
    314         return maxPower
    315 
    316     def GetPowerProduction(self):
    317         installedUpgrades = self.GetInstalledUpgrades()
    318         generated = 0
    319         for upgrade in installedUpgrades:
    320             if upgrade.staticData.power_produced <= 0:
    321                 continue
    322             if upgrade.isPowerStateFunctional:
    323                 generated += upgrade.staticData.power_produced
    324 
    325         return generated
    326 
    327     @property
    328     def maxWorkforce(self):
    329         _, maxWorkforce = self.sovereigntyResourceSvc.GetMaxPowerAndWorkforce(self._solarSystemID)
    330         return maxWorkforce
    331 
    332     def GetOriginalWorkforce(self):
    333         pass
    334 
    335     def GetTotalAvailableWorkforce(self):
    336         availableResources = self._GetAvailableResources()
    337         if availableResources == DATA_NOT_AVAILABLE:
    338             return 0
    339         return availableResources.workforce_available + self.GetWorkforceProduction()
    340 
    341     def GetTotalAvailableWorkforceText(self):
    342         return FmtAmt(self.GetTotalAvailableWorkforce())
    343 
    344     def GetWorkforceProduction(self):
    345         installedUpgrades = self.GetInstalledUpgrades()
    346         generated = 0
    347         for upgrade in installedUpgrades:
    348             if upgrade.staticData.workforce_produced <= 0:
    349                 continue
    350             if upgrade.isPowerStateFunctional:
    351                 generated += upgrade.staticData.workforce_produced
    352 
    353         return generated
    354 
    355     def GetTotalMaxWorkforce(self):
    356         return self.GetMaxSystemWorkforce() + self.GetWorkforceProduction() + self.GetImportedValue()
    357 
    358     def GetMaxSystemWorkforce(self):
    359         return self.maxWorkforce
    360 
    361     def GetSimulatedWorkforceProduction(self):
    362         return self.GetWorkforceProduction()
    363 
    364     def GetImportedValue(self):
    365         self.PrimeWorkforceState()
    366         return self.workforceController.GetImportedWorkforceFromState()
    367 
    368     def GetExportedValue(self):
    369         self.PrimeWorkforceState()
    370         return self.workforceController.GetExportedWorkforceFromState()
    371 
    372     def GetWorkforceAddition(self):
    373         return -self.GetImportedValue() or self.GetExportedValue()
    374 
    375     def GetImportedValueTextAndHint(self):
    376         imported = self.GetImportedValue()
    377         if not imported:
    378             return ('', '')
    379         return (eveformat.color('+%s' % FmtAmt(imported), eveColor.SUCCESS_GREEN_HEX), '')
    380 
    381     def GetWorkforceLowStateUpgrades(self):
    382         return None
    383 
    384     def GetLavaText(self):
    385         if self.valueStorage.lavaText != UNDEFINED:
    386             return self.valueStorage.lavaText
    387         self.valueStorage.lavaText = self.GetLavaFuelLabel()
    388         return self.valueStorage.lavaText
    389 
    390     def GetIceText(self):
    391         if self.valueStorage.iceText != UNDEFINED:
    392             return self.valueStorage.iceText
    393         self.valueStorage.iceText = self.GetIceFuelLabel()
    394         return self.valueStorage.iceText
    395 
    396     def GetTimeLeftForTypeID(self, typeID):
    397         fuel = self.GetReagentForTypeID(typeID)
    398         if not fuel or fuel == DATA_NOT_AVAILABLE or not fuel.burned_per_hour:
    399             return
    400         return float(fuel.amount_now) / fuel.burned_per_hour
    401 
    402     def GetTimeLeftProgressForTypeID(self, typeID):
    403         hoursLeft = self.GetTimeLeftForTypeID(typeID)
    404         return GetHoursLeftProgress(hoursLeft)
    405 
    406     def GetTimeLeftTextForAllConfiguredOnline(self, typeID):
    407         fuel = self.GetReagentForTypeID(typeID)
    408         if not fuel:
    409             return GetByLabel('UI/Sovereignty/HubPage/FuelDepleted')
    410         if fuel == DATA_NOT_AVAILABLE:
    411             return self.GetNotAvailableText()
    412         installedUpgrade = self.GetInstalledUpgrades()
    413         fuelAmount = fuel.amount_now
    414         startupCost = GetStartupCostForPendingUpgrades(installedUpgrade, typeID)
    415         if startupCost > fuelAmount:
    416             return GetByLabel('UI/Sovereignty/HubPage/FuelDepleted')
    417         return GetFuelStatus(installedUpgrade, typeID, fuelAmount)
    418 
    419     def GetTimeLeftTextForTypeID(self, reagentTypeID):
    420         hoursLeft = self.GetTimeLeftForTypeID(reagentTypeID)
    421         return GetTimeLeftTextForTypeID(hoursLeft)
    422 
    423     def GetReagentForTypeID(self, typeID):
    424         self.PrimeAllReagentsByTypeForItem()
    425         reagentsByTypeID = self.valueStorage.allReagentsByTypeID
    426         if reagentsByTypeID == DATA_NOT_AVAILABLE:
    427             return DATA_NOT_AVAILABLE
    428         return reagentsByTypeID.get(typeID, None)
    429 
    430     def GetReagentConsumptionForTypeID(self, typeID):
    431         fuel = self.GetReagentForTypeID(typeID)
    432         if fuel == DATA_NOT_AVAILABLE:
    433             return DATA_NOT_AVAILABLE
    434         elif fuel:
    435             return fuel.burned_per_hour
    436         else:
    437             return 0
    438 
    439     def GetStartupCostForTypeID(self, typeID):
    440         pass
    441 
    442     def GetNotAvailableText(self):
    443         return GetByLabel('UI/Sovereignty/HubPage/NotAvailable', color=eveColor.GUNMETAL_HEX)
    444 
    445     def PrimeInstalledUpgrades(self):
    446         if self.valueStorage.installedUpgrades != UNDEFINED:
    447             return self.valueStorage.installedUpgrades
    448         with locks.TempLock(self.GetLockName('PrimeInstalledUpgrades')):
    449             if self.valueStorage.installedUpgrades != UNDEFINED:
    450                 return self.valueStorage.installedUpgrades
    451             self.valueStorage.installedUpgrades = self._PrimeInstalledUpgrades()
    452 
    453     def _PrimeInstalledUpgrades(self):
    454         installedUpgrades = self.quasarCallWrapper.GetInstalledUpgradesForHub(self._itemID)
    455         if installedUpgrades == DATA_NOT_AVAILABLE:
    456             return DATA_NOT_AVAILABLE
    457         upgradeDataList = [ UpgradeData.create_from_installed_upgrade_data(x, sm.GetService('sovHubSvc')) for x in installedUpgrades ]
    458         return upgradeDataList
    459 
    460     def PrimeAvailableResources(self):
    461         if self.valueStorage.availableResources != UNDEFINED:
    462             return self.valueStorage.availableResources
    463         with locks.TempLock(self.GetLockName('PrimeAvailableResources')):
    464             if self.valueStorage.availableResources != UNDEFINED:
    465                 return self.valueStorage.availableResources
    466             self.valueStorage.availableResources = self.quasarCallWrapper.GetAvailableHubResources(self._itemID)
    467 
    468     def PrimeAllReagentsByTypeForItem(self):
    469         if self.valueStorage.allReagentsByTypeID != UNDEFINED:
    470             return self.valueStorage.allReagentsByTypeID
    471         with locks.TempLock(self.GetLockName('PrimeAllReagentsByTypeForItem')):
    472             if self.valueStorage.allReagentsByTypeID != UNDEFINED:
    473                 return self.valueStorage.allReagentsByTypeID
    474             self.valueStorage.allReagentsByTypeID = self.quasarCallWrapper.GetReagentsByTypeID(self._itemID)
    475 
    476     def PrimeWorkforceState(self):
    477         if self.valueStorage.workforceState != UNDEFINED:
    478             return self.valueStorage.workforceState
    479         with locks.TempLock(self.GetLockName('PrimeWorkforceState')):
    480             if self.valueStorage.workforceState != UNDEFINED:
    481                 return self.valueStorage.workforceState
    482             workforceState = self.quasarCallWrapper.GetWorkforceState(self.itemID)
    483             self.workforceController.workforceState = workforceState
    484             self.valueStorage.workforceState = workforceState