Merge branch 'master' into test-3

# Conflicts:
#	.gitignore
#	eos/saveddata/character.py
#	service/network.py
#	service/price.py
This commit is contained in:
blitzmann
2017-12-10 22:30:48 -05:00
89 changed files with 345 additions and 156 deletions

View File

@@ -20,10 +20,10 @@ debug = False
saveInRoot = False
# Version data
version = "1.33.3"
tag = "git"
expansionName = "Lifeblood"
expansionVersion = "1.7"
version = "1.34.0"
tag = "Stable"
expansionName = " Arms Race"
expansionVersion = "1.3"
evemonMinVersion = "4081"
pyfaPath = None
@@ -65,7 +65,7 @@ def getPyfaRoot():
def getGitVersion():
with open(os.path.join(pyfaPath, 'gitversion')) as f:
with open(os.path.join(pyfaPath, '.version')) as f:
version = f.readline()
return version

View File

@@ -23,7 +23,7 @@ added_files = [
('../../eve.db', '.'),
('../../README.md', '.'),
('../../LICENSE', '.'),
('../../gitversion', '.'),
('../../.version', '.'),
]
import_these = []

View File

@@ -0,0 +1,9 @@
"""
Migration 27
- Resets all alpha clones to 1 (CCP consolidated all alpha's into one skillset)
"""
def upgrade(saveddata_engine):
saveddata_engine.execute("UPDATE characters SET alphaCloneID = 1 WHERE alphaCloneID IS NOT NULL")

View File

@@ -6,4 +6,4 @@ type = "passive"
def handler(fit, module, context):
fit.ship.increaseItemAttr("warmScrambleStatus", module.getModifiedItemAttr("warpScrambleStrength"))
fit.ship.increaseItemAttr("warpScrambleStatus", module.getModifiedItemAttr("warpScrambleStrength"))

View File

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

View File

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

View File

@@ -9,7 +9,7 @@ type = "passive"
def handler(fit, container, context):
level = container.level if "skill" in context else 1
attrs = ("boosterTurretFalloffPenalty", "boosterTurretOptimalRange", "boosterTurretTrackingPenalty")
attrs = ("boosterTurretFalloffPenalty", "boosterTurretOptimalRangePenalty", "boosterTurretTrackingPenalty")
for attr in attrs:
fit.boosters.filteredItemBoost(lambda booster: True, attr,
container.getModifiedItemAttr("boosterAttributeModifier") * level)

View File

@@ -1,3 +1,9 @@
# boosterShieldBoostAmountPenaltyShieldSkills
#
# Used by:
# Implants named like: Crash Booster (3 of 4)
# Implants named like: Frentix Booster (3 of 4)
# Implants named like: Mindflood Booster (3 of 4)
type = "boosterSideEffect"
# User-friendly name for the side effect

View File

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

View File

@@ -10,7 +10,7 @@ type = "boosterSideEffect"
displayName = "Turret Optimal Range"
# Attribute that this effect targets
attr = "boosterTurretOptimalRange"
attr = "boosterTurretOptimalRangePenalty"
def handler(fit, booster, context):

View File

@@ -5,8 +5,8 @@
# Ships from group: Blockade Runner (4 of 4)
# Ships from group: Covert Ops (7 of 7)
# Ships from group: Expedition Frigate (2 of 2)
# Ships from group: Force Recon Ship (7 of 8)
# Ships from group: Stealth Bomber (4 of 5)
# Ships from group: Force Recon Ship (8 of 8)
# Ships from group: Stealth Bomber (5 of 5)
# Ships named like: Stratios (2 of 2)
# Subsystems named like: Defensive Covert Reconfiguration (4 of 4)
# Ship: Astero

View File

@@ -8,4 +8,4 @@ runTime = "early"
def handler(fit, ship, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Cloaking"),
"cpu", ship.getModifiedItemAttr("eliteBonusCoverOps1"), skill="Covert Ops")
"cpu", ship.getModifiedItemAttr("eliteBonusCovertOps1"), skill="Covert Ops")

View File

@@ -5,7 +5,9 @@
# Ship: Astero
# Ship: Enforcer
# Ship: Pacifier
# Ship: Victor
# Ship: Victorieux Luxury Yacht
# Ship: Virtuoso
type = "passive"
runTime = "early"

View File

@@ -0,0 +1,10 @@
# covertOpsStealthBomberSiegeMissileLauncherCPUNeedBonus
#
# Used by:
# Ship: Virtuoso
type = "passive"
def handler(fit, ship, context):
fit.modules.filteredItemMultiply(lambda mod: mod.item.group.name == "Missile Launcher Torpedo",
"cpu", ship.getModifiedItemAttr("stealthBomberLauncherCPU"))

View File

@@ -1,7 +1,7 @@
# covertOpsStealthBomberSiegeMissileLauncerPowerNeedBonus
# covertOpsStealthBomberSiegeMissileLauncherPowerNeedBonus
#
# Used by:
# Ships from group: Stealth Bomber (4 of 5)
# Ships from group: Stealth Bomber (5 of 5)
type = "passive"

View File

