Compare commits

...

104 Commits

Author SHA1 Message Date
DarkPhoenix
2903c7e0ca Do not penalize effects modifying structure resistance 2014-03-20 22:47:42 +04:00
DarkPhoenix
e00941b2c5 Do not penalize siege module bonus 2014-03-18 22:02:19 +04:00
blitzmann
ffaa707ea9 Fix #62 2014-03-17 18:13:29 -04:00
blitzmann
7337d54511 Added fit import from copied eve chat 2014-03-16 23:57:52 -04:00
blitzmann
dd395aff03 Dev version 2014-03-15 23:40:33 -04:00
DarkPhoenix
4a41638472 Update to rubicon 1.3 2014-03-15 17:33:45 +04:00
blitzmann
50fbda288a Open fits at null-sec.com if not in IGB 2014-03-13 22:06:14 -04:00
blitzmann
7a33aba329 Finished visual improvements to the HTML export and removed debugging statements 2014-03-13 00:14:57 -04:00
blitzmann
ec7a58c592 Update jQuery mobile and add ship group heading. 2014-03-12 18:40:53 -04:00
blitzmann
9ac11f9a7c Quick fix for issue 55 2014-03-11 23:38:01 -04:00
DarkPhoenix
63a088631d Fix #54 2014-03-12 01:04:02 +04:00
DarkPhoenix
4fa585046f Fix potential crash on ansi + unicode concatenation 2014-03-12 00:24:29 +04:00
DarkPhoenix
f90983b541 Fix for #57 2014-03-11 23:40:28 +04:00
Anton Vorobyov
5095ac4881 Merge pull request #60 from bmonty/master
Update .gitignore
2014-03-11 22:23:45 +03:00
DarkPhoenix
c01450d1a1 Expand path for database conversion script 2014-03-11 23:17:10 +04:00
blitzmann
3718d20361 Probably best to generalize. Changed user guide to wiki. 2014-03-10 23:34:00 -04:00
blitzmann
1d66757b28 Added some help menu options the point to external resources 2014-03-10 19:08:06 -04:00
blitzmann
9e67ad032c Removed print debugging. 2014-03-08 22:51:45 -05:00
blitzmann
06bd15079d Improvements to update logic 2014-03-08 22:39:29 -05:00
Benjamin Montgomery
7e59b2d43a Update .gitignore
Ignore the fits html file.
2014-03-08 07:48:14 -10:00
blitzmann
4430204227 Merge branch 'prefs' 2014-03-07 21:36:31 -05:00
blitzmann
652e0738af Rename GlobalPreferences to GeneralPreferences 2014-03-07 21:28:58 -05:00
blitzmann
e6bc831305 Added static line under pref page title 2014-03-07 20:57:39 -05:00
blitzmann
513a02a4d4 Merge branch 'master' into prefs 2014-03-07 20:48:27 -05:00
blitzmann
f355dac322 Dev versioning 2014-03-04 14:35:00 -05:00
blitzmann
85f632bd20 Fixed infinite loop 2014-03-04 14:33:48 -05:00
blitzmann
cb0a5ded49 Merge pull request #53 from blitzmann/fleet
Fleet booster refactoring
2014-03-03 18:48:36 -05:00
blitzmann
bf1df97886 Expand fit choice to available space 2014-03-03 11:38:22 -05:00
blitzmann
b320c6ae77 Merge branch 'master' into fleet 2014-03-03 11:20:06 -05:00
blitzmann
9d2eee3b01 Removing sizing hack now that dialog sizing is correct 2014-03-03 11:19:32 -05:00
blitzmann
9b096524cc Updated update preference view with new icon and text wrapping 2014-03-03 01:53:55 -05:00
blitzmann
35a0b0ce4b Fix for PreferenceDialog sizing issues 2014-03-03 01:52:57 -05:00
blitzmann
5d75b2bd6d Merge branch 'master' into prefs 2014-03-02 23:55:46 -05:00
blitzmann
83cc3fd28a Merge pull request #47 from blitzmann/onlUpdate
Update notifications
2014-03-02 23:45:43 -05:00
blitzmann
2d69705469 Added date in update message 2014-03-02 23:42:16 -05:00
blitzmann
2ff6ecdbec Fixed settings for prerelease suppression 2014-03-02 22:55:11 -05:00
blitzmann
25c9bfe4d4 Check to see if release version is actually higher than current version (shouldn't really happen, but who knows) 2014-03-02 22:45:18 -05:00
blitzmann
91b2eff7b4 Added proxy icon, removed help text for global char and profile options 2014-03-02 22:23:49 -05:00
blitzmann
ea3969e1e3 Show preference pages in the order they appear in builtinPreferenceViews 2014-03-02 20:02:36 -05:00
blitzmann
cd5d047891 Use .Wrap() and the dialogs width to set appropriate sizer of large text 2014-03-02 19:54:35 -05:00
blitzmann
34f27f7995 Do not commit saved data 2014-03-02 17:51:48 -05:00
blitzmann
752b1fe726 Merge pull request #56 from blitzmann/issue52-ghosting
Fix issue #52 - slot ghosting
2014-03-02 17:35:22 -05:00
blitzmann
281e591984 Split general and proxy settings. Added some help text (not currently displayed). Dialog sizing needs to be addressed 2014-03-02 17:28:25 -05:00
blitzmann
b686aa6d0b Merge pull request #49 from blitzmann/searchfix
Fixed issue #48
2014-03-02 17:20:52 -05:00
blitzmann
035e6cea41 Fixes incorrect setting of draggedFitID when selecting booster from menu 2014-02-26 00:32:07 -05:00
blitzmann
5aa34caca6 Help message in fleet window 2014-02-26 00:07:51 -05:00
blitzmann
4fdd3f177a Applying appropriate icons 2014-02-25 23:54:27 -05:00
blitzmann
0826aa4bfe Fix for issue 52 2014-02-24 21:58:42 -05:00
blitzmann
5869fe6d97 Added booster icon
This is technically a button, and acts like a button without a function. Must look into making it a proper icon and not a button.
2014-02-24 03:02:14 -05:00
blitzmann
e877cef3a9 Revert "Added icon to show boosting fits."
This reverts commit f7fdcfcd4e.
2014-02-24 03:00:06 -05:00
blitzmann
f7fdcfcd4e Added icon to show boosting fits. 2014-02-24 02:34:05 -05:00
blitzmann
c6ad328e99 Changed "Set Booster Fit" option to a boolean menu item with fancy checkbox. 2014-02-24 00:56:04 -05:00
blitzmann
d8dfafedfa Refactoring of code, along with general housekeeping. Also, character menu is now disabled with no fit selected. 2014-02-24 00:55:25 -05:00
blitzmann
65cc0bec1c Fixed style issue that caused content to move when switching between choice and static text 2014-02-23 22:20:22 -05:00
blitzmann
c34215f9e3 Got rid of UpdateFleetFitsUI and baked it's functionality into fitSelected; now supports dragging/setting via right click. 2014-02-23 22:18:58 -05:00
blitzmann
354b732c2c Fit choice works and is properly applied. Dragging and setting via context from ship browser does not. 2014-02-22 21:11:59 -05:00
blitzmann
b910982994 Bug fix and more work 2014-02-22 01:14:33 -05:00
blitzmann
f2c1002d58 Fixes bug with fit copy.
`copy.deepcopy` was not copying the booster property of the fit for whatever reason - I blame my poor understanding of copy.
2014-02-22 00:52:29 -05:00
blitzmann
50ce4d37aa GangView is not aware of changes to booster fits 2014-02-21 21:50:18 -05:00
blitzmann
46662d2b72 Added getFitsWithBooster query 2014-02-21 21:47:10 -05:00
blitzmann
7579f3c3e1 Fixed cases where fit.booster column might contain null instead of bool 2014-02-20 23:56:50 -05:00
blitzmann
3842913fe1 Added booster fit toggling in database, menu label toggling, and migration code 2014-02-20 23:26:26 -05:00
blitzmann
aaadcb9b45 Add "Flag as Booster" item to fitting menu 2014-02-20 00:57:12 -05:00
blitzmann
29fc82b771 Semantics. Tweaking working not better represents that pre-release notification is opt-in. Thanks Andro! 2014-02-18 02:04:07 -05:00
blitzmann
48963167fe Reverts previous commit and introduces better way to filter ships 2014-02-17 23:29:02 -05:00
blitzmann
4095365518 Hotfix for issue #48 2014-02-17 22:44:40 -05:00
DarkPhoenix
acdc2c496e Bump veersion to 1.1.21 2014-02-17 23:50:12 +04:00
blitzmann
26b078b69f Tweaking label of update preferences 2014-02-17 11:30:04 -05:00
blitzmann
9c792fc9a7 Pre-release notifications suppressed by default 2014-02-16 18:09:49 -05:00
DarkPhoenix
c7944e91e7 Do not choke on renamed items 2014-02-16 22:42:43 +04:00
DarkPhoenix
9e389f27b0 Skip charges in EVE XML exports 2014-02-16 22:38:18 +04:00
Anton Vorobyov
eef34f1dcf Merge pull request #46 from blitzmann/master
Fixes stats relating to the Capital Capacitor Emission Systems skill
2014-02-16 21:11:09 +03:00
DarkPhoenix
c1ea161060 Rework traits support. Also support getting traits out of the client via phobos 2014-02-16 22:06:54 +04:00
Anton Vorobyov
b4aca7ae90 Merge pull request #41 from cl05tomp/master
Added new traits tab to Ship Basic Stats window
2014-02-16 19:20:53 +03:00
blitzmann
c0b4e73629 Added logic for notification suppression, along with other tweaks. Did not worry too much on how to handle pre-releases. 2014-02-16 01:26:13 -05:00
blitzmann
024637432c Added settings for update notification suppression. 2014-02-15 21:58:48 -05:00
blitzmann
7ced595cca Custom dialog implemented. 2014-02-15 00:55:04 -05:00
blitzmann
4a7782a713 Fixes stats relating to the Capital Capacitor Emission Systems skill 2014-02-14 22:36:11 -05:00
blitzmann
d7dda83314 More work on update notification. Displays debug popup now. 2014-02-13 22:52:36 -05:00
blitzmann
6ee474a8ff Started work on update notification. Successfully prints out alert to stdout if version from GitHub is not the same as internal version. 2014-02-13 22:28:56 -05:00
Carl Tompkins
2e9680191b Added new traits tab to Ship Basic Stats window 2014-02-06 19:22:47 -05:00
DarkPhoenix
d7b7d127b8 Bump version to 1.1.10 2014-01-30 12:24:23 +04:00
DarkPhoenix
2096b7641f Merge branch 'singularity' 2014-01-30 12:18:48 +04:00
DarkPhoenix
2b83d17bd2 Update version tag 2014-01-29 23:30:17 +04:00
Anton Vorobyov
d7e880c42b Merge pull request #34 from reactormonk/master
print() so python3 actually prints the error
2014-01-29 11:27:16 -08:00
Simon Hafner
e17c0610fb print() so python3 actually prints the error 2014-01-29 13:21:53 -06:00
DarkPhoenix
98e9ab461a Update database to 709728 2014-01-29 23:17:59 +04:00
DarkPhoenix
a833b2f5cc Revert change to pyfa path. Customization is provided via configforced.py module 2014-01-29 21:45:43 +04:00
Anton Vorobyov
9076175b0c Merge pull request #33 from blitzmann/master
Fix for savePath config
2014-01-29 08:33:01 -08:00
Anton Vorobyov
a9843b637a Merge pull request #32 from lydia/master
Fixed issue when running pyfa.py through a symlink
2014-01-29 08:23:52 -08:00
blitzmann
b9ffe18775 Fix for savePath config 2014-01-28 13:14:33 -05:00
Lydia Fernandez
6728121f9f Added a call to os.path.realpath() when creating pyfaPath to properly resolve symlinks. Also added a few linebreaks 2014-01-25 19:30:56 -05:00
DarkPhoenix
98850bfc1d Update to SiSi 703519 2014-01-22 23:51:42 +04:00
DarkPhoenix
a5f821850b Update scripts to be aware of latest phobos changes 2014-01-21 23:35:04 +04:00
DarkPhoenix
d97764586f Re-publish festival items 2014-01-21 23:31:18 +04:00
DarkPhoenix
3cd80b4dfe Merge branch 'master' of github.com:DarkFenX/Pyfa 2014-01-10 22:17:52 +04:00
Anton Vorobyov
97548212b5 Merge pull request #30 from alexjurkiewicz/master
Improve market search
2014-01-10 09:50:00 -08:00
Alex Jurkiewicz
7986177a16 Change market search from substring to tokenised substring 2014-01-08 17:53:33 +11:00
Alex Jurkiewicz
82733a81c8 limit searchItems returned list size to 100 2014-01-08 17:42:47 +11:00
DarkPhoenix
20cb2ca7d4 Revert tag 2013-11-21 22:52:08 +04:00
DarkPhoenix
3b13b42bdf Bump version 2013-11-21 22:35:07 +04:00
DarkPhoenix
09374f1643 Add missing paladin optimal effect 2013-11-21 22:31:37 +04:00
DarkPhoenix
388c3c8bf1 Add missing Kronos falloff effect 2013-11-20 22:17:09 +04:00
DarkPhoenix
24df54723f Revert tag in config file 2013-11-19 23:25:04 +04:00
144 changed files with 1335 additions and 566 deletions

4
.gitignore vendored
View File

@@ -12,3 +12,7 @@
#Patch files
*.patch
#Personal
/saveddata
#Pyfa file
pyfaFits.html

View File

@@ -13,10 +13,10 @@ debug = False
saveInRoot = False
# Version data
version = "1.1.17"
tag = "Stable"
version = "1.1.23"
tag = "git"
expansionName = "Rubicon"
expansionVersion = "1.0"
expansionVersion = "1.3"
evemonMinVersion = "4081"
pyfaPath = None
@@ -34,9 +34,10 @@ def defPaths():
global saveInRoot
# The main pyfa directory which contains run.py
# Python 2.X uses ANSI by default, so we need to convert the character encoding
pyfaPath = getattr(configforced, "pyfaPath", None)
pyfaPath = getattr(configforced, "pyfaPath", pyfaPath)
if pyfaPath is None:
pyfaPath = unicode(os.path.dirname(os.path.abspath(sys.modules['__main__'].__file__)), sys.getfilesystemencoding())
pyfaPath = unicode(os.path.dirname(os.path.realpath(os.path.abspath(
sys.modules['__main__'].__file__))), sys.getfilesystemencoding())
# Where we store the saved fits etc, default is the current users home directory
if saveInRoot is True:
@@ -46,7 +47,8 @@ def defPaths():
else:
savePath = getattr(configforced, "savePath", None)
if savePath is None:
savePath = unicode(os.path.expanduser(os.path.join("~", ".pyfa")), sys.getfilesystemencoding())
savePath = unicode(os.path.expanduser(os.path.join("~", ".pyfa")),
sys.getfilesystemencoding())
# Redirect stderr to file if we're requested to do so
stderrToFile = getattr(configforced, "stderrToFile", None)
@@ -62,7 +64,8 @@ def defPaths():
os.mkdir(savePath)
sys.stdout = open(os.path.join(savePath, "output_log.txt"), "w")
# Static EVE Data from the staticdata repository, should be in the staticdata directory in our pyfa directory
# Static EVE Data from the staticdata repository, should be in the staticdata
# directory in our pyfa directory
staticPath = os.path.join(pyfaPath, "staticdata")
# The database where we store all the fits etc

View File

@@ -66,7 +66,7 @@ from eos.db.saveddata.queries import getUser, getCharacter, getFit, getFitsWithS
getCharacterList, getPrice, getDamagePatternList, getDamagePattern, \
getFitList, getFleetList, getFleet, save, remove, commit, add, \
getCharactersForUser, getMiscData, getSquadsIDsWithFitID, getWing, \
getSquad
getSquad, getBoosterFits
#If using in memory saveddata, you'll want to reflect it so the data structure is good.
if config.saveddata_connectionstring == "sqlite:///:memory:":

View File

@@ -23,7 +23,7 @@ from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.orm.collections import attribute_mapped_collection
from eos.db import gamedata_meta
from eos.types import Icon, Attribute, Item, Effect, MetaType, Group
from eos.types import Icon, Attribute, Item, Effect, MetaType, Group, Traits
items_table = Table("invtypes", gamedata_meta,
Column("typeID", Integer, primary_key = True),
@@ -38,9 +38,8 @@ items_table = Table("invtypes", gamedata_meta,
Column("iconID", Integer, ForeignKey("icons.iconID")),
Column("groupID", Integer, ForeignKey("invgroups.groupID"), index=True))
from .metaGroup import metatypes_table
from .traits import traits_table
mapper(Item, items_table,
properties = {"group" : relation(Group, backref = "items"),
@@ -52,6 +51,11 @@ mapper(Item, items_table,
uselist = False),
"ID" : synonym("typeID"),
"name" : synonym("typeName"),
"description" : deferred(items_table.c.description)})
"description" : deferred(items_table.c.description),
"traits" : relation(Traits,
primaryjoin = traits_table.c.typeID == items_table.c.typeID,
order_by = traits_table.c.typeID,
uselist = True)
})
Item.category = association_proxy("group", "category")

