From ae1a5f4e4457a11071f6456bf553a0eb20abfab5 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Fri, 16 Aug 2019 23:58:07 +0300 Subject: [PATCH] Rework various RR-related functionality to use new API --- eos/saveddata/drone.py | 56 +++++++---------- eos/saveddata/fit.py | 16 ++--- eos/saveddata/module.py | 65 ++++---------------- gui/builtinStatsViews/outgoingViewFull.py | 24 ++++---- gui/builtinStatsViews/outgoingViewMinimal.py | 24 ++++---- gui/builtinViewColumns/misc.py | 31 +++++++--- 6 files changed, 84 insertions(+), 132 deletions(-) diff --git a/eos/saveddata/drone.py b/eos/saveddata/drone.py index 4ea2da18a..72c4aa901 100644 --- a/eos/saveddata/drone.py +++ b/eos/saveddata/drone.py @@ -69,7 +69,6 @@ class Drone(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): self.__charge = None self.__baseVolley = None self.__baseRRAmount = None - self.__baseRemoteReps = None self.__miningyield = None self.__itemModifiedAttributes = ModifiedAttributeDict() self.__itemModifiedAttributes.original = self.__item.attributes @@ -191,47 +190,36 @@ class Drone(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): armorAmount = self.getModifiedItemAttr("armorDamageAmount", 0) shieldAmount = self.getModifiedItemAttr("shieldBonus", 0) if shieldAmount: - self.__baseRRAmount[0] = RRTypes(shield=shieldAmount, armor=0, hull=0, capacitor=0) + self.__baseRRAmount[0] = RRTypes( + shield=shieldAmount * self.amountActive, + armor=0, hull=0, capacitor=0) if armorAmount or hullAmount: - self.__baseRRAmount[self.cycleTime] = RRTypes(shield=shieldAmount, armor=0, hull=0, capacitor=0) + self.__baseRRAmount[self.cycleTime] = RRTypes( + shield=0, armor=armorAmount * self.amountActive, + hull=hullAmount * self.amountActive, capacitor=0) return self.__baseRRAmount + def getRemoteReps(self, ignoreState=False): + rrDuringCycle = RRTypes(0, 0, 0, 0) + cycleParams = self.getCycleParameters() + if cycleParams is None: + return rrDuringCycle + repAmountParams = self.getRepAmountParameters() + avgCycleTime = cycleParams.averageTime + if len(repAmountParams) == 0 or avgCycleTime == 0: + return rrDuringCycle + for rrAmount in repAmountParams.values(): + rrDuringCycle += rrAmount + rrFactor = 1 / (avgCycleTime / 1000) + rrDuringCycle *= rrFactor + return rrDuringCycle + def getCycleParameters(self, reloadOverride=None): cycleTime = self.cycleTime if cycleTime == 0: return None return CycleInfo(self.cycleTime, 0, math.inf) - def getRemoteReps(self, ignoreState=False): - if self.amountActive <= 0 and not ignoreState: - return (None, 0) - if self.__baseRemoteReps is None: - rrShield = self.getModifiedItemAttr("shieldBonus", 0) - rrArmor = self.getModifiedItemAttr("armorDamageAmount", 0) - rrHull = self.getModifiedItemAttr("structureDamageAmount", 0) - if rrShield: - rrType = "Shield" - rrAmount = rrShield - elif rrArmor: - rrType = "Armor" - rrAmount = rrArmor - elif rrHull: - rrType = "Hull" - rrAmount = rrHull - else: - rrType = None - rrAmount = 0 - if rrAmount: - droneAmount = self.amount if ignoreState else self.amountActive - cycleParams = self.getCycleParameters() - if cycleParams is None: - rrType = None - rrAmount = 0 - else: - rrAmount *= droneAmount / (cycleParams.averageTime / 1000) - self.__baseRemoteReps = (rrType, rrAmount) - return self.__baseRemoteReps - @property def miningStats(self): if self.__miningyield is None: @@ -292,7 +280,7 @@ class Drone(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): def clear(self): self.__baseVolley = None - self.__baseRemoteReps = None + self.__baseRRAmount = None self.__miningyield = None self.itemModifiedAttributes.clear() self.chargeModifiedAttributes.clear() diff --git a/eos/saveddata/fit.py b/eos/saveddata/fit.py index 081f816a3..4679b1631 100644 --- a/eos/saveddata/fit.py +++ b/eos/saveddata/fit.py @@ -36,7 +36,7 @@ from eos.saveddata.character import Character from eos.saveddata.citadel import Citadel from eos.saveddata.module import Module from eos.saveddata.ship import Ship -from eos.utils.stats import DmgTypes +from eos.utils.stats import DmgTypes, RRTypes pyfalog = Logger(__name__) @@ -1291,21 +1291,13 @@ class Fit: def getRemoteReps(self, spoolOptions=None): if spoolOptions not in self.__remoteRepMap: - remoteReps = {} + remoteReps = RRTypes(0, 0, 0, 0) for module in self.modules: - rrType, rrAmount = module.getRemoteReps(spoolOptions=spoolOptions) - if rrType: - if rrType not in remoteReps: - remoteReps[rrType] = 0 - remoteReps[rrType] += rrAmount + remoteReps += module.getRemoteReps(spoolOptions=spoolOptions) for drone in self.drones: - rrType, rrAmount = drone.getRemoteReps() - if rrType: - if rrType not in remoteReps: - remoteReps[rrType] = 0 - remoteReps[rrType] += rrAmount + remoteReps += drone.getRemoteReps() self.__remoteRepMap[spoolOptions] = remoteReps diff --git a/eos/saveddata/module.py b/eos/saveddata/module.py index 158652a9e..2baeb8e35 100644 --- a/eos/saveddata/module.py +++ b/eos/saveddata/module.py @@ -135,7 +135,6 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): self.__baseVolley = None self.__baseRRAmount = None - self.__baseRemoteReps = None self.__miningyield = None self.__reloadTime = None self.__reloadForce = None @@ -539,56 +538,19 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): return adjustedRRAmount def getRemoteReps(self, spoolOptions=None, ignoreState=False): - if self.isEmpty or (self.state < FittingModuleState.ACTIVE and not ignoreState): - return None, 0 - - def getBaseRemoteReps(module): - remoteModuleGroups = { - "Remote Armor Repairer": "Armor", - "Ancillary Remote Armor Repairer": "Armor", - "Mutadaptive Remote Armor Repairer": "Armor", - "Remote Hull Repairer": "Hull", - "Remote Shield Booster": "Shield", - "Ancillary Remote Shield Booster": "Shield", - "Remote Capacitor Transmitter": "Capacitor"} - rrType = remoteModuleGroups.get(module.item.group.name, None) - if not rrType: - return None, 0 - if rrType == "Hull": - rrAmount = module.getModifiedItemAttr("structureDamageAmount", 0) - elif rrType == "Armor": - rrAmount = module.getModifiedItemAttr("armorDamageAmount", 0) - elif rrType == "Shield": - rrAmount = module.getModifiedItemAttr("shieldBonus", 0) - elif rrType == "Capacitor": - rrAmount = module.getModifiedItemAttr("powerTransferAmount", 0) - else: - return None, 0 - - return rrType, rrAmount - - if self.__baseRemoteReps is None: - self.__baseRemoteReps = getBaseRemoteReps(self) - - rrType, rrAmount = self.__baseRemoteReps - - if rrAmount: - cycleParams = self.getCycleParameters() - if cycleParams is None: - return None, 0 - rrAmount *= 1 / (cycleParams.averageTime / 1000) - if self.item.group.name == "Ancillary Remote Armor Repairer" and self.charge: - rrAmount *= self.getModifiedItemAttr("chargedArmorDamageMultiplier", 1) - - if rrType and rrAmount and self.item.group.name == "Mutadaptive Remote Armor Repairer": - spoolType, spoolAmount = resolveSpoolOptions(spoolOptions, self) - spoolBoost = calculateSpoolup( - self.getModifiedItemAttr("repairMultiplierBonusMax", 0), - self.getModifiedItemAttr("repairMultiplierBonusPerCycle", 0), - self.rawCycleTime / 1000, spoolType, spoolAmount)[0] - rrAmount *= (1 + spoolBoost) - - return rrType, rrAmount + rrDuringCycle = RRTypes(0, 0, 0, 0) + cycleParams = self.getCycleParameters() + if cycleParams is None: + return rrDuringCycle + repAmountParams = self.getRepAmountParameters(spoolOptions=spoolOptions, ignoreState=ignoreState) + avgCycleTime = cycleParams.averageTime + if len(repAmountParams) == 0 or avgCycleTime == 0: + return rrDuringCycle + for rrAmount in repAmountParams.values(): + rrDuringCycle += rrAmount + rrFactor = 1 / (avgCycleTime / 1000) + rrDuringCycle *= rrFactor + return rrDuringCycle def getSpoolData(self, spoolOptions=None): weaponMultMax = self.getModifiedItemAttr("damageMultiplierBonusMax", 0) @@ -846,7 +808,6 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): def clear(self): self.__baseVolley = None self.__baseRRAmount = None - self.__baseRemoteReps = None self.__miningyield = None self.__reloadTime = None self.__reloadForce = None diff --git a/gui/builtinStatsViews/outgoingViewFull.py b/gui/builtinStatsViews/outgoingViewFull.py index 740042b8c..9004e119c 100644 --- a/gui/builtinStatsViews/outgoingViewFull.py +++ b/gui/builtinStatsViews/outgoingViewFull.py @@ -29,27 +29,27 @@ import eos.config stats = [ ( "labelRemoteCapacitor", "Capacitor:", "{}{} GJ/s", "capacitorInfo", "Capacitor restored", - lambda fit, spool: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, spool, False)).get("Capacitor", 0), - lambda fit: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, 0, True)).get("Capacitor", 0), - lambda fit: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, 1, True)).get("Capacitor", 0), + lambda fit, spool: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, spool, False)).capacitor, + lambda fit: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, 0, True)).capacitor, + lambda fit: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, 1, True)).capacitor, 3, 0, 0), ( "labelRemoteShield", "Shield:", "{}{} HP/s", "shieldActive", "Shield restored", - lambda fit, spool: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, spool, False)).get("Shield", 0), - lambda fit: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, 0, True)).get("Shield", 0), - lambda fit: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, 1, True)).get("Shield", 0), + lambda fit, spool: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, spool, False)).shield, + lambda fit: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, 0, True)).shield, + lambda fit: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, 1, True)).shield, 3, 0, 0), ( "labelRemoteArmor", "Armor:", "{}{} HP/s", "armorActive", "Armor restored", - lambda fit, spool: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, spool, False)).get("Armor", 0), - lambda fit: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, 0, True)).get("Armor", 0), - lambda fit: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, 1, True)).get("Armor", 0), + lambda fit, spool: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, spool, False)).armor, + lambda fit: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, 0, True)).armor, + lambda fit: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, 1, True)).armor, 3, 0, 0), ( "labelRemoteHull", "Hull:", "{}{} HP/s", "hullActive", "Hull restored", - lambda fit, spool: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, spool, False)).get("Hull", 0), - lambda fit: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, 0, True)).get("Hull", 0), - lambda fit: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, 1, True)).get("Hull", 0), + lambda fit, spool: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, spool, False)).hull, + lambda fit: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, 0, True)).hull, + lambda fit: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, 1, True)).hull, 3, 0, 0)] diff --git a/gui/builtinStatsViews/outgoingViewMinimal.py b/gui/builtinStatsViews/outgoingViewMinimal.py index 4ed86831f..e052bf3eb 100644 --- a/gui/builtinStatsViews/outgoingViewMinimal.py +++ b/gui/builtinStatsViews/outgoingViewMinimal.py @@ -28,27 +28,27 @@ import eos.config stats = [ ( "labelRemoteCapacitor", "Capacitor:", "{}{} GJ/s", "capacitorInfo", "Capacitor restored", - lambda fit, spool: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, spool, False)).get("Capacitor", 0), - lambda fit: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, 0, True)).get("Capacitor", 0), - lambda fit: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, 1, True)).get("Capacitor", 0), + lambda fit, spool: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, spool, False)).capacitor, + lambda fit: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, 0, True)).capacitor, + lambda fit: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, 1, True)).capacitor, 3, 0, 0), ( "labelRemoteShield", "Shield:", "{}{} HP/s", "shieldActive", "Shield restored", - lambda fit, spool: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, spool, False)).get("Shield", 0), - lambda fit: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, 0, True)).get("Shield", 0), - lambda fit: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, 1, True)).get("Shield", 0), + lambda fit, spool: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, spool, False)).shield, + lambda fit: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, 0, True)).shield, + lambda fit: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, 1, True)).shield, 3, 0, 0), ( "labelRemoteArmor", "Armor:", "{}{} HP/s", "armorActive", "Armor restored", - lambda fit, spool: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, spool, False)).get("Armor", 0), - lambda fit: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, 0, True)).get("Armor", 0), - lambda fit: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, 1, True)).get("Armor", 0), + lambda fit, spool: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, spool, False)).armor, + lambda fit: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, 0, True)).armor, + lambda fit: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, 1, True)).armor, 3, 0, 0), ( "labelRemoteHull", "Hull:", "{}{} HP/s", "hullActive", "Hull restored", - lambda fit, spool: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, spool, False)).get("Hull", 0), - lambda fit: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, 0, True)).get("Hull", 0), - lambda fit: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, 1, True)).get("Hull", 0), + lambda fit, spool: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, spool, False)).hull, + lambda fit: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, 0, True)).hull, + lambda fit: fit.getRemoteReps(spoolOptions=SpoolOptions(SpoolType.SCALE, 1, True)).hull, 3, 0, 0)] diff --git a/gui/builtinViewColumns/misc.py b/gui/builtinViewColumns/misc.py index 1091d49b0..e56bc5fe8 100644 --- a/gui/builtinViewColumns/misc.py +++ b/gui/builtinViewColumns/misc.py @@ -388,7 +388,7 @@ class Miscellanea(ViewColumn): tooltip = "Sensor recalibration time" return text, tooltip elif itemGroup == "Remote Armor Repairer": - rps = stuff.getRemoteReps(ignoreState=True)[1] + rps = stuff.getRemoteReps(ignoreState=True).armor if not rps: return "", None text = "{0}/s".format(formatAmount(rps, 3, 0, 3, forceSign=True)) @@ -399,9 +399,9 @@ class Miscellanea(ViewColumn): spoolOptDefault = SpoolOptions(SpoolType.SCALE, defaultSpoolValue, False) spoolOptPre = SpoolOptions(SpoolType.SCALE, 0, True) spoolOptFull = SpoolOptions(SpoolType.SCALE, 1, True) - rrType, rps = stuff.getRemoteReps(spoolOptions=spoolOptDefault, ignoreState=True) - rrTypePre, rpsPre = stuff.getRemoteReps(spoolOptions=spoolOptPre, ignoreState=True) - rrTypeFull, rpsFull = stuff.getRemoteReps(spoolOptions=spoolOptFull, ignoreState=True) + rps = stuff.getRemoteReps(spoolOptions=spoolOptDefault, ignoreState=True).armor + rpsPre = stuff.getRemoteReps(spoolOptions=spoolOptPre, ignoreState=True).armor + rpsFull = stuff.getRemoteReps(spoolOptions=spoolOptFull, ignoreState=True).armor if not rps: return "", None text = [] @@ -424,21 +424,21 @@ class Miscellanea(ViewColumn): formatAmount(spoolTimeFull - spoolTimePre, 3, 0, 3)) return text, tooltip elif itemGroup == "Remote Shield Booster": - rps = stuff.getRemoteReps(ignoreState=True)[1] + rps = stuff.getRemoteReps(ignoreState=True).shield if not rps: return "", None text = "{0}/s".format(formatAmount(rps, 3, 0, 3, forceSign=True)) tooltip = "Shield transferred per second" return text, tooltip elif itemGroup == "Remote Capacitor Transmitter": - rps = stuff.getRemoteReps(ignoreState=True)[1] + rps = stuff.getRemoteReps(ignoreState=True).capacitor if not rps: return "", None text = "{0}/s".format(formatAmount(rps, 3, 0, 3, forceSign=True)) tooltip = "Energy transferred per second" return text, tooltip elif itemGroup == "Remote Hull Repairer": - rps = stuff.getRemoteReps(ignoreState=True)[1] + rps = stuff.getRemoteReps(ignoreState=True).hull if not rps: return "", None text = "{0}/s".format(formatAmount(rps, 3, 0, 3, forceSign=True)) @@ -539,11 +539,22 @@ class Miscellanea(ViewColumn): tooltip = "Mining Yield per second ({0} per hour)".format(formatAmount(minePerSec * 3600, 3, 0, 3)) return text, tooltip elif itemGroup == "Logistic Drone": - repType, rps = stuff.getRemoteReps(ignoreState=True) - if not repType: + rpsData = stuff.getRemoteReps(ignoreState=True) + rrType = None + rps = None + if rpsData.shield: + rps = rpsData.shield + rrType = 'Shield' + elif rpsData.armor: + rps = rpsData.armor + rrType = 'Armor' + elif rpsData.hull: + rps = rpsData.hull + rrType = 'Hull' + if not rrType or not rps: return "", None text = "{}/s".format(formatAmount(rps, 3, 0, 3)) - tooltip = "{} HP repaired per second\n{} HP/s per drone".format(repType, formatAmount(rps / stuff.amount, 3, 0, 3)) + tooltip = "{} HP repaired per second\n{} HP/s per drone".format(rrType, formatAmount(rps / stuff.amount, 3, 0, 3)) return text, tooltip elif itemGroup == "Energy Neutralizer Drone": neutAmount = stuff.getModifiedItemAttr("energyNeutralizerAmount")