@@ -2,7 +2,7 @@
#
# Used by:
# Ships from group: Black Ops (5 of 5)
# Ships from group: Stealth Bomber (4 of 5)
# Ships from group: Stealth Bomber (5 of 5)
# Ship: Caedes
# Ship: Chremoas
# Ship: Endurance

View File

@@ -1,7 +1,7 @@
# cynosuralDurationBonus
#
# Used by:
# Ships from group: Force Recon Ship (6 of 8)
# Ships from group: Force Recon Ship (7 of 8)
type = "passive"

View File

@@ -1,7 +1,7 @@
# cynosuralTheoryConsumptionBonus
#
# Used by:
# Ships from group: Force Recon Ship (6 of 8)
# Ships from group: Force Recon Ship (7 of 8)
# Skill: Cynosural Field Theory
type = "passive"

View File

@@ -7,4 +7,4 @@ type = "passive"
def handler(fit, ship, context):
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Bomb Deployment"),
"emDamage", ship.getModifiedItemAttr("eliteBonusCoverOps1"), skill="Covert Ops")
"emDamage", ship.getModifiedItemAttr("eliteBonusCovertOps1"), skill="Covert Ops")

View File

@@ -2,10 +2,11 @@
#
# Used by:
# Ship: Hound
# Ship: Virtuoso
type = "passive"
def handler(fit, ship, context):
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Bomb Deployment"),
"explosiveDamage", ship.getModifiedItemAttr("eliteBonusCoverOps1"),
"explosiveDamage", ship.getModifiedItemAttr("eliteBonusCovertOps1"),
skill="Covert Ops")

View File

@@ -7,5 +7,5 @@ type = "passive"
def handler(fit, ship, context):
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Bomb Deployment"),
"kineticDamage", ship.getModifiedItemAttr("eliteBonusCoverOps1"),
"kineticDamage", ship.getModifiedItemAttr("eliteBonusCovertOps1"),
skill="Covert Ops")

View File

@@ -2,10 +2,11 @@
#
# Used by:
# Ship: Nemesis
# Ship: Virtuoso
type = "passive"
def handler(fit, ship, context):
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Bomb Deployment"),
"thermalDamage", ship.getModifiedItemAttr("eliteBonusCoverOps1"),
"thermalDamage", ship.getModifiedItemAttr("eliteBonusCovertOps1"),
skill="Covert Ops")

View File

@@ -7,5 +7,5 @@ type = "passive"
def handler(fit, src, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name in ("Energy Nosferatu", "Energy Neutralizer"),
"falloffEffectiveness", src.getModifiedItemAttr("eliteBonusCoverOps1"),
"falloffEffectiveness", src.getModifiedItemAttr("eliteBonusCovertOps1"),
stackingPenalties=True, skill="Covert Ops")

View File

@@ -7,5 +7,5 @@ type = "passive"
def handler(fit, ship, context):
fit.modules.filteredChargeBoost(lambda mod: mod.charge.group.name == "Scanner Probe",
"baseSensorStrength", ship.getModifiedItemAttr("eliteBonusCoverOps2"),
"baseSensorStrength", ship.getModifiedItemAttr("eliteBonusCovertOps2"),
skill="Covert Ops")

View File

@@ -6,4 +6,4 @@ type = "passive"
def handler(fit, src, context):
fit.ship.boostItemAttr("warpSpeedMultiplier", src.getModifiedItemAttr("eliteBonusCoverOps1"), skill="Covert Ops")
fit.ship.boostItemAttr("warpSpeedMultiplier", src.getModifiedItemAttr("eliteBonusCovertOps1"), skill="Covert Ops")

View File

@@ -0,0 +1,10 @@
# eliteBonusCovertOpsSHTDamage3
#
# Used by:
# Ship: Virtuoso
type = "passive"
def handler(fit, src, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Small Hybrid Turret"), "damageMultiplier",
src.getModifiedItemAttr("eliteBonusCovertOps3"), skill="Covert Ops")

View File

@@ -0,0 +1,10 @@
# eliteCovertOpsBonusArmorRepAmount4
#
# Used by:
# Ship: Virtuoso
type = "passive"
def handler(fit, src, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Repair Systems"), "armorDamageAmount",
src.getModifiedItemAttr("eliteBonusCovertOps4"), skill="Covert Ops")

View File

@@ -0,0 +1,10 @@
# eliteReconBonusArmorRepAmount3
#
# Used by:
# Ship: Victor
type = "passive"
def handler(fit, src, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Repair Systems"), "armorDamageAmount",
src.getModifiedItemAttr("eliteBonusReconShip3"), skill="Recon Ships")

View File

@@ -0,0 +1,10 @@
# eliteReconBonusMHTDamage1
#
# Used by:
# Ship: Victor
type = "passive"
def handler(fit, src, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Medium Hybrid Turret"), "damageMultiplier",
src.getModifiedItemAttr("eliteBonusReconShip1"), skill="Recon Ships")

View File

@@ -4,6 +4,7 @@
# Ship: Huginn
# Ship: Moracha
# Ship: Rapier
# Ship: Victor
type = "passive"

