Merge tag 'v2.0.0b5' into esi
# Conflicts: # eos/saveddata/character.py
This commit is contained in:
@@ -24,10 +24,10 @@ saveInRoot = False
|
||||
|
||||
# Version data
|
||||
|
||||
version = "2.0.0b4"
|
||||
version = "2.0.0b5"
|
||||
tag = "git"
|
||||
expansionName = "YC120.2"
|
||||
expansionVersion = "1.2"
|
||||
expansionName = "YC120.3"
|
||||
expansionVersion = "1.8"
|
||||
evemonMinVersion = "4081"
|
||||
|
||||
pyfaPath = None
|
||||
|
||||
@@ -72,7 +72,7 @@ class CapSimulator(object):
|
||||
disable_period = False
|
||||
|
||||
# Loop over modules, clearing clipSize if applicable, and group modules based on attributes
|
||||
for (duration, capNeed, clipSize, disableStagger) in self.modules:
|
||||
for (duration, capNeed, clipSize, disableStagger, reloadTime) in self.modules:
|
||||
if self.scale:
|
||||
duration, capNeed = self.scale_activation(duration, capNeed)
|
||||
|
||||
@@ -80,24 +80,25 @@ class CapSimulator(object):
|
||||
# a cap booster module.
|
||||
if not self.reload and capNeed > 0:
|
||||
clipSize = 0
|
||||
reloadTime = 0
|
||||
|
||||
# Group modules based on their properties
|
||||
if (duration, capNeed, clipSize, disableStagger) in mods:
|
||||
mods[(duration, capNeed, clipSize, disableStagger)] += 1
|
||||
if (duration, capNeed, clipSize, disableStagger, reloadTime) in mods:
|
||||
mods[(duration, capNeed, clipSize, disableStagger, reloadTime)] += 1
|
||||
else:
|
||||
mods[(duration, capNeed, clipSize, disableStagger)] = 1
|
||||
mods[(duration, capNeed, clipSize, disableStagger, reloadTime)] = 1
|
||||
|
||||
# Loop over grouped modules, configure staggering and push to the simulation state
|
||||
for (duration, capNeed, clipSize, disableStagger), amount in mods.items():
|
||||
for (duration, capNeed, clipSize, disableStagger, reloadTime), amount in mods.items():
|
||||
if self.stagger and not disableStagger:
|
||||
if clipSize == 0:
|
||||
duration = int(duration / amount)
|
||||
else:
|
||||
stagger_amount = (duration * clipSize + 10000) / (amount * clipSize)
|
||||
stagger_amount = (duration * clipSize + reloadTime) / (amount * clipSize)
|
||||
for i in range(1, amount):
|
||||
heapq.heappush(self.state,
|
||||
[i * stagger_amount, duration,
|
||||
capNeed, 0, clipSize])
|
||||
capNeed, 0, clipSize, reloadTime])
|
||||
else:
|
||||
capNeed *= amount
|
||||
|
||||
@@ -107,7 +108,7 @@ class CapSimulator(object):
|
||||
if clipSize:
|
||||
disable_period = True
|
||||
|
||||
heapq.heappush(self.state, [0, duration, capNeed, 0, clipSize])
|
||||
heapq.heappush(self.state, [0, duration, capNeed, 0, clipSize, reloadTime])
|
||||
|
||||
if disable_period:
|
||||
self.period = self.t_max
|
||||
@@ -144,7 +145,7 @@ class CapSimulator(object):
|
||||
|
||||
while 1:
|
||||
activation = pop(state)
|
||||
t_now, duration, capNeed, shot, clipSize = activation
|
||||
t_now, duration, capNeed, shot, clipSize, reloadTime = activation
|
||||
if t_now >= t_max:
|
||||
break
|
||||
|
||||
@@ -180,7 +181,7 @@ class CapSimulator(object):
|
||||
if clipSize:
|
||||
if shot % clipSize == 0:
|
||||
shot = 0
|
||||
t_now += 10000 # include reload time
|
||||
t_now += reloadTime # include reload time
|
||||
activation[0] = t_now
|
||||
activation[3] = shot
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# ammoInfluenceCapNeed
|
||||
#
|
||||
# Used by:
|
||||
# Items from category: Charge (478 of 925)
|
||||
# Items from category: Charge (478 of 928)
|
||||
type = "passive"
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# ammoInfluenceRange
|
||||
#
|
||||
# Used by:
|
||||
# Items from category: Charge (572 of 925)
|
||||
# Items from category: Charge (572 of 928)
|
||||
type = "passive"
|
||||
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
# Used by:
|
||||
# Charges from group: Festival Charges (23 of 23)
|
||||
# Charges from group: Interdiction Probe (2 of 2)
|
||||
# Charges from group: Structure Festival Charges (3 of 3)
|
||||
type = "passive"
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# boosterArmorHpPenalty
|
||||
#
|
||||
# Used by:
|
||||
# Implants from group: Booster (12 of 54)
|
||||
# Implants from group: Booster (12 of 62)
|
||||
type = "boosterSideEffect"
|
||||
|
||||
# User-friendly name for the side effect
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# boosterMaxVelocityPenalty
|
||||
#
|
||||
# Used by:
|
||||
# Implants from group: Booster (12 of 54)
|
||||
# Implants from group: Booster (12 of 62)
|
||||
type = "boosterSideEffect"
|
||||
|
||||
# User-friendly name for the side effect
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# boosterShieldCapacityPenalty
|
||||
#
|
||||
# Used by:
|
||||
# Implants from group: Booster (12 of 54)
|
||||
# Implants from group: Booster (12 of 62)
|
||||
type = "boosterSideEffect"
|
||||
|
||||
# User-friendly name for the side effect
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# doomsdayAOEBubble
|
||||
#
|
||||
# Used by:
|
||||
# Module: Standup Warp Disruption Burst Projector
|
||||
# Module: Warp Disruption Burst Projector
|
||||
type = "projected", "active"
|
||||
|
||||
|
||||
|
||||
9
eos/effects/doomsdaybeamdot.py
Normal file
9
eos/effects/doomsdaybeamdot.py
Normal file
@@ -0,0 +1,9 @@
|
||||
# doomsdayBeamDOT
|
||||
#
|
||||
# Used by:
|
||||
# Modules named like: Lance (4 of 4)
|
||||
type = "active"
|
||||
|
||||
|
||||
def handler(fit, src, context):
|
||||
pass
|
||||
9
eos/effects/doomsdayconedot.py
Normal file
9
eos/effects/doomsdayconedot.py
Normal file
@@ -0,0 +1,9 @@
|
||||
# doomsdayConeDOT
|
||||
#
|
||||
# Used by:
|
||||
# Module: Bosonic Field Generator
|
||||
type = "active"
|
||||
|
||||
|
||||
def handler(fit, src, context):
|
||||
pass
|
||||
9
eos/effects/doomsdayhog.py
Normal file
9
eos/effects/doomsdayhog.py
Normal file
@@ -0,0 +1,9 @@
|
||||
# doomsdayHOG
|
||||
#
|
||||
# Used by:
|
||||
# Module: Gravitational Transportation Field Oscillator
|
||||
type = "active"
|
||||
|
||||
|
||||
def handler(fit, src, context):
|
||||
pass
|
||||
9
eos/effects/doomsdayslash.py
Normal file
9
eos/effects/doomsdayslash.py
Normal file
@@ -0,0 +1,9 @@
|
||||
# doomsdaySlash
|
||||
#
|
||||
# Used by:
|
||||
# Modules named like: Reaper (4 of 4)
|
||||
type = "active"
|
||||
|
||||
|
||||
def handler(fit, src, context):
|
||||
pass
|
||||
20
eos/effects/elitebonusflagcruiserallresistances1.py
Normal file
20
eos/effects/elitebonusflagcruiserallresistances1.py
Normal file
@@ -0,0 +1,20 @@
|
||||
# eliteBonusFlagCruiserAllResistances1
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Monitor
|
||||
type = "passive"
|
||||
|
||||
|
||||
def handler(fit, src, context):
|
||||
fit.ship.boostItemAttr("explosiveDamageResonance", src.getModifiedItemAttr("eliteBonusFlagCruisers1"), skill="Flag Cruisers")
|
||||
fit.ship.boostItemAttr("shieldKineticDamageResonance", src.getModifiedItemAttr("eliteBonusFlagCruisers1"), skill="Flag Cruisers")
|
||||
fit.ship.boostItemAttr("shieldExplosiveDamageResonance", src.getModifiedItemAttr("eliteBonusFlagCruisers1"), skill="Flag Cruisers")
|
||||
fit.ship.boostItemAttr("armorThermalDamageResonance", src.getModifiedItemAttr("eliteBonusFlagCruisers1"), skill="Flag Cruisers")
|
||||
fit.ship.boostItemAttr("thermalDamageResonance", src.getModifiedItemAttr("eliteBonusFlagCruisers1"), skill="Flag Cruisers")
|
||||
fit.ship.boostItemAttr("shieldEmDamageResonance", src.getModifiedItemAttr("eliteBonusFlagCruisers1"), skill="Flag Cruisers")
|
||||
fit.ship.boostItemAttr("armorExplosiveDamageResonance", src.getModifiedItemAttr("eliteBonusFlagCruisers1"), skill="Flag Cruisers")
|
||||
fit.ship.boostItemAttr("armorEmDamageResonance", src.getModifiedItemAttr("eliteBonusFlagCruisers1"), skill="Flag Cruisers")
|
||||
fit.ship.boostItemAttr("shieldThermalDamageResonance", src.getModifiedItemAttr("eliteBonusFlagCruisers1"), skill="Flag Cruisers")
|
||||
fit.ship.boostItemAttr("kineticDamageResonance", src.getModifiedItemAttr("eliteBonusFlagCruisers1"), skill="Flag Cruisers")
|
||||
fit.ship.boostItemAttr("armorKineticDamageResonance", src.getModifiedItemAttr("eliteBonusFlagCruisers1"), skill="Flag Cruisers")
|
||||
fit.ship.boostItemAttr("emDamageResonance", src.getModifiedItemAttr("eliteBonusFlagCruisers1"), skill="Flag Cruisers")
|
||||
@@ -9,4 +9,4 @@ type = "passive"
|
||||
def handler(fit, container, context):
|
||||
level = container.level if "skill" in context else 1
|
||||
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("High Speed Maneuvering"),
|
||||
"capacitorNeed", container.getModifiedItemAttr("capacitorNeedMultiplier") * level)
|
||||
"capacitorNeed", container.getModifiedItemAttr("capNeedBonus") * level)
|
||||
|
||||
9
eos/effects/microjumpportaldrive.py
Normal file
9
eos/effects/microjumpportaldrive.py
Normal file
@@ -0,0 +1,9 @@
|
||||
# microJumpPortalDrive
|
||||
#
|
||||
# Used by:
|
||||
# Module: Micro Jump Field Generator
|
||||
type = "active"
|
||||
|
||||
|
||||
def handler(fit, src, context):
|
||||
pass
|
||||
@@ -1,7 +1,7 @@
|
||||
# missileDMGBonus
|
||||
#
|
||||
# Used by:
|
||||
# Modules from group: Ballistic Control system (18 of 18)
|
||||
# Modules from group: Ballistic Control system (20 of 20)
|
||||
type = "passive"
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# missileLauncherSpeedMultiplier
|
||||
#
|
||||
# Used by:
|
||||
# Modules from group: Ballistic Control system (18 of 18)
|
||||
# Modules from group: Ballistic Control system (20 of 20)
|
||||
type = "passive"
|
||||
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#
|
||||
# Used by:
|
||||
# Modules from group: Drone Damage Modules (11 of 11)
|
||||
# Modules named like: C3 'Hivaa Saitsuo' Ballistic Control System (2 of 2)
|
||||
type = "passive"
|
||||
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#
|
||||
# Used by:
|
||||
# Modules from group: Missile Launcher Torpedo (22 of 22)
|
||||
# Items from market group: Ship Equipment > Turrets & Bays (429 of 861)
|
||||
# Items from market group: Ship Equipment > Turrets & Bays (429 of 863)
|
||||
# Module: Interdiction Sphere Launcher I
|
||||
type = "overheat"
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# overloadSelfDamageBonus
|
||||
#
|
||||
# Used by:
|
||||
# Modules from group: Energy Weapon (101 of 213)
|
||||
# Modules from group: Energy Weapon (101 of 214)
|
||||
# Modules from group: Hybrid Weapon (105 of 221)
|
||||
# Modules from group: Projectile Weapon (99 of 165)
|
||||
type = "overheat"
|
||||
|
||||
17
eos/effects/rolebonusflagcruisermodulefittingreduction.py
Normal file
17
eos/effects/rolebonusflagcruisermodulefittingreduction.py
Normal file
@@ -0,0 +1,17 @@
|
||||
# roleBonusFlagCruiserModuleFittingReduction
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Monitor
|
||||
type = "passive"
|
||||
|
||||
|
||||
def handler(fit, src, context):
|
||||
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name in ("Propulsion Module", "Micro Jump Drive"),
|
||||
"power", src.getModifiedItemAttr("flagCruiserFittingBonusPropMods"))
|
||||
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name in ("Propulsion Module", "Micro Jump Drive"),
|
||||
"cpu", src.getModifiedItemAttr("flagCruiserFittingBonusPropMods"))
|
||||
|
||||
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name in ("Target Painter", "Scan Probe Launcher"),
|
||||
"cpu", src.getModifiedItemAttr("flagCruiserFittingBonusPainterProbes"))
|
||||
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name in ("Target Painter", "Scan Probe Launcher"),
|
||||
"power", src.getModifiedItemAttr("flagCruiserFittingBonusPainterProbes"))
|
||||
@@ -0,0 +1,12 @@
|
||||
# roleBonusFlagCruiserTargetPainterModifications
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Monitor
|
||||
type = "passive"
|
||||
|
||||
|
||||
def handler(fit, src, context):
|
||||
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Target Painter", "signatureRadiusBonus",
|
||||
src.getModifiedItemAttr("targetPainterStrengthModifierFlagCruisers"))
|
||||
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Target Painter", "maxRange",
|
||||
src.getModifiedItemAttr("targetPainterRangeModifierFlagCruisers"))
|
||||
9
eos/effects/shipagilitybonusgc1.py
Normal file
9
eos/effects/shipagilitybonusgc1.py
Normal file
@@ -0,0 +1,9 @@
|
||||
# shipAgilityBonusGC1
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Monitor
|
||||
type = "passive"
|
||||
|
||||
|
||||
def handler(fit, src, context):
|
||||
fit.ship.boostItemAttr("agility", src.getModifiedItemAttr("shipBonusGC"), skill="Gallente Cruiser")
|
||||
9
eos/effects/shiparmorhitpointsac1.py
Normal file
9
eos/effects/shiparmorhitpointsac1.py
Normal file
@@ -0,0 +1,9 @@
|
||||
# shipArmorHitPointsAC1
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Monitor
|
||||
type = "passive"
|
||||
|
||||
|
||||
def handler(fit, src, context):
|
||||
fit.ship.boostItemAttr("armorHP", src.getModifiedItemAttr("shipBonusAC"), skill="Amarr Cruiser")
|
||||
@@ -2,6 +2,7 @@
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Gnosis
|
||||
# Ship: Praxis
|
||||
# Ship: Sunesis
|
||||
# Ship: Taipan
|
||||
# Ship: Velator
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
# Used by:
|
||||
# Variations of ship: Procurer (2 of 2)
|
||||
# Ship: Gnosis
|
||||
# Ship: Praxis
|
||||
# Ship: Sunesis
|
||||
# Ship: Taipan
|
||||
# Ship: Velator
|
||||
|
||||
10
eos/effects/shipbonusheavyassaultmissileemdamagecbc2.py
Normal file
10
eos/effects/shipbonusheavyassaultmissileemdamagecbc2.py
Normal file
@@ -0,0 +1,10 @@
|
||||
# shipBonusHeavyAssaultMissileEMDamageCBC2
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Drake Navy Issue
|
||||
type = "passive"
|
||||
|
||||
|
||||
def handler(fit, src, context):
|
||||
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Heavy Assault Missiles"), "emDamage",
|
||||
src.getModifiedItemAttr("shipBonusCBC2"), skill="Caldari Battlecruiser")
|
||||
@@ -0,0 +1,10 @@
|
||||
# shipBonusHeavyAssaultMissileExplosiveDamageCBC2
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Drake Navy Issue
|
||||
type = "passive"
|
||||
|
||||
|
||||
def handler(fit, src, context):
|
||||
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Heavy Assault Missiles"), "explosiveDamage",
|
||||
src.getModifiedItemAttr("shipBonusCBC2"), skill="Caldari Battlecruiser")
|
||||
10
eos/effects/shipbonusheavyassaultmissilekineticdamagecbc2.py
Normal file
10
eos/effects/shipbonusheavyassaultmissilekineticdamagecbc2.py
Normal file
@@ -0,0 +1,10 @@
|
||||
# shipBonusHeavyAssaultMissileKineticDamageCBC2
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Drake Navy Issue
|
||||
type = "passive"
|
||||
|
||||
|
||||
def handler(fit, src, context):
|
||||
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Heavy Assault Missiles"),
|
||||
"kineticDamage", src.getModifiedItemAttr("shipBonusCBC2"), skill="Caldari Battlecruiser")
|
||||
10
eos/effects/shipbonusheavyassaultmissilethermaldamagecbc2.py
Normal file
10
eos/effects/shipbonusheavyassaultmissilethermaldamagecbc2.py
Normal file
@@ -0,0 +1,10 @@
|
||||
# shipBonusHeavyAssaultMissileThermalDamageCBC2
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Drake Navy Issue
|
||||
type = "passive"
|
||||
|
||||
|
||||
def handler(fit, src, context):
|
||||
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Heavy Assault Missiles"),
|
||||
"thermalDamage", src.getModifiedItemAttr("shipBonusCBC2"), skill="Caldari Battlecruiser")
|
||||
10
eos/effects/shipbonusheavymissileemdamagecbc2.py
Normal file
10
eos/effects/shipbonusheavymissileemdamagecbc2.py
Normal file
@@ -0,0 +1,10 @@
|
||||
# shipBonusHeavyMissileEMDamageCBC2
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Drake Navy Issue
|
||||
type = "passive"
|
||||
|
||||
|
||||
def handler(fit, src, context):
|
||||
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Heavy Missiles"),
|
||||
"emDamage", src.getModifiedItemAttr("shipBonusCBC2"), skill="Caldari Battlecruiser")
|
||||
10
eos/effects/shipbonusheavymissileexplosivedamagecbc2.py
Normal file
10
eos/effects/shipbonusheavymissileexplosivedamagecbc2.py
Normal file
@@ -0,0 +1,10 @@
|
||||
# shipBonusHeavyMissileExplosiveDamageCBC2
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Drake Navy Issue
|
||||
type = "passive"
|
||||
|
||||
|
||||
def handler(fit, src, context):
|
||||
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Heavy Missiles"), "explosiveDamage",
|
||||
src.getModifiedItemAttr("shipBonusCBC2"), skill="Caldari Battlecruiser")
|
||||
10
eos/effects/shipbonusheavymissilekineticdamagecbc2.py
Normal file
10
eos/effects/shipbonusheavymissilekineticdamagecbc2.py
Normal file
@@ -0,0 +1,10 @@
|
||||
# shipBonusHeavyMissileKineticDamageCBC2
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Drake Navy Issue
|
||||
type = "passive"
|
||||
|
||||
|
||||
def handler(fit, src, context):
|
||||
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Heavy Missiles"), "kineticDamage",
|
||||
src.getModifiedItemAttr("shipBonusCBC2"), skill="Caldari Battlecruiser")
|
||||
10
eos/effects/shipbonusheavymissilethermaldamagecbc2.py
Normal file
10
eos/effects/shipbonusheavymissilethermaldamagecbc2.py
Normal file
@@ -0,0 +1,10 @@
|
||||
# shipBonusHeavyMissileThermalDamageCBC2
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Drake Navy Issue
|
||||
type = "passive"
|
||||
|
||||
|
||||
def handler(fit, src, context):
|
||||
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Heavy Missiles"), "thermalDamage",
|
||||
src.getModifiedItemAttr("shipBonusCBC2"), skill="Caldari Battlecruiser")
|
||||
@@ -2,6 +2,7 @@
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Gnosis
|
||||
# Ship: Praxis
|
||||
# Ship: Taipan
|
||||
# Ship: Velator
|
||||
type = "passive"
|
||||
|
||||
@@ -9,4 +9,4 @@ type = "passive"
|
||||
|
||||
def handler(fit, ship, context):
|
||||
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Missile Launcher Operation"),
|
||||
"explosionDelay", ship.getModifiedItemAttr("shipBonusPirateFaction2"))
|
||||
"explosionDelay", ship.getModifiedItemAttr("shipBonusRole8"))
|
||||
|
||||
@@ -7,6 +7,6 @@ type = "passive"
|
||||
|
||||
def handler(fit, ship, context):
|
||||
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Remote Armor Repair Systems"),
|
||||
"maxRange", ship.getModifiedItemAttr("shipBonusPirateFaction2"))
|
||||
"maxRange", ship.getModifiedItemAttr("shipBonusRole8"))
|
||||
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Remote Armor Repair Systems"),
|
||||
"falloffEffectiveness", ship.getModifiedItemAttr("shipBonusPirateFaction2"))
|
||||
"falloffEffectiveness", ship.getModifiedItemAttr("shipBonusRole8"))
|
||||
|
||||
38
eos/effects/shiplargeweaponsdamagebonus.py
Normal file
38
eos/effects/shiplargeweaponsdamagebonus.py
Normal file
@@ -0,0 +1,38 @@
|
||||
# shipLargeWeaponsDamageBonus
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Praxis
|
||||
type = "passive"
|
||||
|
||||
|
||||
def handler(fit, src, context):
|
||||
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Large Hybrid Turret"), "damageMultiplier",
|
||||
src.getModifiedItemAttr("shipBonusRole7"))
|
||||
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Large Projectile Turret"), "damageMultiplier",
|
||||
src.getModifiedItemAttr("shipBonusRole7"))
|
||||
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Large Energy Turret"), "damageMultiplier",
|
||||
src.getModifiedItemAttr("shipBonusRole7"))
|
||||
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Heavy Missiles"), "thermalDamage",
|
||||
src.getModifiedItemAttr("shipBonusRole7"))
|
||||
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Heavy Missiles"), "emDamage",
|
||||
src.getModifiedItemAttr("shipBonusRole7"))
|
||||
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Heavy Missiles"), "kineticDamage",
|
||||
src.getModifiedItemAttr("shipBonusRole7"))
|
||||
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Heavy Missiles"), "explosiveDamage",
|
||||
src.getModifiedItemAttr("shipBonusRole7"))
|
||||
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Torpedoes"), "emDamage",
|
||||
src.getModifiedItemAttr("shipBonusRole7"))
|
||||
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Torpedoes"), "kineticDamage",
|
||||
src.getModifiedItemAttr("shipBonusRole7"))
|
||||
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Torpedoes"), "explosiveDamage",
|
||||
src.getModifiedItemAttr("shipBonusRole7"))
|
||||
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Torpedoes"), "thermalDamage",
|
||||
src.getModifiedItemAttr("shipBonusRole7"))
|
||||
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Cruise Missiles"), "thermalDamage",
|
||||
src.getModifiedItemAttr("shipBonusRole7"))
|
||||
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Cruise Missiles"), "explosiveDamage",
|
||||
src.getModifiedItemAttr("shipBonusRole7"))
|
||||
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Cruise Missiles"), "kineticDamage",
|
||||
src.getModifiedItemAttr("shipBonusRole7"))
|
||||
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Cruise Missiles"), "emDamage",
|
||||
src.getModifiedItemAttr("shipBonusRole7"))
|
||||
@@ -4,10 +4,11 @@
|
||||
# Ships named like: Stratios (2 of 2)
|
||||
# Ship: Astero
|
||||
# Ship: Gnosis
|
||||
# Ship: Praxis
|
||||
# Ship: Sunesis
|
||||
type = "passive"
|
||||
|
||||
|
||||
def handler(fit, container, context):
|
||||
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Astrometrics"),
|
||||
"baseSensorStrength", container.getModifiedItemAttr("shipBonusPirateFaction2"))
|
||||
"baseSensorStrength", container.getModifiedItemAttr("shipBonusRole8"))
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
# shipShieldEmResistance1CBC2
|
||||
#
|
||||
# Used by:
|
||||
# Variations of ship: Drake (3 of 3)
|
||||
# Ship: Drake
|
||||
# Ship: Nighthawk
|
||||
# Ship: Vulture
|
||||
type = "passive"
|
||||
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
# shipShieldExplosiveResistance1CBC2
|
||||
#
|
||||
# Used by:
|
||||
# Variations of ship: Drake (3 of 3)
|
||||
# Ship: Drake
|
||||
# Ship: Nighthawk
|
||||
# Ship: Vulture
|
||||
type = "passive"
|
||||
|
||||
|
||||
9
eos/effects/shipshieldhitpointscc1.py
Normal file
9
eos/effects/shipshieldhitpointscc1.py
Normal file
@@ -0,0 +1,9 @@
|
||||
# shipShieldHitpointsCC1
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Monitor
|
||||
type = "passive"
|
||||
|
||||
|
||||
def handler(fit, src, context):
|
||||
fit.ship.boostItemAttr("shieldCapacity", src.getModifiedItemAttr("shipBonusCC"), skill="Caldari Cruiser")
|
||||
@@ -1,7 +1,8 @@
|
||||
# shipShieldKineticResistance1CBC2
|
||||
#
|
||||
# Used by:
|
||||
# Variations of ship: Drake (3 of 3)
|
||||
# Ship: Drake
|
||||
# Ship: Nighthawk
|
||||
# Ship: Vulture
|
||||
type = "passive"
|
||||
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
# shipShieldThermalResistance1CBC2
|
||||
#
|
||||
# Used by:
|
||||
# Variations of ship: Drake (3 of 3)
|
||||
# Ship: Drake
|
||||
# Ship: Nighthawk
|
||||
# Ship: Vulture
|
||||
type = "passive"
|
||||
|
||||
|
||||
9
eos/effects/shipsignatureradiusmc1.py
Normal file
9
eos/effects/shipsignatureradiusmc1.py
Normal file
@@ -0,0 +1,9 @@
|
||||
# shipSignatureRadiusMC1
|
||||
#
|
||||
# Used by:
|
||||
# Ship: Monitor
|
||||
type = "passive"
|
||||
|
||||
|
||||
def handler(fit, src, context):
|
||||
fit.ship.boostItemAttr("signatureRadius", src.getModifiedItemAttr("shipBonusMC"), skill="Minmatar Cruiser")
|
||||
@@ -11,8 +11,7 @@ def handler(fit, module, context):
|
||||
fit.ship.increaseItemAttr("warpScrambleStatus", module.getModifiedItemAttr("warpScrambleStrength"))
|
||||
if module.charge is not None and module.charge.ID == 47336:
|
||||
for mod in fit.modules:
|
||||
if not mod.isEmpty and mod.state > State.ONLINE and (
|
||||
mod.item.requiresSkill("High Speed Maneuvering")
|
||||
or mod.item.requiresSkill("Micro Jump Drive Operation")
|
||||
):
|
||||
if not mod.isEmpty and mod.item.requiresSkill("High Speed Maneuvering") and mod.state > State.ONLINE:
|
||||
mod.state = State.ONLINE
|
||||
if not mod.isEmpty and mod.item.requiresSkill("Micro Jump Drive Operation") and mod.state > State.ONLINE:
|
||||
mod.state = State.ONLINE
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#
|
||||
# Used by:
|
||||
# Drones from group: Combat Drone (74 of 74)
|
||||
# Modules from group: Energy Weapon (212 of 213)
|
||||
# Modules from group: Energy Weapon (212 of 214)
|
||||
type = 'active'
|
||||
|
||||
|
||||
|
||||
@@ -15,12 +15,13 @@ def handler(fit, src, context):
|
||||
if src.item.group.name == 'Missile Launcher Bomb':
|
||||
# Bomb Launcher Cooldown Timer
|
||||
moduleReactivationDelay = src.getModifiedItemAttr("moduleReactivationDelay")
|
||||
speed = src.getModifiedItemAttr("speed")
|
||||
|
||||
# Void and Focused Void Bombs
|
||||
neutAmount = src.getModifiedChargeAttr("energyNeutralizerAmount")
|
||||
|
||||
if moduleReactivationDelay and neutAmount:
|
||||
fit.addDrain(src, moduleReactivationDelay, neutAmount, 0)
|
||||
if moduleReactivationDelay and neutAmount and speed:
|
||||
fit.addDrain(src, speed + moduleReactivationDelay, neutAmount, 0)
|
||||
|
||||
# Lockbreaker Bombs
|
||||
ecmStrengthBonus = src.getModifiedChargeAttr("scan{0}StrengthBonus".format(fit.scanType))
|
||||
|
||||
@@ -11,7 +11,6 @@ runTime = "early"
|
||||
|
||||
def handler(fit, module, context):
|
||||
|
||||
|
||||
if "projected" in context:
|
||||
fit.ship.increaseItemAttr("warpScrambleStatus", module.getModifiedItemAttr("warpScrambleStrength"))
|
||||
if module.charge is not None and module.charge.ID == 45010:
|
||||
|
||||
@@ -21,3 +21,5 @@ def handler(fit, module, context):
|
||||
or mod.item.requiresSkill("High Speed Maneuvering")
|
||||
):
|
||||
mod.state = State.ONLINE
|
||||
if not mod.isEmpty and mod.item.requiresSkill("Micro Jump Drive Operation") and mod.state > State.ONLINE:
|
||||
mod.state = State.ONLINE
|
||||
|
||||
@@ -1084,7 +1084,7 @@ class Fit(object):
|
||||
|
||||
def calculateSustainableTank(self, effective=True):
|
||||
if self.__sustainableTank is None:
|
||||
if self.capStable:
|
||||
if self.capStable and not self.factorReload:
|
||||
sustainable = {
|
||||
"armorRepair" : self.extraAttributes["armorRepair"],
|
||||
"shieldRepair": self.extraAttributes["shieldRepair"],
|
||||
@@ -1142,16 +1142,34 @@ class Fit(object):
|
||||
usesCap = False
|
||||
except AttributeError:
|
||||
usesCap = False
|
||||
# Modules which do not use cap are not penalized based on cap use
|
||||
if usesCap:
|
||||
cycleTime = mod.getModifiedItemAttr("duration")
|
||||
amount = mod.getModifiedItemAttr(groupAttrMap[mod.item.group.name])
|
||||
|
||||
cycleTime = mod.rawCycleTime
|
||||
amount = mod.getModifiedItemAttr(groupAttrMap[mod.item.group.name])
|
||||
# Normal Repairers
|
||||
if usesCap and not mod.charge:
|
||||
sustainable[attr] -= amount / (cycleTime / 1000.0)
|
||||
repairers.append(mod)
|
||||
# Ancillary Armor reps etc
|
||||
elif usesCap and mod.charge:
|
||||
if mod.charge.name == "Nanite Repair Paste":
|
||||
multiplier = mod.getModifiedItemAttr("chargedArmorDamageMultiplier") or 1
|
||||
else:
|
||||
multiplier = 1
|
||||
sustainable[attr] -= amount * multiplier / (cycleTime / 1000.0)
|
||||
repairers.append(mod)
|
||||
# Ancillary Shield boosters etc
|
||||
elif not usesCap:
|
||||
if self.factorReload and mod.charge:
|
||||
reloadtime = mod.reloadTime
|
||||
else:
|
||||
reloadtime = 0.0
|
||||
offdutycycle = reloadtime / ((max(mod.numShots, 1) * cycleTime) + reloadtime)
|
||||
sustainable[attr] -= amount * offdutycycle / (cycleTime / 1000.0)
|
||||
|
||||
# Sort repairers by efficiency. We want to use the most efficient repairers first
|
||||
repairers.sort(key=lambda _mod: _mod.getModifiedItemAttr(
|
||||
groupAttrMap[_mod.item.group.name]) / _mod.getModifiedItemAttr("capacitorNeed"), reverse=True)
|
||||
groupAttrMap[_mod.item.group.name]) * (_mod.getModifiedItemAttr(
|
||||
"chargedArmorDamageMultiplier") or 1) / _mod.getModifiedItemAttr("capacitorNeed"), reverse=True)
|
||||
|
||||
# Loop through every module until we're above peak recharge
|
||||
# Most efficient first, as we sorted earlier.
|
||||
@@ -1160,15 +1178,35 @@ class Fit(object):
|
||||
for mod in repairers:
|
||||
if capUsed > totalPeakRecharge:
|
||||
break
|
||||
cycleTime = mod.cycleTime
|
||||
|
||||
if self.factorReload and mod.charge:
|
||||
reloadtime = mod.reloadTime
|
||||
else:
|
||||
reloadtime = 0.0
|
||||
|
||||
cycleTime = mod.rawCycleTime
|
||||
capPerSec = mod.capUse
|
||||
|
||||
if capPerSec is not None and cycleTime is not None:
|
||||
# Check how much this repper can work
|
||||
sustainability = min(1, (totalPeakRecharge - capUsed) / capPerSec)
|
||||
|
||||
# Add the sustainable amount
|
||||
amount = mod.getModifiedItemAttr(groupAttrMap[mod.item.group.name])
|
||||
sustainable[groupStoreMap[mod.item.group.name]] += sustainability * (amount / (cycleTime / 1000.0))
|
||||
# Add the sustainable amount
|
||||
|
||||
if not mod.charge:
|
||||
sustainable[groupStoreMap[mod.item.group.name]] += sustainability * amount / (
|
||||
cycleTime / 1000.0)
|
||||
else:
|
||||
if mod.charge.name == "Nanite Repair Paste":
|
||||
multiplier = mod.getModifiedItemAttr("chargedArmorDamageMultiplier") or 1
|
||||
else:
|
||||
multiplier = 1
|
||||
ondutycycle = (max(mod.numShots, 1) * cycleTime) / (
|
||||
(max(mod.numShots, 1) * cycleTime) + reloadtime)
|
||||
sustainable[groupStoreMap[
|
||||
mod.item.group.name]] += sustainability * amount * ondutycycle * multiplier / (
|
||||
cycleTime / 1000.0)
|
||||
|
||||
capUsed += capPerSec
|
||||
|
||||
sustainable["passiveShield"] = self.calculateShieldRecharge()
|
||||
@@ -1186,7 +1224,7 @@ class Fit(object):
|
||||
rechargeRate = self.ship.getModifiedItemAttr("shieldRechargeRate") / 1000.0
|
||||
return 10 / rechargeRate * sqrt(percent) * (1 - sqrt(percent)) * capacity
|
||||
|
||||
def addDrain(self, src, cycleTime, capNeed, clipSize=0):
|
||||
def addDrain(self, src, cycleTime, capNeed, clipSize=0, reloadTime=0):
|
||||
""" Used for both cap drains and cap fills (fills have negative capNeed) """
|
||||
|
||||
energyNeutralizerSignatureResolution = src.getModifiedItemAttr("energyNeutralizerSignatureResolution")
|
||||
@@ -1196,7 +1234,7 @@ class Fit(object):
|
||||
if energyNeutralizerSignatureResolution:
|
||||
capNeed = capNeed * min(1, signatureRadius / energyNeutralizerSignatureResolution)
|
||||
|
||||
self.__extraDrains.append((cycleTime, capNeed, clipSize))
|
||||
self.__extraDrains.append((cycleTime, capNeed, clipSize, reloadTime))
|
||||
|
||||
def removeDrain(self, i):
|
||||
del self.__extraDrains[i]
|
||||
@@ -1214,6 +1252,7 @@ class Fit(object):
|
||||
cycleTime = mod.rawCycleTime or 0
|
||||
reactivationTime = mod.getModifiedItemAttr("moduleReactivationDelay") or 0
|
||||
fullCycleTime = cycleTime + reactivationTime
|
||||
reloadTime = mod.reloadTime
|
||||
if fullCycleTime > 0:
|
||||
capNeed = mod.capUse
|
||||
if capNeed > 0:
|
||||
@@ -1225,11 +1264,11 @@ class Fit(object):
|
||||
disableStagger = mod.hardpoint == Hardpoint.TURRET
|
||||
|
||||
drains.append((int(fullCycleTime), mod.getModifiedItemAttr("capacitorNeed") or 0,
|
||||
mod.numShots or 0, disableStagger))
|
||||
mod.numShots or 0, disableStagger, reloadTime))
|
||||
|
||||
for fullCycleTime, capNeed, clipSize in self.iterDrains():
|
||||
for fullCycleTime, capNeed, clipSize, reloadTime in self.iterDrains():
|
||||
# Stagger incoming effects for cap simulation
|
||||
drains.append((int(fullCycleTime), capNeed, clipSize, False))
|
||||
drains.append((int(fullCycleTime), capNeed, clipSize, False, reloadTime))
|
||||
if capNeed > 0:
|
||||
capUsed += capNeed / (fullCycleTime / 1000.0)
|
||||
else:
|
||||
|
||||
@@ -337,8 +337,15 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut):
|
||||
volley *= self.getModifiedItemAttr("damageMultiplier") or 1
|
||||
if volley:
|
||||
cycleTime = self.cycleTime
|
||||
# Some weapons repeat multiple times in one cycle (think doomsdays)
|
||||
# Get the number of times it fires off
|
||||
weaponDoT = max(
|
||||
self.getModifiedItemAttr("doomsdayDamageDuration", 1) / self.getModifiedItemAttr("doomsdayDamageCycleTime", 1),
|
||||
1
|
||||
)
|
||||
|
||||
self.__volley = volley
|
||||
self.__dps = volley / (cycleTime / 1000.0)
|
||||
self.__dps = (volley * weaponDoT) / (cycleTime / 1000.0)
|
||||
|
||||
return self.__dps, self.__volley
|
||||
|
||||
@@ -710,7 +717,7 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut):
|
||||
|
||||
# Module can only fire one shot at a time, think bomb launchers or defender launchers
|
||||
if self.disallowRepeatingAction:
|
||||
if numShots > 1:
|
||||
if numShots > 0:
|
||||
"""
|
||||
The actual mechanics behind this is complex. Behavior will be (for 3 ammo):
|
||||
fire, reactivation delay, fire, reactivation delay, fire, max(reactivation delay, reload)
|
||||
@@ -720,12 +727,13 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut):
|
||||
|
||||
Currently would apply to bomb launchers and defender missiles
|
||||
"""
|
||||
effective_reload_time = ((self.reactivationDelay * (numShots - 1)) + max(raw_reload_time, self.reactivationDelay, 0)) / numShots
|
||||
effective_reload_time = ((self.reactivationDelay * (numShots - 1)) + max(raw_reload_time, self.reactivationDelay, 0))
|
||||
else:
|
||||
"""
|
||||
Applies to MJD/MJFG
|
||||
"""
|
||||
effective_reload_time = max(raw_reload_time, self.reactivationDelay, 0)
|
||||
speed = speed + effective_reload_time
|
||||
else:
|
||||
"""
|
||||
Currently no other modules would have a reactivation delay, so for sanities sake don't try and account for it.
|
||||
@@ -752,7 +760,7 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut):
|
||||
|
||||
@property
|
||||
def disallowRepeatingAction(self):
|
||||
return self.getModifiedItemAttr("disallowRepeatingAction", 0)
|
||||
return self.getModifiedItemAttr("disallowRepeatingActivation", 0)
|
||||
|
||||
@property
|
||||
def reactivationDelay(self):
|
||||
|
||||
@@ -135,7 +135,7 @@ class CargoView(d.Display):
|
||||
sFit = Fit.getInstance()
|
||||
fit = sFit.getFit(event.fitID)
|
||||
|
||||
self.Parent.Parent.DisablePage(self, not fit or fit.isStructure)
|
||||
# self.Parent.Parent.DisablePage(self, not fit or fit.isStructure)
|
||||
|
||||
# Clear list and get out if current fitId is None
|
||||
if event.fitID is None and self.lastFitId is not None:
|
||||
|
||||
@@ -72,6 +72,7 @@ class AmountChanger(wx.Dialog):
|
||||
|
||||
self.input = wx.TextCtrl(self, wx.ID_ANY, style=wx.TE_PROCESS_ENTER)
|
||||
self.input.SetValue(str(value))
|
||||
self.input.SelectAll()
|
||||
|
||||
bSizer1.Add(self.input, 0, wx.LEFT | wx.RIGHT | wx.EXPAND, 15)
|
||||
|
||||
@@ -82,7 +83,6 @@ class AmountChanger(wx.Dialog):
|
||||
bSizer1.Add(bSizer3, 0, wx.ALL | wx.EXPAND, 10)
|
||||
|
||||
self.input.SetFocus()
|
||||
self.input.SetInsertionPointEnd()
|
||||
self.input.Bind(wx.EVT_CHAR, self.onChar)
|
||||
self.input.Bind(wx.EVT_TEXT_ENTER, self.processEnter)
|
||||
self.SetSizer(bSizer1)
|
||||
|
||||
@@ -76,6 +76,31 @@ class Miscellanea(ViewColumn):
|
||||
stuff.getModifiedItemAttr("boosterDuration")
|
||||
text = "{0} min".format(formatAmount(stuff.getModifiedItemAttr("boosterDuration") / 1000 / 60, 3, 0, 3))
|
||||
return text, "Booster Duration"
|
||||
elif itemGroup in ("Super Weapon", "Structure Doomsday Weapon"):
|
||||
doomsday_duration = stuff.getModifiedItemAttr("doomsdayDamageDuration", 1)
|
||||
doomsday_dottime = stuff.getModifiedItemAttr("doomsdayDamageCycleTime", 1)
|
||||
func = stuff.getModifiedItemAttr
|
||||
|
||||
volley = sum(
|
||||
map(
|
||||
lambda attr: (func("%sDamage" % attr) or 0),
|
||||
("em", "thermal", "kinetic", "explosive")
|
||||
)
|
||||
)
|
||||
volley *= stuff.getModifiedItemAttr("damageMultiplier") or 1
|
||||
|
||||
if volley <= 0:
|
||||
text = ""
|
||||
tooltip = ""
|
||||
elif max(doomsday_duration / doomsday_dottime, 1) > 1:
|
||||
text = "{0} dmg over {1} s".format(formatAmount(volley * (doomsday_duration / doomsday_dottime), 3, 0, 3), doomsday_duration / 1000)
|
||||
tooltip = "Raw damage done over time"
|
||||
else:
|
||||
text = "{0} dmg".format(formatAmount(volley * (doomsday_duration / doomsday_dottime), 3, 0, 3))
|
||||
tooltip = "Raw damage done"
|
||||
return text, tooltip
|
||||
|
||||
pass
|
||||
elif itemGroup in ("Energy Weapon", "Hybrid Weapon", "Projectile Weapon", "Combat Drone", "Fighter Drone"):
|
||||
trackingSpeed = stuff.getModifiedItemAttr("trackingSpeed")
|
||||
if not trackingSpeed:
|
||||
|
||||
BIN
imgs/renders/45534.png
Normal file
BIN
imgs/renders/45534.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.4 KiB |
BIN
imgs/renders/47466.png
Normal file
BIN
imgs/renders/47466.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.4 KiB |
@@ -59,8 +59,8 @@ class CheckUpdateThread(threading.Thread):
|
||||
rVersion = Version(release['tag_name'])
|
||||
cVersion = Version(config.version)
|
||||
|
||||
# Suppress pre releases
|
||||
if rVersion.is_prerelease and self.settings.get('prerelease'):
|
||||
# Suppress pre releases if we're not already on a pre-release (if we are, we want to know about new ones)
|
||||
if not cVersion.is_prerelease and rVersion.is_prerelease and self.settings.get('prerelease'):
|
||||
continue
|
||||
|
||||
# Handle use-case of updating to suppressed version
|
||||
|
||||
Reference in New Issue
Block a user