Compare commits

...

31 Commits

Author SHA1 Message Date
DarkPhoenix
1af2e7f94b Bump version & update static data 2025-11-18 12:38:44 +01:00
DarkPhoenix
dbb61a8a37 Change presentation of mining info 2025-11-17 17:25:25 +01:00
DarkPhoenix
b12adcae3d Add slowdown modifier to effects of grappler 2025-11-15 21:04:56 +01:00
DarkPhoenix
72567a7155 Add new mining charge effects 2025-11-15 15:16:01 +01:00
DarkPhoenix
0d4c2551c1 Update effects, add new ISA jargon entry and make attribute cap to use modified value 2025-11-15 14:57:39 +01:00
DarkPhoenix
ce10aeb55e Change version name back to dev 2025-11-15 13:26:07 +01:00
DarkPhoenix
7b14266f0d Update icons 2025-11-15 13:25:51 +01:00
DarkPhoenix
b436f6ec89 Change renamed items 2025-11-15 13:18:28 +01:00
DarkPhoenix
e7e3f4e626 Try non-dev name 2025-11-15 10:32:55 +01:00
DarkPhoenix
ae8405d132 Update static data and remove some now-unused data 2025-11-14 22:52:00 +01:00
DarkPhoenix
977cf61ff5 Merge branch 'master' into singularity
# Conflicts:
#	eos/effects.py
#	staticdata/fsd_built/dogmaeffects.0.json
#	staticdata/fsd_built/iconids.0.json
#	staticdata/fsd_built/marketgroups.0.json
#	staticdata/fsd_built/types.4.json
#	staticdata/fsd_built/types.5.json
#	staticdata/phobos/metadata.0.json
#	version.yml
2025-11-14 22:13:20 +01:00
DarkPhoenix
7cc4f6ec27 Add new skill effects 2025-10-30 13:00:38 +01:00
DarkPhoenix
0e6b9b48f1 Add erratic mining crystals to ammo picker 2025-10-30 12:51:51 +01:00
DarkPhoenix
a00a80b4e4 Implement effects and buffs related to expedition bursts 2025-10-30 12:44:08 +01:00
DarkPhoenix
6843373283 Implement odysseus effects 2025-10-30 12:06:24 +01:00
DarkPhoenix
408da2e344 Add outrider effects 2025-10-30 11:09:10 +01:00
DarkPhoenix
dc8ecae0f1 Implement pioneer effects 2025-10-30 10:41:05 +01:00
DarkPhoenix
50e6ed516f Implement mining burst scanner upgrade buff & faction venture effects 2025-10-30 10:23:25 +01:00
DarkPhoenix
42a6bb92a7 Implement mining crit effect for modules 2025-10-30 02:29:27 +01:00
DarkPhoenix
521a58d77b Add survey scanner effects 2025-10-30 02:19:44 +01:00
DarkPhoenix
6546f32971 Add renames 2025-10-30 02:00:31 +01:00
DarkPhoenix
ad3019debe Icon update 2025-10-30 01:56:52 +01:00
DarkPhoenix
fe9fa8b4fe Bump version 2025-10-30 01:50:52 +01:00
DarkPhoenix
92fce5be96 Update static data 2025-10-28 15:53:35 +01:00
DarkPhoenix
d271515060 Bump version 2025-10-28 14:01:28 +01:00
DarkPhoenix
343e52e556 Update static data and effects 2025-10-28 14:01:05 +01:00
DarkPhoenix
7949bc60dc Bump version 2025-10-07 08:22:34 +02:00
DarkPhoenix
bfbd3526cd Add icons 2025-10-07 08:21:36 +02:00
DarkPhoenix
c363f7359d Update effects 2025-10-07 08:18:52 +02:00
DarkPhoenix
3a7ece6a5b Update static data 2025-10-07 07:59:41 +02:00
DarkPhoenix
e0e1c1ce03 Fix BCS group name 2025-09-11 11:17:15 +02:00
184 changed files with 86240 additions and 27556 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -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

