From 22be97f901c888342a23342b3d3f92843b5fe62e Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Fri, 26 Nov 2021 17:19:07 +0300 Subject: [PATCH] Calculate waste stats for fits --- eos/saveddata/drone.py | 46 +++++++++++++++++++++----------- eos/saveddata/fit.py | 39 +++++++++++++++++++++------ eos/saveddata/module.py | 59 ++++++++++++++++++++++++++--------------- 3 files changed, 98 insertions(+), 46 deletions(-) diff --git a/eos/saveddata/drone.py b/eos/saveddata/drone.py index 0acf5864f..744e7e378 100644 --- a/eos/saveddata/drone.py +++ b/eos/saveddata/drone.py @@ -80,7 +80,8 @@ class Drone(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, Mu self.__charge = None self.__baseVolley = None self.__baseRRAmount = None - self.__miningyield = None + self.__miningYield = None + self.__miningWaste = None self.__itemModifiedAttributes = ModifiedAttributeDict() self.__itemModifiedAttributes.original = self._item.attributes self.__itemModifiedAttributes.overrides = self._item.overrides @@ -242,21 +243,33 @@ class Drone(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, Mu return CycleInfo(self.cycleTime, 0, math.inf, False) @property - def miningStats(self): - if self.__miningyield is None: - if self.mines is True and self.amountActive > 0: - getter = self.getModifiedItemAttr - cycleParams = self.getCycleParameters() - if cycleParams is None: - self.__miningyield = 0 - else: - cycleTime = cycleParams.averageTime - volley = sum([getter(d) for d in self.MINING_ATTRIBUTES]) * self.amountActive - self.__miningyield = volley / (cycleTime / 1000.0) - else: - self.__miningyield = 0 + def miningYPS(self): + if self.__miningYield is None: + self.__miningYield, self.__miningWaste = self.__calculateMining() + return self.__miningYield - return self.__miningyield + @property + def miningWPS(self): + if self.__miningWaste is None: + self.__miningYield, self.__miningWaste = self.__calculateMining() + return self.__miningWaste + + def __calculateMining(self): + if self.mines is True and self.amountActive > 0: + getter = self.getModifiedItemAttr + cycleParams = self.getCycleParameters() + if cycleParams is None: + yps = 0 + else: + cycleTime = cycleParams.averageTime + yield_ = sum([getter(d) for d in self.MINING_ATTRIBUTES]) * self.amountActive + yps = yield_ / (cycleTime / 1000.0) + wasteChance = self.getModifiedItemAttr("miningWasteProbability") + wasteMult = self.getModifiedItemAttr("miningWastedVolumeMultiplier") + wps = yps * wasteChance * wasteMult + return yps, wps + else: + return 0, 0 @property def maxRange(self): @@ -302,7 +315,8 @@ class Drone(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, Mu def clear(self): self.__baseVolley = None self.__baseRRAmount = None - self.__miningyield = None + self.__miningYield = None + self.__miningWaste = None self.itemModifiedAttributes.clear() self.chargeModifiedAttributes.clear() diff --git a/eos/saveddata/fit.py b/eos/saveddata/fit.py index 8bd37b872..ed23c502a 100644 --- a/eos/saveddata/fit.py +++ b/eos/saveddata/fit.py @@ -139,9 +139,11 @@ class Fit: self.__weaponVolleyMap = {} self.__remoteRepMap = {} self.__minerYield = None + self.__droneYield = None + self.__minerWaste = None + self.__droneWaste = None self.__droneDps = None self.__droneVolley = None - self.__droneYield = None self.__sustainableTank = None self.__effectiveSustainableTank = None self.__effectiveTank = None @@ -365,17 +367,31 @@ class Fit: @property def minerYield(self): if self.__minerYield is None: - self.calculateMiningStats() + self.calculatemining() return self.__minerYield + @property + def minerWaste(self): + if self.__minerWaste is None: + self.calculatemining() + + return self.__minerWaste + @property def droneYield(self): if self.__droneYield is None: - self.calculateMiningStats() + self.calculatemining() return self.__droneYield + @property + def droneWaste(self): + if self.__droneWaste is None: + self.calculatemining() + + return self.__droneWaste + @property def totalYield(self): return self.droneYield + self.minerYield @@ -491,11 +507,13 @@ class Fit: self.__weaponVolleyMap = {} self.__remoteRepMap = {} self.__minerYield = None + self.__droneYield = None + self.__minerWaste = None + self.__droneWaste = None self.__effectiveSustainableTank = None self.__sustainableTank = None self.__droneDps = None self.__droneVolley = None - self.__droneYield = None self.__ehp = None self.__calculated = False self.__capStable = None @@ -1627,18 +1645,23 @@ class Fit: else: return self.ship.getModifiedItemAttr("scanSpeed") / 1000.0 - def calculateMiningStats(self): + def calculatemining(self): minerYield = 0 + minerWaste = 0 droneYield = 0 + droneWaste = 0 for mod in self.modules: - minerYield += mod.miningStats - + minerYield += mod.miningYPS + minerWaste += mod.miningWPS for drone in self.drones: - droneYield += drone.miningStats + droneYield += drone.miningYPS + droneWaste += drone.miningWPS self.__minerYield = minerYield + self.__minerWaste = minerWaste self.__droneYield = droneYield + self.__droneWaste = droneWaste def calculateWeaponDmgStats(self, spoolOptions): weaponVolley = DmgTypes(0, 0, 0, 0) diff --git a/eos/saveddata/module.py b/eos/saveddata/module.py index e2602eef3..b071846cc 100644 --- a/eos/saveddata/module.py +++ b/eos/saveddata/module.py @@ -124,7 +124,8 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, M self.__baseVolley = None self.__baseRRAmount = None - self.__miningyield = None + self.__miningYield = None + self.__miningWaste = None self.__reloadTime = None self.__reloadForce = None self.__chargeCycles = None @@ -410,27 +411,40 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, M self.__itemModifiedAttributes.clear() @property - def miningStats(self): - if self.__miningyield is None: - if self.isEmpty: - self.__miningyield = 0 - else: - if self.state >= FittingModuleState.ACTIVE: - volley = self.getModifiedItemAttr("specialtyMiningAmount") or self.getModifiedItemAttr( - "miningAmount") or 0 - if volley: - cycleParams = self.getCycleParameters() - if cycleParams is None: - self.__miningyield = 0 - else: - cycleTime = cycleParams.averageTime - self.__miningyield = volley / (cycleTime / 1000.0) - else: - self.__miningyield = 0 - else: - self.__miningyield = 0 + def miningYPS(self): + if self.__miningYield is None: + self.__miningYield, self.__miningWaste = self.__calculateMining() + return self.__miningYield - return self.__miningyield + @property + def miningWPS(self): + if self.__miningWaste is None: + self.__miningYield, self.__miningWaste = self.__calculateMining() + return self.__miningWaste + + def __calculateMining(self): + if self.isEmpty: + return 0, 0 + if self.state >= FittingModuleState.ACTIVE: + yield_ = self.getModifiedItemAttr("specialtyMiningAmount") or self.getModifiedItemAttr("miningAmount") or 0 + if yield_: + cycleParams = self.getCycleParameters() + if cycleParams is None: + yps = 0 + else: + cycleTime = cycleParams.averageTime + yps = yield_ / (cycleTime / 1000.0) + else: + yps = 0 + else: + yps = 0 + wasteChance = self.getModifiedItemAttr("miningWasteProbability") + wasteMult = self.getModifiedItemAttr("miningWastedVolumeMultiplier") + if self.charge is not None: + wasteChance += self.getModifiedChargeAttr("specializationCrystalMiningWasteProbabilityBonus", 0) + wasteMult *= self.getModifiedChargeAttr("specializationCrystalMiningWastedVolumeMultiplierBonus", 1) + wps = yps * wasteChance * wasteMult + return yps, wps def isDealingDamage(self, ignoreState=False): volleyParams = self.getVolleyParameters(ignoreState=ignoreState) @@ -865,7 +879,8 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, M def clear(self): self.__baseVolley = None self.__baseRRAmount = None - self.__miningyield = None + self.__miningYield = None + self.__miningWaste = None self.__reloadTime = None self.__reloadForce = None self.__chargeCycles = None