Add graph setting to ignore drone control range

This commit is contained in:
DarkPhoenix
2019-09-17 13:03:21 +03:00
parent 6e9fc1d1d9
commit 7dd063f04e
7 changed files with 69 additions and 10 deletions

View File

@@ -200,7 +200,11 @@ def getGuidedBombMult(mod, src, distance, tgtSigRadius):
def getDroneMult(drone, src, tgt, atkSpeed, atkAngle, distance, tgtSpeed, tgtAngle, tgtSigRadius):
if distance is not None and distance > src.item.extraAttributes['droneControlRange']:
if (
distance is not None and
not GraphSettings.getInstance().get('ignoreDCR') and
distance > src.item.extraAttributes['droneControlRange']
):
return 0
droneSpeed = drone.getModifiedItemAttr('maxVelocity')
# Hard to simulate drone behavior, so assume chance to hit is 1 for mobile drones

View File

@@ -94,7 +94,11 @@ def getTackledSpeed(src, tgt, currentUntackledSpeed, srcScramRange, tgtScrammabl
mobileWebs = []
mobileWebs.extend(webFighters)
# Drones have range limit
if distance is None or distance <= src.item.extraAttributes['droneControlRange']:
if (
distance is None or
GraphSettings.getInstance().get('ignoreDCR') or
distance <= src.item.extraAttributes['droneControlRange']
):
mobileWebs.extend(webDrones)
atkRadius = src.getRadius()
# As mobile webs either follow the target or stick to the attacking ship,
@@ -155,7 +159,11 @@ def getSigRadiusMult(src, tgt, tgtSpeed, srcScramRange, tgtScrammables, tpMods,
mobileTps = []
mobileTps.extend(tpFighters)
# Drones have range limit
if distance is None or distance <= src.item.extraAttributes['droneControlRange']:
if (
distance is None or
GraphSettings.getInstance().get('ignoreDCR') or
distance <= src.item.extraAttributes['droneControlRange']
):
mobileTps.extend(tpDrones)
droneOpt = GraphSettings.getInstance().get('mobileDroneMode')
atkRadius = src.getRadius()

View File

@@ -22,6 +22,7 @@ import math
from graphs.calc import calculateMultiplier, calculateRangeFactor
from graphs.data.base import SmoothPointGetter
from service.settings import GraphSettings
class Distance2NeutingStrGetter(SmoothPointGetter):
@@ -51,7 +52,8 @@ class Distance2NeutingStrGetter(SmoothPointGetter):
if 'entityEnergyNeutralizerFalloff' in drone.item.effects:
neuts.extend(drone.amountActive * ((
drone.getModifiedItemAttr('energyNeutralizerAmount') / (drone.getModifiedItemAttr('energyNeutralizerDuration') / 1000) * resonance,
src.item.extraAttributes['droneControlRange'], 0),))
math.inf if GraphSettings.getInstance().get('ignoreDCR') else src.item.extraAttributes['droneControlRange'],
0),))
for fighter, ability in src.item.activeFighterAbilityIter():
if ability.effect.name == 'fighterAbilityEnergyNeutralizer':
nps = fighter.getModifiedItemAttr('fighterAbilityEnergyNeutralizerAmount') / (ability.cycleTime / 1000)
@@ -94,7 +96,8 @@ class Distance2WebbingStrGetter(SmoothPointGetter):
if 'remoteWebifierEntity' in drone.item.effects:
webs.extend(drone.amountActive * ((
drone.getModifiedItemAttr('speedFactor') * resonance,
src.item.extraAttributes['droneControlRange'], 0, 'default'),))
math.inf if GraphSettings.getInstance().get('ignoreDCR') else src.item.extraAttributes['droneControlRange'],
0, 'default'),))
for fighter, ability in src.item.activeFighterAbilityIter():
if ability.effect.name == 'fighterAbilityStasisWebifier':
webs.append((
@@ -139,7 +142,8 @@ class Distance2EcmStrMaxGetter(SmoothPointGetter):
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),))
math.inf if GraphSettings.getInstance().get('ignoreDCR') else src.item.extraAttributes['droneControlRange'],
0),))
for fighter, ability in src.item.activeFighterAbilityIter():
if ability.effect.name == 'fighterAbilityECM':
ecms.append((
@@ -178,7 +182,8 @@ class Distance2DampStrLockRangeGetter(SmoothPointGetter):
if 'remoteSensorDampEntity' in drone.item.effects:
damps.extend(drone.amountActive * ((
drone.getModifiedItemAttr('maxTargetRangeBonus') * resonance,
src.item.extraAttributes['droneControlRange'], 0, 'default'),))
math.inf if GraphSettings.getInstance().get('ignoreDCR') else src.item.extraAttributes['droneControlRange'],
0, 'default'),))
return {'damps': damps}
def _calculatePoint(self, x, miscParams, src, tgt, commonData):
@@ -215,7 +220,8 @@ class Distance2TdStrOptimalGetter(SmoothPointGetter):
if 'npcEntityWeaponDisruptor' in drone.item.effects:
tds.extend(drone.amountActive * ((
drone.getModifiedItemAttr('maxRangeBonus') * resonance,
src.item.extraAttributes['droneControlRange'], 0, 'default'),))
math.inf if GraphSettings.getInstance().get('ignoreDCR') else src.item.extraAttributes['droneControlRange'],
0, 'default'),))
return {'tds': tds}
def _calculatePoint(self, x, miscParams, src, tgt, commonData):
@@ -291,7 +297,8 @@ class Distance2TpStrGetter(SmoothPointGetter):
if 'remoteTargetPaintEntity' in drone.item.effects:
tps.extend(drone.amountActive * ((
drone.getModifiedItemAttr('signatureRadiusBonus') * resonance,
src.item.extraAttributes['droneControlRange'], 0, 'default'),))
math.inf if GraphSettings.getInstance().get('ignoreDCR') else src.item.extraAttributes['droneControlRange'],
0, 'default'),))
return {'tps': tps}
def _calculatePoint(self, x, miscParams, src, tgt, commonData):