View File

@@ -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()

View File

@@ -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()

View File

@@ -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

View File

@@ -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):

View File

@@ -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()

View File

@@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 767 B

BIN
imgs/icons/1546@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
imgs/icons/25235@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 769 B

BIN
imgs/icons/25235@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
imgs/icons/25236@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 805 B

BIN
imgs/icons/25236@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
imgs/icons/25237@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 796 B

BIN
imgs/icons/25237@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
imgs/icons/25238@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 812 B

BIN
imgs/icons/25238@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
imgs/icons/25240@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 809 B

BIN
imgs/icons/25240@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
imgs/icons/25241@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 847 B

BIN
imgs/icons/25241@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
imgs/icons/25242@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 856 B

BIN
imgs/icons/25242@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
imgs/icons/25243@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 847 B

BIN
imgs/icons/25243@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
imgs/icons/25245@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 802 B

BIN
imgs/icons/25245@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
imgs/icons/25246@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 841 B

BIN
imgs/icons/25246@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
imgs/icons/25247@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 840 B

BIN
imgs/icons/25247@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
imgs/icons/25248@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 838 B

BIN
imgs/icons/25248@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
imgs/icons/25250@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 821 B

BIN
imgs/icons/25250@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
imgs/icons/25251@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 850 B

BIN
imgs/icons/25251@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
imgs/icons/25252@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 839 B

BIN
imgs/icons/25252@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
imgs/icons/25253@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 845 B

BIN
imgs/icons/25253@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
imgs/icons/27053@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 938 B

BIN
imgs/icons/27053@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

BIN
imgs/icons/27054@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 928 B

BIN
imgs/icons/27054@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

BIN
imgs/icons/27055@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 918 B

BIN
imgs/icons/27055@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

BIN
imgs/icons/27056@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 912 B

BIN
imgs/icons/27056@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
imgs/icons/27058@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 598 B

BIN
imgs/icons/27139@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 860 B

BIN
imgs/icons/27139@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
imgs/icons/27154@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 782 B

BIN
imgs/icons/27154@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
imgs/icons/27198@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 862 B

BIN
imgs/icons/27198@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
imgs/icons/27199@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 863 B

BIN
imgs/icons/27199@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
imgs/icons/27200@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 860 B

BIN
imgs/icons/27200@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
imgs/icons/27201@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 B

BIN
imgs/icons/27201@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
imgs/icons/27202@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 888 B

BIN
imgs/icons/27202@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

BIN
imgs/icons/27203@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 876 B

BIN
imgs/icons/27203@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

BIN
imgs/icons/27204@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 729 B

BIN
imgs/icons/27204@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
imgs/icons/27205@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 811 B

BIN
imgs/icons/27205@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
imgs/icons/27206@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 818 B

BIN
imgs/icons/27206@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
imgs/icons/27207@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 817 B

BIN
imgs/icons/27207@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
imgs/icons/27208@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 872 B

BIN
imgs/icons/27208@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

BIN
imgs/icons/27209@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 884 B

BIN
imgs/icons/27209@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

BIN
imgs/icons/27210@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 875 B

BIN
imgs/icons/27210@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

BIN
imgs/icons/27211@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 840 B

BIN
imgs/icons/27211@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
imgs/icons/27212@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 848 B

BIN
imgs/icons/27212@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
imgs/icons/27213@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 867 B

BIN
imgs/icons/27213@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
imgs/icons/27214@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 867 B

BIN
imgs/icons/27214@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
imgs/icons/27215@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 785 B

BIN
imgs/icons/27215@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
imgs/icons/27216@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 783 B

BIN
imgs/icons/27216@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
imgs/icons/27217@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 787 B

BIN
imgs/icons/27217@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
imgs/icons/27218@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 641 B

BIN
imgs/icons/27218@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
imgs/icons/27219@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 730 B

BIN
imgs/icons/27219@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
imgs/icons/27220@1x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 774 B

Some files were not shown because too many files have changed in this diff Show More