Skip to content

Commit 6074cfe

Browse files
committed
Rework damage stats calculation to always expose full breacher info
1 parent f0a72f4 commit 6074cfe

File tree

9 files changed

+165
-191
lines changed

9 files changed

+165
-191
lines changed

eos/saveddata/drone.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import math
2121

22+
from copy import deepcopy
2223
from logbook import Logger
2324
from sqlalchemy.orm import reconstructor, validates
2425

@@ -29,7 +30,7 @@
2930
from eos.saveddata.mutator import MutatorDrone
3031
from eos.utils.cycles import CycleInfo
3132
from eos.utils.default import DEFAULT
32-
from eos.utils.stats import BaseVolleyStats, DmgTypes, RRTypes
33+
from eos.utils.stats import DmgTypes, RRTypes
3334

3435

3536
pyfalog = Logger(__name__)
@@ -165,12 +166,13 @@ def getVolleyParameters(self, targetProfile=None):
165166
if self.__baseVolley is None:
166167
dmgGetter = self.getModifiedChargeAttr if self.hasAmmo else self.getModifiedItemAttr
167168
dmgMult = self.amountActive * (self.getModifiedItemAttr("damageMultiplier", 1))
168-
self.__baseVolley = BaseVolleyStats(
169+
self.__baseVolley = DmgTypes(
169170
em=(dmgGetter("emDamage", 0)) * dmgMult,
170171
thermal=(dmgGetter("thermalDamage", 0)) * dmgMult,
171172
kinetic=(dmgGetter("kineticDamage", 0)) * dmgMult,
172173
explosive=(dmgGetter("explosiveDamage", 0)) * dmgMult)
173-
volley = DmgTypes.from_base_and_profile(base=self.__baseVolley, tgtProfile=targetProfile)
174+
volley = deepcopy(self.__baseVolley)
175+
volley.profile = targetProfile
174176
return {0: volley}
175177

176178
def getVolley(self, targetProfile=None):
@@ -184,12 +186,7 @@ def getDps(self, targetProfile=None):
184186
if cycleParams is None:
185187
return DmgTypes.default()
186188
dpsFactor = 1 / (cycleParams.averageTime / 1000)
187-
dps = DmgTypes(
188-
em=volley.em * dpsFactor,
189-
thermal=volley.thermal * dpsFactor,
190-
kinetic=volley.kinetic * dpsFactor,
191-
explosive=volley.explosive * dpsFactor,
192-
breacher=volley.breacher * dpsFactor)
189+
dps = volley * dpsFactor
193190
return dps
194191

195192
def isRemoteRepping(self, ignoreState=False):

eos/saveddata/fighter.py

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import math
2121

22+
from copy import deepcopy
2223
from logbook import Logger
2324
from sqlalchemy.orm import reconstructor, validates
2425

@@ -198,17 +199,14 @@ def getVolleyParametersPerEffect(self, targetProfile=None):
198199
for ability in self.abilities:
199200
# Not passing resists here as we want to calculate and store base volley
200201
self.__baseVolley[ability.effectID] = {0: ability.getVolley()}
201-
adjustedVolley = {}
202+
adjustedVolleys = {}
202203
for effectID, effectData in self.__baseVolley.items():
203-
adjustedVolley[effectID] = {}
204-
for volleyTime, volleyValue in effectData.items():
205-
adjustedVolley[effectID][volleyTime] = DmgTypes(
206-
em=volleyValue.em * (1 - getattr(targetProfile, "emAmount", 0)),
207-
thermal=volleyValue.thermal * (1 - getattr(targetProfile, "thermalAmount", 0)),
208-
kinetic=volleyValue.kinetic * (1 - getattr(targetProfile, "kineticAmount", 0)),
209-
explosive=volleyValue.explosive * (1 - getattr(targetProfile, "explosiveAmount", 0)),
210-
breacher=volleyValue.breacher)
211-
return adjustedVolley
204+
adjustedVolleys[effectID] = {}
205+
for volleyTime, baseVolley in effectData.items():
206+
adjustedVolley = deepcopy(baseVolley)
207+
adjustedVolley.profile = targetProfile
208+
adjustedVolleys[effectID][volleyTime] = adjustedVolley
209+
return adjustedVolleys
212210

213211
def getVolleyPerEffect(self, targetProfile=None):
214212
volleyParams = self.getVolleyParametersPerEffect(targetProfile=targetProfile)

eos/saveddata/fighterAbility.py

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -128,12 +128,8 @@ def getVolley(self, targetProfile=None):
128128
kin = self.fighter.getModifiedItemAttr("{}DamageKin".format(self.attrPrefix), 0)
129129
exp = self.fighter.getModifiedItemAttr("{}DamageExp".format(self.attrPrefix), 0)
130130
dmgMult = self.fighter.amount * self.fighter.getModifiedItemAttr("{}DamageMultiplier".format(self.attrPrefix), 1)
131-
volley = DmgTypes(
132-
em=em * dmgMult * (1 - getattr(targetProfile, "emAmount", 0)),
133-
thermal=therm * dmgMult * (1 - getattr(targetProfile, "thermalAmount", 0)),
134-
kinetic=kin * dmgMult * (1 - getattr(targetProfile, "kineticAmount", 0)),
135-
explosive=exp * dmgMult * (1 - getattr(targetProfile, "explosiveAmount", 0)),
136-
breacher=0)
131+
volley = DmgTypes(em=em * dmgMult, thermal=therm * dmgMult, kinetic=kin * dmgMult, explosive=exp * dmgMult)
132+
volley.profile = targetProfile
137133
return volley
138134

139135
def getDps(self, targetProfile=None, cycleTimeOverride=None):
@@ -142,12 +138,7 @@ def getDps(self, targetProfile=None, cycleTimeOverride=None):
142138
return DmgTypes.default()
143139
cycleTime = cycleTimeOverride if cycleTimeOverride is not None else self.cycleTime
144140
dpsFactor = 1 / (cycleTime / 1000)
145-
dps = DmgTypes(
146-
em=volley.em * dpsFactor,
147-
thermal=volley.thermal * dpsFactor,
148-
kinetic=volley.kinetic * dpsFactor,
149-
explosive=volley.explosive * dpsFactor,
150-
breacher=volley.breacher * dpsFactor)
141+
dps = volley * dpsFactor
151142
return dps
152143

153144
def clear(self):

eos/saveddata/fit.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1692,8 +1692,11 @@ def calculateWeaponDmgStats(self, spoolOptions):
16921692
weaponDps = DmgTypes.default()
16931693

16941694
for mod in self.modules:
1695-
weaponVolley += mod.getVolley(spoolOptions=spoolOptions, targetProfile=self.targetProfile)
1696-
weaponDps += mod.getDps(spoolOptions=spoolOptions, targetProfile=self.targetProfile)
1695+
weaponVolley += mod.getVolley(spoolOptions=spoolOptions)
1696+
weaponDps += mod.getDps(spoolOptions=spoolOptions)
1697+
1698+
weaponVolley.profile = self.targetProfile
1699+
weaponDps.profile = self.targetProfile
16971700

16981701
self.__weaponVolleyMap[spoolOptions] = weaponVolley
16991702
self.__weaponDpsMap[spoolOptions] = weaponDps
@@ -1703,12 +1706,15 @@ def calculateDroneDmgStats(self):
17031706
droneDps = DmgTypes.default()
17041707

17051708
for drone in self.drones:
1706-
droneVolley += drone.getVolley(targetProfile=self.targetProfile)
1707-
droneDps += drone.getDps(targetProfile=self.targetProfile)
1709+
droneVolley += drone.getVolley()
1710+
droneDps += drone.getDps()
17081711

17091712
for fighter in self.fighters:
1710-
droneVolley += fighter.getVolley(targetProfile=self.targetProfile)
1711-
droneDps += fighter.getDps(targetProfile=self.targetProfile)
1713+
droneVolley += fighter.getVolley()
1714+
droneDps += fighter.getDps()
1715+
1716+
droneVolley.profile = self.targetProfile
1717+
droneDps.profile = self.targetProfile
17121718

17131719
self.__droneDps = droneDps
17141720
self.__droneVolley = droneVolley

eos/saveddata/module.py

Lines changed: 21 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
from eos.utils.default import DEFAULT
3434
from eos.utils.float import floatUnerr
3535
from eos.utils.spoolSupport import calculateSpoolup, resolveSpoolOptions
36-
from eos.utils.stats import BaseVolleyStats, BreacherInfo, DmgTypes, RRTypes
36+
from eos.utils.stats import BreacherInfo, DmgTypes, RRTypes
3737

3838

3939
pyfalog = Logger(__name__)
@@ -483,7 +483,9 @@ def getVolleyParameters(self, spoolOptions=None, targetProfile=None, ignoreState
483483
absolute=self.getModifiedChargeAttr("dotMaxDamagePerTick", 0),
484484
relative=self.getModifiedChargeAttr("dotMaxHPPercentagePerTick", 0) / 100)
485485
for i in range(subcycles):
486-
self.__baseVolley[dmgDelay + i] = BaseVolleyStats(0, 0, 0, 0, breachers=[breacher_info])
486+
volley = DmgTypes.default()
487+
volley.add_breacher(dmgDelay + i, breacher_info)
488+
self.__baseVolley[dmgDelay + i] = volley
487489
else:
488490
dmgGetter = self.getModifiedChargeAttr if self.charge else self.getModifiedItemAttr
489491
dmgMult = self.getModifiedItemAttr("damageMultiplier", 1)
@@ -502,7 +504,7 @@ def getVolleyParameters(self, spoolOptions=None, targetProfile=None, ignoreState
502504
else:
503505
subcycles = 1
504506
for i in range(subcycles):
505-
self.__baseVolley[dmgDelay + dmgSubcycle * i] = BaseVolleyStats(
507+
self.__baseVolley[dmgDelay + dmgSubcycle * i] = DmgTypes(
506508
em=(dmgGetter("emDamage", 0)) * dmgMult,
507509
thermal=(dmgGetter("thermalDamage", 0)) * dmgMult,
508510
kinetic=(dmgGetter("kineticDamage", 0)) * dmgMult,
@@ -513,43 +515,35 @@ def getVolleyParameters(self, spoolOptions=None, targetProfile=None, ignoreState
513515
self.getModifiedItemAttr("damageMultiplierBonusPerCycle", 0),
514516
self.rawCycleTime / 1000, spoolType, spoolAmount)[0]
515517
spoolMultiplier = 1 + spoolBoost
516-
adjustedVolley = {}
517-
for volleyTime, baseValue in self.__baseVolley.items():
518-
adjustedVolley[volleyTime] = DmgTypes.from_base_and_profile(
519-
base=baseValue, tgtProfile=targetProfile, mult=spoolMultiplier)
520-
return adjustedVolley
518+
adjustedVolleys = {}
519+
for volleyTime, baseVolley in self.__baseVolley.items():
520+
adjustedVolley = baseVolley * spoolMultiplier
521+
adjustedVolley.profile = targetProfile
522+
adjustedVolleys[volleyTime] = adjustedVolley
523+
return adjustedVolleys
521524

522525
def getVolley(self, spoolOptions=None, targetProfile=None, ignoreState=False):
523526
volleyParams = self.getVolleyParameters(spoolOptions=spoolOptions, targetProfile=targetProfile, ignoreState=ignoreState)
524527
if len(volleyParams) == 0:
525528
return DmgTypes.default()
526529
return volleyParams[min(volleyParams)]
527530

528-
def getDps(self, spoolOptions=None, targetProfile=None, ignoreState=False, getSpreadDPS=False):
529-
dmgDuringCycle = DmgTypes.default()
530-
cycleParams = self.getCycleParametersForDps()
531+
def getDps(self, spoolOptions=None, targetProfile=None, ignoreState=False):
532+
dps = DmgTypes.default()
533+
cycleParams = self.getCycleParameters()
531534
if cycleParams is None:
532-
return dmgDuringCycle
535+
return dps
533536
volleyParams = self.getVolleyParameters(spoolOptions=spoolOptions, targetProfile=targetProfile, ignoreState=ignoreState)
534537
avgCycleTime = cycleParams.averageTime
535538
if len(volleyParams) == 0 or avgCycleTime == 0:
536-
return dmgDuringCycle
539+
return dps
540+
if self.isBreacher:
541+
return volleyParams[min(volleyParams)]
537542
for volleyValue in volleyParams.values():
538-
dmgDuringCycle += volleyValue
543+
dps += volleyValue
539544
dpsFactor = 1 / (avgCycleTime / 1000)
540-
dps = DmgTypes(
541-
em=dmgDuringCycle.em * dpsFactor,
542-
thermal=dmgDuringCycle.thermal * dpsFactor,
543-
kinetic=dmgDuringCycle.kinetic * dpsFactor,
544-
explosive=dmgDuringCycle.explosive * dpsFactor,
545-
breacher=dmgDuringCycle.breacher * dpsFactor)
546-
if not getSpreadDPS:
547-
return dps
548-
return {'em': dmgDuringCycle.em * dpsFactor,
549-
'therm': dmgDuringCycle.thermal * dpsFactor,
550-
'kin': dmgDuringCycle.kinetic * dpsFactor,
551-
'exp': dmgDuringCycle.explosive * dpsFactor,
552-
'breach': dmgDuringCycle.breach * dpsFactor}
545+
dps *= dpsFactor
546+
return dps
553547

554548
def isRemoteRepping(self, ignoreState=False):
555549
repParams = self.getRepAmountParameters(ignoreState=ignoreState)
@@ -961,13 +955,6 @@ def calculateModifiedAttributes(self, fit, runTime, forceProjected=False, gang=F
961955
and ((gang and effect.isType("gang")) or not gang):
962956
effect.handler(fit, self, context, projectionRange, effect=effect)
963957

964-
def getCycleParametersForDps(self, reloadOverride=None):
965-
# Special hack for breachers, since those are DoT and work independently of gun cycle
966-
if self.isBreacher:
967-
return CycleInfo(activeTime=1000, inactiveTime=0, quantity=math.inf, isInactivityReload=False)
968-
else:
969-
return self.getCycleParameters(reloadOverride=reloadOverride)
970-
971958
def getCycleParameters(self, reloadOverride=None):
972959
"""Copied from new eos as well"""
973960
# Determine if we'll take into account reload time or not

0 commit comments

Comments
 (0)