Compare commits

...

104 Commits

Author SHA1 Message Date
DarkPhoenix
c1302ce7ee Fix version 2020-09-10 04:38:52 +03:00
DarkPhoenix
e4ea9c2ab9 Bump version 2020-09-10 04:38:20 +03:00
DarkPhoenix
9760d2c4a5 Merge branch 'master' into singularity 2020-09-10 04:26:42 +03:00
DarkPhoenix
4efa9a6961 Always return some value in mutators 2020-09-10 04:25:37 +03:00
DarkPhoenix
b27d4bcbbd Merge branch 'master' into singularity 2020-09-10 03:57:34 +03:00
DarkPhoenix
7bff295012 Add some jargon definitions for capital mods with numbers 2020-09-10 03:55:52 +03:00
DarkPhoenix
01249dfd9c Validate presence of mutaplasmid item 2020-09-10 03:28:36 +03:00
DarkPhoenix
0cc2668c1c Update warfare buffs for caustic cloud 2020-09-10 02:00:15 +03:00
DarkPhoenix
dfad734a0a Update staticdata to 1801413 2020-09-10 01:01:31 +03:00
DarkPhoenix
66c901a2b0 Bump version 2020-09-09 16:38:29 +03:00
DarkPhoenix
3673e7f39e Take measures against ESI spamming error 2020-09-09 16:35:57 +03:00
Anton Vorobyov
124b35d108 Merge pull request #2264 from jrdn/delete_all_esi_fits
Delete all of a character's fits via ESI
2020-09-09 15:12:01 +03:00
DarkPhoenix
5181e8e95a Reduce point radius for linux when scaled up 2020-09-09 15:00:35 +03:00
Anton Vorobyov
48cc4ce9d4 Merge pull request #2260 from YaarPodshipnik/fix-vector-picker-dpi-scaling
Fix HiDPI scaling issues in VectorPicker
2020-09-09 14:22:21 +03:00
Anton Vorobyov
07ff43b576 Merge branch 'master' into fix-vector-picker-dpi-scaling 2020-09-09 14:09:16 +03:00
DarkPhoenix
70969cc9fb Fix structure ewar skill not affecting ECM batteries 2020-09-09 13:56:06 +03:00
DarkPhoenix
d23bf2fa4c Add SBA tiericide conversions 2020-09-09 13:33:07 +03:00
DarkPhoenix
04c8659922 Update static data to 1800064 2020-09-09 13:21:16 +03:00
Jordan Greenberg
5e3b92699b Delete all of a character's fits via ESI 2020-09-05 15:32:52 -07:00
Yaar Podshipnik
1755ab4c3f Fix HiDPI scaling issues in VectorPicker
VectorPicker was DPI unware, so when asking GetClientSize() it would
get the actual size multiplied by the scaling factor of GetContentScaleFactor().
This made the widget seem to be cut off and display only the upper left
quarter of the circle.
Similarly, when choosing the font size for the percentages, it wouldn't
scale the maximum size, resulting in very large text.
2020-08-26 17:01:20 +01:00
DarkPhoenix
26ec741094 Bump version 2020-08-25 14:21:49 +03:00
DarkPhoenix
530f7510d5 Update staticdata to 1792574 2020-08-25 14:18:27 +03:00
DarkPhoenix
37ab704cd7 Merge branch 'singularity' into master 2020-08-25 14:17:21 +03:00
DarkPhoenix
683ad3802f Unmutate destination module when moving from cargo 2020-08-25 00:46:51 +03:00
DarkPhoenix
c882351886 Make propmod speed bonuses penalizable as postMul chain, fixes black hole + propmod speeds 2020-08-21 00:15:32 +03:00
DarkPhoenix
9d71215c52 Bump version 2020-08-20 16:31:00 +03:00
DarkPhoenix
d2a0605abe Update static data to 1790093 2020-08-20 16:27:05 +03:00
DarkPhoenix
bee6652cc6 Bump version 2020-08-18 00:51:34 +03:00
DarkPhoenix
047ef75960 Update effects 2020-08-18 00:51:11 +03:00
DarkPhoenix
32e57f8138 Update staticdata to 1788518 2020-08-18 00:40:07 +03:00
DarkPhoenix
e891804b64 Allow more than 1 system-wide effect 2020-08-17 13:36:52 +03:00
DarkPhoenix
7d42b89726 Merge branch 'master' into singularity 2020-08-17 11:43:50 +03:00
Anton Vorobyov
6561996327 Merge pull request #2256 from m-sasha/perf
Re-render tab when its disabled state changes.
2020-08-17 11:42:35 +03:00
Alexander Maryanovsky
0d2ad6eac2 No longer recomputing all tab sizes when a single tab changes its disabled state. 2020-08-16 18:00:01 +03:00
Alexander Maryanovsky
3b2bfd01c5 Re-render tab when it's disabled state changes. 2020-08-16 17:45:34 +03:00
DarkPhoenix
a317dab9a8 Bump version 2020-08-15 03:56:54 +03:00
DarkPhoenix
db6d8b93e9 Re-enable meta storm menu 2020-08-15 03:39:48 +03:00
DarkPhoenix
7d585c1a62 Merge branch 'master' into singularity
# Conflicts:
#	staticdata/fsd_lite/evetypes.json
#	staticdata/phobos/metadata.json
2020-08-15 03:34:45 +03:00
DarkPhoenix
c45e84470e Add storm effects 2020-08-15 03:27:47 +03:00
DarkPhoenix
ab3b40e136 Rerun effectUsedBy 2020-08-15 02:08:09 +03:00
DarkPhoenix
b566a8bfa6 Update static data to 1786419 2020-08-15 02:06:19 +03:00
DarkPhoenix
ccb395d592 Add standard outpost rig effect 2020-08-13 13:17:50 +03:00
DarkPhoenix
3d039724c9 Relax ship name format restrictions even further 2020-08-13 01:18:03 +03:00
DarkPhoenix
d0e7e7eed5 Merge branch 'master' of github.com:pyfa-org/Pyfa into master 2020-08-13 01:16:08 +03:00
DarkPhoenix
a387bc8d09 Fix import of ship/structure names containing single quotes 2020-08-13 01:15:41 +03:00
Anton Vorobyov
94344bd432 Merge pull request #2254 from Neugeniko/Issue/2253
Updated 'Retaliating Caldari Entities' target profile
2020-08-12 12:14:48 +03:00
DarkPhoenix
a976fb33f0 Fix defender velocity hardwiring 2020-08-12 00:11:52 +03:00
DarkPhoenix
f850fdf0d5 Bump version 2020-08-11 19:59:46 +03:00
DarkPhoenix
0fcbedba45 Disable metaliminal storm context menu 2020-08-11 19:58:44 +03:00
DarkPhoenix
5707bddacd Update staticdata to 1782806 2020-08-11 19:56:33 +03:00
Neugeniko
8ed9257dfa Updated 'Retaliating Caldari Entities' target profile
2020/08/12 Eve Online Patch increased Em Resists for some npc in the group of  'Retaliating Caldari Entities'
The groups target profile has been recalculated and edited.
2020-08-12 02:56:13 +10:00
DarkPhoenix
056ae590cf Merge branch 'master' into singularity 2020-08-10 17:39:37 +03:00
DarkPhoenix
7733fd38c2 Do not set read-only property 2020-08-10 17:39:08 +03:00
DarkPhoenix
fef78c971f Add effects used by metaliminal storms
Most of them are stubs, so just 2 so far
2020-08-05 22:57:45 +03:00
DarkPhoenix
e52ceacdb9 Add liminal storms to projection menu 2020-08-05 22:46:43 +03:00
DarkPhoenix
85b2d7af8d Add item conversions
Based on my own assumptions about them
2020-08-05 22:21:27 +03:00
DarkPhoenix
3e658a31bb Process renamed items 2020-08-05 21:54:56 +03:00
DarkPhoenix
0d2a4d4d44 Update metadata to 1780302 2020-08-05 21:40:59 +03:00
Anton Vorobyov
bc2cdcdea7 Merge pull request #2249 from m-sasha/undup-tab-selection
_TabsContainer.CheckTabSelected no longer posts PageChanged event twice
2020-07-31 11:59:38 +03:00
Anton Vorobyov
30ad554cc0 Merge pull request #2248 from m-sasha/no-half-second-sleep
Do not sleep for half a second in OpenFitsThread.run()
2020-07-31 11:59:06 +03:00
Anton Vorobyov
4a85fd5d1b Merge pull request #2247 from m-sasha/fast-tabs-resize
Ignore _TabRenderer.SetSize when new size is the same as old size
2020-07-31 11:58:35 +03:00
Alexander Maryanovsky
4d8dbe74bd _TabsContainer.CheckTabSelected no longer posts PageChanged event twice 2020-07-30 16:03:00 +03:00
Alexander Maryanovsky
016f2b44ff Do not sleep for half a second in OpenFitsThread.run() 2020-07-30 11:35:30 +03:00
Alexander Maryanovsky
676794baed Ignore _TabRenderer.SetSize when new size is the same as old size. 2020-07-30 11:31:00 +03:00
Anton Vorobyov
ca488089fd Merge pull request #2231 from fonsuiplaysvideogames/master
Updates to Abyss room-wide and localized weather effects
2020-07-30 08:04:42 +03:00
Anton Vorobyov
96f9b9a719 Merge branch 'master' into master 2020-07-30 08:04:09 +03:00
fonsuiplaysvideogames
508572e08b Update fit.py 2020-07-29 21:33:15 -04:00
DarkPhoenix
f91e0b2e23 Do not crash on ship w/o labels and w/o slots 2020-07-29 09:02:46 +03:00
DarkPhoenix
93ae9e0891 Bump version 2020-07-28 17:39:20 +03:00
DarkPhoenix
2ed5dbc3c7 Avoid using newer matplotlib 2020-07-28 17:12:15 +03:00
DarkPhoenix
bca8ba3114 Bump version 2020-07-28 15:58:15 +03:00
DarkPhoenix
174ac97682 Implement new CS effects 2020-07-28 15:57:55 +03:00
DarkPhoenix
2d9e873d42 Update staticdata to 1777281 2020-07-28 15:21:08 +03:00
DarkPhoenix
33377357f6 Change dampener definition to include named variations 2020-07-26 10:36:55 +03:00
DarkPhoenix
3ee0ee7e40 Fix drone sorting in projected view 2020-07-19 23:31:00 +03:00
fonsuiplaysvideogames
2f02747b29 Update fit.py 2020-07-16 16:24:08 -04:00
fonsuiplaysvideogames
78b176a135 Update fit.py 2020-07-16 16:20:24 -04:00
DarkPhoenix
52063beea9 BCS affect defender missiles now 2020-07-16 00:40:04 +03:00
DarkPhoenix
03a55d94e9 Bump version 2020-07-14 20:29:47 +03:00
DarkPhoenix
db256f57d1 Adjust ANP jargon entries 2020-07-14 20:29:27 +03:00
DarkPhoenix
8de6d78be0 Update effect docstrings 2020-07-14 20:25:45 +03:00
DarkPhoenix
902a00d37d Add conversions 2020-07-14 20:24:42 +03:00
DarkPhoenix
523cb1467e Merge branch 'issue_2205' 2020-07-14 20:21:23 +03:00
DarkPhoenix
f75de70d79 Update staticdata to 1769230 2020-07-14 20:00:23 +03:00
DarkPhoenix
4b635f4d21 Remove www to make dropdown shorter on gtk 2020-07-14 17:31:19 +03:00
DarkPhoenix
63632e09b3 Group market sources up to avoid cross-server price data confusion 2020-07-14 17:25:30 +03:00
Ryan Holmes
df78eb5781 Merge pull request #2214 from copyliu/cevemarket
add market source ceve-market
2020-06-29 20:07:44 -04:00
Copy Liu
c1a5828d6b add market source ceve-market 2020-06-29 20:58:46 +08:00
blitzmann
5377210b89 Merge branch 'master' of https://github.com/pyfa-org/Pyfa 2020-06-26 23:30:51 -04:00
blitzmann
1936255f2c Merge branch 'issue2209' 2020-06-26 23:30:40 -04:00
blitzmann
b3e5763cfc Fix for #2209 - Flip the None check to happen first instead of second, otherwise if Notes is None then the first check will fail due to trying to len(None) 2020-06-26 23:30:15 -04:00
DarkPhoenix
7442f315c9 Do not activate scanners by default 2020-06-26 21:30:43 +03:00
blitzmann
433c9555bf Removed the util function - this would actually break older migrations if we added things that didn't exist in future iterations. Each migration should be self-contained 2020-06-24 15:18:43 -04:00
blitzmann
d1345fc71e Fixes #2205 - runs conversions on modules.baseItemID since the creation of baseItemID. Also, centralized the function to convert modules so that in case we ever add other things that need to be converted, they are all in one spot. 2020-06-24 15:09:51 -04:00
DarkPhoenix
31cae0e54b Bump version 2020-06-18 17:28:02 +03:00
DarkPhoenix
b2cc3ae600 Update static data to 1751741 2020-06-18 13:52:46 +03:00
DarkPhoenix
62d1d6a06d Avoid crash when nothing is selected 2020-06-18 06:04:23 +03:00
DarkPhoenix
83fa567321 Pass primitives around instead of SQL Alchemy objects 2020-06-18 05:33:12 +03:00
DarkPhoenix
9b315b5870 Fix a few mistypes 2020-06-17 21:53:24 +03:00
DarkPhoenix
3094fd32fc Add destructible beacons to projected effects 2020-06-17 17:07:34 +03:00
DarkPhoenix
c3f1824a84 Rename charge export button 2020-06-16 21:06:42 +03:00
DarkPhoenix
b558ae3810 Add an option not to export charges to ESI 2020-06-15 23:38:07 +03:00
DarkPhoenix
c38f05902a Add alternate redo shortcut 2020-06-15 17:20:20 +03:00
DarkPhoenix
181e1e1e30 Make scanners active and expose data to misc column 2020-06-15 16:37:52 +03:00
54 changed files with 32849 additions and 6098 deletions

View File

@@ -33,7 +33,7 @@ DB_PATH = os.path.join(ROOT_DIR, 'eve.db')
JSON_DIR = os.path.join(ROOT_DIR, 'staticdata')
if ROOT_DIR not in sys.path:
sys.path.insert(0, ROOT_DIR)
GAMEDATA_SCHEMA_VERSION = 3
GAMEDATA_SCHEMA_VERSION = 4
def db_needs_update():
@@ -122,7 +122,8 @@ def update_db():
if (
# Apparently people really want Civilian modules available
(row['typeName'].startswith('Civilian') and "Shuttle" not in row['typeName']) or
row['typeName'] == 'Capsule'
row['typeName'] == 'Capsule' or
row['groupID'] == 4033 # destructible effect beacons
):
row['published'] = True
# Nearly useless and clutter search results too much
@@ -142,8 +143,7 @@ def update_db():
1882,
1975,
1971,
# the "container" for the abyssal environments
1983)
1983) # the "container" for the abyssal environments
):
newData.append(row)

View File

@@ -0,0 +1,18 @@
"""
Migration 40
Imports all item conversions since Migration 28 and runs them against module.baseItemID. This column seems to have been
forgotten about since it's been added.
"""
from .upgrade36 import CONVERSIONS as u36
from .upgrade37 import CONVERSIONS as u37
from .upgrade38 import CONVERSIONS as u38
from .upgrade39 import CONVERSIONS as u39
def upgrade(saveddata_engine):
for conversions in [u36, u37, u38, u39]:
for replacement_item, list in conversions.items():
for retired_item in list:
saveddata_engine.execute('UPDATE "modules" SET "baseItemID" = ? WHERE "baseItemID" = ?',
(replacement_item, retired_item))

View File

@@ -0,0 +1,50 @@
"""
Migration 41
- Resistance plating tiericide
"""
CONVERSIONS = {
16345: ( # Upgraded Layered Coating I
16347, # Limited Layered Plating I
16349, # 'Scarab' Layered Plating I
16351, # 'Grail' Layered Plating I
),
16305: ( # Upgraded Multispectrum Coating I
16307, # Limited Adaptive Nano Plating I
16309, # 'Collateral' Adaptive Nano Plating I
16311, # 'Refuge' Adaptive Nano Plating I
),
16329: ( # Upgraded EM Coating I
16331, # Limited EM Plating I
16333, # 'Contour' EM Plating I
16335, # 'Spiegel' EM Plating I
),
16321: ( # Upgraded Explosive Coating I
16323, # Limited Explosive Plating I
16325, # Experimental Explosive Plating I
16319, # 'Aegis' Explosive Plating I
),
16313: ( # Upgraded Kinetic Coating I
16315, # Limited Kinetic Plating I
16317, # Experimental Kinetic Plating I
16327, # 'Element' Kinetic Plating I
),
16337: ( # Upgraded Thermal Coating I
16339, # Limited Thermal Plating I
16341, # Experimental Thermal Plating I
16343, # Prototype Thermal Plating I
)
}
def upgrade(saveddata_engine):
# Convert modules
for replacement_item, list in CONVERSIONS.items():
for retired_item in list:
saveddata_engine.execute('UPDATE "modules" SET "itemID" = ? WHERE "itemID" = ?',
(replacement_item, retired_item))
saveddata_engine.execute('UPDATE "modules" SET "baseItemID" = ? WHERE "baseItemID" = ?',
(replacement_item, retired_item))
saveddata_engine.execute('UPDATE "cargo" SET "itemID" = ? WHERE "itemID" = ?',
(replacement_item, retired_item))

View File

@@ -0,0 +1,50 @@
"""
Migration 42
- Resistance membrane tiericide
"""
CONVERSIONS = {
16391: ( # Compact Multispectrum Energized Membrane
16389, # Experimental Energized Adaptive Nano Membrane I
16387, # Limited Energized Adaptive Nano Membrane I
16385, # Upgraded Energized Adaptive Nano Membrane I
),
16423: ( # Compact Layered Energized Membrane
16421, # Experimental Energized Armor Layering Membrane I
16419, # Limited Energized Armor Layering Membrane I
16417, # Upgraded Energized Armor Layering Membrane I
),
16415: ( # Compact EM Energized Membrane
16413, # Experimental Energized EM Membrane I
16411, # Limited Energized EM Membrane I
16409, # Upgraded Energized EM Membrane I
),
16407: ( # Compact Explosive Energized Membrane
16405, # Experimental Energized Explosive Membrane I
16403, # Limited Energized Explosive Membrane I
16401, # Upgraded Energized Explosive Membrane I
),
16399: ( # Compact Kinetic Energized Membrane
16397, # Experimental Energized Kinetic Membrane I
16395, # Limited Energized Kinetic Membrane I
16393, # Upgraded Energized Kinetic Membrane I
),
16431: ( # Compact Thermal Energized Membrane
16429, # Experimental Energized Thermal Membrane I
16427, # Limited Energized Thermal Membrane I
16425, # Upgraded Energized Thermal Membrane I
)
}
def upgrade(saveddata_engine):
# Convert modules
for replacement_item, list in CONVERSIONS.items():
for retired_item in list:
saveddata_engine.execute('UPDATE "modules" SET "itemID" = ? WHERE "itemID" = ?',
(replacement_item, retired_item))
saveddata_engine.execute('UPDATE "modules" SET "baseItemID" = ? WHERE "baseItemID" = ?',
(replacement_item, retired_item))
saveddata_engine.execute('UPDATE "cargo" SET "itemID" = ? WHERE "itemID" = ?',
(replacement_item, retired_item))

View File

@@ -0,0 +1,26 @@
"""
Migration 43
- Shield booster amplifier tiericide
"""
CONVERSIONS = {
16533: ( # Stalwart Restrained Shield Boost Amplifier
16531, # 5a Prototype Shield Support I
),
16535: ( # Copasetic Compact Shield Boost Amplifier
16529, # Ionic Field Accelerator I
),
}
def upgrade(saveddata_engine):
# Convert modules
for replacement_item, list in CONVERSIONS.items():
for retired_item in list:
saveddata_engine.execute('UPDATE "modules" SET "itemID" = ? WHERE "itemID" = ?',
(replacement_item, retired_item))
saveddata_engine.execute('UPDATE "modules" SET "baseItemID" = ? WHERE "baseItemID" = ?',
(replacement_item, retired_item))
saveddata_engine.execute('UPDATE "cargo" SET "itemID" = ? WHERE "itemID" = ?',
(replacement_item, retired_item))

