Implement RR diminishing returns

This commit is contained in:
DarkPhoenix
2023-11-13 21:45:40 +06:00
parent 02f7fbf1b1
commit d127dd9a7e
2 changed files with 74 additions and 33 deletions

View File

@@ -24749,7 +24749,7 @@ class Effect6185(BaseEffect):
srcFalloffRange=module.getModifiedItemAttr('falloffEffectiveness'),
distance=projectionRange)
duration = module.getModifiedItemAttr('duration') / 1000.0
fit.extraAttributes.increase('hullRepair', bonus / duration, **kwargs)
fit._hullRr.append((bonus, duration))
class Effect6186(BaseEffect):
@@ -24774,7 +24774,7 @@ class Effect6186(BaseEffect):
srcFalloffRange=container.getModifiedItemAttr('falloffEffectiveness'),
distance=projectionRange)
duration = container.getModifiedItemAttr('duration') / 1000.0
fit.extraAttributes.increase('shieldRepair', bonus / duration, **kwargs)
fit._shieldRr.append((bonus, duration))
class Effect6187(BaseEffect):
@@ -24828,10 +24828,9 @@ class Effect6188(BaseEffect):
srcFalloffRange=container.getModifiedItemAttr('falloffEffectiveness'),
distance=projectionRange)
duration = container.getModifiedItemAttr('duration') / 1000.0
rps = bonus / duration
fit.extraAttributes.increase('armorRepair', rps, **kwargs)
fit.extraAttributes.increase('armorRepairPreSpool', rps, **kwargs)
fit.extraAttributes.increase('armorRepairFullSpool', rps, **kwargs)
fit._armorRr.append((bonus, duration))
fit._armorRrPreSpool.append((bonus, duration))
fit._armorRrFullSpool.append((bonus, duration))
class Effect6195(BaseEffect):
@@ -29788,10 +29787,9 @@ class Effect6651(BaseEffect):
srcFalloffRange=module.getModifiedItemAttr('falloffEffectiveness'),
distance=projectionRange)
speed = module.getModifiedItemAttr('duration') / 1000.0
rps = amount / speed
fit.extraAttributes.increase('armorRepair', rps, **kwargs)
fit.extraAttributes.increase('armorRepairPreSpool', rps, **kwargs)
fit.extraAttributes.increase('armorRepairFullSpool', rps, **kwargs)
fit._armorRr.append((amount, speed))
fit._armorRrPreSpool.append((amount, speed))
fit._armorRrFullSpool.append((amount, speed))
class Effect6652(BaseEffect):
@@ -29817,7 +29815,7 @@ class Effect6652(BaseEffect):
srcFalloffRange=module.getModifiedItemAttr('falloffEffectiveness'),
distance=projectionRange)
speed = module.getModifiedItemAttr('duration') / 1000.0
fit.extraAttributes.increase('shieldRepair', amount / speed, **kwargs)
fit._shieldRr.append((amount, speed))
class Effect6653(BaseEffect):
@@ -30446,10 +30444,9 @@ class Effect6687(BaseEffect):
return
bonus = container.getModifiedItemAttr('armorDamageAmount')
duration = container.getModifiedItemAttr('duration') / 1000.0
rps = bonus / duration
fit.extraAttributes.increase('armorRepair', rps, **kwargs)
fit.extraAttributes.increase('armorRepairPreSpool', rps, **kwargs)
fit.extraAttributes.increase('armorRepairFullSpool', rps, **kwargs)
fit._armorRr.append((bonus, duration))
fit._armorRrPreSpool.append((bonus, duration))
fit._armorRrFullSpool.append((bonus, duration))
class Effect6688(BaseEffect):
@@ -30472,7 +30469,7 @@ class Effect6688(BaseEffect):
return
bonus = container.getModifiedItemAttr('shieldBonus')
duration = container.getModifiedItemAttr('duration') / 1000.0
fit.extraAttributes.increase('shieldRepair', bonus / duration, **kwargs)
fit._shieldRr.append((bonus, duration))
class Effect6689(BaseEffect):
@@ -30496,7 +30493,7 @@ class Effect6689(BaseEffect):
return
bonus = module.getModifiedItemAttr('structureDamageAmount')
duration = module.getModifiedItemAttr('duration') / 1000.0
fit.extraAttributes.increase('hullRepair', bonus / duration, **kwargs)
fit._hullRr.append((bonus, duration))
class Effect6690(BaseEffect):
@@ -35047,12 +35044,12 @@ class Effect7166(BaseEffect):
repSpoolPerCycle = container.getModifiedItemAttr('repairMultiplierBonusPerCycle')
defaultSpoolValue = eos.config.settings['globalDefaultSpoolupPercentage']
spoolType, spoolAmount = resolveSpoolOptions(SpoolOptions(SpoolType.SPOOL_SCALE, defaultSpoolValue, False), container)
rps = repAmountBase * (1 + calculateSpoolup(repSpoolMax, repSpoolPerCycle, cycleTime, spoolType, spoolAmount)[0]) / cycleTime
rpsPreSpool = repAmountBase * (1 + calculateSpoolup(repSpoolMax, repSpoolPerCycle, cycleTime, SpoolType.SPOOL_SCALE, 0)[0]) / cycleTime
rpsFullSpool = repAmountBase * (1 + calculateSpoolup(repSpoolMax, repSpoolPerCycle, cycleTime, SpoolType.SPOOL_SCALE, 1)[0]) / cycleTime
fit.extraAttributes.increase('armorRepair', rps, **kwargs)
fit.extraAttributes.increase('armorRepairPreSpool', rpsPreSpool, **kwargs)
fit.extraAttributes.increase('armorRepairFullSpool', rpsFullSpool, **kwargs)
amount = repAmountBase * (1 + calculateSpoolup(repSpoolMax, repSpoolPerCycle, cycleTime, spoolType, spoolAmount)[0])
amountPreSpool = repAmountBase * (1 + calculateSpoolup(repSpoolMax, repSpoolPerCycle, cycleTime, SpoolType.SPOOL_SCALE, 0)[0])
amountFullSpool = repAmountBase * (1 + calculateSpoolup(repSpoolMax, repSpoolPerCycle, cycleTime, SpoolType.SPOOL_SCALE, 1)[0])
fit._armorRr.append((amount, cycleTime))
fit._armorRrPreSpool.append((amountPreSpool, cycleTime))
fit._armorRrFullSpool.append((amountFullSpool, cycleTime))
class Effect7167(BaseEffect):