View File

@@ -0,0 +1,6 @@
# Not used by any item
type = "passive"
def handler(fit, src, context):
fit.modules.filteredItemIncrease(lambda mod: mod.item.requiresSkill("Hacking"), "virusStrength", src.getModifiedItemAttr("virusStrengthBonus"))

View File

@@ -1,7 +1,7 @@
# missileSkillWarheadUpgradesEmDamageBonus
#
# Used by:
# Implants named like: Agency Damage Booster (3 of 3)
# Implants named like: Agency 'Pyrolancea' DB Dose (3 of 3)
# Skill: Warhead Upgrades
type = "passive"

View File

@@ -1,7 +1,7 @@
# missileSkillWarheadUpgradesExplosiveDamageBonus
#
# Used by:
# Implants named like: Agency Damage Booster (3 of 3)
# Implants named like: Agency 'Pyrolancea' DB Dose (3 of 3)
# Skill: Warhead Upgrades
type = "passive"

View File

@@ -1,7 +1,7 @@
# missileSkillWarheadUpgradesKineticDamageBonus
#
# Used by:
# Implants named like: Agency Damage Booster (3 of 3)
# Implants named like: Agency 'Pyrolancea' DB Dose (3 of 3)
# Skill: Warhead Upgrades
type = "passive"

View File

@@ -1,7 +1,7 @@
# missileSkillWarheadUpgradesThermalDamageBonus
#
# Used by:
# Implants named like: Agency Damage Booster (3 of 3)
# Implants named like: Agency 'Pyrolancea' DB Dose (3 of 3)
# Skill: Warhead Upgrades
type = "passive"

View File

@@ -2,7 +2,7 @@
#
# Used by:
# Modules from group: Rig Anchor (4 of 4)
# Implants named like: Agency Speed Booster (3 of 3)
# Implants named like: Agency 'Overclocker' SB Dose (3 of 3)
# Implants named like: grade Snake (16 of 18)
# Modules named like: Auxiliary Thrusters (8 of 8)
# Implant: Quafe Zero

View File

@@ -0,0 +1,21 @@
# roleBonus2BoosterPenaltyReduction
#
# Used by:
# Ship: Victor
# Ship: Virtuoso
type = "passive"
def handler(fit, src, context):
fit.boosters.filteredItemBoost(lambda mod: mod.item.group.name == "Booster", "boosterMissileAOECloudPenalty", src.getModifiedItemAttr("shipBonusRole2"))
fit.boosters.filteredItemBoost(lambda mod: mod.item.group.name == "Booster", "boosterCapacitorCapacityPenalty", src.getModifiedItemAttr("shipBonusRole2"))
fit.boosters.filteredItemBoost(lambda mod: mod.item.group.name == "Booster", "boosterAOEVelocityPenalty", src.getModifiedItemAttr("shipBonusRole2"))
fit.boosters.filteredItemBoost(lambda mod: mod.item.group.name == "Booster", "boosterArmorRepairAmountPenalty", src.getModifiedItemAttr("shipBonusRole2"))
fit.boosters.filteredItemBoost(lambda mod: mod.item.group.name == "Booster", "boosterMissileVelocityPenalty", src.getModifiedItemAttr("shipBonusRole2"))
fit.boosters.filteredItemBoost(lambda mod: mod.item.group.name == "Booster", "boosterTurretTrackingPenalty", src.getModifiedItemAttr("shipBonusRole2"))
fit.boosters.filteredItemBoost(lambda mod: mod.item.group.name == "Booster", "boosterShieldCapacityPenalty", src.getModifiedItemAttr("shipBonusRole2"))
fit.boosters.filteredItemBoost(lambda mod: mod.item.group.name == "Booster", "boosterTurretOptimalRangePenalty", src.getModifiedItemAttr("shipBonusRole2"))
fit.boosters.filteredItemBoost(lambda mod: mod.item.group.name == "Booster", "boosterShieldBoostAmountPenalty", src.getModifiedItemAttr("shipBonusRole2"))
fit.boosters.filteredItemBoost(lambda mod: mod.item.group.name == "Booster", "boosterTurretFalloffPenalty", src.getModifiedItemAttr("shipBonusRole2"))
fit.boosters.filteredItemBoost(lambda mod: mod.item.group.name == "Booster", "boosterArmorHPPenalty", src.getModifiedItemAttr("shipBonusRole2"))
fit.boosters.filteredItemBoost(lambda mod: mod.item.group.name == "Booster", "boosterMaxVelocityPenalty", src.getModifiedItemAttr("shipBonusRole2"))

View File