File diff suppressed because it is too large Load Diff

View File

@@ -21,7 +21,7 @@ import datetime
import time
from copy import deepcopy
from itertools import chain
from math import log, sqrt
from math import floor, log, sqrt
from logbook import Logger
from sqlalchemy.orm import reconstructor, validates
@@ -39,6 +39,7 @@ from eos.saveddata.damagePattern import DamagePattern
from eos.saveddata.module import Module
from eos.saveddata.ship import Ship
from eos.saveddata.targetProfile import TargetProfile
from eos.utils.float import floatUnerr
from eos.utils.stats import DmgTypes, RRTypes
@@ -378,8 +379,9 @@ class Fit:
@property
def maxTargets(self):
return min(self.extraAttributes["maxTargetsLockedFromSkills"],
self.ship.getModifiedItemAttr("maxLockedTargets"))
maxTargets = min(self.extraAttributes["maxTargetsLockedFromSkills"],
self.ship.getModifiedItemAttr("maxLockedTargets"))
return floor(floatUnerr(maxTargets))
@property
def maxTargetRange(self):
@@ -750,14 +752,14 @@ class Fit:
if warfareBuffID == 79: # AOE_Beacon_bioluminescence_cloud
self.ship.boostItemAttr("signatureRadius", value, stackingPenalties=True)
self.drones.filteredItemBoost(lambda mod: mod.item.requiresSkill("Drones"),
"signatureRadius", value, stackingPenalties=True)
if warfareBuffID == 80: # AOE_Beacon_caustic_cloud_local_repair
self.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Repair Systems"),
"armorDamageAmount", value, stackingPenalties=True)
if warfareBuffID == 80: # AOE_Beacon_caustic_cloud_inertia
self.ship.boostItemAttr("agility", value, stackingPenalties=True)
if warfareBuffID == 81: # AOE_Beacon_caustic_cloud_remote_repair
self.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Remote Armor Repair Systems"),
"armorDamageAmount", value, stackingPenalties=True)
if warfareBuffID == 81: # AOE_Beacon_caustic_cloud_velocity
self.ship.boostItemAttr("maxVelocity", value, stackingPenalties=True)
if warfareBuffID == 88: # AOE_Beacon_filament_cloud_shield_booster_shield_bonus
self.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Shield Operation"),
@@ -772,7 +774,11 @@ class Fit:
if warfareBuffID == 90: # Weather_electric_storm_EM_resistance_penalty
for tankType in ("shield", "armor"):
self.ship.boostItemAttr("{}EmDamageResonance".format(tankType), value)
self.drones.filteredItemBoost(lambda mod: mod.item.requiresSkill("Drones"),
"{}EmDamageResonance".format(tankType), value)
self.ship.boostItemAttr("emDamageResonance", value) # for hull
self.drones.filteredItemBoost(lambda mod: mod.item.requiresSkill("Drones"),
"emDamageResonance", value) #for hull
if warfareBuffID == 92: # Weather_electric_storm_capacitor_recharge_bonus
self.ship.boostItemAttr("rechargeRate", value, stackingPenalties=True)
@@ -780,32 +786,54 @@ class Fit:
if warfareBuffID == 93: # Weather_xenon_gas_explosive_resistance_penalty
for tankType in ("shield", "armor"):
self.ship.boostItemAttr("{}ExplosiveDamageResonance".format(tankType), value)
self.drones.filteredItemBoost(lambda mod: mod.item.requiresSkill("Drones"),
"{}ExplosiveDamageResonance".format(tankType), value)
self.ship.boostItemAttr("explosiveDamageResonance", value) # for hull
self.drones.filteredItemBoost(lambda mod: mod.item.requiresSkill("Drones"),
"explosiveDamageResonance", value) # for hull
if warfareBuffID == 94: # Weather_xenon_gas_shield_hp_bonus
self.ship.boostItemAttr("shieldCapacity", value) # for hull
self.ship.boostItemAttr("shieldCapacity", value)
self.drones.filteredItemBoost(lambda mod: mod.item.requiresSkill("Drones"),
"shieldCapacity", value)
if warfareBuffID == 95: # Weather_infernal_thermal_resistance_penalty
for tankType in ("shield", "armor"):
self.ship.boostItemAttr("{}ThermalDamageResonance".format(tankType), value)
self.drones.filteredItemBoost(lambda mod: mod.item.requiresSkill("Drones"),
"{}ThermalDamageResonance".format(tankType), value)
self.ship.boostItemAttr("thermalDamageResonance", value) # for hull
self.drones.filteredItemBoost(lambda mod: mod.item.requiresSkill("Drones"),
"thermalDamageResonance", value) # for hull
if warfareBuffID == 96: # Weather_infernal_armor_hp_bonus
self.ship.boostItemAttr("armorHP", value) # for hull
self.ship.boostItemAttr("armorHP", value)
self.drones.filteredItemBoost(lambda mod: mod.item.requiresSkill("Drones"),
"armorHP", value)
if warfareBuffID == 97: # Weather_darkness_turret_range_penalty
self.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Gunnery"),
"maxRange", value, stackingPenalties=True)
self.drones.filteredItemBoost(lambda mod: mod.item.requiresSkill("Drones"),
"maxRange", value, stackingPenalties=True)
self.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Gunnery"),
"falloff", value, stackingPenalties=True)
self.drones.filteredItemBoost(lambda mod: mod.item.requiresSkill("Drones"),
"falloff", value, stackingPenalties=True)
if warfareBuffID == 98: # Weather_darkness_velocity_bonus
self.ship.boostItemAttr("maxVelocity", value)
self.drones.filteredItemBoost(lambda mod: mod.item.requiresSkill("Drones"),
"maxVelocity", value)
if warfareBuffID == 99: # Weather_caustic_toxin_kinetic_resistance_penalty
for tankType in ("shield", "armor"):
self.ship.boostItemAttr("{}KineticDamageResonance".format(tankType), value)
self.drones.filteredItemBoost(lambda mod: mod.item.requiresSkill("Drones"),
"{}KineticDamageResonance".format(tankType), value)
self.ship.boostItemAttr("kineticDamageResonance", value) # for hull
self.drones.filteredItemBoost(lambda mod: mod.item.requiresSkill("Drones"),
"kineticDamageResonance", value) # for hull
if warfareBuffID == 100: # Weather_caustic_toxin_scan_resolution_bonus
self.ship.boostItemAttr("scanResolution", value, stackingPenalties=True)

View File

@@ -64,7 +64,9 @@ ProjectedSystem = {
class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut):
"""An instance of this class represents a module together with its charge and modified attributes"""
MINING_ATTRIBUTES = ("miningAmount",)
SYSTEM_GROUPS = ("Effect Beacon", "MassiveEnvironments", "Abyssal Hazards", "Non-Interactable Object")
SYSTEM_GROUPS = (
"Effect Beacon", "MassiveEnvironments", "Abyssal Hazards",
"Non-Interactable Object", "Destructible Effect Beacon")
def __init__(self, item, baseItem=None, mutaplasmid=None):
"""Initialize a module from the program"""
@@ -196,11 +198,18 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut):
# todo: validate baseItem as well if it's set.
if self.isEmpty:
return False
return (
self.__item is None or (
self.__item.category.name not in ("Module", "Subsystem", "Structure Module") and
self.__item.group.name not in self.SYSTEM_GROUPS) or
(self.item.isAbyssal and not self.isMutated))
if self.__item is None:
return True
if (
self.__item.category.name not in ("Module", "Subsystem", "Structure Module")
and self.__item.group.name not in self.SYSTEM_GROUPS
):
return True
if self.item.isAbyssal and not self.isMutated:
return True
if self.isMutated and not self.__mutaplasmid:
return True
return False
@property
def isMutated(self):
@@ -265,7 +274,9 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut):
@property
def isExclusiveSystemEffect(self):
return self.item.group.name in ("Effect Beacon", "Non-Interactable Object", "MassiveEnvironments")
# See issue #2258
# return self.item.group.name in ("Effect Beacon", "Non-Interactable Object", "MassiveEnvironments")
return False
@property
def isCapitalSize(self):
@@ -726,6 +737,9 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut):
return False
elif state == FittingModuleState.OVERHEATED and not self.item.isType("overheat"):
return False
# Some destructible effect beacons contain active effects, hardcap those at online state
elif state > FittingModuleState.ONLINE and self.slot == FittingSlot.SYSTEM:
return False
else:
return True
@@ -1051,7 +1065,10 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut):
elif click == "ctrl":
state = FittingModuleState.OFFLINE
else:
state = transitionMap[currState]
try:
state = transitionMap[currState]
except KeyError:
state = min(transitionMap)
# If passive module tries to transition into online and fails,
# put it to passive instead
if not mod.isValidState(state) and currState == FittingModuleState.ONLINE:

View File

@@ -120,15 +120,24 @@ class Mutator(EqBase):
@property
def baseValue(self):
return self.baseAttribute.value
try:
return self.baseAttribute.value
except AttributeError:
return 0
@property
def minValue(self):
return self.minMod * self.baseAttribute.value
try:
return self.minMod * self.baseAttribute.value
except AttributeError:
return 0
@property
def maxValue(self):
return self.maxMod * self.baseAttribute.value
try:
return self.maxMod * self.baseAttribute.value
except AttributeError:
return 0
@property
def attribute(self):

View File

