diff --git a/eos/effects/fighterabilityevasivemaneuvers.py b/eos/effects/fighterabilityevasivemaneuvers.py new file mode 100644 index 000000000..19af7030f --- /dev/null +++ b/eos/effects/fighterabilityevasivemaneuvers.py @@ -0,0 +1,24 @@ +# Not used by any item +""" +Since fighter abilities do not have any sort of item entity in the EVE database, we must derive the abilities from the +effects, and thus this effect file contains some custom information useful only to fighters. +""" +# User-friendly name for the ability +displayName = "Evasive Maneuvers" + +prefix = "fighterAbilityEvasiveManeuvers" + +# Is ability applied to the fighter squad as a whole, or per fighter? +grouped = True + +type = "active" +runTime = "late" +def handler(fit, module, context): + module.boostItemAttr("maxVelocity", module.getModifiedItemAttr("fighterAbilityEvasiveManeuversSpeedBonus")) + module.boostItemAttr("signatureRadius", module.getModifiedItemAttr("fighterAbilityEvasiveManeuversSignatureRadiusBonus"), stackingPenalties = True) + + # These may not have stacking penalties, but there's nothing else that affects the attributes yet to check. + module.multiplyItemAttr("shieldEmDamageResonance", module.getModifiedItemAttr("fighterAbilityEvasiveManeuversEmResonance"), stackingPenalties = True) + module.multiplyItemAttr("shieldThermalDamageResonance", module.getModifiedItemAttr("fighterAbilityEvasiveManeuversThermResonance"), stackingPenalties = True) + module.multiplyItemAttr("shieldKineticDamageResonance", module.getModifiedItemAttr("fighterAbilityEvasiveManeuversKinResonance"), stackingPenalties = True) + module.multiplyItemAttr("shieldExplosiveDamageResonance", module.getModifiedItemAttr("fighterAbilityEvasiveManeuversExpResonance"), stackingPenalties = True) \ No newline at end of file diff --git a/eos/effects/modulebonusnetworkedsensorarray.py b/eos/effects/modulebonusnetworkedsensorarray.py index 53502bed7..7db715bfd 100644 --- a/eos/effects/modulebonusnetworkedsensorarray.py +++ b/eos/effects/modulebonusnetworkedsensorarray.py @@ -4,13 +4,13 @@ # Module: Networked Sensor Array type = "active" def handler(fit, src, context): - fit.ship.multiplyItemAttr("maxTargetRange", src.getModifiedItemAttr("maxTargetRangeMultiplier"), stackingPenalties=True, penaltyGroup="postMul") fit.ship.boostItemAttr("scanResolution", src.getModifiedItemAttr("scanResolutionBonus"), stackingPenalties=True) for scanType in ('Magnetometric', 'Ladar', 'Gravimetric', 'Radar'): - fit.ship.boostItemAttr("scan{}Strength".format(scanType), - src.getModifiedItemAttr("scan{}StrengthPercent".format(scanType)), - stackingPenalties=True) + attr = "scan{}Strength".format(scanType) + bonus = src.getModifiedItemAttr("scan{}StrengthPercent".format(scanType)) + fit.ship.boostItemAttr(attr, bonus, stackingPenalties=True) + fit.fighters.filteredItemBoost(lambda mod: mod.item.requiresSkill("Fighters"), attr, bonus, stackingPenalties=True) # EW cap need increase groups = [ diff --git a/eos/effects/modulebonusomnidirectionaltrackinglinkoverload.py b/eos/effects/modulebonusomnidirectionaltrackinglinkoverload.py index 40cef1df4..4605d70c2 100644 --- a/eos/effects/modulebonusomnidirectionaltrackinglinkoverload.py +++ b/eos/effects/modulebonusomnidirectionaltrackinglinkoverload.py @@ -4,6 +4,9 @@ # Modules from group: Drone Tracking Modules (10 of 10) type = "overheat" def handler(fit, module, context): - module.boostItemAttr("maxRangeBonus", module.getModifiedItemAttr("overloadTrackingModuleStrengthBonus")) - module.boostItemAttr("falloffBonus", module.getModifiedItemAttr("overloadTrackingModuleStrengthBonus")) - module.boostItemAttr("trackingSpeedBonus", module.getModifiedItemAttr("overloadTrackingModuleStrengthBonus")) + overloadBonus = module.getModifiedItemAttr("overloadTrackingModuleStrengthBonus") + module.boostItemAttr("maxRangeBonus", overloadBonus) + module.boostItemAttr("falloffBonus", overloadBonus) + module.boostItemAttr("trackingSpeedBonus", overloadBonus) + module.boostItemAttr("aoeCloudSizeBonus", overloadBonus) + module.boostItemAttr("aoeVelocityBonus", overloadBonus) \ No newline at end of file diff --git a/eos/saveddata/fighter.py b/eos/saveddata/fighter.py index f7b58a2ba..bc96c5f10 100644 --- a/eos/saveddata/fighter.py +++ b/eos/saveddata/fighter.py @@ -164,6 +164,26 @@ class Fighter(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): dps, volley = ability.damageStats(targetResists) self.__dps += dps self.__volley += volley + + # For forward compatability this assumes a fighter can have more than 2 damaging abilities and/or multiple that use charges. + if self.owner.factorReload: + activeTimes = [] + reloadTimes = [] + constantDps = 0 + for ability in self.abilities: + if not ability.active: + continue + if ability.numShots == 0: + dps, volley = ability.damageStats(targetResists) + constantDps += dps + continue + activeTimes.append(ability.numShots * ability.cycleTime) + reloadTimes.append(ability.reloadTime) + + if(len(activeTimes) > 0): + shortestActive = sorted(activeTimes)[0] + longestReload = sorted(reloadTimes, reverse=True)[0] + self.__dps = max(constantDps, self.__dps * shortestActive / (shortestActive + longestReload)) return self.__dps, self.__volley diff --git a/eos/saveddata/fighterAbility.py b/eos/saveddata/fighterAbility.py index 027ffa30f..64b5dee2c 100644 --- a/eos/saveddata/fighterAbility.py +++ b/eos/saveddata/fighterAbility.py @@ -29,10 +29,19 @@ class FighterAbility(object): # We aren't able to get data on the charges that can be stored with fighters. So we hardcode that data here, keyed # with the fighter squadron role NUM_SHOTS_MAPPING = { - 2: 8, # Light fighter / Attack + 1: 0, # Superiority fighter / Attack + 2: 12, # Light fighter / Attack 4: 6, # Heavy fighter / Heavy attack - 5: 2, # Heavy fighter / Long range attack + 5: 3, # Heavy fighter / Long range attack } + # Same as above + REARM_TIME_MAPPING = { + 1: 0, # Superiority fighter / Attack + 2: 4000, # Light fighter / Attack + 4: 6000, # Heavy fighter / Heavy attack + 5: 20000, # Heavy fighter / Long range attack + } + def __init__(self, effect): """Initialize from the program""" @@ -85,7 +94,7 @@ class FighterAbility(object): @property def reloadTime(self): - return self.fighter.getModifiedItemAttr("fighterRefuelingTime") * self.numShots + return self.fighter.getModifiedItemAttr("fighterRefuelingTime") + (self.REARM_TIME_MAPPING[self.fighter.getModifiedItemAttr("fighterSquadronRole")] or 0 if self.hasCharges else 0) * self.numShots @property def numShots(self): @@ -96,10 +105,10 @@ class FighterAbility(object): speed = self.fighter.getModifiedItemAttr("{}Duration".format(self.attrPrefix)) reload = self.reloadTime - if self.fighter.owner.factorReload: - numShots = self.numShots - # Speed here already takes into consideration reactivation time - speed = (speed * numShots + reload) / numShots if numShots > 0 else speed + #if self.fighter.owner.factorReload: + # numShots = self.numShots + # # Speed here already takes into consideration reactivation time + # speed = (speed * numShots + reload) / numShots if numShots > 0 else speed return speed diff --git a/eos/saveddata/ship.py b/eos/saveddata/ship.py index 6dd20feb1..4094534e6 100644 --- a/eos/saveddata/ship.py +++ b/eos/saveddata/ship.py @@ -17,7 +17,7 @@ # along with eos. If not, see . #=============================================================================== -from eos.modifiedAttributeDict import ModifiedAttributeDict, ItemAttrShortcut +from eos.modifiedAttributeDict import ModifiedAttributeDict, ItemAttrShortcut, cappingAttrKeyCache from eos.effectHandlerHelpers import HandledItem from eos.saveddata.mode import Mode import eos.db @@ -50,6 +50,9 @@ class Ship(ItemAttrShortcut, HandledItem): self.__itemModifiedAttributes.original = dict(self.item.attributes) self.__itemModifiedAttributes.original.update(self.EXTRA_ATTRIBUTES) self.__itemModifiedAttributes.overrides = self.item.overrides + + if "maximumRangeCap" in self.__itemModifiedAttributes.original: + cappingAttrKeyCache["maxTargetRange"] = "maximumRangeCap" # there are occasions when we need to get to the parent fit of the ship, such as when we need the character # skills for ship-role gang boosts (Titans) diff --git a/service/character.py b/service/character.py index 4ed84959d..802d11092 100644 --- a/service/character.py +++ b/service/character.py @@ -373,6 +373,8 @@ class Character(object): subThing = getattr(thing, attr, None) subReqs = {} if subThing is not None: + if isinstance(thing, eos.types.Fighter) and attr == "charge": + continue self._checkRequirements(fit, fit.character, subThing, subReqs) if subReqs: reqs[subThing] = subReqs