@@ -0,0 +1,10 @@
# roleBonusBombLauncherPWGCPU3
#
# Used by:
# Ship: Virtuoso
type = "passive"
def handler(fit, src, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Bomb Deployment"), "power", src.getModifiedItemAttr("shipBonusRole3"))
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Bomb Deployment"), "cpu", src.getModifiedItemAttr("shipBonusRole3"))

View File

@@ -0,0 +1,9 @@
# roleBonusMHTDamage1
#
# Used by:
# Ship: Victor
type = "passive"
def handler(fit, src, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Medium Hybrid Turret"), "damageMultiplier", src.getModifiedItemAttr("shipBonusRole1"))

View File

@@ -0,0 +1,9 @@
# roleBonusTorpRoF1
#
# Used by:
# Ship: Virtuoso
type = "passive"
def handler(fit, src, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Missile Launcher Torpedo", "speed", src.getModifiedItemAttr("shipBonusRole1"))

View File

@@ -1,7 +1,7 @@
# shieldBoostAmplifierPassive
#
# Used by:
# Implants named like: Agency Tank Booster (3 of 3)
# Implants named like: Agency 'Hardshell' TB Dose (3 of 3)
# Implants named like: grade Crystal (15 of 18)
type = "passive"

View File

@@ -7,4 +7,4 @@ type = "passive"
def handler(fit, ship, context):
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Torpedoes"),
"emDamage", ship.getModifiedItemAttr("eliteBonusCoverOps2"), skill="Covert Ops")
"emDamage", ship.getModifiedItemAttr("eliteBonusCovertOps2"), skill="Covert Ops")

View File

@@ -2,10 +2,11 @@
#
# Used by:
# Ship: Hound
# Ship: Virtuoso
type = "passive"
def handler(fit, ship, context):
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Torpedoes"),
"explosiveDamage", ship.getModifiedItemAttr("eliteBonusCoverOps2"),
"explosiveDamage", ship.getModifiedItemAttr("eliteBonusCovertOps2"),
skill="Covert Ops")

View File

@@ -7,5 +7,5 @@ type = "passive"
def handler(fit, ship, context):
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Torpedoes"),
"kineticDamage", ship.getModifiedItemAttr("eliteBonusCoverOps2"),
"kineticDamage", ship.getModifiedItemAttr("eliteBonusCovertOps2"),
skill="Covert Ops")

View File

@@ -2,10 +2,11 @@
#
# Used by:
# Ship: Nemesis
# Ship: Virtuoso
type = "passive"
def handler(fit, ship, context):
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Torpedoes"),
"thermalDamage", ship.getModifiedItemAttr("eliteBonusCoverOps2"),
"thermalDamage", ship.getModifiedItemAttr("eliteBonusCovertOps2"),
skill="Covert Ops")

View File

@@ -1,7 +1,7 @@
# shipBonusEmShieldResistanceCB2
#
# Used by:
# Ships named like: Rattlesnake (2 of 2)
# Ship: Rattlesnake
# Ship: Rokh
# Ship: Scorpion Navy Issue
type = "passive"

View File

@@ -1,7 +1,7 @@
# shipBonusExplosiveShieldResistanceCB2
#
# Used by:
# Ships named like: Rattlesnake (2 of 2)
# Ship: Rattlesnake
# Ship: Rokh
# Ship: Scorpion Navy Issue
type = "passive"

View File

@@ -1,7 +1,6 @@
# shipBonusForceAuxiliaryC1RemoteBoostAndCapAmount
#
# Used by:
# Ship: Loggerhead
# Ship: Minokawa
type = "passive"

View File

@@ -1,7 +1,7 @@
# shipBonusHeavyDroneArmorHpPirateFaction
#
# Used by:
# Ships named like: Rattlesnake (2 of 2)
# Ship: Rattlesnake
type = "passive"

View File

@@ -1,7 +1,7 @@
# shipBonusHeavyDroneDamageMultiplierPirateFaction
#
# Used by:
# Ships named like: Rattlesnake (2 of 2)
# Ship: Rattlesnake
type = "passive"

View File

@@ -1,7 +1,7 @@
# shipBonusHeavyDroneHPPirateFaction
#
# Used by:
# Ships named like: Rattlesnake (2 of 2)
# Ship: Rattlesnake
type = "passive"

View File

@@ -1,7 +1,7 @@
# shipBonusHeavyDroneShieldHpPirateFaction
#
# Used by:
# Ships named like: Rattlesnake (2 of 2)
# Ship: Rattlesnake
type = "passive"

View File

@@ -1,7 +1,7 @@
# shipBonusKineticMissileDamageGB2
#
# Used by:
# Ships named like: Rattlesnake (2 of 2)
# Ship: Rattlesnake
type = "passive"

View File

@@ -1,7 +1,7 @@
# shipBonusKineticShieldResistanceCB2
#
# Used by:
# Ships named like: Rattlesnake (2 of 2)
# Ship: Rattlesnake
# Ship: Rokh
# Ship: Scorpion Navy Issue
type = "passive"

View File

@@ -2,6 +2,7 @@
#
# Used by:
# Ship: Hound
# Ship: Virtuoso
type = "passive"

View File

@@ -2,6 +2,7 @@
#
# Used by:
# Ship: Hound
# Ship: Virtuoso
type = "passive"

View File

@@ -1,7 +1,7 @@
# shipBonusSentryDroneArmorHpPirateFaction
#
# Used by:
# Ships named like: Rattlesnake (2 of 2)
# Ship: Rattlesnake
type = "passive"

View File