@@ -86,7 +86,7 @@ BUILTINS = OrderedDict([
# Source: ticket #2067
(-52, ('[NPC][Invasion]Invading Precursor Entities', 0.422, 0.367, 0.453, 0.411)),
(-53, ('[NPC][Invasion]Retaliating Amarr Entities', 0.360, 0.310, 0.441, 0.602)),
(-54, ('[NPC][Invasion]Retaliating Caldari Entities', 0.287, 0.610, 0.487, 0.401)),
(-54, ('[NPC][Invasion]Retaliating Caldari Entities', 0.303, 0.610, 0.487, 0.401)),
(-55, ('[NPC][Invasion]Retaliating Gallente Entities', 0.383, 0.414, 0.578, 0.513)),
(-56, ('[NPC][Invasion]Retaliating Minmatar Entities', 0.620, 0.422, 0.355, 0.399)),
(-57, ('[NPC][Abyssal][Dark Matter All Tiers]Drones', 0.439, 0.522, 0.529, 0.435)),

View File

@@ -36,9 +36,9 @@ class VectorPicker(wx.Window):
self._labelpos = int(kwargs.pop('labelpos', 0))
self._offset = float(kwargs.pop('offset', 0))
self._size = max(0, float(kwargs.pop('size', 50)))
self._fontsize = max(1, float(kwargs.pop('fontsize', 8)))
self._directionOnly = kwargs.pop('directionOnly', False)
super().__init__(*args, **kwargs)
self._fontsize = max(1, float(kwargs.pop('fontsize', 8 / self.GetContentScaleFactor())))
self._font = wx.Font(self._fontsize, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, False)
self._angle = 0
self.__length = 1
@@ -107,8 +107,11 @@ class VectorPicker(wx.Window):
dc = wx.BufferedPaintDC(self)
self.Draw(dc)
def GetScaledClientSize(self):
return tuple([dim / self.GetContentScaleFactor() for dim in self.GetClientSize()])
def Draw(self, dc):
width, height = self.GetClientSize()
width, height = self.GetScaledClientSize()
if not width or not height:
return
dc.SetBackground(wx.Brush(self.GetBackgroundColour(), wx.BRUSHSTYLE_SOLID))
@@ -122,9 +125,11 @@ class VectorPicker(wx.Window):
a = math.radians(self._angle + self._offset)
x = math.cos(a) * radius
y = math.sin(a) * radius
# See PR #2260 on why this is needed
pointRadius = 2 / self.GetContentScaleFactor() if 'wxGTK' in wx.PlatformInfo else 2
dc.DrawLine(radius + 2, radius + 2, radius + 2 + x * self._length, radius + 2 - y * self._length)
dc.SetBrush(wx.BLACK_BRUSH)
dc.DrawCircle(radius + 2 + x * self._length, radius + 2 - y * self._length, 2)
dc.DrawCircle(radius + 2 + x * self._length, radius + 2 - y * self._length, pointRadius)
if self._label:
labelText = self._label

View File

@@ -90,8 +90,6 @@ class ProjectedView(d.Display):
self.Bind(wx.EVT_LEFT_DCLICK, self.onLeftDoubleClick)
self.Bind(wx.EVT_KEY_UP, self.kbEvent)
self.droneView = gui.builtinAdditionPanes.droneView.DroneView
self.Bind(wx.EVT_CONTEXT_MENU, self.spawnMenu)
self.SetDropTarget(ProjectedViewDrop(self.handleListDrag))
@@ -162,7 +160,7 @@ class ProjectedView(d.Display):
if item.marketGroup is None:
item = item.metaGroup.parent
return (self.droneView.DRONE_ORDER.index(item.marketGroup.name),
return (gui.builtinAdditionPanes.droneView.DRONE_ORDER.index(item.marketGroup.name),
drone.item.name)
@staticmethod

View File

@@ -1,4 +1,5 @@
import re
from collections import OrderedDict
from itertools import chain
# noinspection PyPackageRequirements
@@ -10,6 +11,28 @@ from gui.contextMenu import ContextMenuUnconditional
from service.market import Market
class Group:
def __init__(self):
self.groups = OrderedDict()
self.items = []
def sort(self):
self.groups = OrderedDict((k, self.groups[k]) for k in sorted(self.groups))
for group in self.groups.values():
group.sort()
self.items.sort(key=lambda e: e.shortName)
class Entry:
def __init__(self, itemID, name, shortName):
self.itemID = itemID
self.name = name
self.shortName = shortName
class AddEnvironmentEffect(ContextMenuUnconditional):
# CCP doesn't currently provide a mapping between the general Environment, and the specific environment effect
@@ -32,107 +55,78 @@ class AddEnvironmentEffect(ContextMenuUnconditional):
def getText(self, callingWindow, itmContext):
return "Add Environmental Effect"
def _addGroup(self, parentMenu, name):
id = ContextMenuUnconditional.nextID()
menuItem = wx.MenuItem(parentMenu, id, name)
parentMenu.Bind(wx.EVT_MENU, self.handleSelection, menuItem)
return menuItem
def _addEffect(self, parentMenu, typeID, name):
id = ContextMenuUnconditional.nextID()
self.idmap[id] = typeID
menuItem = wx.MenuItem(parentMenu, id, name)
parentMenu.Bind(wx.EVT_MENU, self.handleSelection, menuItem)
return menuItem
def getSubMenu(self, callingWindow, context, rootMenu, i, pitem):
msw = True if "wxMSW" in wx.PlatformInfo else False
# Wormholes
self.idmap = {}
sub = wx.Menu()
data = self.getData()
msw = "wxMSW" in wx.PlatformInfo
wormhole_item = wx.MenuItem(sub, wx.ID_ANY, "Wormhole")
wormhole_menu = wx.Menu()
wormhole_item.SetSubMenu(wormhole_menu)
sub.Append(wormhole_item)
grouped_data, flat_data = self.getEffectBeacons()
self.buildMenu(grouped_data, flat_data, wormhole_menu, rootMenu, msw)
# Incursions
grouped_data, flat_data = self.getEffectBeacons(incursions=True)
self.buildMenu(grouped_data, flat_data, sub, rootMenu, msw)
# Abyssal Weather
abyssal_item = wx.MenuItem(sub, wx.ID_ANY, "Abyssal Weather")
abyssal_menu = wx.Menu()
abyssal_item.SetSubMenu(abyssal_menu)
sub.Append(abyssal_item)
grouped_data, flat_data = self.getAbyssalWeather()
self.buildMenu(grouped_data, flat_data, abyssal_menu, rootMenu, msw)
# Localized Weather
local_item = wx.MenuItem(sub, wx.ID_ANY, "Localized")
local_menu = wx.Menu()
local_item.SetSubMenu(local_menu)
sub.Append(local_item)
grouped_data, flat_data = self.getLocalizedEnvironments()
self.buildMenu(grouped_data, flat_data, local_menu, rootMenu, msw)
def makeMenu(data, parentMenu):
menu = wx.Menu()
for group_name in data.groups:
menuItem = self._addGroup(rootMenu if msw else parentMenu, group_name)
subMenu = makeMenu(data.groups[group_name], menu)
menuItem.SetSubMenu(subMenu)
menu.Append(menuItem)
for entry in data.items:
menuItem = self._addEffect(rootMenu if msw else parentMenu, entry.itemID, entry.shortName)
menu.Append(menuItem)
menu.Bind(wx.EVT_MENU, self.handleSelection)
return menu
sub = makeMenu(data, rootMenu)
return sub
def handleSelection(self, event):
# Skip events ids that aren't mapped
swObj, swName = self.idmap.get(event.Id, (False, False))
if not swObj and not swName:
swObj = self.idmap.get(event.Id, False)
if not swObj:
event.Skip()
return
fitID = self.mainFrame.getActiveFit()
self.mainFrame.command.Submit(cmd.GuiAddProjectedModuleCommand(fitID, swObj.ID))
self.mainFrame.command.Submit(cmd.GuiAddProjectedModuleCommand(fitID, swObj))
def buildMenu(self, grouped_data, flat_data, local_menu, rootMenu, msw):
def getData(self):
data = Group()
data.groups['Metaliminal Storm'] = self.getEffectBeacons(
'Electrical', 'Exotic', 'Gamma', 'Plasma',
extra_garbage=('Metaliminal', 'Storm', 'Matter', 'Ray', 'Firestorm'))
data.groups['Wormhole'] = self.getEffectBeacons(
'Black Hole', 'Cataclysmic Variable', 'Magnetar',
'Pulsar', 'Red Giant', 'Wolf Rayet')
data.groups['Abyssal Weather'] = self.getAbyssalWeather()
data.groups['Sansha Incursion'] = self.getEffectBeacons('Sansha Incursion')
data.groups['Triglavian Invasion'] = self.getEffectBeacons('Triglavian Invasion')
data.groups['Triglavian Invasion'].groups['Destructible Beacons'] = self.getDestructibleBeacons()
return data
def processFlat(data, root, sub):
for swData in sorted(data, key=lambda tpl: tpl[2]):
wxid = ContextMenuUnconditional.nextID()
swObj, swName, swClass = swData
self.idmap[wxid] = (swObj, swName)
subItem = wx.MenuItem(sub, wxid, swClass)
if msw:
root.Bind(wx.EVT_MENU, self.handleSelection, subItem)
else:
sub.Bind(wx.EVT_MENU, self.handleSelection, subItem)
sub.Append(subItem)
for swType in sorted(grouped_data):
subItem = wx.MenuItem(local_menu, wx.ID_ANY, swType)
grandSub = wx.Menu()
subItem.SetSubMenu(grandSub)
local_menu.Append(subItem)
processFlat(grouped_data[swType], rootMenu, grandSub)
processFlat(flat_data, rootMenu, local_menu)
def getEffectBeacons(self, incursions=False):
def getEffectBeacons(self, *groups, extra_garbage=()):
"""
Get dictionary with wormhole system-wide effects
Get dictionary with system-wide effects
"""
compacted = len(groups) <= 1
sMkt = Market.getInstance()
# todo: rework this
# Container for system-wide effects
grouped = {}
# Expressions for matching when detecting effects we're looking for
if incursions:
validgroups = ("Sansha Incursion",
"Triglavian Invasion")
else:
validgroups = ("Black Hole",
"Cataclysmic Variable",
"Magnetar",
"Pulsar",
"Red Giant",
"Wolf Rayet")
data = Group()
# Stuff we don't want to see in names
garbages = ("System Effects", "Effects")
garbages = ["System Effects", "Effects"]
garbages.extend(extra_garbage)
# Get group with all the system-wide beacons
grp = sMkt.getGroup("Effect Beacon")
@@ -140,7 +134,7 @@ class AddEnvironmentEffect(ContextMenuUnconditional):
# Cycle through them
for beacon in sMkt.getItemsByGroup(grp):
# Check if it belongs to any valid group
for group in validgroups:
for group in groups:
# Check beginning of the name only
if re.search(group, beacon.name):
# Get full beacon name
@@ -159,64 +153,65 @@ class AddEnvironmentEffect(ContextMenuUnconditional):
groupname = re.sub(garbage, "", groupname)
groupname = re.sub(" {2,}", " ", groupname).strip()
# Add stuff to dictionary
if groupname not in grouped:
grouped[groupname] = set()
grouped[groupname].add((beacon, beaconname, shortname))
if compacted:
container = data.items
else:
container = data.groups.setdefault(groupname, Group()).items
container.append(Entry(beacon.ID, beaconname, shortname))
# Break loop on 1st result
break
return grouped, ()
data.sort()
return data
def getAbyssalWeather(self):
sMkt = Market.getInstance()
data = Group()
environments = {x.ID: x for x in sMkt.getGroup("Abyssal Environment").items}
items = chain(sMkt.getGroup("MassiveEnvironments").items, sMkt.getGroup("Non-Interactable Object").items)
grouped = {}
flat = set()
items = chain(
sMkt.getGroup("MassiveEnvironments").items,
sMkt.getGroup("Non-Interactable Object").items)
for beacon in items:
if not beacon.isType('projected'):
continue
type = self.__class__.abyssal_mapping.get(beacon.name[0:-2], None)
type = environments.get(type, None)
if type is None:
continue
if type.name not in grouped:
grouped[type.name] = set()
subdata = data.groups.setdefault(type.name, Group())
display_name = "{} {}".format(type.name, beacon.name[-1:])
grouped[type.name].add((beacon, display_name, display_name))
subdata.items.append(Entry(beacon.ID, display_name, display_name))
data.sort()
# Localized abyssal hazards
items = sMkt.getGroup("Abyssal Hazards").items
if items:
subdata = data.groups.setdefault('Localized', Group())
for beacon in sMkt.getGroup("Abyssal Hazards").items:
if not beacon.isType('projected'):
continue
# Localized effects, currently, have a name like "(size) (type) Cloud"
# Until this inevitably changes, do a simple split
name_parts = beacon.name.split(" ")
key = name_parts[1].strip()
subsubdata = subdata.groups.setdefault(key, Group())
subsubdata.items.append(Entry(beacon.ID, beacon.name, beacon.name))
subdata.sort()
# PVP weather
flat.add((sMkt.getItem(49766), 'PvP Weather', 'PvP Weather'))
data.items.append(Entry(49766, 'PvP Weather', 'PvP Weather'))
return grouped, flat
return data
def getLocalizedEnvironments(self):
def getDestructibleBeacons(self):
data = Group()
sMkt = Market.getInstance()
grp = sMkt.getGroup("Abyssal Hazards")
grouped = dict()
for beacon in grp.items:
if not beacon.isType('projected'):
for item in sMkt.getItemsByGroup(sMkt.getGroup('Destructible Effect Beacon')):
if not item.isType('projected'):
continue
# Localized effects, currently, have a name like "(size) (type) Cloud"
# Until this inevitably changes, do a simple split
name_parts = beacon.name.split(" ")
key = name_parts[1].strip()
if key not in grouped:
grouped[key] = set()
grouped[key].add((beacon, beacon.name, beacon.name))
return grouped, ()
data.items.append(Entry(item.ID, item.name, item.name))
data.sort()
return data
AddEnvironmentEffect.register()

View File

@@ -691,6 +691,13 @@ class Miscellanea(ViewColumn):
formatAmount(itemArmorResistanceShiftHardenerExp, 3, 0, 3),
)
return text, tooltip
elif itemGroup in ("Cargo Scanner", "Ship Scanner", "Survey Scanner"):
duration = stuff.getModifiedItemAttr("duration")
if not duration:
return "", None
text = "{}s".format(formatAmount(duration / 1000, 3, 0, 0))
tooltip = "Scan duration"
return text, tooltip
elif stuff.charge is not None:
chargeGroup = stuff.charge.group.name
if chargeGroup.endswith("Rocket") or chargeGroup.endswith("Missile") or chargeGroup.endswith("Torpedo"):

View File

@@ -562,7 +562,10 @@ class FittingView(d.Display):
if sFit.serviceFittingOptions["rackSlots"]:
# flag to know when to add blanks, based on previous slot
slotDivider = None if sFit.serviceFittingOptions["rackLabels"] else self.mods[0].slot
if sFit.serviceFittingOptions["rackLabels"] or len(self.mods) == 0:
slotDivider = None
else:
slotDivider = self.mods[0].slot
# first loop finds where slot dividers must go before modifying self.mods
for i, mod in enumerate(self.mods):

View File

@@ -312,6 +312,7 @@ class CharacterEditor(AuxiliaryFrame):
class SkillTreeView(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize,
style=wx.TAB_TRAVERSAL)
@@ -611,12 +612,16 @@ class SkillTreeView(wx.Panel):
def spawnMenu(self, event):
item = event.GetItem()
itemData = self.skillTreeListCtrl.GetItemData(item)
if itemData is None:
return
self.skillTreeListCtrl.Select(item)
thing = self.skillTreeListCtrl.GetFirstChild(item).IsOk()
if thing:
return
id = self.skillTreeListCtrl.GetItemData(item)[1]
id = itemData[1]
eveItem = Market.getInstance().getItem(id)
srcContext = "skillItem"

View File

@@ -367,7 +367,7 @@ class _TabRenderer:
width = max(width, self.min_width)
height = max(height, self.min_height)
self.disabled = False
self._disabled = False
self.baseText = text
self.extraText = ''
self.tab_size = (width, height)
@@ -383,6 +383,18 @@ class _TabRenderer:
self.position = (0, 0) # Not used internally for rendering - helper for tab container
self.InitTab()
@property
def disabled(self):
return self._disabled
@disabled.setter
def disabled(self, value):
if value == self._disabled: # Avoid unnecessary re-rendering
return
self._disabled = value
self._Render()
@property
def text(self):
return self.baseText + self.extraText
@@ -402,6 +414,10 @@ class _TabRenderer:
width = max(width, self.min_width)
height = max(height, self.min_height)
cur_width, cur_height = self.tab_size
if (width == cur_width) and (height == cur_height):
return
self.tab_size = (width, height)
self.InitTab()
@@ -927,7 +943,6 @@ class _TabsContainer(wx.Panel):
tb_renderer = self.tabs[tab]
tb_renderer.disabled = disabled
self.AdjustTabsSize()
self.Refresh()
def GetSelectedTab(self):
@@ -975,9 +990,6 @@ class _TabsContainer(wx.Panel):
sel_tab = self.tabs.index(tab)
self.Parent.SetSelection(sel_tab)
wx.PostEvent(self.Parent, PageChanged(self.tabs.index(old_sel_tab),
self.tabs.index(tab)))
return True
return False

View File

@@ -177,7 +177,7 @@ class CopySelectDialog(wx.Dialog):
def exportEsi(self, options, callback):
fit = getFit(self.mainFrame.getActiveFit())
Port.exportESI(fit, callback)
Port.exportESI(fit, True, callback)
def exportXml(self, options, callback):
fit = getFit(self.mainFrame.getActiveFit())

View File

@@ -18,6 +18,7 @@ from service.esiAccess import APIException
from service.fit import Fit
from service.port import Port
from service.port.esi import ESIExportException
from service.settings import EsiSettings
pyfalog = Logger(__name__)
@@ -61,8 +62,10 @@ class EveFittings(AuxiliaryFrame):
btnSizer = wx.BoxSizer(wx.HORIZONTAL)
self.importBtn = wx.Button(self, wx.ID_ANY, "Import to pyfa", wx.DefaultPosition, wx.DefaultSize, 5)
self.deleteBtn = wx.Button(self, wx.ID_ANY, "Delete from EVE", wx.DefaultPosition, wx.DefaultSize, 5)
self.deleteAllBtn = wx.Button(self, wx.ID_ANY, "Delete all from Eve", wx.DefaultPosition, wx.DefaultSize, 5)
btnSizer.Add(self.importBtn, 1, wx.ALL, 5)
btnSizer.Add(self.deleteBtn, 1, wx.ALL, 5)
btnSizer.Add(self.deleteAllBtn, 1, wx.ALL, 5)
fitSizer.Add(btnSizer, 0, wx.EXPAND)
contentSizer.Add(fitSizer, 1, wx.EXPAND, 0)
@@ -71,6 +74,7 @@ class EveFittings(AuxiliaryFrame):
self.fetchBtn.Bind(wx.EVT_BUTTON, self.fetchFittings)
self.importBtn.Bind(wx.EVT_BUTTON, self.importFitting)
self.deleteBtn.Bind(wx.EVT_BUTTON, self.deleteFitting)
self.deleteAllBtn.Bind(wx.EVT_BUTTON, self.deleteAllFittings)
self.Bind(wx.EVT_CHAR_HOOK, self.kbEvent)
@@ -168,6 +172,37 @@ class EveFittings(AuxiliaryFrame):
pyfalog.error(msg)
self.statusbar.SetStatusText(msg)
def deleteAllFittings(self, event):
sEsi = Esi.getInstance()
activeChar = self.getActiveCharacter()
if activeChar is None:
return
charName = sEsi.getSsoCharacter(activeChar).characterName
anyDeleted = False
with wx.MessageDialog(
self, "Do you really want to delete all fits from %s in EVE?"%(charName),
"Confirm Delete", wx.YES | wx.NO | wx.ICON_QUESTION
) as dlg:
if dlg.ShowModal() == wx.ID_YES:
try:
for fit in self.fittings:
sEsi.delFitting(activeChar, fit['fitting_id'])
anyDeleted = True
except requests.exceptions.ConnectionError:
msg = "Connection error, please check your internet connection"
pyfalog.error(msg)
self.statusbar.SetStatusText(msg)
except APIException as ex:
if anyDeleted:
msg = "Some fits were not deleted: ESI error {} received".format(ex.status_code)
else:
msg = "Failed to delete fits: ESI error {} received".format(ex.status_code)
pyfalog.error(msg)
self.statusbar.SetStatusText(msg)
# repopulate the fitting list
self.fitTree.populateSkillTree(self.fittings)
self.fitView.update([])
class ESIServerExceptionHandler:
def __init__(self, parentWindow, ex):
@@ -207,7 +242,7 @@ class ExportToEve(AuxiliaryFrame):
def __init__(self, parent):
super().__init__(
parent, id=wx.ID_ANY, title="Export fit to EVE", pos=wx.DefaultPosition,
size=wx.Size(400, 120) if "wxGTK" in wx.PlatformInfo else wx.Size(350, 100), resizeable=True)
size=wx.Size(400, 140) if "wxGTK" in wx.PlatformInfo else wx.Size(350, 115), resizeable=True)
self.mainFrame = parent
@@ -224,6 +259,11 @@ class ExportToEve(AuxiliaryFrame):
mainSizer.Add(hSizer, 0, wx.EXPAND, 5)
self.exportChargesCb = wx.CheckBox(self, wx.ID_ANY, 'Export Loaded Charges', wx.DefaultPosition, wx.DefaultSize, 0)
self.exportChargesCb.SetValue(EsiSettings.getInstance().get('exportCharges'))
self.exportChargesCb.Bind(wx.EVT_CHECKBOX, self.OnChargeExportChange)
mainSizer.Add(self.exportChargesCb, 0, 0, 5)
self.exportBtn.Bind(wx.EVT_BUTTON, self.exportFitting)
self.statusbar = wx.StatusBar(self)
@@ -239,6 +279,10 @@ class ExportToEve(AuxiliaryFrame):
self.Center(wx.BOTH)
def OnChargeExportChange(self, event):
EsiSettings.getInstance().set('exportCharges', self.exportChargesCb.GetValue())
event.Skip()
def updateCharList(self):
sEsi = Esi.getInstance()
chars = sEsi.getSsoCharacters()
@@ -274,8 +318,9 @@ class ExportToEve(AuxiliaryFrame):
sEsi = Esi.getInstance()
sFit = Fit.getInstance()
exportCharges = self.exportChargesCb.GetValue()
try:
data = sPort.exportESI(sFit.getFit(fitID))
data = sPort.exportESI(sFit.getFit(fitID), exportCharges)
except ESIExportException as e:
msg = str(e)
if not msg:

View File

@@ -63,8 +63,8 @@ class GuiCargoToLocalModuleCommand(wx.Command):
dstModSlot = dstMod.slot
if self.srcCargoItemID == dstModItemID:
return False
# To keep all old item properties, copy them over from old module
newModInfo = ModuleInfo.fromModule(dstMod)
# To keep all old item properties, copy them over from old module, except for mutations
newModInfo = ModuleInfo.fromModule(dstMod, unmutate=True)
newModInfo.itemID = self.srcCargoItemID
if dstMod.isEmpty:
newCargoModItemID = None

View File

@@ -324,7 +324,8 @@ def activeStateLimit(itemIdentity):
'microJumpDrive', 'microJumpPortalDrive', 'emergencyHullEnergizer',
'cynosuralGeneration', 'jumpPortalGeneration', 'jumpPortalGenerationBO',
'cloneJumpAccepting', 'cloakingWarpSafe', 'cloakingPrototype', 'cloaking',
'massEntanglerEffect5', 'electronicAttributeModifyOnline', 'targetPassively'
'massEntanglerEffect5', 'electronicAttributeModifyOnline', 'targetPassively',
'cargoScan', 'shipScan', 'surveyScan'
}.intersection(item.effects):
return FittingModuleState.ONLINE
return FittingModuleState.ACTIVE

View File

@@ -110,8 +110,6 @@ class OpenFitsThread(threading.Thread):
self.start()
def run(self):
time.sleep(0.5) # Give GUI some time to finish drawing
# `startup` tells FitSpawner that we are loading fits are startup, and
# has 3 values:
# False = Set as default in FitSpawner itself, never set here
@@ -610,7 +608,9 @@ class MainFrame(wx.Frame):
(wx.ACCEL_CTRL, wx.WXK_PAGEDOWN, ctabnext),
(wx.ACCEL_CTRL, wx.WXK_PAGEUP, ctabprev),
(wx.ACCEL_CMD, wx.WXK_PAGEDOWN, ctabnext),
(wx.ACCEL_CMD, wx.WXK_PAGEUP, ctabprev)
(wx.ACCEL_CMD, wx.WXK_PAGEUP, ctabprev),
(wx.ACCEL_CMD | wx.ACCEL_SHIFT, ord("Z"), wx.ID_REDO)
]
# Ctrl/Cmd+# for addition pane selection

View File

@@ -1,6 +1,6 @@
wxPython == 4.0.6
logbook >= 1.0.0
matplotlib >= 3.1.2
matplotlib == 3.2.2
python-dateutil
requests >= 2.0.0
sqlalchemy >= 1.3.0

View File