View File

@@ -159,6 +159,12 @@ class Fit:
self.gangBoosts = None
self.__ecmProjectedList = []
self.commandBonuses = {}
# Reps received, as a list of (amount, cycle time in seconds)
self._hullRr = []
self._armorRr = []
self._armorRrPreSpool = []
self._armorRrFullSpool = []
self._shieldRr = []
def clearFactorReloadDependentData(self):
# Here we clear all data known to rely on cycle parameters
@@ -550,6 +556,12 @@ class Fit:
if stuff is not None and stuff != self:
stuff.clear()
self._hullRr.clear()
self._armorRr.clear()
self._armorRrPreSpool.clear()
self._armorRrFullSpool.clear()
self._shieldRr.clear()
# If this is the active fit that we are clearing, not a projected fit,
# then this will run and clear the projected ships and flag the next
# iteration to skip this part to prevent recursion.
@@ -1478,11 +1490,11 @@ class Fit:
def tank(self):
reps = {
"passiveShield": self.calculateShieldRecharge(),
"shieldRepair": self.extraAttributes["shieldRepair"],
"armorRepair": self.extraAttributes["armorRepair"],
"armorRepairPreSpool": self.extraAttributes["armorRepairPreSpool"],
"armorRepairFullSpool": self.extraAttributes["armorRepairFullSpool"],
"hullRepair": self.extraAttributes["hullRepair"]
"shieldRepair": self.extraAttributes["shieldRepair"] + self._getAppliedShieldRr(),
"armorRepair": self.extraAttributes["armorRepair"] + self._getAppliedArmorRr(),
"armorRepairPreSpool": self.extraAttributes["armorRepairPreSpool"] + self._getAppliedArmorPreSpoolRr(),
"armorRepairFullSpool": self.extraAttributes["armorRepairFullSpool"] + self._getAppliedArmorFullSpoolRr(),
"hullRepair": self.extraAttributes["hullRepair"] + self._getAppliedHullRr()
}
return reps
@@ -1519,11 +1531,11 @@ class Fit:
if self.__sustainableTank is None:
sustainable = {
"passiveShield": self.calculateShieldRecharge(),
"shieldRepair": self.extraAttributes["shieldRepair"],
"armorRepair": self.extraAttributes["armorRepair"],
"armorRepairPreSpool": self.extraAttributes["armorRepairPreSpool"],
"armorRepairFullSpool": self.extraAttributes["armorRepairFullSpool"],
"hullRepair": self.extraAttributes["hullRepair"]
"shieldRepair": self.extraAttributes["shieldRepair"] + self._getAppliedShieldRr(),
"armorRepair": self.extraAttributes["armorRepair"] + self._getAppliedArmorRr(),
"armorRepairPreSpool": self.extraAttributes["armorRepairPreSpool"] + self._getAppliedArmorPreSpoolRr(),
"armorRepairFullSpool": self.extraAttributes["armorRepairFullSpool"] + self._getAppliedArmorFullSpoolRr(),
"hullRepair": self.extraAttributes["hullRepair"] + self._getAppliedHullRr()
}
if not self.capStable or self.factorReload:
# Map a local repairer type to the attribute it uses
@@ -1760,6 +1772,38 @@ class Fit:
mults.setdefault(stackingGroup, []).append((1 + strength / 100, None))
return calculateMultiplier(mults)
def _getAppliedHullRr(self):
return self.__getAppliedRr(self._hullRr)
def _getAppliedArmorRr(self):
return self.__getAppliedRr(self._armorRr)
def _getAppliedArmorPreSpoolRr(self):
return self.__getAppliedRr(self._armorRrPreSpool)
def _getAppliedArmorFullSpoolRr(self):
return self.__getAppliedRr(self._armorRrFullSpool)
def _getAppliedShieldRr(self):
return self.__getAppliedRr(self._shieldRr)
@staticmethod
def __getAppliedRr(rrList):
totalRaw = 0
for amount, cycleTime in rrList:
# That's right, for considerations of RR diminishing returns cycle time is rounded this way
totalRaw += amount / int(cycleTime)
RR_ADDITION = 7000
RR_MULTIPLIER = 10
appliedRr = 0
for amount, cycleTime in rrList:
rrps = amount / int(cycleTime)
modified_rrps = RR_ADDITION + (rrps * RR_MULTIPLIER)
rrps_mult = 1 - (((rrps + modified_rrps) / (totalRaw + modified_rrps)) - 1) ** 2
appliedRr += rrps_mult * amount / cycleTime
return appliedRr
def __deepcopy__(self, memo=None):
fitCopy = Fit()
# Character and owner are not copied