@@ -1,7 +1,7 @@
# shipBonusSentryDroneDamageMultiplierPirateFaction
#
# Used by:
# Ships named like: Rattlesnake (2 of 2)
# Ship: Rattlesnake
type = "passive"

View File

@@ -1,7 +1,7 @@
# shipBonusSentryDroneHPPirateFaction
#
# Used by:
# Ships named like: Rattlesnake (2 of 2)
# Ship: Rattlesnake
type = "passive"

View File

@@ -1,7 +1,7 @@
# shipBonusSentryDroneShieldHpPirateFaction
#
# Used by:
# Ships named like: Rattlesnake (2 of 2)
# Ship: Rattlesnake
type = "passive"

View File

@@ -0,0 +1,10 @@
# shipBonusSHTFalloffGF1
#
# Used by:
# Ship: Virtuoso
type = "passive"
def handler(fit, src, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Small Hybrid Turret"), "falloff",
src.getModifiedItemAttr("shipBonusGF"), skill="Gallente Frigate")

View File

@@ -1,4 +1,4 @@
# shipFalloffBonusGF
# shipBonusSHTFalloffGF2
#
# Used by:
# Ship: Atron

View File

@@ -7,5 +7,5 @@ type = "passive"
def handler(fit, ship, context):
fit.modules.filteredChargeBoost(lambda mod: mod.charge.group.name == "Survey Probe",
"explosionDelay", ship.getModifiedItemAttr("eliteBonusCoverOps3"),
"explosionDelay", ship.getModifiedItemAttr("eliteBonusCovertOps3"),
skill="Covert Ops")

View File

@@ -1,7 +1,7 @@
# shipBonusThermalMissileDamageGB2
#
# Used by:
# Ships named like: Rattlesnake (2 of 2)
# Ship: Rattlesnake
type = "passive"

View File

@@ -1,7 +1,7 @@
# shipBonusThermicShieldResistanceCB2
#
# Used by:
# Ships named like: Rattlesnake (2 of 2)
# Ship: Rattlesnake
# Ship: Rokh
# Ship: Scorpion Navy Issue
type = "passive"

View File

@@ -1,4 +1,4 @@
# shipBonusTitanG2AllDamageBonus
# shipBonusTitanG2EMExplosiveDamageBonus
#
# Used by:
# Ship: Komodo

View File

@@ -2,6 +2,7 @@
#
# Used by:
# Ship: Nemesis
# Ship: Virtuoso
type = "passive"

View File

@@ -1,6 +1,7 @@
# shipHTurretFalloffBonusGC
#
# Used by:
# Ship: Victor
# Ship: Vigilant
type = "passive"

View File

@@ -3,6 +3,7 @@
# Used by:
# Ship: Velator
# Ship: Violator
# Ship: Virtuoso
type = "passive"

View File

@@ -1,6 +1,7 @@
# shipStasisWebStrengthBonusMC2
#
# Used by:
# Ship: Victor
# Ship: Vigilant
type = "passive"

View File

@@ -2,6 +2,7 @@
#
# Used by:
# Ship: Daredevil
# Ship: Virtuoso
type = "passive"

View File

@@ -1,7 +1,7 @@
# structuralAnalysisEffect
#
# Used by:
# Implants named like: Agency Tank Booster (3 of 3)
# Implants named like: Agency 'Hardshell' TB Dose (3 of 3)
# Implants named like: Inherent Implants 'Noble' Repair Proficiency RP (6 of 6)
# Modules named like: Auxiliary Nano Pump (8 of 8)
# Implant: Imperial Navy Modified 'Noble' Implant

View File

@@ -9,6 +9,9 @@ type = "projected", "active"
def handler(fit, module, context):
if "projected" not in context:
return
fit.ship.increaseItemAttr("warpScrambleStatus", module.getModifiedItemAttr("warpScrambleStrength"))
# this is such a dirty hack
for mod in fit.modules:
if not mod.isEmpty and mod.item.requiresSkill("High Speed Maneuvering") and mod.state > State.ONLINE:

View File

@@ -1,7 +1,7 @@
# surgicalStrikeDamageMultiplierBonusPostPercentDamageMultiplierLocationShipModulesRequiringGunnery
#
# Used by:
# Implants named like: Agency Damage Booster (3 of 3)
# Implants named like: Agency 'Pyrolancea' DB Dose (3 of 3)
# Implants named like: Eifyr and Co. 'Gunslinger' Surgical Strike SS (6 of 6)
# Implant: Standard Cerebral Accelerator
type = "passive"

View File

@@ -2,7 +2,9 @@
#
# Used by:
# Modules from group: Warp Disrupt Field Generator (7 of 7)
type = "active"
from eos.saveddata.module import State
type = "projected", "active"
runTime = "early"
@@ -14,3 +16,11 @@ def handler(fit, module, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Propulsion Module",
"speedFactor", module.getModifiedItemAttr("speedFactorBonus"))
fit.ship.forceItemAttr("disallowAssistance", 1)
if "projected" in context:
fit.ship.increaseItemAttr("warpScrambleStatus", module.getModifiedItemAttr("warpScrambleStrength"))
if module.charge is not None and module.charge.ID == 45010:
for mod in fit.modules:
if not mod.isEmpty and mod.item.requiresSkill("High Speed Maneuvering") and mod.state > State.ONLINE:
mod.state = State.ONLINE