@@ -16,94 +16,10 @@ rename_phrase = " renamed to "
conversion_phrase = " converted to "
text = """
Supplemental EM Ward Amplifier converted to 'Basic' EM Shield Amplifier
Supplemental Explosive Deflection Amplifier converted to 'Basic' Explosive Shield Amplifier
Supplemental Kinetic Deflection Amplifier converted to 'Basic' Kinetic Shield Amplifier
Supplemental Thermal Dissipation Amplifier converted to 'Basic' Thermal Shield Amplifier
Basic EM Ward Amplifier renamed to 'Basic' EM Shield Amplifier
Basic Thermal Dissipation Amplifier renamed to 'Basic' Thermal Shield Amplifier
Basic Kinetic Deflection Amplifier renamed to 'Basic' Kinetic Shield Amplifier
Basic Explosive Deflection Amplifier renamed to 'Basic' Explosive Shield Amplifier
EM Ward Amplifier I renamed to EM Shield Amplifier I
Explosive Deflection Amplifier I renamed to Explosive Shield Amplifier I
Explosive Deflection Amplifier II renamed to Explosive Shield Amplifier II
Thermal Dissipation Amplifier I renamed to Thermal Shield Amplifier I
Thermal Dissipation Amplifier II renamed to Thermal Shield Amplifier II
Kinetic Deflection Amplifier I renamed to Kinetic Shield Amplifier I
Kinetic Deflection Amplifier II renamed to Kinetic Shield Amplifier II
EM Ward Amplifier II renamed to EM Shield Amplifier II
Upgraded Explosive Deflection Amplifier I renamed to Compact Explosive Shield Amplifier
Upgraded Thermal Dissipation Amplifier I renamed to Compact Thermal Shield Amplifier
Upgraded EM Ward Amplifier I renamed to Compact EM Shield Amplifier
Upgraded Kinetic Deflection Amplifier I renamed to Compact Kinetic Shield Amplifier
Domination Explosive Deflection Amplifier renamed to Domination Explosive Shield Amplifier
Dread Guristas Explosive Deflection Amplifier renamed to Dread Guristas Explosive Shield Amplifier
Domination Thermal Dissipation Amplifier renamed to Domination Thermal Shield Amplifier
Dread Guristas Thermal Dissipation Amplifier renamed to Dread Guristas Thermal Shield Amplifier
Domination Kinetic Deflection Amplifier renamed to Domination Kinetic Shield Amplifier
Dread Guristas Kinetic Deflection Amplifier renamed to Dread Guristas Kinetic Shield Amplifier
Domination EM Ward Amplifier renamed to Domination EM Shield Amplifier
Dread Guristas EM Ward Amplifier renamed to Dread Guristas EM Shield Amplifier
Hakim's Modified Explosive Deflection Amplifier renamed to Hakim's Modified Explosive Shield Amplifier
Tobias' Modified Explosive Deflection Amplifier renamed to Tobias' Modified Explosive Shield Amplifier
Hakim's Modified Thermal Dissipation Amplifier renamed to Hakim's Modified Thermal Shield Amplifier
Tobias' Modified Thermal Dissipation Amplifier renamed to Tobias' Modified Thermal Shield Amplifier
Hakim's Modified Kinetic Deflection Amplifier renamed to Hakim's Modified Kinetic Shield Amplifier
Tobias' Modified Kinetic Deflection Amplifier renamed to Tobias' Modified Kinetic Shield Amplifier
Hakim's Modified EM Ward Amplifier renamed to Hakim's Modified EM Shield Amplifier
Tobias' Modified EM Ward Amplifier renamed to Tobias' Modified EM Shield Amplifier
Kaikka's Modified Explosive Deflection Amplifier renamed to Kaikka's Modified Explosive Shield Amplifier
Thon's Modified Explosive Deflection Amplifier renamed to Thon's Modified Explosive Shield Amplifier
Vepas' Modified Explosive Deflection Amplifier renamed to Vepas' Modified Explosive Shield Amplifier
Estamel's Modified Explosive Deflection Amplifier renamed to Estamel's Modified Explosive Shield Amplifier
Kaikka's Modified Thermal Dissipation Amplifier renamed to Kaikka's Modified Thermal Shield Amplifier
Thon's Modified Thermal Dissipation Amplifier renamed to Thon's Modified Thermal Shield Amplifier
Vepas' Modified Thermal Dissipation Amplifier renamed to Vepas' Modified Thermal Shield Amplifier
Estamel's Modified Thermal Dissipation Amplifier renamed to Estamel's Modified Thermal Shield Amplifier
Kaikka's Modified Kinetic Deflection Amplifier renamed to Kaikka's Modified Kinetic Shield Amplifier
Thon's Modified Kinetic Deflection Amplifier renamed to Thon's Modified Kinetic Shield Amplifier
Vepas' Modified Kinetic Deflection Amplifier renamed to Vepas' Modified Kinetic Shield Amplifier
Estamel's Modified Kinetic Deflection Amplifier renamed to Estamel's Modified Kinetic Shield Amplifier
Kaikka's Modified EM Ward Amplifier renamed to Kaikka's Modified EM Shield Amplifier
Thon's Modified EM Ward Amplifier renamed to Thon's Modified EM Shield Amplifier
Vepas' Modified EM Ward Amplifier renamed to Vepas' Modified EM Shield Amplifier
Estamel's Modified EM Ward Amplifier renamed to Estamel's Modified EM Shield Amplifier
Caldari Navy EM Ward Amplifier renamed to Caldari Navy EM Shield Amplifier
Caldari Navy Kinetic Deflection Amplifier renamed to Caldari Navy Kinetic Shield Amplifier
Caldari Navy Thermal Dissipation Amplifier renamed to Caldari Navy Thermal Shield Amplifier
Caldari Navy Explosive Deflection Amplifier renamed to Caldari Navy Explosive Shield Amplifier
Republic Fleet EM Ward Amplifier renamed to Republic Fleet EM Shield Amplifier
Republic Fleet Kinetic Deflection Amplifier renamed to Republic Fleet Kinetic Shield Amplifier
Republic Fleet Thermal Dissipation Amplifier renamed to Republic Fleet Thermal Shield Amplifier
Republic Fleet Explosive Deflection Amplifier renamed to Republic Fleet Explosive Shield Amplifier
Pithum C-Type Explosive Deflection Amplifier renamed to Pithum C-Type Explosive Shield Amplifier
Pithum C-Type Thermal Dissipation Amplifier renamed to Pithum C-Type Thermal Shield Amplifier
Pithum C-Type Kinetic Deflection Amplifier renamed to Pithum C-Type Kinetic Shield Amplifier
Pithum C-Type EM Ward Amplifier renamed to Pithum C-Type EM Shield Amplifier
Pithum B-Type Explosive Deflection Amplifier renamed to Pithum B-Type Explosive Shield Amplifier
Pithum B-Type Thermal Dissipation Amplifier renamed to Pithum B-Type Thermal Shield Amplifier
Pithum B-Type Kinetic Deflection Amplifier renamed to Pithum B-Type Kinetic Shield Amplifier
Pithum B-Type EM Ward Amplifier renamed to Pithum B-Type EM Shield Amplifier
Pithum A-Type Explosive Deflection Amplifier renamed to Pithum A-Type Explosive Shield Amplifier
Pithum A-Type Thermal Dissipation Amplifier renamed to Pithum A-Type Thermal Shield Amplifier
Pithum A-Type Kinetic Deflection Amplifier renamed to Pithum A-Type Kinetic Shield Amplifier
Pithum A-Type EM Ward Amplifier renamed to Pithum A-Type EM Shield Amplifier
Gistum C-Type Explosive Deflection Amplifier renamed to Gistum C-Type Explosive Shield Amplifier
Gistum B-Type Explosive Deflection Amplifier renamed to Gistum B-Type Explosive Shield Amplifier
Gistum C-Type Thermal Dissipation Amplifier renamed to Gistum C-Type Thermal Shield Amplifier
Gistum B-Type Thermal Dissipation Amplifier renamed to Gistum B-Type Thermal Shield Amplifier
Gistum C-Type Kinetic Deflection Amplifier renamed to Gistum C-Type Kinetic Shield Amplifier
Gistum B-Type Kinetic Deflection Amplifier renamed to Gistum B-Type Kinetic Shield Amplifier
Gistum C-Type EM Ward Amplifier renamed to Gistum C-Type EM Shield Amplifier
Gistum B-Type EM Ward Amplifier renamed to Gistum B-Type EM Shield Amplifier
Gistum A-Type Explosive Deflection Amplifier renamed to Gistum A-Type Explosive Shield Amplifier
Gistum A-Type Thermal Dissipation Amplifier renamed to Gistum A-Type Thermal Shield Amplifier
Gistum A-Type Kinetic Deflection Amplifier renamed to Gistum A-Type Kinetic Shield Amplifier
Gistum A-Type EM Ward Amplifier renamed to Gistum A-Type EM Shield Amplifier
'Whiskey' Explosive Deflection Amplifier renamed to 'Whiskey' Explosive Shield Amplifier
'High Noon' Thermal Dissipation Amplifier renamed to 'High Noon' Thermal Shield Amplifier
'Cactus' Modified Kinetic Deflection Amplifier renamed to 'Cactus' Modified Kinetic Shield Amplifier
'Prospector' EM Ward Amplifier renamed to 'Prospector' EM Shield Amplifier
'Stalwart' Particle Field Magnifier renamed to Stalwart Restrained Shield Boost Amplifier
'Copasetic' Particle Field Acceleration renamed to Copasetic Compact Shield Boost Amplifier
5a Prototype Shield Support I converted to Stalwart Restrained Shield Boost Amplifier
Ionic Field Accelerator I converted to Copasetic Compact Shield Boost Amplifier
"""
def main(old, new):

View File

@@ -0,0 +1,194 @@
"""
Conversion pack for August 2020 release
"""
CONVERSIONS = {
# Renamed items, extracted via diff file
"Basic Energized EM Membrane": "'Basic' EM Energized Membrane",
"Energized EM Membrane I": "EM Energized Membrane I",
"Energized EM Membrane II": "EM Energized Membrane II",
"Basic Energized Explosive Membrane": "'Basic' Explosive Energized Membrane",
"Energized Explosive Membrane I": "Explosive Energized Membrane I",
"Energized Explosive Membrane II": "Explosive Energized Membrane II",
"Basic Energized Armor Layering Membrane": "'Basic' Layered Energized Membrane",
"Energized Armor Layering Membrane I": "Layered Energized Membrane I",
"Energized Armor Layering Membrane II": "Layered Energized Membrane II",
"Basic Energized Kinetic Membrane": "'Basic' Kinetic Energized Membrane",
"Energized Kinetic Membrane I": "Kinetic Energized Membrane I",
"Energized Kinetic Membrane II": "Kinetic Energized Membrane II",
"Basic Energized Thermal Membrane": "'Basic' Thermal Energized Membrane",
"Energized Thermal Membrane I": "Thermal Energized Membrane I",
"Energized Thermal Membrane II": "Thermal Energized Membrane II",
"Basic Energized Adaptive Nano Membrane": "'Basic' Multispectrum Energized Membrane",
"Energized Adaptive Nano Membrane I": "Multispectrum Energized Membrane I",
"Energized Adaptive Nano Membrane II": "Multispectrum Energized Membrane II",
"Dark Blood Energized Adaptive Nano Membrane": "Dark Blood Multispectrum Energized Membrane",
"True Sansha Energized Adaptive Nano Membrane": "True Sansha Multispectrum Energized Membrane",
"Shadow Serpentis Energized Adaptive Nano Membrane": "Shadow Serpentis Multispectrum Energized Membrane",
"Dark Blood Energized Kinetic Membrane": "Dark Blood Kinetic Energized Membrane",
"True Sansha Energized Kinetic Membrane": "True Sansha Kinetic Energized Membrane",
"Shadow Serpentis Energized Kinetic Membrane": "Shadow Serpentis Kinetic Energized Membrane",
"Dark Blood Energized Explosive Membrane": "Dark Blood Explosive Energized Membrane",
"True Sansha Energized Explosive Membrane": "True Sansha Explosive Energized Membrane",
"Shadow Serpentis Energized Explosive Membrane": "Shadow Serpentis Explosive Energized Membrane",
"Dark Blood Energized EM Membrane": "Dark Blood EM Energized Membrane",
"True Sansha Energized EM Membrane": "True Sansha EM Energized Membrane",
"Shadow Serpentis Energized EM Membrane": "Shadow Serpentis EM Energized Membrane",
"Dark Blood Energized Thermal Membrane": "Dark Blood Thermal Energized Membrane",
"True Sansha Energized Thermal Membrane": "True Sansha Thermal Energized Membrane",
"Shadow Serpentis Energized Thermal Membrane": "Shadow Serpentis Thermal Energized Membrane",
"Brokara's Modified Energized Adaptive Nano Membrane": "Brokara's Modified Multispectrum Energized Membrane",
"Tairei's Modified Energized Adaptive Nano Membrane": "Tairei's Modified Multispectrum Energized Membrane",
"Selynne's Modified Energized Adaptive Nano Membrane": "Selynne's Modified Multispectrum Energized Membrane",
"Raysere's Modified Energized Adaptive Nano Membrane": "Raysere's Modified Multispectrum Energized Membrane",
"Vizan's Modified Energized Adaptive Nano Membrane": "Vizan's Modified Multispectrum Energized Membrane",
"Ahremen's Modified Energized Adaptive Nano Membrane": "Ahremen's Modified Multispectrum Energized Membrane",
"Chelm's Modified Energized Adaptive Nano Membrane": "Chelm's Modified Multispectrum Energized Membrane",
"Draclira's Modified Energized Adaptive Nano Membrane": "Draclira's Modified Multispectrum Energized Membrane",
"Brokara's Modified Energized Thermal Membrane": "Brokara's Modified Thermal Energized Membrane",
"Tairei's Modified Energized Thermal Membrane": "Tairei's Modified Thermal Energized Membrane",
"Selynne's Modified Energized Thermal Membrane": "Selynne's Modified Thermal Energized Membrane",
"Raysere's Modified Energized Thermal Membrane": "Raysere's Modified Thermal Energized Membrane",
"Vizan's Modified Energized Thermal Membrane": "Vizan's Modified Thermal Energized Membrane",
"Ahremen's Modified Energized Thermal Membrane": "Ahremen's Modified Thermal Energized Membrane",
"Chelm's Modified Energized Thermal Membrane": "Chelm's Modified Thermal Energized Membrane",
"Draclira's Modified Energized Thermal Membrane": "Draclira's Modified Thermal Energized Membrane",
"Brokara's Modified Energized EM Membrane": "Brokara's Modified EM Energized Membrane",
"Tairei's Modified Energized EM Membrane": "Tairei's Modified EM Energized Membrane",
"Selynne's Modified Energized EM Membrane": "Selynne's Modified EM Energized Membrane",
"Raysere's Modified Energized EM Membrane": "Raysere's Modified EM Energized Membrane",
"Vizan's Modified Energized EM Membrane": "Vizan's Modified EM Energized Membrane",
"Ahremen's Modified Energized EM Membrane": "Ahremen's Modified EM Energized Membrane",
"Chelm's Modified Energized EM Membrane": "Chelm's Modified EM Energized Membrane",
"Draclira's Modified Energized EM Membrane": "Draclira's Modified EM Energized Membrane",
"Brokara's Modified Energized Explosive Membrane": "Brokara's Modified Explosive Energized Membrane",
"Tairei's Modified Energized Explosive Membrane": "Tairei's Modified Explosive Energized Membrane",
"Selynne's Modified Energized Explosive Membrane": "Selynne's Modified Explosive Energized Membrane",
"Raysere's Modified Energized Explosive Membrane": "Raysere's Modified Explosive Energized Membrane",
"Vizan's Modified Energized Explosive Membrane": "Vizan's Modified Explosive Energized Membrane",
"Ahremen's Modified Energized Explosive Membrane": "Ahremen's Modified Explosive Energized Membrane",
"Chelm's Modified Energized Explosive Membrane": "Chelm's Modified Explosive Energized Membrane",
"Draclira's Modified Energized Explosive Membrane": "Draclira's Modified Explosive Energized Membrane",
"Brokara's Modified Energized Kinetic Membrane": "Brokara's Modified Kinetic Energized Membrane",
"Tairei's Modified Energized Kinetic Membrane": "Tairei's Modified Kinetic Energized Membrane",
"Selynne's Modified Energized Kinetic Membrane": "Selynne's Modified Kinetic Energized Membrane",
"Raysere's Modified Energized Kinetic Membrane": "Raysere's Modified Kinetic Energized Membrane",
"Vizan's Modified Energized Kinetic Membrane": "Vizan's Modified Kinetic Energized Membrane",
"Ahremen's Modified Energized Kinetic Membrane": "Ahremen's Modified Kinetic Energized Membrane",
"Chelm's Modified Energized Kinetic Membrane": "Chelm's Modified Kinetic Energized Membrane",
"Draclira's Modified Energized Kinetic Membrane": "Draclira's Modified Kinetic Energized Membrane",
"Brynn's Modified Energized Adaptive Nano Membrane": "Brynn's Modified Multispectrum Energized Membrane",
"Tuvan's Modified Energized Adaptive Nano Membrane": "Tuvan's Modified Multispectrum Energized Membrane",
"Setele's Modified Energized Adaptive Nano Membrane": "Setele's Modified Multispectrum Energized Membrane",
"Cormack's Modified Energized Adaptive Nano Membrane": "Cormack's Modified Multispectrum Energized Membrane",
"Brynn's Modified Energized Thermal Membrane": "Brynn's Modified Thermal Energized Membrane",
"Tuvan's Modified Energized Thermal Membrane": "Tuvan's Modified Thermal Energized Membrane",
"Setele's Modified Energized Thermal Membrane": "Setele's Modified Thermal Energized Membrane",
"Cormack's Modified Energized Thermal Membrane": "Cormack's Modified Thermal Energized Membrane",
"Brynn's Modified Energized EM Membrane": "Brynn's Modified EM Energized Membrane",
"Tuvan's Modified Energized EM Membrane": "Tuvan's Modified EM Energized Membrane",
"Setele's Modified Energized EM Membrane": "Setele's Modified EM Energized Membrane",
"Cormack's Modified Energized EM Membrane": "Cormack's Modified EM Energized Membrane",
"Brynn's Modified Energized Explosive Membrane": "Brynn's Modified Explosive Energized Membrane",
"Tuvan's Modified Energized Explosive Membrane": "Tuvan's Modified Explosive Energized Membrane",
"Setele's Modified Energized Explosive Membrane": "Setele's Modified Explosive Energized Membrane",
"Cormack's Modified Energized Explosive Membrane": "Cormack's Modified Explosive Energized Membrane",
"Brynn's Modified Energized Kinetic Membrane": "Brynn's Modified Kinetic Energized Membrane",
"Tuvan's Modified Energized Kinetic Membrane": "Tuvan's Modified Kinetic Energized Membrane",
"Setele's Modified Energized Kinetic Membrane": "Setele's Modified Kinetic Energized Membrane",
"Cormack's Modified Energized Kinetic Membrane": "Cormack's Modified Kinetic Energized Membrane",
"Imperial Navy Energized Thermal Membrane": "Imperial Navy Thermal Energized Membrane",
"Imperial Navy Energized EM Membrane": "Imperial Navy EM Energized Membrane",
"Imperial Navy Energized Explosive Membrane": "Imperial Navy Explosive Energized Membrane",
"Imperial Navy Energized Kinetic Membrane": "Imperial Navy Kinetic Energized Membrane",
"Imperial Navy Energized Adaptive Nano Membrane": "Imperial Navy Multispectrum Energized Membrane",
"Federation Navy Energized Thermal Membrane": "Federation Navy Thermal Energized Membrane",
"Federation Navy Energized EM Membrane": "Federation Navy EM Energized Membrane",
"Federation Navy Energized Explosive Membrane": "Federation Navy Explosive Energized Membrane",
"Federation Navy Energized Kinetic Membrane": "Federation Navy Kinetic Energized Membrane",
"Federation Navy Energized Adaptive Nano Membrane": "Federation Navy Multispectrum Energized Membrane",
"Prototype Energized Adaptive Nano Membrane I": "Compact Multispectrum Energized Membrane",
"Prototype Energized Kinetic Membrane I": "Compact Kinetic Energized Membrane",
"Prototype Energized Explosive Membrane I": "Compact Explosive Energized Membrane",
"Prototype Energized EM Membrane I": "Compact EM Energized Membrane",
"Prototype Energized Armor Layering Membrane I": "Compact Layered Energized Membrane",
"Prototype Energized Thermal Membrane I": "Compact Thermal Energized Membrane",
"Ammatar Navy Energized Adaptive Nano Membrane": "Ammatar Navy Multispectrum Energized Membrane",
"Ammatar Navy Energized Kinetic Membrane": "Ammatar Navy Kinetic Energized Membrane",
"Ammatar Navy Energized Explosive Membrane": "Ammatar Navy Explosive Energized Membrane",
"Ammatar Navy Energized EM Membrane": "Ammatar Navy EM Energized Membrane",
"Ammatar Navy Energized Thermal Membrane": "Ammatar Navy Thermal Energized Membrane",
"Corelum C-Type Energized Adaptive Nano Membrane": "Corelum C-Type Multispectrum Energized Membrane",
"Corelum C-Type Energized Kinetic Membrane": "Corelum C-Type Kinetic Energized Membrane",
"Corelum C-Type Energized Explosive Membrane": "Corelum C-Type Explosive Energized Membrane",
"Corelum C-Type Energized EM Membrane": "Corelum C-Type EM Energized Membrane",
"Corelum C-Type Energized Thermal Membrane": "Corelum C-Type Thermal Energized Membrane",
"Corelum B-Type Energized Adaptive Nano Membrane": "Corelum B-Type Multispectrum Energized Membrane",
"Corelum B-Type Energized Kinetic Membrane": "Corelum B-Type Kinetic Energized Membrane",
"Corelum B-Type Energized Explosive Membrane": "Corelum B-Type Explosive Energized Membrane",
"Corelum B-Type Energized EM Membrane": "Corelum B-Type EM Energized Membrane",
"Corelum B-Type Energized Thermal Membrane": "Corelum B-Type Thermal Energized Membrane",
"Corelum A-Type Energized Adaptive Nano Membrane": "Corelum A-Type Multispectrum Energized Membrane",
"Corelum A-Type Energized Kinetic Membrane": "Corelum A-Type Kinetic Energized Membrane",
"Corelum A-Type Energized Explosive Membrane": "Corelum A-Type Explosive Energized Membrane",
"Corelum A-Type Energized EM Membrane": "Corelum A-Type EM Energized Membrane",
"Corelum A-Type Energized Thermal Membrane": "Corelum A-Type Thermal Energized Membrane",
"Corpum C-Type Energized Adaptive Nano Membrane": "Corpum C-Type Multispectrum Energized Membrane",
"Centum C-Type Energized Adaptive Nano Membrane": "Centum C-Type Multispectrum Energized Membrane",
"Corpum C-Type Energized Kinetic Membrane": "Corpum C-Type Kinetic Energized Membrane",
"Centum C-Type Energized Kinetic Membrane": "Centum C-Type Kinetic Energized Membrane",
"Corpum C-Type Energized Explosive Membrane": "Corpum C-Type Explosive Energized Membrane",
"Centum C-Type Energized Explosive Membrane": "Centum C-Type Explosive Energized Membrane",
"Corpum C-Type Energized EM Membrane": "Corpum C-Type EM Energized Membrane",
"Centum C-Type Energized EM Membrane": "Centum C-Type EM Energized Membrane",
"Corpum C-Type Energized Thermal Membrane": "Corpum C-Type Thermal Energized Membrane",
"Centum C-Type Energized Thermal Membrane": "Centum C-Type Thermal Energized Membrane",
"Corpum B-Type Energized Adaptive Nano Membrane": "Corpum B-Type Multispectrum Energized Membrane",
"Centum B-Type Energized Adaptive Nano Membrane": "Centum B-Type Multispectrum Energized Membrane",
"Corpum B-Type Energized Kinetic Membrane": "Corpum B-Type Kinetic Energized Membrane",
"Centum B-Type Energized Kinetic Membrane": "Centum B-Type Kinetic Energized Membrane",
"Corpum B-Type Energized Explosive Membrane": "Corpum B-Type Explosive Energized Membrane",
"Centum B-Type Energized Explosive Membrane": "Centum B-Type Explosive Energized Membrane",
"Corpum B-Type Energized Thermal Membrane": "Corpum B-Type Thermal Energized Membrane",
"Centum B-Type Energized Thermal Membrane": "Centum B-Type Thermal Energized Membrane",
"Corpum A-Type Energized Thermal Membrane": "Corpum A-Type Thermal Energized Membrane",
"Centum A-Type Energized Thermal Membrane": "Centum A-Type Thermal Energized Membrane",
"Corpum A-Type Energized EM Membrane": "Corpum A-Type EM Energized Membrane",
"Centum A-Type Energized EM Membrane": "Centum A-Type EM Energized Membrane",
"Corpum A-Type Energized Explosive Membrane": "Corpum A-Type Explosive Energized Membrane",
"Centum A-Type Energized Explosive Membrane": "Centum A-Type Explosive Energized Membrane",
"Corpum A-Type Energized Kinetic Membrane": "Corpum A-Type Kinetic Energized Membrane",
"Centum A-Type Energized Kinetic Membrane": "Centum A-Type Kinetic Energized Membrane",
"Corpum A-Type Energized Adaptive Nano Membrane": "Corpum A-Type Multispectrum Energized Membrane",
"Centum A-Type Energized Adaptive Nano Membrane": "Centum A-Type Multispectrum Energized Membrane",
"Corpum B-Type Energized EM Membrane": "Corpum B-Type EM Energized Membrane",
"Centum B-Type Energized EM Membrane": "Centum B-Type EM Energized Membrane",
"'Pilfer' Energized Adaptive Nano Membrane I": "'Pilfer' Multispectrum Energized Membrane",
"'Moonshine' Energized Thermal Membrane I": "'Moonshine' Thermal Energized Membrane",
"'Mafia' Energized Kinetic Membrane I": "'Mafia' Kinetic Energized Membrane",
"Khanid Navy Energized Adaptive Nano Membrane": "Khanid Navy Multispectrum Energized Membrane",
"Khanid Navy Energized Kinetic Membrane": "Khanid Navy Kinetic Energized Membrane",
"Khanid Navy Energized Explosive Membrane": "Khanid Navy Explosive Energized Membrane",
"Khanid Navy Energized EM Membrane": "Khanid Navy EM Energized Membrane",
"Khanid Navy Energized Thermal Membrane": "Khanid Navy Thermal Energized Membrane",
"Large Compact Vorton projector": "Large Compact Vorton Projector",
# Converted items
"Experimental Energized Adaptive Nano Membrane I": "Compact Multispectrum Energized Membrane",
"Limited Energized Adaptive Nano Membrane I": "Compact Multispectrum Energized Membrane",
"Upgraded Energized Adaptive Nano Membrane I": "Compact Multispectrum Energized Membrane",
"Experimental Energized Armor Layering Membrane I": "Compact Layered Energized Membrane",
"Limited Energized Armor Layering Membrane I": "Compact Layered Energized Membrane",
"Upgraded Energized Armor Layering Membrane I": "Compact Layered Energized Membrane",
"Experimental Energized EM Membrane I": "Compact EM Energized Membrane",
"Limited Energized EM Membrane I": "Compact EM Energized Membrane",
"Upgraded Energized EM Membrane I": "Compact EM Energized Membrane",
"Experimental Energized Explosive Membrane I": "Compact Explosive Energized Membrane",
"Limited Energized Explosive Membrane I": "Compact Explosive Energized Membrane",
"Upgraded Energized Explosive Membrane I": "Compact Explosive Energized Membrane",
"Experimental Energized Kinetic Membrane I": "Compact Kinetic Energized Membrane",
"Limited Energized Kinetic Membrane I": "Compact Kinetic Energized Membrane",
"Upgraded Energized Kinetic Membrane I": "Compact Kinetic Energized Membrane",
"Experimental Energized Thermal Membrane I": "Compact Thermal Energized Membrane",
"Limited Energized Thermal Membrane I": "Compact Thermal Energized Membrane",
"Upgraded Energized Thermal Membrane I": "Compact Thermal Energized Membrane",
}

