Merge remote-tracking branch 'origin/master' into spoolup_support

This commit is contained in:
Ryan Holmes
2018-11-27 23:59:22 -05:00
175 changed files with 3653 additions and 336 deletions

View File

@@ -1,7 +1,7 @@
# boosterArmorHpPenalty
#
# Used by:
# Implants named like: Booster (12 of 33)
# Implants named like: Booster (12 of 35)
type = "boosterSideEffect"
# User-friendly name for the side effect

View File

@@ -1,7 +1,7 @@
# boosterShieldCapacityPenalty
#
# Used by:
# Implants from group: Booster (12 of 65)
# Implants from group: Booster (12 of 69)
type = "boosterSideEffect"
# User-friendly name for the side effect

View File

@@ -2,7 +2,7 @@
#
# Used by:
# Ships from group: Carrier (4 of 4)
# Ships from group: Combat Battlecruiser (13 of 13)
# Ships from group: Combat Battlecruiser (14 of 14)
# Ships from group: Command Ship (8 of 8)
# Ships from group: Force Auxiliary (6 of 6)
# Ships from group: Supercarrier (6 of 6)

View File

@@ -1,7 +1,7 @@
# disintegratorWeaponDamageMultiply
#
# Used by:
# Modules from group: Entropic Radiation Sink (3 of 3)
# Modules from group: Entropic Radiation Sink (4 of 4)
type = "passive"

View File

@@ -1,7 +1,7 @@
# disintegratorWeaponSpeedMultiply
#
# Used by:
# Modules from group: Entropic Radiation Sink (3 of 3)
# Modules from group: Entropic Radiation Sink (4 of 4)
type = "passive"

View File

@@ -2,6 +2,8 @@
#
# Used by:
# Modules named like: Drone Speed Augmentor (6 of 8)
# Implant: Overmind 'Goliath' Drone Tuner T25-10S
# Implant: Overmind 'Hawkmoth' Drone Tuner S10-25T
type = "passive"

View File

@@ -1,3 +1,7 @@
# eliteBonusCovertOps3PCTdamagePerCycle
#
# Used by:
# Ship: Hydra
type = "passive"

View File

@@ -1,10 +0,0 @@
# eliteBonusMaxDmgMultiBonusAdd
#
# Used by:
# Ship: Hydra
type = "passive"
def handler(fit, src, context):
fit.modules.filteredItemIncrease(lambda mod: mod.item.requiresSkill("Small Precursor Weapon"), "damageMultiplierBonusMax",
src.getModifiedItemAttr("eliteBonusCovertOps3"), skill="Covert Ops")

View File

@@ -1,10 +0,0 @@
# eliteBonusReconMaxDmgMultiMaxHPT
#
# Used by:
# Ship: Tiamat
type = "passive"
def handler(fit, src, context):
fit.modules.filteredItemIncrease(lambda mod: mod.item.requiresSkill("Medium Precursor Weapon"), "damageMultiplierBonusMax",
src.getModifiedItemAttr("eliteBonusReconShip3"), skill="Recon Ships")

View File

@@ -1,3 +1,7 @@
# eliteBonusReconShip3PCTdamagePerCycle
#
# Used by:
# Ship: Tiamat
type = "passive"

View File

@@ -1,3 +1,7 @@
# emergencyHullEnergizer
#
# Used by:
# Variations of module: Capital Emergency Hull Energizer I (5 of 5)
type = "active"
runtime = "late"

View File

@@ -1,7 +1,7 @@
# energyWeaponDamageMultiply
#
# Used by:
# Modules from group: Heat Sink (18 of 18)
# Modules from group: Heat Sink (19 of 19)
type = "passive"

View File

@@ -1,7 +1,7 @@
# energyWeaponSpeedMultiply
#
# Used by:
# Modules from group: Heat Sink (18 of 18)
# Modules from group: Heat Sink (19 of 19)
type = "passive"

View File

@@ -1,7 +1,7 @@
# hybridWeaponDamageMultiply
#
# Used by:
# Modules from group: Magnetic Field Stabilizer (14 of 14)
# Modules from group: Magnetic Field Stabilizer (15 of 15)
type = "passive"

