Compare commits

..

576 Commits

Author SHA1 Message Date
DarkPhoenix
7131cdbac6 Do not set position of empty module to None when we're attempting to convert it to dummy 2019-04-18 13:00:32 +03:00
DarkPhoenix
b70c1a7c6c Remove some deprecated code and rework handled list function 2019-04-18 13:00:06 +03:00
DarkPhoenix
f9fd265280 Add option which controls ammo switcher behavior 2019-04-18 11:34:16 +03:00
DarkPhoenix
9261d29ac1 DPS graph now respects factor reload option for fighters 2019-04-18 11:04:00 +03:00
DarkPhoenix
df658d4950 Changed default graph distancee to 0-100 km 2019-04-18 08:27:57 +03:00
DarkPhoenix
69f68bf4ea Always show implant set menu item if you have sets, even if implant is selected 2019-04-18 00:44:43 +03:00
DarkPhoenix
614f3acc7e Do not show civilian ammo for small lasers 2019-04-17 23:59:50 +03:00
DarkPhoenix
ec77acda1d Remove workaround used for orbital ammo, as it was removed from the game by CCP 2019-04-17 23:57:40 +03:00
DarkPhoenix
603553517e Bump version to 2.9.1 2019-04-17 22:41:43 +03:00
DarkPhoenix
4c04fd93ae Make sure position is returned as None in case the module cannot be found on passed fit 2019-04-17 22:37:44 +03:00
DarkPhoenix
f4f92b0821 Copy spoolup settings of modules when copying fit 2019-04-17 22:26:41 +03:00
DarkPhoenix
3aede13136 Copy t3d modes when copying fit 2019-04-17 22:24:49 +03:00
DarkPhoenix
d171548936 Fix fit creation 2019-04-17 20:02:05 +03:00
DarkPhoenix
3d0db365af Make projected modules overheatable again 2019-04-17 18:19:52 +03:00
DarkPhoenix
2716214816 Do not set mouse cursor on GTK as it's applied to whole panel for some reason 2019-04-17 17:05:16 +03:00
DarkPhoenix
91a46a2dd4 Move some code around 2019-04-17 16:22:09 +03:00
DarkPhoenix
9fd70a4ba9 Avoid using modPosition where possible 2019-04-17 16:14:30 +03:00
DarkPhoenix
400bb10ed3 Ensure that owner fit is always visible from all fit items and their modified attribute map
Fixes some issues with some afflictions not shown/registered when fit has just been loaded
2019-04-17 15:35:15 +03:00
DarkPhoenix
53915eb956 Minor cleanup 2019-04-17 13:27:08 +03:00
DarkPhoenix
5457c31148 Use already existing method in module validator 2019-04-17 10:03:49 +03:00
DarkPhoenix
be9ac7cc9c Bump version 2019-04-16 21:35:22 +03:00
DarkPhoenix
3e2d21ea44 Update siege effect 2019-04-16 21:33:49 +03:00
DarkPhoenix
be374f4eb4 Update regular effects 2019-04-16 21:02:43 +03:00
DarkPhoenix
ab200ef74b Update database to 1492195 2019-04-16 20:40:53 +03:00
DarkPhoenix
3e1ef6e76d Fix item diff script after we've changed the effects 2019-04-16 20:30:55 +03:00
DarkPhoenix
9fd0f016aa Merge branch 'master' of github.com:pyfa-org/Pyfa 2019-04-16 20:17:04 +03:00
DarkPhoenix
ae188826ae Update YAML file with icons from latest SDE 2019-04-16 20:15:41 +03:00
Anton Vorobyov
0736085676 Merge pull request #1925 from kiwimind/1924-typo
Amend typo on attribute tab on module stats window
2019-04-16 19:43:25 +03:00
Anton Vorobyov
fa4c48c6c2 Merge branch 'master' into 1924-typo 2019-04-16 19:43:13 +03:00
DarkPhoenix
82adccadda Always show factor reload time menu item 2019-04-16 19:41:52 +03:00
DarkPhoenix
f100971fbe Set charge to all modules when cmd/control is pressed, instead of having separate menu item 2019-04-16 19:35:24 +03:00
DarkPhoenix
af2da86f6f Change order of context menus 2019-04-16 19:26:45 +03:00
DarkPhoenix
5af211778b Rename context menu files 2019-04-16 18:16:53 +03:00
Glenn Barr
4c739308f9 Amend typo on attribute tab on module stats window 2019-04-16 16:16:36 +01:00
DarkPhoenix
98e834fd30 Re-add merge functionality 2019-04-16 17:23:25 +03:00
DarkPhoenix
7ae8d1dc1a Allow splitting drone stacks again 2019-04-16 16:53:22 +03:00
DarkPhoenix
e57fce39fe Fix fetching of prices of on-character implants 2019-04-16 16:25:44 +03:00
DarkPhoenix
fd54d2c28c Make sure module position is None when we're asking if it can be fit, fixes crash with cloning siege module-alike modules 2019-04-16 15:17:27 +03:00
DarkPhoenix
b5c411349c Never show that prices are being fetched for abyssal items 2019-04-16 15:12:36 +03:00
DarkPhoenix
4d31c8bb38 Send proper modadd/moddel events when changing mod meta level 2019-04-16 15:01:02 +03:00
DarkPhoenix
fbf3cace10 Save secondary state changes and restore them on undo 2019-04-16 14:48:25 +03:00
DarkPhoenix
30b12b04e8 Rework module to cargo GUI command 2019-04-16 14:07:54 +03:00
DarkPhoenix
9301bb56fa More changes to cargo to module command, start reworking module to cargo as well 2019-04-16 12:20:54 +03:00
DarkPhoenix
bc4c35665e Change the way dragging from cargo to modules is handled 2019-04-16 02:10:02 +03:00
DarkPhoenix
64bba0cfdb Rework cargo to module command 2019-04-16 01:41:19 +03:00
DarkPhoenix
a270dc44d2 Show attribute even if it's zero, if its base value is non-zero 2019-04-15 23:37:08 +03:00
DarkPhoenix
46fa1eb0c6 Fix implant set addition 2019-04-15 23:12:51 +03:00
DarkPhoenix
c7ed6367f9 Rework clone/swap modules 2019-04-15 21:00:34 +03:00
DarkPhoenix
9523c6f349 Add meta swap support to projected items 2019-04-15 20:03:00 +03:00
DarkPhoenix
8b0f5f871c Make sure drones to not merge on meta change 2019-04-15 18:57:00 +03:00
DarkPhoenix
3fa5ac7858 As commands now commit/recalc even in case of failure (as they do not know about exact reason of failure and we're not sure if rollback was succeeded), do not run them for every item added via double-click 2019-04-15 18:44:26 +03:00
DarkPhoenix
4c0f88cdfa Rework meta swap command 2019-04-15 18:05:18 +03:00
DarkPhoenix
0fedb17586 Fix implant panel selection issue 2019-04-15 14:06:57 +03:00
DarkPhoenix
960bef2b96 Move booster and implant meta swap out of meta swap command 2019-04-15 13:28:15 +03:00
DarkPhoenix
82777d0b02 Move gui commands to their own package to avoid confusion in commands package 2019-04-15 12:15:19 +03:00
DarkPhoenix
a560597a85 Rework 3 more UI commands 2019-04-15 12:06:07 +03:00
DarkPhoenix
59fb7bcd1b Do not show context menu item "open in new tab" for currently selected fit 2019-04-15 11:48:14 +03:00
DarkPhoenix
801f51b89c Rework projected GUI commands 2019-04-15 11:34:52 +03:00
DarkPhoenix
0b49bf201f Rework local module GUI commands 2019-04-14 22:47:00 +03:00
DarkPhoenix
cc8575b275 Rework local fighters GUI commands 2019-04-14 21:42:58 +03:00
DarkPhoenix
51a11edc36 Rework local drone GUI commands 2019-04-14 20:51:39 +03:00
DarkPhoenix
4a6c1c3920 Rework command-related GUI commands 2019-04-14 16:34:01 +03:00
DarkPhoenix
1cb0081420 Rework cargo-related GUI commands and use command when deleting item from cargo with delete key 2019-04-14 16:13:01 +03:00
DarkPhoenix
d61d69188f Do not store fit service and main frame on every command 2019-04-14 15:44:48 +03:00
DarkPhoenix
a829efa7ff Rework implant UI commands 2019-04-14 15:36:30 +03:00
DarkPhoenix
e6599d1a40 Rework GUI booster-related commands 2019-04-14 14:50:15 +03:00
DarkPhoenix
c4c68a4e93 Rename calc command package, as we're going to put gui commands into packages too 2019-04-14 14:21:43 +03:00
DarkPhoenix
f80244d560 Add custom command processor for our internal needs and use it in booster add command 2019-04-14 14:14:14 +03:00
DarkPhoenix
a8684ef1b9 Merge several local/projected commands into universal commands 2019-04-14 13:30:14 +03:00
DarkPhoenix
5ac9604fab Categorize other calc commands 2019-04-14 12:37:24 +03:00
DarkPhoenix
700e249bf3 Do not crash when undoing fit rename when fit item has been disposed 2019-04-14 11:55:22 +03:00
DarkPhoenix
c2b742304e Move some of commands into packages 2019-04-14 11:45:58 +03:00
DarkPhoenix
c2b0257449 Rework toggle commands 2019-04-14 11:37:58 +03:00
DarkPhoenix
0d90c187f2 Rename set mode command 2019-04-14 04:07:31 +03:00
DarkPhoenix
88acec4241 Show spoolup option for projected modules, and set spoolup via command processor for all cases 2019-04-14 03:59:59 +03:00
DarkPhoenix
9a6255cb29 Rework setting mode and fix command which changes fit name
It was just broken before
2019-04-14 03:18:25 +03:00
DarkPhoenix
c721869dfa Change charge changing command 2019-04-14 02:06:41 +03:00
DarkPhoenix
1154435a89 Minor style fixes 2019-04-13 23:26:53 +03:00
DarkPhoenix
6d9e60648e Do not remove items when quantity is 0 in fit commands, it will be done in gui commands instead 2019-04-13 23:11:28 +03:00
DarkPhoenix
4522edb814 Rework module state changing 2019-04-13 23:08:49 +03:00
DarkPhoenix
8139d88a52 Allow changing amounts of projected fighters 2019-04-13 22:48:20 +03:00
DarkPhoenix
353b845102 Change how changing of projected drone amount is done via commands 2019-04-13 22:05:06 +03:00
DarkPhoenix
c3bffcad34 Rework figter amount changer 2019-04-13 21:19:01 +03:00
DarkPhoenix
9e6031edf2 Get rid of drone variation command 2019-04-13 20:53:26 +03:00
DarkPhoenix
bb47df2119 Rework "change drone/cargo amount" commands 2019-04-13 20:33:23 +03:00
DarkPhoenix
aab9b39fea Slightly change how projected fits are processed 2019-04-13 18:47:47 +03:00
DarkPhoenix
1ca4c73a3e Rework projected fighter fit commands 2019-04-13 18:26:05 +03:00
DarkPhoenix
7f870cf675 Rework projected drone fit commands 2019-04-13 16:25:49 +03:00
DarkPhoenix
5f8ccb9831 Change fix for invisible labels on linux 2019-04-13 14:26:05 +03:00
DarkPhoenix
c94acd9718 If during price optimizations different items are converted into one, merge them 2019-04-13 03:19:34 +03:00
DarkPhoenix
1733d6abb8 Always show system-wide effect beacon on top 2019-04-13 02:52:59 +03:00
DarkPhoenix
aa9f16d3ad Make sure our handled lists are not sorted
Because we rely on item positions within lists to identify modules for undo/redo stuff
2019-04-13 02:46:54 +03:00
DarkPhoenix
c997661f3a Rework implant fit commands 2019-04-13 01:56:17 +03:00
DarkPhoenix
6174bf8a0b Refactor non-projected fighter commands 2019-04-13 01:27:26 +03:00
DarkPhoenix
36c19fe6e8 Rework local drone commands 2019-04-12 23:46:41 +03:00
DarkPhoenix
e6c9db3eef Change command-related commands a little 2019-04-12 22:24:13 +03:00
DarkPhoenix
336af0f669 Rework cargo to use cargoinfo 2019-04-12 20:09:13 +03:00
DarkPhoenix
2800637a90 Rework cargo fit commands 2019-04-12 19:51:18 +03:00
DarkPhoenix
1fb9936893 Fix booster commands 2019-04-12 17:55:56 +03:00
DarkPhoenix
d738ba615e Finish overhauling module-related fit commands 2019-04-12 14:32:25 +03:00
DarkPhoenix
e5a694384d Raise errors on all insertions to handled lists which fail 2019-04-12 12:41:46 +03:00
DarkPhoenix
1d98f889fd Raise exceptions on failures to add module to module list 2019-04-12 10:47:14 +03:00
DarkPhoenix
ad03f907fa Overhaul module-related commands 2019-04-12 04:02:28 +03:00
DarkPhoenix
5579929f83 Undoing removal of drones now restores their proper state 2019-04-11 18:20:56 +03:00
DarkPhoenix
e90e9a5ca1 Make removal of fighters completely undoable 2019-04-11 16:31:44 +03:00
DarkPhoenix
2341650437 Store projected fit state on deletion for undo purposes 2019-04-11 14:03:44 +03:00
DarkPhoenix
f2c26af791 Fix toggling of abilities of projected fighters 2019-04-11 13:45:25 +03:00
DarkPhoenix
fc82e45d6c As wormhole effects are still modules and we now fully support reverting modules even in case they were overwritten, consider them as modules in commands too 2019-04-11 13:21:49 +03:00
DarkPhoenix
1b54f07ce0 Fix small but significant oversight 2019-04-11 12:36:41 +03:00
DarkPhoenix
938fa11d13 Removed projected modules now keep their state for undoing 2019-04-11 10:45:09 +03:00
DarkPhoenix
a08aa77afc Restore state of command fits on undo 2019-04-11 00:54:42 +03:00
DarkPhoenix
4cbeb34a3e Make toggling fighter abilities undoable 2019-04-11 00:05:28 +03:00
DarkPhoenix
d2fab0a10e Make removal of fighters undoable w/o information loss 2019-04-10 23:42:05 +03:00
DarkPhoenix
a8c3612248 Make removal of item from cargo via double-click undoable 2019-04-10 23:16:46 +03:00
DarkPhoenix
50e4e6fdcf Fix undoing of drone removal 2019-04-10 23:01:43 +03:00
DarkPhoenix
69ada4f3ad Make sure we do not store any sqlalchemy-managed objects in projected command 2019-04-10 21:50:04 +03:00
DarkPhoenix
3fc77d03b4 Restore state of removed implants on undo 2019-04-10 19:32:48 +03:00
DarkPhoenix
8072bb600c Make toggling side-effects undoable 2019-04-10 18:47:46 +03:00
DarkPhoenix
fda2c43a1d Restore booster state even when it was replaced by another booster 2019-04-10 18:18:26 +03:00
DarkPhoenix
7fc98037a6 Save booster state upon deletion for undo 2019-04-10 17:59:34 +03:00
DarkPhoenix
b51c8d8ecf Focus projected pane when something is projected via context menu 2019-04-10 16:11:23 +03:00
DarkPhoenix
dca2db5a6d Make projected states undo'able 2019-04-10 15:44:03 +03:00
DarkPhoenix
fbb192404f Add undo support to muta->normal conversion 2019-04-10 09:51:07 +03:00
DarkPhoenix
7e41d8e20c Make conversion to mutaplasmid undoable 2019-04-10 09:14:22 +03:00
DarkPhoenix
9460998015 Make removing mutated items undoable 2019-04-10 01:22:41 +03:00
DarkPhoenix
86056bf282 Save all the info about mutations into command cache 2019-04-09 18:07:49 +03:00
Anton Vorobyov
bacb374ea4 Merge pull request #1914 from pyfa-org/menu_overhaul
Main menu & stats menu overhaul
2019-04-09 16:34:23 +03:00
DarkPhoenix
8d07f11aa4 Update shortcuts in main menu 2019-04-09 16:20:09 +03:00
DarkPhoenix
b6a13b32de Rework alt-key shortcuts 2019-04-09 15:55:10 +03:00
DarkPhoenix
1f1a16f896 Merge branch 'master' into menu_overhaul 2019-04-09 12:18:35 +03:00
Anton Vorobyov
444d7af7ed Merge pull request #1916 from pyfa-org/issue1887
Stats menu indicators
2019-04-09 12:13:43 +03:00
DarkPhoenix
e45e0b9444 Merge branch 'master' into menu_overhaul 2019-04-08 19:12:59 +03:00
DarkPhoenix
33886aea1b Add exotic plasma to damage patterns 2019-04-08 19:12:30 +03:00
DarkPhoenix
1ddc2edd88 Move loading defaults to preference buttons 2019-04-08 17:43:11 +03:00
DarkPhoenix
01b16ec5f0 Rework main menu by rearranging it into different groups 2019-04-08 16:32:07 +03:00
DarkPhoenix
ba337599c2 Do not activate ADC and PANIC upon fitting 2019-04-08 13:33:21 +03:00
DarkPhoenix
211a83defd Show market jump menu item only for items residing in groups shown by pyfa 2019-04-08 13:01:35 +03:00
Anton Vorobyov
091a7d7ab8 Merge pull request #1904 from burnsypet/issue-1871
Logic to enable/disable redo/undo buttons
2019-04-08 10:21:52 +03:00
Anton Vorobyov
b3030bacf9 Merge pull request #1913 from pyfa-org/market_metagroups
Market meta category options
2019-04-08 10:21:02 +03:00
DarkPhoenix
feb164a48e Reset item list to empty during search cancel only if we still were searching, do nothing otherwise 2019-04-08 00:16:58 +03:00
DarkPhoenix
b3a556e70a Raise error instead of doing nothing for abstract methods 2019-04-07 23:59:54 +03:00
DarkPhoenix
9d322ca862 Drop selection when search is used 2019-04-07 23:50:39 +03:00
DarkPhoenix
9bde08b1ce Rework price stats panel context menu 2019-04-07 23:33:22 +03:00
DarkPhoenix
953a67e2c4 Update market preferences icon 2019-04-07 21:00:57 +03:00
DarkPhoenix
2435e08dc0 Implement option to select all meta buttons on market group selection 2019-04-07 19:42:44 +03:00
DarkPhoenix
31645d20a5 As recents are int, do == instead of is 2019-04-05 21:57:01 +03:00
DarkPhoenix
5fa96c5e52 Introduce new option group and move some options around 2019-04-05 21:00:42 +03:00
DarkPhoenix
278d946f77 Fix price context menu 2019-04-05 20:22:24 +03:00
DarkPhoenix
9b8aa67271 Remove some old commented out code 2019-04-05 20:18:50 +03:00
DarkPhoenix
af197e56cf Revert "Remove price cache clear menu item"
This reverts commit d59111eef5.
2019-04-05 20:17:25 +03:00
DarkPhoenix
1d5ba89f2e Revert "Remove price options menu item"
This reverts commit f784f45b4e.
2019-04-05 20:17:13 +03:00
DarkPhoenix
f45ad5ceab Implement logic which temporarily enables/disables meta groups for search 2019-04-03 18:16:10 +03:00
DarkPhoenix
5dae614fa1 Split search and recent modes 2019-04-03 17:49:08 +03:00
DarkPhoenix
c144c16a7f Enable only available buttons in case of empty item list 2019-04-03 16:45:24 +03:00
DarkPhoenix
10425cd5d9 Do not run "emtpy item list" logic on market groups with no items at all 2019-04-03 16:41:33 +03:00
DarkPhoenix
1d208a0cf7 Move search mode reset on market jump to market browser from item view 2019-04-03 16:30:51 +03:00
DarkPhoenix
db07f9d534 Implement logic to autoselect some metagroups if no items were filtered 2019-04-03 15:58:18 +03:00
DarkPhoenix
ca4eeed8d1 Reword some preference descriptions 2019-04-03 15:36:28 +03:00
DarkPhoenix
292d95f6f8 Implement market jump meta category logic 2019-04-03 15:34:26 +03:00
burnsypet
bd5ee32227 change logic 2019-04-02 19:29:03 +01:00
DarkPhoenix
0a705d1d7f Change price panel padding a little 2019-04-02 20:00:53 +03:00
DarkPhoenix
be1bd24a05 Change layout of options and window size a little 2019-04-02 19:22:37 +03:00
DarkPhoenix
a9fb3501ac Change price preferences layout 2019-04-01 17:14:50 +03:00
DarkPhoenix
b8a8f9c422 Add metagroup-related preferences 2019-04-01 16:52:46 +03:00
DarkPhoenix
6c29b3f38b ALways include price of ship and modules 2019-04-01 15:41:38 +03:00
DarkPhoenix
f784f45b4e Remove price options menu item 2019-04-01 15:39:15 +03:00
DarkPhoenix
d59111eef5 Remove price cache clear menu item 2019-04-01 15:36:58 +03:00
DarkPhoenix
99a2a38f9c Merge branch 'master' into market_metagroups 2019-04-01 14:53:31 +03:00
DarkPhoenix
768c1d37b1 Fix fit export 2019-03-31 16:08:48 +03:00
Anton Vorobyov
b21cf5673f Merge pull request #1907 from MaruMaruOO/patch-1
Additional fix for #1902
2019-03-31 11:53:51 +03:00
MaruMaruOO
a6b8381e25 Additional fix for #1902
Adds checks to make sure effects return correct `isImplemented` and `isType` values when they are called before handler generation.
2019-03-30 09:15:48 -04:00
DarkPhoenix
7d8768ca3e Add extra check on command level to ensure no errors 2019-03-30 10:52:54 +03:00
DarkPhoenix
96e0a02d5c Ensure we do not attempt to import mutated module when we have no fit open 2019-03-30 10:33:01 +03:00
DarkPhoenix
6a2bdade80 Fix attr tab original value column fetching module attributes for charges 2019-03-29 01:09:52 +03:00
Ryan Holmes
ea9eb3a8b7 Merge branch 'origin_master' into issue1887 2019-03-26 18:53:19 -04:00
Ryan Holmes
9c5fe56981 Fix right click on state not toggling overheat 2019-03-26 18:46:26 -04:00
Ryan Holmes
8fed78d596 Add a few conditionals in case menu is spawned without a fit being loaded 2019-03-26 09:44:43 -04:00
Ryan Holmes
3c5846a983 Add a menu icon to stat panels which have a context menu associated with them 2019-03-26 09:37:03 -04:00
Ryan Holmes
fa0892032f Develop method for context menu classes to signal that they should be displayed, but disabled. This will allow us to determine if a context menu exists for a certain context (stats panel, for example) without relying on old logic of not displaying them if fitting is not loaded. 2019-03-26 09:36:31 -04:00
Ryan Holmes
ed7dd12258 Merge remote-tracking branch 'origin/context_menus' into origin_master 2019-03-26 09:32:19 -04:00
DarkPhoenix
1a5fc31e25 Switch to safeloader
Seems like we do not use any custom data structures in yaml
2019-03-26 08:10:40 +03:00
DarkPhoenix
facb0b1023 Fix EFS export 2019-03-26 08:00:57 +03:00
DarkPhoenix
6dd737cdd1 Revert "Fix EFS export"
This reverts commit 5d012d6959.
2019-03-26 07:58:53 +03:00
DarkPhoenix
5d012d6959 Fix EFS export 2019-03-26 07:57:51 +03:00
burnsypet
b00dbbbf42 Logic to enable/disable redo/undo 2019-03-25 19:31:10 +00:00
DarkPhoenix
b269381818 Include cargo and drones by default in total ship price 2019-03-25 16:14:48 +03:00
DarkPhoenix
fa72345bcf Add ship and modules as separate entries to menu for feature parity 2019-03-25 16:14:14 +03:00
DarkPhoenix
3229652efa Remove detailed price popups and move price preferences to new preference tab 2019-03-25 15:57:42 +03:00
Indiction
c02cccf415 Adding Option to Change "total price" calculation Statview
Hint for module and total price provide detail informations
2019-03-25 14:58:03 +03:00
DarkPhoenix
54277ebbda Merge branch 'master' into market_metagroups 2019-03-25 13:21:20 +03:00
DarkPhoenix
78c6d4f005 Merge branch 'master' of github.com:pyfa-org/Pyfa 2019-03-25 10:07:38 +03:00
DarkPhoenix
37ad2faa8e Fix fit XML export 2019-03-25 10:07:23 +03:00
Ryan Holmes
26cba1c47a Fix a long standing bug due to misuse of context menu bindings in stats panels (see #651, and probably others) 2019-03-24 21:48:05 -04:00
Ryan Holmes
f95420d7bf Fix character editor context menu on Linux (#1895) 2019-03-24 20:59:40 -04:00
Ryan Holmes
9c79fb666b Convert context menu spawning of "affected by" listing 2019-03-24 19:24:46 -04:00
Ryan Holmes
a9a9fd1b1a Clean up another context menu 2019-03-24 19:08:31 -04:00
Ryan Holmes
253d3107a0 First pass at cleaning up context menu events (#1895) 2019-03-24 18:55:25 -04:00
Ryan Holmes
656a7fc784 Do not attempted to remove from projected panel if nothing of interest is selected (#1899) 2019-03-24 16:59:18 -04:00
Ryan Holmes
be579cfaeb bump version 2019-03-24 10:46:44 -04:00
Ryan Holmes
d40a7c2efa Fix for GTK - you can only enable a menu item after it's been added to menu 2019-03-24 08:17:49 -04:00
Ryan Holmes
8ba05409e0 nvm, it doesn't
Revert "Allow platforms that can use a checked image to use one, otherwise this should fallback to plain check (for GTK)"

This reverts commit 2b817c5d22.
2019-03-24 07:21:43 -04:00
Ryan Holmes
2b817c5d22 Allow platforms that can use a checked image to use one, otherwise this should fallback to plain check (for GTK) 2019-03-24 07:18:16 -04:00
Ryan Holmes
ba445e7d4f Merge branch 'master' of https://github.com/pyfa-org/Pyfa into origin_master 2019-03-23 22:08:57 -04:00
Ryan Holmes
b836ceb216 Use checked api instead of bitmap for factor reload (#1897) 2019-03-23 22:07:08 -04:00
DarkPhoenix
dfa0373497 Fix fighter abilities and do not rely on effects' removed attributes anymore 2019-03-23 18:42:35 +03:00
DarkPhoenix
caefd4fbbb Sort fighters by group and name 2019-03-23 18:02:18 +03:00
DarkPhoenix
b7528d11b2 Remove fighters from drone sorting 2019-03-23 17:53:17 +03:00
DarkPhoenix
07d333d3d5 Fix bug with booster side-effects which appeared due to sorting them by attribute slot 2019-03-23 17:46:26 +03:00
DarkPhoenix
48ac6cb2af Remove debugging prints or move them to pyfalog 2019-03-23 14:01:43 +03:00
Ryan Holmes
87a246204b Merge pull request #1893 from pyfa-org/effect_rollup
Effect rollup
2019-03-22 18:59:55 -04:00
Ryan Holmes
3ef056225b Merge branch 'effect_rollup_embedded' into effect_rollup 2019-03-22 18:59:20 -04:00
DarkPhoenix
4fa63aa2bd Add more jargon definition 2019-03-23 01:04:55 +03:00
DarkPhoenix
1edaf021da Fix booster effects 2019-03-22 19:11:28 +03:00
DarkPhoenix
37b44befac Add newline to the end of the file 2019-03-22 18:30:41 +03:00
DarkPhoenix
efd58a80a4 Change script to not write to effect file too much 2019-03-22 18:26:27 +03:00
DarkPhoenix
e43cce20a6 Fix remote hull rep effect 2019-03-22 18:04:38 +03:00
DarkPhoenix
0c7601b6d3 Change effectUsedBy script and run it over effects file 2019-03-22 18:01:14 +03:00
DarkPhoenix
4cfcfedc14 Change the way effects are stored even in source 2019-03-22 15:30:14 +03:00
DarkPhoenix
0024bc5514 Rename effect 2019-03-22 12:56:15 +03:00
Ryan Holmes
aacb95df7c more info in logging 2019-03-21 21:23:30 -04:00
Ryan Holmes
854d60792e Merge branch 'origin_master' into effect_rollup 2019-03-21 20:35:01 -04:00
Ryan Holmes
d922bf8913 fix bad resets 2019-03-21 20:30:37 -04:00
Ryan Holmes
703dc93dee Merge branch 'origin_master' into effect_rollup 2019-03-21 19:57:45 -04:00
Ryan Holmes
7fd545aad4 add rollup to macos build 2019-03-21 19:57:27 -04:00
Ryan Holmes
a69730085f Merge branch 'master' of https://github.com/pyfa-org/Pyfa into origin_master 2019-03-21 19:48:10 -04:00
Ryan Holmes
1603201166 Add "Can fit" grouping 2019-03-21 19:47:31 -04:00
DarkPhoenix
ead8238d7e Merge branch 'master' into market_metagroups 2019-03-22 02:02:17 +03:00
DarkPhoenix
8380f516e8 Add fallback for safety 2019-03-21 23:56:44 +03:00
DarkPhoenix
1b7c23b1d3 Sort boosters by slot 2019-03-21 23:55:25 +03:00
DarkPhoenix
295368635b Move some of preferences into new group 2019-03-21 14:00:49 +03:00
DarkPhoenix
6291fe1626 Fix HTML export (#1890) 2019-03-21 13:01:21 +03:00
DarkPhoenix
cdaf5cc168 No need to use .value for IntEnums 2019-03-21 12:55:39 +03:00
Ryan Holmes
5940625e24 Don't attempt to add cargo if there is not fitting loaded (#1888) 2019-03-20 21:51:58 -04:00
Ryan Holmes
549353dba1 Merge pull request #1885 from pyfa-org/issue1870
Implement fixes for #1870 - undo the Module.toDummy that happens when…
2019-03-20 18:01:30 -04:00
DarkPhoenix
4dc281b37e Move spoolup enum into costs 2019-03-20 13:07:44 +03:00
DarkPhoenix
0242cc845c Pep8 2019-03-20 13:05:38 +03:00
DarkPhoenix
e9c6d98db8 Fix fetching skills via ESI 2019-03-20 13:04:38 +03:00
DarkPhoenix
86459faf76 Fix issue with ship filter which didn't follow market overrides
It bugged out if you have some limited edition ships. E.g. if you have malice fit and no other AF fits, when you enable filter it hid limited edition group but showed AF group
2019-03-20 12:12:51 +03:00
Anton Vorobyov
e8af636831 Merge pull request #1857 from pyfa-org/price_optimize
Price optimize
2019-03-19 19:48:36 +03:00
Ryan Holmes
eea7220e3d remove incorrect files 2019-03-19 11:47:55 -04:00
Ryan Holmes
cc56611783 add comment 2019-03-19 11:36:30 -04:00
Ryan Holmes
0b511af48a Remove weird typo, whoops 2019-03-19 11:34:54 -04:00
Ryan Holmes
25bbf3dc03 Move export logic from mainframe to export dialog, and introducing ui blocking for price optimization 2019-03-19 11:34:10 -04:00
DarkPhoenix
72a602b5b0 Merge branch 'master' into price_optimize 2019-03-19 16:45:17 +03:00
Ryan Holmes
d107156341 Fix for sill name getting cutoff on gtk (#1886) 2019-03-19 09:15:09 -04:00
DarkPhoenix
8063647bba Merge branch 'master' into price_optimize 2019-03-19 08:42:06 +03:00
Ryan Holmes
573d8e068c Merge branch 'master' of https://github.com/pyfa-org/Pyfa into origin_master 2019-03-18 22:32:48 -04:00
Ryan Holmes
f6c6f9a0c9 Handle double click event on skill groups in character editor (#1886) 2019-03-18 22:30:54 -04:00
Ryan Holmes
d9c5c9cc0e Merge pull request #1836 from pyfa-org/spoolup
Spoolup
2019-03-18 20:32:18 -04:00
Ryan Holmes
bb7fb022ef fixes for windows and selected menu item 2019-03-18 20:25:28 -04:00
DarkPhoenix
52c9f4076b Change reset label 2019-03-18 20:08:06 +03:00
DarkPhoenix
894231b009 Change selection affix 2019-03-18 19:40:30 +03:00
DarkPhoenix
34fe530ac7 Add current value marker 2019-03-18 19:29:27 +03:00
DarkPhoenix
33b91a79ab Add option to disable this context menu 2019-03-18 18:21:53 +03:00
DarkPhoenix
51180a9375 Put spoolup menu above item stats 2019-03-18 17:54:00 +03:00
DarkPhoenix
6e44963d57 Implement spoolup selection via purely context menu 2019-03-18 17:52:37 +03:00
DarkPhoenix
8114765236 Merge branch 'master' into spoolup 2019-03-18 16:04:45 +03:00
DarkPhoenix
7ddd3a35d1 Merge branch 'master' into price_optimize 2019-03-18 14:34:35 +03:00
DarkPhoenix
52a68adb11 Put character editor window into scope of main window
This fixes various annoying things happening under linux: two separate applications shown when character editor open and various window focus bugs when opening stats of skills in character editor
2019-03-18 14:33:17 +03:00
DarkPhoenix
566e7fd046 Disable UI for duration of price optimization 2019-03-18 13:55:57 +03:00
Ryan Holmes
a74cdc59bd Implement fixes for #1870 - undo the Module.toDummy that happens when replacing a module, but the new module doesn't fit. And shuffle around the logic that dictates if a module / item fits onto a particular ship to allow us to ask a fit if a base item can fit based on low-level attributes that don't change 2019-03-17 22:03:39 -04:00
Ryan Holmes
3c98aad4ba Autosize the item attribute columns (#1878). 2019-03-17 19:35:19 -04:00
Ryan Holmes
0063840cfa Merge branch 'price_optimize' of https://github.com/pyfa-org/Pyfa into price_optimize 2019-03-17 13:18:50 -04:00
Ryan Holmes
96077ed115 Create blocking UI for fit price optimizations 2019-03-17 13:18:42 -04:00
Ryan Holmes
19f02ef914 Align skill column to the right (#1866) 2019-03-17 09:06:47 -04:00
Ryan Holmes
de9ce47bed Merge branch 'master' of https://github.com/pyfa-org/Pyfa into origin_master 2019-03-17 09:01:47 -04:00
Ryan Holmes
ccd3665115 Do not call Layout on the skill tree view. #1866 2019-03-17 09:01:40 -04:00
Ryan Holmes
1a992a90ad Add logging 2019-03-16 19:11:27 -04:00
Ryan Holmes
fff07078dc add eos config option for all effects 2019-03-16 14:36:35 -04:00
Ryan Holmes
81d040fba6 Convert all effect files to effect<ID>.py 2019-03-16 14:08:20 -04:00
DarkPhoenix
a35f04cd9a Merge branch 'master' into price_optimize 2019-03-16 13:55:35 +03:00
DarkPhoenix
c6c364c451 Change runtime of combat rig sec modifier 2019-03-16 13:55:13 +03:00
DarkPhoenix
8dcc3f2b51 Merge branch 'master' into price_optimize 2019-03-16 13:30:35 +03:00
DarkPhoenix
42383cef03 Add effect which increases rig strength if system is not hi-sec 2019-03-16 13:29:47 +03:00
DarkPhoenix
579081393b Merge branch 'master' into price_optimize 2019-03-16 01:47:18 +03:00
Ryan Holmes
2290281024 Merge pull request #1869 from IndictionEve/Code_Cleanup_Enums
Code cleanup enums #1862
2019-03-15 18:06:49 -04:00
DarkPhoenix
712c49d129 Merge branch 'master' into price_optimize 2019-03-15 10:14:30 +03:00
Ryan Holmes
ac16b19d93 Merge branch 'master' of https://github.com/pyfa-org/Pyfa into origin_master 2019-03-14 20:15:25 -04:00
Ryan Holmes
51b3cff4a9 Fix for #1877 2019-03-14 20:15:05 -04:00
DarkPhoenix
768b0b3a3a Merge branch 'master' into price_optimize 2019-03-15 01:41:28 +03:00
DarkPhoenix
538271d737 Add UI-specific highIsGood override for web 2019-03-15 01:40:15 +03:00
Ryan Holmes
61da8be732 Few import fixes and some bug fixes 2019-03-14 14:46:01 -04:00
Ryan Holmes
90e275e386 Remove unused import 2019-03-14 14:25:11 -04:00
Ryan Holmes
8e98af8517 Performance improvement when collecting counts for categories. Instead of making n calls for each category to sql, we get a grouped count by shipID, then process this in python, which is much faster. 2019-03-14 14:15:01 -04:00
Ryan Holmes
9a16c579eb fixing various imports to point to eos.const instead of old locations 2019-03-14 12:50:20 -04:00
Indiction
8b864692fb Moved non-EOS enum to new service/const.py. Renamed FittingAttrGroup
to GuiAttrGroup
2019-03-12 23:17:25 +01:00
DarkPhoenix
eaddc942a0 Merge branch 'master' into price_optimize 2019-03-12 14:25:51 +03:00
Ryan Holmes
82c5ae1fe9 some clean up 2019-03-09 20:43:40 -05:00
Ryan Holmes
5c2df66335 #1867 Fix for the image list crash on linux 2019-03-09 20:38:58 -05:00
Indiction
afa8c3c53a Replaced eos.enum by enum. Removed unused enum import.
Found another Enum to move.
2019-03-09 18:59:43 +01:00
Indiction
bd33efa875 Changed FittingSlot to IntEnum 2019-03-09 18:45:28 +01:00
DarkPhoenix
f53c8e9efc Switch "total" and "character" around
So that total is bottom-right item
2019-03-09 17:40:13 +03:00
DarkPhoenix
d2b306d030 Fix export window sizing bug 2019-03-09 17:31:02 +03:00
Indiction
f58c8ec4f9 Added unique to rest except Fittingslot 2019-03-09 15:18:10 +01:00
Ryan Holmes
dd9390384e remove effect file adding in the pyfa.spec file (for dev only) 2019-03-09 09:05:39 -05:00
DarkPhoenix
22fc6cb13c Integrate price optimization with undo/redo 2019-03-09 15:44:50 +03:00
Indiction
aaec82e493 Added unique to current IntEnums
Renamed PortMultiBuyItemType to PortMultiBuyOptions
2019-03-09 12:30:05 +01:00
Indiction
6333a0c74b Adding descriptions to enums.
Renaming Enums into more useful names.
2019-03-07 22:30:51 +01:00
DarkPhoenix
41711706c0 Merge branch 'master' into price_optimize 2019-03-07 13:13:17 +03:00
Indiction
e6309bb8bb Copy Enums to const.py
Switching to IntEnum where necessary.
2019-03-07 00:14:48 +01:00
IndictionEve
909c9f7b71 Merge pull request #2 from pyfa-org/master
Update
2019-03-06 23:29:50 +01:00
DarkPhoenix
becf7c3ff2 Commit stub of price optimization command 2019-03-06 23:59:11 +03:00
DarkPhoenix
257df58c3a Get rid of idea of "better" replacements
It turned out to be maintenance hell and it's just hard to find all the dual-action attributes (like crash vs GD sig attr, AB cycle time modification vs rep cycle time modification etc)
2019-03-06 00:43:19 +03:00
Ryan Holmes
23d945c7f2 disable effect imports to ensure proper handling when building 2019-03-04 20:45:44 -05:00
Ryan Holmes
e3971c995e Fix windows build to use effect rollups 2019-03-04 19:53:19 -05:00
DarkPhoenix
8641c41da6 Add bunch of overrides to make sure hardwirings are upgraded as expected 2019-03-04 18:35:06 +03:00
Ryan Holmes
b7f53e8402 Ignore the all effects file to avoid accidentally commiting it 2019-03-04 10:09:52 -05:00
Ryan Holmes
1ef517d87e Preliminary support for a "all effects" module to help with import times hopefully 2019-03-04 10:09:05 -05:00
DarkPhoenix
c3e03f2136 Fix em- implant series replacement 2019-03-03 23:39:55 +03:00
DarkPhoenix
4d31c2a2a3 Change the way we generate replacements and update database 2019-03-03 21:06:12 +03:00
DarkPhoenix
b03860e765 Add implant, booster and cargo support to fit price optimization 2019-03-03 19:57:59 +03:00
Ryan Holmes
2e49aa1419 #1863 dont attempt to remove character implants 2019-03-03 08:26:39 -05:00
DarkPhoenix
647c093451 Add drones and fighters to fit optimization 2019-03-03 10:00:23 +03:00
DarkPhoenix
d96146034a Fix replacing of modules 2019-03-03 09:46:27 +03:00
Ryan Holmes
b944f27fc8 tweak 2019-03-02 22:14:39 -05:00
Ryan Holmes
df80449b0b Simplify the spoolup dialog 2019-03-02 22:11:55 -05:00
Ryan Holmes
986ae16eaf Allow global spoolup value to be editable via preferences 2019-03-02 21:31:13 -05:00
Ryan Holmes
f81cc4ad93 Merge remote-tracking branch 'origin/master' into spoolup 2019-03-02 20:57:29 -05:00
blitzmann
c9b0322c9f Merge branch 'tonycoz-colour-item-list' 2019-03-02 17:35:37 -05:00
blitzmann
114d72e23f Fix bug for when updating preferences before loading anything into ItemView 2019-03-02 17:35:30 -05:00
blitzmann
f8e6474b39 Some slight tweaks to work done by @tonycoz for #1839 2019-03-02 17:21:46 -05:00
Ryan Holmes
8d0c2c18d2 Merge branch 'master' into colour-item-list 2019-03-02 15:27:54 -05:00
Ryan Holmes
dddec72f13 Merge pull request #1813 from pyfa-org/attrGroup
Attribute grouping
2019-03-02 15:25:11 -05:00
Ryan Holmes
9cfbaf3450 Merge branch 'req_updates' into origin_master 2019-03-02 14:53:48 -05:00
Ryan Holmes
9fc16cb287 more updates 2019-03-02 14:31:16 -05:00
Ryan Holmes
78836add28 update requirements 2019-03-02 14:21:13 -05:00
Ryan Holmes
f919e23360 There's some times when self.httpd doesn't exist for some reason. Too lazy to find out the cause 2019-03-02 11:43:21 -05:00
Ryan Holmes
ec3822a6da Develop dialog and keep SSO server running as long as dialog remains active (#1859) 2019-03-02 11:00:28 -05:00
Tony Cook
9bdb4ea967 move the item slot colours to config and use it from there 2019-03-01 19:52:02 +11:00
Tony Cook
af17a4f1c9 make slot a property for item and use that for the item list bg 2019-03-01 19:51:30 +11:00
Tony Cook
2ea3394845 make the item list colour per slot if colorFitBySlot set
attempts to resolve #1839
2019-03-01 19:51:30 +11:00
Ryan Holmes
65dff8dcf7 Scroll the window back to 0, 0 when children are removed (#1843) 2019-02-28 21:41:59 -05:00
Ryan Holmes
bfaad631bc Fix crash in linux for attribute groupings 2019-02-28 20:24:07 -05:00
blitzmann
96a5bf7ea9 update eve.db 2019-02-28 18:52:41 -05:00
blitzmann
e665161dc8 Merge remote-tracking branch 'origin/master' into attrGroup
# Conflicts:
#	eve.db
2019-02-28 18:51:52 -05:00
DarkPhoenix
18e03e46c3 Wire functionality to menu item
Still doesn't work
2019-02-28 21:44:04 +03:00
DarkPhoenix
d9941945e0 Add method which supposedly will update fit to optimize its price 2019-02-28 00:12:53 +03:00
Ryan Holmes
75d5b48df8 Merge branch 'master' of https://github.com/pyfa-org/Pyfa 2019-02-27 11:28:46 -05:00
Ryan Holmes
8c8e7825e9 fix typo 2019-02-27 11:28:38 -05:00
DarkPhoenix
af3a7553ed Merge branch 'master' into price_optimize 2019-02-25 09:27:25 +03:00
DarkPhoenix
f68ee81634 Change stats window size for gtk 2019-02-25 09:26:35 +03:00
DarkPhoenix
4385b3651f Attempt to get rid of codacy warnings 2019-02-25 09:04:59 +03:00
DarkPhoenix
ed24e7a2a3 Add validity override of 2 hours for prices 2019-02-25 08:43:27 +03:00
DarkPhoenix
b9e68504ed Add support for multibuy price optimization option 2019-02-25 08:35:35 +03:00
blitzmann
1fcd95d36f Merge branch 'WatchMeCalculate-issue-1845' 2019-02-24 17:59:12 -05:00
blitzmann
4dc70dad3b Apply CTRL+Backspace fix for fitting Notes text box 2019-02-24 17:58:55 -05:00
blitzmann
e0a54c14e2 Merge branch 'issue-1845' of git://github.com/WatchMeCalculate/Pyfa into WatchMeCalculate-issue-1845 2019-02-24 17:49:42 -05:00
DarkPhoenix
839d025885 Add price optimization option to multibuy
Doesn't work yet
2019-02-24 12:50:34 +03:00
DarkPhoenix
8d183a859d Add method to fetch price optimizations 2019-02-24 12:22:29 +03:00
IndictionEve
09bc1eb9d2 Merge pull request #1 from pyfa-org/master
Update Commit
2019-02-24 08:24:57 +01:00
DarkPhoenix
c6f2072bb9 Add method which prepares items for fetching 2019-02-24 03:36:56 +03:00
DarkPhoenix
7d42f8dba6 Update db and how we generate list of replacements 2019-02-23 15:20:56 +03:00
DarkPhoenix
8b86f14ee2 Ignore more attributes when finding similar items 2019-02-23 14:49:07 +03:00
DarkPhoenix
ef7195a7cc Change database generation script to rely on type effects and parent type for grouping 2019-02-22 19:04:37 +03:00
DarkPhoenix
43e88fa78d Merge branch 'master' into price_optimize 2019-02-22 11:25:33 +03:00
DarkPhoenix
5d0900337f Change how we split lines during fit import, also re-use split lines where needed to avoid format-specific linebreak bugs 2019-02-22 11:24:43 +03:00
Jonah Jolley
a5a9dc0877 Adding support for ctrl+backspace in searchbars 2019-02-21 18:18:01 -07:00
DarkPhoenix
e36b9661f0 Do not generate empty fetches when everything has been requested 2019-02-21 16:50:10 +03:00
DarkPhoenix
c66f80d6e5 Allocate passed timeout across multiple fetches to avoid exceeding it, with focus on primary data source 2019-02-21 16:05:35 +03:00
Anton Vorobyov
0dfe6707a7 Merge pull request #1856 from WatchMeCalculate/issue-1835
Mac Osx clipboard can store items with \r, ensure we split on newline or carriage return
2019-02-21 14:23:44 +03:00
DarkPhoenix
f9eef5ee07 Fetch item price globally if failed to get sensible data for specified system 2019-02-21 13:05:43 +03:00
DarkPhoenix
dc3b5c916b Merge branch 'master' into price_optimize 2019-02-21 12:32:35 +03:00
Anton Vorobyov
0471cda64e Merge pull request #1847 from pyfa-org/fit_export_options
Multibuy export options
2019-02-21 12:28:20 +03:00
DarkPhoenix
b2bcdf0a46 Replace old export option format with new one when needed 2019-02-21 12:16:36 +03:00
DarkPhoenix
cf9d2082ef Fix codacy issues 2019-02-21 10:44:37 +03:00
DarkPhoenix
032b1589ad Merge branch 'master' into fit_export_options 2019-02-21 10:39:50 +03:00
Jonah Jolley
410c87ed89 Mac Osx clipboard can store items with \r, ensure we split on newline or carriage return 2019-02-20 21:08:58 -07:00
DarkPhoenix
b377c1c25f Merge branch 'master' into price_optimize 2019-02-21 02:02:21 +03:00
DarkPhoenix
fbce3536da Fix battery cap resistance sliders 2019-02-21 01:54:41 +03:00
DarkPhoenix
7ac24ff7ee Allow to customize fetch timeout when requesting prices 2019-02-19 20:40:03 +03:00
DarkPhoenix
7aba11142f Enable price column in fighters tab 2019-02-19 19:08:09 +03:00
DarkPhoenix
704042b4b7 Change the way we work with prices 2019-02-19 19:02:50 +03:00
DarkPhoenix
21dd9bb6e4 Merge branch 'master' into price_optimize 2019-02-19 13:47:49 +03:00
DarkPhoenix
509849fbf5 Fix EHE issue 2019-02-19 13:12:18 +03:00
DarkPhoenix
55f2ebf4a4 Merge branch 'master' into fit_export_options 2019-02-18 13:10:00 +03:00
Ryan Holmes
e96a836ad0 fix travis file 2019-02-17 19:08:33 -05:00
Ryan Holmes
2a224e8882 Merge pull request #1853 from blitzmann/CIUpdates
CI updates
2019-02-17 16:19:16 -05:00
Ryan Holmes
0a00d86c6d Merge branch 'master' into CIUpdates 2019-02-17 16:18:01 -05:00
Ryan Holmes
c3d1eaef2a Merge pull request #1851 from MaruMaruOO/master
Adds Mutadaptive Remote Armor Repairers to EFS exports.
2019-02-17 16:16:17 -05:00
Ryan Holmes
93f23b549b Merge branch 'master' into master 2019-02-17 16:16:09 -05:00
Ryan Holmes
b3d0554df6 Merge remote-tracking branch 'origin/master' into blitzmann_CIUpdates
# Conflicts:
#	dist_assets/mac/pyfa.spec
2019-02-17 15:52:57 -05:00
blitzmann
dba54e3ec8 test 2019-02-17 15:27:08 -05:00
DarkPhoenix
2b16a8ed76 Add some comments to variations fetcher 2019-02-17 14:29:44 +03:00
DarkPhoenix
4cbafb5559 Update database again and add method which finds replacements for passed item 2019-02-17 13:36:52 +03:00
DarkPhoenix
d02623e365 Fix oversight 2019-02-17 12:45:40 +03:00
DarkPhoenix
c8eef489da Exclude more attributes from consideration, and do some overrides to not have incorrect optimizations 2019-02-17 12:26:44 +03:00
DarkPhoenix
d507927ba3 Do not consider items the same if they have no attributes defined 2019-02-17 01:53:56 +03:00
DarkPhoenix
09421db28e Update effects after database update 2019-02-17 01:05:09 +03:00
DarkPhoenix
941edd6715 Update database 2019-02-16 22:39:08 +03:00
DarkPhoenix
fdac5309ac Modify db generation script to find same/better replacements for all items 2019-02-16 22:26:42 +03:00
DarkPhoenix
449c7d6aa2 Add two more columns to gamedata to hold info about better items 2019-02-16 14:06:23 +03:00
MaruMaruOO
b60b190b81 Merge branch 'master' of https://github.com/pyfa-org/Pyfa 2019-02-14 01:24:07 -05:00
MaruMaruOO
3cb8313669 Add Mutadaptive Remote Armor Repairers to EFS export. 2019-02-14 01:23:59 -05:00
DarkPhoenix
ba29376464 Merge branch 'master' into fit_export_options 2019-02-13 18:52:10 +03:00
DarkPhoenix
436113dedc Set price object status on successful fetches 2019-02-13 18:51:44 +03:00
DarkPhoenix
9dc0ec67d4 Merge branch 'master' into fit_export_options 2019-02-13 18:19:03 +03:00
DarkPhoenix
194ebb96a7 Add ruler between base item info and mutation stats 2019-02-13 18:18:38 +03:00
DarkPhoenix
fc04a32913 Add info about base item to mutations tab 2019-02-13 18:14:46 +03:00
DarkPhoenix
deee6fd6ab Make GTK window even bigger by default, and hide description type if there's no description for the item 2019-02-13 17:31:45 +03:00
DarkPhoenix
a4fae73a1e Make "fill with module" context menu entry disablable via preferences 2019-02-13 17:12:21 +03:00
DarkPhoenix
7bad3bc376 Show 'market group' context menu for mutated items as well 2019-02-13 17:07:06 +03:00
DarkPhoenix
7dd1c63898 Return 0 price even if price has not been fetched 2019-02-13 16:19:01 +03:00
DarkPhoenix
c8eea45454 Merge branch 'master' into fit_export_options 2019-02-13 15:57:06 +03:00
DarkPhoenix
3ed949395e Flush prices rather than commit, it takes much less time and still satisfies our needs 2019-02-13 15:56:15 +03:00
DarkPhoenix
6ebc90b8aa Remove flush as it's part of commit according to sqlalchemy docs 2019-02-13 15:30:08 +03:00
DarkPhoenix
7769179104 Merge branch 'master' into fit_export_options 2019-02-13 14:03:56 +03:00
DarkPhoenix
cbd1a34c68 Round cpu/pg like EVE does
To work around some fits where pyfa shows that items do not fit when they actually do
2019-02-13 13:14:18 +03:00
DarkPhoenix
e0c389a643 Do not show (!) for fetches which will always fail (e.g. abyssal mods). Also restore commit as it was a threat synchornization mechanism 2019-02-13 13:07:54 +03:00
DarkPhoenix
6a27ae7525 Merge branch 'master' into fit_export_options 2019-02-13 00:56:05 +03:00
DarkPhoenix
591dcffa43 Do not try to fetch price for items which contain no market group according to CCP data 2019-02-13 00:54:56 +03:00
DarkPhoenix
b0317ea560 Fix mistype 2019-02-12 19:07:59 +03:00
DarkPhoenix
9eea99f600 Do not export if user presses cancel 2019-02-12 13:28:18 +03:00
DarkPhoenix
d55d6c3e5e Rework the way options are stored 2019-02-12 13:14:31 +03:00
DarkPhoenix
eeef2104c2 Move option of exporting charges from general preferences to EFT and multibuy exports 2019-02-12 13:03:15 +03:00
DarkPhoenix
2098ff6da1 Merge branch 'master' into fit_export_options 2019-02-12 12:50:38 +03:00
DarkPhoenix
fb5d62304c Allow sorting by price in variations tab 2019-02-12 12:50:02 +03:00
DarkPhoenix
8baac1e207 Introduce secondary sort parameter for compare tab 2019-02-12 12:35:53 +03:00
DarkPhoenix
4324b846e0 Disable XML and DNA export 2019-02-12 12:18:42 +03:00
DarkPhoenix
143606d8f8 Merge branch 'master' into fit_export_options 2019-02-12 12:16:58 +03:00
DarkPhoenix
dfc0a896c4 Do not commit price right away when creating the object 2019-02-12 12:10:17 +03:00
DarkPhoenix
980c84b911 Add support for default export option values 2019-02-12 10:37:51 +03:00
DarkPhoenix
41b6000f6e Rename ranges to something more sensible 2019-02-12 10:17:19 +03:00
DarkPhoenix
28fc845250 Merge branch 'master' into fit_export_options 2019-02-12 09:25:24 +03:00
DarkPhoenix
193faaafe7 Make sure that gauge bar neutral value is always reachable, even if it does not correspond to base value 2019-02-12 09:24:02 +03:00
DarkPhoenix
ce9db79552 Do not redefine property 2019-02-12 08:39:03 +03:00
DarkPhoenix
672fd77bec Get market instance only once 2019-02-11 16:18:43 +03:00
DarkPhoenix
89656b04ad Do not export mutated items for multibuy 2019-02-11 14:50:44 +03:00
DarkPhoenix
0997a54324 Add option to export disable cargo export for multibuy 2019-02-11 14:44:38 +03:00
DarkPhoenix
59569d46ae Add implants & boosters option to multibuy export 2019-02-11 14:11:03 +03:00
DarkPhoenix
3bc1ce195c Change the way we store options 2019-02-11 14:04:28 +03:00
DarkPhoenix
98e6781077 Make sure order of export formats is also the same 2019-02-11 13:13:00 +03:00
DarkPhoenix
f2deb0e6c7 Make sure order of options doesn't depend on order of options in memory (which can be random as it's dict) 2019-02-11 12:57:27 +03:00
DarkPhoenix
a5efea56ab Change description of export options a little 2019-02-11 12:28:36 +03:00
Ryan Holmes
1fe35f5aab Merge pull request #1844 from MaruMaruOO/master
Merge missing changes from #1755, efs version bump and minor linting.
2019-02-07 21:36:47 -05:00
Ryan Holmes
07b8f5b914 update appveyor and travis configs 2019-02-02 19:06:36 -05:00
MaruMaruOO
1f50e7cb51 Merge missing changes from #1755, efs version bump and minor linting. 2019-01-29 02:17:55 -05:00
blitzmann
572d337935 Newer versions of numpy apparently aren't supported very well with pyinstaller yet. Force inclusion of module, otherwise automated build will cause graph support to fail 2019-01-20 23:40:33 -05:00
blitzmann
01f8c65304 Merge branch 'master' of https://github.com/pyfa-org/Pyfa 2019-01-10 23:37:08 -05:00
blitzmann
a1ee8b49ef Merge branch 'petosorus-fill-with-module' 2019-01-10 23:36:40 -05:00
blitzmann
0745ed50e0 * Merge branch 'fill-with-module' of git://github.com/petosorus/Pyfa into petosorus-fill-with-module
* Remove settings check

# Conflicts:
#	gui/fitCommands/__init__.py
2019-01-10 23:36:05 -05:00
Ryan Holmes
76e66a99ff Merge pull request #1821 from burnsypet/issue-1816
Remove extra (α) from clone name when renaming
2019-01-10 23:28:24 -05:00
blitzmann
3259cc3e50 Rename Scale to percentage 2019-01-10 23:24:34 -05:00
blitzmann
5f237e578b use spoolup dialog with remote reps 2019-01-10 23:16:04 -05:00
blitzmann
c645c089dd More work on the spoolup gui, including support for commands and some other nicities (recalc fit when changing, load the input with previous) 2019-01-10 23:13:22 -05:00
blitzmann
436bee1e85 Start working on a gui to set spoolup options 2019-01-05 22:26:17 -05:00
blitzmann
dc5bd7f627 Merge branch 'master' of https://github.com/pyfa-org/Pyfa 2019-01-01 20:56:46 -05:00
blitzmann
d6825fb8b7 #1832 Add stacking penalty to Inertial Stabilizers 2019-01-01 20:56:05 -05:00
Ryan Holmes
b9ec89e9c8 Merge branch 'master' of https://github.com/pyfa-org/Pyfa into origin_master 2018-12-24 10:40:22 -05:00
Ryan Holmes
cc63e62154 Fix for #1831 - use css style string. This prevents crashing on systems that bring back a color with opacity as the system default 2018-12-24 10:39:56 -05:00
blitzmann
cc134c36e2 bump version 2018-12-19 21:07:58 -05:00
DarkPhoenix
17313bd67b Assume RRs work at 100% efficiency, even if they are projected from self 2018-12-19 23:46:30 +03:00
Ryan Holmes
b831dfbc7f Merge branch 'master' of https://github.com/pyfa-org/Pyfa into origin_master 2018-12-19 10:17:59 -05:00
Ryan Holmes
b739b791d4 fix esi endpoint 2018-12-19 10:17:50 -05:00
DarkPhoenix
0480673460 Fix neurotoxin implant not affecting armor amount affected by x-instinct 2018-12-17 12:55:57 +03:00
DarkPhoenix
7ffced2151 Change layout of bosonic damage misc description 2018-12-17 00:10:06 +03:00
DarkPhoenix
3297ef8975 Return size conversion
I'm dumb and thought it's heavy->heavy and large->large
2018-12-15 22:03:13 +03:00
DarkPhoenix
acba971e70 Aggregate and sort items during multibuy export 2018-12-15 12:56:27 +03:00
DarkPhoenix
dd8169adb4 Add couple additional definitions 2018-12-15 11:12:29 +03:00
DarkPhoenix
857a625ae2 Remove some "replacements" 2018-12-15 11:02:17 +03:00
Ryan Holmes
ac3a7386aa Bump version 2018-12-14 19:06:04 -05:00
DarkPhoenix
3eed5bfc64 Add more racial definitions 2018-12-15 00:21:25 +03:00
DarkPhoenix
d0992ed56f Change how excessive mods are stored on import 2018-12-14 18:40:32 +03:00
DarkPhoenix
af37ec21e9 Fix EFT import bug another way 2018-12-14 18:32:45 +03:00
DarkPhoenix
51ef3ec758 Revert "Make sure that modules are put onto their proper place during EFT import, not to the end"
This reverts commit fe063cf19a.
2018-12-14 18:14:50 +03:00
DarkPhoenix
f66da9870e Revert "Fix issue with replace method"
This reverts commit ca46984a6b.
2018-12-14 18:14:41 +03:00
DarkPhoenix
ca46984a6b Fix issue with replace method 2018-12-14 17:10:27 +03:00
DarkPhoenix
fe063cf19a Make sure that modules are put onto their proper place during EFT import, not to the end 2018-12-14 16:56:51 +03:00
DarkPhoenix
3bdb12cc5d Make sure reps are running late (so that they all get modified before actually applying effect) 2018-12-14 13:49:17 +03:00
DarkPhoenix
6819dc87a6 Fix PDS jargon entries 2018-12-14 12:50:37 +03:00
DarkPhoenix
2ba6c4bc08 Merge branch 'master' of github.com:pyfa-org/Pyfa 2018-12-14 08:15:42 +03:00
Ryan Holmes
bb548b796a fix appveyor 2018-12-14 05:03:09 -05:00
DarkPhoenix
6f8fca7525 Implement spoolup parameters fetcher and rely on it for misc column stats 2018-12-14 08:15:05 +03:00
burnsypet
ff8ea205db Remove extra (α) from clone name when renaming 2018-12-13 20:34:00 +00:00
DarkPhoenix
453536cf14 Show more decimal places than 3 when it's necessary 2018-12-13 20:00:36 +03:00
DarkPhoenix
080d94e299 Rework sliders once again 2018-12-13 19:37:50 +03:00
DarkPhoenix
ae23fba6b7 Introduce function which calculates step amount depending on context 2018-12-13 19:28:54 +03:00
DarkPhoenix
b8f53f9bb3 Rework how mutation tab works with max/min and good/bad values to fix neut resistance bug 2018-12-13 18:04:54 +03:00
DarkPhoenix
e143a79b06 Remove temporary script
I used it to find mutadaptive RR icon
2018-12-13 16:10:11 +03:00
DarkPhoenix
fa7c93d99a Update icons/renders 2018-12-13 16:09:41 +03:00
DarkPhoenix
f48ce43c0c Replace asterisk with superscript s 2018-12-13 14:54:23 +03:00
DarkPhoenix
ba12d97c1d Support spoolup options in EFS export as well 2018-12-13 14:49:06 +03:00
DarkPhoenix
03e8b8522b Mark spoolup values with asterisk 2018-12-13 14:11:03 +03:00
DarkPhoenix
7a8baac5bd Rework way we pass spoolup options, so that it's possible to prefer passed values or on-module values as needed 2018-12-13 13:54:53 +03:00
DarkPhoenix
58ceff6144 Show tooltip with spoolup local tank when needed 2018-12-13 10:46:35 +03:00
DarkPhoenix
7bc82e229f Make spoolup tooltip format consistent 2018-12-13 09:36:33 +03:00
DarkPhoenix
74ebd3415c Calculate sustainable tank adjustments for prespool/fullspool values too 2018-12-13 09:17:59 +03:00
DarkPhoenix
de752cbe0a Add prespool/fullspool support to non-sustainable tank calculation 2018-12-12 15:48:30 +03:00
DarkPhoenix
25c5abffee Introduce new attributes which store prespool and postspool armor reps, and modify effects affecting it 2018-12-12 15:10:38 +03:00
DarkPhoenix
ec1a2035cd Update effect comments 2018-12-12 13:04:51 +03:00
DarkPhoenix
b3fbc080db Update database 2018-12-12 12:59:31 +03:00
DarkPhoenix
f289a72121 Show full spoolup time in tooltip (column can show another value now, when spoolup options are implemented) 2018-12-12 12:41:35 +03:00
DarkPhoenix
e6b2d15468 Fetch spoolup time for gun's misc value from spoolup calculator 2018-12-12 12:36:31 +03:00
DarkPhoenix
e76dc2e92b Add spoolup time calculation to mutadaptive RRs 2018-12-12 10:46:33 +03:00
DarkPhoenix
10572c7dbd Expose spoolup time to caller 2018-12-12 10:31:20 +03:00
DarkPhoenix
e83e081548 Calculate amount of cycles for spoolup 2018-12-12 10:20:17 +03:00
DarkPhoenix
85a834d1a3 Add space in "spool up" 2018-12-12 10:05:53 +03:00
DarkPhoenix
46c95d722c Use max spoolup for projected RRs 2018-12-12 09:28:48 +03:00
DarkPhoenix
70831bb5e4 Show spoolup for RR output stats 2018-12-12 09:20:48 +03:00
DarkPhoenix
12227cd016 Refactor how RR panel labels are processed a little 2018-12-12 08:53:25 +03:00
DarkPhoenix
2749426a7c Change tooltips 2018-12-12 08:43:54 +03:00
DarkPhoenix
0a23c3cabb Add spoolup support to misc column tooltips 2018-12-12 00:32:50 +03:00
DarkPhoenix
5a0670838d Expose spooled up value to stats panels 2018-12-11 23:15:46 +03:00
DarkPhoenix
2dfdead656 Override with full spoolup by default until controls are implemented 2018-12-11 20:49:14 +03:00
DarkPhoenix
5fdae11bb1 Expose damage output composition to UI 2018-12-11 19:13:31 +03:00
DarkPhoenix
c991562662 Show DPS tooltips only when prespool and postspool damage output is different 2018-12-11 18:53:06 +03:00
DarkPhoenix
b4eb6e7fc3 Set spoolup preferences from UI side 2018-12-11 18:39:37 +03:00
DarkPhoenix
d4e8ac761e Allow to control spoolup via fit object 2018-12-11 18:21:08 +03:00
DarkPhoenix
30ff2e0dae Add jargon entry for ex-energy transfers 2018-12-11 17:42:54 +03:00
DarkPhoenix
4f0f8fcdfc Rework internal interfaces to be able to specify spoolup in more flexible manner and carry output dps types 2018-12-11 17:39:03 +03:00
DarkPhoenix
a1c3d26b73 Do not crash when creating tooltip with fit as None 2018-12-11 08:24:03 +03:00
DarkPhoenix
aa3043b0ca Change mutadapative RR to use spoolup calculator 2018-12-10 15:08:52 +03:00
DarkPhoenix
2d9dcc624c Make sure spoolup function works with non-spoolup arguments passed to it 2018-12-10 14:53:46 +03:00
DarkPhoenix
aa80a4812d Add time-based spoolup calculation 2018-12-10 14:42:22 +03:00
DarkPhoenix
5b03d01d32 Fix rounding 2018-12-10 13:59:04 +03:00
DarkPhoenix
3228c7f74d Add separate spoolup calculator 2018-12-10 13:50:22 +03:00
DarkPhoenix
5b60abf4b6 Expose new fields to sqlalchemy 2018-12-10 11:29:09 +03:00
DarkPhoenix
47a97772cf Add upgrade which adds spoolup attributes to database 2018-12-10 11:24:32 +03:00
DarkPhoenix
f4123310ae Add mutadaptive RR effect and related UI support 2018-12-10 10:42:49 +03:00
DarkPhoenix
f05439989d Update data to 1433497 2018-12-10 10:11:45 +03:00
DarkPhoenix
1df7c0aff8 Merge branch 'master' into singularity 2018-12-10 09:20:15 +03:00
DarkPhoenix
29fde786fb Merge branch 'spoolup_support' 2018-12-10 09:19:40 +03:00
DarkPhoenix
4833fc68a0 Merge branch 'master' into attrGroup 2018-12-05 13:15:42 +03:00
blitzmann
3f0fc3c44b added effect 2018-12-03 21:22:59 -05:00
blitzmann
375e8de33f Update database and get some easy effects finished 2018-12-03 21:15:04 -05:00
blitzmann
9d04f06f69 Merge branch 'master' into singularity 2018-12-03 21:10:15 -05:00
blitzmann
0297ec47f6 Fix for #1814 2018-12-02 16:08:53 -05:00
DarkPhoenix
75e1e48ba8 Allow lock amount skills to be applied to structures 2018-12-02 19:36:22 +03:00
blitzmann
89ff9a3d77 replace db with updated version 2018-12-01 23:24:20 -05:00
blitzmann
6fa1593ddc Merge branch 'master' into attrGroup
# Conflicts:
#	eos/gamedata.py
#	eve.db
#	gui/builtinItemStatsViews/itemAttributes.py
2018-12-01 23:15:35 -05:00
blitzmann
d404d10bfe Fix exclusive abyssal weathers items (#1794) 2018-12-01 23:01:13 -05:00
blitzmann
194c159379 Create a new property on Module, returns if module is projected (or None if it's not attached to a fit). Fix issues with setting charges on projected modules because the command was always looking at the literal modules on the fit (instead of projected) 2018-12-01 20:50:40 -05:00
blitzmann
791b6e15d4 Move the specialtyMiningAmount value application to a later runtime, to allow all other bonuses to apply before it's set (#1790) 2018-11-28 22:54:04 -05:00
Ryan Holmes
882e39417d Include spoolup in the tooltip of DPS 2018-11-28 00:58:06 -05:00
Ryan Holmes
8b6d32fe3b Merge remote-tracking branch 'origin/master' into spoolup_support 2018-11-27 23:59:22 -05:00
blitzmann
715f9427d5 Merge branch 'master' of https://github.com/pyfa-org/Pyfa 2018-11-27 22:52:57 -05:00
blitzmann
78b281cf3a Fixes a few mining amount bonuses (#1809) 2018-11-27 22:52:48 -05:00
Ryan Holmes
bbede00cc4 Merge branch 'master' of https://github.com/pyfa-org/Pyfa into origin_master 2018-11-27 21:40:42 -05:00
Ryan Holmes
e6da57ab57 Fix standup nuets not respecting energy warfare resists (#1808) 2018-11-27 21:40:22 -05:00
blitzmann
9e08783802 Add middle click to close fitting tab (#1804) 2018-11-25 15:12:12 -05:00
Ryan Holmes
1dc98ce33d Merge pull request #1807 from pyfa-org/issue/1806
Attempt to save the charge when changing module variations.
2018-11-24 21:41:55 -05:00
Ryan Holmes
c97750a593 Attempt to save the charge when changing module variations.
Move caching of old module into Do function. Having it in `change_module` causes it to run even with the Undo command, whch causes funkiness
2018-11-24 21:38:50 -05:00
DarkPhoenix
aa7e3bd69d Sort cargo like default inventory sort order in game & like EFT export 2018-11-23 15:15:28 +03:00
blitzmann
5a6b9114e2 bump version 2018-11-22 23:59:49 -05:00
DarkPhoenix
61abcf3018 Apply all components of abyssal pvp weather 2018-11-22 16:29:10 +03:00
DarkPhoenix
4845b3b0ce Add PvP weather to abyssal weather menu 2018-11-22 16:17:54 +03:00
DarkPhoenix
8f0e8f72cd Update database to 1425015 2018-11-22 15:09:34 +03:00
Ryan Holmes
96269a7777 Merge pull request #1805 from pyfa-org/issue/1793
Don't include non active fighters in dps graph
2018-11-20 21:43:24 -05:00
blitzmann
bdcc05b7b6 Don't include non active fighters in dps graph 2018-11-20 21:39:31 -05:00
Ryan Holmes
060b512bcf Merge pull request #1803 from pyfa-org/muta_item_import
Mutated item import
2018-11-20 20:44:57 -05:00
DarkPhoenix
3907c8c29a Change how compiled regex is used 2018-11-20 19:19:14 +03:00
DarkPhoenix
c786012b28 Update database to 1422751 2018-11-20 17:08:31 +03:00
DarkPhoenix
37a084e1d1 Fit importing plain modules in command code 2018-11-20 13:54:07 +03:00
DarkPhoenix
b9c3675894 Fix case when only module name is passed
Still crashes and query cache, will fix later
2018-11-20 13:51:49 +03:00
DarkPhoenix
60ecc95049 Fix command code 2018-11-20 13:48:54 +03:00
DarkPhoenix
59d9d47a56 Do some work on mutated module commands to support new parsing format 2018-11-20 13:38:38 +03:00
DarkPhoenix
c619efa68e Change the way DNA import is handled 2018-11-20 13:03:27 +03:00
DarkPhoenix
05e895e7b7 Move out mutated module parsing from EFT to separate module 2018-11-20 12:51:49 +03:00
Ryan Holmes
58daf2a543 work on getting abyssal modules imported via clipboard 2018-11-20 00:49:04 -05:00
DarkPhoenix
0294684bb8 Implement import of separate mutated items 2018-11-19 17:47:48 +03:00
DarkPhoenix
fa9b3be41c Move fetch function to shared 2018-11-19 16:57:19 +03:00
DarkPhoenix
74bf3fbc8b Move mutation export to another module 2018-11-19 15:31:13 +03:00
DarkPhoenix
dc2a4d4446 For abyssal modification range, show integer + 3 fraction digits, like CCP does 2018-11-19 14:59:34 +03:00
DarkPhoenix
b0895611d6 Move tiamat/hydra out of normal groups 2018-11-17 14:48:25 +03:00
DarkPhoenix
f664a1cad3 Fix crash on opening mutated BCS stats 2018-11-15 16:19:20 +03:00
DarkPhoenix
f39ba27a13 Add backend support for damage stats separation (prespool and postspool) 2018-11-02 13:30:38 +03:00
blitzmann
fd43f33871 fix bug where info was none 2018-10-28 17:03:40 -04:00
blitzmann
36bf4ef9ca Some tweaks and fixes to the attribute grouping logic 2018-10-28 16:28:44 -04:00
blitzmann
63f9847406 Merge branch 'master' into attrGroup
# Conflicts:
#	eve.db
#	gui/bitmap_loader.py
2018-10-27 15:13:54 -04:00
petosorus
46f5a592ce Right click option to fill slots with a module 2018-10-21 16:07:02 +02:00
blitzmann
38f1314c05 Continuing work on attribute grouping. Break out attribute add to list into a centralized function. create some utility lists of attributes that are grouped 2018-10-14 13:30:05 -04:00
blitzmann
46ece5da0c Tweak to include human-readable rig sizes, and more tweaks to the attribute grouping definitions 2018-10-14 03:42:42 -04:00
blitzmann
d21ccef269 Start defining grouping in another file to keep it contained 2018-10-14 00:49:25 -04:00
blitzmann
d788abcab2 revert database for now 2018-10-13 00:02:55 -04:00
blitzmann
d2b601dd8f Merge remote-tracking branch 'origin/master' into attrGroup
# Conflicts:
#	eve.db
2018-10-13 00:02:06 -04:00
blitzmann
c27032ef64 Define the attribute groupings for the new attributes panel, and build out the tree 2018-10-09 22:58:01 -04:00
blitzmann
7374b00883 Convert Attributes to HyperTreeList 2018-10-09 01:06:11 -04:00
3608 changed files with 46729 additions and 30713 deletions

View File

@@ -1,5 +1,4 @@
environment:
global:
# SDK v7.0 MSVC Express 2008's SetEnv.cmd script will fail if the
# /E:ON and /V:ON options are not enabled in the batch script intepreter
@@ -8,76 +7,11 @@ environment:
matrix:
# Python 2.7.10 is the latest version and is not pre-installed.
- PYTHON: "C:\\Python27.10"
PYTHON_VERSION: "2.7.10"
- PYTHON: "C:\\Python36"
PYTHON_VERSION: "3.6.x"
PYTHON_ARCH: "32"
#- PYTHON: "C:\\Python27.10-x64"
# PYTHON_VERSION: "2.7.10"
# PYTHON_ARCH: "64"
# Pre-installed Python versions, which Appveyor may upgrade to
# a later point release.
# See: http://www.appveyor.com/docs/installed-software#python
#- PYTHON: "C:\\Python27"
# PYTHON_VERSION: "2.7.x" # currently 2.7.9
# PYTHON_ARCH: "32"
#- PYTHON: "C:\\Python27-x64"
# PYTHON_VERSION: "2.7.x" # currently 2.7.9
# PYTHON_ARCH: "64"
#- PYTHON: "C:\\Python33"
# PYTHON_VERSION: "3.3.x" # currently 3.3.5
# PYTHON_ARCH: "32"
#- PYTHON: "C:\\Python33-x64"
# PYTHON_VERSION: "3.3.x" # currently 3.3.5
# PYTHON_ARCH: "64"
#- PYTHON: "C:\\Python34"
# PYTHON_VERSION: "3.4.x" # currently 3.4.3
# PYTHON_ARCH: "32"
#- PYTHON: "C:\\Python34-x64"
# PYTHON_VERSION: "3.4.x" # currently 3.4.3
# PYTHON_ARCH: "64"
# Python versions not pre-installed
# Python 2.6.6 is the latest Python 2.6 with a Windows installer
# See: https://github.com/ogrisel/python-appveyor-demo/issues/10
#- PYTHON: "C:\\Python266"
# PYTHON_VERSION: "2.6.6"
# PYTHON_ARCH: "32"
#- PYTHON: "C:\\Python266-x64"
# PYTHON_VERSION: "2.6.6"
# PYTHON_ARCH: "64"
#- PYTHON: "C:\\Python35"
# PYTHON_VERSION: "3.5.0"
# PYTHON_ARCH: "32"
#- PYTHON: "C:\\Python35-x64"
# PYTHON_VERSION: "3.5.0"
# PYTHON_ARCH: "64"
# Major and minor releases (i.e x.0.0 and x.y.0) prior to 3.3.0 use
# a different naming scheme.
#- PYTHON: "C:\\Python270"
# PYTHON_VERSION: "2.7.0"
# PYTHON_ARCH: "32"
#- PYTHON: "C:\\Python270-x64"
# PYTHON_VERSION: "2.7.0"
# PYTHON_ARCH: "64"
init:
- ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
install:
# If there is a newer build queued for the same PR, cancel this one.
# The AppVeyor 'rollout builds' option is supposed to serve the same
@@ -89,34 +23,23 @@ install:
Where-Object pullRequestId -eq $env:APPVEYOR_PULL_REQUEST_NUMBER)[0].buildNumber) { `
throw "There are newer queued builds for this pull request, failing early." }
# Install wxPython
- 'ECHO Downloading wxPython.'
- "appveyor DownloadFile https://goo.gl/yvO8PB -FileName C:\\wxpython.exe"
#- "appveyor DownloadFile https://goo.gl/Uj0jV3 -FileName C:\\wxpython64.exe"
- 'ECHO Install wxPython'
- "C:\\wxpython.exe /SP- /VERYSILENT /NORESTART"
#- "C:\\wxpython64.exe /SP- /VERYSILENT /NORESTART"
- ECHO "Filesystem root:"
- ps: "ls \"C:/\""
- ECHO "Filesystem projects root:"
- ps: "ls \"C:\\projects\\\""
- ECHO "Filesystem pyfa root:"
- ps: "ls \"C:\\projects\\pyfa\\\""
- ps: "ls \"C:\\projects\\$env:APPVEYOR_PROJECT_SLUG\""
- ECHO "Installed SDKs:"
- ps: "ls \"C:/Program Files/Microsoft SDKs/Windows\""
# Install Python (from the official .msi of http://python.org) and pip when
# not already installed.
# - ps: if (-not(Test-Path($env:PYTHON))) { & appveyor\install.ps1 }
# Prepend newly installed Python to the PATH of this build (this cannot be
# done from inside the powershell script as it would require to restart
# the parent CMD process).
- "SET PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH%"
# Check that we have the expected version and architecture for Python
- "python --version"
- "python -c \"import struct; print(struct.calcsize('P') * 8)\""
@@ -128,19 +51,36 @@ install:
# compiled extensions and are not provided as pre-built wheel packages,
# pip will build them from source using the MSVC compiler matching the
# target Python version and architecture
# C:\\projects\\eve-gnosis\\
- ECHO "Install pip requirements:"
- "pip install -r requirements.txt"
- "pip install -r requirements_test.txt"
- "pip install -r requirements_build_windows.txt"
- "pip install PyInstaller"
before_build:
# directory that will contain the built files
- ps: $env:PYFA_DIST_DIR = "c:\projects\$env:APPVEYOR_PROJECT_SLUG\dist"
- ps: $env:PYFA_VERSION = (python ./scripts/dump_version.py)
- ps: echo("pyfa version ")
- ps: echo ($env:PYFA_VERSION)
build_script:
# Build the compiled extension
# - "python setup.py build"
- ECHO "Build pyfa:"
#- copy C:\projects\pyfa\dist_assets\win\pyfa.spec C:\projects\pyfa\pyfa.spec
- "python C:\\projects\\pyfa\\setup.py build"
##########
# PyInstaller - create binaries for pyfa
##########
# Build command for PyInstaller
- "python -m PyInstaller --noupx --clean --windowed --noconsole -y pyfa.spec"
# Copy over manifest (See pyfa-org/pyfa#1622)
- ps: xcopy /y dist_assets\win\pyfa.exe.manifest $env:PYFA_DIST_DIR\pyfa\
# Not really sure if this is needed, but why not
- ps: xcopy /y dist_assets\win\Microsoft.VC90.CRT.manifest $env:PYFA_DIST_DIR\pyfa\
##########
# InnoScript EXE building
# This is in a separate script because I don't feel like copying over the logic to AppVeyor script right now...
##########
- "python dist_assets/win/dist.py"
- ps: dir $env:PYFA_DIST_DIR/
#- ECHO "Build pyfa (Debug):"
#- copy C:\projects\pyfa\dist_assets\win\pyfa_debug.spec C:\projects\pyfa\pyfa_debug.spec
#- "pyinstaller.exe --clean --noconfirm --windowed --upx-dir=C:\\projects\\pyfa\\scripts\\upx.exe C:\\projects\\pyfa\\pyfa_debug.spec"
@@ -150,12 +90,11 @@ build: on
after_build:
- ps: "ls \"./\""
#- ps: "ls \"C:\\projects\\pyfa\\build\\pyfa\\\""
- ps: "ls \"C:\\projects\\pyfa\\build\\\""
- ps: "ls \"C:\\projects\\pyfa\\build\\exe.win32-2.7\\\""
# - ps: "ls \"C:\\projects\\$env:APPVEYOR_PROJECT_SLUG\\build\\exe.win32-2.7\\\""
# Zip
# APPVEYOR_PULL_REQUEST_NUMBER -and $env:APPVEYOR_BUILD_NUMBER
#- 7z a build.zip -r C:\projects\pyfa\build\pyfa\*.*
- 7z a pyfa.zip -r C:\projects\pyfa\build\exe.win32-2.7\*.*
- ps: 7z a "pyfa-$env:PYFA_VERSION-win.zip" -r "$env:PYFA_DIST_DIR\pyfa\*.*"
#- 7z a pyfa_debug.zip -r C:\projects\pyfa\dist\pyfa_debug\*.*
on_success:
@@ -176,11 +115,21 @@ after_test:
artifacts:
# Archive the generated packages in the ci.appveyor.com build report.
- path: pyfa.zip
name: 'pyfa.zip'
- path: pyfa*-win.zip
- path: pyfa*-win.exe
#- path: pyfa_debug.zip
# name: Pyfa_debug
deploy:
tag: $(pyfa_version)
release: pyfa $(pyfa_version)
description: 'Release description'
provider: GitHub
auth_token:
secure: BfNHO66ff5hVx2O2ORbl49X0U/5h2V2T0IuRZDwm7fd1HvsVluF0wRCbl29oRp1M
draft: true
on:
APPVEYOR_REPO_TAG: true # deploy on tag push only
#on_success:
# - TODO: upload the content of dist/*.whl to a public wheelhouse
#
#

View File

@@ -1,36 +1,29 @@
dist: trusty
sudo: required
os: linux
language: python
cache: pip
python:
- '3.6'
env:
- TOXENV=pep8
addons:
apt:
packages:
- 3.6
matrix:
include:
- os: osx
osx_image: xcode7.3
language: generic
env: PYTHON=3.6.1
before_install:
- sudo apt-get update && sudo apt-get --reinstall install -qq language-pack-en language-pack-ru language-pack-he language-pack-zh-hans
- pip install tox
# We're not actually installing Tox, but have to run it before we install wxPython via Conda. This is fugly but vOv
- tox
- pip install -U -f https://extras.wxpython.org/wxPython4/extras/linux/gtk2/ubuntu-14.04 wxPython==4.0.0b2
# # get Conda
# - if [[ "$TRAVIS_PYTHON_VERSION" == "2.7" ]]; then
# wget https://repo.continuum.io/miniconda/Miniconda-latest-Linux-x86_64.sh -O miniconda.sh;
# else
# wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh;
# fi
# - bash miniconda.sh -b -p $HOME/miniconda
# - export PATH="$HOME/miniconda/bin:$PATH"
# - hash -r
# - conda config --set always_yes yes --set changeps1 no
# - conda update -q conda
# # Useful for debugging any issues with conda
# - conda info -a
#install:
# install wxPython 3.0.0.0
# - conda install -c https://conda.anaconda.org/travis wxpython=4.0.0b2
script:
- tox
- bash scripts/setup-osx.sh
install:
- export PYFA_VERSION="$(python3 scripts/dump_version.py)"
- bash scripts/package-osx.sh
before_deploy:
- export RELEASE_PKG_FILE=$(ls *.deb)
- echo "deploying $RELEASE_PKG_FILE to GitHub releases"
deploy:
provider: releases
api_key:
secure: Xfu0xApoB0zUPLXl29aYUulVC3iA4/3bXQwwADKCfAKZwxgNon4dLbO7Rie5/7Ukf2POL0KwmRaQGN3kOr+XSoIVTE4M5sXxnhiaaLGKQ+48hDizLE6JuXcZGJvkxUaghaTzIdCwHsG7VGBsPfQgfGsjJcfBp8tFNLmRyM/Jpsr8T6BR2MxtBIEUVy8zrOWFNZqnmWrY2pWMsB9fYt3JFNdpqeIgRAYqbBsBcZQ1MngLTi3ztuYS5IaF+lk06RrnBlHmUsJu/5nCvIpvPvD0i2BLZ3Uu0+Fn+8QWUgjJEL9MNseXZMXynu05xd8YRk7Ajc9CUrzQIIbAktyteYp85kE3pUJHmrMLcXhh7nqkwttR5/47Zwa3OLJLJFKBxMx6wY5jFkJjkV08850B7aWrmTFl/Eqc3Q5nZMuiEt3wFRbjxHi9h1mTN/fkxfRRHg8u3ENGPR+ZPiFC3J18qtks/B/hsKjjHvZP1i79OYlET4V/zyLyyQkCbpDaARQANuotLYJyZ7tH+KWEyRsvTi0M9Yev9mNNw6aI4vzh4HfkEhvcvnWnYwckPj1dnjQ573Qpw0Z9wsconoWfHAn+hBDt3+YLMrrFZl++mCRskHH1mZChX3aGMDi49zD0kfxBUkYPOAhguc6PwudBxHUZP+O6T/SoHylff6EizCE/k5dGeAk=
file_glob: true
file: "dist/pyfa-*.zip"
skip_cleanup: true
draft: true
on:
tags: true
repo: pyfa-org/Pyfa

View File

@@ -129,7 +129,8 @@ def Saveddata():
from eos.saveddata.ship import Ship
from eos.saveddata.fit import Fit
from eos.saveddata.character import Character
from eos.saveddata.module import Module, State
from eos.saveddata.module import Module
from eos.const import FittingModuleState
from eos.saveddata.citadel import Citadel
from eos.saveddata.booster import Booster
@@ -139,7 +140,7 @@ def Saveddata():
'Fit' : Fit,
'Character': Character,
'Module' : Module,
'State' : State,
'State' : FittingModuleState,
'Booster' : Booster,
}
return helper

View File

@@ -1,9 +1,12 @@
import os
import sys
import yaml
import wx
from logbook import CRITICAL, DEBUG, ERROR, FingersCrossedHandler, INFO, Logger, NestedSetup, NullHandler, \
StreamHandler, TimedRotatingFileHandler, WARNING
import hashlib
from eos.const import FittingSlot
from cryptography.fernet import Fernet
@@ -22,12 +25,6 @@ debug = False
# Defines if our saveddata will be in pyfa root or not
saveInRoot = False
# Version data
version = "2.6.0"
tag = "Stable"
expansionName = "Onslaught"
expansionVersion = "1.0"
evemonMinVersion = "4081"
minItemSearchLength = 3
@@ -52,6 +49,13 @@ LOGLEVEL_MAP = {
"debug": DEBUG,
}
slotColourMap = {
FittingSlot.LOW: wx.Colour(250, 235, 204), # yellow = low slots
FittingSlot.MED: wx.Colour(188, 215, 241), # blue = mid slots
FittingSlot.HIGH: wx.Colour(235, 204, 209), # red = high slots
FittingSlot.RIG: '',
FittingSlot.SUBSYSTEM: ''
}
def getClientSecret():
return clientHash
@@ -79,12 +83,7 @@ def getPyfaRoot():
def getVersion():
if os.path.isfile(os.path.join(pyfaPath, '.version')):
with open(os.path.join(pyfaPath, '.version')) as f:
gitVersion = f.readline()
return gitVersion
# if no version file exists, then user is running from source or not an official build
return version + " (git)"
return version
def getDefaultSave():
@@ -101,6 +100,7 @@ def defPaths(customSavePath=None):
global logPath
global cipher
global clientHash
global version
pyfalog.debug("Configuring Pyfa")
@@ -110,6 +110,12 @@ def defPaths(customSavePath=None):
if pyfaPath is None:
pyfaPath = getPyfaRoot()
# Version data
with open(os.path.join(pyfaPath, "version.yml"), 'r') as file:
data = yaml.load(file, Loader=yaml.SafeLoader)
version = data['version']
# Where we store the saved fits etc, default is the current users home directory
if saveInRoot is True:
savePath = getattr(configforced, "savePath", None)
@@ -165,9 +171,6 @@ def defPaths(customSavePath=None):
eos.config.saveddata_connectionstring = "sqlite:///" + saveDB + "?check_same_thread=False"
eos.config.gamedata_connectionstring = "sqlite:///" + gameDB + "?check_same_thread=False"
print(eos.config.saveddata_connectionstring)
print(eos.config.gamedata_connectionstring)
# initialize the settings
from service.settings import EOSSettings
eos.config.settings = EOSSettings.getInstance().EOSSettings # this is kind of confusing, but whatever

View File

@@ -24,16 +24,18 @@ added_files = [
('../../eve.db', '.'),
('../../README.md', '.'),
('../../LICENSE', '.'),
('../../.version', '.'),
('../../version.yml', '.'),
]
import_these = []
import_these = [
'numpy.core._dtype_ctypes' # https://github.com/pyinstaller/pyinstaller/issues/3982
]
icon = os.path.join(os.getcwd(), "dist_assets", "mac", "pyfa.icns")
# Walk directories that do dynamic importing
paths = ('eos/effects', 'eos/db/migrations', 'service/conversions')
paths = ('eos/db/migrations', 'service/conversions')
for root, folders, files in chain.from_iterable(os.walk(path) for path in paths):
for file_ in files:
if file_.endswith(".py") and not file_.startswith("_"):
@@ -54,8 +56,10 @@ a = Analysis([r'../../pyfa.py'],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
@@ -70,10 +74,16 @@ exe = EXE(pyz,
icon=icon,
)
app = BUNDLE(exe,
name='pyfa.app',
icon=icon,
bundle_identifier=None,
info_plist={
'NSHighResolutionCapable': 'True'
})
app = BUNDLE(
exe,
name='pyfa.app',
icon=icon,
bundle_identifier=None,
info_plist={
'NSHighResolutionCapable': 'True',
'NSPrincipalClass': 'NSApplication',
'CFBundleName': 'pyfa',
'CFBundleDisplayName': 'pyfa',
'CFBundleIdentifier': 'org.pyfaorg.pyfa',
}
)

View File

@@ -3,44 +3,35 @@
import os.path
from subprocess import call
import zipfile
from packaging.version import Version
import yaml
def zipdir(path, zip):
for root, dirs, files in os.walk(path):
for file in files:
zip.write(os.path.join(root, file))
with open("version.yml", 'r') as file:
data = yaml.load(file, Loader=yaml.SafeLoader)
version = data['version']
config = {}
os.environ["PYFA_DIST_DIR"] = os.path.join(os.getcwd(), 'dist')
exec(compile(open("config.py").read(), "config.py", 'exec'), config)
os.environ["PYFA_VERSION"] = version
iscc = "C:\Program Files (x86)\Inno Setup 5\ISCC.exe" # inno script location via wine
iscc = "C:\Program Files (x86)\Inno Setup 5\ISCC.exe" # inno script location via wine
source = os.path.join(os.environ["PYFA_DIST_DIR"], "pyfa")
print("Creating archive")
source = os.path.join(os.getcwd(), "dist", "pyfa")
fileName = "pyfa-{}-{}-{}-win".format(
config['version'],
config['expansionName'].lower(),
config['expansionVersion']
)
archive = zipfile.ZipFile(os.path.join(os.getcwd(), "dist", fileName + ".zip"), 'w', compression=zipfile.ZIP_DEFLATED)
zipdir(source, archive)
archive.close()
fileName = "pyfa-{}-win".format(os.environ["PYFA_VERSION"])
print("Compiling EXE")
expansion = "%s %s" % (config['expansionName'], config['expansionVersion']),
v = Version(version)
print(v)
call([
iscc,
os.path.join(os.getcwd(), "dist_assets", "win", "pyfa-setup.iss"),
"/dMyAppVersion=%s" % (config['version']),
"/dMyAppExpansion=%s" % expansion,
"/dMyAppVersion=%s" % v,
"/dMyAppDir=%s" % source,
"/dMyOutputDir=%s" % os.path.join(os.getcwd(), "dist"),
"/dMyOutputDir=%s" % os.path.join(os.getcwd()),
"/dMyOutputFile=%s" % fileName]) # stdout=devnull, stderr=devnull
print("Done")

View File

@@ -7,15 +7,12 @@
#ifndef MyAppVersion
#define MyAppVersion "2.1.0"
#endif
#ifndef MyAppExpansion
#define MyAppExpansion "Vanguard 1.0"
#endif
; Other config
#define MyAppName "pyfa"
#define MyAppPublisher "pyfa"
#define MyAppURL "https://forums.eveonline.com/t/27156"
#define MyAppURL "https://github.com/pyfa-org/Pyfa/"
#define MyAppExeName "pyfa.exe"
; What version starts with the new structure (1.x.0). This is used to determine if we run directory structure cleanup
@@ -23,7 +20,7 @@
#define MinorVersionFlag 0
#ifndef MyOutputFile
#define MyOutputFile LowerCase(StringChange(MyAppName+'-'+MyAppVersion+'-'+MyAppExpansion+'-win-wx3', " ", "-"))
#define MyOutputFile LowerCase(StringChange(MyAppName+'-'+MyAppVersion+'-win', " ", "-"))
#endif
#ifndef MyAppDir
#define MyAppDir "pyfa"
@@ -39,7 +36,7 @@
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{3DA39096-C08D-49CD-90E0-1D177F32C8AA}
AppName={#MyAppName}
AppVersion={#MyAppVersion} ({#MyAppExpansion})
AppVersion={#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
@@ -51,10 +48,8 @@ LicenseFile={#MyAppDir}\LICENSE
OutputDir={#MyOutputDir}
OutputBaseFilename={#MyOutputFile}
SetupIconFile={#MyAppDir}\pyfa.ico
Compression=lzma
SolidCompression=yes
CloseApplications=yes
AppReadmeFile=https://github.com/pyfa-org/Pyfa/blob/v{#MyAppVersion}/readme.txt
[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"

View File

@@ -5,8 +5,7 @@ from itertools import chain
import subprocess
import requests.certs
label = subprocess.check_output([
"git", "describe", "--tags"]).strip()
label = subprocess.check_output(["git", "describe", "--tags"]).strip()
with open('.version', 'w+') as f:
f.write(label.decode())
@@ -18,7 +17,7 @@ added_files = [
('../../imgs/gui/*.gif', 'imgs/gui'),
('../../imgs/icons/*.png', 'imgs/icons'),
('../../imgs/renders/*.png', 'imgs/renders'),
('../../service/jargon/*.yaml', 'service/jargon'),
('../../service/jargon/*.yaml', 'service/jargon'),
('../../dist_assets/win/pyfa.ico', '.'),
('../../dist_assets/win/pyfa.exe.manifest', '.'),
('../../dist_assets/win/Microsoft.VC90.CRT.manifest', '.'),
@@ -26,13 +25,15 @@ added_files = [
('../../eve.db', '.'),
('../../README.md', '.'),
('../../LICENSE', '.'),
('../../.version', '.'),
('../../version.yml', '.'),
]
import_these = []
import_these = [
'numpy.core._dtype_ctypes' # https://github.com/pyinstaller/pyinstaller/issues/3982
]
# Walk directories that do dynamic importing
paths = ('eos/effects', 'eos/db/migrations', 'service/conversions')
paths = ('eos/db/migrations', 'service/conversions')
for root, folders, files in chain.from_iterable(os.walk(path) for path in paths):
for file_ in files:
if file_.endswith(".py") and not file_.startswith("_"):

View File

@@ -19,13 +19,14 @@ if istravis is True or hasattr(sys, '_called_from_test'):
# Running in Travis. Run saveddata database in memory.
saveddata_connectionstring = 'sqlite:///:memory:'
else:
saveddata_connectionstring = 'sqlite:///' + realpath(join(dirname(abspath(__file__)), "..", "saveddata", "saveddata-py3-db.db"))
saveddata_connectionstring = 'sqlite:///' + realpath(join(dirname(abspath(__file__)), "..", "saveddata", "saveddata.db"))
pyfalog.debug("Saveddata connection string: {0}", saveddata_connectionstring)
settings = {
"useStaticAdaptiveArmorHardener": False,
"strictSkillLevels": True,
"globalDefaultSpoolupPercentage": 1.0
}
# Autodetect path, only change if the autodetection bugs out.

95
eos/const.py Normal file
View File

@@ -0,0 +1,95 @@
# =============================================================================
# Copyright (C) 2019 Ryan Holmes
#
# This file is part of pyfa.
#
# pyfa is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# pyfa is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with pyfa. If not, see <http://www.gnu.org/licenses/>.
# =============================================================================
from enum import IntEnum,unique
@unique
class FittingSlot(IntEnum):
"""
Contains slots for ship fittings
"""
# These are self-explanatory
LOW = 1
MED = 2
HIGH = 3
RIG = 4
SUBSYSTEM = 5
# not a real slot, need for pyfa display rack separation
MODE = 6
# system effects. They are projected "modules" and pyfa assumes all modules
# have a slot. In this case, make one up.
SYSTEM = 7
# used for citadel services
SERVICE = 8
# fighter 'slots'. Just easier to put them here...
F_LIGHT = 10
F_SUPPORT = 11
F_HEAVY = 12
# fighter 'slots' (for structures)
FS_LIGHT = 13
FS_SUPPORT = 14
FS_HEAVY = 15
@unique
class ImplantLocation(IntEnum):
"""
Contains location of the implant
"""
FIT = 0
CHARACTER = 1
@unique
class CalcType(IntEnum):
"""
Contains location of the calculation
"""
LOCAL = 0
PROJECTED = 1
COMMAND = 2
@unique
class FittingModuleState(IntEnum):
"""
Contains the state of a fitting module
"""
OFFLINE = -1
ONLINE = 0
ACTIVE = 1
OVERHEATED = 2
@unique
class FittingHardpoint(IntEnum):
"""
Contains the types of a fitting hardpoint
"""
NONE = 0
MISSILE = 1
TURRET = 2
@unique
class SpoolType(IntEnum):
SCALE = 0 # [0..1]
TIME = 1 # Expressed via time in seconds since spool up started
CYCLES = 2 # Expressed in amount of cycles since spool up started

View File

@@ -39,6 +39,8 @@ attributes_table = Table("dgmattribs", gamedata_meta,
Column("displayName", String),
Column("highIsGood", Boolean),
Column("iconID", Integer),
Column("attributeCategory", Integer),
Column("tooltipDescription", Integer),
Column("unitID", Integer, ForeignKey("dgmunits.unitID")))
mapper(Attribute, typeattributes_table,

View File

@@ -40,7 +40,8 @@ items_table = Table("invtypes", gamedata_meta,
Column("marketGroupID", Integer, ForeignKey("invmarketgroups.marketGroupID")),
Column("iconID", Integer),
Column("graphicID", Integer),
Column("groupID", Integer, ForeignKey("invgroups.groupID"), index=True))
Column("groupID", Integer, ForeignKey("invgroups.groupID"), index=True),
Column("replacements", String))
from .metaGroup import metatypes_table # noqa
from .traits import traits_table # noqa

View File

@@ -272,6 +272,15 @@ def getMarketGroup(lookfor, eager=None):
return marketGroup
def getMarketTreeNodeIds(rootNodeIds):
allIds = set()
addedIds = set(rootNodeIds)
while addedIds:
allIds.update(addedIds)
addedIds = {mg.ID for mg in gamedata_session.query(MarketGroup).filter(MarketGroup.parentGroupID.in_(addedIds))}
return allIds
@cachedQuery(2, "where", "filter")
def getItemsByCategory(filter, where=None, eager=None):
if isinstance(filter, int):

View File

@@ -0,0 +1,18 @@
"""
Migration 29
- adds spoolType and spoolAmount to modules table
"""
import sqlalchemy
def upgrade(saveddata_engine):
try:
saveddata_engine.execute("SELECT spoolType FROM modules LIMIT 1")
except sqlalchemy.exc.DatabaseError:
saveddata_engine.execute("ALTER TABLE modules ADD COLUMN spoolType INT;")
try:
saveddata_engine.execute("SELECT spoolAmount FROM modules LIMIT 1")
except sqlalchemy.exc.DatabaseError:
saveddata_engine.execute("ALTER TABLE modules ADD COLUMN spoolAmount FLOAT;")

View File

@@ -0,0 +1,17 @@
"""
Migration 30
- changes to prices table
"""
import sqlalchemy
def upgrade(saveddata_engine):
try:
saveddata_engine.execute("SELECT status FROM prices LIMIT 1")
except sqlalchemy.exc.DatabaseError:
# Just drop table, table will be re-created by sqlalchemy and
# data will be re-fetched
saveddata_engine.execute("DROP TABLE prices;")

View File

@@ -23,7 +23,7 @@ import datetime
from eos.db import saveddata_meta
from eos.db.saveddata.implant import charImplants_table
from eos.effectHandlerHelpers import HandledImplantBoosterList, HandledSsoCharacterList
from eos.effectHandlerHelpers import HandledImplantList, HandledSsoCharacterList
from eos.saveddata.implant import Implant
from eos.saveddata.user import User
from eos.saveddata.character import Character, Skill
@@ -75,7 +75,7 @@ mapper(Character, characters_table,
cascade="all,delete-orphan"),
"_Character__implants" : relation(
Implant,
collection_class=HandledImplantBoosterList,
collection_class=HandledImplantList,
cascade='all,delete-orphan',
backref='character',
single_parent=True,

View File

@@ -31,7 +31,7 @@ from eos.db.saveddata.drone import drones_table
from eos.db.saveddata.fighter import fighters_table
from eos.db.saveddata.implant import fitImplants_table
from eos.db.saveddata.module import modules_table
from eos.effectHandlerHelpers import HandledDroneCargoList, HandledImplantBoosterList, HandledModuleList, HandledProjectedDroneList, HandledProjectedModList
from eos.effectHandlerHelpers import HandledDroneCargoList, HandledImplantList, HandledBoosterList, HandledModuleList, HandledProjectedDroneList, HandledProjectedModList
from eos.saveddata.booster import Booster
from eos.saveddata.cargo import Cargo
from eos.saveddata.character import Character
@@ -183,7 +183,7 @@ mapper(es_Fit, fits_table,
"shipID": fits_table.c.shipID,
"_Fit__boosters": relation(
Booster,
collection_class=HandledImplantBoosterList,
collection_class=HandledBoosterList,
cascade='all, delete, delete-orphan',
backref='owner',
single_parent=True),
@@ -219,7 +219,7 @@ mapper(es_Fit, fits_table,
primaryjoin=and_(fighters_table.c.fitID == fits_table.c.ID, fighters_table.c.projected == True)), # noqa
"_Fit__implants": relation(
Implant,
collection_class=HandledImplantBoosterList,
collection_class=HandledImplantList,
cascade='all, delete, delete-orphan',
backref='owner',
single_parent=True,

View File

@@ -23,7 +23,7 @@ import datetime
from eos.db import saveddata_meta
from eos.db.saveddata.implant import implantsSetMap_table
from eos.effectHandlerHelpers import HandledImplantBoosterList
from eos.effectHandlerHelpers import HandledImplantList
from eos.saveddata.implant import Implant
from eos.saveddata.implantSet import ImplantSet
@@ -38,7 +38,7 @@ mapper(ImplantSet, implant_set_table,
properties={
"_ImplantSet__implants": relation(
Implant,
collection_class=HandledImplantBoosterList,
collection_class=HandledImplantList,
cascade='all, delete, delete-orphan',
backref='set',
single_parent=True,

View File

@@ -38,49 +38,58 @@ class DefaultDatabaseValues(object):
["[Generic]Thermal", "0", "100", "0", "0"], ["[Generic]Kinetic", "0", "0", "100", "0"],
["[Generic]Explosive", "0", "0", "0", "100"],
["[NPC][Asteroid] Blood Raiders", "5067", "4214", "0", "0"],
["[Bombs]Concussion Bomb", "0", "0", "6400", "0"],
["[Bombs]Electron Bomb", "6400", "0", "0", "0"],
["[Bombs]Scorch Bomb", "0", "6400", "0", "0"],
["[Bombs]Concussion Bomb", "0", "0", "6400", "0"],
["[Bombs]Shrapnel Bomb", "0", "0", "0", "6400"],
["[Frequency Crystals][T2] Conflagration", "61.6", "61.6", "0", "0"],
["[Frequency Crystals][T2] Scorch", "72", "16", "0", "0"],
["[Frequency Crystals][T2] Gleam", "56", "56", "0", "0"],
["[Frequency Crystals][T2] Aurora", "40", "24", "0", "0"],
["[Frequency Crystals][T2] Scorch", "72", "16", "0", "0"],
["[Frequency Crystals][T2] Conflagration", "61.6", "61.6", "0", "0"],
["[Frequency Crystals]Multifrequency", "61.6", "44", "0", "0"],
["[Frequency Crystals]Gamma", "61.6", "35.2", "0", "0"],
["[Frequency Crystals]Xray", "52.8", "35.2", "0", "0"],
["[Frequency Crystals]Ultraviolet", "52.8", "26.4", "0", "0"],
["[Frequency Crystals]Standard", "44", "26.4", "0", "0"],
["[Frequency Crystals]Infrared", "44", "17.6", "0", "0"],
["[Frequency Crystals]Microwave", "35.2", "17.6", "0", "0"],
["[Frequency Crystals]Multifrequency", "61.6", "44", "0", "0"],
["[Frequency Crystals]Radio", "44", "0", "0", "0"],
["[Frequency Crystals]Standard", "44", "26.4", "0", "0"],
["[Frequency Crystals]Ultraviolet", "52.8", "26.4", "0", "0"],
["[Frequency Crystals]Xray", "52.8", "35.2", "0", "0"],
["[Hybrid Charges][T2] Void", "0", "61.6", "61.6", "0"],
["[Hybrid Charges][T2] Null", "0", "48", "40", "0"],
["[Hybrid Charges][T2] Javelin", "0", "64", "48", "0"],
["[Hybrid Charges][T2] Spike", "0", "32", "32", "0"],
["[Hybrid Charges]Antimatter", "0", "48", "67.2", "0"],
["[Hybrid Charges]Iridium", "0", "28.8", "38.4", "0"],
["[Hybrid Charges]Iron", "0", "19.2", "28.8", "0"],
["[Hybrid Charges]Lead", "0", "28.8", "48", "0"],
["[Hybrid Charges]Plutonium", "0", "48", "57.6", "0"],
["[Hybrid Charges]Thorium", "0", "38.4", "48", "0"],
["[Hybrid Charges]Tungsten", "0", "19.2", "38.4", "0"],
["[Hybrid Charges]Uranium", "0", "38.4", "57.6", "0"],
["[Missiles]Mjolnir", "100", "0", "0", "0"], ["[Missiles]Inferno", "0", "100", "0", "0"],
["[Missiles]Scourge", "0", "0", "100", "0"], ["[Missiles]Nova", "0", "0", "0", "100"],
["[Hybrid Charges]Thorium", "0", "38.4", "48", "0"],
["[Hybrid Charges]Lead", "0", "28.8", "48", "0"],
["[Hybrid Charges]Iridium", "0", "28.8", "38.4", "0"],
["[Hybrid Charges]Tungsten", "0", "19.2", "38.4", "0"],
["[Hybrid Charges]Iron", "0", "19.2", "28.8", "0"],
["[Missiles]Mjolnir", "100", "0", "0", "0"],
["[Missiles]Inferno", "0", "100", "0", "0"],
["[Missiles]Scourge", "0", "0", "100", "0"],
["[Missiles]Nova", "0", "0", "0", "100"],
["[Missiles][Structure] Standup Missile", "100", "100", "100", "100"],
["[Projectile Ammo][T2] Tremor", "0", "0", "24", "40"],
["[Projectile Ammo][T2] Quake", "0", "0", "40", "72"],
["[Projectile Ammo][T2] Hail", "0", "0", "26.4", "96.8"],
["[Projectile Ammo][T2] Barrage", "0", "0", "40", "48"],
["[Projectile Ammo]Carbonized Lead", "0", "0", "35.2", "8.8"],
["[Projectile Ammo]Depleted Uranium", "0", "26.4", "17.6", "26.4"],
["[Projectile Ammo][T2] Quake", "0", "0", "40", "72"],
["[Projectile Ammo][T2] Tremor", "0", "0", "24", "40"],
["[Projectile Ammo]EMP", "79.2", "0", "8.8", "17.6"],
["[Projectile Ammo]Fusion", "0", "0", "17.6", "88"],
["[Projectile Ammo]Nuclear", "0", "0", "8.8", "35.2"],
["[Projectile Ammo]Phased Plasma", "0", "88", "17.6", "0"],
["[Projectile Ammo]Proton", "26.4", "0", "17.6", "0"],
["[Projectile Ammo]Fusion", "0", "0", "17.6", "88"],
["[Projectile Ammo]Depleted Uranium", "0", "26.4", "17.6", "26.4"],
["[Projectile Ammo]Titanium Sabot", "0", "0", "52.8", "176"],
["[Projectile Ammo]Proton", "26.4", "0", "17.6", "0"],
["[Projectile Ammo]Carbonized Lead", "0", "0", "35.2", "8.8"],
["[Projectile Ammo]Nuclear", "0", "0", "8.8", "35.2"],
# Different sizes of plasma do different damage, the values here are
# average of proportions across sizes
["[Exotic Plasma][T2] Occult", "0", "55863", "0", "44137"],
["[Exotic Plasma][T2] Mystic", "0", "66319", "0", "33681"],
["[Exotic Plasma]Tetryon", "0", "69208", "0", "30792"],
["[Exotic Plasma]Baryon", "0", "59737", "0", "40263"],
["[Exotic Plasma]Meson", "0", "60519", "0", "39481"],
["[NPC][Burner] Cruor (Blood Raiders)", "90", "90", "0", "0"],
["[NPC][Burner] Dramiel (Angel)", "55", "0", "20", "96"],
["[NPC][Burner] Daredevil (Serpentis)", "0", "110", "154", "0"],

View File

@@ -17,7 +17,7 @@
# along with eos. If not, see <http://www.gnu.org/licenses/>.
# ===============================================================================
from sqlalchemy import Table, Column, Integer, ForeignKey, CheckConstraint, Boolean, DateTime
from sqlalchemy import Table, Column, Integer, Float, ForeignKey, CheckConstraint, Boolean, DateTime
from sqlalchemy.orm.collections import attribute_mapped_collection
from sqlalchemy.orm import relation, mapper
import datetime
@@ -40,6 +40,8 @@ modules_table = Table("modules", saveddata_meta,
Column("position", Integer),
Column("created", DateTime, nullable=True, default=datetime.datetime.now),
Column("modified", DateTime, nullable=True, onupdate=datetime.datetime.now),
Column("spoolType", Integer, nullable=True),
Column("spoolAmount", Float, nullable=True),
CheckConstraint('("dummySlot" = NULL OR "itemID" = NULL) AND "dummySlot" != "itemID"'))
mapper(Module, modules_table,

View File

@@ -17,18 +17,19 @@
# along with eos. If not, see <http://www.gnu.org/licenses/>.
# ===============================================================================
from sqlalchemy import Table, Column, Float, Integer
from sqlalchemy.orm import mapper
from eos.db import saveddata_meta
from eos.saveddata.price import Price
prices_table = Table("prices", saveddata_meta,
Column("typeID", Integer, primary_key=True),
Column("price", Float, default=0.0),
Column("time", Integer, nullable=False),
Column("failed", Integer))
Column("status", Integer, nullable=False))
mapper(Price, prices_table, properties={
"_Price__price": prices_table.c.price,
})
mapper(Price, prices_table)

View File

@@ -21,6 +21,7 @@ import sys
from sqlalchemy.sql import and_
from sqlalchemy import desc, select
from sqlalchemy import func
from eos.db import saveddata_session, sd_lock
from eos.db.saveddata.fit import projectedFits_table
@@ -283,6 +284,12 @@ def countAllFits():
return count
def countFitGroupedByShip():
with sd_lock:
count = eos.db.saveddata_session.query(Fit.shipID, func.count(Fit.shipID)).group_by(Fit.shipID).all()
return count
def countFitsWithShip(lookfor, ownerID=None, where=None, eager=None):
"""
Get all the fits using a certain ship.
@@ -542,8 +549,17 @@ def commit():
with sd_lock:
try:
saveddata_session.commit()
saveddata_session.flush()
except Exception as ex:
except Exception:
saveddata_session.rollback()
exc_info = sys.exc_info()
raise exc_info[0](exc_info[1]).with_traceback(exc_info[2])
def flush():
with sd_lock:
try:
saveddata_session.flush()
except Exception:
saveddata_session.rollback()
exc_info = sys.exc_info()
raise exc_info[0](exc_info[1]).with_traceback(exc_info[2])

View File

@@ -18,8 +18,11 @@
# ===============================================================================
from logbook import Logger
from eos.exception import HandledListActionError
from utils.deprecated import deprecated
pyfalog = Logger(__name__)
@@ -112,6 +115,11 @@ class HandledList(list):
thing.itemID = 0
list.remove(self, thing)
def sort(self, *args, **kwargs):
# We need it here to prevent external users from accidentally sorting the list as alot of
# external logic relies on keeping modules at their places
raise NotImplementedError
class HandledModuleList(HandledList):
@@ -125,11 +133,11 @@ class HandledModuleList(HandledList):
emptyPosition = currPos
if emptyPosition < len(self):
del self[emptyPosition]
mod.position = emptyPosition
HandledList.insert(self, emptyPosition, mod)
self.__toModule(emptyPosition, mod)
if mod.isInvalid:
self.remove(mod)
self.__toDummy(mod.position)
raise HandledListActionError(mod)
return
self.appendIgnoreEmpty(mod)
@@ -139,45 +147,82 @@ class HandledModuleList(HandledList):
HandledList.append(self, mod)
if mod.isInvalid:
self.remove(mod)
return
raise HandledListActionError(mod)
def insert(self, index, mod):
mod.position = index
i = index
def replace(self, idx, mod):
try:
oldMod = self[idx]
except IndexError:
raise HandledListActionError(mod)
self.__toModule(idx, mod)
if mod.isInvalid:
self.__toModule(idx, oldMod)
raise HandledListActionError(mod)
def replaceRackPosition(self, rackPosition, mod):
listPositions = []
for currPos in range(len(self)):
currMod = self[currPos]
if currMod.slot == mod.slot:
listPositions.append(currPos)
listPositions.sort()
try:
modListPosition = listPositions[rackPosition]
except IndexError:
self.appendIgnoreEmpty(mod)
else:
oldMod = self[modListPosition]
if mod.isEmpty:
self.__toDummy(modListPosition)
else:
self.__toModule(modListPosition, mod)
# If new module cannot be appended, restore old state
if mod.isInvalid:
if oldMod.isEmpty:
self.__toDummy(modListPosition)
else:
self.__toModule(modListPosition, oldMod)
raise HandledListActionError(mod)
def insert(self, idx, mod):
mod.position = idx
i = idx
while i < len(self):
self[i].position += 1
i += 1
HandledList.insert(self, index, mod)
HandledList.insert(self, idx, mod)
if mod.isInvalid:
self.remove(mod)
raise HandledListActionError(mod)
def remove(self, mod):
HandledList.remove(self, mod)
oldPos = mod.position
mod.position = None
for i in range(oldPos, len(self)):
self[i].position -= 1
def toDummy(self, index):
def free(self, idx):
self.__toDummy(idx)
def __toDummy(self, index):
mod = self[index]
if not mod.isEmpty:
dummy = mod.buildEmpty(mod.slot)
dummy.position = index
self[index] = dummy
mod.position = None
def toModule(self, index, mod):
def __toModule(self, index, mod):
oldMod = self[index]
mod.position = index
self[index] = mod
@deprecated
def freeSlot(self, slot):
for i in range(len(self)):
mod = self[i]
if mod.getModifiedItemAttr("subSystemSlot") == slot:
self.toDummy(i)
break
oldMod.position = None
class HandledDroneCargoList(HandledList):
def find(self, item):
for o in self:
if o.item == item:
@@ -189,35 +234,101 @@ class HandledDroneCargoList(HandledList):
def append(self, thing):
HandledList.append(self, thing)
if thing.isInvalid:
self.remove(thing)
raise HandledListActionError(thing)
class HandledImplantBoosterList(HandledList):
def append(self, thing):
def insert(self, idx, thing):
HandledList.insert(self, idx, thing)
if thing.isInvalid:
HandledList.append(self, thing)
self.remove(thing)
return
raise HandledListActionError(thing)
self.makeRoom(thing)
HandledList.append(self, thing)
def makeRoom(self, thing):
class HandledImplantList(HandledList):
def append(self, implant):
if implant.isInvalid:
HandledList.append(self, implant)
self.remove(implant)
raise HandledListActionError(implant)
if self.__slotCheck(implant):
HandledList.append(self, implant)
self.remove(implant)
raise HandledListActionError(implant)
HandledList.append(self, implant)
def insert(self, idx, implant):
if implant.isInvalid:
HandledList.insert(self, idx, implant)
self.remove(implant)
raise HandledListActionError(implant)
if self.__slotCheck(implant):
HandledList.insert(self, idx, implant)
self.remove(implant)
raise HandledListActionError(implant)
HandledList.append(self, implant)
def makeRoom(self, implant):
# if needed, remove booster that was occupying slot
oldObj = next((m for m in self if m.slot == thing.slot), None)
if oldObj:
pyfalog.info("Slot {0} occupied with {1}, replacing with {2}", thing.slot, oldObj.item.name,
thing.item.name)
itemID = oldObj.itemID
oldObj = next((i for i in self if i.slot == implant.slot), None)
if oldObj is not None:
pyfalog.info("Slot {0} occupied with {1}, replacing with {2}", implant.slot, oldObj.item.name, implant.item.name)
position = self.index(oldObj)
from gui.fitCommands.helpers import ImplantInfo
implantInfo = ImplantInfo.fromImplant(oldObj)
oldObj.itemID = 0 # hack to remove from DB. See GH issue #324
self.remove(oldObj)
return itemID
return None
return position, implantInfo
return None, None
def __slotCheck(self, implant):
return any(i.slot == implant.slot for i in self)
class HandledBoosterList(HandledList):
def append(self, booster):
if booster.isInvalid:
HandledList.append(self, booster)
self.remove(booster)
raise HandledListActionError(booster)
if self.__slotCheck(booster):
HandledList.append(self, booster)
self.remove(booster)
raise HandledListActionError(booster)
HandledList.append(self, booster)
def insert(self, idx, booster):
if booster.isInvalid:
HandledList.insert(self, idx, booster)
self.remove(booster)
raise HandledListActionError(booster)
if self.__slotCheck(booster):
HandledList.insert(self, idx, booster)
self.remove(booster)
raise HandledListActionError(booster)
HandledList.append(self, booster)
def makeRoom(self, booster):
# if needed, remove booster that was occupying slot
oldObj = next((b for b in self if b.slot == booster.slot), None)
if oldObj is not None:
pyfalog.info("Slot {0} occupied with {1}, replacing with {2}", booster.slot, oldObj.item.name, booster.item.name)
position = self.index(oldObj)
from gui.fitCommands.helpers import BoosterInfo
boosterInfo = BoosterInfo.fromBooster(oldObj)
oldObj.itemID = 0 # hack to remove from DB. See GH issue #324
self.remove(oldObj)
return position, boosterInfo
return None, None
def __slotCheck(self, booster):
return any(b.slot == booster.slot for b in self)
class HandledSsoCharacterList(list):
def append(self, character):
old = next((x for x in self if x.client == character.client), None)
if old is not None:
@@ -228,38 +339,63 @@ class HandledSsoCharacterList(list):
class HandledProjectedModList(HandledList):
def append(self, proj):
if proj.isInvalid:
# we must include it before we remove it. doing it this way ensures
# rows and relationships in database are removed as well
HandledList.append(self, proj)
self.remove(proj)
return
raise HandledListActionError(proj)
proj.projected = True
isSystemEffect = proj.item.group.name == "Effect Beacon"
if isSystemEffect:
self.makeRoom(proj)
HandledList.append(self, proj)
# Remove non-projectable modules
if not proj.item.isType("projected") and not isSystemEffect:
if not proj.item.isType("projected") and not proj.isExclusiveSystemEffect:
self.remove(proj)
raise HandledListActionError(proj)
def insert(self, idx, proj):
if proj.isInvalid:
# we must include it before we remove it. doing it this way ensures
# rows and relationships in database are removed as well
HandledList.insert(self, idx, proj)
self.remove(proj)
raise HandledListActionError(proj)
proj.projected = True
HandledList.insert(self, idx, proj)
# Remove non-projectable modules
if not proj.item.isType("projected") and not proj.isExclusiveSystemEffect:
self.remove(proj)
raise HandledListActionError(proj)
@property
def currentSystemEffect(self):
return next((m for m in self if m.isExclusiveSystemEffect), None)
def makeRoom(self, proj):
# remove other system effects - only 1 per fit plz
oldEffect = next((m for m in self if m.item.group.name == "Effect Beacon"), None)
if proj.isExclusiveSystemEffect:
# remove other system effects - only 1 per fit plz
mod = self.currentSystemEffect
if oldEffect:
pyfalog.info("System effect occupied with {0}, replacing with {1}", oldEffect.item.name, proj.item.name)
self.remove(oldEffect)
return oldEffect.itemID
return None
if mod:
pyfalog.info("System effect occupied with {0}, removing it to make space for {1}".format(mod.item.name, proj.item.name))
position = self.index(mod)
# We need to pack up this info, so whatever...
from gui.fitCommands.helpers import ModuleInfo
modInfo = ModuleInfo.fromModule(mod)
self.remove(mod)
return position, modInfo
return None, None
class HandledProjectedDroneList(HandledDroneCargoList):
def append(self, proj):
proj.projected = True
HandledList.append(self, proj)
@@ -267,6 +403,20 @@ class HandledProjectedDroneList(HandledDroneCargoList):
# Remove invalid or non-projectable drones
if proj.isInvalid or not proj.item.isType("projected"):
self.remove(proj)
proj.projected = False
raise HandledListActionError(proj)
return True
def insert(self, idx, proj):
proj.projected = True
HandledList.insert(self, idx, proj)
# Remove invalid or non-projectable drones
if proj.isInvalid or not proj.item.isType("projected"):
self.remove(proj)
proj.projected = False
raise HandledListActionError(proj)
return True
class HandledItem(object):

35626
eos/effects.py Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,19 +0,0 @@
# ===============================================================================
# Copyright (C) 2010 Diego Duclos
# 2010 Anton Vorobyov
#
# This file, as well as all files in this folder, are 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/>.
# ===============================================================================

View File

@@ -1,10 +0,0 @@
# accerationControlCapNeedBonusPostPercentCapacitorNeedLocationShipGroupAfterburner
#
# Used by:
# Modules named like: Dynamic Fuel Valve (8 of 8)
type = "passive"
def handler(fit, container, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Propulsion Module",
"capacitorNeed", container.getModifiedItemAttr("capNeedBonus"))

View File

@@ -1,12 +0,0 @@
# accerationControlSkillAb&MwdSpeedBoost
#
# Used by:
# Implant: Zor's Custom Navigation Hyper-Link
# Skill: Acceleration Control
type = "passive"
def handler(fit, container, context):
level = container.level if "skill" in context else 1
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Propulsion Module",
"speedFactor", container.getModifiedItemAttr("speedFBonus") * level)

View File

@@ -1,10 +0,0 @@
# accerationControlSpeedFBonusPostPercentSpeedFactorLocationShipGroupAfterburner
#
# Used by:
# Implants named like: Eifyr and Co. 'Rogue' Acceleration Control AC (6 of 6)
type = "passive"
def handler(fit, implant, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Propulsion Module",
"speedFactor", implant.getModifiedItemAttr("speedFBonus"))

View File

@@ -1,13 +0,0 @@
# accessDifficultyBonusModifierRequiringArchaelogy
#
# Used by:
# Modules named like: Emission Scope Sharpener (8 of 8)
# Implant: Poteque 'Prospector' Archaeology AC-905
# Implant: Poteque 'Prospector' Environmental Analysis EY-1005
type = "passive"
def handler(fit, container, context):
fit.modules.filteredItemIncrease(lambda module: module.item.requiresSkill("Archaeology"),
"accessDifficultyBonus",
container.getModifiedItemAttr("accessDifficultyBonusModifier"), position="post")

View File

@@ -1,14 +0,0 @@
# accessDifficultyBonusModifierRequiringHacking
#
# Used by:
# Modules named like: Memetic Algorithm Bank (8 of 8)
# Implant: Neural Lace 'Blackglass' Net Intrusion 920-40
# Implant: Poteque 'Prospector' Environmental Analysis EY-1005
# Implant: Poteque 'Prospector' Hacking HC-905
type = "passive"
def handler(fit, container, context):
fit.modules.filteredItemIncrease(lambda c: c.item.requiresSkill("Hacking"),
"accessDifficultyBonus",
container.getModifiedItemAttr("accessDifficultyBonusModifier"), position="post")

View File

@@ -1,128 +0,0 @@
# adaptiveArmorHardener
#
# Used by:
# Module: Reactive Armor Hardener
from logbook import Logger
import eos.config
pyfalog = Logger(__name__)
runTime = "late"
type = "active"
def handler(fit, module, context):
damagePattern = fit.damagePattern
# pyfalog.debug("==============================")
static_adaptive_behavior = eos.config.settings['useStaticAdaptiveArmorHardener']
if (damagePattern.emAmount == damagePattern.thermalAmount == damagePattern.kineticAmount == damagePattern.explosiveAmount) and static_adaptive_behavior:
# pyfalog.debug("Setting adaptivearmorhardener resists to uniform profile.")
for attr in ("armorEmDamageResonance", "armorThermalDamageResonance", "armorKineticDamageResonance", "armorExplosiveDamageResonance"):
fit.ship.multiplyItemAttr(attr, module.getModifiedItemAttr(attr), stackingPenalties=True, penaltyGroup="preMul")
return
# Skip if there is no damage pattern. Example: projected ships or fleet boosters
if damagePattern:
# Populate a tuple with the damage profile modified by current armor resists.
baseDamageTaken = (
damagePattern.emAmount * fit.ship.getModifiedItemAttr('armorEmDamageResonance'),
damagePattern.thermalAmount * fit.ship.getModifiedItemAttr('armorThermalDamageResonance'),
damagePattern.kineticAmount * fit.ship.getModifiedItemAttr('armorKineticDamageResonance'),
damagePattern.explosiveAmount * fit.ship.getModifiedItemAttr('armorExplosiveDamageResonance'),
)
# pyfalog.debug("Damage Adjusted for Armor Resists: %f/%f/%f/%f" % (baseDamageTaken[0], baseDamageTaken[1], baseDamageTaken[2], baseDamageTaken[3]))
resistanceShiftAmount = module.getModifiedItemAttr(
'resistanceShiftAmount') / 100 # The attribute is in percent and we want a fraction
RAHResistance = [
module.getModifiedItemAttr('armorEmDamageResonance'),
module.getModifiedItemAttr('armorThermalDamageResonance'),
module.getModifiedItemAttr('armorKineticDamageResonance'),
module.getModifiedItemAttr('armorExplosiveDamageResonance'),
]
# Simulate RAH cycles until the RAH either stops changing or enters a loop.
# The number of iterations is limited to prevent an infinite loop if something goes wrong.
cycleList = []
loopStart = -20
for num in range(50):
# pyfalog.debug("Starting cycle %d." % num)
# The strange order is to emulate the ingame sorting when different types have taken the same amount of damage.
# This doesn't take into account stacking penalties. In a few cases fitting a Damage Control causes an inaccurate result.
damagePattern_tuples = [
(0, baseDamageTaken[0] * RAHResistance[0], RAHResistance[0]),
(3, baseDamageTaken[3] * RAHResistance[3], RAHResistance[3]),
(2, baseDamageTaken[2] * RAHResistance[2], RAHResistance[2]),
(1, baseDamageTaken[1] * RAHResistance[1], RAHResistance[1]),
]
# Sort the tuple to drop the highest damage value to the bottom
sortedDamagePattern_tuples = sorted(damagePattern_tuples, key=lambda damagePattern: damagePattern[1])
if sortedDamagePattern_tuples[2][1] == 0:
# One damage type: the top damage type takes from the other three
# Since the resistances not taking damage will end up going to the type taking damage we just do the whole thing at once.
change0 = 1 - sortedDamagePattern_tuples[0][2]
change1 = 1 - sortedDamagePattern_tuples[1][2]
change2 = 1 - sortedDamagePattern_tuples[2][2]
change3 = -(change0 + change1 + change2)
elif sortedDamagePattern_tuples[1][1] == 0:
# Two damage types: the top two damage types take from the other two
# Since the resistances not taking damage will end up going equally to the types taking damage we just do the whole thing at once.
change0 = 1 - sortedDamagePattern_tuples[0][2]
change1 = 1 - sortedDamagePattern_tuples[1][2]
change2 = -(change0 + change1) / 2
change3 = -(change0 + change1) / 2
else:
# Three or four damage types: the top two damage types take from the other two
change0 = min(resistanceShiftAmount, 1 - sortedDamagePattern_tuples[0][2])
change1 = min(resistanceShiftAmount, 1 - sortedDamagePattern_tuples[1][2])
change2 = -(change0 + change1) / 2
change3 = -(change0 + change1) / 2
RAHResistance[sortedDamagePattern_tuples[0][0]] = sortedDamagePattern_tuples[0][2] + change0
RAHResistance[sortedDamagePattern_tuples[1][0]] = sortedDamagePattern_tuples[1][2] + change1
RAHResistance[sortedDamagePattern_tuples[2][0]] = sortedDamagePattern_tuples[2][2] + change2
RAHResistance[sortedDamagePattern_tuples[3][0]] = sortedDamagePattern_tuples[3][2] + change3
# pyfalog.debug("Resistances shifted to %f/%f/%f/%f" % ( RAHResistance[0], RAHResistance[1], RAHResistance[2], RAHResistance[3]))
# See if the current RAH profile has been encountered before, indicating a loop.
for i, val in enumerate(cycleList):
tolerance = 1e-06
if abs(RAHResistance[0] - val[0]) <= tolerance and \
abs(RAHResistance[1] - val[1]) <= tolerance and \
abs(RAHResistance[2] - val[2]) <= tolerance and \
abs(RAHResistance[3] - val[3]) <= tolerance:
loopStart = i
# pyfalog.debug("Loop found: %d-%d" % (loopStart, num))
break
if loopStart >= 0:
break
cycleList.append(list(RAHResistance))
# if loopStart < 0:
# pyfalog.error("Reactive Armor Hardener failed to find equilibrium. Damage profile after armor: {0}/{1}/{2}/{3}".format(
# baseDamageTaken[0], baseDamageTaken[1], baseDamageTaken[2], baseDamageTaken[3]))
# Average the profiles in the RAH loop, or the last 20 if it didn't find a loop.
loopCycles = cycleList[loopStart:]
numCycles = len(loopCycles)
average = [0, 0, 0, 0]
for cycle in loopCycles:
for i in range(4):
average[i] += cycle[i]
for i in range(4):
average[i] = round(average[i] / numCycles, 3)
# Set the new resistances
# pyfalog.debug("Setting new resist profile: %f/%f/%f/%f" % ( average[0], average[1], average[2],average[3]))
for i, attr in enumerate((
'armorEmDamageResonance', 'armorThermalDamageResonance', 'armorKineticDamageResonance',
'armorExplosiveDamageResonance')):
module.increaseItemAttr(attr, average[i] - module.getModifiedItemAttr(attr))
fit.ship.multiplyItemAttr(attr, average[i], stackingPenalties=True, penaltyGroup="preMul")

View File

@@ -1,10 +0,0 @@
# addToSignatureRadius2
#
# Used by:
# Modules from group: Missile Launcher Bomb (2 of 2)
# Modules from group: Shield Extender (36 of 36)
type = "passive"
def handler(fit, module, context):
fit.ship.increaseItemAttr("signatureRadius", module.getModifiedItemAttr("signatureRadiusAdd"))

View File

@@ -1,13 +0,0 @@
# afterburnerDurationBonusPostPercentDurationLocationShipModulesRequiringAfterburner
#
# Used by:
# Implants named like: Eifyr and Co. 'Rogue' Afterburner AB (6 of 6)
# Implant: Zor's Custom Navigation Link
# Skill: Afterburner
type = "passive"
def handler(fit, container, context):
level = container.level if "skill" in context else 1
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Afterburner"),
"duration", container.getModifiedItemAttr("durationBonus") * level)

View File

@@ -1,9 +0,0 @@
# agilityBonus
#
# Used by:
# Subsystems named like: Propulsion Interdiction Nullifier (4 of 4)
type = "passive"
def handler(fit, src, context):
fit.ship.increaseItemAttr("agility", src.getModifiedItemAttr("agilityBonusAdd"))

View File

@@ -1,13 +0,0 @@
# agilityMultiplierEffect
#
# Used by:
# Modules from group: Inertial Stabilizer (7 of 7)
# Modules from group: Nanofiber Internal Structure (7 of 7)
# Modules from group: Reinforced Bulkhead (8 of 8)
type = "passive"
def handler(fit, module, context):
fit.ship.boostItemAttr("agility",
module.getModifiedItemAttr("agilityMultiplier"),
stackingPenalties=True)

View File

@@ -1,9 +0,0 @@
# agilityMultiplierEffectPassive
#
# Used by:
# Modules named like: Polycarbon Engine Housing (8 of 8)
type = "passive"
def handler(fit, module, context):
fit.ship.boostItemAttr("agility", module.getModifiedItemAttr("agilityBonus"), stackingPenalties=True)

View File

@@ -1,14 +0,0 @@
# ammoFallofMultiplier
#
# Used by:
# Charges from group: Advanced Artillery Ammo (8 of 8)
# Charges from group: Advanced Autocannon Ammo (8 of 8)
# Charges from group: Advanced Beam Laser Crystal (8 of 8)
# Charges from group: Advanced Blaster Charge (8 of 8)
# Charges from group: Advanced Pulse Laser Crystal (8 of 8)
# Charges from group: Advanced Railgun Charge (8 of 8)
type = "passive"
def handler(fit, module, context):
module.multiplyItemAttr("falloff", module.getModifiedChargeAttr("fallofMultiplier") or 1)

View File

@@ -1,13 +0,0 @@
# ammoInfluenceCapNeed
#
# Used by:
# Items from category: Charge (493 of 947)
type = "passive"
def handler(fit, module, context):
# Dirty hack to work around cap charges setting cap booster
# injection amount to zero
rawAttr = module.item.getAttribute("capacitorNeed")
if rawAttr is not None and rawAttr >= 0:
module.boostItemAttr("capacitorNeed", module.getModifiedChargeAttr("capNeedBonus") or 0)

View File

@@ -1,9 +0,0 @@
# ammoInfluenceRange
#
# Used by:
# Items from category: Charge (587 of 947)
type = "passive"
def handler(fit, module, context):
module.multiplyItemAttr("maxRange", module.getModifiedChargeAttr("weaponRangeMultiplier"))

View File

@@ -1,12 +0,0 @@
# ammoSpeedMultiplier
#
# Used by:
# Charges from group: Festival Charges (23 of 23)
# Charges from group: Interdiction Probe (2 of 2)
# Charges from group: Structure Festival Charges (3 of 3)
# Special Edition Assetss from group: Festival Charges Expired (2 of 2)
type = "passive"
def handler(fit, module, context):
module.multiplyItemAttr("speed", module.getModifiedChargeAttr("speedMultiplier") or 1)

View File

@@ -1,10 +0,0 @@
# ammoTrackingMultiplier
#
# Used by:
# Items from category: Charge (182 of 947)
# Charges from group: Projectile Ammo (128 of 128)
type = "passive"
def handler(fit, module, context):
module.multiplyItemAttr("trackingSpeed", module.getModifiedChargeAttr("trackingSpeedMultiplier"))

View File

@@ -1,14 +0,0 @@
# angelsetbonus
#
# Used by:
# Implants named like: grade Halo (18 of 18)
runTime = "early"
type = "passive"
def handler(fit, implant, context):
fit.appliedImplants.filteredItemMultiply(
lambda implant: "signatureRadiusBonus" in implant.itemModifiedAttributes and
"implantSetAngel" in implant.itemModifiedAttributes,
"signatureRadiusBonus",
implant.getModifiedItemAttr("implantSetAngel"))

View File

@@ -1,9 +0,0 @@
# antiWarpScramblingPassive
#
# Used by:
# Modules from group: Warp Core Stabilizer (8 of 8)
type = "passive"
def handler(fit, module, context):
fit.ship.increaseItemAttr("warpScrambleStatus", module.getModifiedItemAttr("warpScrambleStrength"))

View File

@@ -1,16 +0,0 @@
# aoe_beacon_bioluminescence_cloud
#
# Used by:
# Celestials named like: Bioluminescence Cloud (3 of 3)
runTime = "early"
type = ("projected", "passive", "gang")
def handler(fit, beacon, context, **kwargs):
for x in range(1, 3):
if beacon.getModifiedItemAttr("warfareBuff{}ID".format(x)):
value = beacon.getModifiedItemAttr("warfareBuff{}Value".format(x))
id = beacon.getModifiedItemAttr("warfareBuff{}ID".format(x))
if id:
fit.addCommandBonus(id, value, beacon, kwargs['effect'], 'early')

View File

@@ -1,16 +0,0 @@
# aoe_beacon_caustic_cloud
#
# Used by:
# Celestials named like: Caustic Cloud (3 of 3)
runTime = "early"
type = ("projected", "passive", "gang")
def handler(fit, beacon, context, **kwargs):
for x in range(1, 3):
if beacon.getModifiedItemAttr("warfareBuff{}ID".format(x)):
value = beacon.getModifiedItemAttr("warfareBuff{}Value".format(x))
id = beacon.getModifiedItemAttr("warfareBuff{}ID".format(x))
if id:
fit.addCommandBonus(id, value, beacon, kwargs['effect'], 'early')

View File

@@ -1,16 +0,0 @@
# aoe_beacon_filament_cloud
#
# Used by:
# Celestials named like: Filament Cloud (3 of 3)
runTime = "early"
type = ("projected", "passive", "gang")
def handler(fit, beacon, context, **kwargs):
for x in range(1, 3):
if beacon.getModifiedItemAttr("warfareBuff{}ID".format(x)):
value = beacon.getModifiedItemAttr("warfareBuff{}Value".format(x))
id = beacon.getModifiedItemAttr("warfareBuff{}ID".format(x))
if id:
fit.addCommandBonus(id, value, beacon, kwargs['effect'], 'early')

View File

@@ -1,14 +0,0 @@
# archaeologySkillVirusBonus
#
# Used by:
# Modules named like: Emission Scope Sharpener (8 of 8)
# Implant: Poteque 'Prospector' Archaeology AC-905
# Implant: Poteque 'Prospector' Environmental Analysis EY-1005
# Skill: Archaeology
type = "passive"
def handler(fit, container, context):
level = container.level if "skill" in context else 1
fit.modules.filteredItemIncrease(lambda mod: mod.item.requiresSkill("Archaeology"),
"virusCoherence", container.getModifiedItemAttr("virusCoherenceBonus") * level)

View File

@@ -1,13 +0,0 @@
# armorAllRepairSystemsAmountBonusPassive
#
# Used by:
# Implants named like: Agency 'Hardshell' TB Dose (4 of 4)
# Implants named like: Exile Booster (4 of 4)
# Implant: Antipharmakon Kosybo
type = "passive"
def handler(fit, booster, context):
fit.modules.filteredItemBoost(
lambda mod: mod.item.requiresSkill("Repair Systems") or mod.item.requiresSkill("Capital Repair Systems"),
"armorDamageAmount", booster.getModifiedItemAttr("armorDamageAmountBonus") or 0)

View File

@@ -1,11 +0,0 @@
# armorDamageAmountBonusCapitalArmorRepairers
#
# Used by:
# Modules named like: Auxiliary Nano Pump (8 of 8)
type = "passive"
def handler(fit, implant, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Capital Repair Systems"),
"armorDamageAmount", implant.getModifiedItemAttr("repairBonus"),
stackingPenalties=True)

View File

@@ -1,11 +0,0 @@
# armoredCommandDurationBonus
#
# Used by:
# Skill: Armored Command
type = "passive"
def handler(fit, src, context):
lvl = src.level
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Armored Command"), "buffDuration",
src.getModifiedItemAttr("durationBonus") * lvl)

View File

@@ -1,20 +0,0 @@
# armoredCommandMindlink
#
# Used by:
# Implant: Armored Command Mindlink
# Implant: Federation Navy Command Mindlink
# Implant: Imperial Navy Command Mindlink
type = "passive"
def handler(fit, src, context):
fit.modules.filteredChargeBoost(lambda mod: mod.item.requiresSkill("Armored Command"), "warfareBuff2Multiplier",
src.getModifiedItemAttr("mindlinkBonus"))
fit.modules.filteredChargeBoost(lambda mod: mod.item.requiresSkill("Armored Command"), "warfareBuff1Multiplier",
src.getModifiedItemAttr("mindlinkBonus"))
fit.modules.filteredChargeBoost(lambda mod: mod.item.requiresSkill("Armored Command"), "warfareBuff4Multiplier",
src.getModifiedItemAttr("mindlinkBonus"))
fit.modules.filteredChargeBoost(lambda mod: mod.item.requiresSkill("Armored Command"), "warfareBuff3Multiplier",
src.getModifiedItemAttr("mindlinkBonus"))
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Armored Command"), "buffDuration",
src.getModifiedItemAttr("mindlinkBonus"))

View File

@@ -1,17 +0,0 @@
# armoredCommandStrengthBonus
#
# Used by:
# Skill: Armored Command Specialist
type = "passive"
def handler(fit, src, context):
lvl = src.level
fit.modules.filteredChargeBoost(lambda mod: mod.item.requiresSkill("Armored Command"), "warfareBuff1Multiplier",
src.getModifiedItemAttr("commandStrengthBonus") * lvl)
fit.modules.filteredChargeBoost(lambda mod: mod.item.requiresSkill("Armored Command"), "warfareBuff2Multiplier",
src.getModifiedItemAttr("commandStrengthBonus") * lvl)
fit.modules.filteredChargeBoost(lambda mod: mod.item.requiresSkill("Armored Command"), "warfareBuff4Multiplier",
src.getModifiedItemAttr("commandStrengthBonus") * lvl)
fit.modules.filteredChargeBoost(lambda mod: mod.item.requiresSkill("Armored Command"), "warfareBuff3Multiplier",
src.getModifiedItemAttr("commandStrengthBonus") * lvl)

View File

@@ -1,9 +0,0 @@
# armorHPBonusAdd
#
# Used by:
# Modules from group: Armor Reinforcer (51 of 51)
type = "passive"
def handler(fit, module, context):
fit.ship.increaseItemAttr("armorHP", module.getModifiedItemAttr("armorHPBonusAdd"))

View File

@@ -1,9 +0,0 @@
# armorHPBonusAddPassive
#
# Used by:
# Subsystems from group: Defensive Systems (9 of 12)
type = "passive"
def handler(fit, module, context):
fit.ship.increaseItemAttr("armorHP", module.getModifiedItemAttr("armorHPBonusAdd") or 0)

View File

@@ -1,10 +0,0 @@
# armorHPMultiply
#
# Used by:
# Modules from group: Armor Coating (202 of 202)
# Modules from group: Armor Plating Energized (187 of 187)
type = "passive"
def handler(fit, module, context):
fit.ship.multiplyItemAttr("armorHP", module.getModifiedItemAttr("armorHPMultiplier"))

View File

@@ -1,9 +0,0 @@
# armorReinforcerMassAdd
#
# Used by:
# Modules from group: Armor Reinforcer (51 of 51)
type = "passive"
def handler(fit, module, context):
fit.ship.increaseItemAttr("mass", module.getModifiedItemAttr("massAddition"))

View File

@@ -1,12 +0,0 @@
# armorRepair
#
# Used by:
# Modules from group: Armor Repair Unit (108 of 108)
runTime = "late"
type = "active"
def handler(fit, module, context):
amount = module.getModifiedItemAttr("armorDamageAmount")
speed = module.getModifiedItemAttr("duration") / 1000.0
fit.extraAttributes.increase("armorRepair", amount / speed)

View File

@@ -1,10 +0,0 @@
# armorRepairAmountBonusSubcap
#
# Used by:
# Implants named like: grade Asklepian (15 of 18)
type = "passive"
def handler(fit, src, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Repair Systems"),
"armorDamageAmount", src.getModifiedItemAttr("armorRepairBonus"))

View File

@@ -1,16 +0,0 @@
# armorRepairProjectorFalloffBonus
#
# Used by:
# Variations of ship: Navitas (2 of 2)
# Ship: Augoror
# Ship: Deacon
# Ship: Exequror
# Ship: Inquisitor
type = "passive"
def handler(fit, src, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Remote Armor Repairer", "falloffEffectiveness",
src.getModifiedItemAttr("falloffBonus"))
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Ancillary Remote Armor Repairer",
"falloffEffectiveness", src.getModifiedItemAttr("falloffBonus"))

View File

@@ -1,16 +0,0 @@
# armorRepairProjectorMaxRangeBonus
#
# Used by:
# Variations of ship: Navitas (2 of 2)
# Ship: Augoror
# Ship: Deacon
# Ship: Exequror
# Ship: Inquisitor
type = "passive"
def handler(fit, src, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Remote Armor Repairer", "maxRange",
src.getModifiedItemAttr("maxRangeBonus"))
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Ancillary Remote Armor Repairer", "maxRange",
src.getModifiedItemAttr("maxRangeBonus"))

View File

@@ -1,11 +0,0 @@
# armorUpgradesMassPenaltyReductionBonus
#
# Used by:
# Skill: Armor Layering
type = "passive"
def handler(fit, container, context):
level = container.level
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Armor Reinforcer",
"massAddition", container.getModifiedItemAttr("massPenaltyReduction") * level)

View File

@@ -1,14 +0,0 @@
# astrogeologyMiningAmountBonusPostPercentMiningAmountLocationShipModulesRequiringMining
#
# Used by:
# Implants named like: Inherent Implants 'Highwall' Mining MX (3 of 3)
# Implant: Michi's Excavation Augmentor
# Skill: Astrogeology
# Skill: Mining
type = "passive"
def handler(fit, container, context):
level = container.level if "skill" in context else 1
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Mining"),
"miningAmount", container.getModifiedItemAttr("miningAmountBonus") * level)

View File

@@ -1,12 +0,0 @@
# baseMaxScanDeviationModifierModuleOnline2None
#
# Used by:
# Variations of module: Scan Pinpointing Array I (2 of 2)
type = "passive"
def handler(fit, module, context):
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Astrometrics"),
"baseMaxScanDeviation",
module.getModifiedItemAttr("maxScanDeviationModifierModule"),
stackingPenalties=True)

View File

@@ -1,14 +0,0 @@
# baseMaxScanDeviationModifierRequiringAstrometrics
#
# Used by:
# Implants named like: Poteque 'Prospector' Astrometric Pinpointing AP (3 of 3)
# Skill: Astrometric Pinpointing
# Skill: Astrometrics
type = "passive"
def handler(fit, container, context):
level = container.level if "skill" in context else 1
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Astrometrics"),
"baseMaxScanDeviation",
container.getModifiedItemAttr("maxScanDeviationModifier") * level)

View File

@@ -1,11 +0,0 @@
# baseSensorStrengthModifierModule
#
# Used by:
# Variations of module: Scan Rangefinding Array I (2 of 2)
type = "passive"
def handler(fit, module, context):
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Astrometrics"),
"baseSensorStrength", module.getModifiedItemAttr("scanStrengthBonusModule"),
stackingPenalties=True)

View File

@@ -1,18 +0,0 @@
# baseSensorStrengthModifierRequiringAstrometrics
#
# Used by:
# Modules from group: Scan Probe Launcher (4 of 7)
# Implants named like: Poteque 'Prospector' Astrometric Rangefinding AR (3 of 3)
# Implants named like: grade Virtue (10 of 12)
# Modules named like: Gravity Capacitor Upgrade (8 of 8)
# Skill: Astrometric Rangefinding
# Skill: Astrometrics
type = "passive"
def handler(fit, container, context):
level = container.level if "skill" in context else 1
penalized = False if "skill" in context or "implant" in context else True
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Astrometrics"),
"baseSensorStrength", container.getModifiedItemAttr("scanStrengthBonus") * level,
stackingPenalties=penalized)

View File

@@ -1,11 +0,0 @@
# 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

@@ -1,12 +0,0 @@
# 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

@@ -1,13 +0,0 @@
# 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

@@ -1,11 +0,0 @@
# 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

@@ -1,12 +0,0 @@
# 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

@@ -1,10 +0,0 @@
# bcLargeEnergyTurretCapacitorNeedBonus
#
# Used by:
# Ship: Oracle
type = "passive"
def handler(fit, ship, context):
fit.modules.filteredItemMultiply(lambda mod: mod.item.requiresSkill("Large Energy Turret"),
"capacitorNeed", ship.getModifiedItemAttr("bcLargeTurretCap"))

View File

@@ -1,10 +0,0 @@
# bcLargeEnergyTurretCPUNeedBonus
#
# Used by:
# Ship: Oracle
type = "passive"
def handler(fit, ship, context):
fit.modules.filteredItemMultiply(lambda mod: mod.item.requiresSkill("Large Energy Turret"),
"cpu", ship.getModifiedItemAttr("bcLargeTurretCPU"))

View File

@@ -1,10 +0,0 @@
# bcLargeEnergyTurretPowerNeedBonus
#
# Used by:
# Ship: Oracle
type = "passive"
def handler(fit, ship, context):
fit.modules.filteredItemMultiply(lambda mod: mod.item.requiresSkill("Large Energy Turret"),
"power", ship.getModifiedItemAttr("bcLargeTurretPower"))

View File

@@ -1,11 +0,0 @@
# bcLargeHybridTurretCapacitorNeedBonus
#
# Used by:
# Ship: Naga
# Ship: Talos
type = "passive"
def handler(fit, ship, context):
fit.modules.filteredItemMultiply(lambda mod: mod.item.requiresSkill("Large Hybrid Turret"),
"capacitorNeed", ship.getModifiedItemAttr("bcLargeTurretCap"))

View File

@@ -1,11 +0,0 @@
# bcLargeHybridTurretCPUNeedBonus
#
# Used by:
# Ship: Naga
# Ship: Talos
type = "passive"
def handler(fit, ship, context):
fit.modules.filteredItemMultiply(lambda mod: mod.item.requiresSkill("Large Hybrid Turret"),
"cpu", ship.getModifiedItemAttr("bcLargeTurretCPU"))

View File

@@ -1,11 +0,0 @@
# bcLargeHybridTurretPowerNeedBonus
#
# Used by:
# Ship: Naga
# Ship: Talos
type = "passive"
def handler(fit, ship, context):
fit.modules.filteredItemMultiply(lambda mod: mod.item.requiresSkill("Large Hybrid Turret"),
"power", ship.getModifiedItemAttr("bcLargeTurretPower"))

View File

@@ -1,10 +0,0 @@
# bcLargeProjectileTurretCPUNeedBonus
#
# Used by:
# Ship: Tornado
type = "passive"
def handler(fit, ship, context):
fit.modules.filteredItemMultiply(lambda mod: mod.item.requiresSkill("Large Projectile Turret"),
"cpu", ship.getModifiedItemAttr("bcLargeTurretCPU"))

View File

@@ -1,10 +0,0 @@
# bcLargeProjectileTurretPowerNeedBonus
#
# Used by:
# Ship: Tornado
type = "passive"
def handler(fit, ship, context):
fit.modules.filteredItemMultiply(lambda mod: mod.item.requiresSkill("Large Projectile Turret"),
"power", ship.getModifiedItemAttr("bcLargeTurretPower"))

View File

@@ -1,12 +0,0 @@
# biologyTimeBonusFixed
#
# Used by:
# Implants named like: Eifyr and Co. 'Alchemist' Biology BY (2 of 2)
# Skill: Biology
type = "passive"
def handler(fit, container, context):
level = container.level if "skill" in context else 1
fit.boosters.filteredItemBoost(lambda bst: True, "boosterDuration",
container.getModifiedItemAttr("durationBonus") * level)

View File

@@ -1,12 +0,0 @@
# blockadeRunnerCloakCpuPercentBonus
#
# Used by:
# Ships from group: Blockade Runner (4 of 4)
type = "passive"
runTime = "early"
def handler(fit, ship, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Cloaking Device",
"cpu", ship.getModifiedItemAttr("eliteIndustrialCovertCloakBonus"),
skill="Transport Ships")

View File

@@ -1,15 +0,0 @@
# boosterArmorHpPenalty
#
# Used by:
# Implants named like: Booster (12 of 35)
type = "boosterSideEffect"
# User-friendly name for the side effect
displayName = "Armor Capacity"
# Attribute that this effect targets
attr = "boosterArmorHPPenalty"
def handler(fit, booster, context):
fit.ship.boostItemAttr("armorHP", booster.getModifiedItemAttr(attr))

View File

@@ -1,18 +0,0 @@
# boosterArmorRepairAmountPenalty
#
# Used by:
# Implants named like: Drop Booster (3 of 4)
# Implants named like: Mindflood Booster (3 of 4)
# Implants named like: Sooth Sayer Booster (3 of 4)
type = "boosterSideEffect"
# User-friendly name for the side effect
displayName = "Armor Repair Amount"
# Attribute that this effect targets
attr = "boosterArmorRepairAmountPenalty"
def handler(fit, booster, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Armor Repair Unit",
"armorDamageAmount", booster.getModifiedItemAttr(attr))

View File

@@ -1,16 +0,0 @@
# boosterCapacitorCapacityPenalty
#
# Used by:
# Implants named like: Blue Pill Booster (3 of 5)
# Implants named like: Exile Booster (3 of 4)
type = "boosterSideEffect"
# User-friendly name for the side effect
displayName = "Cap Capacity"
# Attribute that this effect targets
attr = "boosterCapacitorCapacityPenalty"
def handler(fit, booster, context):
fit.ship.boostItemAttr("capacitorCapacity", booster.getModifiedItemAttr(attr))

View File

@@ -1,16 +0,0 @@
# boosterMaxVelocityPenalty
#
# Used by:
# Implants named like: Crash Booster (3 of 4)
# Items from market group: Implants & Boosters > Booster > Booster Slot 02 (9 of 13)
type = "boosterSideEffect"
# User-friendly name for the side effect
displayName = "Velocity"
# Attribute that this effect targets
attr = "boosterMaxVelocityPenalty"
def handler(fit, booster, context):
fit.ship.boostItemAttr("maxVelocity", booster.getModifiedItemAttr(attr))

View File

@@ -1,17 +0,0 @@
# boosterMissileExplosionCloudPenaltyFixed
#
# Used by:
# Implants named like: Exile Booster (3 of 4)
# Implants named like: Mindflood Booster (3 of 4)
type = "boosterSideEffect"
# User-friendly name for the side effect
displayName = "Missile Explosion Radius"
# Attribute that this effect targets
attr = "boosterMissileAOECloudPenalty"
def handler(fit, booster, context):
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Missile Launcher Operation"),
"aoeCloudSize", booster.getModifiedItemAttr(attr))

View File

@@ -1,16 +0,0 @@
# boosterMissileExplosionVelocityPenalty
#
# Used by:
# Implants named like: Blue Pill Booster (3 of 5)
type = "boosterSideEffect"
# User-friendly name for the side effect
displayName = "Missile Explosion Velocity"
# Attribute that this effect targets
attr = "boosterAOEVelocityPenalty"
def handler(fit, booster, context):
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Missile Launcher Operation"),
"aoeVelocity", booster.getModifiedItemAttr(attr))

View File

@@ -1,17 +0,0 @@
# boosterMissileVelocityPenalty
#
# Used by:
# Implants named like: Crash Booster (3 of 4)
# Implants named like: X Instinct Booster (3 of 4)
type = "boosterSideEffect"
# User-friendly name for the side effect
displayName = "Missile Velocity"
# Attribute that this effect targets
attr = "boosterMissileVelocityPenalty"
def handler(fit, booster, context):
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Missile Launcher Operation"),
"maxVelocity", booster.getModifiedItemAttr(attr))

View File

@@ -1,15 +0,0 @@
# boosterModifyBoosterArmorPenalties
#
# Used by:
# Implants named like: Eifyr and Co. 'Alchemist' Neurotoxin Control NC (2 of 2)
# Implants named like: grade Edge (10 of 12)
# Skill: Neurotoxin Control
type = "passive"
def handler(fit, container, context):
level = container.level if "skill" in context else 1
attrs = ("boosterArmorHPPenalty", "boosterArmorRepairAmountPenalty")
for attr in attrs:
fit.boosters.filteredItemBoost(lambda booster: True, attr,
container.getModifiedItemAttr("boosterAttributeModifier") * level)

View File

@@ -1,15 +0,0 @@
# boosterModifyBoosterMaxVelocityAndCapacitorPenalty
#
# Used by:
# Implants named like: Eifyr and Co. 'Alchemist' Neurotoxin Control NC (2 of 2)
# Implants named like: grade Edge (10 of 12)
# Skill: Neurotoxin Control
type = "passive"
def handler(fit, container, context):
level = container.level if "skill" in context else 1
attrs = ("boosterCapacitorCapacityPenalty", "boosterMaxVelocityPenalty")
for attr in attrs:
fit.boosters.filteredItemBoost(lambda booster: True, attr,
container.getModifiedItemAttr("boosterAttributeModifier") * level)

View File

@@ -1,15 +0,0 @@
# boosterModifyBoosterMissilePenalty
#
# Used by:
# Implants named like: Eifyr and Co. 'Alchemist' Neurotoxin Control NC (2 of 2)
# Implants named like: grade Edge (10 of 12)
# Skill: Neurotoxin Control
type = "passive"
def handler(fit, container, context):
level = container.level if "skill" in context else 1
attrs = ("boosterAOEVelocityPenalty", "boosterMissileAOECloudPenalty", "boosterMissileVelocityPenalty")
for attr in attrs:
fit.boosters.filteredItemBoost(lambda booster: True, attr,
container.getModifiedItemAttr("boosterAttributeModifier") * level)

View File

@@ -1,17 +0,0 @@
# boosterModifyBoosterShieldPenalty
#
# Used by:
# Implants named like: Eifyr and Co. 'Alchemist' Neurotoxin Control NC (2 of 2)
# Implants named like: grade Edge (10 of 12)
# Skill: Neurotoxin Control
type = "passive"
def handler(fit, container, context):
level = container.level if "skill" in context else 1
attrs = ("boosterShieldBoostAmountPenalty", "boosterShieldCapacityPenalty", "shieldBoostMultiplier")
for attr in attrs:
# shieldBoostMultiplier can be positive (Blue Pill) and negative value (other boosters)
# We're interested in decreasing only side-effects
fit.boosters.filteredItemBoost(lambda booster: booster.getModifiedItemAttr(attr) < 0,
attr, container.getModifiedItemAttr("boosterAttributeModifier") * level)

View File

@@ -1,15 +0,0 @@
# boosterModifyBoosterTurretPenalty
#
# Used by:
# Implants named like: Eifyr and Co. 'Alchemist' Neurotoxin Control NC (2 of 2)
# Implants named like: grade Edge (10 of 12)
# Skill: Neurotoxin Control
type = "passive"
def handler(fit, container, context):
level = container.level if "skill" in context else 1
attrs = ("boosterTurretFalloffPenalty", "boosterTurretOptimalRangePenalty", "boosterTurretTrackingPenalty")
for attr in attrs:
fit.boosters.filteredItemBoost(lambda booster: True, attr,
container.getModifiedItemAttr("boosterAttributeModifier") * level)

View File

@@ -1,20 +0,0 @@
# boosterShieldBoostAmountPenaltyShieldSkills
#
# Used by:
# Implants named like: Crash Booster (3 of 4)
# Implants named like: Frentix Booster (3 of 4)
# Implants named like: Mindflood Booster (3 of 4)
type = "boosterSideEffect"
# User-friendly name for the side effect
displayName = "Shield Boost"
# Attribute that this effect targets
attr = "boosterShieldBoostAmountPenalty"
def handler(fit, src, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Shield Operation"), "shieldBonus",
src.getModifiedItemAttr("boosterShieldBoostAmountPenalty"))
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Capital Shield Operation"), "shieldBonus",
src.getModifiedItemAttr("boosterShieldBoostAmountPenalty"))

View File

@@ -1,15 +0,0 @@
# boosterShieldCapacityPenalty
#
# Used by:
# Implants from group: Booster (12 of 69)
type = "boosterSideEffect"
# User-friendly name for the side effect
displayName = "Shield Capacity"
# Attribute that this effect targets
attr = "boosterShieldCapacityPenalty"
def handler(fit, booster, context):
fit.ship.boostItemAttr("shieldCapacity", booster.getModifiedItemAttr(attr))

View File

@@ -1,17 +0,0 @@
# boosterTurretFalloffPenalty
#
# Used by:
# Implants named like: Drop Booster (3 of 4)
# Implants named like: X Instinct Booster (3 of 4)
type = "boosterSideEffect"
# User-friendly name for the side effect
displayName = "Turret Falloff"
# Attribute that this effect targets
attr = "boosterTurretFalloffPenalty"
def handler(fit, booster, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Gunnery"),
"falloff", booster.getModifiedItemAttr(attr))

View File

@@ -1,18 +0,0 @@
# boosterTurretOptimalRangePenalty
#
# Used by:
# Implants named like: Blue Pill Booster (3 of 5)
# Implants named like: Mindflood Booster (3 of 4)
# Implants named like: Sooth Sayer Booster (3 of 4)
type = "boosterSideEffect"
# User-friendly name for the side effect
displayName = "Turret Optimal Range"
# Attribute that this effect targets
attr = "boosterTurretOptimalRangePenalty"
def handler(fit, booster, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Gunnery"),
"maxRange", booster.getModifiedItemAttr(attr))

View File

@@ -1,17 +0,0 @@
# boosterTurretTrackingPenalty
#
# Used by:
# Implants named like: Exile Booster (3 of 4)
# Implants named like: Frentix Booster (3 of 4)
type = "boosterSideEffect"
# User-friendly name for the side effect
displayName = "Turret Tracking"
# Attribute that this effect targets
attr = "boosterTurretTrackingPenalty"
def handler(fit, booster, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Gunnery"),
"trackingSpeed", booster.getModifiedItemAttr(attr))

View File

@@ -1,12 +0,0 @@
# caldarisetbonus3
#
# Used by:
# Implants named like: High grade Talon (6 of 6)
runTime = "early"
type = "passive"
def handler(fit, implant, context):
fit.appliedImplants.filteredItemMultiply(lambda target: target.item.requiresSkill("Cybernetics"),
"scanGravimetricStrengthPercent",
implant.getModifiedItemAttr("implantSetCaldariNavy"))

View File

@@ -1,12 +0,0 @@
# caldarisetLGbonus
#
# Used by:
# Implants named like: Low grade Talon (6 of 6)
runTime = "early"
type = "passive"
def handler(fit, implant, context):
fit.appliedImplants.filteredItemMultiply(lambda target: target.item.requiresSkill("Cybernetics"),
"scanGravimetricStrengthModifier",
implant.getModifiedItemAttr("implantSetLGCaldariNavy"))

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