View File

@@ -184,8 +184,6 @@ def getItemsByCategory(filter, where=None, eager=None):
def searchItems(nameLike, where=None, join=None, eager=None):
if not isinstance(nameLike, basestring):
raise TypeError("Need string as argument")
# Prepare our string for request
nameLike = u"%{0}%".format(sqlizeString(nameLike))
if join is None:
join = tuple()
@@ -193,8 +191,11 @@ def searchItems(nameLike, where=None, join=None, eager=None):
if not hasattr(join, "__iter__"):
join = (join,)
filter = processWhere(Item.name.like(nameLike, escape="\\"), where)
items = gamedata_session.query(Item).options(*processEager(eager)).join(*join).filter(filter).all()
items = gamedata_session.query(Item).options(*processEager(eager)).join(*join)
for token in nameLike.split(' '):
token_safe = u"%{0}%".format(sqlizeString(token))
items = items.filter(processWhere(Item.name.like(token_safe, escape="\\"), where))
items = items.limit(100).all()
return items
@cachedQuery(2, "where", "itemids")

22
eos/db/gamedata/traits.py Normal file
View File

@@ -0,0 +1,22 @@
from sqlalchemy import Column, Table, Integer, String, ForeignKey, and_, select
from sqlalchemy.orm import mapper, column_property
from eos.types import Item, Traits
from eos.db import gamedata_meta
traits_table = Table("invtraits", gamedata_meta,
Column("typeID", Integer, ForeignKey("invtypes.typeID"), primary_key=True),
Column("skillID", Integer, ForeignKey("invtypes.typeID"), primary_key=True),
Column("bonusText", String, primary_key=True))
from .item import items_table
mapper(Traits, traits_table,
properties = {"skillName" : column_property(
select([items_table.c.typeName],
and_(
items_table.c.typeID == traits_table.c.skillID,
traits_table.c.skillID != -1
)))
});