View File

@@ -6,4 +6,5 @@ type = "projected", "active"
def handler(fit, module, context):
fit.ship.increaseItemAttr("warpScrambleStatus", module.getModifiedItemAttr("warpScrambleStrength"))
if "projected" in context:
fit.ship.increaseItemAttr("warpScrambleStatus", module.getModifiedItemAttr("warpScrambleStrength"))

View File

@@ -2,7 +2,6 @@
#
# Used by:
# Modules named like: Warp Scrambler (26 of 26)
from eos.saveddata.module import State
runTime = "early"
@@ -12,6 +11,9 @@ type = "projected", "active"
def handler(fit, module, context):
if "projected" not in context:
return
fit.ship.increaseItemAttr("warpScrambleStatus", module.getModifiedItemAttr("warpScrambleStrength"))
# this is such a dirty hack
for mod in fit.modules:
if not mod.isEmpty and mod.item.requiresSkill("High Speed Maneuvering") and mod.state > State.ONLINE:

View File

@@ -158,9 +158,7 @@ class Character(object):
name += " *"
if self.alphaCloneID:
clone = eos.db.getAlphaClone(self.alphaCloneID)
type = clone.alphaCloneName.split()[1]
name += ' (\u03B1{})'.format(type[0].upper())
name += ' (\u03B1)'
return name

BIN
eve.db

Binary file not shown.

View File

