diff --git a/graphs/wrapper.py b/graphs/wrapper.py index 1ca277f19..c602e5101 100644 --- a/graphs/wrapper.py +++ b/graphs/wrapper.py @@ -20,6 +20,7 @@ import math +from eos.saveddata.damagePattern import DamagePattern from eos.saveddata.fit import Fit from eos.saveddata.targetProfile import TargetProfile from service.const import TargetResistMode @@ -110,41 +111,29 @@ class TargetWrapper(BaseWrapper): def resistMode(self, value): self.__resistMode = value - def getResists(self): + def getResists(self, includeLayer=False): + em = therm = kin = explo = 0 + layer = None if self.isProfile: em = self.item.emAmount therm = self.item.thermalAmount kin = self.item.kineticAmount explo = self.item.explosiveAmount - return em, therm, kin, explo if self.isFit: if self.resistMode == TargetResistMode.auto: - return 0, 0, 0, 0 + em, therm, kin, explo, layer = _getAutoResists(fit=self.item) elif self.resistMode == TargetResistMode.shield: - return _getShieldResists(self.item.ship) + em, therm, kin, explo = _getShieldResists(ship=self.item.ship) elif self.resistMode == TargetResistMode.armor: - return _getArmorResists(self.item.ship) + em, therm, kin, explo = _getArmorResists(ship=self.item.ship) elif self.resistMode == TargetResistMode.hull: - return _getHullResists(self.item.ship) + em, therm, kin, explo = _getHullResists(ship=self.item.ship) elif self.resistMode == TargetResistMode.weighedAverage: - shieldEmRes, shieldThermRes, shieldKinRes, shieldExploRes = _getShieldResists(self.item.ship) - armorEmRes, armorThermRes, armorKinRes, armorExploRes = _getArmorResists(self.item.ship) - hullEmRes, hullThermRes, hullKinRes, hullExploRes = _getHullResists(self.item.ship) - hpData = self.item.hp - shieldHp = hpData['shield'] - armorHp = hpData['armor'] - hullHp = hpData['hull'] - totalHp = shieldHp + armorHp + hullHp - totalEhpEm = shieldHp / (1 - shieldEmRes) + armorHp / (1 - armorEmRes) + hullHp / (1 - hullEmRes) - totalEhpTherm = shieldHp / (1 - shieldThermRes) + armorHp / (1 - armorThermRes) + hullHp / (1 - hullThermRes) - totalEhpKin = shieldHp / (1 - shieldKinRes) + armorHp / (1 - armorKinRes) + hullHp / (1 - hullKinRes) - totalEhpExplo = shieldHp / (1 - shieldExploRes) + armorHp / (1 - armorExploRes) + hullHp / (1 - hullExploRes) - weighedEmRes = 1 - totalHp / totalEhpEm - weighedThermRes = 1 - totalHp / totalEhpTherm - weighedKinRes = 1 - totalHp / totalEhpKin - weighedExploRes = 1 - totalHp / totalEhpExplo - return weighedEmRes, weighedThermRes, weighedKinRes, weighedExploRes - return 0, 0, 0, 0 + em, therm, kin, explo = _getWeighedResists(fit=self.item) + if includeLayer: + return em, therm, kin, explo, layer + else: + return em, therm, kin, explo # Just copy-paste penalization chain calculation code (with some modifications, @@ -194,3 +183,89 @@ def _getHullResists(ship): kin = 1 - ship.getModifiedItemAttr('kineticDamageResonance') explo = 1 - ship.getModifiedItemAttr('explosiveDamageResonance') return em, therm, kin, explo + + +def _getWeighedResists(fit): + shieldEmRes, shieldThermRes, shieldKinRes, shieldExploRes = _getShieldResists(fit.ship) + armorEmRes, armorThermRes, armorKinRes, armorExploRes = _getArmorResists(fit.ship) + hullEmRes, hullThermRes, hullKinRes, hullExploRes = _getHullResists(fit.ship) + hpData = fit.hp + shieldHp = hpData['shield'] + armorHp = hpData['armor'] + hullHp = hpData['hull'] + totalHp = shieldHp + armorHp + hullHp + totalEhpEm = shieldHp / (1 - shieldEmRes) + armorHp / (1 - armorEmRes) + hullHp / (1 - hullEmRes) + totalEhpTherm = shieldHp / (1 - shieldThermRes) + armorHp / (1 - armorThermRes) + hullHp / (1 - hullThermRes) + totalEhpKin = shieldHp / (1 - shieldKinRes) + armorHp / (1 - armorKinRes) + hullHp / (1 - hullKinRes) + totalEhpExplo = shieldHp / (1 - shieldExploRes) + armorHp / (1 - armorExploRes) + hullHp / (1 - hullExploRes) + weighedEmRes = 1 - totalHp / totalEhpEm + weighedThermRes = 1 - totalHp / totalEhpTherm + weighedKinRes = 1 - totalHp / totalEhpKin + weighedExploRes = 1 - totalHp / totalEhpExplo + return weighedEmRes, weighedThermRes, weighedKinRes, weighedExploRes + + +def _getAutoResists(fit): + # Get all the data + # HP / EHP + hpData = fit.hp + shieldHp = hpData['shield'] + armorHp = hpData['armor'] + hullHp = hpData['hull'] + uniformDamagePattern = DamagePattern(emAmount=25, thermalAmount=25, kineticAmount=25, explosiveAmount=25) + ehpData = uniformDamagePattern.calculateEhp(fit) + shieldEhp = ehpData['shield'] + armorEhp = ehpData['armor'] + hullEhp = ehpData['hull'] + totalEhp = shieldEhp + armorEhp + hullEhp + # Resist factors + try: + shieldResFactor = shieldEhp / shieldHp + except ZeroDivisionError: + shieldResFactor = 1 + try: + armorResFactor = armorEhp / armorHp + except ZeroDivisionError: + armorResFactor = 1 + try: + hullResFactor = hullEhp / hullHp + except ZeroDivisionError: + hullResFactor = 1 + # Tank + tankData = fit.tank + shieldTank = tankData['shieldRepair'] + armorTank = tankData['armorRepair'] + hullTank = tankData['hullRepair'] + shieldRegen = tankData['passiveShield'] + + shieldScore = 0 + armorScore = 0 + hullScore = 0 + # EHP scoring + ehpWeight = 100 + shieldScore += ehpWeight * (shieldEhp / totalEhp) ** 1.5 + armorScore += ehpWeight * (armorEhp / totalEhp) ** 1.5 + hullScore += ehpWeight * (hullEhp / totalEhp) ** 1.5 + # Resists scoring + # We include it to have some extra points for receiving better reps from the outside + resistWeight = 25 + bestResFactor = max(shieldResFactor, armorResFactor, hullResFactor) + shieldScore += resistWeight * (shieldResFactor / bestResFactor) ** 1.5 + armorScore += resistWeight * (armorResFactor / bestResFactor) ** 1.5 + hullScore += resistWeight * (hullResFactor / bestResFactor) ** 1.5 + # Active tank + activeWeight = 10000 + shieldScore += activeWeight * shieldTank * shieldResFactor / totalEhp + armorScore += activeWeight * armorTank * armorResFactor / totalEhp + hullScore += activeWeight * hullTank * hullResFactor / totalEhp + # Shield regen + regenWeight = 5000 + shieldScore += regenWeight * shieldRegen * shieldResFactor / totalEhp + maxScore = max(shieldScore, armorScore, hullScore) + if maxScore == shieldScore: + return (*_getShieldResists(fit.ship), 'shield') + if maxScore == armorScore: + return (*_getArmorResists(fit.ship), 'armor') + if maxScore == hullScore: + return (*_getHullResists(fit.ship), 'hull') + return 0, 0, 0, 0, None