View File

@@ -3,7 +3,7 @@ import sqlalchemy
def update(saveddata_engine):
checkPriceFailures(saveddata_engine)
checkApiDefaultChar(saveddata_engine)
checkFitBooster(saveddata_engine)
def checkPriceFailures(saveddata_engine):
# Check if we have 'failed' column
@@ -39,3 +39,21 @@ def checkApiDefaultChar(saveddata_engine):
except sqlalchemy.exc.DatabaseError:
saveddata_engine.execute("ALTER TABLE characters ADD COLUMN defaultChar INTEGER;")
saveddata_engine.execute("ALTER TABLE characters ADD COLUMN chars VARCHAR;")
def checkFitBooster(saveddata_engine):
try:
saveddata_engine.execute("SELECT * FROM fits LIMIT 1")
# If table doesn't exist, it means we're doing everything from scratch
# and sqlalchemy will process everything as needed
except sqlalchemy.exc.DatabaseError:
pass
# If not, we're running on top of existing DB
else:
# Check that we have columns
try:
saveddata_engine.execute("SELECT booster FROM fits LIMIT 1")
# If we don't, create them
except sqlalchemy.exc.DatabaseError:
saveddata_engine.execute("ALTER TABLE fits ADD COLUMN booster BOOLEAN;")
# Set NULL data to 0 (needed in case of downgrade, see GH issue #62
saveddata_engine.execute("UPDATE fits SET booster = 0 WHERE booster IS NULL;")

