From 6984bd435f455097706a0481c246639015a27c7b Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Sun, 7 Jul 2019 21:22:23 +0300 Subject: [PATCH] Add functions which calculate webbed/TPed stats and plug them into distance calculation --- gui/builtinGraphs/fitDamageStats/calc.py | 37 ++++++++++++++++++- gui/builtinGraphs/fitDamageStats/graph.py | 25 +++++++++++-- .../fitDamageStats/projectedCache.py | 4 +- 3 files changed, 60 insertions(+), 6 deletions(-) diff --git a/gui/builtinGraphs/fitDamageStats/calc.py b/gui/builtinGraphs/fitDamageStats/calc.py index 159e08b73..8ec65825d 100644 --- a/gui/builtinGraphs/fitDamageStats/calc.py +++ b/gui/builtinGraphs/fitDamageStats/calc.py @@ -171,6 +171,35 @@ def getFighterAbilityMult(fighter, ability, fit, distance, tgtSpeed, tgtSigRadiu return mult +def applyWebs(tgt, currentUnwebbedSpeed, webMods, distance): + unwebbedSpeed = tgt.ship.getModifiedItemAttr('maxVelocity') + try: + speedRatio = currentUnwebbedSpeed / unwebbedSpeed + except ZeroDivisionError: + currentWebbedSpeed = 0 + else: + appliedBoosts = [] + for boost, optimal, falloff in webMods: + appliedBoost = boost * _calcRangeFactor(atkOptimalRange=optimal, atkFalloffRange=falloff, distance=distance) + if appliedBoost: + appliedBoosts.append(appliedBoost) + webbedSpeed = tgt.ship.getModifiedItemAttrWithExtraMods('maxVelocity', boosts=appliedBoosts) + currentWebbedSpeed = webbedSpeed * speedRatio + return currentWebbedSpeed + + +def applyTps(tgt, tpMods, distance): + untpedSig = tgt.ship.getModifiedItemAttr('signatureRadius') + appliedBoosts = [] + for boost, optimal, falloff in tpMods: + appliedBoost = boost * _calcRangeFactor(atkOptimalRange=optimal, atkFalloffRange=falloff, distance=distance) + if appliedBoost: + appliedBoosts.append(appliedBoost) + tpedSig = tgt.ship.getModifiedItemAttrWithExtraMods('signatureRadius', boosts=appliedBoosts) + mult = tpedSig / untpedSig + return mult + + # Turret-specific @lru_cache(maxsize=50) def _calcTurretMult(chanceToHit): @@ -247,7 +276,13 @@ def _calcAggregatedDrf(reductionFactor, reductionSensitivity): # Generic def _calcRangeFactor(atkOptimalRange, atkFalloffRange, distance): """Range strength/chance factor, applicable to guns, ewar, RRs, etc.""" - return 0.5 ** ((max(0, distance - atkOptimalRange) / atkFalloffRange) ** 2) + if atkFalloffRange > 0: + factor = 0.5 ** ((max(0, distance - atkOptimalRange) / atkFalloffRange) ** 2) + elif distance <= atkOptimalRange: + factor = 1 + else: + factor = 0 + return factor def _calcBombFactor(atkEr, tgtSigRadius): diff --git a/gui/builtinGraphs/fitDamageStats/graph.py b/gui/builtinGraphs/fitDamageStats/graph.py index 8a1d1cb6c..dc5386c96 100644 --- a/gui/builtinGraphs/fitDamageStats/graph.py +++ b/gui/builtinGraphs/fitDamageStats/graph.py @@ -24,7 +24,11 @@ from eos.utils.spoolSupport import SpoolType, SpoolOptions from eos.utils.stats import DmgTypes from gui.builtinGraphs.base import FitGraph, XDef, YDef, Input, VectorDef from service.const import GraphCacheCleanupReason -from .calc import getTurretMult, getLauncherMult, getDroneMult, getFighterAbilityMult, getSmartbombMult, getBombMult, getGuidedBombMult +from service.settings import GraphSettings +from .calc import ( + getTurretMult, getLauncherMult, getDroneMult, getFighterAbilityMult, + getSmartbombMult, getBombMult, getGuidedBombMult, + applyWebs, applyTps) from .projectedCache import ProjectedDataCache from .timeCache import TimeCache @@ -165,7 +169,7 @@ class FitDamageStatsGraph(FitGraph): def _xDistanceGetter(self, mainInput, miscInputs, fit, tgt, dmgFunc, timeCachePrepFunc): xs = [] ys = [] - tgtSigRadius = tgt.ship.getModifiedItemAttr('signatureRadius') + applyProjected = GraphSettings.getInstance().get('applyProjected') # Process inputs into more convenient form miscInputMap = dict(miscInputs) # Get all data we need for all distances into maps/caches @@ -173,13 +177,28 @@ class FitDamageStatsGraph(FitGraph): dmgMap = dmgFunc(fit=fit, time=miscInputMap['time']) # Go through distances and calculate distance-dependent data for distance in self._iterLinear(mainInput[1]): + if applyProjected: + webMods, tpMods = self._projectedCache.getProjModData(fit) + tgtSpeed = applyWebs( + tgt=tgt, + currentUnwebbedSpeed=miscInputMap['tgtSpeed'], + webMods=webMods, + distance=distance) + tgtSigRadius = tgt.ship.getModifiedItemAttr('signatureRadius') * applyTps( + tgt=tgt, + tpMods=tpMods, + distance=distance) + print(tgtSpeed, tgtSigRadius) + else: + tgtSpeed = miscInputMap['tgtSpeed'] + tgtSigRadius = tgt.ship.getModifiedItemAttr('signatureRadius') applicationMap = self._getApplicationPerKey( fit=fit, tgt=tgt, atkSpeed=miscInputMap['atkSpeed'], atkAngle=miscInputMap['atkAngle'], distance=distance, - tgtSpeed=miscInputMap['tgtSpeed'], + tgtSpeed=tgtSpeed, tgtAngle=miscInputMap['tgtAngle'], tgtSigRadius=tgtSigRadius) dmg = self._aggregate(dmgMap=dmgMap, applicationMap=applicationMap).total diff --git a/gui/builtinGraphs/fitDamageStats/projectedCache.py b/gui/builtinGraphs/fitDamageStats/projectedCache.py index 4fc12d29f..45cb20ebd 100644 --- a/gui/builtinGraphs/fitDamageStats/projectedCache.py +++ b/gui/builtinGraphs/fitDamageStats/projectedCache.py @@ -33,7 +33,7 @@ class ProjectedDataCache(FitDataCache): projectedData = self._data.setdefault(fit.ID, {})['modules'] = (webMods, tpMods) for mod in fit.modules: if 'remoteWebifierFalloff' in mod.item.effects or 'structureModuleEffectStasisWebifier' in mod.item.effects: - webMods.append((mod.getModifiedItemAttr('speedFactor'), mod.maxRange, mod.falloff)) + webMods.append((mod.getModifiedItemAttr('speedFactor'), mod.maxRange or 0, mod.falloff or 0)) if 'remoteTargetPaintFalloff' in mod.item.effects or 'structureModuleEffectTargetPainter' in mod.item.effects: - tpMods.append((mod.getModifiedItemAttr('signatureRadiusBonus'), mod.maxRange, mod.falloff)) + tpMods.append((mod.getModifiedItemAttr('signatureRadiusBonus'), mod.maxRange or 0, mod.falloff or 0)) return projectedData