Change presentation of mining info

This commit is contained in:
DarkPhoenix
2025-11-17 17:25:25 +01:00
parent b12adcae3d
commit dbb61a8a37
5 changed files with 68 additions and 58 deletions

View File

@@ -82,7 +82,7 @@ class Drone(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, Mu
self.__baseVolley = None self.__baseVolley = None
self.__baseRRAmount = None self.__baseRRAmount = None
self.__miningYield = None self.__miningYield = None
self.__miningWaste = None self.__miningDrain = None
self.__ehp = None self.__ehp = None
self.__itemModifiedAttributes = ModifiedAttributeDict() self.__itemModifiedAttributes = ModifiedAttributeDict()
self.__itemModifiedAttributes.original = self._item.attributes self.__itemModifiedAttributes.original = self._item.attributes
@@ -240,15 +240,15 @@ class Drone(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, Mu
if not ignoreState and self.amountActive <= 0: if not ignoreState and self.amountActive <= 0:
return 0 return 0
if self.__miningYield is None: if self.__miningYield is None:
self.__miningYield, self.__miningWaste = self.__calculateMining() self.__miningYield, self.__miningDrain = self.__calculateMining()
return self.__miningYield return self.__miningYield
def getMiningWPS(self, ignoreState=False): def getMiningDPS(self, ignoreState=False):
if not ignoreState and self.amountActive <= 0: if not ignoreState and self.amountActive <= 0:
return 0 return 0
if self.__miningWaste is None: if self.__miningDrain is None:
self.__miningYield, self.__miningWaste = self.__calculateMining() self.__miningYield, self.__miningDrain = self.__calculateMining()
return self.__miningWaste return self.__miningDrain
def __calculateMining(self): def __calculateMining(self):
if self.mines is True: if self.mines is True:
@@ -262,8 +262,8 @@ class Drone(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, Mu
yps = yield_ / (cycleTime / 1000.0) yps = yield_ / (cycleTime / 1000.0)
wasteChance = self.getModifiedItemAttr("miningWasteProbability") wasteChance = self.getModifiedItemAttr("miningWasteProbability")
wasteMult = self.getModifiedItemAttr("miningWastedVolumeMultiplier") wasteMult = self.getModifiedItemAttr("miningWastedVolumeMultiplier")
wps = yps * max(0, min(1, wasteChance / 100)) * wasteMult dps = yps * (1 + max(0, min(1, wasteChance / 100)) * wasteMult)
return yps, wps return yps, dps
else: else:
return 0, 0 return 0, 0
@@ -335,7 +335,7 @@ class Drone(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, Mu
self.__baseVolley = None self.__baseVolley = None
self.__baseRRAmount = None self.__baseRRAmount = None
self.__miningYield = None self.__miningYield = None
self.__miningWaste = None self.__miningDrain = None
self.__ehp = None self.__ehp = None
self.itemModifiedAttributes.clear() self.itemModifiedAttributes.clear()
self.chargeModifiedAttributes.clear() self.chargeModifiedAttributes.clear()

View File

@@ -140,8 +140,8 @@ class Fit:
self.__remoteRepMap = {} self.__remoteRepMap = {}
self.__minerYield = None self.__minerYield = None
self.__droneYield = None self.__droneYield = None
self.__minerWaste = None self.__minerDrain = None
self.__droneWaste = None self.__droneDrain = None
self.__droneDps = None self.__droneDps = None
self.__droneVolley = None self.__droneVolley = None
self.__sustainableTank = None self.__sustainableTank = None
@@ -378,11 +378,11 @@ class Fit:
return self.__minerYield return self.__minerYield
@property @property
def minerWaste(self): def minerDrain(self):
if self.__minerWaste is None: if self.__minerDrain is None:
self.calculatemining() self.calculatemining()
return self.__minerWaste return self.__minerDrain
@property @property
def droneYield(self): def droneYield(self):
@@ -392,19 +392,19 @@ class Fit:
return self.__droneYield return self.__droneYield
@property @property
def droneWaste(self): def droneDrain(self):
if self.__droneWaste is None: if self.__droneDrain is None:
self.calculatemining() self.calculatemining()
return self.__droneWaste return self.__droneDrain
@property @property
def totalYield(self): def totalYield(self):
return self.droneYield + self.minerYield return self.droneYield + self.minerYield
@property @property
def totalWaste(self): def totalDrain(self):
return self.droneWaste + self.minerWaste return self.droneDrain + self.minerDrain
@property @property
def maxTargets(self): def maxTargets(self):
@@ -518,8 +518,8 @@ class Fit:
self.__remoteRepMap = {} self.__remoteRepMap = {}
self.__minerYield = None self.__minerYield = None
self.__droneYield = None self.__droneYield = None
self.__minerWaste = None self.__minerDrain = None
self.__droneWaste = None self.__droneDrain = None
self.__effectiveSustainableTank = None self.__effectiveSustainableTank = None
self.__sustainableTank = None self.__sustainableTank = None
self.__droneDps = None self.__droneDps = None
@@ -1734,21 +1734,21 @@ class Fit:
def calculatemining(self): def calculatemining(self):
minerYield = 0 minerYield = 0
minerWaste = 0 minerDrain = 0
droneYield = 0 droneYield = 0
droneWaste = 0 droneDrain = 0
for mod in self.modules: for mod in self.modules:
minerYield += mod.getMiningYPS() minerYield += mod.getMiningYPS()
minerWaste += mod.getMiningWPS() minerDrain += mod.getMiningDPS()
for drone in self.drones: for drone in self.drones:
droneYield += drone.getMiningYPS() droneYield += drone.getMiningYPS()
droneWaste += drone.getMiningWPS() droneDrain += drone.getMiningDPS()
self.__minerYield = minerYield self.__minerYield = minerYield
self.__minerWaste = minerWaste self.__minerDrain = minerDrain
self.__droneYield = droneYield self.__droneYield = droneYield
self.__droneWaste = droneWaste self.__droneDrain = droneDrain
def calculateWeaponDmgStats(self, spoolOptions): def calculateWeaponDmgStats(self, spoolOptions):
weaponVolley = DmgTypes.default() weaponVolley = DmgTypes.default()

View File

@@ -127,7 +127,7 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, M
self.__baseVolley = None self.__baseVolley = None
self.__baseRRAmount = None self.__baseRRAmount = None
self.__miningYield = None self.__miningYield = None
self.__miningWaste = None self.__miningDrain = None
self.__reloadTime = None self.__reloadTime = None
self.__reloadForce = None self.__reloadForce = None
self.__chargeCycles = None self.__chargeCycles = None
@@ -418,17 +418,17 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, M
if not ignoreState and self.state < FittingModuleState.ACTIVE: if not ignoreState and self.state < FittingModuleState.ACTIVE:
return 0 return 0
if self.__miningYield is None: if self.__miningYield is None:
self.__miningYield, self.__miningWaste = self.__calculateMining() self.__miningYield, self.__miningDrain = self.__calculateMining()
return self.__miningYield return self.__miningYield
def getMiningWPS(self, ignoreState=False): def getMiningDPS(self, ignoreState=False):
if self.isEmpty: if self.isEmpty:
return 0 return 0
if not ignoreState and self.state < FittingModuleState.ACTIVE: if not ignoreState and self.state < FittingModuleState.ACTIVE:
return 0 return 0
if self.__miningWaste is None: if self.__miningDrain is None:
self.__miningYield, self.__miningWaste = self.__calculateMining() self.__miningYield, self.__miningDrain = self.__calculateMining()
return self.__miningWaste return self.__miningDrain
def __calculateMining(self): def __calculateMining(self):
yield_ = self.getModifiedItemAttr("miningAmount") yield_ = self.getModifiedItemAttr("miningAmount")
@@ -443,11 +443,11 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, M
yps = 0 yps = 0
wasteChance = self.getModifiedItemAttr("miningWasteProbability") wasteChance = self.getModifiedItemAttr("miningWasteProbability")
wasteMult = self.getModifiedItemAttr("miningWastedVolumeMultiplier") wasteMult = self.getModifiedItemAttr("miningWastedVolumeMultiplier")
wps = yps * max(0, min(1, wasteChance / 100)) * wasteMult dps = yps * (1 + max(0, min(1, wasteChance / 100)) * wasteMult)
critChance = self.getModifiedItemAttr("miningCritChance") critChance = self.getModifiedItemAttr("miningCritChance")
critBonusMult = self.getModifiedItemAttr("miningCritBonusYield") critBonusMult = self.getModifiedItemAttr("miningCritBonusYield")
yps += yps * critChance * critBonusMult yps += yps * critChance * critBonusMult
return yps, wps return yps, dps
def isDealingDamage(self, ignoreState=False): def isDealingDamage(self, ignoreState=False):
volleyParams = self.getVolleyParameters(ignoreState=ignoreState) volleyParams = self.getVolleyParameters(ignoreState=ignoreState)
@@ -897,7 +897,7 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, M
self.__baseVolley = None self.__baseVolley = None
self.__baseRRAmount = None self.__baseRRAmount = None
self.__miningYield = None self.__miningYield = None
self.__miningWaste = None self.__miningDrain = None
self.__reloadTime = None self.__reloadTime = None
self.__reloadForce = None self.__reloadForce = None
self.__chargeCycles = None self.__chargeCycles = None

View File

@@ -130,9 +130,9 @@ class MiningYieldViewFull(StatsView):
def refreshPanel(self, fit): def refreshPanel(self, fit):
# If we did anything intresting, we'd update our labels to reflect the new fit's stats here # If we did anything intresting, we'd update our labels to reflect the new fit's stats here
stats = (("labelFullminingyieldMiner", lambda: fit.minerYield, lambda: fit.minerWaste, 3, 0, 0, "{}{} m\u00B3/s", None), stats = (("labelFullminingyieldMiner", lambda: fit.minerYield, lambda: fit.minerDrain, 3, 0, 0, "{} m\u00B3/s", None),
("labelFullminingyieldDrone", lambda: fit.droneYield, lambda: fit.droneWaste, 3, 0, 0, "{}{} m\u00B3/s", None), ("labelFullminingyieldDrone", lambda: fit.droneYield, lambda: fit.droneDrain, 3, 0, 0, "{} m\u00B3/s", None),
("labelFullminingyieldTotal", lambda: fit.totalYield, lambda: fit.totalWaste, 3, 0, 0, "{}{} m\u00B3/s", None)) ("labelFullminingyieldTotal", lambda: fit.totalYield, lambda: fit.totalDrain, 3, 0, 0, "{} m\u00B3/s", None))
def processValue(value): def processValue(value):
value = value() if fit is not None else 0 value = value() if fit is not None else 0
@@ -140,23 +140,26 @@ class MiningYieldViewFull(StatsView):
return value return value
counter = 0 counter = 0
for labelName, yieldValue, wasteValue, prec, lowest, highest, valueFormat, altFormat in stats: for labelName, yieldValue, drainValue, prec, lowest, highest, valueFormat, altFormat in stats:
label = getattr(self, labelName) label = getattr(self, labelName)
yieldValue = processValue(yieldValue) yieldValue = processValue(yieldValue)
wasteValue = processValue(wasteValue) drainValue = processValue(drainValue)
if self._cachedValues[counter] != (yieldValue, wasteValue): if self._cachedValues[counter] != (yieldValue, drainValue):
try:
efficiency = '{}%'.format(formatAmount(yieldValue / drainValue * 100, 4, 0, 0))
except ZeroDivisionError:
efficiency = '0%'
yps = formatAmount(yieldValue, prec, lowest, highest) yps = formatAmount(yieldValue, prec, lowest, highest)
yph = formatAmount(yieldValue * 3600, prec, lowest, highest) yph = formatAmount(yieldValue * 3600, prec, lowest, highest)
wps = formatAmount(wasteValue, prec, lowest, highest) dps = formatAmount(drainValue, prec, lowest, highest)
wph = formatAmount(wasteValue * 3600, prec, lowest, highest) dph = formatAmount(drainValue * 3600, prec, lowest, highest)
wasteSuffix = '\u02b7' if wasteValue > 0 else '' label.SetLabel(valueFormat.format(yps))
label.SetLabel(valueFormat.format(yps, wasteSuffix))
tipLines = [] tipLines = []
tipLines.append("{} m\u00B3 mining yield per second ({} m\u00B3 per hour)".format(yps, yph)) tipLines.append("{} m\u00B3 yield per second ({} m\u00B3 per hour)".format(yps, yph))
if wasteValue > 0: tipLines.append("{} m\u00B3 drain per second ({} m\u00B3 per hour)".format(dps, dph))
tipLines.append("{} m\u00B3 mining waste per second ({} m\u00B3 per hour)".format(wps, wph)) tipLines.append(f'{efficiency} efficiency')
label.SetToolTip(wx.ToolTip('\n'.join(tipLines))) label.SetToolTip(wx.ToolTip('\n'.join(tipLines)))
self._cachedValues[counter] = (yieldValue, wasteValue) self._cachedValues[counter] = (yieldValue, drainValue)
counter += 1 counter += 1
self.panel.Layout() self.panel.Layout()
self.headerPanel.Layout() self.headerPanel.Layout()

View File

@@ -27,6 +27,7 @@ from gui.viewColumn import ViewColumn
from gui.bitmap_loader import BitmapLoader from gui.bitmap_loader import BitmapLoader
from gui.utils.numberFormatter import formatAmount from gui.utils.numberFormatter import formatAmount
from gui.utils.listFormatter import formatList from gui.utils.listFormatter import formatList
from eos.utils.float import floatUnerr
from eos.utils.spoolSupport import SpoolType, SpoolOptions from eos.utils.spoolSupport import SpoolType, SpoolOptions
import eos.config import eos.config
@@ -547,18 +548,24 @@ class Miscellanea(ViewColumn):
if not yps: if not yps:
return "", None return "", None
yph = yps * 3600 yph = yps * 3600
wps = stuff.getMiningWPS(ignoreState=True) dps = stuff.getMiningDPS(ignoreState=True)
wph = wps * 3600 dph = dps * 3600
try:
efficiency = yps / dps
except ZeroDivisionError:
efficiency = 0
textParts = [] textParts = []
textParts.append(formatAmount(yps, 3, 0, 3))
tipLines = [] tipLines = []
textParts.append('{} m\u00B3/s'.format(formatAmount(yps, 3, 0, 3)))
tipLines.append("{} m\u00B3 mining yield per second ({} m\u00B3 per hour)".format( tipLines.append("{} m\u00B3 mining yield per second ({} m\u00B3 per hour)".format(
formatAmount(yps, 3, 0, 3), formatAmount(yph, 3, 0, 3))) formatAmount(yps, 3, 0, 3), formatAmount(yph, 3, 0, 3)))
if wps > 0: tipLines.append("{} m\u00B3 mining drain per second ({} m\u00B3 per hour)".format(
textParts.append(formatAmount(wps, 3, 0, 3)) formatAmount(dps, 3, 0, 3), formatAmount(dph, 3, 0, 3)))
tipLines.append("{} m\u00B3 mining waste per second ({} m\u00B3 per hour)".format( if floatUnerr(efficiency) != 1:
formatAmount(wps, 3, 0, 3), formatAmount(wph, 3, 0, 3))) eff_text = '{}%'.format(formatAmount(efficiency * 100, 4, 0, 0))
text = '{} m\u00B3/s'.format('+'.join(textParts)) textParts.append(eff_text)
tipLines.append(f"{eff_text} mining efficiency")
text = '{}'.format(' | '.join(textParts))
tooltip = '\n'.join(tipLines) tooltip = '\n'.join(tipLines)
return text, tooltip return text, tooltip
elif itemGroup == "Logistic Drone": elif itemGroup == "Logistic Drone":