View File

@@ -0,0 +1,228 @@
"""
Conversion pack for July 2020 release
"""
CONVERSIONS = {
# Renamed items, extracted via diff file
"Basic EM Plating": "'Basic' EM Coating",
"EM Plating I": "EM Coating I",
"EM Plating II": "EM Coating II",
"Basic Explosive Plating": "'Basic' Explosive Coating",
"Explosive Plating I": "Explosive Coating I",
"Explosive Plating II": "Explosive Coating II",
"Basic Layered Plating": "'Basic' Layered Coating",
"Layered Plating I": "Layered Coating I",
"Layered Plating II": "Layered Coating II",
"Basic Kinetic Plating": "'Basic' Kinetic Coating",
"Kinetic Plating I": "Kinetic Coating I",
"Kinetic Plating II": "Kinetic Coating II",
"Basic Thermal Plating": "'Basic' Thermal Coating",
"Thermal Plating I": "Thermal Coating I",
"Thermal Plating II": "Thermal Coating II",
"Basic Adaptive Nano Plating": "'Basic' Multispectrum Coating",
"Adaptive Nano Plating I": "Multispectrum Coating I",
"Adaptive Nano Plating II": "Multispectrum Coating II",
"Domination Adaptive Nano Plating": "Domination Multispectrum Coating",
"True Sansha Adaptive Nano Plating": "True Sansha Multispectrum Coating",
"Dark Blood Adaptive Nano Plating": "Dark Blood Multispectrum Coating",
"Domination Kinetic Plating": "Domination Kinetic Coating",
"True Sansha Kinetic Plating": "True Sansha Kinetic Coating",
"Dark Blood Kinetic Plating": "Dark Blood Kinetic Coating",
"Domination Explosive Plating": "Domination Explosive Coating",
"True Sansha Explosive Plating": "True Sansha Explosive Coating",
"Dark Blood Explosive Plating": "Dark Blood Explosive Coating",
"Domination EM Plating": "Domination EM Coating",
"True Sansha EM Plating": "True Sansha EM Coating",
"Dark Blood EM Plating": "Dark Blood EM Coating",
"Domination Thermal Plating": "Domination Thermal Coating",
"True Sansha Thermal Plating": "True Sansha Thermal Coating",
"Dark Blood Thermal Plating": "Dark Blood Thermal Coating",
"Shadow Serpentis Adaptive Nano Plating": "Shadow Serpentis Multispectrum Coating",
"Shadow Serpentis Kinetic Plating": "Shadow Serpentis Kinetic Coating",
"Shadow Serpentis Explosive Plating": "Shadow Serpentis Explosive Coating",
"Shadow Serpentis EM Plating": "Shadow Serpentis EM Coating",
"Shadow Serpentis Thermal Plating": "Shadow Serpentis Thermal Coating",
"Mizuro's Modified Adaptive Nano Plating": "Mizuro's Modified Multispectrum Coating",
"Gotan's Modified Adaptive Nano Plating": "Gotan's Modified Multispectrum Coating",
"Mizuro's Modified Kinetic Plating": "Mizuro's Modified Kinetic Coating",
"Gotan's Modified Kinetic Plating": "Gotan's Modified Kinetic Coating",
"Mizuro's Modified Explosive Plating": "Mizuro's Modified Explosive Coating",
"Gotan's Modified Explosive Plating": "Gotan's Modified Explosive Coating",
"Mizuro's Modified EM Plating": "Mizuro's Modified EM Coating",
"Gotan's Modified EM Plating": "Gotan's Modified EM Coating",
"Mizuro's Modified Thermal Plating": "Mizuro's Modified Thermal Coating",
"Gotan's Modified Thermal Plating": "Gotan's Modified Thermal Coating",
"Brokara's Modified Adaptive Nano Plating": "Brokara's Modified Multispectrum Coating",
"Tairei's Modified Adaptive Nano Plating": "Tairei's Modified Multispectrum Coating",
"Selynne's Modified Adaptive Nano Plating": "Selynne's Modified Multispectrum Coating",
"Raysere's Modified Adaptive Nano Plating": "Raysere's Modified Multispectrum Coating",
"Vizan's Modified Adaptive Nano Plating": "Vizan's Modified Multispectrum Coating",
"Ahremen's Modified Adaptive Nano Plating": "Ahremen's Modified Multispectrum Coating",
"Chelm's Modified Adaptive Nano Plating": "Chelm's Modified Multispectrum Coating",
"Draclira's Modified Adaptive Nano Plating": "Draclira's Modified Multispectrum Coating",
"Brokara's Modified Kinetic Plating": "Brokara's Modified Kinetic Coating",
"Tairei's Modified Kinetic Plating": "Tairei's Modified Kinetic Coating",
"Selynne's Modified Kinetic Plating": "Selynne's Modified Kinetic Coating",
"Raysere's Modified Kinetic Plating": "Raysere's Modified Kinetic Coating",
"Vizan's Modified Kinetic Plating": "Vizan's Modified Kinetic Coating",
"Ahremen's Modified Kinetic Plating": "Ahremen's Modified Kinetic Coating",
"Chelm's Modified Kinetic Plating": "Chelm's Modified Kinetic Coating",
"Draclira's Modified Kinetic Plating": "Draclira's Modified Kinetic Coating",
"Brokara's Modified Explosive Plating": "Brokara's Modified Explosive Coating",
"Tairei's Modified Explosive Plating": "Tairei's Modified Explosive Coating",
"Selynne's Modified Explosive Plating": "Selynne's Modified Explosive Coating",
"Raysere's Modified Explosive Plating": "Raysere's Modified Explosive Coating",
"Vizan's Modified Explosive Plating": "Vizan's Modified Explosive Coating",
"Ahremen's Modified Explosive Plating": "Ahremen's Modified Explosive Coating",
"Chelm's Modified Explosive Plating": "Chelm's Modified Explosive Coating",
"Draclira's Modified Explosive Plating": "Draclira's Modified Explosive Coating",
"Brokara's Modified EM Plating": "Brokara's Modified EM Coating",
"Tairei's Modified EM Plating": "Tairei's Modified EM Coating",
"Selynne's Modified EM Plating": "Selynne's Modified EM Coating",
"Raysere's Modified EM Plating": "Raysere's Modified EM Coating",
"Vizan's Modified EM Plating": "Vizan's Modified EM Coating",
"Ahremen's Modified EM Plating": "Ahremen's Modified EM Coating",
"Chelm's Modified EM Plating": "Chelm's Modified EM Coating",
"Draclira's Modified EM Plating": "Draclira's Modified EM Coating",
"Brokara's Modified Thermal Plating": "Brokara's Modified Thermal Coating",
"Tairei's Modified Thermal Plating": "Tairei's Modified Thermal Coating",
"Selynne's Modified Thermal Plating": "Selynne's Modified Thermal Coating",
"Raysere's Modified Thermal Plating": "Raysere's Modified Thermal Coating",
"Vizan's Modified Thermal Plating": "Vizan's Modified Thermal Coating",
"Ahremen's Modified Thermal Plating": "Ahremen's Modified Thermal Coating",
"Chelm's Modified Thermal Plating": "Chelm's Modified Thermal Coating",
"Draclira's Modified Thermal Plating": "Draclira's Modified Thermal Coating",
"Brynn's Modified Adaptive Nano Plating": "Brynn's Modified Multispectrum Coating",
"Tuvan's Modified Adaptive Nano Plating": "Tuvan's Modified Multispectrum Coating",
"Setele's Modified Adaptive Nano Plating": "Setele's Modified Multispectrum Coating",
"Cormack's Modified Adaptive Nano Plating": "Cormack's Modified Multispectrum Coating",
"Brynn's Modified Thermal Plating": "Brynn's Modified Thermal Coating",
"Tuvan's Modified Thermal Plating": "Tuvan's Modified Thermal Coating",
"Setele's Modified Thermal Plating": "Setele's Modified Thermal Coating",
"Cormack's Modified Thermal Plating": "Cormack's Modified Thermal Coating",
"Brynn's Modified EM Plating": "Brynn's Modified EM Coating",
"Tuvan's Modified EM Plating": "Tuvan's Modified EM Coating",
"Setele's Modified EM Plating": "Setele's Modified EM Coating",
"Cormack's Modified EM Plating": "Cormack's Modified EM Coating",
"Brynn's Modified Explosive Plating": "Brynn's Modified Explosive Coating",
"Tuvan's Modified Explosive Plating": "Tuvan's Modified Explosive Coating",
"Setele's Modified Explosive Plating": "Setele's Modified Explosive Coating",
"Cormack's Modified Explosive Plating": "Cormack's Modified Explosive Coating",
"Brynn's Modified Kinetic Plating": "Brynn's Modified Kinetic Coating",
"Tuvan's Modified Kinetic Plating": "Tuvan's Modified Kinetic Coating",
"Setele's Modified Kinetic Plating": "Setele's Modified Kinetic Coating",
"Cormack's Modified Kinetic Plating": "Cormack's Modified Kinetic Coating",
"Imperial Navy Thermal Plating": "Imperial Navy Thermal Coating",
"Imperial Navy EM Plating": "Imperial Navy EM Coating",
"Imperial Navy Explosive Plating": "Imperial Navy Explosive Coating",
"Imperial Navy Kinetic Plating": "Imperial Navy Kinetic Coating",
"Imperial Navy Adaptive Nano Plating": "Imperial Navy Multispectrum Coating",
"Republic Fleet Thermal Plating": "Republic Fleet Thermal Coating",
"Republic Fleet EM Plating": "Republic Fleet EM Coating",
"Republic Fleet Explosive Plating": "Republic Fleet Explosive Coating",
"Republic Fleet Kinetic Plating": "Republic Fleet Kinetic Coating",
"Republic Fleet Adaptive Nano Plating": "Republic Fleet Multispectrum Coating",
"Upgraded Adaptive Nano Plating I": "Upgraded Multispectrum Coating I",
"Upgraded Kinetic Plating I": "Upgraded Kinetic Coating I",
"Upgraded Explosive Plating I": "Upgraded Explosive Coating I",
"Upgraded EM Plating I": "Upgraded EM Coating I",
"Upgraded Thermal Plating I": "Upgraded Thermal Coating I",
"Upgraded Layered Plating I": "Upgraded Layered Coating I",
"Ammatar Navy Kinetic Plating": "Ammatar Navy Kinetic Coating",
"Ammatar Navy Adaptive Nano Plating": "Ammatar Navy Multispectrum Coating",
"Ammatar Navy Explosive Plating": "Ammatar Navy Explosive Coating",
"Ammatar Navy EM Plating": "Ammatar Navy EM Coating",
"Federation Navy Adaptive Nano Plating": "Federation Navy Multispectrum Coating",
"Federation Navy Kinetic Plating": "Federation Navy Kinetic Coating",
"Federation Navy Explosive Plating": "Federation Navy Explosive Coating",
"Federation Navy EM Plating": "Federation Navy EM Coating",
"Federation Navy Thermal Plating": "Federation Navy Thermal Coating",
"Corpii C-Type Adaptive Nano Plating": "Corpii C-Type Multispectrum Coating",
"Centii C-Type Adaptive Nano Plating": "Centii C-Type Multispectrum Coating",
"Corpii B-Type Adaptive Nano Plating": "Corpii B-Type Multispectrum Coating",
"Centii B-Type Adaptive Nano Plating": "Centii B-Type Multispectrum Coating",
"Corpii A-Type Adaptive Nano Plating": "Corpii A-Type Multispectrum Coating",
"Centii A-Type Adaptive Nano Plating": "Centii A-Type Multispectrum Coating",
"Corpii C-Type Kinetic Plating": "Corpii C-Type Kinetic Coating",
"Centii C-Type Kinetic Plating": "Centii C-Type Kinetic Coating",
"Corpii C-Type Explosive Plating": "Corpii C-Type Explosive Coating",
"Centii C-Type Explosive Plating": "Centii C-Type Explosive Coating",
"Corpii C-Type EM Plating": "Corpii C-Type EM Coating",
"Centii C-Type EM Plating": "Centii C-Type EM Coating",
"Corpii C-Type Thermal Plating": "Corpii C-Type Thermal Coating",
"Centii C-Type Thermal Plating": "Centii C-Type Thermal Coating",
"Corpii B-Type Thermal Plating": "Corpii B-Type Thermal Coating",
"Centii B-Type Thermal Plating": "Centii B-Type Thermal Coating",
"Corpii B-Type Kinetic Plating": "Corpii B-Type Kinetic Coating",
"Centii B-Type Kinetic Plating": "Centii B-Type Kinetic Coating",
"Corpii B-Type Explosive Plating": "Corpii B-Type Explosive Coating",
"Centii B-Type Explosive Plating": "Centii B-Type Explosive Coating",
"Corpii B-Type EM Plating": "Corpii B-Type EM Coating",
"Centii B-Type EM Plating": "Centii B-Type EM Coating",
"Corpii A-Type Kinetic Plating": "Corpii A-Type Kinetic Coating",
"Centii A-Type Kinetic Plating": "Centii A-Type Kinetic Coating",
"Corpii A-Type Explosive Plating": "Corpii A-Type Explosive Coating",
"Centii A-Type Explosive Plating": "Centii A-Type Explosive Coating",
"Corpii A-Type EM Plating": "Corpii A-Type EM Coating",
"Centii A-Type EM Plating": "Centii A-Type EM Coating",
"Corpii A-Type Thermal Plating": "Corpii A-Type Thermal Coating",
"Centii A-Type Thermal Plating": "Centii A-Type Thermal Coating",
"Coreli C-Type Adaptive Nano Plating": "Coreli C-Type Multispectrum Coating",
"Coreli C-Type Kinetic Plating": "Coreli C-Type Kinetic Coating",
"Coreli C-Type Explosive Plating": "Coreli C-Type Explosive Coating",
"Coreli C-Type EM Plating": "Coreli C-Type EM Coating",
"Coreli C-Type Thermal Plating": "Coreli C-Type Thermal Coating",
"Coreli B-Type Adaptive Nano Plating": "Coreli B-Type Multispectrum Coating",
"Coreli B-Type Kinetic Plating": "Coreli B-Type Kinetic Coating",
"Coreli B-Type Explosive Plating": "Coreli B-Type Explosive Coating",
"Coreli B-Type EM Plating": "Coreli B-Type EM Coating",
"Coreli B-Type Thermal Plating": "Coreli B-Type Thermal Coating",
"Coreli A-Type Adaptive Nano Plating": "Coreli A-Type Multispectrum Coating",
"Coreli A-Type Kinetic Plating": "Coreli A-Type Kinetic Coating",
"Coreli A-Type Explosive Plating": "Coreli A-Type Explosive Coating",
"Coreli A-Type EM Plating": "Coreli A-Type EM Coating",
"Coreli A-Type Thermal Plating": "Coreli A-Type Thermal Coating",
"Khanid Navy Adaptive Nano Plating": "Khanid Navy Multispectrum Coating",
"Khanid Navy Kinetic Plating": "Khanid Navy Kinetic Coating",
"Khanid Navy Explosive Plating": "Khanid Navy Explosive Coating",
"Khanid Navy EM Plating": "Khanid Navy EM Coating",
"Khanid Navy Thermal Plating": "Khanid Navy Thermal Coating",
"Ammatar Navy Thermal Plating": "Ammatar Navy Thermal Coating",
"Low-Grade Mimesis Alpha": "Low-grade Mimesis Alpha",
"Low-Grade Mimesis Beta": "Low-grade Mimesis Beta",
"Low-Grade Mimesis Gamma": "Low-grade Mimesis Gamma",
"Low-Grade Mimesis Delta": "Low-grade Mimesis Delta",
"Low-Grade Mimesis Epsilon": "Low-grade Mimesis Epsilon",
"Low-Grade Mimesis Omega": "Low-grade Mimesis Omega",
"Mid-Grade Mimesis Alpha": "Mid-grade Mimesis Alpha",
"Mid-Grade Mimesis Beta": "Mid-grade Mimesis Beta",
"Mid-Grade Mimesis Gamma": "Mid-grade Mimesis Gamma",
"Mid-Grade Mimesis Delta": "Mid-grade Mimesis Delta",
"Mid-Grade Mimesis Epsilon": "Mid-grade Mimesis Epsilon",
"Mid-Grade Mimesis Omega": "Mid-grade Mimesis Omega",
"High-Grade Mimesis Alpha": "High-grade Mimesis Alpha",
"High-Grade Mimesis Beta": "High-grade Mimesis Beta",
"High-Grade Mimesis Delta": "High-grade Mimesis Delta",
"High-Grade Mimesis Epsilon": "High-grade Mimesis Epsilon",
"High-Grade Mimesis Gamma": "High-grade Mimesis Gamma",
"High-Grade Mimesis Omega": "High-grade Mimesis Omega",
# Converted items
"Limited Layered Plating I": "Upgraded Layered Coating I",
"'Scarab' Layered Plating I": "Upgraded Layered Coating I",
"'Grail' Layered Plating I": "Upgraded Layered Coating I",
"Limited Adaptive Nano Plating I": "Upgraded Multispectrum Coating I",
"'Collateral' Adaptive Nano Plating I": "Upgraded Multispectrum Coating I",
"'Refuge' Adaptive Nano Plating I": "Upgraded Multispectrum Coating I",
"Limited EM Plating I": "Upgraded EM Coating I",
"'Contour' EM Plating I": "Upgraded EM Coating I",
"'Spiegel' EM Plating I": "Upgraded EM Coating I",
"Limited Explosive Plating I": "Upgraded Explosive Coating I",
"Experimental Explosive Plating I": "Upgraded Explosive Coating I",
"'Aegis' Explosive Plating I": "Upgraded Explosive Coating I",
"Limited Kinetic Plating I": "Upgraded Kinetic Coating I",
"Experimental Kinetic Plating I": "Upgraded Kinetic Coating I",
"'Element' Kinetic Plating I": "Upgraded Kinetic Coating I",
"Limited Thermal Plating I": "Upgraded Thermal Coating I",
"Experimental Thermal Plating I": "Upgraded Thermal Coating I",
"Prototype Thermal Plating I": "Upgraded Thermal Coating I"
}

