diff --git a/eos/saveddata/fit.py b/eos/saveddata/fit.py index 6ec5273f5..081f816a3 100644 --- a/eos/saveddata/fit.py +++ b/eos/saveddata/fit.py @@ -1572,6 +1572,24 @@ class Fit: secstatus = FitSystemSecurity.NULLSEC return secstatus + + def activeModulesIter(self): + for mod in self.modules: + if mod.state >= FittingModuleState.ACTIVE: + yield mod + + def activeDronesIter(self): + for drone in self.drones: + if drone.amountActive > 0: + yield drone + + def activeFighterAbilityIter(self): + for fighter in self.fighters: + if fighter.active: + for ability in fighter.abilities: + if ability.active: + yield fighter, ability + def __deepcopy__(self, memo=None): fitCopy = Fit() # Character and owner are not copied diff --git a/graphs/data/fitDamageStats/cache/projected.py b/graphs/data/fitDamageStats/cache/projected.py index 9e450ca52..170a2ccd4 100644 --- a/graphs/data/fitDamageStats/cache/projected.py +++ b/graphs/data/fitDamageStats/cache/projected.py @@ -39,9 +39,7 @@ class ProjectedDataCache(FitDataCache): webMods = [] tpMods = [] projectedData = self._data.setdefault(src.item.ID, {})['modules'] = (webMods, tpMods) - for mod in src.item.modules: - if mod.state <= FittingModuleState.ONLINE: - continue + for mod in src.item.activeModulesIter(): for webEffectName in ('remoteWebifierFalloff', 'structureModuleEffectStasisWebifier'): if webEffectName in mod.item.effects: webMods.append(ModProjData( @@ -82,9 +80,7 @@ class ProjectedDataCache(FitDataCache): webDrones = [] tpDrones = [] projectedData = self._data.setdefault(src.item.ID, {})['drones'] = (webDrones, tpDrones) - for drone in src.item.drones: - if drone.amountActive <= 0: - continue + for drone in src.item.activeDronesIter(): if 'remoteWebifierEntity' in drone.item.effects: webDrones.extend(drone.amountActive * (MobileProjData( drone.getModifiedItemAttr('speedFactor'), @@ -113,19 +109,14 @@ class ProjectedDataCache(FitDataCache): webFighters = [] tpFighters = [] projectedData = self._data.setdefault(src.item.ID, {})['fighters'] = (webFighters, tpFighters) - for fighter in src.item.fighters: - if not fighter.active: - continue - for ability in fighter.abilities: - if not ability.active: - continue - if ability.effect.name == 'fighterAbilityStasisWebifier': - webFighters.append(MobileProjData( - fighter.getModifiedItemAttr('fighterAbilityStasisWebifierSpeedPenalty') * fighter.amountActive, - fighter.getModifiedItemAttr('fighterAbilityStasisWebifierOptimalRange'), - fighter.getModifiedItemAttr('fighterAbilityStasisWebifierFalloffRange'), - 'default', - getResistanceAttrID(modifyingItem=fighter, effect=fighter.item.effects['fighterAbilityStasisWebifier']), - fighter.getModifiedItemAttr('maxVelocity'), - fighter.getModifiedItemAttr('radius'))) + for fighter, ability in src.item.activeFighterAbilityIter(): + if ability.effect.name == 'fighterAbilityStasisWebifier': + webFighters.append(MobileProjData( + fighter.getModifiedItemAttr('fighterAbilityStasisWebifierSpeedPenalty') * fighter.amountActive, + fighter.getModifiedItemAttr('fighterAbilityStasisWebifierOptimalRange'), + fighter.getModifiedItemAttr('fighterAbilityStasisWebifierFalloffRange'), + 'default', + getResistanceAttrID(modifyingItem=fighter, effect=fighter.item.effects['fighterAbilityStasisWebifier']), + fighter.getModifiedItemAttr('maxVelocity'), + fighter.getModifiedItemAttr('radius'))) return projectedData diff --git a/graphs/data/fitEwarStats/getter.py b/graphs/data/fitEwarStats/getter.py index 800ebaa45..9a5a129da 100644 --- a/graphs/data/fitEwarStats/getter.py +++ b/graphs/data/fitEwarStats/getter.py @@ -31,38 +31,29 @@ class Distance2WebbingStrengthGetter(SmoothPointGetter): _extraDepth = 2 def _getCommonData(self, miscParams, src, tgt): - resist = miscParams['resist'] or 0 + resonance = 1 - (miscParams['resist'] or 0) webs = [] - for mod in src.item.modules: - if mod.state <= FittingModuleState.ONLINE: - continue + for mod in src.item.activeModulesIter(): for webEffectName in ('remoteWebifierFalloff', 'structureModuleEffectStasisWebifier'): if webEffectName in mod.item.effects: webs.append(( - mod.getModifiedItemAttr('speedFactor') * (1 - resist), + mod.getModifiedItemAttr('speedFactor') * resonance, mod.maxRange or 0, mod.falloff or 0, 'default')) if 'doomsdayAOEWeb' in mod.item.effects: webs.append(( - mod.getModifiedItemAttr('speedFactor') * (1 - resist), + mod.getModifiedItemAttr('speedFactor') * resonance, max(0, (mod.maxRange or 0) + mod.getModifiedItemAttr('doomsdayAOERange') - src.getRadius()), mod.falloff or 0, 'default')) - for drone in src.item.drones: - if drone.amountActive <= 0: - continue + for drone in src.item.activeDronesIter(): if 'remoteWebifierEntity' in drone.item.effects: webs.extend(drone.amountActive * (( - drone.getModifiedItemAttr('speedFactor') * (1 - resist), + drone.getModifiedItemAttr('speedFactor') * resonance, src.item.extraAttributes['droneControlRange'], 0, 'default'),)) - for fighter in src.item.fighters: - if not fighter.active: - continue - for ability in fighter.abilities: - if not ability.active: - continue - if ability.effect.name == 'fighterAbilityStasisWebifier': - webs.append(( - fighter.getModifiedItemAttr('fighterAbilityStasisWebifierSpeedPenalty') * fighter.amountActive * (1 - resist), - math.inf, 0, 'default')) + for fighter, ability in src.item.activeFighterAbilityIter(): + if ability.effect.name == 'fighterAbilityStasisWebifier': + webs.append(( + fighter.getModifiedItemAttr('fighterAbilityStasisWebifierSpeedPenalty') * fighter.amountActive * resonance, + math.inf, 0, 'default')) return {'webs': webs} def _calculatePoint(self, x, miscParams, src, tgt, commonData): diff --git a/graphs/data/fitEwarStats/graph.py b/graphs/data/fitEwarStats/graph.py index 5b7df53d3..9274443c7 100644 --- a/graphs/data/fitEwarStats/graph.py +++ b/graphs/data/fitEwarStats/graph.py @@ -39,3 +39,4 @@ class FitEwarStatsGraph(FitGraph): ('resist', '%'): lambda v, src, tgt: None if v is None else v / 100} _limiters = {'resist': lambda src, tgt: (0, 1)} _getters = {('distance', 'webStr'): Distance2WebbingStrengthGetter} + _denormalizers = {('distance', 'km'): lambda v, src, tgt: None if v is None else v / 1000}