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