View File

@@ -1,7 +1,7 @@
# hybridWeaponSpeedMultiply
#
# Used by:
# Modules from group: Magnetic Field Stabilizer (14 of 14)
# Modules from group: Magnetic Field Stabilizer (15 of 15)
type = "passive"

View File

@@ -1,3 +1,7 @@
# massEntanglerEffect5
#
# Used by:
# Module: Zero-Point Mass Entangler
type = "active"

View File

@@ -4,6 +4,7 @@
# Modules from group: Frequency Mining Laser (3 of 3)
# Modules from group: Mining Laser (15 of 15)
# Modules from group: Strip Miner (5 of 5)
# Module: Citizen Miner
type = 'active'

View File

@@ -1,7 +1,7 @@
# missileDMGBonus
#
# Used by:
# Modules from group: Ballistic Control system (20 of 20)
# Modules from group: Ballistic Control system (21 of 21)
type = "passive"

View File

@@ -1,7 +1,7 @@
# missileLauncherSpeedMultiplier
#
# Used by:
# Modules from group: Ballistic Control system (20 of 20)
# Modules from group: Ballistic Control system (21 of 21)
type = "passive"

View File

@@ -3,6 +3,7 @@
# Used by:
# Modules from group: Drone Damage Modules (11 of 11)
# Modules named like: C3 'Hivaa Saitsuo' Ballistic Control System (2 of 2)
# Module: Abyssal Ballistic Control System
type = "passive"

View File

@@ -7,6 +7,7 @@
# Modules from group: Hull Repair Unit (25 of 25)
# Modules from group: Remote Armor Repairer (39 of 39)
# Modules from group: Remote Capacitor Transmitter (41 of 41)
# Modules from group: Remote Hull Repairer (8 of 8)
# Modules from group: Remote Shield Booster (38 of 38)
# Modules from group: Smart Bomb (118 of 118)
# Modules from group: Warp Disrupt Field Generator (7 of 7)

View File

@@ -1,7 +1,7 @@
# projectileWeaponDamageMultiply
#
# Used by:
# Modules from group: Gyrostabilizer (13 of 13)
# Modules from group: Gyrostabilizer (14 of 14)
type = "passive"

View File

@@ -1,7 +1,7 @@
# projectileWeaponSpeedMultiply
#
# Used by:
# Modules from group: Gyrostabilizer (13 of 13)
# Modules from group: Gyrostabilizer (14 of 14)
type = "passive"

View File

@@ -1,3 +1,11 @@
# roleBonusWarpSpeed
#
# Used by:
# Ship: Cynabal
# Ship: Dramiel
# Ship: Leopard
# Ship: Machariel
# Ship: Victorieux Luxury Yacht
type = "passive"

View File

@@ -3,6 +3,7 @@
# Used by:
# Structure Modules from group: Structure Citadel Service Module (2 of 2)
# Structure Modules from group: Structure Engineering Service Module (6 of 6)
# Structure Modules from group: Structure Navigation Service Module (3 of 3)
# Structure Modules from group: Structure Resource Processing Service Module (4 of 4)
# Structure Module: Standup Moon Drill I
type = "passive"

View File

@@ -0,0 +1,10 @@
# shipArmorEMResistancePBC2
#
# Used by:
# Ship: Drekavac
type = "passive"
def handler(fit, ship, context):
fit.ship.boostItemAttr("armorEmDamageResonance", ship.getModifiedItemAttr("shipBonusPBC2"),
skill="Precursor Battlecruiser")

View File

@@ -0,0 +1,10 @@
# shipArmorExplosiveResistancePBC2
#
# Used by:
# Ship: Drekavac
type = "passive"
def handler(fit, ship, context):
fit.ship.boostItemAttr("armorExplosiveDamageResonance", ship.getModifiedItemAttr("shipBonusPBC2"),
skill="Precursor Battlecruiser")

View File