View File

@@ -1,5 +1,5 @@
"""
Conversion pack for May 2020 release
Conversion pack for June 2020 release
"""
CONVERSIONS = {

View File

@@ -0,0 +1,12 @@
"""
Conversion pack for September 2020 release
"""
CONVERSIONS = {
# Renamed items
"'Stalwart' Particle Field Magnifier": "Stalwart Restrained Shield Boost Amplifier",
"'Copasetic' Particle Field Acceleration": "Copasetic Compact Shield Boost Amplifier",
# Converted items
"5a Prototype Shield Support I": "Stalwart Restrained Shield Boost Amplifier",
"Ionic Field Accelerator I": "Copasetic Compact Shield Boost Amplifier"
}

View File

@@ -447,7 +447,7 @@ class Fit:
dp = sDP.getDamagePattern("Selected Ammo")
if dp is None:
dp = es_DamagePattern()
dp.name = "Selected Ammo"
dp.rawName = "Selected Ammo"
fit = eos.db.getFit(fitID)
for attr in ("em", "thermal", "kinetic", "explosive"):

View File

@@ -580,13 +580,22 @@ anti\-:
# Armor modules
eanm:
- 'eanm'
- 'energized adaptive nano membrane'
- 'multispectrum energized membrane'
enam: # mistype of "eanm"
- 'enam'
- 'energized adaptive nano membrane'
- 'multispectrum energized membrane'
mem:
- 'mem'
- 'multispectrum energized membrane'
anp:
- 'anp'
- 'adaptive nano plating'
- 'multispectrum coating'
mc:
- 'mc'
- 'multispectrum coating'
plating:
- 'plating'
- 'coating'
rah:
- 'rah'
- 'reactive armor hardener'
@@ -618,6 +627,15 @@ laar:
caar:
- 'caar'
- 'capital ancillary (.+ )?(?<!remote )armor repairer'
25k:
- '25k'
- '25000'
25kmm:
- '25kmm'
- '25000mm'
25m:
- '25m'
- '25000mm'
# Hull modules
dc:
@@ -640,6 +658,18 @@ cehe:
- 'capital (.+ )?emergency hull energizer'
# Propulsion modules and upgrades
10k:
- '10k'
- '10000'
10kmn:
- '10kmn'
- '10000mn'
50k:
- '50k'
- '50000'
50kmn:
- '50kmn'
- '50000mn'
ab:
- '(^| )ab' # Checking only beginning of a word to remove unwanted spam
- 'afterburner'
@@ -806,11 +836,11 @@ damp:
- 'sd-\d00'
sd:
- '(^| )sd' # Checking only beginning of a word to remove unwanted spam
- 'remote sensor dampener'
- 'sensor dampener'
- '(targeting range|scan resolution) dampening script'
rsd:
- 'rsd'
- 'remote sensor dampener'
- 'sensor dampener'
- 'sd-\d00'
- '(targeting range|scan resolution) dampening script'

View File

@@ -721,8 +721,9 @@ class Market:
groupItems = set(group.items)
if hasattr(group, 'addItems'):
groupItems.update(group.addItems)
items = set(
[item for item in groupItems if self.getPublicityByItem(item) and self.getGroupByItem(item) == group])
items = set([
item for item in groupItems
if self.getPublicityByItem(item) and self.getGroupByItem(item) == group])
return items
def getItemsByMarketGroup(self, mg, vars_=True):

View File

@@ -1 +1 @@
__all__ = ['evemarketer', 'evepraisal', 'evemarketdata', 'fuzzwork']
__all__ = ['evemarketer', 'evepraisal', 'evemarketdata', 'fuzzwork', 'cevemarket']

View File

@@ -0,0 +1,89 @@
# =============================================================================
# Copyright (C) 2020 Copy Liu
#
# This file is part of pyfa.
#
# pyfa is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# pyfa is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with pyfa. If not, see <http://www.gnu.org/licenses/>.
# =============================================================================
from xml.dom import minidom
from logbook import Logger
from eos.saveddata.price import PriceStatus
from service.network import Network
from service.price import Price
pyfalog = Logger(__name__)
class CEveMarketBase:
@staticmethod
def fetchPrices(priceMap, fetchTimeout, system=None, serenity=False):
params = {'typeid': {typeID for typeID in priceMap}}
if system is not None:
params['usesystem'] = system
baseurl = 'https://www.ceve-market.org/api/marketstat' if serenity else 'https://www.ceve-market.org/tqapi/marketstat'
network = Network.getInstance()
data = network.get(url=baseurl, type=network.PRICES, params=params, timeout=fetchTimeout)
xml = minidom.parseString(data.text)
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, skip the item
try:
percprice = float(sell.getElementsByTagName('percentile').item(0).firstChild.data)
except (TypeError, ValueError):
pyfalog.warning('Failed to get price for: {0}', type_)
continue
if percprice == 0 and system is not None:
continue
priceMap[typeID].update(PriceStatus.fetchSuccess, percprice)
del priceMap[typeID]
class CEveMarketTq(CEveMarketBase):
name = 'ceve-market.org (Tranquility)'
group = 'tranquility'
def __init__(self, priceMap, system, fetchTimeout):
# Try selected system first
self.fetchPrices(priceMap, max(2 * fetchTimeout / 3, 2), system, serenity=False)
# If price was not available - try globally
if priceMap:
self.fetchPrices(priceMap, max(fetchTimeout / 3, 2), serenity=False)
class CEveMarketCn(CEveMarketBase):
name = 'ceve-market.org (Serenity)'
group = 'serenity'
def __init__(self, priceMap, system, fetchTimeout):
# Try selected system first
self.fetchPrices(priceMap, max(2 * fetchTimeout / 3, 2), system, serenity=True)
# If price was not available - try globally
if priceMap:
self.fetchPrices(priceMap, max(fetchTimeout / 3, 2), serenity=True)
Price.register(CEveMarketCn)
Price.register(CEveMarketTq)

View File

@@ -32,6 +32,7 @@ pyfalog = Logger(__name__)
class EveMarketData:
name = 'eve-marketdata.com'
group = 'tranquility'
def __init__(self, priceMap, system, fetchTimeout):
# Try selected system first

View File

@@ -32,6 +32,7 @@ pyfalog = Logger(__name__)
class EveMarketer:
name = 'evemarketer'
group = 'tranquility'
def __init__(self, priceMap, system, fetchTimeout):
# Try selected system first

View File

@@ -38,6 +38,7 @@ systemAliases = {
class EvePraisal:
name = 'evepraisal'
group = 'tranquility'
def __init__(self, priceMap, system, fetchTimeout):
# Try selected system first

View File

@@ -39,6 +39,7 @@ locations = {
class FuzzworkMarket:
name = 'fuzzwork market'
group = 'tranquility'
def __init__(self, priceMap, system, fetchTimeout):
# Try selected system first

View File

@@ -598,7 +598,7 @@ def _importCreateFit(lines):
"""Create fit and set top-level entity (ship or citadel)."""
fit = Fit()
header = lines.pop(0)
m = re.match('\[(?P<shipType>[\w\s]+),\s*(?P<fitName>.+)\]', header)
m = re.match('\[(?P<shipType>[^,]+),\s*(?P<fitName>.+)\]', header)
if not m:
pyfalog.warning('service.port.eft.importEft: corrupted fit header')
raise EftImportError

View File

@@ -56,7 +56,7 @@ INV_FLAG_DRONEBAY = 87
INV_FLAG_FIGHTER = 158
def exportESI(ofit, callback):
def exportESI(ofit, exportCharges, callback):
# A few notes:
# max fit name length is 50 characters
# Most keys are created simply because they are required, but bogus data is okay
@@ -72,7 +72,7 @@ def exportESI(ofit, callback):
# 2017/03/29 NOTE: "<" or "&lt;" is Ignored
# fit['description'] = "<pyfa:%d />" % ofit.ID
fit['description'] = ofit.notes[:397] + '...' if len(ofit.notes) > 400 else ofit.notes if ofit.notes is not None else ""
fit['description'] = "" if ofit.notes is None else ofit.notes[:397] + '...' if len(ofit.notes) > 400 else ofit.notes
fit['items'] = []
slotNum = {}
@@ -99,7 +99,7 @@ def exportESI(ofit, callback):
item['type_id'] = module.item.ID
fit['items'].append(item)
if module.charge:
if module.charge and exportCharges:
if module.chargeID not in charges:
charges[module.chargeID] = 0
# `or 1` because some charges (ie scripts) are without qty

View File

@@ -314,8 +314,8 @@ class Port:
return importESI(string)
@staticmethod
def exportESI(fit, callback=None):
return exportESI(fit, callback=callback)
def exportESI(fit, exportCharges, callback=None):
return exportESI(fit, exportCharges, callback=callback)
# XML-related methods
@staticmethod

View File

@@ -106,6 +106,9 @@ class Price:
# attempt to find user's selected price source, otherwise get first one
sourceAll = list(cls.sources.keys())
sourcePrimary = sFit.serviceFittingOptions["priceSource"] if sFit.serviceFittingOptions["priceSource"] in sourceAll else sourceAll[0]
# When we have picked primary source, make sure to include only sources from the same group to avoid fetching
# tranquility data for serenity or vice versa
sourceAll = list(n for n, s in cls.sources.items() if s.group == cls.sources[sourcePrimary].group)
# Format: {source name: timeout weight}
sources = {sourcePrimary: len(sourceAll)}
@@ -273,4 +276,4 @@ class PriceWorkerThread(threading.Thread):
# Import market sources only to initialize price source modules, they register on their own
from service.marketSources import evemarketer, evemarketdata, evepraisal, fuzzwork # noqa: E402
from service.marketSources import evemarketer, evemarketdata, evepraisal, fuzzwork, cevemarket # noqa: E402

View File

@@ -370,7 +370,8 @@ class EsiSettings:
"loginMode": 0,
"clientID": "",
"clientSecret": "",
"timeout": 60}
"timeout": 60,
"exportCharges": True}
self.settings = SettingsProvider.getInstance().getSettings(
"pyfaServiceEsiSettings",

View File

@@ -7353,8 +7353,7 @@
"displayName": "Meta Level",
"displayNameID": 233633,
"highIsGood": 1,
"iconID": 0,
"name": "metaLevel",
"name": "metaLevelOld",
"published": 1,
"stackable": 1,
"unitID": 140
@@ -25853,7 +25852,7 @@
"displayName": "Missile Damage Bonus",
"displayNameID": 311932,
"highIsGood": 1,
"iconID": 0,
"iconID": 1397,
"name": "siegeMissileDamageBonus",
"published": 1,
"stackable": 1,
@@ -26320,7 +26319,7 @@
"displayName": "Armor Repairer / Shield Booster Duration Bonus",
"displayNameID": 312084,
"highIsGood": 1,
"iconID": 0,
"iconID": 2104,
"name": "siegeLocalLogisticsDurationBonus",
"published": 1,
"stackable": 1,
@@ -26335,7 +26334,7 @@
"displayName": "Armor Repairer / Shield Booster Amount Bonus",
"displayNameID": 312085,
"highIsGood": 1,
"iconID": 0,
"iconID": 2104,
"name": "siegeLocalLogisticsAmountBonus",
"published": 1,
"stackable": 1,
@@ -32497,6 +32496,46 @@
"published": 0,
"stackable": 1
},
"3050": {
"attributeID": 3050,
"dataType": 4,
"defaultValue": 2.0,
"description": "The amount of fleets needed for a single pvp filament match ",
"highIsGood": 0,
"name": "AmountOfFleetsPerMatch",
"published": 0,
"stackable": 0
},
"3051": {
"attributeID": 3051,
"categoryID": 17,
"dataType": 5,
"defaultValue": 1000.0,
"description": "The range players in fleet need to be within fleet member doing an action",
"displayName": "Area Effect Radius",
"displayNameID": 564554,
"highIsGood": 1,
"iconID": 1391,
"name": "FleetMemberPickupRadius",
"published": 1,
"stackable": 1,
"tooltipTitleID": 564555,
"unitID": 1
},
"3052": {
"attributeID": 3052,
"categoryID": 17,
"dataType": 4,
"defaultValue": 1.0,
"description": "Amount of players in fleet needed to be valid",
"displayName": "Number Of Ships required",
"displayNameID": 564556,
"highIsGood": 1,
"iconID": 1391,
"name": "FleetMembersNeeded",
"published": 1,
"stackable": 1
},
"3093": {
"attributeID": 3093,
"dataType": 4,
@@ -32506,5 +32545,50 @@
"name": "showSystemInfoBubble",
"published": 0,
"stackable": 0
},
"3095": {
"attributeID": 3095,
"categoryID": 7,
"dataType": 5,
"defaultValue": 0.0,
"displayName": "Probe Strength Bonus",
"displayNameID": 568981,
"highIsGood": 1,
"name": "scanProbeStrengthBonus",
"published": 1,
"stackable": 0,
"unitID": 105
},
"3098": {
"attributeID": 3098,
"dataType": 5,
"defaultValue": 0.0,
"highIsGood": 0,
"name": "armorRepairDurationBonus",
"published": 0,
"stackable": 0
},
"3099": {
"attributeID": 3099,
"dataType": 5,
"defaultValue": 0.0,
"highIsGood": 0,
"name": "shieldBoosterDurationBonus",
"published": 0,
"stackable": 0
},
"3101": {
"attributeID": 3101,
"categoryID": 1,
"dataType": 11,
"defaultValue": 0.0,
"description": "Describes which type of deed fits in this structure",
"displayName": "Quantum Core Type",
"displayNameID": 569361,
"highIsGood": 0,
"name": "structureRequiresDeedType",
"published": 1,
"stackable": 0,
"unitID": 116
}
}

View File

