Skip to content

Commit

Permalink
Implement auto primary layer detection
Browse files Browse the repository at this point in the history
  • Loading branch information
DarkFenX committed Aug 4, 2019
1 parent 920b848 commit 8f2283f
Showing 1 changed file with 99 additions and 24 deletions.
123 changes: 99 additions & 24 deletions graphs/wrapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -110,41 +111,29 @@ def resistMode(self):
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,
Expand Down Expand Up @@ -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

0 comments on commit 8f2283f

Please sign in to comment.