View File

@@ -17,7 +17,7 @@
# along with eos. If not, see <http://www.gnu.org/licenses/>.
#===============================================================================
from sqlalchemy import Table, Column, Integer, ForeignKey, String
from sqlalchemy import Table, Column, Integer, ForeignKey, String, Boolean
from sqlalchemy.orm import relation, mapper
from sqlalchemy.sql import and_
@@ -36,7 +36,8 @@ fits_table = Table("fits", saveddata_meta,
Column("name", String, nullable = False),
Column("timestamp", Integer, nullable = False),
Column("characterID", ForeignKey("characters.ID"), nullable = True),
Column("damagePatternID", ForeignKey("damagePatterns.ID"), nullable=True))
Column("damagePatternID", ForeignKey("damagePatterns.ID"), nullable=True),
Column("booster", Boolean, nullable = False, index = True, default = 0))
projectedFits_table = Table("projectedFits", saveddata_meta,
Column("sourceID", ForeignKey("fits.ID"), primary_key = True),

View File

@@ -248,6 +248,24 @@ def getFitsWithShip(shipID, ownerID=None, where=None, eager=None):
raise TypeError("ShipID must be integer")
return fits
def getBoosterFits(ownerID=None, where=None, eager=None):
"""
Get all the fits that are flagged as a boosting ship
If no user is passed, do this for all users.
"""
if ownerID is not None and not isinstance(ownerID, int):
raise TypeError("OwnerID must be integer")
filter = Fit.booster == 1
if ownerID is not None:
filter = and_(filter, Fit.ownerID == ownerID)
filter = processWhere(filter, where)
eager = processEager(eager)
with sd_lock:
fits = saveddata_session.query(Fit).options(*eager).filter(filter).all()
return fits
def countFitsWithShip(shipID, ownerID=None, where=None, eager=None):
"""
Get all the fits using a certain ship.

View File

@@ -1,6 +1,6 @@
# Used by:
# Modules from group: Capacitor Flux Coil (12 of 12)
# Modules from group: Capacitor Power Relay (25 of 25)
# Modules from group: Capacitor Power Relay (26 of 26)
# Modules from group: Power Diagnostic System (31 of 31)
# Modules from group: Propulsion Module (107 of 107)
# Modules from group: Reactor Control Unit (28 of 28)

View File

@@ -1,6 +1,6 @@
# Used by:
# Skill: Capital Energy Emission Systems
# Skill: Capital Capacitor Emission Systems
type = "passive"
def handler(fit, skill, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Capital Energy Emission Systems"),
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Capital Capacitor Emission Systems"),
"capacitorNeed", skill.getModifiedItemAttr("capNeedBonus") * skill.level)

View File

@@ -6,6 +6,6 @@ def handler(fit, ship, context):
level = fit.character.getSkill("Amarr Carrier").level
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Capital Remote Armor Repair Systems"),
"maxRange", ship.getModifiedItemAttr("carrierAmarrBonus3") * level)
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Capital Energy Emission Systems"),
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Capital Capacitor Emission Systems"),
"powerTransferRange", ship.getModifiedItemAttr("carrierAmarrBonus3") * level)

View File

@@ -7,5 +7,5 @@ def handler(fit, ship, context):
level = fit.character.getSkill("Caldari Carrier").level
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Capital Shield Emission Systems"),
"shieldTransferRange", ship.getModifiedItemAttr("carrierCaldariBonus3") * level)
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Capital Energy Emission Systems"),
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Capital Capacitor Emission Systems"),
"powerTransferRange", ship.getModifiedItemAttr("carrierCaldariBonus3") * level)

View File

@@ -5,7 +5,8 @@ gangBoost = "ewarStrRSD"
type = "active", "gang"
def handler(fit, module, context):
if "gang" not in context: return
for bonus in ("scanResolutionBonus", "maxTargetRangeBonus"):
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Remote Sensor Damper",
bonus, module.getModifiedItemAttr("commandBonusRSD"),
stackingPenalties = True)
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Remote Sensor Damper",
"maxTargetRangeBonus", module.getModifiedItemAttr("commandBonusRSD"))
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Remote Sensor Damper",
"scanResolutionBonus", module.getModifiedItemAttr("commandBonusRSD"),
stackingPenalties=True)

View File

@@ -5,6 +5,5 @@ gangBoost = "ewarStrTD"
type = "active", "gang"
def handler(fit, module, context):
for bonus in ("maxRangeBonus", "falloffBonus", "trackingSpeedBonus"):
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Tracking Disruptor",
bonus, module.getModifiedItemAttr("commandBonusTD"),
stackingPenalties = True)
fit.modules.filteredItemBoost(lambda mod: lambda mod: mod.item.requiresSkill("Weapon Disruption"),
bonus, module.getModifiedItemAttr("commandBonusTD"))

View File

@@ -4,7 +4,9 @@
# Ships from group: Covert Ops (5 of 5)
# Ships from group: Force Recon Ship (5 of 5)
# Ships from group: Stealth Bomber (4 of 4)
# Ships named like: Stratios (2 of 2)
# Subsystems named like: Offensive Covert Reconfiguration (4 of 4)
# Ship: Astero
type = "passive"
def handler(fit, container, context):
fit.modules.filteredItemForce(lambda mod: mod.item.group.name == "Cloaking Device",

View File

@@ -7,5 +7,6 @@ def handler(fit, module, context):
bonus = "%s%sDamageResonance" % (attrPrefix, damageType)
bonus = "%s%s" % (bonus[0].lower(), bonus[1:])
booster = "%s%sDamageResonance" % (layer, damageType)
penalize = False if layer == 'hull' else True
fit.ship.multiplyItemAttr(bonus, module.getModifiedItemAttr(booster),
stackingPenalties=True, penaltyGroup="preMul")
stackingPenalties=penalize, penaltyGroup="preMul")

View File

@@ -0,0 +1,14 @@
# Used by:
# Modules from group: Drone Tracking Modules (7 of 7)
type = "active"
def handler(fit, module, context):
fit.drones.filteredItemBoost(lambda drone: drone.item.requiresSkill("Drones"),
"maxRange", module.getModifiedItemAttr("maxRangeBonus"),
stackingPenalties=True)
fit.drones.filteredItemBoost(lambda drone: drone.item.requiresSkill("Drones"),
"falloff", module.getModifiedItemAttr("falloffBonus"),
stackingPenalties=True)
fit.drones.filteredItemBoost(lambda drone: drone.item.requiresSkill("Drones"),
"trackingSpeed", module.getModifiedItemAttr("trackingSpeedBonus"),
stackingPenalties=True)

View File

@@ -1,10 +0,0 @@
# Used by:
# Modules from group: Drone Tracking Modules (7 of 7)
type = "passive"
def handler(fit, module, context):
fit.drones.filteredItemMultiply(lambda drone: drone.item.requiresSkill("Drones"),
"trackingSpeed", module.getModifiedItemAttr("trackingSpeedMultiplier"),
stackingPenalties = True, penaltyGroup="postMul")
fit.drones.filteredItemMultiply(lambda drone: drone.item.requiresSkill("Drones"),
"maxRange", module.getModifiedItemAttr("maxRangeMultiplier"),
stackingPenalties = True, penaltyGroup="postMul")

View File

@@ -1,6 +1,6 @@
# Used by:
# Ship: Kronos
# Ship: Paladin
# Used by:
# Ship: Kronos
# Ship: Paladin
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Marauders").level

View File

@@ -1,7 +1,7 @@
# Used by:
# Ship: Impel
# Ship: Occator
# Ship: Prorator
# Used by:
# Ship: Impel
# Ship: Occator
# Ship: Prorator
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Transport Ships").level

View File

@@ -1,5 +1,5 @@
# Used by:
# Ship: Viator
# Used by:
# Ship: Viator
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Transport Ships").level

View File

@@ -4,5 +4,7 @@
type = "passive"
def handler(fit, container, context):
level = container.level if "skill" in context else 1
penalized = False if "skill" in context else True
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Remote Sensor Damper",
"scanResolutionBonus", container.getModifiedItemAttr("scanSkillEwStrengthBonus") * level)
"scanResolutionBonus", container.getModifiedItemAttr("scanSkillEwStrengthBonus") * level,
stackingPenalties=penalized)

View File

@@ -5,6 +5,5 @@ type = "passive"
def handler(fit, container, context):
level = container.level if "skill" in context else 1
for attr in ("maxRangeBonus", "falloffBonus"):
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Tracking Disruptor",
attr, container.getModifiedItemAttr("scanSkillEwStrengthBonus") * level,
stackingPenalties = "skill" not in context)
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Weapon Disruption"),
attr, container.getModifiedItemAttr("scanSkillEwStrengthBonus") * level)

View File

@@ -1,5 +1,5 @@
# Used by:
# Modules from group: Magnetic Field Stabilizer (19 of 19)
# Modules from group: Magnetic Field Stabilizer (20 of 20)
# Modules named like: QA Multiship Module Players (4 of 4)
# Module: QA Damage Module
type = "passive"

View File

@@ -1,5 +1,5 @@
# Used by:
# Modules from group: Magnetic Field Stabilizer (19 of 19)
# Modules from group: Magnetic Field Stabilizer (20 of 20)
type = "passive"
def handler(fit, module, context):
fit.modules.filteredItemMultiply(lambda mod: mod.item.group.name == "Hybrid Weapon",

View File

@@ -9,8 +9,9 @@ def handler(fit, module, context):
bonus = "%s%sDamageResonance" % (attrPrefix, damageType)
bonus = "%s%s" % (bonus[0].lower(), bonus[1:])
booster = "%s%sDamageResonance" % (layer, damageType)
penalize = False if layer == 'hull' else True
fit.ship.multiplyItemAttr(bonus, module.getModifiedItemAttr(booster),
stackingPenalties=True, penaltyGroup="preMul")
stackingPenalties=penalize, penaltyGroup="preMul")
# Turrets
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Large Energy Turret") or \
@@ -26,7 +27,8 @@ def handler(fit, module, context):
# Missiles
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Torpedoes") or \
mod.charge.requiresSkill("Cruise Missiles"),
mod.charge.requiresSkill("Cruise Missiles") or \
mod.charge.requiresSkill("Heavy Missiles"),
"maxVelocity", module.getModifiedItemAttr("missileVelocityBonus"))
# Tanking

View File

@@ -1,8 +1,13 @@
# Used by:
# Ships from group: Covert Ops (5 of 5)
# Ships from group: Frigate (10 of 43)
# Ships named like: Stratios (2 of 2)
# Subsystems named like: Electronics Emergent Locus Analyzer (4 of 4)
# Variations of ship: Heron (3 of 3)
# Variations of ship: Imicus (3 of 3)
# Variations of ship: Magnate (4 of 6)
# Variations of ship: Probe (3 of 3)
# Ship: Astero
# Ship: Nestor
type = "passive"
def handler(fit, container, context):
level = container.level if "skill" in context else 1

View File

@@ -1,6 +1,6 @@
# Used by:
# Implants named like: Crash Booster (4 of 4)
type = "passive"
def handler(fit, implant, context):
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Missile Launcher Operation"),
"aoeCloudSize", implant.getModifiedItemAttr("aoeCloudSizeBonus"))
# Used by:
# Implants named like: Crash Booster (4 of 4)
type = "passive"
def handler(fit, implant, context):
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Missile Launcher Operation"),
"aoeCloudSize", implant.getModifiedItemAttr("aoeCloudSizeBonus"))

View File

@@ -1,5 +1,5 @@
# Used by:
# Modules from group: Armor Hardener (156 of 156)
# Used by:
# Modules from group: Armor Hardener (156 of 156)
type = "active"
def handler(fit, module, context):
for damageType in ("kinetic", "thermal", "explosive", "em"):

View File

@@ -1,5 +1,5 @@
# Used by:
# Modules from group: Shield Hardener (97 of 97)
# Used by:
# Modules from group: Shield Hardener (97 of 97)
type = "active"
def handler(fit, module, context):
for damageType in ("kinetic", "thermal", "explosive", "em"):

View File

@@ -1,6 +1,6 @@
# Used by:
# Modules from group: Capacitor Flux Coil (12 of 12)
# Modules from group: Capacitor Power Relay (25 of 25)
# Modules from group: Capacitor Power Relay (26 of 26)
# Modules from group: Capacitor Recharger (25 of 25)
# Modules from group: Power Diagnostic System (31 of 31)
# Modules from group: Reactor Control Unit (28 of 28)

View File

@@ -1,6 +1,6 @@
# Used by:
# Modules from group: Capacitor Flux Coil (12 of 12)
# Modules from group: Capacitor Power Relay (25 of 25)
# Modules from group: Capacitor Power Relay (26 of 26)
# Modules from group: Power Diagnostic System (31 of 31)
# Modules from group: Reactor Control Unit (28 of 28)
# Modules from group: Shield Flux Coil (11 of 11)

View File

@@ -1,5 +1,5 @@
# Used by:
# Modules named like: Processor Overclocking Unit II (4 of 4)
# Modules named like: Processor Overclocking Unit (8 of 8)
type = "passive"
def handler(fit, module, context):
fit.ship.multiplyItemAttr("shieldRechargeRate", module.getModifiedItemAttr("shieldRechargeRateMultiplier"))

View File

@@ -2,12 +2,10 @@
# Modules from group: Energy Weapon (100 of 183)
# Modules from group: Hybrid Weapon (110 of 199)
# Modules from group: Missile Launcher Citadel (4 of 4)
# Modules from group: Missile Launcher Cruise (20 of 20)
# Modules from group: Missile Launcher Heavy (12 of 12)
# Modules from group: Missile Launcher Rocket (14 of 14)
# Modules from group: Missile Launcher Torpedo (21 of 21)
# Modules from group: Projectile Weapon (60 of 143)
# Modules named like: Missile Launcher (81 of 82)
# Modules named like: Launcher (124 of 137)
type = "overheat"
def handler(fit, module, context):
module.boostItemAttr("speed", module.getModifiedItemAttr("overloadRofBonus"))

View File

@@ -6,9 +6,11 @@
# Modules from group: Remote Armor Repairer (38 of 38)
# Modules from group: Remote Capacitor Transmitter (38 of 38)
# Modules from group: Remote Shield Booster (39 of 39)
# Modules from group: Smart Bomb (118 of 118)
# Module: QA Remote Armor Repair System - 5 Players
# Module: QA Shield Transporter - 5 Players
# Module: Reactive Armor Hardener
# Module: Target Spectrum Breaker
type = "overheat"
def handler(fit, module, context):
module.boostItemAttr("duration", module.getModifiedItemAttr("overloadSelfDurationBonus"))
module.boostItemAttr("duration", module.getModifiedItemAttr("overloadSelfDurationBonus") or 0)

View File

@@ -1,8 +1,8 @@
# Used by:
# Modules from group: ECCM (44 of 44)
# Modules from group: Projected ECCM (7 of 7)
type = "overheat"
def handler(fit, module, context):
for scanType in ("Gravimetric", "Magnetometric", "Radar", "Ladar"):
module.boostItemAttr("scan%sStrengthPercent" % scanType,
module.getModifiedItemAttr("overloadECCMStrenghtBonus"),
stackingPenalties = True)
module.getModifiedItemAttr("overloadECCMStrenghtBonus"))

View File

@@ -1,5 +1,6 @@
# Used by:
# Modules from group: ECM (44 of 44)
# Modules from group: ECM Burst (7 of 7)
type = "overheat"
def handler(fit, module, context):
for scanType in ("Gravimetric", "Magnetometric", "Radar", "Ladar"):

View File

@@ -0,0 +1,5 @@
# Used by:
# Modules from group: Target Painter (9 of 9)
type = "overheat"
def handler(fit, module, context):
module.boostItemAttr("signatureRadiusBonus", module.getModifiedItemAttr("overloadPainterStrengthBonus") or 0)

View File

@@ -0,0 +1,9 @@
# Used by:
# Modules from group: Remote Sensor Booster (8 of 8)
# Modules from group: Remote Sensor Damper (9 of 9)
# Modules from group: Sensor Booster (12 of 12)
type = "overheat"
def handler(fit, module, context):
module.boostItemAttr("maxTargetRangeBonus", module.getModifiedItemAttr("overloadSensorModuleStrengthBonus"))
module.boostItemAttr("scanResolutionBonus", module.getModifiedItemAttr("overloadSensorModuleStrengthBonus"),
stackingPenalties=True)

View File

@@ -0,0 +1,10 @@
# Used by:
# Modules from group: Drone Tracking Modules (7 of 7)
# Modules from group: Remote Tracking Computer (10 of 10)
# Modules from group: Tracking Computer (14 of 14)
# Modules from group: Tracking Disruptor (10 of 10)
type = "overheat"
def handler(fit, module, context):
module.boostItemAttr("maxRangeBonus", module.getModifiedItemAttr("overloadTrackingModuleStrengthBonus"))
module.boostItemAttr("falloffBonus", module.getModifiedItemAttr("overloadTrackingModuleStrengthBonus"))
module.boostItemAttr("trackingSpeedBonus", module.getModifiedItemAttr("overloadTrackingModuleStrengthBonus"))

View File

@@ -1,6 +1,6 @@
# Used by:
# Modules from group: Capacitor Flux Coil (12 of 12)
# Modules from group: Capacitor Power Relay (25 of 25)
# Modules from group: Capacitor Power Relay (26 of 26)
# Modules from group: Power Diagnostic System (31 of 31)
# Modules from group: Reactor Control Unit (28 of 28)
# Modules from group: Shield Flux Coil (11 of 11)

View File

@@ -1,5 +1,6 @@
# Used by:
# Modules from group: Remote Hull Repairer (7 of 7)
# Drones named like: Hull Maintenance Bot (6 of 6)
type = "projected", "active"
runTime = "late"
def handler(fit, module, context):

View File

@@ -0,0 +1,8 @@
# Used by:
# Modules named like: Drone Repair Augmentor (8 of 8)
# Skill: Repair Drone Operation
type = "passive"
def handler(fit, container, context):
level = container.level if "skill" in context else 1
fit.drones.filteredItemBoost(lambda drone: drone.item.group.name == "Logistic Drone",
"structureDamageAmount", container.getModifiedItemAttr("damageHP") * level)

View File

@@ -1,5 +1,5 @@
# Used by:
# Implants from group: Cyberimplant (20 of 155)
# Implants from group: Cyberimplant (20 of 157)
type = "passive"
def handler(fit, implant, context):
for type in ("Gravimetric", "Magnetometric", "Radar", "Ladar"):

View File

@@ -1,5 +1,5 @@
# Used by:
# Modules from group: Capacitor Power Relay (25 of 25)
# Modules from group: Capacitor Power Relay (26 of 26)
# Modules from group: Shield Boost Amplifier (25 of 25)
type = "passive"
def handler(fit, module, context):

View File

@@ -1,6 +1,6 @@
# Used by:
# Modules from group: Capacitor Flux Coil (12 of 12)
# Modules from group: Capacitor Power Relay (25 of 25)
# Modules from group: Capacitor Power Relay (26 of 26)
# Modules from group: Power Diagnostic System (31 of 31)
# Modules from group: Reactor Control Unit (28 of 28)
# Modules from group: Shield Flux Coil (11 of 11)

View File

@@ -1,7 +1,7 @@
# Used by:
# Ships named like: Punisher (2 of 2)
# Ship: Astero
# Ship: Malice
# Ship: Punisher
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Amarr Frigate").level

View File

@@ -1,7 +1,7 @@
# Used by:
# Ships named like: Punisher (2 of 2)
# Ship: Astero
# Ship: Malice
# Ship: Punisher
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Amarr Frigate").level

View File

@@ -1,7 +1,7 @@
# Used by:
# Ships named like: Punisher (2 of 2)
# Ship: Astero
# Ship: Malice
# Ship: Punisher
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Amarr Frigate").level

View File

@@ -1,7 +1,7 @@
# Used by:
# Ship: Incursus
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Gallente Frigate").level
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Repair Systems"),
"armorDamageAmount", ship.getModifiedItemAttr("shipBonusGF2") * level)
# Used by:
# Ships named like: Incursus (2 of 2)
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Gallente Frigate").level
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Repair Systems"),
"armorDamageAmount", ship.getModifiedItemAttr("shipBonusGF2") * level)

View File

@@ -1,7 +1,7 @@
# Used by:
# Ships named like: Punisher (2 of 2)
# Ship: Astero
# Ship: Malice
# Ship: Punisher
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Amarr Frigate").level

View File

@@ -1,5 +1,6 @@
# Used by:
# Ship: Abaddon
# Ships named like: Abaddon (2 of 2)
# Ship: Nestor
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Amarr Battleship").level

View File

@@ -1,6 +1,7 @@
# Used by:
# Variations of ship: Mammoth (2 of 2)
# Variations of ship: Wreathe (2 of 2)
# Ship: Mammoth Nefantar Edition
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Minmatar Industrial").level

View File

@@ -3,5 +3,5 @@
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Caldari Dreadnought").level
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Missile Launcher Citadel",
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Citadel Cruise Missiles"),
"speed", ship.getModifiedItemAttr("dreadnoughtShipBonusC1") * level)

View File

@@ -0,0 +1,7 @@
# Used by:
# Ship: Phoenix
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Caldari Dreadnought").level
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Citadel Torpedoes"),
"speed", ship.getModifiedItemAttr("dreadnoughtShipBonusC1") * level)

View File

@@ -1,5 +1,6 @@
# Used by:
# Variations of ship: Dominix (3 of 3)
# Ship: Nestor
# Ship: Rattlesnake
type = "passive"
def handler(fit, ship, context):

View File

@@ -1,5 +1,6 @@
# Used by:
# Variations of ship: Dominix (3 of 3)
# Ship: Nestor
# Ship: Rattlesnake
type = "passive"
def handler(fit, ship, context):

View File

@@ -1,6 +1,6 @@
# Used by:
# Ships named like: Rokh (2 of 2)
# Ship: Rattlesnake
# Ship: Rokh
# Ship: Scorpion Navy Issue
type = "passive"
def handler(fit, ship, context):

View File

@@ -1,9 +0,0 @@
# Used by:
# Ship: Crucifier
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Amarr Frigate").level
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Tracking Disruptor",
"maxRangeBonus", ship.getModifiedItemAttr("shipBonusAF") * level)
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Tracking Disruptor",
"falloffBonus", ship.getModifiedItemAttr("shipBonusAF") * level)

View File

@@ -3,7 +3,7 @@
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Amarr Cruiser").level
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Tracking Disruptor",
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Weapon Disruption"),
"maxRangeBonus", ship.getModifiedItemAttr("shipBonusAC") * level)
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Tracking Disruptor",
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Weapon Disruption"),
"falloffBonus", ship.getModifiedItemAttr("shipBonusAC") * level)

View File

@@ -1,9 +1,9 @@
# Used by:
# Ship: Sentinel
# Variations of ship: Crucifier (2 of 2)
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Amarr Frigate").level
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Tracking Disruptor",
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Weapon Disruption"),
"maxRangeBonus", ship.getModifiedItemAttr("shipBonus2AF") * level)
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Tracking Disruptor",
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Weapon Disruption"),
"falloffBonus", ship.getModifiedItemAttr("shipBonus2AF") * level)

View File

@@ -2,7 +2,7 @@
# Ship: Impairor
type = "passive"
def handler(fit, ship, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Tracking Disruptor",
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Weapon Disruption"),
"maxRangeBonus", ship.getModifiedItemAttr("rookieWeaponDisruptionBonus"))
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Tracking Disruptor",
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Weapon Disruption"),
"falloffBonus", ship.getModifiedItemAttr("rookieWeaponDisruptionBonus"))

View File

@@ -1,6 +1,6 @@
# Used by:
# Ships named like: Rokh (2 of 2)
# Ship: Rattlesnake
# Ship: Rokh
# Ship: Scorpion Navy Issue
type = "passive"
def handler(fit, ship, context):

View File

@@ -0,0 +1,7 @@
# Used by:
# Ship: Kronos
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Gallente Battleship").level
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Large Hybrid Turret"),
"falloff", ship.getModifiedItemAttr("shipBonusGB2") * level)

View File

@@ -1,5 +1,5 @@
# Used by:
# Ship: Rokh
# Ships named like: Rokh (2 of 2)
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Caldari Battleship").level

View File

@@ -1,6 +1,7 @@
# Used by:
# Ship: Ares
# Ship: Federation Navy Comet
# Ship: Police Pursuit Comet
# Ship: Tristan
type = "passive"
def handler(fit, ship, context):

View File

@@ -1,6 +1,6 @@
# Used by:
# Ships named like: Rokh (2 of 2)
# Ship: Rattlesnake
# Ship: Rokh
# Ship: Scorpion Navy Issue
type = "passive"
def handler(fit, ship, context):

View File

@@ -0,0 +1,7 @@
# Used by:
# Ship: Paladin
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Amarr Battleship").level
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Large Energy Turret"),
"maxRange", ship.getModifiedItemAttr("shipBonusAB") * level)

View File

@@ -1,5 +1,5 @@
# Used by:
# Ship: Abaddon
# Ships named like: Abaddon (2 of 2)
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Amarr Battleship").level

View File

@@ -0,0 +1,6 @@
# Used by:
# Ship: Nestor
type = "passive"
def handler(fit, ship, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Large Energy Turret"),
"maxRange", ship.getModifiedItemAttr("shipBonusPirateFaction"))

View File

@@ -0,0 +1,6 @@
# Used by:
# Ship: Nestor
type = "passive"
def handler(fit, ship, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Remote Armor Repair Systems"),
"armorDamageAmount", ship.getModifiedItemAttr("shipBonusPirateFaction"))

View File

@@ -0,0 +1,6 @@
# Used by:
# Ship: Nestor
type = "passive"
def handler(fit, ship, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Remote Armor Repair Systems"),
"maxRange", ship.getModifiedItemAttr("shipBonusPirateFaction2"))

View File

@@ -1,7 +1,7 @@
# Used by:
# Ship: Hyperion
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Gallente Battleship").level
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Repair Systems"),
"armorDamageAmount", ship.getModifiedItemAttr("shipBonusGB2") * level)
# Used by:
# Ships named like: Hyperion (2 of 2)
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Gallente Battleship").level
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Repair Systems"),
"armorDamageAmount", ship.getModifiedItemAttr("shipBonusGB2") * level)

View File

@@ -1,5 +1,5 @@
# Used by:
# Ship: Vangel
# Used by:
# Ship: Vangel
type = "passive"
def handler(fit, ship, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Repair Systems"),

View File

@@ -1,5 +1,5 @@
# Used by:
# Ship: Maelstrom
# Ships named like: Maelstrom (2 of 2)
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Minmatar Battleship").level

View File

@@ -0,0 +1,7 @@
# Used by:
# Ships named like: Rifter (2 of 2)
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Minmatar Frigate").level
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Small Projectile Turret"),
"falloff", ship.getModifiedItemAttr("shipBonusMF2") * level)

View File

@@ -1,6 +1,6 @@
# Used by:
# Ships named like: Rokh (2 of 2)
# Ship: Rattlesnake
# Ship: Rokh
# Ship: Scorpion Navy Issue
type = "passive"
def handler(fit, ship, context):

View File

@@ -1,5 +1,5 @@
# Used by:
# Ship: Bhaalgorn
# Used by:
# Ship: Bhaalgorn
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Amarr Battleship").level

View File

@@ -1,6 +1,6 @@
# Used by:
# Ships named like: Hyperion (2 of 2)
# Ship: Dominix Navy Issue
# Ship: Hyperion
# Ship: Kronos
# Ship: Megathron Federate Issue
# Ship: Sin

View File

@@ -1,5 +1,5 @@
# Used by:
# Ship: Merlin
# Ships named like: Merlin (2 of 2)
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Caldari Frigate").level

View File

@@ -0,0 +1,9 @@
# Used by:
# Ship: Breacher
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Minmatar Frigate").level
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Missile Launcher Operation"),
"speed", ship.getModifiedItemAttr("shipBonusMF2") * level)

View File

@@ -4,6 +4,7 @@
# Ship: Cheetah
# Ship: Freki
# Ship: Republic Fleet Firetail
# Ship: Rifter Krusual Edition
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Minmatar Frigate").level

View File

@@ -1,7 +1,8 @@
# Used by:
# Variations of ship: Rifter (3 of 3)
# Variations of ship: Slasher (3 of 3)
# Ship: Jaguar
# Ship: Republic Fleet Firetail
# Ship: Wolf
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Minmatar Frigate").level

View File

@@ -1,6 +1,6 @@
# Used by:
# Ships named like: Maelstrom (2 of 2)
# Variations of ship: Tempest (4 of 4)
# Ship: Maelstrom
# Ship: Panther
# Ship: Typhoon Fleet Issue
type = "passive"

View File

@@ -0,0 +1,6 @@
# Used by:
# Ship: Nestor
type = "passive"
def handler(fit, ship, context):
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Astrometrics"),
"baseSensorStrength", ship.getModifiedItemAttr("shipBonusPirateFaction"))

View File

@@ -1,5 +1,5 @@
# Used by:
# Ship: Punisher
# Ships named like: Punisher (2 of 2)
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Amarr Frigate").level

View File

@@ -1,6 +1,7 @@
# Used by:
# Variations of ship: Merlin (3 of 4)
# Ship: Cambion
# Ship: Merlin Nugoeihuvi Edition
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Caldari Frigate").level

View File

@@ -1,6 +1,7 @@
# Used by:
# Variations of ship: Merlin (3 of 4)
# Ship: Cambion
# Ship: Merlin Nugoeihuvi Edition
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Caldari Frigate").level

View File

@@ -1,6 +1,7 @@
# Used by:
# Variations of ship: Merlin (3 of 4)
# Ship: Cambion
# Ship: Merlin Nugoeihuvi Edition
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Caldari Frigate").level

View File

@@ -1,6 +1,7 @@
# Used by:
# Variations of ship: Merlin (3 of 4)
# Ship: Cambion
# Ship: Merlin Nugoeihuvi Edition
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Caldari Frigate").level

View File

@@ -3,6 +3,8 @@
# Ship: Atron
# Ship: Federation Navy Comet
# Ship: Helios
# Ship: Incursus Aliastra Edition
# Ship: Police Pursuit Comet
# Ship: Taranis
type = "passive"
def handler(fit, ship, context):

View File

@@ -1,7 +0,0 @@
# Used by:
# Ship: Breacher
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Minmatar Frigate").level
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Rockets") or mod.charge.requiresSkill("Light Missiles"),
"emDamage", ship.getModifiedItemAttr("shipBonusMF2") * level)

View File

@@ -1,7 +0,0 @@
# Used by:
# Ship: Breacher
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Minmatar Frigate").level
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Rockets") or mod.charge.requiresSkill("Light Missiles"),
"explosiveDamage", ship.getModifiedItemAttr("shipBonusMF2") * level)

View File

@@ -1,7 +0,0 @@
# Used by:
# Ship: Breacher
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Minmatar Frigate").level
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Rockets") or mod.charge.requiresSkill("Light Missiles"),
"kineticDamage", ship.getModifiedItemAttr("shipBonusMF2") * level)

View File

@@ -1,7 +0,0 @@
# Used by:
# Ship: Breacher
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Minmatar Frigate").level
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Rockets") or mod.charge.requiresSkill("Light Missiles"),
"thermalDamage", ship.getModifiedItemAttr("shipBonusMF2") * level)

View File

@@ -1,6 +1,7 @@
# Used by:
# Variations of ship: Mammoth (2 of 2)
# Ship: Hoarder
# Ship: Mammoth Nefantar Edition
# Ship: Prowler
type = "passive"
def handler(fit, ship, context):

View File

@@ -7,14 +7,12 @@ def handler(fit, module, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Capital Energy Turret") or \
mod.item.requiresSkill("Capital Hybrid Turret") or \
mod.item.requiresSkill("Capital Projectile Turret"),
"damageMultiplier", module.getModifiedItemAttr("damageMultiplierBonus"),
stackingPenalties=True)
"damageMultiplier", module.getModifiedItemAttr("damageMultiplierBonus"))
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Capital Energy Turret") or \
mod.item.requiresSkill("Capital Hybrid Turret") or \
mod.item.requiresSkill("Capital Projectile Turret"),
"trackingSpeed", module.getModifiedItemAttr("trackingSpeedBonus"),
stackingPenalties=True)
"trackingSpeed", module.getModifiedItemAttr("trackingSpeedBonus"))
#Missiles
for type in ("kinetic", "thermal", "explosive", "em"):

View File

@@ -1,5 +1,5 @@
# Used by:
# Skill: Armor Resistance Phasing
# Used by:
# Skill: Armor Resistance Phasing
type = "passive"
def handler(fit, skill, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Armor Resistance Shift Hardener",

Some files were not shown because too many files have changed in this diff Show More