From 1d7efce1974cac26bc85ffc277b92580ff815d61 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Wed, 14 Aug 2019 13:10:53 +0300 Subject: [PATCH] Add ECM vs range graph --- graphs/data/fitEwarStats/getter.py | 42 ++++++++++++++++++++++++++++++ graphs/data/fitEwarStats/graph.py | 6 +++-- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/graphs/data/fitEwarStats/getter.py b/graphs/data/fitEwarStats/getter.py index ddde458e2..c27b7400a 100644 --- a/graphs/data/fitEwarStats/getter.py +++ b/graphs/data/fitEwarStats/getter.py @@ -66,6 +66,48 @@ class Distance2WebbingStrGetter(SmoothPointGetter): return strength +class Distance2EcmStrMaxGetter(SmoothPointGetter): + + _baseResolution = 50 + _extraDepth = 2 + + ECM_ATTRS_GENERAL = ('scanGravimetricStrengthBonus', 'scanLadarStrengthBonus', 'scanMagnetometricStrengthBonus', 'scanRadarStrengthBonus') + ECM_ATTRS_FIGHTERS = ('fighterAbilityECMStrengthGravimetric', 'fighterAbilityECMStrengthLadar', 'fighterAbilityECMStrengthMagnetometric', 'fighterAbilityECMStrengthRadar') + + def _getCommonData(self, miscParams, src, tgt): + resonance = 1 - (miscParams['resist'] or 0) + ecms = [] + for mod in src.item.activeModulesIter(): + for effectName in ('remoteECMFalloff', 'structureModuleEffectECM'): + if effectName in mod.item.effects: + ecms.append(( + max(mod.getModifiedItemAttr(a) for a in self.ECM_ATTRS_GENERAL) * resonance, + mod.maxRange or 0, mod.falloff or 0, 'default')) + if 'doomsdayAOEECM' in mod.item.effects: + ecms.append(( + max(mod.getModifiedItemAttr(a) for a in self.ECM_ATTRS_GENERAL) * resonance, + max(0, (mod.maxRange or 0) + mod.getModifiedItemAttr('doomsdayAOERange') - src.getRadius()), + mod.falloff or 0, 'default')) + for drone in src.item.activeDronesIter(): + if 'entityECMFalloff' in drone.item.effects: + ecms.extend(drone.amountActive * (( + max(drone.getModifiedItemAttr(a) for a in self.ECM_ATTRS_GENERAL) * resonance, + src.item.extraAttributes['droneControlRange'], 0, 'default'),)) + for fighter, ability in src.item.activeFighterAbilityIter(): + if ability.effect.name == 'fighterAbilityECM': + ecms.append(( + max(fighter.getModifiedItemAttr(a) for a in self.ECM_ATTRS_FIGHTERS) * fighter.amountActive * resonance, + math.inf, 0, 'default')) + return {'ecms': ecms} + + def _calculatePoint(self, x, miscParams, src, tgt, commonData): + distance = x + combinedStr = 0 + for strength, optimal, falloff, stackingGroup in commonData['ecms']: + combinedStr += strength * calculateRangeFactor(srcOptimalRange=optimal, srcFalloffRange=falloff, distance=distance) + return combinedStr + + class Distance2DampStrLockRangeGetter(SmoothPointGetter): _baseResolution = 50 diff --git a/graphs/data/fitEwarStats/graph.py b/graphs/data/fitEwarStats/graph.py index a69603115..86d65a635 100644 --- a/graphs/data/fitEwarStats/graph.py +++ b/graphs/data/fitEwarStats/graph.py @@ -20,8 +20,8 @@ from graphs.data.base import FitGraph, Input, XDef, YDef from .getter import ( - Distance2WebbingStrGetter, Distance2DampStrLockRangeGetter, Distance2TdStrOptimalGetter, - Distance2GdStrRangeGetter, Distance2TpStrGetter) + Distance2WebbingStrGetter, Distance2EcmStrMaxGetter, Distance2DampStrLockRangeGetter, + Distance2TdStrOptimalGetter, Distance2GdStrRangeGetter, Distance2TpStrGetter) class FitEwarStatsGraph(FitGraph): @@ -32,6 +32,7 @@ class FitEwarStatsGraph(FitGraph): xDefs = [XDef(handle='distance', unit='km', label='Distance', mainInput=('distance', 'km'))] yDefs = [ YDef(handle='webStr', unit='%', label='Speed reduction', selectorLabel='Webs: speed reduction'), + YDef(handle='ecmStrMax', unit=None, label='Combined ECM strength', selectorLabel='ECM: combined strength'), YDef(handle='dampStrLockRange', unit='%', label='Lock range reduction', selectorLabel='Damps: lock range reduction'), YDef(handle='tdStrOptimal', unit='%', label='Turret optimal range reduction', selectorLabel='TDs: turret optimal range reduction'), YDef(handle='gdStrRange', unit='%', label='Missile flight range reduction', selectorLabel='GDs: missile flight range reduction'), @@ -47,6 +48,7 @@ class FitEwarStatsGraph(FitGraph): _limiters = {'resist': lambda src, tgt: (0, 1)} _getters = { ('distance', 'webStr'): Distance2WebbingStrGetter, + ('distance', 'ecmStrMax'): Distance2EcmStrMaxGetter, ('distance', 'dampStrLockRange'): Distance2DampStrLockRangeGetter, ('distance', 'tdStrOptimal'): Distance2TdStrOptimalGetter, ('distance', 'gdStrRange'): Distance2GdStrRangeGetter,