Implement auto primary layer detection
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user