@@ -0,0 +1,10 @@
# shipArmorKineticResistancePBC2
#
# Used by:
# Ship: Drekavac
type = "passive"
def handler(fit, ship, context):
fit.ship.boostItemAttr("armorKineticDamageResonance", ship.getModifiedItemAttr("shipBonusPBC2"),
skill="Precursor Battlecruiser")

View File

@@ -0,0 +1,10 @@
# shipArmorThermalResistancePBC2
#
# Used by:
# Ship: Drekavac
type = "passive"
def handler(fit, ship, context):
fit.ship.boostItemAttr("armorThermalDamageResonance", ship.getModifiedItemAttr("shipBonusPBC2"),
skill="Precursor Battlecruiser")

View File

@@ -1,8 +1,7 @@
# shipBonusDreadnoughtC2ShieldResists
#
# Used by:
# Ship: Caiman
# Ship: Phoenix
# Variations of ship: Phoenix (2 of 2)
type = "passive"

View File

@@ -6,5 +6,5 @@ type = "passive"
def handler(fit, ship, context):
fit.drones.filteredItemBoost(lambda drone: drone.item.group.name == "Mining Drone",
fit.drones.filteredItemBoost(lambda drone: drone.item.requiresSkill("Drones"),
"miningAmount", ship.getModifiedItemAttr("shipBonusAC2"), skill="Amarr Cruiser")

View File

@@ -7,5 +7,5 @@ type = "passive"
def handler(fit, ship, context):
fit.drones.filteredItemBoost(lambda drone: drone.item.group.name == "Mining Drone",
fit.drones.filteredItemBoost(lambda drone: drone.item.requiresSkill("Mining Drone Operation"),
"miningAmount", ship.getModifiedItemAttr("shipBonusGC2"), skill="Gallente Cruiser")

View File

@@ -1,10 +0,0 @@
# shipBonusForceAuxiliaryA3CapCapacity
#
# Used by:
# Ship: Apostle
type = "passive"
def handler(fit, src, context):
fit.ship.boostItemAttr("capacitorCapacity", src.getModifiedItemAttr("shipBonusForceAuxiliaryA3"),
skill="Amarr Carrier")

View File

@@ -1,8 +1,7 @@
# shipBonusForceAuxiliaryC2ShieldResists
#
# Used by:
# Ship: Loggerhead
# Ship: Minokawa
# Variations of ship: Minokawa (2 of 2)
type = "passive"

View File

@@ -1,10 +0,0 @@
# shipBonusForceAuxiliaryC3CapCapacity
#
# Used by:
# Ship: Minokawa
type = "passive"
def handler(fit, src, context):
fit.ship.boostItemAttr("capacitorCapacity", src.getModifiedItemAttr("shipBonusForceAuxiliaryC3"),
skill="Caldari Carrier")

View File

@@ -1,10 +0,0 @@
# shipBonusForceAuxiliaryG3CapBoosterStrength
#
# Used by:
# Ship: Ninazu
type = "passive"
def handler(fit, src, context):
fit.modules.filteredChargeBoost(lambda mod: mod.charge.group.name == "Capacitor Booster Charge", "capacitorBonus",
src.getModifiedItemAttr("shipBonusForceAuxiliaryG3"), skill="Gallente Carrier")

View File

@@ -1,10 +0,0 @@
# shipBonusForceAuxiliaryM3CapBoosterStrength
#
# Used by:
# Ship: Lif
type = "passive"
def handler(fit, src, context):
fit.modules.filteredChargeBoost(lambda mod: mod.charge.group.name == "Capacitor Booster Charge", "capacitorBonus",
src.getModifiedItemAttr("shipBonusForceAuxiliaryM3"), skill="Minmatar Carrier")

View File

@@ -9,5 +9,5 @@ type = "passive"
def handler(fit, container, context):
fit.drones.filteredItemBoost(lambda drone: drone.item.group.name == "Mining Drone",
fit.drones.filteredItemBoost(lambda drone: drone.item.requiresSkill("Mining Drone Operation"),
"miningAmount", container.getModifiedItemAttr("rookieDroneBonus"))

View File

@@ -2,7 +2,9 @@
#
# Used by:
# Ship: Damavik
# Ship: Drekavac
# Ship: Hydra
# Ship: Kikimora
# Ship: Leshak
# Ship: Tiamat
# Ship: Vedmak

View File

@@ -0,0 +1,11 @@
# shipBonusPBC1DisintegratorDamage
#
# Used by:
# Ship: Drekavac
type = "passive"
def handler(fit, ship, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Medium Precursor Weapon"),
"damageMultiplier", ship.getModifiedItemAttr("shipBonusPBC1"),
skill="Precursor Battlecruiser")

View File

@@ -0,0 +1,11 @@
# shipBonusPD1DisintegratorDamage
#
# Used by:
# Ship: Kikimora
type = "passive"
def handler(fit, ship, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Small Precursor Weapon"),
"damageMultiplier", ship.getModifiedItemAttr("shipBonusPD1"),
skill="Precursor Destroyer")

View File

@@ -0,0 +1,11 @@
# shipBonusPD2DisintegratorMaxRange
#
# Used by:
# Ship: Kikimora
type = "passive"
def handler(fit, ship, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Small Precursor Weapon"),
"maxRange", ship.getModifiedItemAttr("shipBonusPD2"),
skill="Precursor Destroyer")

View File

@@ -2,7 +2,9 @@
#
# Used by:
# Ship: Damavik
# Ship: Drekavac
# Ship: Hydra
# Ship: Kikimora
# Ship: Leshak
# Ship: Tiamat
# Ship: Vedmak

View File

@@ -2,7 +2,9 @@
#
# Used by:
# Ship: Damavik
# Ship: Drekavac
# Ship: Hydra
# Ship: Kikimora
# Ship: Leshak
# Ship: Tiamat
# Ship: Vedmak

View File

@@ -1,8 +1,7 @@
# shipBonusRole3XLTorpdeoVelocityBonus
#
# Used by:
# Ship: Komodo
# Ship: Leviathan
# Variations of ship: Leviathan (2 of 2)
type = "passive"

View File

@@ -2,7 +2,9 @@
#
# Used by:
# Ship: Damavik
# Ship: Drekavac
# Ship: Hydra
# Ship: Kikimora
# Ship: Leshak
# Ship: Tiamat
# Ship: Vedmak

View File

@@ -1,8 +1,7 @@
# shipBonusTitanA3WarpStrength
#
# Used by:
# Ship: Avatar
# Ship: Molok
# Variations of ship: Avatar (2 of 2)
type = "passive"

View File

@@ -1,8 +1,7 @@
# shipBonusTitanC2ROFBonus
#
# Used by:
# Ship: Komodo
# Ship: Leviathan
# Variations of ship: Leviathan (2 of 2)
type = "passive"

View File

@@ -1,8 +1,7 @@
# shipBonusTitanC3WarpStrength
#
# Used by:
# Ship: Komodo
# Ship: Leviathan
# Variations of ship: Leviathan (2 of 2)
type = "passive"

View File

@@ -0,0 +1,10 @@
# shipRoleDisintegratorMaxRangeCBC
#
# Used by:
# Ship: Drekavac
type = "passive"
def handler(fit, ship, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Medium Precursor Weapon"),
"maxRange", ship.getModifiedItemAttr("roleBonusCBC"))

View File

@@ -1,7 +1,7 @@
# skillBonusDroneDurability
#
# Used by:
# Implants from group: Cyber Drones (2 of 2)
# Implants from group: Cyber Drones (4 of 4)
# Skill: Drone Durability
type = "passive"

View File

@@ -1,7 +1,8 @@
# skillBonusDroneInterfacing
#
# Used by:
# Implants from group: Cyber Drones (2 of 2)
# Implant: CreoDron 'Bumblebee' Drone Tuner T10-5D
# Implant: CreoDron 'Yellowjacket' Drone Tuner D5-10T
# Skill: Drone Interfacing
type = "passive"

View File

@@ -0,0 +1,10 @@
# smallDisintegratorMaxRangeBonus
#
# Used by:
# Ship: Kikimora
type = "passive"
def handler(fit, ship, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Small Precursor Weapon"),
"maxRange", ship.getModifiedItemAttr("maxRangeBonus"))

View File

@@ -1,7 +1,8 @@
# structureAoERoFRoleBonus
#
# Used by:
# Items from category: Structure (11 of 14)
# Items from category: Structure (11 of 17)
# Structures from group: Citadel (8 of 9)
type = "passive"

View File

@@ -1,4 +1,4 @@
# structureArmorHPMultiply
# structureArmorHPBonus
#
# Used by:
# Structure Modules from group: Structure Armor Reinforcer (2 of 2)
@@ -7,4 +7,4 @@ runTime = "early"
def handler(fit, src, context):
fit.ship.multiplyItemAttr("hiddenArmorHPMultiplier", src.getModifiedItemAttr("armorHPMultiplier"))
fit.ship.boostItemAttr("hiddenArmorHPMultiplier", src.getModifiedItemAttr("armorHpBonus"), stackingPenalties=True)

View File

@@ -3,14 +3,20 @@
# Used by:
# Structure Modules from group: Structure Energy Neutralizer (5 of 5)
from eos.saveddata.module import State
from eos.modifiedAttributeDict import ModifiedAttributeDict
type = "active", "projected"
def handler(fit, container, context):
def handler(fit, src, context, **kwargs):
amount = 0
if "projected" in context:
if (hasattr(container, "state") and container.state >= State.ACTIVE) or hasattr(container, "amountActive"):
amount = container.getModifiedItemAttr("energyNeutralizerAmount")
time = container.getModifiedItemAttr("duration")
fit.addDrain(container, time, amount, 0)
if (hasattr(src, "state") and src.state >= State.ACTIVE) or hasattr(src, "amountActive"):
amount = src.getModifiedItemAttr("energyNeutralizerAmount")
if 'effect' in kwargs:
amount *= ModifiedAttributeDict.getResistance(fit, kwargs['effect'])
time = src.getModifiedItemAttr("duration")
fit.addDrain(src, time, amount, 0)

View File

@@ -1,7 +1,7 @@
# structureFullPowerStateHitpointModifier
#
# Used by:
# Items from category: Structure (14 of 14)
# Items from category: Structure (17 of 17)
type = "passive"

View File

@@ -1,7 +1,7 @@
# structureHiddenArmorHPMultiplier
#
# Used by:
# Items from category: Structure (14 of 14)
# Items from category: Structure (17 of 17)
type = "passive"

View File

@@ -1,7 +1,7 @@
# structureHiddenMissileDamageMultiplier
#
# Used by:
# Items from category: Structure (14 of 14)
# Items from category: Structure (14 of 17)
type = "passive"

View File

@@ -1,7 +1,7 @@
# targetAttack
#
# Used by:
# Drones from group: Combat Drone (74 of 74)
# Drones from group: Combat Drone (75 of 75)
# Modules from group: Energy Weapon (212 of 214)
type = 'active'

View File

@@ -1,4 +1,4 @@
# warpScramble
# warpDisrupt
#
# Used by:
# Modules named like: Warp Disruptor (28 of 28)

View File

@@ -4,15 +4,15 @@
# Celestial: darkness_weather_1
# Celestial: darkness_weather_2
# Celestial: darkness_weather_3
# Celestial: pvp_weather_1
runTime = "early"
type = ("projected", "passive", "gang")
def handler(fit, beacon, context, **kwargs):
for x in range(1, 3):
for x in range(1, 5):
if beacon.getModifiedItemAttr("warfareBuff{}ID".format(x)):
value = beacon.getModifiedItemAttr("warfareBuff{}Value".format(x))
id = beacon.getModifiedItemAttr("warfareBuff{}ID".format(x))
if id:
fit.addCommandBonus(id, value, beacon, kwargs['effect'], 'early')

View File

@@ -567,51 +567,67 @@ class Unit(EqBase):
""" This is a mapping of various tweaks that we have to do between the internal representation of an attribute
value and the display (for example, 'Millisecond' units have the display name of 's', so we have to convert value
from ms to s) """
# Each entry contains:
# Function to convert value to display value
# Function to convert value to display format (which sometimes can be a string)
# Function which controls unit name used with attribute
# Function to convert display value to value
return {
"Inverse Absolute Percent": (
lambda v: (1 - v) * 100,
lambda d: -1 * (d / 100) + 1,
lambda u: u),
lambda v: (1 - v) * 100,
lambda u: u,
lambda d: -1 * (d / 100) + 1),
"Inversed Modifier Percent": (
lambda v: (1 - v) * 100,
lambda d: -1 * (d / 100) + 1,
lambda u: u),
lambda v: (1 - v) * 100,
lambda u: u,
lambda d: -1 * (d / 100) + 1),
"Modifier Percent": (
lambda v: (v - 1) * 100,
lambda v: ("%+.2f" if ((v - 1) * 100) % 1 else "%+d") % ((v - 1) * 100),
lambda d: (d / 100) + 1,
lambda u: u),
lambda u: u,
lambda d: (d / 100) + 1),
"Volume": (
lambda v: v,
lambda d: d,
lambda u: ""),
lambda v: v,
lambda u: "",
lambda d: d),
"Sizeclass": (
lambda v: v,
lambda d: d,
lambda u: ""),
lambda v: v,
lambda u: "",
lambda d: d),
"Absolute Percent": (
lambda v: (v * 100),
lambda d: d / 100,
lambda u: u),
lambda v: v * 100,
lambda v: v * 100,
lambda u: u,
lambda d: d / 100),
"Milliseconds": (
lambda v: v / 1000.0,
lambda d: d * 1000.0,
lambda u: u),
lambda v: v / 1000,
lambda v: v / 1000,
lambda u: u,
lambda d: d * 1000),
"Boolean": (
lambda v: "Yes" if v == 1 else "No",
lambda d: 1.0 if d == "Yes" else 0.0,
lambda u: ""),
lambda v: True if v else False,
lambda v: "Yes" if v else "No",
lambda u: "",
lambda d: 1.0 if d == "Yes" else 0.0),
"typeID": (
self.itemIDCallback,
None, # we could probably convert these back if we really tried hard enough
lambda u: ""),
self.itemIDCallback,
lambda u: "",
None), # we could probably convert these back if we really tried hard enough
"groupID": (
self.groupIDCallback,
None,
lambda u: ""),
self.groupIDCallback,
lambda u: "",
None),
"attributeID": (
self.attributeIDCallback,
None,
lambda u: ""),
self.attributeIDCallback,
lambda u: "",
None),
}
@staticmethod
@@ -634,25 +650,33 @@ class Unit(EqBase):
attribute = eos.db.getAttributeInfo(v, eager="unit")
return "%s (%d)" % (attribute.name.capitalize(), v)
def TranslateValue(self, value):
def PreformatValue(self, value):
"""Attributes have to be translated certain ways based on their unit (ex: decimals converting to percentages).
This allows us to get an easy representation of how the attribute should be printed """
override = self.translations.get(self.name)
if override is not None:
return override[0](value), override[2](self.displayName)
return override[1](value), override[2](self.displayName)
return value, self.displayName
def SimplifyValue(self, value):
"""Takes the internal representation value and convert it into the display value"""
override = self.translations.get(self.name)
if override is not None:
return override[0](value)
return value
def ComplicateValue(self, value):
"""Takes the display value and turns it back into the internal representation of it"""
override = self.translations.get(self.name)
if override is not None:
return override[1](value)
return override[3](value)
return value
class Traits(EqBase):
pass

View File

@@ -93,6 +93,8 @@ class FitDpsGraph(Graph):
# this is janky as fuck
for fighter in fit.fighters:
if not fighter.active:
continue
for ability in fighter.abilities:
if ability.dealsDamage and ability.active:
multiplier = self.calculateFighterMissileMultiplier(ability, data)

View File

@@ -696,7 +696,7 @@ class Fit(object):
self.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Shield Operation"),
"duration", value, stackingPenalties=True)
# Abysmal Weather Effects
# Abyssal Weather Effects
if warfareBuffID == 90: # Weather_electric_storm_EM_resistance_penalty
for tankType in ("shield", "armor"):