Compare commits

...

243 Commits

Author SHA1 Message Date
blitzmann
7032baa7ef Add some logic to disable from CREST menu items if character is not logged in 2015-10-25 22:02:15 -04:00
blitzmann
b52cbef26f Clean up some imports, get rid of CharacterInfo window. 2015-10-25 21:49:24 -04:00
blitzmann
34f699b96a Use cached_until value for GUI countdown 2015-10-25 21:44:24 -04:00
blitzmann
5b341dfc06 pycrest now injects cached until value into the results 2015-10-25 21:44:04 -04:00
blitzmann
cb0003b942 Use deepcopy instead of copy. Fixes issue with using same session object across characters 2015-10-25 20:17:42 -04:00
blitzmann
6ee6186280 Make a post thing for pycrest. Still having authentication errors occasionally. 2015-10-25 19:51:58 -04:00
blitzmann
781abeea53 Implement a character cache, as the database-layer cache is seemingly not working. =/ 2015-10-25 19:41:12 -04:00
blitzmann
6496164d95 Merge branch 'crest_fitting' of https://github.com/DarkFenX/Pyfa into crest_fitting 2015-10-25 18:14:46 -04:00
blitzmann
1ce2921eb7 Put current character info in titlebar, and disable getting image. 2015-10-25 18:14:12 -04:00
blitzmann
6eb6925606 Move html 2015-10-25 17:55:39 -04:00
blitzmann
9d7a3605dc Use timers properly 2015-10-25 17:52:53 -04:00
blitzmann
056e961ccc use webrowser module to open URIs (had some difficulty with LaunchDefaultBrowser on OS X) 2015-10-25 14:46:24 -04:00
blitzmann
8f08f8efb8 Make sure httpd server stops after a certain time frame. 2015-10-25 00:09:33 -04:00
blitzmann
167eb60fe3 Added logic to find CA certs for SSL connections (for frozen apps) and added some logging 2015-10-24 23:32:15 -04:00
blitzmann
c04b7e0552 Revert "Add tomorrow to repo rather than dependency" - going to including it in skel rebuild
This reverts commit ff87d5e456.
2015-10-24 22:51:46 -04:00
blitzmann
ff87d5e456 Add tomorrow to repo rather than dependency 2015-10-24 22:39:43 -04:00
blitzmann
c81774a3aa Move pycrest to service (might move it to utils later, dunno) 2015-10-24 22:28:31 -04:00
blitzmann
a5920a9c9c Added missing files (and fix why they were missing) 2015-10-24 16:46:45 -04:00
blitzmann
c103e563a9 remove old import 2015-10-24 16:23:54 -04:00
blitzmann
08382db011 Add character management window, ability to add and delete crest characters, and fix issue with not having default client ID available. 2015-10-23 21:26:38 -04:00
blitzmann
9929510e53 More work on CREST stuff. Now implicit character can GET and POST fits. 2015-10-23 19:14:43 -04:00
blitzmann
f6cddcc86d Add to repo missing preferences panel 2015-10-23 19:12:05 -04:00
blitzmann
953a70327a Fix (hack at) pycrest to fix caching issue when getting another character. 2015-10-23 01:21:51 -04:00
blitzmann
6e04c64ffb Changed login box to show currently logged in character with timer, and we now fetch the character image. 2015-10-23 00:52:03 -04:00
blitzmann
e0f99ee133 Start refinement of CREST utilities:
* Add preference page which gives option of implicit grant or user client details
* Improve CREST service
* Changes in pycrest which make things a little easier
2015-10-21 23:10:06 -04:00
blitzmann
69a4e42ab0 Forgot the server 2015-10-19 21:34:47 -04:00
blitzmann
8151debfe1 Can now login to SSO from pyfa, which completes basic integration. This is very crude, will be refined. 2015-10-19 20:09:39 -04:00
blitzmann
972df6cad3 Add support for importing CREST fittings from clipboard and through EVE Fittings browser 2015-10-18 23:38:21 -04:00
blitzmann
b1729095a0 Export fitting to EVE, fix json bugs, and include forgotten CREST service. 2015-10-18 17:13:19 -04:00
blitzmann
23dbb59f3f Couple fixes 2015-10-18 01:46:41 -04:00
blitzmann
9269c54434 Implement exporting in CREST format 2015-10-18 01:33:39 -04:00
blitzmann
c4246c0d50 Added CREST service and first pass of fitting resource browsing. I want to completely rework this eventually, but right now just focused on getting a rough draft going. 2015-10-18 00:21:01 -04:00
blitzmann
d013a41079 Added CREST client data (for SISI), and rudimentary database support. Valid data has to be manually entered at this time, but the loading of the crest character works and uses pycrest correctly 2015-10-17 21:47:55 -04:00
blitzmann
94995685e9 Added pycrest with a few fixes. 2015-10-17 21:41:24 -04:00
blitzmann
11c3859270 Added small server script to be used as CREST callback. This can listen for and print the authorization code. 2015-10-16 15:39:40 -04:00
blitzmann
5246432420 Fix triage effects 2015-10-12 19:30:09 -04:00
blitzmann
8ccdbcc51d Fixed generating .exe on Linux. 2015-10-11 21:49:28 -04:00
blitzmann
81c2895c9e Fix dist script 2015-10-12 00:00:10 -04:00
blitzmann
cbb31c1217 Update dist.py 2015-10-11 19:15:40 -04:00
blitzmann
6c80d15f1d Close update dialog, don't destroy (OSX bug fixes) 2015-10-09 17:43:23 -04:00
blitzmann
4baa6e9e9f Switch over wx.BusyInfo from custom wait dialog 2015-10-09 13:04:06 -07:00
blitzmann
2e998bd5a4 Merge branch 'master' into osx_fixes 2015-10-09 12:20:07 -07:00
blitzmann
a33ec89e87 Fix issue that caused fits that were supposed to open in the background to calculate. Unfortunately this fix breaks the tab snapshot, will have to figure that out later 2015-10-09 18:32:03 -04:00
blitzmann
ba9232e514 Fix preferences dialog 2015-10-09 09:10:37 -07:00
blitzmann
f090cafa5c OS X distributive was pointing to the wrong path for the pyfa root, due to the executable being in a different place than the actual root. This changes the logic to use sys.executable as a fallback when __file__ doesn't exist (for example in the windows distributive) 2015-10-08 15:23:51 -04:00
blitzmann
a67b46bb9a Fix some mining effects 2015-10-05 20:37:41 -04:00
blitzmann
f17fb82ce7 Fix issue with ship bonuses not applying when fit is projected (#374) 2015-10-05 18:10:39 -04:00
blitzmann
3f6c484c99 Fix paths that point to eve.db 2015-10-05 12:33:07 -04:00
blitzmann
11cf4b356c Correct GUI problem with character editor 2015-10-05 03:26:41 -04:00
blitzmann
231cdb8399 Fix minor default settings, fix dist script for wx3 merge 2015-10-04 22:07:23 -04:00
blitzmann
30f077027b Update README.md 2015-10-04 21:37:02 -04:00
blitzmann
8a2c4671bf Update README.md 2015-10-04 21:34:53 -04:00
blitzmann
35f56b9c32 Rename gpl.txt to LICENSE 2015-10-04 21:34:36 -04:00
blitzmann
ae3bd9d9d4 Fix additions toggle to fully collapse 2015-10-04 18:58:55 -04:00
blitzmann
9465aceddb Add splitter between fitting and additions 2015-10-04 18:28:15 -04:00
blitzmann
8e353b08ae Fix some weirdness with come columns 2015-10-04 17:16:48 -04:00
blitzmann
a5f1370eec Fit system effects not applying to projected fits. 2015-10-04 13:17:13 -04:00
blitzmann
b454ac003b Present error message if HTML Export path does not exist 2015-10-04 15:36:56 -04:00
blitzmann
17d353e09b Fix crash with GUI HTML export, and clean up dialogs. 2015-10-04 15:24:53 -04:00
blitzmann
365cacac66 Fix #371 2015-10-02 11:16:41 -04:00
blitzmann
30fef3039c Merge branch 'wx3' 2015-10-01 21:16:06 -04:00
blitzmann
6f161b495f Bump dev version 2015-10-01 21:15:53 -04:00
blitzmann
582e54e758 Fix a few things in inno script 2015-09-29 22:48:50 -04:00
blitzmann
072fac4259 Merge branch 'master' into wx3 2015-09-29 21:35:44 -04:00
DarkPhoenix
4e890e1e1d Update database to tq version and bump version in config 2015-09-29 22:28:49 +03:00
DarkPhoenix
473b70944f Merge branch 'singularity' 2015-09-29 22:25:36 +03:00
blitzmann
37b158439d Fix #359 2015-09-28 20:32:55 -04:00
blitzmann
2617143330 Fix #363 2015-09-27 18:16:54 -04:00
blitzmann
a3b108382e Move eve.db to root 2015-09-27 09:45:44 -04:00
blitzmann
e07c162453 Reduce confusion with number of cycles vs charges 2015-09-26 19:17:22 -04:00
blitzmann
0f8992432b Merge branch 'master' into wx3
Conflicts:
	gui/characterEditor.py
2015-09-26 18:53:28 -04:00
blitzmann
c751544560 Do not show level change menu for All 5/0 in char editor 2015-09-25 12:56:40 -04:00
blitzmann
1d51e86c1c Added individual skill save to context menu 2015-09-25 12:16:11 -04:00
blitzmann
05b9d1e607 Fixed some bugs, added character action buttons on editor 2015-09-25 12:13:17 -04:00
blitzmann
2a88e3114b Skill color goes back to normal when saving/reverting skill. 2015-09-25 11:15:08 -04:00
blitzmann
a0f9fb6ad6 Enable/disable edit menu options, and add color to character editor to show which skills are edited 2015-09-24 22:11:31 -04:00
blitzmann
b844bdf986 Add save character as dialog 2015-09-24 20:46:07 -04:00
blitzmann
61614553a2 Fix bug with char copy, and added char revert and save as (unfinished) 2015-09-24 19:03:30 -04:00
blitzmann
ae870f9535 Merge branch 'newTempChar' 2015-09-24 17:16:14 -04:00
blitzmann
30a8437515 Fix returning unicode with __repr__ and __str__. Fixes #356 2015-09-24 14:15:54 -04:00
blitzmann
8647fa245f Fix Jump Drive Economizer. It does not project, and is only applies bonus when online. 2015-09-24 13:09:43 -04:00
blitzmann
23bb763c51 Fix system effects to respect their state 2015-09-24 13:09:25 -04:00
blitzmann
c158cb076f Fix dist script for icons 2015-09-24 12:43:20 -04:00
blitzmann
b1ebf8562a Incorporate icon zipfile making into dist script 2015-09-24 12:27:29 -04:00
blitzmann
e9d02ce4c8 Change to use BitmapLoader class 2015-09-24 12:21:50 -04:00
blitzmann
ec6914d4aa Bitmap Loader is now a proper class, and can be used to load images from zipfile 2015-09-24 12:18:33 -04:00
blitzmann
474f270b26 Change to new icon locations 2015-09-24 12:17:17 -04:00
blitzmann
fb7574e476 Remove extra location stuff from bitmap loader 2015-09-24 11:45:24 -04:00
blitzmann
760b5f3d74 Change in icon layout in preparation for better icon loading. 2015-09-24 11:44:20 -04:00
DarkPhoenix
51c481206c Bump version to make preview build 2015-09-24 01:15:56 +03:00
DarkPhoenix
7b6b922c57 Update database to 965413 and implement BC changes 2015-09-24 01:08:20 +03:00
blitzmann
a08bb2494b Fix system effect states 2015-09-22 21:45:32 -04:00
blitzmann
4affc24ec7 update setup.py 2015-09-20 20:47:16 -04:00
blitzmann
d7cb0d536f Polish the Inno script to delete left overs and only uninstall if version is before a certain milestone. 2015-09-19 23:14:53 -04:00
blitzmann
bf9a4b4919 Run uninstall before installing. Removes old files. Still need version checker and deleting pyc/pyo files 2015-09-18 19:48:06 -04:00
blitzmann
3ea4439b8d Allow changing all 5 and 0 from editor 2015-09-18 11:59:52 -04:00
blitzmann
bd53785667 Allow all 5 and 0 to change skills from affecting skill menu 2015-09-14 20:35:36 -04:00
blitzmann
f2b4400834 Do auto-save when editing in character editor. 2015-09-14 20:30:12 -04:00
blitzmann
b8d01d5ecb Fix a few things 2015-09-13 16:59:59 -04:00
blitzmann
9ae5cfbab2 Revert "Fix API stuff. This should theoretically work, but it's untested."
This reverts commit 1402ceec63.
2015-09-13 16:57:22 -04:00
blitzmann
045031e8ae Revert "Fix character rename, delete, and copy."
This reverts commit c72f049ccd.

Conflicts:
	service/character.py
2015-09-13 16:55:32 -04:00
blitzmann
2c7bfd14b6 Revert "Separate characters from Fit relationship..."
This reverts commit 3521b3887d.

Conflicts:
	eos/db/saveddata/queries.py
2015-09-13 16:53:42 -04:00
blitzmann
1584586fd2 Try a different approach to temp skill levels 2015-09-13 16:51:36 -04:00
blitzmann
1402ceec63 Fix API stuff. This should theoretically work, but it's untested. 2015-09-12 13:15:59 -04:00
blitzmann
4663270067 Since we now have a list of skills by default on our character, remove the iterSkills iterator which helped fetch skills that were not previously loaded 2015-09-12 11:06:21 -04:00
blitzmann
0b9cdaa944 Change the way skills are loaded. We now load all skills when character is created, instead of just creating character and loading skills on demand. This fixes a bug in which new characters were not saving their skills to the database. 2015-09-12 10:59:44 -04:00
blitzmann
89c011d37e Minor modifications. 2015-09-12 10:30:51 -04:00
blitzmann
c72f049ccd Fix character rename, delete, and copy. 2015-09-09 23:12:59 -04:00
blitzmann
ca34217f3b Added character saving.
Deleting characters is broken for now due to using wrong session, but I believe creating character works. Further tests needed
2015-09-09 20:33:15 -04:00
blitzmann
3521b3887d Separate characters from Fit relationship and create new character session. At this point, changes to characters do not persist. Efforts must still be made to focus on creating a character save function as well as ensure characters that are dirty are loaded correctly for fresh fits. 2015-09-09 19:08:38 -04:00
blitzmann
492776c5a8 Fix Scram effect to turn off MWDs. Fixes #70 2015-09-06 11:06:52 -04:00
blitzmann
51a8076d30 Comment cleanup 2015-09-01 23:29:47 -04:00
blitzmann
decf7ff028 Fix #351 2015-09-01 23:23:52 -04:00
DarkPhoenix
31b1c94c0f Add AT13 prize ships 2015-09-01 01:26:30 +03:00
DarkPhoenix
a9fc457510 Bump dev version 2015-09-01 00:09:10 +03:00
blitzmann
7c3c8182a7 Fix initial database creation 2015-08-28 22:03:54 -04:00
blitzmann
b162927f79 Merge branch 'master' into wx3 2015-08-27 22:05:38 -04:00
blitzmann
6dbed1403a Bump stable 2015-08-27 21:50:13 -04:00
blitzmann
aa5eb7ac92 Update DB, force Imp and Fiend as not published again (will publish these when they are live) 2015-08-27 21:49:06 -04:00
blitzmann
e0fbcc91f1 Update effect headers 2015-08-25 17:47:15 -04:00
blitzmann
b2dce223b0 Add AT13 prizes 2015-08-25 17:42:34 -04:00
blitzmann
4b7b22025c Add new drifter incursion effect 2015-08-25 17:39:57 -04:00
blitzmann
8e37dab37e Disallow assistance with active Estonis link 2015-08-25 17:37:17 -04:00
blitzmann
6e95f69565 Support speedLimit introduced with Entosis Link 2015-08-25 17:26:25 -04:00
blitzmann
31331b1e34 Update to 957210 - Galatea 1.0 2015-08-25 17:25:12 -04:00
blitzmann
05b3777ad2 Add build directory to ignore file. 2015-08-25 16:06:38 -04:00
blitzmann
cda8dd4c8b Windows skel has an issue with this, so if there is an issue, use default path to cache file. 2015-08-21 19:04:42 -04:00
blitzmann
e7542fec44 move debug setting, remove debug print 2015-08-21 18:23:46 -04:00
blitzmann
e7fcdd86ac Well, adding this caused severe issues. >_> 2015-08-21 18:02:06 -04:00
blitzmann
d909e8adc4 Fix config file, clean up pyfa.py 2015-08-21 16:48:07 -04:00
blitzmann
def20311a8 New migration import mechanics, borrowed from market conversion imports, because we can't os.listdir from a zipfile 2015-08-21 15:10:00 -04:00
blitzmann
503907e2d8 Fix setup so that we can execute it from dist script and not have it complain 2015-08-21 15:08:51 -04:00
blitzmann
88dc1edfb4 Work on dist script 2015-08-21 15:08:23 -04:00
blitzmann
cbedf03026 Another fix to prep_data. I'll get this right one day 2015-08-21 12:08:57 -04:00
blitzmann
a69589dd23 Merge pull request #346 from Will-W/master
Context menu to swap modules for different variation
2015-08-18 13:08:15 -04:00
Will Wykeham
2904ab6afa Non-windows platform fix for variations menu 2015-08-18 15:59:02 +01:00
Will Wykeham
c763595cc4 Remove debug print statement 2015-08-17 15:41:58 +01:00
Will Wykeham
8fe97180ed Sort higher metalevel items properly in variations menu 2015-08-16 21:56:39 +01:00
Will Wykeham
6a4b2ffe69 Make variations menu handle multiple selections
Ensure the variations menu only shows when you've got
a matching set of items selected.
2015-08-16 21:45:20 +01:00
Will Wykeham
7f100353e2 Make variations menu actually swap out module
Functional, but not handling multiple selections well
2015-08-16 18:30:27 +01:00
Will Wykeham
97ac0804c5 Add Submenu of variations of module type.
Non functional so far.
2015-08-15 19:35:31 +01:00
blitzmann
48f96a7a32 Merge branch 'master' into wx3
Conflicts:
	config.py
	staticdata/icons/icon01_08.png
	staticdata/icons/icon02_11.png
	staticdata/icons/icon105_46.png
	staticdata/icons/icon105_47.png
	staticdata/icons/icon105_48.png
	staticdata/icons/icon105_49.png
	staticdata/icons/icon108_5.png
	staticdata/icons/icon113_64_1.png
	staticdata/icons/icon113_64_2.png
	staticdata/icons/icon113_64_3.png
	staticdata/icons/icon34_16.png
	staticdata/icons/iconMarketIcon_16px_Amarr.png
	staticdata/icons/iconMarketIcon_16px_Caldari.png
	staticdata/icons/iconMarketIcon_16px_Gallente.png
	staticdata/icons/iconMarketIcon_16px_Minmatar.png
2015-08-15 10:50:58 -04:00
DarkPhoenix
598512a904 Fix stacking penalties on active tank effects 2015-08-13 02:21:24 +03:00
DarkPhoenix
121a81ce70 Remove few debugging prints 2015-08-11 15:59:38 +03:00
blitzmann
a2e031cf27 Fix prep_data script so that it actually works 2015-08-09 23:20:00 -04:00
DarkPhoenix
f18ba6160a Do 2 blank lines between cargo contents and the rest of the fit, and when exported with the implants - do cargo items after the implants 2015-08-08 13:36:16 +03:00
blitzmann
c2ca5dffe8 Fix incorrect bitmap rendering of OSX-wx3. MacSetTheme was removed, but it's still required for 2.8 otherwise we get an off-color background 2015-08-04 23:48:31 -04:00
blitzmann
ab7bbcb6ef Remove matplotlib's font cache. Fixes #234 2015-08-04 22:18:28 -04:00
blitzmann
e5e7311748 Revert "Fix preferenceDialog list view width" and actually fix it. OS X untested
This reverts commit 9ba3ca3f5f.
2015-07-26 19:34:42 -04:00
blitzmann
9ba3ca3f5f Fix preferenceDialog list view width 2015-07-26 19:19:53 -04:00
blitzmann
cc59612fa4 Debug logging when flag is set 2015-07-23 16:58:55 -04:00
Ryan Holmes
01db1efdf7 Merge pull request #336 from blitzmann/regSkills
Register skills when applying ship bonuses
2015-07-23 15:58:07 -04:00
blitzmann
e74e2615ad Merge remote-tracking branch 'origin/projections' 2015-07-23 15:46:32 -04:00
blitzmann
2f246d0897 Add context menu to affected by list 2015-07-23 15:32:27 -04:00
DarkPhoenix
505b0ce38f Clear info dicts in-place instead of replacing them with new ones
Sometimes it can cause fuckups, so who knows how PIL works with them...
2015-07-23 20:34:02 +03:00
DarkPhoenix
8c19a956e0 Strip ICC color profile data
Fixes #337
2015-07-23 20:32:40 +03:00
blitzmann
9de3600d7f Fix self-boosting 2015-07-23 01:38:51 -04:00
blitzmann
5a4f526b2b Fix fit copying 2015-07-22 14:27:44 -04:00
blitzmann
cd0b0eada0 Fix graphing 2015-07-22 13:12:57 -04:00
blitzmann
17733d5951 Added missing tactical mode calculations... whoops 2015-07-22 13:02:08 -04:00
blitzmann
0a1f324053 Fix Advanced Spaceship Command skill and resists for Occator 2015-07-21 12:27:46 -04:00
blitzmann
e12b3f3054 Merge tag 'v1.13.2' into wx3
Conflicts:
	config.py
	A lot of icons
2015-07-20 13:21:00 -04:00
blitzmann
b32f76cfde Show affecting skills for charges as well 2015-07-19 16:39:07 -04:00
blitzmann
182104a010 Fix #109 2015-07-19 16:20:42 -04:00
blitzmann
90c883da67 Fix some syntax errors. 2015-07-19 15:51:03 -04:00
blitzmann
ac08b1b264 Add check for current skill level 2015-07-19 15:16:29 -04:00
blitzmann
f17d015ebe Fix having multiple skills in skill list (happens when multiple attributes are modified) 2015-07-19 15:02:50 -04:00
blitzmann
d496637614 Add ship skill bonuses to modified modules. Modify effect files for new skill parameter. Enable affecting skill menu. 2015-07-19 14:19:24 -04:00
blitzmann
4596c526a2 Fix #335 - properly represent charge modifiers 2015-07-18 23:39:16 -04:00
blitzmann
9941b6c74b Make default view module again 2015-07-18 15:23:10 -04:00
blitzmann
b06ce24d4a Fix attribute view items (two of the same item would merge into one, even if they had different modifiers. now simply list them individually) 2015-07-18 15:20:15 -04:00
blitzmann
2f8c201ab3 Add attribute view 2015-07-18 14:45:26 -04:00
blitzmann
d184820728 Fix toggle attribute names. Previous way assumed no other trees apart from first child and siblings. Not true now with projected fit trees. Instead of attempting to walk the tree, we simply store the items in a list that we later iterate over. Much easier 2015-07-17 18:28:31 -04:00
blitzmann
40aeb1ed4a Move active fir to init, fixes bug when refreshing with another active fit 2015-07-17 16:33:07 -04:00
blitzmann
71b258a8f5 Merge fit attributes with ship 2015-07-17 16:32:42 -04:00
blitzmann
cd7579a4bf Fix #332 - offline rigs calculated in calibration stats 2015-07-17 00:01:31 -04:00
blitzmann
d6199a58c2 Separate projected fits from list of affectors. Also, show when affected module is projected. Still need to clean up affector tree stuff 2015-07-16 23:59:37 -04:00
blitzmann
3ad5aaac89 Fix #331 - gang boosts not applied to self projection 2015-07-15 16:52:09 -04:00
blitzmann
3bed268d81 Fix use case for downgrading and adding a row with NULL 2015-07-14 19:13:56 -04:00
blitzmann
9a1b0f07c0 Added documentation on why projections don't respect the __calculated flag which gang boosts do 2015-07-14 16:32:10 -04:00
blitzmann
f591ecba10 Fix use case where gang boosts were not being applied when projections were added/removed. 2015-07-14 16:15:52 -04:00
blitzmann
c571fdc5e6 Fit fit alterations with self projections 2015-07-13 19:29:23 -04:00
DarkPhoenix
6f944fc7db Stacking penalize missile flight time rigs 2015-07-12 02:12:59 +03:00
blitzmann
63fce4be17 Handle self projections by creating a copy of the fit. Due to the way effects are calculated, we would have double effects implemented if not for the copy 2015-07-11 16:28:09 -04:00
blitzmann
86ee5292d8 Fix fit copying and deleting fits not being reflected in other fits. 2015-07-11 12:43:47 -04:00
blitzmann
0060f58e3d Support evemon character imports. 2015-07-11 10:17:02 -04:00
blitzmann
23b458534f Remove unneeded collection class for projected fits 2015-07-10 23:22:58 -04:00
blitzmann
2256efacb0 Do migration stuff for projected fits 2015-07-10 16:40:00 -04:00
blitzmann
28a5318e3b Merge branch 'master' into toggleProjectionFit
Conflicts:
	config.py
2015-07-10 16:09:00 -04:00
blitzmann
609ee13cd6 Redirect stderr and stdout to logger when we are frozen. Need to test this. 2015-07-10 15:58:45 -04:00
blitzmann
4216904736 Remove function to remove projected fits correctly. This is now handled by proper DB relationships 2015-07-10 15:46:42 -04:00
blitzmann
496e9b56b5 Handle use case of invalid fit's mucking things up 2015-07-10 15:46:15 -04:00
blitzmann
b8f73a7c94 bump dev 2015-07-10 12:58:03 -04:00
blitzmann
b4604f8207 Bump Stable... maybe it will be this time 2015-07-10 12:17:14 -04:00
blitzmann
68dddf2810 Fix for init projected fit. Took a long time to figure out what was happening. 2015-07-10 11:58:15 -04:00
blitzmann
4c17f38b1a Fix for #324 - do not reset itemID automatically upon removal due to way modules are swapped. 2015-07-09 18:36:11 -04:00
blitzmann
221a3fde14 Being extra cautious 2015-07-09 18:18:36 -04:00
blitzmann
c17e03d8d0 Fixes critical design issue when it comes to projected fits. Disabled some of the more advanced functionality (projection amount and active) to cope to development. Crash still happens occasionally when adding projected fit for unknown reasons - not 100% reproducable yet 2015-07-09 17:53:41 -04:00
blitzmann
af9f64db5f Move the chain into the runtime loop, otherwise projections won't work for some odd reason. 2015-07-09 14:48:15 -04:00
blitzmann
1f82465a65 Return None for price column on ship modes, fixes #322 2015-07-09 12:13:13 -04:00
blitzmann
d885bd4636 Bump dev and Fix #321 - oversight in tactical mode selection 2015-07-09 11:48:11 -04:00
blitzmann
c17bce55bb Lots of stuff
- Added logging and replaced Timer class with more useful one
- Move projected fit loop out of runtimes
- Eliminate recursions from Fit.clear()
- Clean up overall fit calc logic
2015-07-09 10:43:39 -04:00
blitzmann
23309a5da6 Remove unneeded code that created a bitmap for checkboxes 2015-07-07 13:49:40 -04:00
blitzmann
06e4a7e80f Support changing amount of projected fits 2015-07-07 13:49:39 -04:00
blitzmann
b95a10d284 Add active column. Looping the fit to apply it x amount of times doesn't seem to work. Probably because it's been flagged calculated and returns early 2015-07-07 13:49:38 -04:00
blitzmann
2bca3ddcc8 GUI support (also made regular checkboxes pretty for drones/implant/etc) 2015-07-07 13:49:37 -04:00
blitzmann
9ef182aa99 First working prototype of toggleable projected fits. Creates a new association object that stores projection-specific information. GUI hasn't been touched (need to show state), and there are a lot of variables that I need to rename. 2015-07-07 13:49:35 -04:00
blitzmann
5372f31be8 Revert "Revert "Merge branch 'master' into wx3"". So many reverts.
This reverts commit cca7f1112a.
2015-06-27 21:53:59 -04:00
blitzmann
6d01877d78 Merge branch 'master' into wx3
Conflicts:
	pyfa.py
2015-06-27 19:33:12 -04:00
blitzmann
030f22b66f Merge branch 'debugGtk' into wx3 2015-06-27 18:25:31 -04:00
blitzmann
a4fe3fe142 Fix crash in character editor 2015-06-27 15:56:34 -04:00
blitzmann
5b0857e169 Ensure that resources gauge is not drawn with a width of 0 to make GTK happy 2015-06-27 15:35:22 -04:00
blitzmann
975a414c5f Ensure that SetSize() does not take values less than -1 2015-06-27 14:39:35 -04:00
blitzmann
8a7e69b902 Fix progress dialog stuff. Closes #281 2015-06-25 16:43:39 -04:00
blitzmann
da16f6cee7 Fix closing of progress dialogs 2015-06-20 15:00:02 -04:00
blitzmann
f285395e0f Fix black bitmap when dragging fit, closes #303 2015-06-17 19:43:48 -04:00
blitzmann
b54e3aeaf9 See #303 2015-06-16 15:28:23 -04:00
blitzmann
eb2f4991ee Fix search in wx3 (and remove some needless crap... seriously, why was all that there?) 2015-06-04 22:48:46 -05:00
blitzmann
16017a3c31 Remove middle click to open new page, fixing wx3 deprecation warning (didn't seem to work anyway) 2015-06-04 21:01:49 -05:00
blitzmann
98d9adef8a Fix for libpng hating our color profiles 2015-06-04 17:27:11 -05:00
blitzmann
e7264108dd Fix #287 2015-05-05 23:23:38 -04:00
blitzmann
2bcbb03c10 Fix #286 and another minor bug related to colors 2015-05-05 22:56:40 -04:00
DarkPhoenix
9cf20942f1 Change validator requirement for owner ID
This fixes bug related to sqlalch 1.0
2015-05-01 20:15:08 +03:00
DarkPhoenix
dbb98e981a Merge branch 'wx3' of github.com:DarkFenX/Pyfa into wx3 2015-05-01 19:03:04 +03:00
DarkPhoenix
3ae39b2e7c Remove unused import 2015-05-01 19:02:13 +03:00
DarkPhoenix
7b43b516c9 Add effect i should've added for mosaic release 2015-05-01 18:50:11 +03:00
DarkPhoenix
12d6a2c5de Bundle runtime libs with windows executable 2015-05-01 16:37:13 +03:00
DarkPhoenix
26bba49193 Work around bug in wxpython
Button is specified as property in wx docs, but it returns bound method instead of actually being a property
2015-05-01 16:00:26 +03:00
DarkPhoenix
4e69a2656c Add some options for Mac binary generation
Can't test it atm, but whatever
2015-05-01 15:37:09 +03:00
DarkPhoenix
68d504c79d Force writing errors/output to file in case of frozen distributive 2015-05-01 15:08:14 +03:00
DarkPhoenix
2180b1ac3b Add folder with assets used for distributives 2015-05-01 14:50:09 +03:00
DarkPhoenix
32712a8798 Fetch app version from config file 2015-05-01 14:20:01 +03:00
DarkPhoenix
73c7ad55b6 Add comment which shows how to use script 2015-05-01 14:00:31 +03:00
DarkPhoenix
a34c5ace5c Change setup file to make sure msi installer can be built 2015-05-01 13:54:40 +03:00
DarkPhoenix
fd77661f41 Tune setup file a bit more 2015-05-01 04:02:10 +03:00
DarkPhoenix
ad07cf25d8 Settle on just Tkinter in excludes 2015-05-01 03:23:57 +03:00
DarkPhoenix
4daf1b1ba3 Merge branch 'wx3' of github.com:DarkFenX/Pyfa into wx3 2015-05-01 01:28:18 +03:00
DarkPhoenix
4b189ab146 Remove obsolete readme 2015-05-01 01:27:54 +03:00
DarkPhoenix
64a69e3910 Remove tcl/tk from distributive 2015-05-01 01:27:07 +03:00
DarkPhoenix
9482404ca7 Remove setting locale
Who knows what it may cause, i'm not an wx expert, but wx3 bundled with xc_freeze keeps bitching about it...
2015-05-01 00:04:35 +03:00
DarkPhoenix
124d4fab9b Change the way we fetch conversions from package to make it compatible with frozen and packed builds 2015-04-30 23:59:56 +03:00
DarkPhoenix
722406f636 Change the way we detect root
This is needed for executable freeze to work correctly
2015-04-30 23:08:42 +03:00
DarkPhoenix
6d4957b148 Add setup.py for building binary distributives with wx3 2015-04-30 22:24:27 +03:00
2785 changed files with 5113 additions and 2991 deletions

3
.gitignore vendored
View File

@@ -13,10 +13,11 @@
*.patch
#Personal
saveddata/
/saveddata/
#PyCharm
.idea/
#Pyfa file
pyfaFits.html
build/

View File

View File

@@ -1,22 +1,47 @@
# Pyfa
# pyfa
Pyfa is a cross-platform desktop fitting application for EVE online that can be used natively on any platform where python and wxwidgets are available.
![pyfa](https://cloud.githubusercontent.com/assets/3904767/10271512/af385ef2-6ade-11e5-8f67-52b8b1e4c797.PNG)
It provides many advanced features such as graphs and full calculations of any possible combination of modules, fits, etc.
## What is it?
Please see the [FAQ](https://github.com/DarkFenX/Pyfa/wiki/FAQ) for answers to common questions / concerns
pyfa, short for **py**thon **f**itting **a**ssistant, allows you to create, experiment with, and save ship fittings without being in game. Open source and written in Python, it is available on any platform where Python 2.x and wxWidgets are available, including Windows, Mac OS X, and Linux.
#### A note for Linux users
pyfa currently only supports wxPython 2.8. However, there are some distros that have started to support 3.0 and subsequently dropped support for 2.8 altogether (such as Debian Jessie). If this is the case and wxPython 3.0 is the only version installed, the official pyfa releases will not run. You must either find a package for 2.8 or compile it yourself.
## Latest Version and Changelogs
The latest version along with release notes can always be found on the projects [Releases](https://github.com/DarkFenX/Pyfa/releases) page. pyfa will notify you if you are running an outdated version.
For Debian Jessie, wxPython 2.8 is available in Sid (the unstable repo). you can use apt-pinning to install select packages from unstable and still keep your stable system. See http://jaqque.sbih.org/kplug/apt-pinning.html for me details.
## Installing
Windows and OS X users are supplied self-contained builds of pyfa that can be run without additional software. An `.exe` installer is also available for the Windows builds. There is no self-contained package for Linux users, which are expected to run pyfa through their distributions Python interpreter. However, there are a number of third-party packages available that handle the dependencies and updates for pyfa (for example, [pyfa for Arch Linux](https://aur.archlinux.org/packages/pyfa/)). Please check your distributions repositories.
3.0 support is being worked on and can be found on the wx3 branch. It may be stable enough for you, but there are a few bugs related to it. Please see the wx3 label on the GitHub issues area for me information on known issues (biggest one currently is GTK warning spam): https://github.com/DarkFenX/Pyfa/labels/wx3
## Requirements
If you wish to help with development or simply need to run pyfa through a Python interpreter, the following software is required:
#### Links
* [Development repository: http://github.com/DarkFenX/Pyfa](http://github.com/DarkFenX/Pyfa)
* [XMPP conference:
pyfa@conference.jabber.org](pyfa@conference.jabber.org)
* Python >= 2.6
* `wxPython` 2.8/3.0
* `sqlalchemy` >= 0.6
* `dateutil`
* `matplotlib` (for some Linux distributions, you may need to install separate wxPython bindings, such as `python-matplotlib-wx`)
## Bug Reporting
The preferred method of reporting bugs is through the projects GitHub Issues interface. Alternatively, posting a report in the pyfa thread on the official EVE Online forums is acceptable. Guidelines for bug reporting can be found on [this wiki page](https://github.com/DarkFenX/Pyfa/wiki/Bug-Reporting).
## Liscense
pyfa is licensed under the GNU GPL v3.0, see LICENSE
## Resources
* Development repository: [http://github.com/DarkFenX/Pyfa](http://github.com/DarkFenX/Pyfa)
* XMPP conference: [pyfa@conference.jabber.org](pyfa@conference.jabber.org)
* [EVE forum thread](http://forums.eveonline.com/default.aspx?g=posts&t=247609)
* [EVE University guide using pyfa](http://wiki.eveuniversity.org/Guide_to_using_PYFA)
* [EVE Online website](http://www.eveonline.com/)
## Contacts:
* Kadesh Priestess
* GitHub: @DarkFenX
* [TweetFleet Slack](https://www.fuzzwork.co.uk/tweetfleet-slack-invites/): @kadesh
* Sable Blitzmann
* GitHub: @blitzmann
* [TweetFleet Slack](https://www.fuzzwork.co.uk/tweetfleet-slack-invites/): @blitzmann
* Email: sable.blitzmann@gmail.com
## CCP Copyright Notice
EVE Online, the EVE logo, EVE and all associated logos and designs are the intellectual property of CCP hf. All artwork, screenshots, characters, vehicles, storylines, world facts or other recognizable features of the intellectual property relating to these trademarks are likewise the intellectual property of CCP hf. EVE Online and the EVE logo are the registered trademarks of CCP hf. All rights are reserved worldwide. All other trademarks are the property of their respective owners. CCP hf. has granted permission to Osmium to use EVE Online and all associated logos and designs for promotional and information purposes on its website but does not endorse, and is not in any way affiliated with, Osmium. CCP is in no way responsible for the content on or functioning of this website, nor can it be liable for any damage arising from the use of this website.

View File

@@ -17,38 +17,69 @@ debug = False
# Defines if our saveddata will be in pyfa root or not
saveInRoot = False
logLevel = logging.WARN
# Version data
version = "1.13.1"
tag = "Stable"
expansionName = "Aegis"
version = "1.15.1"
tag = "git"
expansionName = "Vanguard"
expansionVersion = "1.0"
evemonMinVersion = "4081"
clientID = 'af87365240d644f7950af563b8418bad'
pyfaPath = None
savePath = None
staticPath = None
saveDB = None
gameDB = None
class StreamToLogger(object):
"""
Fake file-like stream object that redirects writes to a logger instance.
From: http://www.electricmonk.nl/log/2011/08/14/redirect-stdout-and-stderr-to-a-logger-in-python/
"""
def __init__(self, logger, log_level=logging.INFO):
self.logger = logger
self.log_level = log_level
self.linebuf = ''
def write(self, buf):
for line in buf.rstrip().splitlines():
self.logger.log(self.log_level, line.rstrip())
def isFrozen():
if hasattr(sys, 'frozen'):
return True
else:
return False
def getPyfaRoot():
base = getattr(sys.modules['__main__'], "__file__", sys.executable) if isFrozen() else sys.argv[0]
root = os.path.dirname(os.path.realpath(os.path.abspath(base)))
root = unicode(root, sys.getfilesystemencoding())
return root
def __createDirs(path):
if not os.path.exists(path):
os.makedirs(path)
def defPaths():
global debug
global pyfaPath
global savePath
global staticPath
global saveDB
global gameDB
global saveInRoot
if debug:
logLevel = logging.DEBUG
else:
logLevel = logging.WARN
# 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", pyfaPath)
if pyfaPath is None:
pyfaPath = unicode(os.path.dirname(os.path.realpath(os.path.abspath(
sys.modules['__main__'].__file__))), sys.getfilesystemencoding())
pyfaPath = getPyfaRoot()
# Where we store the saved fits etc, default is the current users home directory
if saveInRoot is True:
@@ -63,6 +94,9 @@ def defPaths():
__createDirs(savePath)
if isFrozen():
os.environ["REQUESTS_CA_BUNDLE"] = os.path.join(pyfaPath, "cacert.pem")
format = '%(asctime)s %(name)-24s %(levelname)-8s %(message)s'
logging.basicConfig(format=format, level=logLevel)
handler = logging.handlers.RotatingFileHandler(os.path.join(savePath, "log.txt"), maxBytes=1000000, backupCount=3)
@@ -72,19 +106,15 @@ def defPaths():
logging.info("Starting pyfa")
# Redirect stderr to file if we're requested to do so
stderrToFile = getattr(configforced, "stderrToFile", None)
if stderrToFile is True:
sys.stderr = open(os.path.join(savePath, "error_log.txt"), "w")
if hasattr(sys, 'frozen'):
stdout_logger = logging.getLogger('STDOUT')
sl = StreamToLogger(stdout_logger, logging.INFO)
sys.stdout = sl
# Same for stdout
stdoutToFile = getattr(configforced, "stdoutToFile", None)
if stdoutToFile is True:
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
staticPath = os.path.join(pyfaPath, "staticdata")
# This interferes with cx_Freeze's own handling of exceptions. Find a way to fix this.
#stderr_logger = logging.getLogger('STDERR')
#sl = StreamToLogger(stderr_logger, logging.ERROR)
#sys.stderr = sl
# The database where we store all the fits etc
saveDB = os.path.join(savePath, "saveddata.db")
@@ -92,7 +122,7 @@ def defPaths():
# The database where the static EVE data from the datadump is kept.
# This is not the standard sqlite datadump but a modified version created by eos
# maintenance script
gameDB = os.path.join(staticPath, "eve.db")
gameDB = os.path.join(pyfaPath, "eve.db")
## DON'T MODIFY ANYTHING BELOW ##
import eos.config

BIN
dist_assets/mac/pyfa.icns Normal file

Binary file not shown.

BIN
dist_assets/win/pyfa.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

View File

@@ -4,8 +4,8 @@ import sys
debug = False
gamedataCache = True
saveddataCache = True
gamedata_connectionstring = 'sqlite:///' + unicode(realpath(join(dirname(abspath(__file__)), "..", "staticdata", "eve.db")), sys.getfilesystemencoding())
saveddata_connectionstring = 'sqlite:///:memory:'
gamedata_connectionstring = 'sqlite:///' + unicode(realpath(join(dirname(abspath(__file__)), "..", "eve.db")), sys.getfilesystemencoding())
saveddata_connectionstring = 'sqlite:///' + unicode(realpath(join(dirname(abspath(__file__)), "..", "saveddata", "saveddata.db")), sys.getfilesystemencoding())
#Autodetect path, only change if the autodetection bugs out.
path = dirname(unicode(__file__, sys.getfilesystemencoding()))

View File

@@ -75,7 +75,7 @@ from eos.db.saveddata.queries import getUser, getCharacter, getFit, getFitsWithS
getFitList, getFleetList, getFleet, save, remove, commit, add, \
getCharactersForUser, getMiscData, getSquadsIDsWithFitID, getWing, \
getSquad, getBoosterFits, getProjectedFits, getTargetResistsList, getTargetResists,\
clearPrices, countAllFits
clearPrices, countAllFits, getCrestCharacters, getCrestCharacter
#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

@@ -3,22 +3,15 @@ import shutil
import time
import re
import os
def getAppVersion():
# calculate app version based on upgrade files we have
appVersion = 0
for fname in os.listdir(os.path.join(os.path.dirname(__file__), "migrations")):
m = re.match("^upgrade(?P<index>\d+)\.py$", fname)
if not m:
continue
index = int(m.group("index"))
appVersion = max(appVersion, index)
return appVersion
import migrations
def getVersion(db):
cursor = db.execute('PRAGMA user_version')
return cursor.fetchone()[0]
def getAppVersion():
return migrations.appVersion
def update(saveddata_engine):
dbVersion = getVersion(saveddata_engine)
appVersion = getAppVersion()
@@ -37,10 +30,11 @@ def update(saveddata_engine):
shutil.copyfile(config.saveDB, toFile)
for version in xrange(dbVersion, appVersion):
module = __import__("eos.db.migrations.upgrade{}".format(version + 1), fromlist=True)
upgrade = getattr(module, "upgrade", False)
if upgrade:
upgrade(saveddata_engine)
func = migrations.updates[version+1]
if func:
print "applying update",version+1
func(saveddata_engine)
# when all is said and done, set version to current
saveddata_engine.execute("PRAGMA user_version = {}".format(appVersion))

View File

@@ -7,3 +7,25 @@ define an upgrade() function with the logic. Please note that there must be as
many upgrade files as there are database versions (version 5 would include
upgrade files 1-5)
"""
import pkgutil
import re
updates = {}
appVersion = 0
prefix = __name__ + "."
for importer, modname, ispkg in pkgutil.iter_modules(__path__, prefix):
# loop through python files, extracting update number and function, and
# adding it to a list
modname_tail = modname.rsplit('.', 1)[-1]
module = __import__(modname, fromlist=True)
m = re.match("^upgrade(?P<index>\d+)$", modname_tail)
if not m:
continue
index = int(m.group("index"))
appVersion = max(appVersion, index)
upgrade = getattr(module, "upgrade", False)
if upgrade:
updates[index] = upgrade

View File

@@ -0,0 +1,16 @@
"""
Migration 10
- Adds active attribute to projected fits
"""
import sqlalchemy
def upgrade(saveddata_engine):
# Update projectedFits schema to include active attribute
try:
saveddata_engine.execute("SELECT active FROM projectedFits LIMIT 1")
except sqlalchemy.exc.DatabaseError:
saveddata_engine.execute("ALTER TABLE projectedFits ADD COLUMN active BOOLEAN")
saveddata_engine.execute("UPDATE projectedFits SET active = 1")
saveddata_engine.execute("UPDATE projectedFits SET amount = 1")

View File

@@ -1,3 +1,3 @@
__all__ = ["character", "fit", "module", "user", "skill", "price",
__all__ = ["character", "fit", "module", "user", "crest", "skill", "price",
"booster", "drone", "implant", "fleet", "damagePattern",
"miscData", "targetResists"]

31
eos/db/saveddata/crest.py Normal file
View File

@@ -0,0 +1,31 @@
#===============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of eos.
#
# eos is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# eos 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 Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with eos. If not, see <http://www.gnu.org/licenses/>.
#===============================================================================
from sqlalchemy import Table, Column, Integer, String, Boolean
from sqlalchemy.orm import mapper
from eos.db import saveddata_meta
from eos.types import CrestChar
crest_table = Table("crest", saveddata_meta,
Column("ID", Integer, primary_key = True),
Column("name", String, nullable = False, unique = True),
Column("refresh_token", String, nullable = False))
mapper(CrestChar, crest_table)

View File

@@ -17,9 +17,11 @@
# along with eos. If not, see <http://www.gnu.org/licenses/>.
#===============================================================================
from sqlalchemy import Table, Column, Integer, ForeignKey, String, Boolean
from sqlalchemy.orm import relation, mapper
from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.sql import and_
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.orm.collections import attribute_mapped_collection
from eos.db import saveddata_meta
from eos.db.saveddata.module import modules_table
@@ -45,33 +47,119 @@ fits_table = Table("fits", saveddata_meta,
projectedFits_table = Table("projectedFits", saveddata_meta,
Column("sourceID", ForeignKey("fits.ID"), primary_key = True),
Column("victimID", ForeignKey("fits.ID"), primary_key = True),
Column("amount", Integer))
Column("amount", Integer, nullable = False, default = 1),
Column("active", Boolean, nullable = False, default = 1),
)
class ProjectedFit(object):
def __init__(self, sourceID, source_fit, amount=1, active=True):
self.sourceID = sourceID
self.source_fit = source_fit
self.active = active
self.__amount = amount
@reconstructor
def init(self):
if self.source_fit.isInvalid:
# Very rare for this to happen, but be prepared for it
eos.db.saveddata_session.delete(self.source_fit)
eos.db.saveddata_session.flush()
eos.db.saveddata_session.refresh(self.victim_fit)
# We have a series of setters and getters here just in case someone
# downgrades and screws up the table with NULL values
@property
def amount(self):
return self.__amount or 1
@amount.setter
def amount(self, amount):
self.__amount = amount
def __repr__(self):
return "ProjectedFit(sourceID={}, victimID={}, amount={}, active={}) at {}".format(
self.sourceID, self.victimID, self.amount, self.active, hex(id(self))
)
Fit._Fit__projectedFits = association_proxy(
"victimOf", # look at the victimOf association...
"source_fit", # .. and return the source fits
creator=lambda sourceID, source_fit: ProjectedFit(sourceID, source_fit)
)
mapper(Fit, fits_table,
properties = {"_Fit__modules" : relation(Module, collection_class = HandledModuleList,
primaryjoin = and_(modules_table.c.fitID == fits_table.c.ID, modules_table.c.projected == False),
order_by = modules_table.c.position, cascade='all, delete, delete-orphan'),
"_Fit__projectedModules" : relation(Module, collection_class = HandledProjectedModList, cascade='all, delete, delete-orphan', single_parent=True,
primaryjoin = and_(modules_table.c.fitID == fits_table.c.ID, modules_table.c.projected == True)),
"owner" : relation(User, backref = "fits"),
"itemID" : fits_table.c.shipID,
"shipID" : fits_table.c.shipID,
"_Fit__boosters" : relation(Booster, collection_class = HandledImplantBoosterList, cascade='all, delete, delete-orphan', single_parent=True),
"_Fit__drones" : relation(Drone, collection_class = HandledDroneCargoList, cascade='all, delete, delete-orphan', single_parent=True,
primaryjoin = and_(drones_table.c.fitID == fits_table.c.ID, drones_table.c.projected == False)),
"_Fit__cargo" : relation(Cargo, collection_class = HandledDroneCargoList, cascade='all, delete, delete-orphan', single_parent=True,
primaryjoin = and_(cargo_table.c.fitID == fits_table.c.ID)),
"_Fit__projectedDrones" : relation(Drone, collection_class = HandledProjectedDroneList, cascade='all, delete, delete-orphan', single_parent=True,
primaryjoin = and_(drones_table.c.fitID == fits_table.c.ID, drones_table.c.projected == True)),
"_Fit__implants" : relation(Implant, collection_class = HandledImplantBoosterList, cascade='all, delete, delete-orphan', backref='fit', single_parent=True,
primaryjoin = fitImplants_table.c.fitID == fits_table.c.ID,
secondaryjoin = fitImplants_table.c.implantID == Implant.ID,
secondary = fitImplants_table),
"_Fit__character" : relation(Character, backref = "fits"),
"_Fit__damagePattern" : relation(DamagePattern),
"_Fit__targetResists" : relation(TargetResists),
"_Fit__projectedFits" : relation(Fit,
primaryjoin = projectedFits_table.c.victimID == fits_table.c.ID,
secondaryjoin = fits_table.c.ID == projectedFits_table.c.sourceID,
secondary = projectedFits_table,
collection_class = HandledProjectedFitList)
})
properties = {
"_Fit__modules": relation(
Module,
collection_class=HandledModuleList,
primaryjoin=and_(modules_table.c.fitID == fits_table.c.ID, modules_table.c.projected == False),
order_by=modules_table.c.position,
cascade='all, delete, delete-orphan'),
"_Fit__projectedModules": relation(
Module,
collection_class=HandledProjectedModList,
cascade='all, delete, delete-orphan',
single_parent=True,
primaryjoin=and_(modules_table.c.fitID == fits_table.c.ID, modules_table.c.projected == True)),
"owner": relation(
User,
backref="fits"),
"itemID": fits_table.c.shipID,
"shipID": fits_table.c.shipID,
"_Fit__boosters": relation(
Booster,
collection_class=HandledImplantBoosterList,
cascade='all, delete, delete-orphan',
single_parent=True),
"_Fit__drones": relation(
Drone,
collection_class=HandledDroneCargoList,
cascade='all, delete, delete-orphan',
single_parent=True,
primaryjoin=and_(drones_table.c.fitID == fits_table.c.ID, drones_table.c.projected == False)),
"_Fit__cargo": relation(
Cargo,
collection_class=HandledDroneCargoList,
cascade='all, delete, delete-orphan',
single_parent=True,
primaryjoin=and_(cargo_table.c.fitID == fits_table.c.ID)),
"_Fit__projectedDrones": relation(
Drone,
collection_class=HandledProjectedDroneList,
cascade='all, delete, delete-orphan',
single_parent=True,
primaryjoin=and_(drones_table.c.fitID == fits_table.c.ID, drones_table.c.projected == True)),
"_Fit__implants": relation(
Implant,
collection_class=HandledImplantBoosterList,
cascade='all, delete, delete-orphan',
backref='fit',
single_parent=True,
primaryjoin=fitImplants_table.c.fitID == fits_table.c.ID,
secondaryjoin=fitImplants_table.c.implantID == Implant.ID,
secondary=fitImplants_table),
"_Fit__character": relation(
Character,
backref="fits"),
"_Fit__damagePattern": relation(DamagePattern),
"_Fit__targetResists": relation(TargetResists),
"projectedOnto": relationship(
ProjectedFit,
primaryjoin=projectedFits_table.c.sourceID == fits_table.c.ID,
backref='source_fit',
collection_class=attribute_mapped_collection('victimID'),
cascade='all, delete, delete-orphan'),
"victimOf": relationship(
ProjectedFit,
primaryjoin=fits_table.c.ID == projectedFits_table.c.victimID,
backref='victim_fit',
collection_class=attribute_mapped_collection('sourceID'),
cascade='all, delete, delete-orphan'),
}
)
mapper(ProjectedFit, projectedFits_table,
properties = {
"_ProjectedFit__amount": projectedFits_table.c.amount,
}
)

View File

@@ -19,7 +19,7 @@
from eos.db.util import processEager, processWhere
from eos.db import saveddata_session, sd_lock
from eos.types import User, Character, Fit, Price, DamagePattern, Fleet, MiscData, Wing, Squad, TargetResists
from eos.types import User, Character, Fit, Price, DamagePattern, Fleet, MiscData, Wing, Squad, TargetResists, CrestChar
from eos.db.saveddata.fleet import squadmembers_table
from eos.db.saveddata.fit import projectedFits_table
from sqlalchemy.sql import and_
@@ -416,6 +416,30 @@ def getProjectedFits(fitID):
else:
raise TypeError("Need integer as argument")
def getCrestCharacters(eager=None):
eager = processEager(eager)
with sd_lock:
characters = saveddata_session.query(CrestChar).options(*eager).all()
return characters
@cachedQuery(CrestChar, 1, "lookfor")
def getCrestCharacter(lookfor, eager=None):
if isinstance(lookfor, int):
if eager is None:
with sd_lock:
character = saveddata_session.query(CrestChar).get(lookfor)
else:
eager = processEager(eager)
with sd_lock:
character = saveddata_session.query(CrestChar).options(*eager).filter(CrestChar.ID == lookfor).first()
elif isinstance(lookfor, basestring):
eager = processEager(eager)
with sd_lock:
character = saveddata_session.query(CrestChar).options(*eager).filter(CrestChar.name == lookfor).first()
else:
raise TypeError("Need integer or string as argument")
return character
def removeInvalid(fits):
invalids = [f for f in fits if f.isInvalid]

View File

@@ -109,7 +109,8 @@ class HandledList(list):
# We must flag it as modified, otherwise it not be removed from the database
# @todo: flag_modified isn't in os x skel. need to rebuild to include
#flag_modified(thing, "itemID")
thing.itemID = 0
if thing.isInvalid: # see GH issue #324
thing.itemID = 0
list.remove(self, thing)
class HandledModuleList(HandledList):
@@ -158,6 +159,10 @@ class HandledModuleList(HandledList):
dummy.position = index
self[index] = dummy
def toModule(self, index, mod):
mod.position = index
self[index] = mod
def freeSlot(self, slot):
for i in range(len(self) -1, -1, -1):
mod = self[i]
@@ -191,6 +196,7 @@ class HandledImplantBoosterList(HandledList):
oldObj = next((m for m in self if m.slot == thing.slot), None)
if oldObj:
logging.info("Slot %d occupied with %s, replacing with %s", thing.slot, oldObj.item.name, thing.item.name)
oldObj.itemID = 0 # hack to remove from DB. See GH issue #324
self.remove(oldObj)
HandledList.append(self, thing)
@@ -230,11 +236,6 @@ class HandledProjectedDroneList(HandledDroneCargoList):
if proj.isInvalid or not proj.item.isType("projected"):
self.remove(proj)
class HandledProjectedFitList(HandledList):
def append(self, proj):
proj.projected = True
list.append(self, proj)
class HandledItem(object):
def preAssignItemAttr(self, *args, **kwargs):
self.itemModifiedAttributes.preAssign(*args, **kwargs)

View File

@@ -6,4 +6,4 @@ type = "passive"
def handler(fit, implant, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Capital Repair Systems"),
"armorDamageAmount", implant.getModifiedItemAttr("repairBonus"),
stackingPenalties = True)
stackingPenalties=True)

View File

@@ -0,0 +1,9 @@
# battlecruiserDroneSpeed
#
# Used by:
# Ship: Myrmidon
# Ship: Prophecy
type = "passive"
def handler(fit, ship, context):
fit.drones.filteredItemBoost(lambda drone: drone.item.requiresSkill("Drones"),
"maxVelocity", ship.getModifiedItemAttr("roleBonusCBC"))

View File

@@ -0,0 +1,10 @@
# battlecruiserMETRange
#
# Used by:
# Ships named like: Harbinger (2 of 2)
type = "passive"
def handler(fit, ship, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Medium Energy Turret"),
"maxRange", ship.getModifiedItemAttr("roleBonusCBC"))
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Medium Energy Turret"),
"falloff", ship.getModifiedItemAttr("roleBonusCBC"))

View File

@@ -0,0 +1,11 @@
# battlecruiserMHTRange
#
# Used by:
# Ships named like: Brutix (2 of 2)
# Ship: Ferox
type = "passive"
def handler(fit, ship, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Medium Hybrid Turret"),
"maxRange", ship.getModifiedItemAttr("roleBonusCBC"))
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Medium Hybrid Turret"),
"falloff", ship.getModifiedItemAttr("roleBonusCBC"))

View File

@@ -0,0 +1,9 @@
# battlecruiserMissileRange
#
# Used by:
# Ships named like: Drake (2 of 2)
# Ship: Cyclone
type = "passive"
def handler(fit, skill, context):
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Missile Launcher Operation"),
"maxVelocity", skill.getModifiedItemAttr("roleBonusCBC"))

View File

@@ -0,0 +1,10 @@
# battlecruiserMPTRange
#
# Used by:
# Ships named like: Hurricane (2 of 2)
type = "passive"
def handler(fit, ship, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Medium Projectile Turret"),
"maxRange", ship.getModifiedItemAttr("roleBonusCBC"))
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Medium Projectile Turret"),
"falloff", ship.getModifiedItemAttr("roleBonusCBC"))

View File

@@ -5,6 +5,5 @@
type = "passive"
runTime = "early"
def handler(fit, ship, context):
level = fit.character.getSkill("Transport Ships").level
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Cloaking Device",
"cpu", ship.getModifiedItemAttr("eliteIndustrialCovertCloakBonus") * level)
"cpu", ship.getModifiedItemAttr("eliteIndustrialCovertCloakBonus"), skill="Transport Ships")

View File

@@ -1,7 +1,7 @@
# boosterArmorHpPenalty
#
# Used by:
# Implants from group: Booster (12 of 37)
# Implants from group: Booster (12 of 39)
type = "boosterSideEffect"
def handler(fit, booster, context):
fit.ship.boostItemAttr("armorHP", booster.getModifiedItemAttr("boosterArmorHPPenalty"))

View File

@@ -1,7 +1,7 @@
# boosterArmorRepairAmountPenalty
#
# Used by:
# Implants from group: Booster (9 of 37)
# Implants from group: Booster (9 of 39)
type = "boosterSideEffect"
def handler(fit, booster, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Armor Repair Unit",

View File

@@ -1,7 +1,7 @@
# boosterMaxVelocityPenalty
#
# Used by:
# Implants from group: Booster (12 of 37)
# Implants from group: Booster (12 of 39)
type = "boosterSideEffect"
def handler(fit, booster, context):
fit.ship.boostItemAttr("maxVelocity", booster.getModifiedItemAttr("boosterMaxVelocityPenalty"))

View File

@@ -1,7 +1,7 @@
# boosterShieldCapacityPenalty
#
# Used by:
# Implants from group: Booster (12 of 37)
# Implants from group: Booster (12 of 39)
type = "boosterSideEffect"
def handler(fit, booster, context):
fit.ship.boostItemAttr("shieldCapacity", booster.getModifiedItemAttr("boosterShieldCapacityPenalty"))

View File

@@ -1,7 +1,7 @@
# boosterTurretOptimalRangePenalty
#
# Used by:
# Implants from group: Booster (9 of 37)
# Implants from group: Booster (9 of 39)
type = "boosterSideEffect"
def handler(fit, booster, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Gunnery"),

View File

@@ -4,6 +4,5 @@
# Ship: Scorpion
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Caldari Battleship").level
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "ECM Burst",
"ecmBurstRange", ship.getModifiedItemAttr("shipBonusCB3") * level)
"ecmBurstRange", ship.getModifiedItemAttr("shipBonusCB3"), skill="Caldari Battleship")

View File

@@ -6,6 +6,5 @@
# Ship: Rook
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Caldari Cruiser").level
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "ECM",
"capacitorNeed", ship.getModifiedItemAttr("shipBonusCC") * level)
"capacitorNeed", ship.getModifiedItemAttr("shipBonusCC"), skill="Caldari Cruiser")

View File

@@ -4,6 +4,5 @@
# Variations of ship: Griffin (2 of 2)
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Caldari Frigate").level
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "ECM",
"capacitorNeed", ship.getModifiedItemAttr("shipBonusCF2") * level)
"capacitorNeed", ship.getModifiedItemAttr("shipBonusCF2"), skill="Caldari Frigate")

View File

@@ -4,6 +4,5 @@
# Ship: Scorpion
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Caldari Battleship").level
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "ECM",
"falloff", ship.getModifiedItemAttr("shipBonusCB3") * level)
"falloff", ship.getModifiedItemAttr("shipBonusCB3"), skill="Caldari Battleship")

View File

@@ -4,6 +4,5 @@
# Ship: Blackbird
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Caldari Cruiser").level
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "ECM",
"falloff", ship.getModifiedItemAttr("shipBonusCC2") * level)
"falloff", ship.getModifiedItemAttr("shipBonusCC2"), skill="Caldari Cruiser")

View File

@@ -4,6 +4,5 @@
# Ship: Scorpion
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Caldari Battleship").level
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "ECM",
"maxRange", ship.getModifiedItemAttr("shipBonusCB3") * level)
"maxRange", ship.getModifiedItemAttr("shipBonusCB3"), skill="Caldari Battleship")

View File

@@ -4,6 +4,5 @@
# Ship: Blackbird
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Caldari Cruiser").level
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "ECM",
"maxRange", ship.getModifiedItemAttr("shipBonusCC2") * level)
"maxRange", ship.getModifiedItemAttr("shipBonusCC2"), skill="Caldari Cruiser")

View File

@@ -4,8 +4,7 @@
# Ship: Scorpion
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Caldari Battleship").level
for sensorType in ("Gravimetric", "Ladar", "Magnetometric", "Radar"):
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "ECM",
"scan{0}StrengthBonus".format(sensorType),
ship.getModifiedItemAttr("shipBonusCB") * level)
ship.getModifiedItemAttr("shipBonusCB"), skill="Caldari Battleship")

View File

@@ -5,9 +5,7 @@
# Ship: Archon
type = "passive"
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)
"maxRange", ship.getModifiedItemAttr("carrierAmarrBonus3"), skill="Amarr Carrier")
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Capital Capacitor Emission Systems"),
"powerTransferRange", ship.getModifiedItemAttr("carrierAmarrBonus3") * level)
"powerTransferRange", ship.getModifiedItemAttr("carrierAmarrBonus3"), skill="Amarr Carrier")

View File

@@ -5,7 +5,6 @@
# Ship: Archon
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Amarr Carrier").level
for resType in ("Em", "Explosive", "Kinetic", "Thermal"):
fit.ship.boostItemAttr("armor{0}DamageResonance".format(resType),
ship.getModifiedItemAttr("carrierAmarrBonus2") * level)
ship.getModifiedItemAttr("carrierAmarrBonus2"), skill="Amarr Carrier")

View File

@@ -5,6 +5,4 @@
# Ship: Archon
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Amarr Carrier").level
amount = ship.getModifiedItemAttr("carrierAmarrBonus1")
fit.extraAttributes.increase("maxActiveDrones", amount * level)
fit.extraAttributes.increase("maxActiveDrones", ship.getModifiedItemAttr("carrierAmarrBonus1"), skill="Amarr Carrier")

View File

@@ -4,6 +4,5 @@
# Ship: Revenant
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Amarr Carrier").level
fit.drones.filteredItemBoost(lambda drone: drone.item.requiresSkill("Fighter Bombers"),
"maxVelocity", ship.getModifiedItemAttr("carrierAmarrBonus2") * level)
"maxVelocity", ship.getModifiedItemAttr("carrierAmarrBonus2"), skill="Amarr Carrier")

View File

@@ -4,6 +4,5 @@
# Ship: Revenant
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Amarr Carrier").level
fit.drones.filteredItemBoost(lambda drone: drone.item.requiresSkill("Fighters"),
"maxVelocity", ship.getModifiedItemAttr("carrierAmarrBonus2") * level)
"maxVelocity", ship.getModifiedItemAttr("carrierAmarrBonus2"), skill="Amarr Carrier")

View File

@@ -5,6 +5,5 @@
# Ship: Revenant
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Amarr Carrier").level
fit.modules.filteredItemIncrease(lambda mod: mod.item.group.name == "Gang Coordinator",
"maxGroupActive", ship.getModifiedItemAttr("carrierAmarrBonus4") * level)
"maxGroupActive", ship.getModifiedItemAttr("carrierAmarrBonus4"), skill="Amarr Carrier")

View File

@@ -5,6 +5,4 @@
# Ship: Wyvern
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Caldari Carrier").level
amount = ship.getModifiedItemAttr("carrierCaldariBonus1")
fit.extraAttributes.increase("maxActiveDrones", amount * level)
fit.extraAttributes.increase("maxActiveDrones", ship.getModifiedItemAttr("carrierCaldariBonus1"), skill="Caldari Carrier")

View File

@@ -4,6 +4,5 @@
# Ship: Revenant
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Caldari Carrier").level
fit.drones.filteredItemBoost(lambda drone: drone.item.requiresSkill("Fighters") or drone.item.requiresSkill("Fighter Bombers"),
"signatureRadius", ship.getModifiedItemAttr("carrierCaldariBonus1") * level)
"signatureRadius", ship.getModifiedItemAttr("carrierCaldariBonus1"), skill="Caldari Carrier")

View File

@@ -4,6 +4,5 @@
# Ship: Wyvern
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Caldari Carrier").level
fit.modules.filteredItemIncrease(lambda mod: mod.item.group.name == "Gang Coordinator",
"maxGroupActive", ship.getModifiedItemAttr("carrierCaldariBonus4") * level)
"maxGroupActive", ship.getModifiedItemAttr("carrierCaldariBonus4"), skill="Caldari Carrier")

View File

@@ -6,8 +6,7 @@
# Ship: Wyvern
type = "passive"
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)
"shieldTransferRange", ship.getModifiedItemAttr("carrierCaldariBonus3"), skill="Caldari Carrier")
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Capital Capacitor Emission Systems"),
"powerTransferRange", ship.getModifiedItemAttr("carrierCaldariBonus3") * level)
"powerTransferRange", ship.getModifiedItemAttr("carrierCaldariBonus3"), skill="Caldari Carrier")

View File

@@ -5,7 +5,6 @@
# Ship: Wyvern
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Caldari Carrier").level
for resType in ("Em", "Explosive", "Kinetic", "Thermal"):
fit.ship.boostItemAttr("shield{0}DamageResonance".format(resType),
ship.getModifiedItemAttr("carrierCaldariBonus2") * level)
ship.getModifiedItemAttr("carrierCaldariBonus2"), skill="Caldari Carrier")

View File

@@ -5,8 +5,7 @@
# Ship: Thanatos
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Gallente Carrier").level
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Capital Shield Emission Systems"),
"shieldTransferRange", ship.getModifiedItemAttr("carrierGallenteBonus3") * level)
"shieldTransferRange", ship.getModifiedItemAttr("carrierGallenteBonus3"), skill="Gallente Carrier")
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Capital Remote Armor Repair Systems"),
"maxRange", ship.getModifiedItemAttr("carrierGallenteBonus3") * level)
"maxRange", ship.getModifiedItemAttr("carrierGallenteBonus3"), skill="Gallente Carrier")

View File

@@ -4,6 +4,5 @@
# Ship: Nyx
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Gallente Carrier").level
fit.drones.filteredItemBoost(lambda drone: drone.item.requiresSkill("Fighter Bombers"),
"damageMultiplier", ship.getModifiedItemAttr("carrierGallenteBonus2") * level)
"damageMultiplier", ship.getModifiedItemAttr("carrierGallenteBonus2"), skill="Gallente Carrier")

View File

@@ -5,6 +5,4 @@
# Ship: Thanatos
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Gallente Carrier").level
amount = ship.getModifiedItemAttr("carrierGallenteBonus1")
fit.extraAttributes.increase("maxActiveDrones", amount * level)
fit.extraAttributes.increase("maxActiveDrones", ship.getModifiedItemAttr("carrierGallenteBonus1"), skill="Gallente Carrier")

View File

@@ -5,6 +5,5 @@
# Ship: Thanatos
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Gallente Carrier").level
fit.drones.filteredItemBoost(lambda drone: drone.item.requiresSkill("Fighters"),
"damageMultiplier", ship.getModifiedItemAttr("carrierGallenteBonus2") * level)
"damageMultiplier", ship.getModifiedItemAttr("carrierGallenteBonus2"), skill="Gallente Carrier")

View File

@@ -4,6 +4,5 @@
# Ship: Nyx
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Gallente Carrier").level
fit.modules.filteredItemIncrease(lambda mod: mod.item.group.name == "Gang Coordinator",
"maxGroupActive", ship.getModifiedItemAttr("carrierGallenteBonus4") * level)
"maxGroupActive", ship.getModifiedItemAttr("carrierGallenteBonus4"), skill="Gallente Carrier")

View File

@@ -5,8 +5,7 @@
# Ship: Nidhoggur
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Minmatar Carrier").level
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Remote Shield Booster",
"shieldBonus", ship.getModifiedItemAttr("carrierMinmatarBonus2") * level)
"shieldBonus", ship.getModifiedItemAttr("carrierMinmatarBonus2"), skill="Minmatar Carrier")
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Remote Armor Repairer",
"armorDamageAmount", ship.getModifiedItemAttr("carrierMinmatarBonus2") * level)
"armorDamageAmount", ship.getModifiedItemAttr("carrierMinmatarBonus2"), skill="Minmatar Carrier")

View File

@@ -5,8 +5,7 @@
# Ship: Nidhoggur
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Minmatar Carrier").level
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Capital Shield Emission Systems"),
"shieldTransferRange", ship.getModifiedItemAttr("carrierMinmatarBonus3") * level)
"shieldTransferRange", ship.getModifiedItemAttr("carrierMinmatarBonus3"), skill="Minmatar Carrier")
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Capital Remote Armor Repair Systems"),
"maxRange", ship.getModifiedItemAttr("carrierMinmatarBonus3") * level)
"maxRange", ship.getModifiedItemAttr("carrierMinmatarBonus3"), skill="Minmatar Carrier")

View File

@@ -5,6 +5,4 @@
# Ship: Nidhoggur
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Minmatar Carrier").level
amount = ship.getModifiedItemAttr("carrierMinmatarBonus1")
fit.extraAttributes.increase("maxActiveDrones", amount * level)
fit.extraAttributes.increase("maxActiveDrones", ship.getModifiedItemAttr("carrierMinmatarBonus1"), skill="Minmatar Carrier")

View File

@@ -4,6 +4,5 @@
# Ship: Hel
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Minmatar Carrier").level
fit.modules.filteredItemIncrease(lambda mod: mod.item.group.name == "Gang Coordinator",
"maxGroupActive", ship.getModifiedItemAttr("carrierMinmatarBonus4") * level)
"maxGroupActive", ship.getModifiedItemAttr("carrierMinmatarBonus4"), skill="Minmatar Carrier")

View File

@@ -5,6 +5,5 @@
type = "passive"
runTime = "early"
def handler(fit, ship, context):
level = fit.character.getSkill("Covert Ops").level
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Cloaking Device",
"cpu", ship.getModifiedItemAttr("eliteBonusCoverOps1") * level)
"cpu", ship.getModifiedItemAttr("eliteBonusCoverOps1"), skill="Covert Ops")

View File

@@ -0,0 +1,7 @@
# crystalMiningamountInfo2
#
# Used by:
# Modules from group: Frequency Mining Laser (3 of 3)
type = "passive"
def handler(fit, module, context):
module.preAssignItemAttr("specialtyMiningAmount", module.getModifiedItemAttr("miningAmount"))

View File

@@ -4,6 +4,5 @@
# Ship: Naglfar
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Minmatar Dreadnought").level
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Capital Projectile Turret"),
"damageMultiplier", ship.getModifiedItemAttr("dreadnoughtShipBonusM1") * level)
"damageMultiplier", ship.getModifiedItemAttr("dreadnoughtShipBonusM1"), skill="Minmatar Dreadnought")

View File

@@ -4,6 +4,5 @@
# Ship: Naglfar
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Minmatar Dreadnought").level
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Capital Projectile Turret"),
"speed", ship.getModifiedItemAttr("dreadnoughtShipBonusM3") * level)
"speed", ship.getModifiedItemAttr("dreadnoughtShipBonusM3"), skill="Minmatar Dreadnought")

View File

@@ -4,6 +4,5 @@
# Ship: Moros
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Gallente Dreadnought").level
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Capital Hybrid Turret"),
"damageMultiplier", ship.getModifiedItemAttr("dreadnoughtShipBonusG1") * level)
"damageMultiplier", ship.getModifiedItemAttr("dreadnoughtShipBonusG1"), skill="Gallente Dreadnought")

View File

@@ -4,6 +4,5 @@
# Ship: Moros
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Gallente Dreadnought").level
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Capital Hybrid Turret"),
"speed", ship.getModifiedItemAttr("dreadnoughtShipBonusG2") * level)
"speed", ship.getModifiedItemAttr("dreadnoughtShipBonusG2"), skill="Gallente Dreadnought")

View File

@@ -4,6 +4,5 @@
# Ship: Revelation
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Amarr Dreadnought").level
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Capital Energy Turret"),
"capacitorNeed", ship.getModifiedItemAttr("dreadnoughtShipBonusA1") * level)
"capacitorNeed", ship.getModifiedItemAttr("dreadnoughtShipBonusA1"), skill="Amarr Dreadnought")

View File

@@ -4,6 +4,5 @@
# Ship: Revelation
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Amarr Dreadnought").level
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Capital Energy Turret"),
"speed", ship.getModifiedItemAttr("dreadnoughtShipBonusA2") * level)
"speed", ship.getModifiedItemAttr("dreadnoughtShipBonusA2"), skill="Amarr Dreadnought")

View File

@@ -4,7 +4,6 @@
# Ship: Phoenix
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Caldari Dreadnought").level
for damageType in ("em", "thermal", "explosive", "kinetic"):
fit.ship.boostItemAttr("shield{}DamageResonance".format(damageType.capitalize()),
ship.getModifiedItemAttr("dreadnoughtShipBonusC2") * level)
ship.getModifiedItemAttr("dreadnoughtShipBonusC2"), skill="Caldari Dreadnought")

View File

@@ -4,6 +4,5 @@
# Ships from group: Exhumer (3 of 3)
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Exhumers").level
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Ice Harvesting"),
"duration", ship.getModifiedItemAttr("eliteBonusBarge2") * level)
"duration", ship.getModifiedItemAttr("eliteBonusBarge2"), skill="Exhumers")

View File

@@ -4,6 +4,5 @@
# Ships from group: Exhumer (3 of 3)
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Exhumers").level
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Mining"),
"duration", ship.getModifiedItemAttr("eliteBonusBarge2") * level)
"duration", ship.getModifiedItemAttr("eliteBonusBarge2"), skill="Exhumers")

View File

@@ -4,7 +4,6 @@
# Ships from group: Exhumer (3 of 3)
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Exhumers").level
for damageType in ("em", "thermal", "explosive", "kinetic"):
fit.ship.boostItemAttr("shield{}DamageResonance".format(damageType.capitalize()),
ship.getModifiedItemAttr("eliteBonusBarge1") * level)
ship.getModifiedItemAttr("eliteBonusBarge1"), skill="Exhumers")

View File

@@ -4,6 +4,5 @@
# Ship: Cambion
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Assault Frigates").level
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Missile Launcher Light",
"speed", ship.getModifiedItemAttr("eliteBonusGunship1") * level)
"speed", ship.getModifiedItemAttr("eliteBonusGunship1"), skill="Assault Frigates")

View File

@@ -4,6 +4,5 @@
# Ship: Hawk
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Assault Frigates").level
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Missile Launcher Operation"),
"maxVelocity", ship.getModifiedItemAttr("eliteBonusGunship1") * level)
"maxVelocity", ship.getModifiedItemAttr("eliteBonusGunship1"), skill="Assault Frigates")

View File

@@ -4,6 +4,5 @@
# Ship: Cambion
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Assault Frigates").level
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Missile Launcher Rocket",
"speed", ship.getModifiedItemAttr("eliteBonusGunship1") * level)
"speed", ship.getModifiedItemAttr("eliteBonusGunship1"), skill="Assault Frigates")

View File

@@ -4,5 +4,4 @@
# Ship: Sin
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Black Ops").level
fit.ship.boostItemAttr("agility", ship.getModifiedItemAttr("eliteBonusBlackOps1") * level)
fit.ship.boostItemAttr("agility", ship.getModifiedItemAttr("eliteBonusBlackOps1"), skill="Black Ops")

View File

@@ -5,5 +5,4 @@
type = "passive"
def handler(fit, ship, context):
if fit.extraAttributes["cloaked"]:
level = fit.character.getSkill("Black Ops").level
fit.ship.multiplyItemAttr("maxVelocity", ship.getModifiedItemAttr("eliteBonusBlackOps2") * level)
fit.ship.multiplyItemAttr("maxVelocity", ship.getModifiedItemAttr("eliteBonusBlackOps2"), skill="Black Ops")

View File

@@ -4,8 +4,7 @@
# Ship: Widow
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Black Ops").level
sensorTypes = ("Gravimetric", "Ladar", "Magnetometric", "Radar")
for type in sensorTypes:
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "ECM Burst", "scan{0}StrengthBonus".format(type),
ship.getModifiedItemAttr("eliteBonusBlackOps1") * level)
ship.getModifiedItemAttr("eliteBonusBlackOps1"), skill="Black Ops")

View File

@@ -4,8 +4,7 @@
# Ship: Widow
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Black Ops").level
sensorTypes = ("Gravimetric", "Ladar", "Magnetometric", "Radar")
for type in sensorTypes:
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "ECM", "scan{0}StrengthBonus".format(type),
ship.getModifiedItemAttr("eliteBonusBlackOps1") * level)
ship.getModifiedItemAttr("eliteBonusBlackOps1"), skill="Black Ops")

View File

@@ -4,6 +4,5 @@
# Ship: Redeemer
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Black Ops").level
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Large Energy Turret"),
"trackingSpeed", ship.getModifiedItemAttr("eliteBonusBlackOps1") * level)
"trackingSpeed", ship.getModifiedItemAttr("eliteBonusBlackOps1"), skill="Black Ops")

View File

@@ -4,5 +4,4 @@
# Ship: Panther
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Black Ops").level
fit.ship.boostItemAttr("maxVelocity", ship.getModifiedItemAttr("eliteBonusBlackOps1") * level)
fit.ship.boostItemAttr("maxVelocity", ship.getModifiedItemAttr("eliteBonusBlackOps1"), skill="Black Ops")

View File

@@ -4,6 +4,5 @@
# Ships from group: Command Ship (4 of 8)
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Command Ships").level
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Armored Warfare Specialist"),
"commandBonus", ship.getModifiedItemAttr("eliteBonusCommandShips3") * level)
"commandBonus", ship.getModifiedItemAttr("eliteBonusCommandShips3"), skill="Command Ships")

View File

@@ -4,5 +4,4 @@
# Ship: Damnation
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Command Ships").level
fit.ship.boostItemAttr("armorHP", ship.getModifiedItemAttr("eliteBonusCommandShips1") * level)
fit.ship.boostItemAttr("armorHP", ship.getModifiedItemAttr("eliteBonusCommandShips1"), skill="Command Ships")

View File

@@ -5,6 +5,5 @@
# Ship: Nighthawk
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Command Ships").level
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Missile Launcher Heavy Assault",
"speed", ship.getModifiedItemAttr("eliteBonusCommandShips1") * level)
"speed", ship.getModifiedItemAttr("eliteBonusCommandShips1"), skill="Command Ships")

View File

@@ -4,8 +4,7 @@
# Ship: Damnation
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Command Ships").level
damageTypes = ("em", "explosive", "kinetic", "thermal")
for damageType in damageTypes:
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Heavy Assault Missiles"),
"{0}Damage".format(damageType), ship.getModifiedItemAttr("eliteBonusCommandShips2") * level)
"{0}Damage".format(damageType), ship.getModifiedItemAttr("eliteBonusCommandShips2"), skill="Command Ships")

View File

@@ -4,6 +4,5 @@
# Ship: Eos
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Command Ships").level
fit.drones.filteredItemBoost(lambda drone: drone.item.requiresSkill("Heavy Drone Operation"),
"trackingSpeed", ship.getModifiedItemAttr("eliteBonusCommandShips2") * level)
"trackingSpeed", ship.getModifiedItemAttr("eliteBonusCommandShips2"), skill="Command Ships")

View File

@@ -4,6 +4,5 @@
# Ship: Eos
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Command Ships").level
fit.drones.filteredItemBoost(lambda drone: drone.item.requiresSkill("Heavy Drone Operation"),
"maxVelocity", ship.getModifiedItemAttr("eliteBonusCommandShips2") * level)
"maxVelocity", ship.getModifiedItemAttr("eliteBonusCommandShips2"), skill="Command Ships")

View File

@@ -4,8 +4,7 @@
# Ship: Damnation
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Command Ships").level
damageTypes = ("em", "explosive", "kinetic", "thermal")
for damageType in damageTypes:
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Heavy Missiles"),
"{0}Damage".format(damageType), ship.getModifiedItemAttr("eliteBonusCommandShips2") * level)
"{0}Damage".format(damageType), ship.getModifiedItemAttr("eliteBonusCommandShips2"), skill="Command Ships")

View File

@@ -5,6 +5,5 @@
# Ship: Nighthawk
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Command Ships").level
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Missile Launcher Heavy",
"speed", ship.getModifiedItemAttr("eliteBonusCommandShips1") * level)
"speed", ship.getModifiedItemAttr("eliteBonusCommandShips1"), skill="Command Ships")

View File

@@ -4,6 +4,5 @@
# Ship: Astarte
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Command Ships").level
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Medium Hybrid Turret"),
"falloff", ship.getModifiedItemAttr("eliteBonusCommandShips2") * level)
"falloff", ship.getModifiedItemAttr("eliteBonusCommandShips2"), skill="Command Ships")

View File

@@ -4,6 +4,5 @@
# Ship: Vulture
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Command Ships").level
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Medium Hybrid Turret"),
"maxRange", ship.getModifiedItemAttr("eliteBonusCommandShips1") * level)
"maxRange", ship.getModifiedItemAttr("eliteBonusCommandShips1"), skill="Command Ships")

View File

@@ -4,6 +4,5 @@
# Ships from group: Command Ship (4 of 8)
type = "passive"
def handler(fit, module, context):
level = fit.character.getSkill("Command Ships").level
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Information Warfare Specialist"),
"commandBonus", module.getModifiedItemAttr("eliteBonusCommandShips3") * level)
"commandBonus", module.getModifiedItemAttr("eliteBonusCommandShips3"), skill="Command Ships")

View File

@@ -4,6 +4,5 @@
# Ships from group: Command Ship (4 of 8)
type = "passive"
def handler(fit, module, context):
level = fit.character.getSkill("Command Ships").level
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Information Warfare Specialist"),
"commandBonusHidden", module.getModifiedItemAttr("eliteBonusCommandShips3") * level)
"commandBonusHidden", module.getModifiedItemAttr("eliteBonusCommandShips3"), skill="Command Ships")

View File

@@ -4,6 +4,5 @@
# Ship: Absolution
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Command Ships").level
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Medium Energy Turret"),
"damageMultiplier", ship.getModifiedItemAttr("eliteBonusCommandShips1") * level)
"damageMultiplier", ship.getModifiedItemAttr("eliteBonusCommandShips1"), skill="Command Ships")

View File

@@ -4,6 +4,5 @@
# Ship: Absolution
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Command Ships").level
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Medium Energy Turret"),
"speed", ship.getModifiedItemAttr("eliteBonusCommandShips2") * level)
"speed", ship.getModifiedItemAttr("eliteBonusCommandShips2"), skill="Command Ships")

View File

@@ -4,6 +4,5 @@
# Ship: Vulture
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Command Ships").level
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Medium Hybrid Turret"),
"damageMultiplier", ship.getModifiedItemAttr("eliteBonusCommandShips2") * level)
"damageMultiplier", ship.getModifiedItemAttr("eliteBonusCommandShips2"), skill="Command Ships")

View File

@@ -4,6 +4,5 @@
# Ship: Astarte
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Command Ships").level
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Medium Hybrid Turret"),
"speed", ship.getModifiedItemAttr("eliteBonusCommandShips1") * level)
"speed", ship.getModifiedItemAttr("eliteBonusCommandShips1"), skill="Command Ships")

View File

@@ -4,6 +4,5 @@
# Ship: Eos
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Command Ships").level
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Medium Hybrid Turret"),
"trackingSpeed", ship.getModifiedItemAttr("eliteBonusCommandShips1") * level)
"trackingSpeed", ship.getModifiedItemAttr("eliteBonusCommandShips1"), skill="Command Ships")

View File

@@ -4,6 +4,5 @@
# Ship: Sleipnir
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Command Ships").level
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Medium Projectile Turret"),
"damageMultiplier", ship.getModifiedItemAttr("eliteBonusCommandShips1") * level)
"damageMultiplier", ship.getModifiedItemAttr("eliteBonusCommandShips1"), skill="Command Ships")

View File

@@ -4,6 +4,5 @@
# Ship: Sleipnir
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Command Ships").level
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Medium Projectile Turret"),
"falloff", ship.getModifiedItemAttr("eliteBonusCommandShips2") * level)
"falloff", ship.getModifiedItemAttr("eliteBonusCommandShips2"), skill="Command Ships")

View File

@@ -4,6 +4,5 @@
# Ship: Nighthawk
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Command Ships").level
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Heavy Assault Missiles"),
"aoeCloudSize", ship.getModifiedItemAttr("eliteBonusCommandShips2") * level)
"aoeCloudSize", ship.getModifiedItemAttr("eliteBonusCommandShips2"), skill="Command Ships")

View File

@@ -4,6 +4,5 @@
# Ship: Claymore
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Command Ships").level
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Heavy Assault Missiles"),
"aoeVelocity", ship.getModifiedItemAttr("eliteBonusCommandShips2") * level)
"aoeVelocity", ship.getModifiedItemAttr("eliteBonusCommandShips2"), skill="Command Ships")

View File

@@ -4,6 +4,5 @@
# Ship: Nighthawk
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Command Ships").level
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Heavy Missiles"),
"aoeCloudSize", ship.getModifiedItemAttr("eliteBonusCommandShips2") * level)
"aoeCloudSize", ship.getModifiedItemAttr("eliteBonusCommandShips2"), skill="Command Ships")

View File

@@ -4,6 +4,5 @@
# Ship: Claymore
type = "passive"
def handler(fit, ship, context):
level = fit.character.getSkill("Command Ships").level
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Heavy Missiles"),
"aoeVelocity", ship.getModifiedItemAttr("eliteBonusCommandShips2") * level)
"aoeVelocity", ship.getModifiedItemAttr("eliteBonusCommandShips2"), skill="Command Ships")

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