From 78b6eb42838a8cb99df767101e92471e9b799c81 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Thu, 4 Jul 2019 19:14:46 +0300 Subject: [PATCH] Add regular and guided bombs to graphs --- gui/builtinGraphs/fitDamageStats/calc.py | 52 +++++++++++++++++++---- gui/builtinGraphs/fitDamageStats/graph.py | 19 +++++++-- 2 files changed, 59 insertions(+), 12 deletions(-) diff --git a/gui/builtinGraphs/fitDamageStats/calc.py b/gui/builtinGraphs/fitDamageStats/calc.py index 883c6f220..3ce00378c 100644 --- a/gui/builtinGraphs/fitDamageStats/calc.py +++ b/gui/builtinGraphs/fitDamageStats/calc.py @@ -55,6 +55,49 @@ def getLauncherMult(mod, fit, distance, tgtSpeed, tgtSigRadius): return mult +def getSmartbombMult(mod, distance): + modRange = mod.maxRange + if modRange is None: + return 0 + if distance > modRange: + return 0 + return 1 + + +def getBombMult(mod, fit, tgt, distance, tgtSigRadius): + modRange = mod.maxRange + if modRange is None: + return 0 + blastRadius = mod.getModifiedChargeAttr('explosionRange') + atkRadius = fit.ship.getModifiedItemAttr('radius') + tgtRadius = tgt.ship.getModifiedItemAttr('radius') + # Bomb starts in the center of the ship + # Also here we assume that it affects target as long as blast + # touches its surface, not center - I did not check this + if distance < max(0, modRange - atkRadius - tgtRadius - blastRadius): + return 0 + if distance > max(0, modRange - atkRadius + tgtRadius + blastRadius): + return 0 + eR = mod.getModifiedChargeAttr('aoeCloudSize') + if eR == 0: + return 1 + else: + return min(1, tgtSigRadius / eR) + + +def getGuidedBombMult(mod, fit, distance, tgtSigRadius): + modRange = mod.maxRange + if modRange is None: + return 0 + if distance > modRange - fit.ship.getModifiedItemAttr('radius'): + return 0 + eR = mod.getModifiedChargeAttr('aoeCloudSize') + if eR == 0: + return 1 + else: + return min(1, tgtSigRadius / eR) + + def getDroneMult(drone, fit, tgt, atkSpeed, atkAngle, distance, tgtSpeed, tgtAngle, tgtSigRadius): if distance > fit.extraAttributes['droneControlRange']: return 0 @@ -114,15 +157,6 @@ def getFighterAbilityMult(fighter, ability, fit, distance, tgtSpeed, tgtSigRadiu return mult -def getSmartbombMult(mod, distance): - modRange = mod.maxRange - if modRange is None: - return 0 - if distance > modRange: - return 0 - return 1 - - # Turret-specific @lru_cache(maxsize=50) def _calcTurretMult(chanceToHit): diff --git a/gui/builtinGraphs/fitDamageStats/graph.py b/gui/builtinGraphs/fitDamageStats/graph.py index 56514e463..3aaf2758e 100644 --- a/gui/builtinGraphs/fitDamageStats/graph.py +++ b/gui/builtinGraphs/fitDamageStats/graph.py @@ -23,7 +23,7 @@ from eos.const import FittingHardpoint from eos.utils.spoolSupport import SpoolType, SpoolOptions from eos.utils.stats import DmgTypes from gui.builtinGraphs.base import FitGraph, XDef, YDef, Input, VectorDef -from .calc import getTurretMult, getLauncherMult, getDroneMult, getFighterAbilityMult, getSmartbombMult +from .calc import getTurretMult, getLauncherMult, getDroneMult, getFighterAbilityMult, getSmartbombMult, getBombMult, getGuidedBombMult from .timeCache import TimeCache @@ -351,10 +351,23 @@ class FitDamageStatsGraph(FitGraph): distance=distance, tgtSpeed=tgtSpeed, tgtSigRadius=tgtSigRadius) - elif mod.item.group.name == 'Smart Bomb': + elif mod.item.group.name in ('Smart Bomb', 'Structure Area Denial Module'): applicationMap[mod] = getSmartbombMult( mod=mod, distance=distance) + elif mod.item.group.name == 'Missile Launcher Bomb': + applicationMap[mod] = getBombMult( + mod=mod, + fit=fit, + tgt=tgt, + distance=distance, + tgtSigRadius=tgtSigRadius) + elif mod.item.group.name == 'Structure Guided Bomb Launcher': + applicationMap[mod] = getGuidedBombMult( + mod=mod, + fit=fit, + distance=distance, + tgtSigRadius=tgtSigRadius) for drone in fit.drones: if not drone.isDealingDamage(): continue @@ -387,7 +400,7 @@ class FitDamageStatsGraph(FitGraph): def _aggregate(self, dmgMap, applicationMap): total = DmgTypes(0, 0, 0, 0) for key, dmg in dmgMap.items(): - total += dmg * applicationMap.get(key, 1) + total += dmg * applicationMap.get(key, 0) return total