Add functions which calculate webbed/TPed stats and plug them into distance calculation
This commit is contained in:
@@ -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):
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user