@@ -89,6 +89,10 @@ class PFGeneralPref(PreferenceView):
self.stDefaultSystem = wx.StaticText(panel, wx.ID_ANY, "Default Market Prices:", wx.DefaultPosition, wx.DefaultSize, 0)
self.stDefaultSystem.Wrap(-1)
priceSizer.Add(self.stDefaultSystem, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
self.stDefaultSystem.SetCursor(helpCursor)
self.stDefaultSystem.SetToolTip(
wx.ToolTip('The source you choose will be tried first, but subsequent sources will be used if the preferred '
'source fails. The system you choose is absolute and requests will not be made against other systems.'))
self.chPriceSource = wx.Choice(panel, choices=sorted(Price.sources.keys()))
self.chPriceSystem = wx.Choice(panel, choices=list(Price.systemsList.keys()))

View File

@@ -193,7 +193,12 @@ class TargetingMiscViewFull(StatsView):
elif labelName == "labelFullSigRadius":
label.SetToolTip(wx.ToolTip("Probe Size: %.3f" % (fit.probeSize or 0)))
elif labelName == "labelFullWarpSpeed":
label.SetToolTip(wx.ToolTip("Max Warp Distance: %.1f AU" % fit.maxWarpDistance))
maxWarpDistance = "Max Warp Distance: %.1f AU" % fit.maxWarpDistance
if fit.ship.getModifiedItemAttr("warpScrambleStatus"):
warpScrambleStatus = "Warp Core Strength: %.1f" % (fit.ship.getModifiedItemAttr("warpScrambleStatus") * -1)
else:
warpScrambleStatus = "Warp Core Strength: %.1f" % 0
label.SetToolTip(wx.ToolTip("%s\n%s" % (maxWarpDistance, warpScrambleStatus)))
elif labelName == "labelSensorStr":
if fit.jamChance > 0:
label.SetToolTip(
@@ -218,9 +223,12 @@ class TargetingMiscViewFull(StatsView):
self._cachedValues[counter] = newValues
elif labelName == "labelFullWarpSpeed":
if fit:
label.SetToolTip(wx.ToolTip("Max Warp Distance: %.1f AU" % fit.maxWarpDistance))
else:
label.SetToolTip(wx.ToolTip(""))
maxWarpDistance = "Max Warp Distance: %.1f AU" % fit.maxWarpDistance
if fit.ship.getModifiedItemAttr("warpScrambleStatus"):
warpScrambleStatus = "Warp Core Strength: %.1f" % (fit.ship.getModifiedItemAttr("warpScrambleStatus") * -1)
else:
warpScrambleStatus = "Warp Core Strength: %.1f" % 0
label.SetToolTip(wx.ToolTip("%s\n%s" % (maxWarpDistance, warpScrambleStatus)))
elif labelName == "labelSensorStr":
if fit:
if fit.jamChance > 0:

View File

@@ -188,7 +188,12 @@ class TargetingMiscViewMinimal(StatsView):
lockTime += "%5s\t%s\n" % (left, right)
label.SetToolTip(wx.ToolTip(lockTime))
elif labelName == "labelFullWarpSpeed":
label.SetToolTip(wx.ToolTip("Max Warp Distance: %.1f AU" % fit.maxWarpDistance))
maxWarpDistance = "Max Warp Distance: %.1f AU" % fit.maxWarpDistance
if fit.ship.getModifiedItemAttr("warpScrambleStatus"):
warpScrambleStatus = "Warp Core Strength: %.1f" % (fit.ship.getModifiedItemAttr("warpScrambleStatus") * -1)
else:
warpScrambleStatus = "Warp Core Strength: %.1f" % 0
label.SetToolTip(wx.ToolTip("%s\n%s" % (maxWarpDistance, warpScrambleStatus)))
elif labelName == "labelSensorStr":
if fit.jamChance > 0:
label.SetToolTip(wx.ToolTip("Type: %s\n%.1f%% Chance of Jam" % (fit.scanType, fit.jamChance)))
@@ -212,7 +217,12 @@ class TargetingMiscViewMinimal(StatsView):
self._cachedValues[counter] = newValues
elif labelName == "labelFullWarpSpeed":
if fit:
label.SetToolTip(wx.ToolTip("Max Warp Distance: %.1f AU" % fit.maxWarpDistance))
maxWarpDistance = "Max Warp Distance: %.1f AU" % fit.maxWarpDistance
if fit.ship.getModifiedItemAttr("warpScrambleStatus"):
warpScrambleStatus = "Warp Core Strength: %.1f" % (fit.ship.getModifiedItemAttr("warpScrambleStatus") * -1)
else:
warpScrambleStatus = "Warp Core Strength: %.1f" % 0
label.SetToolTip(wx.ToolTip("%s\n%s" % (maxWarpDistance, warpScrambleStatus)))
else:
label.SetToolTip(wx.ToolTip(""))
elif labelName == "labelSensorStr":

View File

@@ -405,10 +405,11 @@ if options.effects:
else:
effect_list = []
for effect_file in os.listdir(effects_path):
file_name, file_extension = effect_file.rsplit('.', 1)
# Ignore non-py files and exclude implementation-specific 'effects'
if file_extension == "py" and not file_name in ("__init__"):
effect_list.append(file_name)
if not effect_file.startswith('__'):
file_name, file_extension = effect_file.rsplit('.', 1)
# Ignore non-py files and exclude implementation-specific 'effects'
if file_extension == "py" and not file_name in ("__init__"):
effect_list.append(file_name)
# Stage 2

View File

@@ -113,13 +113,30 @@ def main(db, json_path):
def convertClones(data):
newData = []
# December, 2017 - CCP decided to use only one set of skill levels for alpha clones. However, this is still
# represented in the data as a skillset per race. To ensure that all skills are the same, we store them in a way
# that we can check to make sure all races have the same skills, as well as skill levels
check = {}
for ID in data:
for skill in data[ID]["skills"]:
newData.append({
"alphaCloneID": int(ID),
"alphaCloneName": data[ID]["internalDescription"],
"alphaCloneName": "Alpha Clone",
"typeID": skill["typeID"],
"level": skill["level"]})
if ID not in check:
check[ID] = {}
check[ID][int(skill["typeID"])] = int(skill["level"])
if not reduce(lambda a, b: a if a == b else False, [v for _, v in check.iteritems()]):
raise Exception("Alpha Clones not all equal")
newData = [x for x in newData if x['alphaCloneID'] == 1]
if len(newData) == 0:
raise Exception("Alpha Clone processing failed")
return newData

View File

@@ -223,8 +223,6 @@ class Market(object):
"Guristas Shuttle" : False,
"Mobile Decoy Unit" : False, # Seems to be left over test mod for deployables
"Tournament Micro Jump Unit" : False, # Normally seen only on tournament arenas
"Victor": False, # See GH Issue 1323
"Virtuoso": False, # See GH Issue 1323
}
# do not publish ships that we convert

View File

@@ -40,48 +40,30 @@ class EveCentral(object):
for typeID in types: # Add all typeID arguments
data.append(("typeid", typeID))
# Attempt to send request and process it
try:
network = Network.getInstance()
data = network.request(baseurl, network.PRICES, data)
xml = minidom.parse(data)
types = xml.getElementsByTagName("marketstat").item(0).getElementsByTagName("type")
# Cycle through all types we've got from request
for type_ in types:
# Get data out of each typeID details tree
typeID = int(type_.getAttribute("id"))
sell = type_.getElementsByTagName("sell").item(0)
# If price data wasn't there, set price to zero
try:
percprice = float(sell.getElementsByTagName("percentile").item(0).firstChild.data)
except (TypeError, ValueError):
pyfalog.warning("Failed to get price for: {0}", type_)
percprice = 0
network = Network.getInstance()
data = network.request(baseurl, network.PRICES, data)
xml = minidom.parse(data)
types = xml.getElementsByTagName("marketstat").item(0).getElementsByTagName("type")
# Cycle through all types we've got from request
for type_ in types:
# Get data out of each typeID details tree
typeID = int(type_.getAttribute("id"))
sell = type_.getElementsByTagName("sell").item(0)
# If price data wasn't there, set price to zero
try:
percprice = float(sell.getElementsByTagName("percentile").item(0).firstChild.data)
except (TypeError, ValueError):
pyfalog.warning("Failed to get price for: {0}", type_)
percprice = 0
# Fill price data
priceobj = priceMap[typeID]
priceobj.price = percprice
priceobj.time = time.time() + VALIDITY
priceobj.failed = None
# Fill price data
priceobj = priceMap[typeID]
priceobj.price = percprice
priceobj.time = time.time() + VALIDITY
priceobj.failed = None
# delete price from working dict
del priceMap[typeID]
# If getting or processing data returned any errors
except TimeoutError:
# Timeout error deserves special treatment
pyfalog.warning("Price fetch timout")
for typeID in priceMap.keys():
priceobj = priceMap[typeID]
priceobj.time = time.time() + TIMEOUT
priceobj.failed = True
del priceMap[typeID]
except:
# all other errors will pass and continue onward to the REREQUEST delay
pyfalog.warning("Caught exception in fetchPrices")
pass
pass
# delete price from working dict
del priceMap[typeID]
Price.register(EveCentral)

View File

@@ -38,48 +38,36 @@ class EveMarketData(object):
data.append(("system_id", system)) # Use Jita for market
data.append(("type_ids", ','.join(str(x) for x in types)))
# Attempt to send request and process it
try:
network = Network.getInstance()
data = network.request(baseurl, network.PRICES, data)
xml = minidom.parse(data)
print (xml.getElementsByTagName("eve").item(0))
types = xml.getElementsByTagName("eve").item(0).getElementsByTagName("price")
# Cycle through all types we've got from request
for type_ in types:
# Get data out of each typeID details tree
typeID = int(type_.getAttribute("id"))
price = 0
network = Network.getInstance()
data = network.request(baseurl, network.PRICES, data)
xml = minidom.parse(data)
types = xml.getElementsByTagName("eve").item(0).getElementsByTagName("price")
try:
price = float(type_.firstChild.data)
except (TypeError, ValueError):
pyfalog.warning("Failed to get price for: {0}", type_)
# Cycle through all types we've got from request
for type_ in types:
# Get data out of each typeID details tree
typeID = int(type_.getAttribute("id"))
# Fill price data
priceobj = priceMap[typeID]
try:
price = float(type_.firstChild.data)
except (TypeError, ValueError):
pyfalog.warning("Failed to get price for: {0}", type_)
# Fill price data
priceobj = priceMap[typeID]
# eve-marketdata returns 0 if price data doesn't even exist for the item. In this case, don't reset the
# cached price, and set the price timeout to TIMEOUT (every 15 minutes currently). Se GH issue #1334
if price != 0:
priceobj.price = price
priceobj.time = time.time() + VALIDITY
priceobj.failed = None
# delete price from working dict
del priceMap[typeID]
# If getting or processing data returned any errors
except TimeoutError:
# Timeout error deserves special treatment
pyfalog.warning("Price fetch timout")
for typeID in priceMap.keys():
priceobj = priceMap[typeID]
else:
priceobj.time = time.time() + TIMEOUT
priceobj.failed = True
del priceMap[typeID]
except:
# all other errors will pass and continue onward to the REREQUEST delay
pyfalog.warning("Caught exception in fetchPrices")
pass
pass
priceobj.failed = None
# delete price from working dict
del priceMap[typeID]
Price.register(EveMarketData)

View File

@@ -126,6 +126,7 @@ class Network(object):
raise AuthenticationError()
elif error.code >= 500:
raise ServerError()
raise Error(error)
except urllib.error.URLError as error:
pyfalog.warning("Timed out or other URL error:")
pyfalog.warning(error)

View File

@@ -105,11 +105,34 @@ class Price(object):
return
# attempt to find user's selected price source, otherwise get first one
sourceCls = cls.sources.get(sFit.serviceFittingOptions["priceSource"], cls.sources[list(cls.sources.keys())[0]])
sourceCls(toRequest, cls.systemsList[sFit.serviceFittingOptions["priceSystem"]], priceMap)
sourcesToTry = list(cls.sources.keys())
curr = sFit.serviceFittingOptions["priceSource"] if sFit.serviceFittingOptions["priceSource"] in sourcesToTry else sourcesToTry[0]
# if we get to this point, then we've got an error. Set to REREQUEST delay
for typeID in list(priceMap.keys()):
while len(sourcesToTry) > 0:
sourcesToTry.remove(curr)
try:
sourceCls = cls.sources.get(curr)
sourceCls(toRequest, cls.systemsList[sFit.serviceFittingOptions["priceSystem"]], priceMap)
break
# If getting or processing data returned any errors
except TimeoutError:
# Timeout error deserves special treatment
pyfalog.warning("Price fetch timout")
for typeID in priceMap.keys():
priceobj = priceMap[typeID]
priceobj.time = time.time() + TIMEOUT
priceobj.failed = True
del priceMap[typeID]
except Exception as ex:
# something happened, try another source
pyfalog.warn('Failed to fetch prices from price source {}: {}'.format(curr, ex, sourcesToTry[0]))
if len(sourcesToTry) > 0:
pyfalog.warn('Trying {}'.format(sourcesToTry[0]))
curr = sourcesToTry[0]
# if we get to this point, then we've got an error in all of our sources. Set to REREQUEST delay
for typeID in priceMap.keys():
priceobj = priceMap[typeID]
priceobj.time = time.time() + REREQUEST
priceobj.failed = True