Implement breacher logic on module level

This commit is contained in:
DarkPhoenix
2024-11-11 21:17:32 +01:00
parent f8e0520344
commit 13f3793515
2 changed files with 36 additions and 10 deletions

View File

@@ -479,7 +479,7 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, M
absolute=self.getModifiedChargeAttr("dotMaxDamagePerTick", 0),
relative=self.getModifiedChargeAttr("dotMaxHPPercentagePerTick", 0))
for i in range(subcycles):
self.__baseVolley[dmgDelay + i] = DmgTypes(0, 0, 0, 0, breacher=breacher_info)
self.__baseVolley[dmgDelay + i] = DmgTypes(0, 0, 0, 0, breachers=[breacher_info])
else:
dmgGetter = self.getModifiedChargeAttr if self.charge else self.getModifiedItemAttr
dmgMult = self.getModifiedItemAttr("damageMultiplier", 1)
@@ -516,7 +516,7 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut, M
thermal=volleyValue.thermal * spoolMultiplier * (1 - getattr(targetProfile, "thermalAmount", 0)),
kinetic=volleyValue.kinetic * spoolMultiplier * (1 - getattr(targetProfile, "kineticAmount", 0)),
explosive=volleyValue.explosive * spoolMultiplier * (1 - getattr(targetProfile, "explosiveAmount", 0)),
breacher=volleyValue.breacher)
breachers=volleyValue.breachers)
return adjustedVolley
def getVolley(self, spoolOptions=None, targetProfile=None, ignoreState=False):

View File

@@ -32,16 +32,36 @@ class BreacherInfo(NamedTuple):
absolute: float
relative: float
def __mul__(self, mul):
return type(self)(absolute=self.absolute * mul, relative=self.relative * mul)
def __imul__(self, mul):
if mul == 1:
return
self.absolute *= mul
self.relative *= mul
return self
def __truediv__(self, div):
return type(self)(absolute=self.absolute / div, relative=self.relative / div)
def __itruediv__(self, div):
if div == 1:
return
self.absolute /= div
self.relative /= div
return self
class DmgTypes:
"""Container for damage data stats."""
def __init__(self, em, thermal, kinetic, explosive, breacher=None):
def __init__(self, em, thermal, kinetic, explosive, breachers=None):
self.em = em
self.thermal = thermal
self.kinetic = kinetic
self.explosive = explosive
self.breacher = [] if breacher is None else breacher
self.breachers = [] if breachers is None else breachers
self._calcTotal()
# Iterator is needed to support tuple-style unpacking
@@ -77,13 +97,15 @@ class DmgTypes:
em=self.em + other.em,
thermal=self.thermal + other.thermal,
kinetic=self.kinetic + other.kinetic,
explosive=self.explosive + other.explosive)
explosive=self.explosive + other.explosive,
breachers=self.breachers + other.breachers)
def __iadd__(self, other):
self.em += other.em
self.thermal += other.thermal
self.kinetic += other.kinetic
self.explosive += other.explosive
self.breachers += other.breachers
self._calcTotal()
return self
@@ -92,7 +114,8 @@ class DmgTypes:
em=self.em * mul,
thermal=self.thermal * mul,
kinetic=self.kinetic * mul,
explosive=self.explosive * mul)
explosive=self.explosive * mul,
breachers=[b * mul for b in self.breachers])
def __imul__(self, mul):
if mul == 1:
@@ -101,6 +124,7 @@ class DmgTypes:
self.thermal *= mul
self.kinetic *= mul
self.explosive *= mul
self.breachers = [b * mul for b in self.breachers]
self._calcTotal()
return self
@@ -109,7 +133,8 @@ class DmgTypes:
em=self.em / div,
thermal=self.thermal / div,
kinetic=self.kinetic / div,
explosive=self.explosive / div)
explosive=self.explosive / div,
breachers=[b / div for b in self.breachers])
def __itruediv__(self, div):
if div == 1:
@@ -118,13 +143,14 @@ class DmgTypes:
self.thermal /= div
self.kinetic /= div
self.explosive /= div
self.breachers = [b / div for b in self.breachers]
self._calcTotal()
return self
def __repr__(self):
spec = DmgTypes.names()
spec.append('total')
return makeReprStr(self, spec)
class_name = type(self).__name__
return (f'<{class_name}(em={self.em}, thermal={self.thermal}, kinetic={self.kinetic}, '
f'explosive={self.explosive}, breachers={len(self.breachers)}, total={self.total})>')
@staticmethod
def names(short=None, postProcessor=None):