@@ -40835,8 +40835,6 @@
"rangeChance": 0
},
"5229": {
"description": "Automatically generated effect",
"descriptionID": 286583,
"disallowAutoRepeat": 0,
"effectCategory": 0,
"effectID": 5229,
@@ -44807,7 +44805,7 @@
"disallowAutoRepeat": 0,
"effectCategory": 0,
"effectID": 5503,
"effectName": "eliteBonusCommandShipHeavyDroneTrackingCS2",
"effectName": "eliteBonusCommandShipDroneTrackingCS2",
"electronicChance": 0,
"isAssistance": 0,
"isOffensive": 0,
@@ -44819,7 +44817,7 @@
"modifiedAttributeID": 160,
"modifyingAttributeID": 999,
"operation": 6,
"skillTypeID": 3441
"skillTypeID": 3436
}
],
"propulsionChance": 0,
@@ -77788,9 +77786,8 @@
"disallowAutoRepeat": 0,
"effectCategory": 7,
"effectID": 7237,
"effectName": "\tsystemWarpSpeed",
"effectName": "systemWarpSpeedBonus",
"electronicChance": 0,
"guid": "",
"isAssistance": 0,
"isOffensive": 0,
"isWarpSafe": 0,
@@ -79064,5 +79061,487 @@
"propulsionChance": 0,
"published": 0,
"rangeChance": 0
},
"8068": {
"disallowAutoRepeat": 0,
"effectCategory": 0,
"effectID": 8068,
"effectName": "shipShieldResistanceBonusMBC1",
"electronicChance": 0,
"isAssistance": 0,
"isOffensive": 0,
"isWarpSafe": 0,
"modifierInfo": [
{
"domain": "shipID",
"func": "ItemModifier",
"modifiedAttributeID": 271,
"modifyingAttributeID": 748,
"operation": 6
},
{
"domain": "shipID",
"func": "ItemModifier",
"modifiedAttributeID": 274,
"modifyingAttributeID": 748,
"operation": 6
},
{
"domain": "shipID",
"func": "ItemModifier",
"modifiedAttributeID": 272,
"modifyingAttributeID": 748,
"operation": 6
},
{
"domain": "shipID",
"func": "ItemModifier",
"modifiedAttributeID": 273,
"modifyingAttributeID": 748,
"operation": 6
}
],
"propulsionChance": 0,
"published": 0,
"rangeChance": 0
},
"8070": {
"disallowAutoRepeat": 0,
"effectCategory": 0,
"effectID": 8070,
"effectName": "eliteBonusCommandShipsHeavyHAMvelocityCS2",
"electronicChance": 0,
"isAssistance": 0,
"isOffensive": 0,
"isWarpSafe": 0,
"modifierInfo": [
{
"domain": "charID",
"func": "OwnerRequiredSkillModifier",
"modifiedAttributeID": 37,
"modifyingAttributeID": 999,
"operation": 6,
"skillTypeID": 3324
},
{
"domain": "charID",
"func": "OwnerRequiredSkillModifier",
"modifiedAttributeID": 37,
"modifyingAttributeID": 999,
"operation": 6,
"skillTypeID": 25719
}
],
"propulsionChance": 0,
"published": 0,
"rangeChance": 0
},
"8071": {
"disallowAutoRepeat": 0,
"effectCategory": 0,
"effectID": 8071,
"effectName": " eliteBonusCommandShipDroneRangeCS1",
"electronicChance": 0,
"isAssistance": 0,
"isOffensive": 0,
"isWarpSafe": 0,
"modifierInfo": [
{
"domain": "charID",
"func": "OwnerRequiredSkillModifier",
"modifiedAttributeID": 54,
"modifyingAttributeID": 1000,
"operation": 6,
"skillTypeID": 3436
}
],
"propulsionChance": 0,
"published": 0,
"rangeChance": 0
},
"8072": {
"disallowAutoRepeat": 0,
"effectCategory": 0,
"effectID": 8072,
"effectName": "shipArmorResistanceBonusGBC2",
"electronicChance": 0,
"isAssistance": 0,
"isOffensive": 0,
"isWarpSafe": 0,
"modifierInfo": [
{
"domain": "shipID",
"func": "ItemModifier",
"modifiedAttributeID": 267,
"modifyingAttributeID": 746,
"operation": 6
},
{
"domain": "shipID",
"func": "ItemModifier",
"modifiedAttributeID": 270,
"modifyingAttributeID": 746,
"operation": 6
},
{
"domain": "shipID",
"func": "ItemModifier",
"modifiedAttributeID": 268,
"modifyingAttributeID": 746,
"operation": 6
},
{
"domain": "shipID",
"func": "ItemModifier",
"modifiedAttributeID": 269,
"modifyingAttributeID": 746,
"operation": 6
}
],
"propulsionChance": 0,
"published": 0,
"rangeChance": 0
},
"8073": {
"disallowAutoRepeat": 0,
"effectCategory": 0,
"effectID": 8073,
"effectName": "eliteBonusCommandShipShieldHPCS1",
"electronicChance": 0,
"isAssistance": 0,
"isOffensive": 0,
"isWarpSafe": 0,
"modifierInfo": [
{
"domain": "shipID",
"func": "ItemModifier",
"modifiedAttributeID": 263,
"modifyingAttributeID": 1000,
"operation": 6
}
],
"propulsionChance": 0,
"published": 0,
"rangeChance": 0
},
"8074": {
"disallowAutoRepeat": 0,
"effectCategory": 0,
"effectID": 8074,
"effectName": "shipBonusPC2maxRange",
"electronicChance": 0,
"isAssistance": 0,
"isOffensive": 0,
"isWarpSafe": 0,
"modifierInfo": [
{
"domain": "shipID",
"func": "LocationRequiredSkillModifier",
"modifiedAttributeID": 54,
"modifyingAttributeID": 2765,
"operation": 6,
"skillTypeID": 47871
}
],
"propulsionChance": 0,
"published": 0,
"rangeChance": 0
},
"8075": {
"disallowAutoRepeat": 0,
"effectCategory": 7,
"effectID": 8075,
"effectName": "systemHullEmResistance",
"electronicChance": 0,
"isAssistance": 0,
"isOffensive": 0,
"isWarpSafe": 0,
"modifierInfo": [
{
"domain": "shipID",
"func": "ItemModifier",
"modifiedAttributeID": 113,
"modifyingAttributeID": 984,
"operation": 6
}
],
"propulsionChance": 0,
"published": 0,
"rangeChance": 0
},
"8076": {
"disallowAutoRepeat": 0,
"effectCategory": 7,
"effectID": 8076,
"effectName": "systemHullThermalResistance",
"electronicChance": 0,
"isAssistance": 0,
"isOffensive": 0,
"isWarpSafe": 0,
"modifierInfo": [
{
"domain": "shipID",
"func": "ItemModifier",
"modifiedAttributeID": 110,
"modifyingAttributeID": 987,
"operation": 6
}
],
"propulsionChance": 0,
"published": 0,
"rangeChance": 0
},
"8077": {
"disallowAutoRepeat": 0,
"effectCategory": 7,
"effectID": 8077,
"effectName": "systemHullKineticResistance",
"electronicChance": 0,
"isAssistance": 0,
"isOffensive": 0,
"isWarpSafe": 0,
"modifierInfo": [
{
"domain": "shipID",
"func": "ItemModifier",
"modifiedAttributeID": 109,
"modifyingAttributeID": 986,
"operation": 6
}
],
"propulsionChance": 0,
"published": 0,
"rangeChance": 0
},
"8078": {
"disallowAutoRepeat": 0,
"effectCategory": 7,
"effectID": 8078,
"effectName": "systemHullExplosiveResistance",
"electronicChance": 0,
"isAssistance": 0,
"isOffensive": 0,
"isWarpSafe": 0,
"modifierInfo": [
{
"domain": "shipID",
"func": "ItemModifier",
"modifiedAttributeID": 111,
"modifyingAttributeID": 985,
"operation": 6
}
],
"propulsionChance": 0,
"published": 0,
"rangeChance": 0
},
"8079": {
"disallowAutoRepeat": 0,
"effectCategory": 7,
"effectID": 8079,
"effectName": "systemVirusCoherenceBonus",
"electronicChance": 0,
"isAssistance": 0,
"isOffensive": 0,
"isWarpSafe": 0,
"modifierInfo": [
{
"domain": "shipID",
"func": "LocationRequiredSkillModifier",
"modifiedAttributeID": 1909,
"modifyingAttributeID": 1915,
"operation": 2,
"skillTypeID": 13278
},
{
"domain": "shipID",
"func": "LocationRequiredSkillModifier",
"modifiedAttributeID": 1909,
"modifyingAttributeID": 1915,
"operation": 2,
"skillTypeID": 21718
}
],
"propulsionChance": 0,
"published": 0,
"rangeChance": 0
},
"8080": {
"disallowAutoRepeat": 0,
"effectCategory": 7,
"effectID": 8080,
"effectName": "systemProbeStrengthBonus",
"electronicChance": 0,
"isAssistance": 0,
"isOffensive": 0,
"isWarpSafe": 0,
"modifierInfo": [
{
"domain": "charID",
"func": "OwnerRequiredSkillModifier",
"modifiedAttributeID": 1371,
"modifyingAttributeID": 3095,
"operation": 6,
"skillTypeID": 3412
}
],
"propulsionChance": 0,
"published": 0,
"rangeChance": 0
},
"8081": {
"disallowAutoRepeat": 0,
"effectCategory": 7,
"effectID": 8081,
"effectName": "systemDisallowCloaking",
"electronicChance": 0,
"isAssistance": 0,
"isOffensive": 0,
"isWarpSafe": 0,
"modifierInfo": [
{
"domain": "shipID",
"func": "ItemModifier",
"modifiedAttributeID": 2454,
"modifyingAttributeID": 2454,
"operation": 2
}
],
"propulsionChance": 0,
"published": 0,
"rangeChance": 0
},
"8082": {
"disallowAutoRepeat": 0,
"effectCategory": 7,
"effectID": 8082,
"effectName": "systemScanResolutionBonus",
"electronicChance": 0,
"isAssistance": 0,
"isOffensive": 0,
"isWarpSafe": 0,
"modifierInfo": [
{
"domain": "shipID",
"func": "ItemModifier",
"modifiedAttributeID": 564,
"modifyingAttributeID": 566,
"operation": 6
}
],
"propulsionChance": 0,
"published": 0,
"rangeChance": 0
},
"8083": {
"disallowAutoRepeat": 0,
"effectCategory": 7,
"effectID": 8083,
"effectName": "systemArmorRepairerDurationBonus",
"electronicChance": 0,
"isAssistance": 0,
"isOffensive": 0,
"isWarpSafe": 0,
"modifierInfo": [
{
"domain": "shipID",
"func": "LocationRequiredSkillModifier",
"modifiedAttributeID": 73,
"modifyingAttributeID": 3098,
"operation": 6,
"skillTypeID": 3393
},
{
"domain": "shipID",
"func": "LocationRequiredSkillModifier",
"modifiedAttributeID": 73,
"modifyingAttributeID": 3098,
"operation": 6,
"skillTypeID": 21803
}
],
"propulsionChance": 0,
"published": 0,
"rangeChance": 0
},
"8084": {
"disallowAutoRepeat": 0,
"effectCategory": 7,
"effectID": 8084,
"effectName": "systemShieldBoosterDurationBonus",
"electronicChance": 0,
"isAssistance": 0,
"isOffensive": 0,
"isWarpSafe": 0,
"modifierInfo": [
{
"domain": "shipID",
"func": "LocationRequiredSkillModifier",
"modifiedAttributeID": 73,
"modifyingAttributeID": 3099,
"operation": 6,
"skillTypeID": 3416
},
{
"domain": "shipID",
"func": "LocationRequiredSkillModifier",
"modifiedAttributeID": 73,
"modifyingAttributeID": 3099,
"operation": 6,
"skillTypeID": 21802
}
],
"propulsionChance": 0,
"published": 0,
"rangeChance": 0
},
"8085": {
"disallowAutoRepeat": 0,
"effectCategory": 7,
"effectID": 8085,
"effectName": "systemFighterExplosionRadius",
"electronicChance": 0,
"isAssistance": 0,
"isOffensive": 0,
"isWarpSafe": 0,
"modifierInfo": [
{
"domain": "charID",
"func": "OwnerRequiredSkillModifier",
"modifiedAttributeID": 2234,
"modifyingAttributeID": 1967,
"operation": 4,
"skillTypeID": 23069
},
{
"domain": "charID",
"func": "OwnerRequiredSkillModifier",
"modifiedAttributeID": 2125,
"modifyingAttributeID": 1967,
"operation": 4,
"skillTypeID": 23069
}
],
"propulsionChance": 0,
"published": 0,
"rangeChance": 0
},
"8088": {
"disallowAutoRepeat": 0,
"dischargeAttributeID": 6,
"distribution": 2,
"durationAttributeID": 51,
"effectCategory": 2,
"effectID": 8088,
"effectName": "EntityChainLightning",
"electronicChance": 0,
"guid": "effects.AttackMode",
"isAssistance": 0,
"isOffensive": 1,
"isWarpSafe": 0,
"propulsionChance": 0,
"published": 0,
"rangeAttributeID": 54,
"rangeChance": 0
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -2519,20 +2519,20 @@
"parentGroupID": 14
},
"540": {
"description": "Mechanically enhanced armor plating augmentation.",
"description": "Armor Resistance Coatings",
"descriptionID": 64722,
"hasTypes": 0,
"iconID": 1030,
"name": "Resistance Plating",
"name": "Armor Resistance Coatings",
"nameID": 65796,
"parentGroupID": 14
},
"541": {
"description": "An advanced form of mechanically enhanced armor plating upgrades.",
"description": "Energized Armor Resistance Membranes",
"descriptionID": 64723,
"hasTypes": 0,
"iconID": 2066,
"name": "Energized Plating",
"name": "Energized Armor Resistance Membranes",
"nameID": 65797,
"parentGroupID": 14
},
@@ -9051,20 +9051,20 @@
"parentGroupID": 214
},
"1543": {
"description": "Blueprints for Energized Plating",
"description": "Blueprints for Energized Armor Membranes",
"descriptionID": 281321,
"hasTypes": 1,
"iconID": 2703,
"name": "Energized Plating",
"name": "Energized Armor Membranes",
"nameID": 281320,
"parentGroupID": 214
},
"1544": {
"description": "Blueprints for Resistance Plating",
"description": "Blueprints for Armor Coatings",
"descriptionID": 281323,
"hasTypes": 1,
"iconID": 2703,
"name": "Resistance Plating",
"name": "Armor Coatings",
"nameID": 281322,
"parentGroupID": 214
},
@@ -9856,56 +9856,56 @@
"parentGroupID": 1659
},
"1665": {
"description": "Thermal Resistance Plating",
"description": "Thermal Coatings",
"descriptionID": 285353,
"hasTypes": 1,
"iconID": 1394,
"name": "Thermal Resistance Plating",
"name": "Thermal Coatings",
"nameID": 285352,
"parentGroupID": 540
},
"1666": {
"description": "Kinetic Resistance Plating",
"description": "Kinetic Coatings",
"descriptionID": 285355,
"hasTypes": 1,
"iconID": 1393,
"name": "Kinetic Resistance Plating",
"name": "Kinetic Coatings",
"nameID": 285354,
"parentGroupID": 540
},
"1667": {
"description": "Explosive Resistance Plating",
"description": "Explosive Coatings",
"descriptionID": 285357,
"hasTypes": 1,
"iconID": 1395,
"name": "Explosive Resistance Plating",
"name": "Explosive Coatings",
"nameID": 285356,
"parentGroupID": 540
},
"1668": {
"description": "EM Resistance Plating",
"description": "EM Coatings",
"descriptionID": 285359,
"hasTypes": 1,
"iconID": 1396,
"name": "EM Resistance Plating",
"name": "EM Coatings",
"nameID": 285358,
"parentGroupID": 540
},
"1669": {
"description": "Layered Plating",
"description": "Layered Armor Coatings",
"descriptionID": 285361,
"hasTypes": 1,
"iconID": 1030,
"name": "Layered Plating",
"name": "Layered Armor Coatings",
"nameID": 285360,
"parentGroupID": 14
},
"1670": {
"description": "Adaptive Resistance Plating",
"description": "Multispectrum Coatings",
"descriptionID": 285363,
"hasTypes": 1,
"iconID": 1030,
"name": "Adaptive Resistance Plating",
"name": "Multispectrum Coatings",
"nameID": 285362,
"parentGroupID": 540
},
@@ -9989,56 +9989,56 @@
"parentGroupID": 535
},
"1682": {
"description": "Energized Explosive Plating",
"description": "Explosive Energized Membranes",
"descriptionID": 285386,
"hasTypes": 1,
"iconID": 1395,
"name": "Energized Explosive Plating",
"name": "Explosive Energized Membranes",
"nameID": 285385,
"parentGroupID": 541
},
"1683": {
"description": "Energized Thermal Plating",
"description": "Thermal Energized Membranes",
"descriptionID": 285388,
"hasTypes": 1,
"iconID": 1394,
"name": "Energized Thermal Plating",
"name": "Thermal Energized Membranes",
"nameID": 285387,
"parentGroupID": 541
},
"1684": {
"description": "Energized EM Plating",
"description": "EM Energized Membranes",
"descriptionID": 285390,
"hasTypes": 1,
"iconID": 1396,
"name": "Energized EM Plating",
"name": "EM Energized Membranes",
"nameID": 285389,
"parentGroupID": 541
},
"1685": {
"description": "Energized Kinetic Plating",
"description": "Kinetic Energized Membranes",
"descriptionID": 285392,
"hasTypes": 1,
"iconID": 1393,
"name": "Energized Kinetic Plating",
"name": "Kinetic Energized Membranes",
"nameID": 285391,
"parentGroupID": 541
},
"1686": {
"description": "Energized Adaptive Plating",
"description": "Multispectrum Energized Membranes",
"descriptionID": 285394,
"hasTypes": 1,
"iconID": 2066,
"name": "Energized Adaptive Plating",
"name": "Multispectrum Energized Membranes",
"nameID": 285393,
"parentGroupID": 541
},
"1687": {
"description": "Energized Armor Layering",
"description": "Layered Energized Armor Membranes",
"descriptionID": 285396,
"hasTypes": 1,
"iconID": 2066,
"name": "Energized Armor Layering",
"name": "Layered Energized Armor Membranes",
"nameID": 285395,
"parentGroupID": 14
},
@@ -15477,10 +15477,10 @@
"parentGroupID": 1031
},
"2480": {
"description": "Data found in Abyssal Deadspace",
"description": "Triglavian Data Storage Devices",
"descriptionID": 317920,
"hasTypes": 1,
"iconID": 2037,
"iconID": 21982,
"name": "Triglavian Data",
"nameID": 317919,
"parentGroupID": 19
@@ -16173,5 +16173,63 @@
"name": "Large",
"nameID": 564569,
"parentGroupID": 2741
},
"2747": {
"description": "Filaments that connect to the Abyssal Proving Grounds for limited time PVP events.",
"descriptionID": 567625,
"hasTypes": 1,
"iconID": 21925,
"name": "Proving Ground Filaments",
"nameID": 567624,
"parentGroupID": 2456
},
"2749": {
"description": "Quantum Cores are FTL communications facillities vital to the efficient operation of Upwell structures.",
"descriptionID": 569752,
"hasTypes": 1,
"iconID": 21729,
"name": "Quantum Cores",
"nameID": 569644,
"parentGroupID": 2202
},
"2750": {
"description": "Capital Astronautic Mutaplasmids",
"descriptionID": 569939,
"hasTypes": 1,
"name": "Capital Astronautic Mutaplasmids",
"nameID": 569938,
"parentGroupID": 2439
},
"2751": {
"description": "Capital Armor Mutaplasmids",
"descriptionID": 569941,
"hasTypes": 1,
"name": "Capital Armor Mutaplasmids",
"nameID": 569940,
"parentGroupID": 2437
},
"2752": {
"description": "Capital Shield Mutaplasmids",
"descriptionID": 569944,
"hasTypes": 1,
"name": "Capital Shield Mutaplasmids",
"nameID": 569943,
"parentGroupID": 2438
},
"2753": {
"description": "Capital Engineering Mutaplasmids",
"descriptionID": 569946,
"hasTypes": 1,
"name": "Capital Engineering Mutaplasmids",
"nameID": 569945,
"parentGroupID": 2440
},
"2754": {
"description": "Siege Module Mutaplasmids",
"descriptionID": 569952,
"hasTypes": 1,
"name": "Siege Module Mutaplasmids",
"nameID": 569951,
"parentGroupID": 2512
}
}

View File

