Compare commits
31 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1af2e7f94b | ||
|
|
dbb61a8a37 | ||
|
|
b12adcae3d | ||
|
|
72567a7155 | ||
|
|
0d4c2551c1 | ||
|
|
ce10aeb55e | ||
|
|
7b14266f0d | ||
|
|
b436f6ec89 | ||
|
|
e7e3f4e626 | ||
|
|
ae8405d132 | ||
|
|
977cf61ff5 | ||
|
|
7cc4f6ec27 | ||
|
|
0e6b9b48f1 | ||
|
|
a00a80b4e4 | ||
|
|
6843373283 | ||
|
|
408da2e344 | ||
|
|
dc8ecae0f1 | ||
|
|
50e6ed516f | ||
|
|
42a6bb92a7 | ||
|
|
521a58d77b | ||
|
|
6546f32971 | ||
|
|
ad3019debe | ||
|
|
fe9fa8b4fe | ||
|
|
92fce5be96 | ||
|
|
d271515060 | ||
|
|
343e52e556 | ||
|
|
7949bc60dc | ||
|
|
bfbd3526cd | ||
|
|
c363f7359d | ||
|
|
3a7ece6a5b | ||
|
|
e0e1c1ce03 |
825
eos/effects.py
@@ -324,7 +324,7 @@ class ModifiedAttributeDict(MutableMapping):
|
||||
cappingAttrKeyCache[key] = cappingKey
|
||||
|
||||
if cappingKey:
|
||||
cappingValue = self.original.get(cappingKey, self.__calculateValue(cappingKey))
|
||||
cappingValue = self[cappingKey]
|
||||
cappingValue = cappingValue.value if hasattr(cappingValue, "value") else cappingValue
|
||||
else:
|
||||
cappingValue = None
|
||||
|
||||
@@ -82,7 +82,7 @@ class Drone(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, Mu
|
||||
self.__baseVolley = None
|
||||
self.__baseRRAmount = None
|
||||
self.__miningYield = None
|
||||
self.__miningWaste = None
|
||||
self.__miningDrain = None
|
||||
self.__ehp = None
|
||||
self.__itemModifiedAttributes = ModifiedAttributeDict()
|
||||
self.__itemModifiedAttributes.original = self._item.attributes
|
||||
@@ -240,15 +240,15 @@ class Drone(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, Mu
|
||||
if not ignoreState and self.amountActive <= 0:
|
||||
return 0
|
||||
if self.__miningYield is None:
|
||||
self.__miningYield, self.__miningWaste = self.__calculateMining()
|
||||
self.__miningYield, self.__miningDrain = self.__calculateMining()
|
||||
return self.__miningYield
|
||||
|
||||
def getMiningWPS(self, ignoreState=False):
|
||||
def getMiningDPS(self, ignoreState=False):
|
||||
if not ignoreState and self.amountActive <= 0:
|
||||
return 0
|
||||
if self.__miningWaste is None:
|
||||
self.__miningYield, self.__miningWaste = self.__calculateMining()
|
||||
return self.__miningWaste
|
||||
if self.__miningDrain is None:
|
||||
self.__miningYield, self.__miningDrain = self.__calculateMining()
|
||||
return self.__miningDrain
|
||||
|
||||
def __calculateMining(self):
|
||||
if self.mines is True:
|
||||
@@ -262,8 +262,8 @@ class Drone(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, Mu
|
||||
yps = yield_ / (cycleTime / 1000.0)
|
||||
wasteChance = self.getModifiedItemAttr("miningWasteProbability")
|
||||
wasteMult = self.getModifiedItemAttr("miningWastedVolumeMultiplier")
|
||||
wps = yps * max(0, min(1, wasteChance / 100)) * wasteMult
|
||||
return yps, wps
|
||||
dps = yps * (1 + max(0, min(1, wasteChance / 100)) * wasteMult)
|
||||
return yps, dps
|
||||
else:
|
||||
return 0, 0
|
||||
|
||||
@@ -335,7 +335,7 @@ class Drone(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, Mu
|
||||
self.__baseVolley = None
|
||||
self.__baseRRAmount = None
|
||||
self.__miningYield = None
|
||||
self.__miningWaste = None
|
||||
self.__miningDrain = None
|
||||
self.__ehp = None
|
||||
self.itemModifiedAttributes.clear()
|
||||
self.chargeModifiedAttributes.clear()
|
||||
|
||||
@@ -140,8 +140,8 @@ class Fit:
|
||||
self.__remoteRepMap = {}
|
||||
self.__minerYield = None
|
||||
self.__droneYield = None
|
||||
self.__minerWaste = None
|
||||
self.__droneWaste = None
|
||||
self.__minerDrain = None
|
||||
self.__droneDrain = None
|
||||
self.__droneDps = None
|
||||
self.__droneVolley = None
|
||||
self.__sustainableTank = None
|
||||
@@ -378,11 +378,11 @@ class Fit:
|
||||
return self.__minerYield
|
||||
|
||||
@property
|
||||
def minerWaste(self):
|
||||
if self.__minerWaste is None:
|
||||
def minerDrain(self):
|
||||
if self.__minerDrain is None:
|
||||
self.calculatemining()
|
||||
|
||||
return self.__minerWaste
|
||||
return self.__minerDrain
|
||||
|
||||
@property
|
||||
def droneYield(self):
|
||||
@@ -392,19 +392,19 @@ class Fit:
|
||||
return self.__droneYield
|
||||
|
||||
@property
|
||||
def droneWaste(self):
|
||||
if self.__droneWaste is None:
|
||||
def droneDrain(self):
|
||||
if self.__droneDrain is None:
|
||||
self.calculatemining()
|
||||
|
||||
return self.__droneWaste
|
||||
return self.__droneDrain
|
||||
|
||||
@property
|
||||
def totalYield(self):
|
||||
return self.droneYield + self.minerYield
|
||||
|
||||
@property
|
||||
def totalWaste(self):
|
||||
return self.droneWaste + self.minerWaste
|
||||
def totalDrain(self):
|
||||
return self.droneDrain + self.minerDrain
|
||||
|
||||
@property
|
||||
def maxTargets(self):
|
||||
@@ -518,8 +518,8 @@ class Fit:
|
||||
self.__remoteRepMap = {}
|
||||
self.__minerYield = None
|
||||
self.__droneYield = None
|
||||
self.__minerWaste = None
|
||||
self.__droneWaste = None
|
||||
self.__minerDrain = None
|
||||
self.__droneDrain = None
|
||||
self.__effectiveSustainableTank = None
|
||||
self.__sustainableTank = None
|
||||
self.__droneDps = None
|
||||
@@ -702,15 +702,12 @@ class Fit:
|
||||
mod.item.requiresSkill("High Speed Maneuvering"),
|
||||
"speedFactor", value, stackingPenalties=True)
|
||||
|
||||
if warfareBuffID == 23: # Mining Burst: Mining Laser Field Enhancement: Mining/Survey Range
|
||||
if warfareBuffID == 23: # Mining Burst: Mining Laser Field Enhancement: Mining Range
|
||||
self.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Mining") or
|
||||
mod.item.requiresSkill("Ice Harvesting") or
|
||||
mod.item.requiresSkill("Gas Cloud Harvesting"),
|
||||
"maxRange", value, stackingPenalties=True)
|
||||
|
||||
self.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("CPU Management"),
|
||||
"surveyScanRange", value, stackingPenalties=True)
|
||||
|
||||
if warfareBuffID == 24: # Mining Burst: Mining Laser Optimization: Mining Capacitor/Duration
|
||||
self.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Mining") or
|
||||
mod.item.requiresSkill("Ice Harvesting") or
|
||||
@@ -925,6 +922,36 @@ class Fit:
|
||||
lambda mod: (mod.item.requiresSkill("Repair Systems")
|
||||
or mod.item.requiresSkill("Capital Repair Systems")),
|
||||
"armorDamageAmount", value, stackingPenalties=True)
|
||||
if warfareBuffID == 2464: # Expedition Burst: Probe Strength
|
||||
self.modules.filteredChargeBoost(
|
||||
lambda mod: mod.charge.requiresSkill('Astrometrics'),
|
||||
'baseSensorStrength', value, stackingPenalties=True)
|
||||
if warfareBuffID == 2465: # Expedition Burst: Directional Scanner, Hacking and Salvager Range
|
||||
self.ship.boostItemAttr("maxDirectionalScanRange", value)
|
||||
self.modules.filteredItemBoost(
|
||||
lambda mod: mod.item.group.name in ("Data Miners", "Salvager"), "maxRange", value, stackingPenalties=True)
|
||||
if warfareBuffID == 2466: # Expedition Burst: Maximum Scan Deviation Modifier
|
||||
self.modules.filteredChargeBoost(
|
||||
lambda mod: mod.charge.requiresSkill('Astrometrics'),
|
||||
'baseMaxScanDeviation', value, stackingPenalties=True)
|
||||
if warfareBuffID == 2468: # Expedition Burst: Virus Coherence
|
||||
self.modules.filteredItemIncrease(
|
||||
lambda mod: mod.item.group.name == "Data Miners", "virusCoherence", value)
|
||||
if warfareBuffID == 2474: # Mining burst charges
|
||||
self.ship.forceItemAttr("miningScannerUpgrade", value)
|
||||
if warfareBuffID == 2481: # Expedition Burst: Salvager duration bonus
|
||||
self.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Salvaging"), "duration", value)
|
||||
if warfareBuffID == 2516: # Mining Burst: Mining Crit Chance
|
||||
self.modules.filteredItemBoost(
|
||||
lambda mod: mod.item.requiresSkill("Mining") or mod.item.requiresSkill("Ice Harvesting"),
|
||||
"miningCritChance", value)
|
||||
if warfareBuffID == 2517: # Mining Burst: Mining Residue Chance Reduction
|
||||
self.modules.filteredItemBoost(
|
||||
lambda mod: (
|
||||
mod.item.requiresSkill("Mining")
|
||||
or mod.item.requiresSkill("Ice Harvesting")
|
||||
or mod.item.requiresSkill("Gas Cloud Harvesting")),
|
||||
"miningWasteProbability", value)
|
||||
|
||||
del self.commandBonuses[warfareBuffID]
|
||||
|
||||
@@ -1707,21 +1734,21 @@ class Fit:
|
||||
|
||||
def calculatemining(self):
|
||||
minerYield = 0
|
||||
minerWaste = 0
|
||||
minerDrain = 0
|
||||
droneYield = 0
|
||||
droneWaste = 0
|
||||
droneDrain = 0
|
||||
|
||||
for mod in self.modules:
|
||||
minerYield += mod.getMiningYPS()
|
||||
minerWaste += mod.getMiningWPS()
|
||||
minerDrain += mod.getMiningDPS()
|
||||
for drone in self.drones:
|
||||
droneYield += drone.getMiningYPS()
|
||||
droneWaste += drone.getMiningWPS()
|
||||
droneDrain += drone.getMiningDPS()
|
||||
|
||||
self.__minerYield = minerYield
|
||||
self.__minerWaste = minerWaste
|
||||
self.__minerDrain = minerDrain
|
||||
self.__droneYield = droneYield
|
||||
self.__droneWaste = droneWaste
|
||||
self.__droneDrain = droneDrain
|
||||
|
||||
def calculateWeaponDmgStats(self, spoolOptions):
|
||||
weaponVolley = DmgTypes.default()
|
||||
|
||||
@@ -127,7 +127,7 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, M
|
||||
self.__baseVolley = None
|
||||
self.__baseRRAmount = None
|
||||
self.__miningYield = None
|
||||
self.__miningWaste = None
|
||||
self.__miningDrain = None
|
||||
self.__reloadTime = None
|
||||
self.__reloadForce = None
|
||||
self.__chargeCycles = None
|
||||
@@ -418,17 +418,17 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, M
|
||||
if not ignoreState and self.state < FittingModuleState.ACTIVE:
|
||||
return 0
|
||||
if self.__miningYield is None:
|
||||
self.__miningYield, self.__miningWaste = self.__calculateMining()
|
||||
self.__miningYield, self.__miningDrain = self.__calculateMining()
|
||||
return self.__miningYield
|
||||
|
||||
def getMiningWPS(self, ignoreState=False):
|
||||
def getMiningDPS(self, ignoreState=False):
|
||||
if self.isEmpty:
|
||||
return 0
|
||||
if not ignoreState and self.state < FittingModuleState.ACTIVE:
|
||||
return 0
|
||||
if self.__miningWaste is None:
|
||||
self.__miningYield, self.__miningWaste = self.__calculateMining()
|
||||
return self.__miningWaste
|
||||
if self.__miningDrain is None:
|
||||
self.__miningYield, self.__miningDrain = self.__calculateMining()
|
||||
return self.__miningDrain
|
||||
|
||||
def __calculateMining(self):
|
||||
yield_ = self.getModifiedItemAttr("miningAmount")
|
||||
@@ -443,8 +443,11 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, M
|
||||
yps = 0
|
||||
wasteChance = self.getModifiedItemAttr("miningWasteProbability")
|
||||
wasteMult = self.getModifiedItemAttr("miningWastedVolumeMultiplier")
|
||||
wps = yps * max(0, min(1, wasteChance / 100)) * wasteMult
|
||||
return yps, wps
|
||||
dps = yps * (1 + max(0, min(1, wasteChance / 100)) * wasteMult)
|
||||
critChance = self.getModifiedItemAttr("miningCritChance")
|
||||
critBonusMult = self.getModifiedItemAttr("miningCritBonusYield")
|
||||
yps += yps * critChance * critBonusMult
|
||||
return yps, dps
|
||||
|
||||
def isDealingDamage(self, ignoreState=False):
|
||||
volleyParams = self.getVolleyParameters(ignoreState=ignoreState)
|
||||
@@ -894,7 +897,7 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, M
|
||||
self.__baseVolley = None
|
||||
self.__baseRRAmount = None
|
||||
self.__miningYield = None
|
||||
self.__miningWaste = None
|
||||
self.__miningDrain = None
|
||||
self.__reloadTime = None
|
||||
self.__reloadForce = None
|
||||
self.__chargeCycles = None
|
||||
|
||||
@@ -39,6 +39,7 @@ class ChangeModuleAmmo(ContextMenuCombined):
|
||||
('r16', _t('Moon Uncommon')),
|
||||
('r32', _t('Moon Rare')),
|
||||
('r64', _t('Moon Exceptional')),
|
||||
('err', _t('Erratic')),
|
||||
('misc', _t('Misc'))])
|
||||
|
||||
def display(self, callingWindow, srcContext, mainItem, selection):
|
||||
|
||||
@@ -130,9 +130,9 @@ class MiningYieldViewFull(StatsView):
|
||||
def refreshPanel(self, fit):
|
||||
# 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),
|
||||
("labelFullminingyieldDrone", lambda: fit.droneYield, lambda: fit.droneWaste, 3, 0, 0, "{}{} m\u00B3/s", None),
|
||||
("labelFullminingyieldTotal", lambda: fit.totalYield, lambda: fit.totalWaste, 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.droneDrain, 3, 0, 0, "{} m\u00B3/s", None),
|
||||
("labelFullminingyieldTotal", lambda: fit.totalYield, lambda: fit.totalDrain, 3, 0, 0, "{} m\u00B3/s", None))
|
||||
|
||||
def processValue(value):
|
||||
value = value() if fit is not None else 0
|
||||
@@ -140,23 +140,26 @@ class MiningYieldViewFull(StatsView):
|
||||
return value
|
||||
|
||||
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)
|
||||
yieldValue = processValue(yieldValue)
|
||||
wasteValue = processValue(wasteValue)
|
||||
if self._cachedValues[counter] != (yieldValue, wasteValue):
|
||||
drainValue = processValue(drainValue)
|
||||
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)
|
||||
yph = formatAmount(yieldValue * 3600, prec, lowest, highest)
|
||||
wps = formatAmount(wasteValue, prec, lowest, highest)
|
||||
wph = formatAmount(wasteValue * 3600, prec, lowest, highest)
|
||||
wasteSuffix = '\u02b7' if wasteValue > 0 else ''
|
||||
label.SetLabel(valueFormat.format(yps, wasteSuffix))
|
||||
dps = formatAmount(drainValue, prec, lowest, highest)
|
||||
dph = formatAmount(drainValue * 3600, prec, lowest, highest)
|
||||
label.SetLabel(valueFormat.format(yps))
|
||||
tipLines = []
|
||||
tipLines.append("{} m\u00B3 mining yield per second ({} m\u00B3 per hour)".format(yps, yph))
|
||||
if wasteValue > 0:
|
||||
tipLines.append("{} m\u00B3 mining waste per second ({} m\u00B3 per hour)".format(wps, wph))
|
||||
tipLines.append("{} m\u00B3 yield per second ({} m\u00B3 per hour)".format(yps, yph))
|
||||
tipLines.append("{} m\u00B3 drain per second ({} m\u00B3 per hour)".format(dps, dph))
|
||||
tipLines.append(f'{efficiency} efficiency')
|
||||
label.SetToolTip(wx.ToolTip('\n'.join(tipLines)))
|
||||
self._cachedValues[counter] = (yieldValue, wasteValue)
|
||||
self._cachedValues[counter] = (yieldValue, drainValue)
|
||||
counter += 1
|
||||
self.panel.Layout()
|
||||
self.headerPanel.Layout()
|
||||
|
||||
@@ -27,6 +27,7 @@ from gui.viewColumn import ViewColumn
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
from gui.utils.numberFormatter import formatAmount
|
||||
from gui.utils.listFormatter import formatList
|
||||
from eos.utils.float import floatUnerr
|
||||
from eos.utils.spoolSupport import SpoolType, SpoolOptions
|
||||
import eos.config
|
||||
|
||||
@@ -195,7 +196,7 @@ class Miscellanea(ViewColumn):
|
||||
tooltip = "Warp core strength modification"
|
||||
return text, tooltip
|
||||
elif (
|
||||
itemGroup in ("Stasis Web", "Stasis Webifying Drone", "Structure Stasis Webifier") or
|
||||
itemGroup in ("Stasis Web", "Stasis Grappler", "Stasis Webifying Drone", "Structure Stasis Webifier") or
|
||||
(itemGroup in ("Structure Burst Projector", "Burst Projectors") and "doomsdayAOEWeb" in item.effects)
|
||||
):
|
||||
speedFactor = stuff.getModifiedItemAttr("speedFactor")
|
||||
@@ -291,7 +292,7 @@ class Miscellanea(ViewColumn):
|
||||
"Gyrostabilizer",
|
||||
"Magnetic Field Stabilizer",
|
||||
"Heat Sink",
|
||||
"Ballistic Control system",
|
||||
"Ballistic Control System",
|
||||
"Structure Weapon Upgrade",
|
||||
"Entropic Radiation Sink",
|
||||
"Vorton Projector Upgrade"
|
||||
@@ -300,7 +301,7 @@ class Miscellanea(ViewColumn):
|
||||
"Gyrostabilizer": ("damageMultiplier", "speedMultiplier", "Projectile weapon"),
|
||||
"Magnetic Field Stabilizer": ("damageMultiplier", "speedMultiplier", "Hybrid weapon"),
|
||||
"Heat Sink": ("damageMultiplier", "speedMultiplier", "Energy weapon"),
|
||||
"Ballistic Control system": ("missileDamageMultiplierBonus", "speedMultiplier", "Missile"),
|
||||
"Ballistic Control System": ("missileDamageMultiplierBonus", "speedMultiplier", "Missile"),
|
||||
"Structure Weapon Upgrade": ("missileDamageMultiplierBonus", "speedMultiplier", "Missile"),
|
||||
"Entropic Radiation Sink": ("damageMultiplier", "speedMultiplier", "Precursor weapon"),
|
||||
"Vorton Projector Upgrade": ("damageMultiplier", "speedMultiplier", "Vorton projector")}
|
||||
@@ -547,18 +548,24 @@ class Miscellanea(ViewColumn):
|
||||
if not yps:
|
||||
return "", None
|
||||
yph = yps * 3600
|
||||
wps = stuff.getMiningWPS(ignoreState=True)
|
||||
wph = wps * 3600
|
||||
dps = stuff.getMiningDPS(ignoreState=True)
|
||||
dph = dps * 3600
|
||||
try:
|
||||
efficiency = yps / dps
|
||||
except ZeroDivisionError:
|
||||
efficiency = 0
|
||||
textParts = []
|
||||
textParts.append(formatAmount(yps, 3, 0, 3))
|
||||
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(
|
||||
formatAmount(yps, 3, 0, 3), formatAmount(yph, 3, 0, 3)))
|
||||
if wps > 0:
|
||||
textParts.append(formatAmount(wps, 3, 0, 3))
|
||||
tipLines.append("{} m\u00B3 mining waste per second ({} m\u00B3 per hour)".format(
|
||||
formatAmount(wps, 3, 0, 3), formatAmount(wph, 3, 0, 3)))
|
||||
text = '{} m\u00B3/s'.format('+'.join(textParts))
|
||||
tipLines.append("{} m\u00B3 mining drain per second ({} m\u00B3 per hour)".format(
|
||||
formatAmount(dps, 3, 0, 3), formatAmount(dph, 3, 0, 3)))
|
||||
if floatUnerr(efficiency) != 1:
|
||||
eff_text = '{}%'.format(formatAmount(efficiency * 100, 4, 0, 0))
|
||||
textParts.append(eff_text)
|
||||
tipLines.append(f"{eff_text} mining efficiency")
|
||||
text = '{}'.format(' | '.join(textParts))
|
||||
tooltip = '\n'.join(tipLines)
|
||||
return text, tooltip
|
||||
elif itemGroup == "Logistic Drone":
|
||||
@@ -701,7 +708,7 @@ class Miscellanea(ViewColumn):
|
||||
formatAmount(itemArmorResistanceShiftHardenerExp, 3, 0, 3),
|
||||
)
|
||||
return text, tooltip
|
||||
elif itemGroup in ("Cargo Scanner", "Ship Scanner", "Survey Scanner"):
|
||||
elif itemGroup in ("Cargo Scanner", "Ship Scanner"):
|
||||
duration = stuff.getModifiedItemAttr("duration")
|
||||
if not duration:
|
||||
return "", None
|
||||
@@ -766,15 +773,36 @@ class Miscellanea(ViewColumn):
|
||||
elif buffId == 22: # Skirmish Burst: Rapid Deployment: AB/MWD Speed Increase
|
||||
textSections.append(f"{formatAmount(buffValue, 3, 0, 3, forceSign=True)}%")
|
||||
tooltipSections.append("AB/MWD speed increase")
|
||||
elif buffId == 23: # Mining Burst: Mining Laser Field Enhancement: Mining/Survey Range
|
||||
elif buffId == 23: # Mining Burst: Mining Laser Field Enhancement: Mining Range
|
||||
textSections.append(f"{formatAmount(buffValue, 3, 0, 3, forceSign=True)}%")
|
||||
tooltipSections.append("mining/survey module range")
|
||||
tooltipSections.append("mining module range")
|
||||
elif buffId == 24: # Mining Burst: Mining Laser Optimization: Mining Capacitor/Duration
|
||||
textSections.append(f"{formatAmount(buffValue, 3, 0, 3, forceSign=True)}%")
|
||||
tooltipSections.append("mining module duration & capacitor use")
|
||||
elif buffId == 25: # Mining Burst: Mining Equipment Preservation: Crystal Volatility
|
||||
textSections.append(f"{formatAmount(buffValue, 3, 0, 3, forceSign=True)}%")
|
||||
tooltipSections.append("mining crystal volatility")
|
||||
elif buffId == 2464: # Expedition Burst: Probe Strength
|
||||
textSections.append(f"{formatAmount(buffValue, 3, 0, 3, forceSign=True)}%")
|
||||
tooltipSections.append("scan probe strength")
|
||||
elif buffId == 2465: # Expedition Burst: Directional Scanner, Hacking and Salvager Range
|
||||
textSections.append(f"{formatAmount(buffValue, 3, 0, 3, forceSign=True)}%")
|
||||
tooltipSections.append("dscan, hacking & salvaging range")
|
||||
elif buffId == 2466: # Expedition Burst: Maximum Scan Deviation Modifier
|
||||
textSections.append(f"{formatAmount(buffValue, 3, 0, 3, forceSign=True)}%")
|
||||
tooltipSections.append("scan probe deviation")
|
||||
elif buffId == 2468: # Expedition Burst: Virus Coherence
|
||||
textSections.append(f"{formatAmount(buffValue, 3, 0, 3, forceSign=True)}")
|
||||
tooltipSections.append("virus coherence")
|
||||
elif buffId == 2481: # Expedition Burst: Salvager duration bonus
|
||||
textSections.append(f"{formatAmount(buffValue, 3, 0, 3, forceSign=True)}%")
|
||||
tooltipSections.append("salvager cycle time")
|
||||
elif buffId == 2516: # Mining Burst: Mining Crit Chance
|
||||
textSections.append(f"{formatAmount(buffValue, 3, 0, 3, forceSign=True)}%")
|
||||
tooltipSections.append("crit chance")
|
||||
elif buffId == 2517: # Mining Burst: Mining Residue Chance Reduction
|
||||
textSections.append(f"{formatAmount(buffValue, 3, 0, 3, forceSign=True)}%")
|
||||
tooltipSections.append("waste chance")
|
||||
if not textSections:
|
||||
return '', None
|
||||
text = ' | '.join(textSections)
|
||||
|
||||
BIN
imgs/icons/1546@1x.png
Normal file
|
After Width: | Height: | Size: 767 B |
BIN
imgs/icons/1546@2x.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
imgs/icons/25235@1x.png
Normal file
|
After Width: | Height: | Size: 769 B |
BIN
imgs/icons/25235@2x.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
imgs/icons/25236@1x.png
Normal file
|
After Width: | Height: | Size: 805 B |
BIN
imgs/icons/25236@2x.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
imgs/icons/25237@1x.png
Normal file
|
After Width: | Height: | Size: 796 B |
BIN
imgs/icons/25237@2x.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
imgs/icons/25238@1x.png
Normal file
|
After Width: | Height: | Size: 812 B |
BIN
imgs/icons/25238@2x.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
imgs/icons/25240@1x.png
Normal file
|
After Width: | Height: | Size: 809 B |
BIN
imgs/icons/25240@2x.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
imgs/icons/25241@1x.png
Normal file
|
After Width: | Height: | Size: 847 B |
BIN
imgs/icons/25241@2x.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
imgs/icons/25242@1x.png
Normal file
|
After Width: | Height: | Size: 856 B |
BIN
imgs/icons/25242@2x.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
imgs/icons/25243@1x.png
Normal file
|
After Width: | Height: | Size: 847 B |
BIN
imgs/icons/25243@2x.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
imgs/icons/25245@1x.png
Normal file
|
After Width: | Height: | Size: 802 B |
BIN
imgs/icons/25245@2x.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
imgs/icons/25246@1x.png
Normal file
|
After Width: | Height: | Size: 841 B |
BIN
imgs/icons/25246@2x.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
imgs/icons/25247@1x.png
Normal file
|
After Width: | Height: | Size: 840 B |
BIN
imgs/icons/25247@2x.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
imgs/icons/25248@1x.png
Normal file
|
After Width: | Height: | Size: 838 B |
BIN
imgs/icons/25248@2x.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
imgs/icons/25250@1x.png
Normal file
|
After Width: | Height: | Size: 821 B |
BIN
imgs/icons/25250@2x.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
imgs/icons/25251@1x.png
Normal file
|
After Width: | Height: | Size: 850 B |
BIN
imgs/icons/25251@2x.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
imgs/icons/25252@1x.png
Normal file
|
After Width: | Height: | Size: 839 B |
BIN
imgs/icons/25252@2x.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
imgs/icons/25253@1x.png
Normal file
|
After Width: | Height: | Size: 845 B |
BIN
imgs/icons/25253@2x.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
imgs/icons/27053@1x.png
Normal file
|
After Width: | Height: | Size: 938 B |
BIN
imgs/icons/27053@2x.png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
BIN
imgs/icons/27054@1x.png
Normal file
|
After Width: | Height: | Size: 928 B |
BIN
imgs/icons/27054@2x.png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
BIN
imgs/icons/27055@1x.png
Normal file
|
After Width: | Height: | Size: 918 B |
BIN
imgs/icons/27055@2x.png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
BIN
imgs/icons/27056@1x.png
Normal file
|
After Width: | Height: | Size: 912 B |
BIN
imgs/icons/27056@2x.png
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
BIN
imgs/icons/27058@1x.png
Normal file
|
After Width: | Height: | Size: 598 B |
BIN
imgs/icons/27139@1x.png
Normal file
|
After Width: | Height: | Size: 860 B |
BIN
imgs/icons/27139@2x.png
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
BIN
imgs/icons/27154@1x.png
Normal file
|
After Width: | Height: | Size: 782 B |
BIN
imgs/icons/27154@2x.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
imgs/icons/27198@1x.png
Normal file
|
After Width: | Height: | Size: 862 B |
BIN
imgs/icons/27198@2x.png
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
BIN
imgs/icons/27199@1x.png
Normal file
|
After Width: | Height: | Size: 863 B |
BIN
imgs/icons/27199@2x.png
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
BIN
imgs/icons/27200@1x.png
Normal file
|
After Width: | Height: | Size: 860 B |
BIN
imgs/icons/27200@2x.png
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
BIN
imgs/icons/27201@1x.png
Normal file
|
After Width: | Height: | Size: 878 B |
BIN
imgs/icons/27201@2x.png
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
BIN
imgs/icons/27202@1x.png
Normal file
|
After Width: | Height: | Size: 888 B |
BIN
imgs/icons/27202@2x.png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
BIN
imgs/icons/27203@1x.png
Normal file
|
After Width: | Height: | Size: 876 B |
BIN
imgs/icons/27203@2x.png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
BIN
imgs/icons/27204@1x.png
Normal file
|
After Width: | Height: | Size: 729 B |
BIN
imgs/icons/27204@2x.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
imgs/icons/27205@1x.png
Normal file
|
After Width: | Height: | Size: 811 B |
BIN
imgs/icons/27205@2x.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
imgs/icons/27206@1x.png
Normal file
|
After Width: | Height: | Size: 818 B |
BIN
imgs/icons/27206@2x.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
imgs/icons/27207@1x.png
Normal file
|
After Width: | Height: | Size: 817 B |
BIN
imgs/icons/27207@2x.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
imgs/icons/27208@1x.png
Normal file
|
After Width: | Height: | Size: 872 B |
BIN
imgs/icons/27208@2x.png
Normal file
|
After Width: | Height: | Size: 2.5 KiB |
BIN
imgs/icons/27209@1x.png
Normal file
|
After Width: | Height: | Size: 884 B |
BIN
imgs/icons/27209@2x.png
Normal file
|
After Width: | Height: | Size: 2.5 KiB |
BIN
imgs/icons/27210@1x.png
Normal file
|
After Width: | Height: | Size: 875 B |
BIN
imgs/icons/27210@2x.png
Normal file
|
After Width: | Height: | Size: 2.5 KiB |
BIN
imgs/icons/27211@1x.png
Normal file
|
After Width: | Height: | Size: 840 B |
BIN
imgs/icons/27211@2x.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
imgs/icons/27212@1x.png
Normal file
|
After Width: | Height: | Size: 848 B |
BIN
imgs/icons/27212@2x.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
imgs/icons/27213@1x.png
Normal file
|
After Width: | Height: | Size: 867 B |
BIN
imgs/icons/27213@2x.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
imgs/icons/27214@1x.png
Normal file
|
After Width: | Height: | Size: 867 B |
BIN
imgs/icons/27214@2x.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
imgs/icons/27215@1x.png
Normal file
|
After Width: | Height: | Size: 785 B |
BIN
imgs/icons/27215@2x.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
imgs/icons/27216@1x.png
Normal file
|
After Width: | Height: | Size: 783 B |
BIN
imgs/icons/27216@2x.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
imgs/icons/27217@1x.png
Normal file
|
After Width: | Height: | Size: 787 B |
BIN
imgs/icons/27217@2x.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
imgs/icons/27218@1x.png
Normal file
|
After Width: | Height: | Size: 641 B |
BIN
imgs/icons/27218@2x.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
imgs/icons/27219@1x.png
Normal file
|
After Width: | Height: | Size: 730 B |
BIN
imgs/icons/27219@2x.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
imgs/icons/27220@1x.png
Normal file
|
After Width: | Height: | Size: 774 B |