Add functions which calculate webbed/TPed stats and plug them into distance calculation

This commit is contained in:
DarkPhoenix
2019-07-07 21:22:23 +03:00
parent ec8b771a24
commit 6984bd435f
3 changed files with 60 additions and 6 deletions

View File

@@ -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):

View File

@@ -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

View File

@@ -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