From d93544b3bc726e91afbd099e956777d9a4c0dcea Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Sun, 12 May 2019 06:46:28 +0300 Subject: [PATCH] Fix DPS over time graph --- eos/graph/fitDmgTime.py | 8 ++-- eos/graph/fitDpsTime.py | 76 +++++++++++++++++++++++++++++++-- gui/builtinGraphs/fitDpsTime.py | 1 + 3 files changed, 78 insertions(+), 7 deletions(-) diff --git a/eos/graph/fitDmgTime.py b/eos/graph/fitDmgTime.py index 0f0b3dee2..df510daf2 100644 --- a/eos/graph/fitDmgTime.py +++ b/eos/graph/fitDmgTime.py @@ -45,7 +45,7 @@ class FitDmgTimeGraph(Graph): def recalc(self): def addDmg(addedTime, addedDmg): - if addDmg == 0: + if addedDmg == 0: return if addedTime not in self.__cache: prevTime = max((t for t in self.__cache if t < addedTime), default=None) @@ -69,7 +69,7 @@ class FitDmgTimeGraph(Graph): for cycleTime, inactiveTime in cycleParams.iterCycles(): volleyParams = mod.getVolleyParameters(spoolOptions=SpoolOptions(SpoolType.CYCLES, nonstopCycles, True)) for volleyTime, volley in volleyParams.items(): - if currentTime + volleyTime <= maxTime: + if currentTime + volleyTime <= maxTime and volleyTime <= cycleTime: addDmg(currentTime + volleyTime, volley.total) currentTime += cycleTime currentTime += inactiveTime @@ -87,7 +87,7 @@ class FitDmgTimeGraph(Graph): volleyParams = drone.getVolleyParameters() for cycleTime, inactiveTime in cycleParams.iterCycles(): for volleyTime, volley in volleyParams.items(): - if currentTime + volleyTime <= maxTime: + if currentTime + volleyTime <= maxTime and volleyTime <= cycleTime: addDmg(currentTime + volleyTime, volley.total) currentTime += cycleTime currentTime += inactiveTime @@ -105,7 +105,7 @@ class FitDmgTimeGraph(Graph): abilityVolleyParams = volleyParams[effectID] for cycleTime, inactiveTime in abilityCycleParams.iterCycles(): for volleyTime, volley in abilityVolleyParams.items(): - if currentTime + volleyTime <= maxTime: + if currentTime + volleyTime <= maxTime and volleyTime <= cycleTime: addDmg(currentTime + volleyTime, volley.total) currentTime += cycleTime currentTime += inactiveTime diff --git a/eos/graph/fitDpsTime.py b/eos/graph/fitDpsTime.py index 2a532ece3..34bad137c 100644 --- a/eos/graph/fitDpsTime.py +++ b/eos/graph/fitDpsTime.py @@ -33,10 +33,80 @@ class FitDpsTimeGraph(Graph): def __init__(self, fit, data=None): Graph.__init__(self, fit, self.calcDps, data if data is not None else self.defaults) self.fit = fit + self.__cache = [] def calcDps(self, data): - fit = self.fit - time = data["time"] - dps = fit.getTotalDps(spoolOptions=SpoolOptions(SpoolType.TIME, time, True)).total + time = data["time"] * 1000 + entries = (e for e in self.__cache if e[0] <= time < e[1]) + dps = sum(e[2] for e in entries) return dps + def recalc(self): + + def addDmg(addedTimeStart, addedTimeFinish, addedDmg): + if addedDmg == 0: + return + addedDps = 1000 * addedDmg / (addedTimeFinish - addedTimeStart) + self.__cache.append((addedTimeStart, addedTimeFinish, addedDps)) + + self.__cache = [] + fit = self.fit + # We'll handle calculations in milliseconds + maxTime = self.data["time"].data[0].end * 1000 + for mod in fit.modules: + cycleParams = mod.getCycleParameters(reloadOverride=True) + if cycleParams is None: + continue + currentTime = 0 + nonstopCycles = 0 + for cycleTime, inactiveTime in cycleParams.iterCycles(): + cycleDamage = 0 + volleyParams = mod.getVolleyParameters(spoolOptions=SpoolOptions(SpoolType.CYCLES, nonstopCycles, True)) + for volleyTime, volley in volleyParams.items(): + if currentTime + volleyTime <= maxTime and volleyTime <= cycleTime: + cycleDamage += volley.total + addDmg(currentTime, currentTime + cycleTime, cycleDamage) + currentTime += cycleTime + currentTime += inactiveTime + if inactiveTime > 0: + nonstopCycles = 0 + else: + nonstopCycles += 1 + if currentTime > maxTime: + break + for drone in fit.drones: + cycleParams = drone.getCycleParameters(reloadOverride=True) + if cycleParams is None: + continue + currentTime = 0 + for cycleTime, inactiveTime in cycleParams.iterCycles(): + cycleDamage = 0 + volleyParams = drone.getVolleyParameters() + for volleyTime, volley in volleyParams.items(): + if currentTime + volleyTime <= maxTime and volleyTime <= cycleTime: + cycleDamage += volley.total + addDmg(currentTime, currentTime + cycleTime, cycleDamage) + currentTime += cycleTime + currentTime += inactiveTime + if currentTime > maxTime: + break + for fighter in fit.fighters: + cycleParams = fighter.getCycleParametersPerEffectOptimizedDps(reloadOverride=True) + if cycleParams is None: + continue + volleyParams = fighter.getVolleyParametersPerEffect() + for effectID, abilityCycleParams in cycleParams.items(): + if effectID not in volleyParams: + continue + abilityVolleyParams = volleyParams[effectID] + currentTime = 0 + for cycleTime, inactiveTime in abilityCycleParams.iterCycles(): + cycleDamage = 0 + for volleyTime, volley in abilityVolleyParams.items(): + if currentTime + volleyTime <= maxTime and volleyTime <= cycleTime: + cycleDamage += volley.total + addDmg(currentTime, currentTime + cycleTime, cycleDamage) + currentTime += cycleTime + currentTime += inactiveTime + if currentTime > maxTime: + break diff --git a/gui/builtinGraphs/fitDpsTime.py b/gui/builtinGraphs/fitDpsTime.py index 12843429a..0f30f1808 100644 --- a/gui/builtinGraphs/fitDpsTime.py +++ b/gui/builtinGraphs/fitDpsTime.py @@ -72,6 +72,7 @@ class FitDpsTimeGraph(Graph): x = [] y = [] + fitDpsTime.recalc() for point, val in fitDpsTime.getIterator(): x.append(point[variable]) y.append(val)