@@ -728,7 +728,7 @@
"3394": 4
},
"1292": {
"3392": 1
"3392": 2
},
"1294": {
"3394": 1
@@ -19957,6 +19957,21 @@
"33529": {
"3411": 5
},
"33530": {
"21718": 1
},
"33531": {
"21718": 1
},
"33532": {
"21718": 1
},
"33533": {
"21718": 1
},
"33534": {
"21718": 1
},
"33553": {
"3332": 2,
"3335": 2
@@ -25573,5 +25588,133 @@
},
"55700": {
"3402": 1
},
"55747": {
"3402": 1
},
"55803": {
"3402": 1
},
"55804": {
"3402": 1
},
"55805": {
"3402": 1
},
"55806": {
"3402": 1
},
"55826": {
"3402": 1
},
"55859": {
"3402": 1
},
"55860": {
"3394": 3
},
"55862": {
"3394": 3
},
"55927": {
"3402": 1
},
"55928": {
"3402": 1
},
"55929": {
"3402": 1
},
"55942": {
"3402": 1
},
"55943": {
"3402": 1
},
"55944": {
"3402": 1
},
"55945": {
"3402": 1
},
"55946": {
"3402": 1
},
"55947": {
"3402": 1
},
"55977": {
"3402": 1
},
"56128": {
"3402": 1
},
"56129": {
"3402": 1
},
"56130": {
"3402": 1
},
"56179": {
"3402": 1
},
"56180": {
"3402": 1
},
"56181": {
"3402": 1
},
"56182": {
"3402": 1
},
"56183": {
"3402": 1
},
"56184": {
"3402": 1
},
"56185": {
"3402": 1
},
"56186": {
"3402": 1
},
"56187": {
"3402": 1
},
"56303": {
"3435": 5,
"3449": 5
},
"56304": {
"3435": 5
},
"56305": {
"3450": 4
},
"56306": {
"3454": 4
},
"56307": {
"21803": 4
},
"56308": {
"3392": 3,
"21803": 1
},
"56309": {
"21802": 4
},
"56310": {
"21802": 4
},
"56311": {
"3423": 5
},
"56312": {
"3423": 5
},
"56313": {
"22043": 1
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1373,39 +1373,33 @@
},
"80": {
"aggregateMode": "Minimum",
"developerDescription": "AOE_Beacon_caustic_cloud_local_repair",
"displayName": "Local Armor Repairer penalty",
"developerDescription": "AOE_Beacon_caustic_cloud_inertia",
"displayName": "Inertia Bonus",
"displayNameID": 532902,
"itemModifiers": [],
"locationGroupModifiers": [],
"locationModifiers": [],
"locationRequiredSkillModifiers": [
"itemModifiers": [
{
"dogmaAttributeID": 84,
"skillID": 3393
"dogmaAttributeID": 70
}
],
"locationGroupModifiers": [],
"locationModifiers": [],
"locationRequiredSkillModifiers": [],
"operationName": "PostPercent",
"showOutputValueInUI": "ShowNormal"
},
"81": {
"aggregateMode": "Minimum",
"developerDescription": "AOE_Beacon_caustic_cloud_remote_repair",
"displayName": "Remote Armor Repairer penalty",
"developerDescription": "AOE_Beacon_caustic_cloud_velocity",
"displayName": "Max Velocity Bonus",
"displayNameID": 532901,
"itemModifiers": [
{
"dogmaAttributeID": 84
"dogmaAttributeID": 37
}
],
"locationGroupModifiers": [],
"locationModifiers": [],
"locationRequiredSkillModifiers": [
{
"dogmaAttributeID": 84,
"skillID": 16069
}
],
"locationRequiredSkillModifiers": [],
"operationName": "PostPercent",
"showOutputValueInUI": "ShowNormal"
},

View File

@@ -4646,7 +4646,7 @@
"groupName": "Money",
"groupNameID": 63592,
"iconID": 21,
"published": false,
"published": true,
"useBasePrice": false
},
"170": {
@@ -7177,7 +7177,7 @@
"groupName": "Triglavian Data",
"groupNameID": 536625,
"published": true,
"useBasePrice": false
"useBasePrice": true
},
"1996": {
"anchorable": false,
@@ -8450,7 +8450,7 @@
"categoryID": 7,
"fittableNonSingleton": false,
"groupID": 326,
"groupName": "Armor Plating Energized",
"groupName": "Energized Armor Membrane",
"groupNameID": 63791,
"iconID": 0,
"published": true,
@@ -9567,6 +9567,17 @@
"published": false,
"useBasePrice": false
},
"4050": {
"anchorable": false,
"anchored": false,
"categoryID": 17,
"fittableNonSingleton": false,
"groupID": 4050,
"groupName": "Abyssal Proving Filaments",
"groupNameID": 559431,
"published": true,
"useBasePrice": false
},
"4052": {
"anchorable": false,
"anchored": false,
@@ -9631,7 +9642,7 @@
"groupID": 4060,
"groupName": "Vorton Projector",
"groupNameID": 563701,
"published": false,
"published": true,
"useBasePrice": false
},
"4061": {
@@ -9642,7 +9653,7 @@
"groupID": 4061,
"groupName": "Advanced Condenser Pack",
"groupNameID": 563793,
"published": false,
"published": true,
"useBasePrice": false
},
"4062": {
@@ -9653,7 +9664,7 @@
"groupID": 4062,
"groupName": "Condenser Pack",
"groupNameID": 563792,
"published": false,
"published": true,
"useBasePrice": false
},
"4064": {
@@ -9664,7 +9675,7 @@
"groupID": 4064,
"groupName": "Vorton Projector Blueprint",
"groupNameID": 564057,
"published": false,
"published": true,
"useBasePrice": false
},
"4065": {
@@ -9675,7 +9686,7 @@
"groupID": 4065,
"groupName": "Condenser Pack Blueprint",
"groupNameID": 564058,
"published": false,
"published": true,
"useBasePrice": false
},
"4066": {
@@ -9686,7 +9697,7 @@
"groupID": 4066,
"groupName": "Advanced Condenser Pack Blueprint",
"groupNameID": 564059,
"published": false,
"published": true,
"useBasePrice": false
},
"4067": {
@@ -9697,7 +9708,7 @@
"groupID": 4067,
"groupName": "Vorton Projector Upgrade",
"groupNameID": 564488,
"published": false,
"published": true,
"useBasePrice": false
},
"4069": {
@@ -9708,7 +9719,7 @@
"groupID": 4069,
"groupName": "Vorton Projector Upgrade Blueprints",
"groupNameID": 564489,
"published": false,
"published": true,
"useBasePrice": false
},
"407": {
@@ -9756,6 +9767,18 @@
"published": true,
"useBasePrice": false
},
"4073": {
"anchorable": false,
"anchored": true,
"categoryID": 11,
"fittableNonSingleton": false,
"groupID": 4073,
"groupName": "Temporary Collidable Structure",
"groupNameID": 567507,
"iconID": 0,
"published": false,
"useBasePrice": false
},
"408": {
"anchorable": false,
"anchored": false,
@@ -9768,6 +9791,17 @@
"published": true,
"useBasePrice": true
},
"4086": {
"anchorable": false,
"anchored": false,
"categoryID": 66,
"fittableNonSingleton": false,
"groupID": 4086,
"groupName": "Quantum Cores",
"groupNameID": 569641,
"published": true,
"useBasePrice": true
},
"409": {
"anchorable": false,
"anchored": false,

File diff suppressed because it is too large Load Diff

View File

@@ -1,10 +1,10 @@
[
{
"field_name": "client_build",
"field_value": 1748920
"field_value": 1801413
},
{
"field_name": "dump_time",
"field_value": 1592209279
"field_value": 1599630922
}
]

View File

@@ -73,8 +73,8 @@
"text": "bonus to Heavy Missile and Heavy Assault Missile Launcher rate of fire"
},
{
"number": "5%",
"text": "bonus to Heavy Missile and Heavy Assault Missile explosion velocity"
"number": "10%",
"text": "bonus to Heavy Missile and Heavy Assault Missile velocity"
},
{
"number": "3%",
@@ -90,8 +90,8 @@
"text": "bonus to Heavy Missile and Heavy Assault Missile Launcher rate of fire"
},
{
"number": "7.5%",
"text": "bonus to Shield Booster amount"
"number": "4%",
"text": "bonus to all shield resistances"
}
],
"header": "Minmatar Battlecruiser bonuses (per skill level):"
@@ -120,10 +120,6 @@
"bonuses": [
{
"text": "·Can use two Command Burst modules"
},
{
"number": "100%",
"text": "bonus to Command Burst area of effect range"
}
],
"header": "Role Bonus:"
@@ -140,7 +136,7 @@
"text": "bonus to Medium Hybrid Turret falloff"
},
{
"number": "3%",
"number": "4%",
"text": "bonus to Armored Command and Skirmish Command burst strength and duration"
}
],
@@ -163,6 +159,36 @@
},
"typeID": 22466
},
{
"traits": {
"misc": {
"bonuses": [
{
"number": "25%",
"text": "reduction in ship kinetic resistances"
},
{
"number": "50%",
"text": "bonus to ship scan resolution"
},
{
"number": "25%",
"text": "bonus to mining laser cycle speed"
},
{
"number": "25%",
"text": "bonus to local Armor Repairer and Shield Booster cycle speed"
},
{
"number": "100%",
"text": "bonus to ship warp speed"
}
],
"header": "Misc bonus:"
}
},
"typeID": 56059
},
{
"traits": {
"role": {
@@ -1105,34 +1131,30 @@
"misc": {
"bonuses": [
{
"number": "44%",
"text": "bonus to ship velocity"
"number": "10%",
"text": "reduction in ship kinetic resistances"
},
{
"number": "44%",
"text": "bonus to maximum targeting range"
"number": "20%",
"text": "bonus to ship scan resolution"
},
{
"number": "22%",
"text": "bonus to missile velocity"
"number": "10%",
"text": "bonus to mining laser cycle speed"
},
{
"number": "44%",
"text": "bonus to missile explosion velocity"
"number": "10%",
"text": "bonus to local Armor Repairer and Shield Booster cycle speed"
},
{
"number": "22%",
"text": "penalty to ship agility"
},
{
"number": "22%",
"text": "penalty to stasis webifier strength"
"number": "40%",
"text": "bonus to ship warp speed"
}
],
"header": "Misc bonus:"
}
},
"typeID": 30850
"typeID": 56058
},
{
"traits": {
@@ -1316,6 +1338,35 @@
},
"typeID": 598
},
{
"traits": {
"misc": {
"bonuses": [
{
"number": "25%",
"text": "reduction in ship EM resistances"
},
{
"number": "25%",
"text": "bonus to ship capacitor recharge rate"
},
{
"number": "25+",
"text": "bonus to Relic and Data Analyzer virus coherence"
},
{
"number": "50%",
"text": "bonus to Core and Combat Scanner Probe strength"
},
{
"text": "·Cloaking devices cannot operate within systems affected by this storm"
}
],
"header": "Misc bonus:"
}
},
"typeID": 56057
},
{
"traits": {
"role": {
@@ -2493,6 +2544,40 @@
},
"typeID": 28710
},
{
"traits": {
"misc": {
"bonuses": [
{
"number": "44%",
"text": "bonus to ship velocity"
},
{
"number": "44%",
"text": "bonus to maximum targeting range"
},
{
"number": "22%",
"text": "bonus to missile velocity"
},
{
"number": "44%",
"text": "bonus to missile explosion velocity"
},
{
"number": "22%",
"text": "penalty to ship agility"
},
{
"number": "22%",
"text": "penalty to stasis webifier strength"
}
],
"header": "Misc bonus:"
}
},
"typeID": 30850
},
{
"traits": {
"skills": [
@@ -5549,6 +5634,9 @@
},
{
"text": "·While this structure has at least one online service module it enters full power mode and will gain increased shield and armor hitpoints and an extra reinforcement cycle"
},
{
"text": "·This structure requires an Astrahus Upwell Quantum Core to be installed for anchoring to complete"
}
],
"header": "Role Bonus:"
@@ -5603,6 +5691,9 @@
},
{
"text": "·While this structure has at least one online service module it enters full power mode and will gain increased shield and armor hitpoints and an extra reinforcement cycle"
},
{
"text": "·This structure requires a Keepstar Upwell Quantum Core to be installed for anchoring to complete"
}
],
"header": "Role Bonus:"
@@ -5630,6 +5721,9 @@
},
{
"text": "·While this structure has at least one online service module it enters full power mode and will gain increased shield and armor hitpoints and an extra reinforcement cycle."
},
{
"text": "·This structure requires an Athanor Upwell Quantum Core to be installed for anchoring to complete"
}
],
"header": "Role Bonus:"
@@ -5665,6 +5759,9 @@
},
{
"text": "·While this structure has at least one online service module it enters full power mode and will gain increased shield and armor hitpoints and an extra reinforcement cycle."
},
{
"text": "·This structure requires a Tatara Upwell Quantum Core to be installed for anchoring to complete"
}
],
"header": "Role Bonus:"
@@ -5994,10 +6091,6 @@
"bonuses": [
{
"text": "·Can use two Command Burst modules"
},
{
"number": "100%",
"text": "bonus to Command Burst area of effect range"
}
],
"header": "Role Bonus:"
@@ -6006,7 +6099,7 @@
{
"bonuses": [
{
"number": "7.5%",
"number": "10%",
"text": "bonus to Heavy Missile and Heavy Assault Missile Launcher rate of fire"
},
{
@@ -6014,7 +6107,7 @@
"text": "bonus to Heavy Missile and Heavy Assault Missile explosion radius"
},
{
"number": "3%",
"number": "4%",
"text": "bonus to Shield Command and Information Command burst strength and duration"
}
],
@@ -6663,7 +6756,7 @@
{
"bonuses": [
{
"number": "15%",
"number": "30%",
"text": "bonus to Light Entropic Disintegrator optimal range"
},
{
@@ -8945,11 +9038,11 @@
"bonuses": [
{
"number": "7.5%",
"text": "bonus to Heavy Drone max velocity and tracking speed"
"text": "bonus to Drone tracking speed"
},
{
"number": "7.5%",
"text": "bonus to Medium Hybrid Turret tracking speed"
"number": "10%",
"text": "bonus to Drone optimal range"
},
{
"number": "3%",
@@ -8965,8 +9058,8 @@
"text": "bonus to Drone hitpoints and damage"
},
{
"number": "7.5%",
"text": "bonus to Armor Repairer amount"
"number": "4%",
"text": "bonus to all armor resistances"
}
],
"header": "Gallente Battlecruiser bonuses (per skill level):"
@@ -8981,10 +9074,6 @@
"bonuses": [
{
"text": "·Can use two Command Burst modules"
},
{
"number": "100%",
"text": "bonus to Command Burst area of effect range"
}
],
"header": "Role Bonus:"
@@ -9001,7 +9090,7 @@
"text": "bonus to Medium Projectile Turret falloff"
},
{
"number": "3%",
"number": "4%",
"text": "bonus to Shield Command and Skirmish Command burst strength and duration"
}
],
@@ -9043,7 +9132,7 @@
"bonuses": [
{
"number": "10%",
"text": "bonus to Medium Hybrid Turret optimal range"
"text": "bonus to shield hitpoints"
},
{
"number": "10%",
@@ -9079,10 +9168,6 @@
"bonuses": [
{
"text": "·Can use two Command Burst modules"
},
{
"number": "100%",
"text": "bonus to Command Burst area of effect range"
}
],
"header": "Role Bonus:"
@@ -9099,7 +9184,7 @@
"text": "bonus to Medium Energy Turret rate of fire"
},
{
"number": "3%",
"number": "4%",
"text": "bonus to Armored Command and Information Command burst strength and duration"
}
],
@@ -10258,6 +10343,9 @@
},
{
"text": "·This structure is able to maintain a low-power state indefinitely, and so will not lapse to into an abandoned state."
},
{
"text": "·This structure requires a Fortizar Upwell Quantum Core to be installed for anchoring to complete"
}
],
"header": "Role Bonus:"
@@ -10294,6 +10382,9 @@
},
{
"text": "·This structure is able to maintain a low-power state indefinitely, and so will not lapse to into an abandoned state."
},
{
"text": "·This structure requires a Fortizar Upwell Quantum Core to be installed for anchoring to complete"
}
],
"header": "Role Bonus:"
@@ -10326,6 +10417,9 @@
},
{
"text": "·This structure is able to maintain a low-power state indefinitely, and so will not lapse to into an abandoned state."
},
{
"text": "·This structure requires a Fortizar Upwell Quantum Core to be installed for anchoring to complete"
}
],
"header": "Role Bonus:"
@@ -10362,6 +10456,9 @@
},
{
"text": "·This structure is able to maintain a low-power state indefinitely, and so will not lapse to into an abandoned state."
},
{
"text": "·This structure requires a Fortizar Upwell Quantum Core to be installed for anchoring to complete"
}
],
"header": "Role Bonus:"
@@ -10390,6 +10487,9 @@
},
{
"text": "·This structure is able to maintain a low-power state indefinitely, and so will not lapse to into an abandoned state."
},
{
"text": "·This structure requires a Fortizar Upwell Quantum Core to be installed for anchoring to complete"
}
],
"header": "Role Bonus:"
@@ -12019,6 +12119,9 @@
},
{
"text": "·While this structure has at least one online service module it enters full power mode and will gain increased shield and armor hitpoints and an extra reinforcement cycle"
},
{
"text": "·This structure requires a Fortizar Upwell Quantum Core to be installed for anchoring to complete"
}
],
"header": "Role Bonus:"
@@ -16235,6 +16338,9 @@
},
{
"text": "·Only one Upwell Palatine Keepstar may be deployed at a time in New Eden"
},
{
"text": "·This structure requires a Keepstar Upwell Quantum Core to be installed for anchoring to complete"
}
],
"header": "Role Bonus:"
@@ -16242,6 +16348,26 @@
},
"typeID": 40340
},
{
"traits": {
"skills": [
{
"bonuses": [
{
"number": "7.5%",
"text": "bonus to Small Hybrid Turret tracking speed"
},
{
"number": "10%",
"text": "bonus to Drone hitpoints and tracking speed"
}
],
"header": "Gallente Frigate bonuses (per skill level):"
}
]
},
"typeID": 34443
},
{
"traits": {
"role": {
@@ -16496,6 +16622,26 @@
},
"typeID": 23913
},
{
"traits": {
"skills": [
{
"bonuses": [
{
"number": "10%",
"text": "bonus to Drone hitpoints and damage"
},
{
"number": "7.5%",
"text": "bonus to Drone optimal range and tracking speed"
}
],
"header": "Gallente Battleship bonuses (per skill level):"
}
]
},
"typeID": 34441
},
{
"traits": {
"role": {
@@ -20160,43 +20306,152 @@
},
{
"traits": {
"skills": [
{
"bonuses": [
{
"number": "7.5%",
"text": "bonus to Small Hybrid Turret tracking speed"
},
{
"number": "10%",
"text": "bonus to Drone hitpoints and tracking speed"
}
],
"header": "Gallente Frigate bonuses (per skill level):"
}
]
"misc": {
"bonuses": [
{
"number": "10%",
"text": "reduction in ship explosive resistances"
},
{
"number": "10%",
"text": "bonus to ship shield hitpoints"
},
{
"number": "10%",
"text": "bonus to ship capacitor capacity"
},
{
"number": "10%",
"text": "reduction in ship signature radius"
},
{
"number": "50%",
"text": "reduction in Remote Armor Repairer and Remote Shield Booster effectiveness"
}
],
"header": "Misc bonus:"
}
},
"typeID": 34443
"typeID": 56060
},
{
"traits": {
"skills": [
{
"bonuses": [
{
"number": "10%",
"text": "bonus to Drone hitpoints and damage"
},
{
"number": "7.5%",
"text": "bonus to Drone optimal range and tracking speed"
}
],
"header": "Gallente Battleship bonuses (per skill level):"
}
]
"misc": {
"bonuses": [
{
"number": "25%",
"text": "reduction in ship explosive resistances"
},
{
"number": "25%",
"text": "bonus to ship shield hitpoints"
},
{
"number": "25%",
"text": "bonus to ship capacitor capacity"
},
{
"number": "25%",
"text": "reduction in ship signature radius"
},
{
"number": "90%",
"text": "reduction in Remote Armor Repairer and Remote Shield Booster effectiveness"
}
],
"header": "Misc bonus:"
}
},
"typeID": 34441
"typeID": 56061
},
{
"traits": {
"misc": {
"bonuses": [
{
"number": "10%",
"text": "reduction in ship thermal resistances"
},
{
"number": "10%",
"text": "bonus to ship armor hitpoints"
},
{
"number": "20%",
"text": "bonus to turret, missile, drone, and fighter damage"
},
{
"number": "20%",
"text": "reduction in turret and drone tracking speed"
},
{
"number": "20%",
"text": "increase to missile and fighter explosion radius"
}
],
"header": "Misc bonus:"
}
},
"typeID": 56062
},
{
"traits": {
"misc": {
"bonuses": [
{
"number": "25%",
"text": "reduction in ship thermal resistances"
},
{
"number": "25%",
"text": "bonus to ship armor hitpoints"
},
{
"number": "50%",
"text": "bonus to turret, missile, drone, and fighter damage"
},
{
"number": "50%",
"text": "reduction in turret and drone tracking speed"
},
{
"number": "50%",
"text": "increase to missile and fighter explosion radius"
}
],
"header": "Misc bonus:"
}
},
"typeID": 56063
},
{
"traits": {
"misc": {
"bonuses": [
{
"number": "10%",
"text": "reduction in ship EM resistances"
},
{
"number": "10%",
"text": "bonus to ship capacitor recharge rate"
},
{
"number": "10+",
"text": "bonus to Relic and Data Analyzer virus coherence"
},
{
"number": "20%",
"text": "bonus to Core and Combat Scanner Probe strength"
},
{
"text": "·Cloaking devices cannot operate within systems affected by this storm"
}
],
"header": "Misc bonus:"
}
},
"typeID": 56064
},
{
"traits": {
@@ -20290,8 +20545,8 @@
"text": "bonus to Heavy Entropic Disintegrator damage"
},
{
"number": "5%",
"text": "bonus to Heavy Entropic Disintegrator tracking speed"
"number": "7.5%",
"text": "bonus to Heavy Entropic Disintegrator optimal range"
}
],
"header": "Precursor Cruiser bonuses (per skill level):"
@@ -20608,6 +20863,9 @@
},
{
"text": "·While this structure has at least one online service module it enters full power mode and will gain increased shield and armor hitpoints and an extra reinforcement cycle."
},
{
"text": "·This structure requires a Sotiyo Upwell Quantum Core to be installed for anchoring to complete"
}
],
"header": "Role Bonus:"
@@ -20641,6 +20899,9 @@
},
{
"text": "·While this structure has at least one online service module it enters full power mode and will gain increased shield and armor hitpoints and an extra reinforcement cycle."
},
{
"text": "·This structure requires an Azbel Upwell Quantum Core to be installed for anchoring to complete"
}
],
"header": "Role Bonus:"
@@ -20670,6 +20931,9 @@
},
{
"text": "·While this structure has at least one online service module it enters full power mode and will gain increased shield and armor hitpoints and an extra reinforcement cycle."
},
{
"text": "·This structure requires a Raitaru Upwell Quantum Core to be installed for anchoring to complete"
}
],
"header": "Role Bonus:"

View File

@@ -1 +1 @@
version: v2.22.0
version: v2.28.2dev1