View File

@@ -20,6 +20,7 @@
from eos.utils.float import floatUnerr
from graphs.calc import calculateRangeFactor
from service.settings import GraphSettings
def getApplicationPerKey(src, distance):
@@ -34,7 +35,14 @@ def getApplicationPerKey(src, distance):
for drone in src.item.activeDronesIter():
if not drone.isRemoteRepping():
continue
applicationMap[drone] = 1 if distance is None or distance <= src.item.extraAttributes['droneControlRange'] else 0
if (
distance is None or
GraphSettings.getInstance().get('ignoreDCR') or
distance <= src.item.extraAttributes['droneControlRange']
):
applicationMap[drone] = 1
else:
applicationMap[drone] = 0
# Ensure consistent results - round off a little to avoid float errors
for k, v in applicationMap.items():
applicationMap[k] = floatUnerr(v)

View File

@@ -46,6 +46,7 @@ from gui.builtinContextMenus.targetProfile import switcher
# Graph extra options
from gui.builtinContextMenus import graphDmgIgnoreResists
from gui.builtinContextMenus import graphDmgApplyProjected
from gui.builtinContextMenus import graphDroneControlRange
from gui.builtinContextMenus import graphDmgDroneMode
# Additions panel menus
from gui.builtinContextMenus import additionsExportSelection

View File

@@ -0,0 +1,30 @@
# noinspection PyPackageRequirements
import wx
import gui.globalEvents as GE
import gui.mainFrame
from gui.contextMenu import ContextMenuUnconditional
from service.settings import GraphSettings
class GraphIgnoreDcrMenu(ContextMenuUnconditional):
def __init__(self):
self.mainFrame = gui.mainFrame.MainFrame.getInstance()
self.settings = GraphSettings.getInstance()
def display(self, callingWindow, srcContext):
return srcContext in ('dmgStatsGraph', 'remoteRepsGraph', 'ewarStatsGraph')
def getText(self, callingWindow, itmContext):
return 'Ignore Drone Control Range'
def activate(self, callingWindow, fullContext, i):
self.settings.set('ignoreDCR', not self.settings.get('ignoreDCR'))
wx.PostEvent(self.mainFrame, GE.GraphOptionChanged())
def isChecked(self, i):
return self.settings.get('ignoreDCR')
GraphIgnoreDcrMenu.register()

View File

@@ -519,6 +519,7 @@ class GraphSettings:
def __init__(self):
defaults = {
'mobileDroneMode': GraphDpsDroneMode.auto,
'ignoreDCR': False,
'ignoreResists': True,
'applyProjected': True}
self.settings = SettingsProvider.getInstance().getSettings('graphSettings', defaults)