Compare commits

...

1229 Commits

Author SHA1 Message Date
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
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
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
Ryan Holmes
19de7e40dc Merge pull request #1799 from pyfa-org/mutation_gauge_fix
Mutation gauge fix
2018-11-14 21:26:33 -05:00
DarkPhoenix
de2ee1dce6 Set input box upon updates as well 2018-11-14 17:36:35 +03:00
DarkPhoenix
90698dde90 Rework slider to use values rather than modifiers 2018-11-14 17:15:04 +03:00
Ryan Holmes
0ab6d6e845 Merge pull request #1798 from pyfa-org/release/v2.6.0
Release/v2.6.0
2018-11-13 21:14:54 -05:00
Ryan Holmes
74d87845cf Merge pull request #1797 from pyfa-org/master
Merge pull request #1796 from pyfa-org/release/v2.6.0
2018-11-13 21:14:12 -05:00
blitzmann
9e2b15776f bump version 2018-11-13 21:13:35 -05:00
Ryan Holmes
c8ade0741c Merge pull request #1796 from pyfa-org/release/v2.6.0
Release/v2.6.0
2018-11-13 21:12:47 -05:00
blitzmann
af8b444ab5 update icons 2018-11-13 20:49:53 -05:00
blitzmann
2ba26f01b2 update db 2018-11-13 20:49:37 -05:00
DarkPhoenix
e77bb11d0a Update database and effects to 1419904 2018-11-13 14:09:23 +03:00
DarkPhoenix
c14b56f37d Fix file name for case-sensitive filesystems
Phobos produces all-lowercase file
2018-11-13 13:41:59 +03:00
DarkPhoenix
e6fe8de5ed Remove unused effects 2018-11-02 15:52:58 +03:00
DarkPhoenix
cf27c2be10 Update database and add effects for two new triglavian ships 2018-11-02 15:49:35 +03:00
DarkPhoenix
f39ba27a13 Add backend support for damage stats separation (prespool and postspool) 2018-11-02 13:30:38 +03:00
Ryan Holmes
78ff74f0f7 Merge pull request #1787 from pyfa-org/issue/1778
Issue/1778
2018-10-28 22:08:03 -04:00
blitzmann
29a2a08986 Add drag n drop form market to implant view 2018-10-28 22:06:08 -04:00
blitzmann
881b92a6ea Convert implant location change to a command 2018-10-28 21:59:14 -04:00
Ryan Holmes
50c22c836b Merge pull request #1786 from pyfa-org/issue/1777
Recalc fit after removing implants (and undoing removal)
2018-10-28 21:07:58 -04:00
blitzmann
63115a7c0f Recalc fit after removing implants (and undoing removal) 2018-10-28 21:07:12 -04: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
Ryan Holmes
f854627888 Merge pull request #1776 from pyfa-org/release/v2.5.1
release 2.5.1
2018-10-15 21:22:25 -04:00
blitzmann
5ec8468d3f release 2.5.1 2018-10-15 21:21:53 -04:00
Ryan Holmes
0da4e4359b Merge pull request #1772 from tron1point0/issue/pyfa-org/1769
Try loading smaller variants if scaled icons are missing
2018-10-15 21:11:02 -04:00
Tron
c5e8742838 More flake8 fixes. 2018-10-15 06:00:15 -05:00
Tron
f9f90852c5 Merge branch 'master' into issue/pyfa-org/1769 2018-10-15 05:59:42 -05:00
Traian Nedelea
6b5f2450ad Merge pull request #1 from pyfa-org/master
Pull from upstream.
2018-10-15 05:59:27 -05:00
DarkPhoenix
4f2e962a46 Blow sig of command destroyers which are using MJFG 2018-10-15 13:55:14 +03:00
Tron
05ce8fbf1c Fixed flake8 complaints. 2018-10-15 05:44:22 -05:00
Tron
929b2dfb38 Factored out scaled image loading into a method so CodeClimate (hopefully) stops complaining about cognitive complexity. 2018-10-15 05:35:28 -05:00
Ryan Holmes
659e0e5ead Merge pull request #1774 from pyfa-org/issue/1773
Support changing variation for drones #1773
2018-10-14 23:27:31 -04:00
blitzmann
7bb44f6473 Support changing variation for drones #1773 2018-10-14 23:26:56 -04:00
Tron
60f024fdb7 Try loading smaller variants if scaled icons are missing. pyfa-org/Pyfa/#1769 2018-10-14 15:47:58 -05: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
Ryan Holmes
da601c9a63 Merge pull request #1770 from pyfa-org/issue/1769
Don't include 2x version of icons that don't have a larger version.
2018-10-13 20:50:39 -04:00
blitzmann
7464de06b1 Don't include 2x version of icons that don't have a larger version. 2018-10-13 20:49:56 -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
Ryan Holmes
20fbda9e7a Merge pull request #1768 from pyfa-org/issue/1767
Check to make sure the bitmap exists before converting to image.
2018-10-12 23:59:22 -04:00
blitzmann
15bbf69fcf Check to make sure the bitmap exists before converting to image. 2018-10-12 23:58:51 -04:00
Ryan Holmes
677a9b33c5 Merge pull request #1766 from pyfa-org/issue/1758
Don't run implant toggle when there is not fit loaded
2018-10-11 22:27:26 -04:00
blitzmann
e9efdcd4e8 Don't run implant toggle when there is not fit loaded 2018-10-11 22:27:07 -04:00
Ryan Holmes
c3b0b7d1e1 Merge pull request #1765 from pyfa-org/hotfix/2.5.0
fix issue with pyinstaller not finding correct modules
2018-10-11 22:02:59 -04:00
blitzmann
d46a2d61bb fix issue with pyinstaller not finding correct modules 2018-10-11 22:02:36 -04:00
Ryan Holmes
673a2e25e3 Merge pull request #1764 from pyfa-org/release/v2.5.0
Release/v2.5.0
2018-10-11 21:17:23 -04:00
blitzmann
749adb9ec8 update efsport 2018-10-11 21:16:12 -04:00
blitzmann
5cab8b1070 Merge remote-tracking branch 'origin/master' into release/v2.5.0-1
# Conflicts:
#	service/efsPort.py
2018-10-11 21:15:15 -04:00
blitzmann
00637f84cb update version 2018-10-11 21:12:07 -04:00
blitzmann
bc5a43bfb3 tox fixes 2018-10-11 21:08:26 -04:00
blitzmann
723ef5c48d Merge branch 'maxGroupFix' into release/v2.5.0-1 2018-10-11 00:50:43 -04:00
blitzmann
53c1a77aeb Add effect for emergency hull energizer 2018-10-11 00:47:41 -04:00
DarkPhoenix
e5389d44d9 Make mass entangler active 2018-10-10 10:42:12 +03: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
54b2e5b5fb update renders and icons 2018-10-09 18:38:05 -04:00
blitzmann
1276016a98 Reintroduce the check states functionality to the AddModule and ChangeState commands 2018-10-09 18:19:29 -04:00
blitzmann
7374b00883 Convert Attributes to HyperTreeList 2018-10-09 01:06:11 -04:00
blitzmann
c54d0dc5ff add dynamic attribute miner to dump 2018-10-08 22:32:26 -04:00
Ryan Holmes
fc0bfd83b2 Merge pull request #1754 from MaruMaruOO/master
Small efs export update.
2018-10-08 16:54:21 -04:00
blitzmann
42620c842e added some icons 2018-10-08 13:43:06 -04:00
blitzmann
fd3b3f98bf Bumped version to 1398728 2018-10-08 13:38:52 -04:00
blitzmann
fd7c5c1580 Remove some old debugging prints 2018-10-08 12:50:07 -04:00
blitzmann
c0922adfb2 Merge branch 'hd-images' into release/v2.5.0 2018-10-08 12:44:04 -04:00
blitzmann
1454cd8a0d Merge remote-tracking branch 'origin/development' into release/v2.5.0 2018-10-08 12:40:23 -04:00
MaruMaruOO
3e249ec155 Minor lint and EFS export maxRange bug fix. 2018-09-28 23:36:18 -04:00
MaruMaruOO
edfbf71958 EFS export version bump 2018-09-27 03:06:00 -04:00
MaruMaruOO
4876ff7035 Merge branch 'master' into efs_port 2018-09-27 02:52:49 -04:00
MaruMaruOO
d5034c9e0d Add HIC points to EFS export. 2018-09-27 02:50:28 -04:00
Ryan Holmes
9ec54c9004 Merge pull request #1751 from pyfa-org/issue/1750
Fix for #1750 - when sorting items in the item compare, items without…
2018-09-26 18:17:55 -04:00
blitzmann
0749e03211 Fix for #1750 - when sorting items in the item compare, items without that attribute cause an error due to None / int comparison 2018-09-26 18:17:28 -04:00
Ryan Holmes
e03adad23a Merge pull request #1749 from pyfa-org/issue/1656
Update DPS as factor in reload setting in preferences changes
2018-09-25 21:14:59 -04:00
blitzmann
9b3ba8c9aa Update DPS as factor in reload setting in preferences changes 2018-09-25 21:14:37 -04:00
Ryan Holmes
85746cd681 Merge pull request #1748 from pyfa-org/issue/1447
Fix an issue in which left up event was triggered after selecting a f…
2018-09-25 21:04:18 -04:00
blitzmann
2e64280403 Fix an issue in which left up event was triggered after selecting a file in a file dialog (#1447) 2018-09-25 21:03:51 -04:00
Ryan Holmes
d7b81ea87d Merge pull request #1747 from pyfa-org/issue/1746
Fix for localized fliament abyssal effect
2018-09-25 20:31:35 -04:00
blitzmann
f4404e2649 Fix for localized fliament abyssal effect 2018-09-25 20:29:48 -04:00
DarkPhoenix
f598e8e3c2 Fix couple of price-related bugs 2018-09-19 04:51:14 +03:00
Ryan Holmes
27488a0260 Merge pull request #1738 from m-sasha/missile-ammo-picker-fix
Fixed missile module ammo picker not showing damage type icons.
2018-09-17 00:30:06 -04:00
Ryan Holmes
c53e7964bf Merge pull request #1741 from pyfa-org/codeCleanup
Code cleanup
2018-09-17 00:04:23 -04:00
Ryan Holmes
3516d6fdc5 Merge pull request #1740 from pyfa-org/issue/1730
Add missing entosis link effect
2018-09-17 00:01:24 -04:00
blitzmann
69af1440ae Add missing entosis link effect 2018-09-17 00:00:42 -04:00
blitzmann
31c3101d6d Remove redundant parenthesis 2018-09-16 01:11:16 -04:00
blitzmann
5850026aa9 docstring fixes 2018-09-16 01:09:55 -04:00
blitzmann
b4b8a158f5 Bunch of import optimizations 2018-09-16 00:05:36 -04:00
blitzmann
5c6303995d Replace set() with a literal 2018-09-15 23:44:32 -04:00
blitzmann
f0353a7dd7 some dict cleanup 2018-09-15 23:44:16 -04:00
blitzmann
1fb19e3b94 Merge remote-tracking branch 'origin/master' into development 2018-09-15 23:41:49 -04:00
Ryan Holmes
1788b32b83 Merge pull request #1727 from pyfa-org/commandRefactor
Undo/Redo (refactoring into command pattern)
2018-09-15 23:41:06 -04:00
blitzmann
621672bf34 Some tox fixes 2018-09-15 20:38:08 -04:00
blitzmann
b08406b7d6 Move the FitRenameCommand command 2018-09-15 17:46:55 -04:00
Ryan Holmes
6211d1de70 Merge pull request #1728 from pyfa-org/errorDialogFixes
Add pyfa and eve data version to error dialog
2018-09-15 17:30:49 -04:00
Ryan Holmes
916b11deb8 Merge pull request #1735 from m-sasha/crisp-text
The text drawn in chrome_tabs is now crisp on Retina screens
2018-09-12 20:50:56 -04:00
Alexander Maryanovsky
8e41a90f57 Fixed missile module ammo picker not showing damage type icons. 2018-09-12 23:54:02 +03:00
blitzmann
9aa2b17ae6 commit all the new things! 2018-09-11 19:50:25 -04:00
blitzmann
7f02a078fd Fix some import issues, and save the scale factor on the BitmapLoader class (since it probably won't be changing?) 2018-09-11 19:48:02 -04:00
blitzmann
07b6c9c437 tweak icons script to save scaled versions of images 2018-09-11 19:47:14 -04:00
Alexander Maryanovsky
7c7650ac07 BitmapLoader.getBitmap will now load a @2x (or whatever the main window's content scale is) bitmap, if one is available. 2018-09-11 23:40:18 +03:00
Alexander Maryanovsky
4e399f9bbb The text drawn in chrome_tabs is now crisp on Retina screens 2018-09-11 14:42:37 +03:00
blitzmann
12b11d57ba Merge remote-tracking branch 'origin/development' into commandRefactor 2018-09-03 17:28:35 -04:00
blitzmann
bea7102a3f Merge remote-tracking branch 'origin/master' into commandRefactor 2018-09-03 17:26:26 -04:00
Ryan Holmes
b77a577c06 Merge pull request #1725 from pyfa-org/issue1722
Make sure small abyssal nos has a type name (bad eve data)
2018-09-01 18:12:52 -04:00
blitzmann
c5aab07d65 Make sure small abyssal nos has a type name (bad eve data) 2018-09-01 18:12:16 -04:00
Ryan Holmes
362ae72183 Merge pull request #1724 from pyfa-org/abyssal_export
Abyssal export
2018-09-01 18:04:55 -04:00
blitzmann
6f5d0453a6 Added import of Port, which has a method that XML import uses. Importing inside the function to avoid circular import 2018-09-01 18:02:04 -04:00
blitzmann
c552f6a1d4 formatting fixes 2018-09-01 17:54:10 -04:00
Ryan Holmes
99a8b03697 Add pyfa and eve data version to error dialog 2018-09-01 03:01:42 -04:00
Ryan Holmes
9d63946aa7 Merge pull request #1715 from pyfa-org/priceFix
Price callback fix
2018-08-30 23:05:41 -04:00
blitzmann
6eba2b1abd Merge remote-tracking branch 'origin/master' into development 2018-08-30 21:24:10 -04:00
DarkPhoenix
b05f1573c6 Fix log messages 2018-08-30 21:41:50 +03:00
DarkPhoenix
f4311d1cef Remove object which we don't actually need 2018-08-30 21:39:28 +03:00
DarkPhoenix
8abad416bd Split multibuy into its own file as well 2018-08-30 16:23:20 +03:00
DarkPhoenix
52dbd8d9ef Fix few export/import functions 2018-08-30 16:17:56 +03:00
DarkPhoenix
4e5a70993e Split XML facilities into their own file as well 2018-08-30 16:15:23 +03:00
DarkPhoenix
dd0fbfddb9 Split ESI stuff into its own file 2018-08-30 15:57:59 +03:00
DarkPhoenix
02e35181d5 Move out DNA format into separate file 2018-08-30 15:46:29 +03:00
DarkPhoenix
302cab54fd Get rid of PortProcessing object 2018-08-30 15:23:24 +03:00
DarkPhoenix
ba157af496 Allow format to have no space between: ship name - fit name; module name - charge name; module spec - offline suffix; module spec - mutastats reference
This fixes import of modules with charges from zkb and few other issues
2018-08-30 14:25:40 +03:00
blitzmann
d1e6647d1f Don't show/hide options box, move options to under EFT, and simply disable them when EFT not selected 2018-08-30 00:07:37 -04:00
DarkPhoenix
0a47fba107 Move import/export facilities to their own folder 2018-08-28 19:00:39 +03:00
DarkPhoenix
3faa57f39a Remove debugging log requests 2018-08-26 11:10:14 +03:00
Ryan Holmes
75333264a7 Merge pull request #1710 from minlexx/master
Fix parsing system proxy var containing "user:password@" part
2018-08-25 22:22:32 -04:00
blitzmann
e7d846063d Fix for #1714 - was sending in the entire module, not just the position 2018-08-25 19:33:30 -04:00
blitzmann
c2b7cc00dd Fix for #1713 - should look at Fit.processors, not Fit.__class__.processors - artifact from a rewrite 2018-08-25 19:28:34 -04:00
blitzmann
a107171543 Fix for #1712 - instead of adding module (which is a simple append), we must replace module (where we give it a position) 2018-08-25 19:24:41 -04:00
blitzmann
79be16114d fix 2018-08-25 19:12:42 -04:00
blitzmann
c530660132 Save last export setting 2018-08-25 19:01:49 -04:00
blitzmann
ebe0efac81 First bit of work for GUI support for abyssal export. 2018-08-25 17:24:08 -04:00
DarkPhoenix
18ee37d8fd Fix small oversight 2018-08-25 19:30:48 +03:00
DarkPhoenix
f2c2e2e65a Implement mutated attributes import 2018-08-25 19:27:03 +03:00
DarkPhoenix
93f1a18b37 Respect spaces between the modules during import 2018-08-25 17:42:19 +03:00
DarkPhoenix
44aed364b7 Fix oversight which broke dronebay/fighterbay/cargo detection 2018-08-25 16:21:28 +03:00
DarkPhoenix
eb8fa2f259 Rework EFT importing 2018-08-25 16:03:45 +03:00
DarkPhoenix
a8c69abc72 Move EFT import/export related functions to separate file 2018-08-25 11:06:33 +03:00
DarkPhoenix
2dd1ddddd5 Further rework of import function 2018-08-24 18:57:42 +03:00
DarkPhoenix
4a27c60486 Clean up the fit being imported before parsing 2018-08-24 13:25:41 +03:00
DarkPhoenix
66d559306f Avoid doing too wide lines 2018-08-24 10:03:44 +03:00
DarkPhoenix
83222489c4 Condense code a bit more 2018-08-24 10:01:31 +03:00
DarkPhoenix
0a2fa62e21 Fix misplaced comment 2018-08-24 09:55:32 +03:00
DarkPhoenix
6240f23c02 Enumerate mutated modules based on their export order rather than how pyfa order, and round attribute values to avoid float errors 2018-08-24 09:54:03 +03:00
blitzmann
13498e9b35 bump 2018-08-23 21:46:13 -04:00
blitzmann
ca30025be0 Merge tag 'v2.4.0' into commandRefactor
# Conflicts:
#	gui/builtinViews/fittingView.py
#	service/fit.py
2018-08-23 21:15:28 -04:00
blitzmann
97ef231711 fix price callbacks 2018-08-23 21:10:59 -04:00
DarkPhoenix
82d8c95d2f Rework export format for abyssal mods, now uses references 2018-08-23 19:22:24 +03:00
Alexey Minnekhanov
dde5ee3701 Fix parsing system proxy var containing "user:password@" part 2018-08-23 11:15:33 +03:00
DarkPhoenix
44a3cb3b2e Add ability to export mutated module attributes 2018-08-22 19:54:52 +03:00
DarkPhoenix
44c58abe81 Rewrite EFT export function
Now uses double blank lines to divide logical sections, and racks within these sections (mods/rigs/subs, drones/fighters, implants/boosters) and sorts unordered containers for export
2018-08-22 18:51:31 +03:00
Ryan Holmes
7055690805 Merge pull request #1705 from pyfa-org/release/v2.4.0
Release/v2.4.0
2018-08-21 20:45:51 -05:00
blitzmann
116dde3f3f Bump release 2018-08-21 21:45:35 -04:00
Ryan Holmes
daef1ebdfd Merge branch 'master' into release/v2.4.0 2018-08-21 20:43:27 -05:00
Ryan Holmes
5c38ab4228 Merge pull request #1688 from MaruMaruOO/efs_port
Adds copy to clipboard for Eve Fleet Simulator
2018-08-21 20:43:13 -05:00
Ryan Holmes
299243c446 Merge pull request #1689 from MaruMaruOO/issue/1683
Update market.service to reflect new booster market groups.
2018-08-21 20:34:48 -05:00
Ryan Holmes
970c3a5473 Merge branch 'master' into efs_port 2018-08-21 20:21:16 -05:00
Ryan Holmes
bc63eaa876 Merge pull request #1704 from feyyd/bug/1692
Bug/1692
2018-08-21 20:14:44 -05:00
Ryan Holmes
78de723b81 Merge pull request #1701 from feyyd/bug/1691
Bug/1691
2018-08-21 20:12:57 -05:00
Ryan Holmes
dbb9823df5 Merge pull request #1697 from feyyd/bugfix-1695
Bug/1695, Bug/1690
2018-08-21 20:06:15 -05:00
blitzmann
95899548e5 Fix an issue with double forward slashes in res paths (#1703) 2018-08-21 20:58:38 -04:00
blitzmann
2a076292da pep8 2018-08-21 20:48:30 -04:00
blitzmann
308fa3c46c Update effect headers 2018-08-21 20:47:56 -04:00
blitzmann
ccd6d357ed New icons 2018-08-21 20:45:16 -04:00
blitzmann
21b6a2cdfd Update for new effects and ships 2018-08-21 20:44:46 -04:00
DarkPhoenix
ccbd0a117b Fix merge issue 2018-08-21 19:51:56 +03:00
DarkPhoenix
6caa79c951 Merge master into singularity 2018-08-21 19:43:41 +03:00
DarkPhoenix
4365da8292 Merge branch 'master' into singularity 2018-08-21 19:40:39 +03:00
DarkPhoenix
ff222b8d62 Some fixes to DB conversion script 2018-08-21 19:39:07 +03:00
Ryan Holmes
180b766b59 Merge branch 'master' into development 2018-08-21 00:45:15 -04:00
P
b4e765abfa add None checks in deleteFit to prevent exceptions 2018-08-20 21:41:50 -07:00
P
2f40365a03 default return of getModifiedAttr so can use comparison 2018-08-19 17:42:55 -07:00
P
2001a395e5 extra check, swap instead of clone if unique module 2018-08-19 17:28:24 -07:00
blitzmann
7e94914f65 Implement drone toggle command 2018-08-18 01:09:37 -04:00
blitzmann
b17314f3c6 Add projected drone change command, and remove some prints 2018-08-18 00:45:26 -04:00
blitzmann
fd83a4b709 Remove drone splitting / merging, and introduce drone change qty 2018-08-18 00:39:05 -04:00
blitzmann
a37fdf48c8 Fix implant / booster toggles, add qty change commands, started dinking with drone stacks, although think I might remove this altogether in favor of a qty change 2018-08-18 00:06:50 -04:00
Ryan Holmes
5ee8e203db Merge branch 'commandRefactor' of https://bitbucket.org/blitzmann/pyfa-playground into commandRefactor 2018-08-16 23:41:19 -04:00
Ryan Holmes
083b34c780 working commit 2018-08-16 23:40:50 -04:00
P
6c12e1c5fc fix bug issue 1690 as well 2018-08-15 22:23:35 -07:00
blitzmann
bcbed3df39 Fix an issue which caused pyfa to crash (turns out instantiating the commands in the init was not a good idea) 2018-08-16 00:24:31 -04:00
P
083b618b71 1695 fixes + tox test fixes 2018-08-15 20:38:05 -07:00
blitzmann
3d4b41d135 Move deprecated methods to a base class - will remove this eventually, want to keep Fit clean 2018-08-14 01:31:59 -04:00
blitzmann
eeb2b019c0 Remove the crap from meta swap that was already reimplemented, leaving only drones as a reminder on what needs to be done 2018-08-14 01:26:17 -04:00
blitzmann
71257b5265 Implement some various toggles as commands 2018-08-14 01:25:36 -04:00
blitzmann
a5a152d395 Move meta swap functionality to command process 2018-08-14 00:58:50 -04:00
Ryan Holmes
f0983c1468 Implement fighter add/remove commands 2018-08-13 19:35:32 -04:00
Ryan Holmes
513e9d14d8 Moved the default fighter ability to the __init__() 2018-08-13 18:53:30 -04:00
Ryan Holmes
efbf2e7432 Make sure we recalc during swaps from cargo to module 2018-08-13 18:50:00 -04:00
Ryan Holmes
646a903f18 differentiate command processors based on fitID 2018-08-13 17:16:00 -04:00
Ryan Holmes
d74f2b2e42 Rework the logic of dragging module to cargo 2018-08-13 17:01:16 -04:00
Ryan Holmes
9977866eb0 work on moving from cargo to modules (including swapping modules) 2018-08-13 15:03:19 -04:00
Ryan Holmes
008d73e605 Finish off commands for cargo to module action 2018-08-13 02:01:16 -04:00
Ryan Holmes
2164588329 projected drone commands 2018-08-12 17:49:58 -04:00
Ryan Holmes
391c3a32a6 commands for add / remove projected fighters 2018-08-10 13:29:26 -04:00
Ryan Holmes
bd975becf1 Continue work on projections (adding/removing projected environment and fit) 2018-08-10 12:47:51 -04:00
Ryan Holmes
d6b280d3cc Working commit for adding / removing projected modules / environments 2018-08-09 15:52:34 -04:00
Ryan Holmes
56ebb2926d Merge remote-tracking branch 'bitbucket/commandRefactor' into commandRefactor 2018-08-05 11:06:45 -04:00
Ryan Holmes
804d90c50c Don't run adding command on implants and boosters if item is already item 2018-08-05 08:17:24 -04:00
Ryan Holmes
326e1e04c2 Reworked slot-copying logic so that we can call it explicitly outside the append. Needed for the fitting commands to know what the previous item ID was that it's replacing. 2018-08-05 08:14:12 -04:00
blitzmann
0f4f8c636d Start working on projections 2018-08-04 22:10:14 -04:00
blitzmann
425c7f657c Do command fit toggle. Still need to settle on the logic for how to handle deleted fits - seems there's an issue with the queue. 2018-08-03 22:30:09 -04:00
blitzmann
3c7f0258df More converting for command fits 2018-08-03 21:19:51 -04:00
Ryan Holmes
7a1b4b4a1e Merge remote-tracking branch 'bitbucket/commandRefactor' into commandRefactor
# Conflicts:
#	gui/fitCommands/__init__.py
2018-08-03 16:11:52 -04:00
Ryan Holmes
fcc53d3f21 Add commands for booster and command fits 2018-08-03 16:10:27 -04:00
blitzmann
15ba5c8ace Convert tactical mode switching 2018-08-03 02:01:42 -04:00
blitzmann
6057a1a7d9 Fix issue with setting None charge 2018-08-03 02:01:26 -04:00
blitzmann
e0add506c9 Merge branch 'commandRefactor' of https://bitbucket.org/blitzmann/pyfa-playground into commandRefactor 2018-08-03 01:42:36 -04:00
blitzmann
aa282990a5 Fix the state change command to not store the modules themselves, but the positions 2018-08-03 01:42:20 -04:00
blitzmann
1686220523 Fix the state change command to not store the modules themselves, but the positions 2018-08-03 01:42:06 -04:00
blitzmann
c84c79c917 More tweaks to existing commands 2018-08-03 01:08:33 -04:00
blitzmann
36b158637c Some documentation 2018-08-02 23:23:52 -04:00
blitzmann
fc153915b6 More work on commands, this time focusing on details with module add / remove functionalities. 2018-08-02 02:06:03 -04:00
blitzmann
098f0f92ee Fix issue with layout-modifying modules (need to build fill() into the recalc itself at some point) 2018-07-31 21:29:59 -04:00
blitzmann
cfb7a70da5 Add recalcs to Add and remove module 2018-07-30 00:05:00 -04:00
blitzmann
984978a80d move some files around and create a context manager for fit recalclation 2018-07-28 00:07:10 -04:00
blitzmann
dd430bc9bb Implant and cargo conversions 2018-07-27 23:54:41 -04:00
blitzmann
b724e5bec1 Set up commands for adding/removing cargo 2018-07-27 00:43:47 -04:00
MaruMaruOO
1f09494df5 Merge branch 'master' into efs_port 2018-07-27 00:32:23 -04:00
MaruMaruOO
d9827b445f Add versioning data to EFS export 2018-07-27 08:03:21 -04:00
MaruMaruOO
46e58ecba7 Add module typeIDs to data exported by efsPort 2018-07-27 06:51:53 -04:00
MaruMaruOO
c1405fa675 More getter swapping for efsPort 2018-07-26 17:39:32 -04:00
MaruMaruOO
b7900b0b25 Change more efsPort syntax to use getters 2018-07-26 17:27:03 -04:00
MaruMaruOO
bef8fbbc3a Used getModifiedItemAttr in efsPort to replace itemModifiedAttributes for consistancy 2018-07-26 14:24:55 -04:00
MaruMaruOO
4fc630d44e Minor efsPort linting 2018-07-26 12:02:04 -04:00
MaruMaruOO
582a3893d1 Removed unneeded initalization from efsPort 2018-07-26 11:48:34 -04:00
MaruMaruOO
03e325cdcb Change efsPort.getOutgoingProjectionData to corectly use mod.item.group.name 2018-07-26 11:23:39 -04:00
blitzmann
7f8ad3885d Create isCharge property 2018-07-26 01:16:29 -04:00
blitzmann
0d32b60f7e Convert module swap / clone to fit / gui commands 2018-07-26 00:31:38 -04:00
blitzmann
53f6d43109 Migrate over the ammo setting stuff to fit/gui commands 2018-07-25 22:50:43 -04:00
blitzmann
dd6fe01df5 Migrate module state change to gui/fit command pattern 2018-07-25 22:24:57 -04:00
blitzmann
1f9024a740 Move getProposedStatefrom fit service to module class 2018-07-25 22:23:50 -04:00
blitzmann
65c568bd95 Move some module state mapping definitions to the module file and add deprecation flags some sFit functions (will be moving to module / commands) 2018-07-25 22:02:51 -04:00
blitzmann
9ccdb51063 remove some logging tweaks 2018-07-25 00:58:11 -04:00
blitzmann
d5aeb0913d Start refactoring the refactor that was started with command pattern refactoring.
Instead of attempting to keep all the Fit service functionality, move these into specific "Fitting Commands" that are designed to define a unit of work and it's undo. Then, we will have "GUI Commands" which are defined as actions taken by the user themselves - these will usually use one or more "Fitting Commands".
2018-07-24 01:29:57 -04:00
MaruMaruOO
38726675e1 Added disintegrator stats 2018-07-23 20:28:53 -04:00
Ryan Holmes
622a3004c5 Merge pull request #1687 from MaruMaruOO/issue/1684
Have imported fits always use implants if present
2018-07-22 19:32:24 -04:00
blitzmann
2ccad2a358 Handle use case of moving a module from market to fitting view 2018-07-21 19:52:28 -04:00
blitzmann
a66eb059e2 Convert module swap to command pattern 2018-07-21 18:20:24 -04:00
blitzmann
5d0342ee2d Convert module charge handling to command pattern (adding charges and removing charges) 2018-07-21 18:04:07 -04:00
blitzmann
ec3cd75f4c Convert the context > Remove Module to command pattern 2018-07-21 16:00:02 -04:00
blitzmann
9309ddff07 Created undo/redo command for module remove, along with reapplying some module-specific attributes (state, charge). Fixed a bug when trying to add a module that doesn't fit 2018-07-21 15:34:58 -04:00
blitzmann
0c3fa53bcf Support undo/redo module add 2018-07-21 14:46:25 -04:00
blitzmann
926e0a9035 Start working on some undo / redo functionality. this is just the start, only module state changes and fit rename is implemented, and probably not very well x_x 2018-07-21 00:12:28 -04:00
MaruMaruOO
fe0266e517 Added mitigation for outdated forced groupMarketIDs 2018-07-19 05:40:18 -04:00
MaruMaruOO
0a8bb79e47 Update market.service to reflect new booster market groups 2018-07-19 13:16:59 -04:00
blitzmann
e9cb7696dd Fix an issue for Polycarbon Engine Housing (#1682) 2018-07-19 00:03:17 -04:00
MaruMaruOO
c054a2d80d Trivial lint 2018-07-17 23:09:39 -04:00
MaruMaruOO
2f7a3e0287 Have imported fits always use implants if present 2018-07-17 22:35:09 -04:00
MaruMaruOO
6be77646fc Linting for consistancy 2018-07-17 22:32:30 -04:00
MaruMaruOO
a6a0831123 Removed uneeded file 2018-07-17 21:03:39 -04:00
MaruMaruOO
682607c31f Remove local build files not intended for git 2018-07-17 21:01:26 -04:00
MaruMaruOO
c0096fc016 Revert irrelevent changes compared to master 2018-07-17 20:46:15 -04:00
MaruMaruOO
ebac100e38 Adjusted EFS to clipboard tooltip 2018-07-17 04:22:40 -04:00
MaruMaruOO
fe43c2ee2e Merge branch 'master' into efs_port 2018-07-17 03:06:34 -04:00
MaruMaruOO
b1f1db1bee Change service.efsPort to a class structure for consistancy. 2018-07-17 02:54:01 -04:00
blitzmann
df75646766 bump release 2018-07-17 02:10:24 -04:00
Ryan Holmes
6270d34dfd Merge pull request #1677 from MaruMaruOO/issue/1673
Have missing icons display as question mark icons
2018-07-16 21:00:10 -04:00
Ryan Holmes
497fdd7a11 Merge pull request #1675 from MaruMaruOO/port_bug_fix
Bug fix to set implantLocation when importing fits
2018-07-16 12:09:58 -04:00
MaruMaruOO
6583aa9b34 Have missing icons display as question mark icons 2018-07-16 10:26:29 -04:00
MaruMaruOO
910fe99e44 Bug fix to set implantLocation when importing from clipboard 2018-07-16 08:43:41 -04:00
MaruMaruOO
4be78db738 Added additional data to efs exports moduleNames and moved it to service.efsPort 2018-07-16 06:25:56 -04:00
MaruMaruOO
897763e8d5 Merge branch 'master' into py3EFFS 2018-07-16 04:01:08 -04:00
blitzmann
fc921d2c16 Bump version 2018-07-15 17:44:13 -04:00
blitzmann
b57bede510 tox fixes 2018-07-15 02:51:53 -04:00
blitzmann
d4f719a428 Merge branch 'master' of https://github.com/pyfa-org/Pyfa 2018-07-15 02:38:08 -04:00
Ryan Holmes
6f8ff9255a Merge pull request #1660 from flashspys/patch-2
Make pyfa retina ready
2018-07-15 02:29:46 -04:00
Ryan Holmes
79d4b458c8 Merge pull request #1668 from MaruMaruOO/issue/1667
Added setting for default implant location
2018-07-15 02:29:29 -04:00
Ryan Holmes
c7d9c0e0e0 Merge pull request #1671 from MaruMaruOO/copy_improvements
Added missing data to fit copying
2018-07-15 02:29:00 -04:00
blitzmann
b7be0d0dfb fix database (give name to Small Abyssal Energy Nosferatu - this is a known EVE bug) 2018-07-15 02:20:28 -04:00
blitzmann
475e8f1ff2 Update effect headers and some icons 2018-07-15 01:09:07 -04:00
blitzmann
9298dcd454 Update to 1348988 2018-07-15 00:54:50 -04:00
blitzmann
3b13712db1 Add missing effect 2018-07-15 00:47:50 -04:00
blitzmann
df92b857c9 Add a script to extract the dynamic attribute mappings from the client 2018-07-15 00:47:26 -04:00
MaruMaruOO
d5aee34aa8 Added missing data to fit copying 2018-07-12 07:35:14 -04:00
MaruMaruOO
7a4c7a8f9f Removed excess diagnostic information 2018-07-11 10:28:39 -04:00
Maru Maru
1699b8ceee Add ability to use character implants by default 2018-07-11 05:35:19 -04:00
Maru Maru
f624528ce5 trivial line movement 2018-07-11 02:50:50 -04:00
Maru Maru
c0e9878982 Merge branch 'master' into py3EFFS 2018-07-11 02:23:01 -04:00
Maru Maru
7a078f433a draft of misc patches for main branch 2018-07-11 12:05:57 -04:00
blitzmann
89efa9cbf9 Fix syntax issue (see #1657) 2018-07-09 22:59:26 -04:00
Ryan Holmes
786864b146 Merge pull request #1663 from MaruMaruOO/patch-1
Fixes the Helios's drone damage bonus.
2018-07-09 22:17:22 -04:00
Ryan Holmes
8383a645da Merge pull request #1652 from WatchMeCalculate/Issue-1621
Address Issue where evemon xml was not being imported
2018-07-09 22:16:07 -04:00
Ryan Holmes
1c579c9134 Merge pull request #1665 from MaruMaruOO/issue/1662
Allow drone skill effects to process implants
2018-07-09 22:12:33 -04:00
Ryan Holmes
b8c09429db Merge pull request #1664 from MaruMaruOO/patch-2
Typo fix for eos.gamedata.translations["Boolean"]
2018-07-09 22:10:21 -04:00
Ryan Holmes
090b61778f Merge pull request #1666 from MaruMaruOO/issue/1657
Make itemStats.closeBtn fire a wx.CloseEvent
2018-07-09 22:07:32 -04:00
MaruMaruOO
29541bc5d9 Make itemStats.closeBtn fire a close event 2018-07-09 05:51:23 -04:00
MaruMaruOO
3fcad7ed3f Allow drone skill effects to process implants 2018-07-09 01:37:40 -04:00
MaruMaruOO
fe951e2ca1 Typo fix for eos.gamedata.translations["Boolean"]
Fix for #1659.
I assume the second argument is a typo given the use case.
If not giving it a default value also works.
2018-07-08 21:44:55 -04:00
MaruMaruOO
0603e0c89d Fixes the Helios's drone damage bonus.
The required skill should be Light Drone Operation as light drones don't require Drone Avionics.
This causes the damage bonus to apply correctly. Giving a max skill Hobgoblin II 29.7dps rather than 19.8dps.
2018-07-06 23:41:34 -04:00
Maru Maru
da5893ac91 Merge branch 'master' into py3EFFS 2018-07-06 04:26:48 -04:00
Maru Maru
7af5c17015 Changed the name of Eve Fleet Fight Simulator to Eve Fleet Simulator and updated refs to match 2018-07-06 14:01:54 -04:00
Felix Wehnert
9f580597fd Make pyfa retina ready
This should help pyfa to look better on macOS 📺
2018-07-02 18:55:48 +02:00
blitzmann
819c0ba321 Fix eve db 2018-06-21 00:28:15 -04:00
blitzmann
b68e7d9344 Merge branch 'profile' 2018-06-21 00:24:19 -04:00
blitzmann
86333a05fb Remove redundant import 2018-06-21 00:24:07 -04:00
blitzmann
39f7ecdf5c Merge branch 'mutaplasmids'
# Conflicts:
#	eve.db
2018-06-21 00:22:57 -04:00
blitzmann
6c184e9184 Merge branch 'master' of https://github.com/pyfa-org/Pyfa 2018-06-21 00:21:36 -04:00
blitzmann
c587fa1e84 Merge branch 'issue/1645' 2018-06-21 00:21:08 -04:00
DarkPhoenix
1b932fd885 Implants are not penalized 2018-06-19 16:10:41 +03:00
WatchMeCalculate
99f14746e4 Removed return and re-added apiUpdateCharSheet function 2018-06-19 00:16:32 -07:00
blitzmann
6c6423515c Fix for #1635 2018-06-18 20:55:16 -04:00
blitzmann
15216453c9 Update item attributes panel when mutation changes (#1644) 2018-06-17 13:01:54 -04:00
blitzmann
8f16fc5c1e Merge branch 'master' into mutaplasmids
# Conflicts:
#	eve.db
2018-06-17 12:52:49 -04:00
blitzmann
444f42ceee Change CREST export text to ESI 2018-06-17 12:51:57 -04:00
blitzmann
8bf9a9881f Add some invalidation logic to module for Abyysal modules without base or mutaplasmid 2018-06-17 12:23:05 -04:00
blitzmann
8f5060cc3e Fix some issues capping at a certain range (#1651) 2018-06-17 12:10:33 -04:00
blitzmann
b7458396ac Fix some rounding issues (#1651) 2018-06-17 01:48:51 -04:00
blitzmann
d4dba99363 Properly handle projecting an abyssal module (we now copy modules instead of using the same item ID) 2018-06-17 00:04:34 -04:00
blitzmann
710739696a Incorporate mutaplasmids within module copy 2018-06-16 23:25:27 -04:00
blitzmann
5c566bae73 Introduce special cases for cargo swapping when dealing with abyssal modules (#1649) 2018-06-16 21:50:18 -04:00
blitzmann
4e8e5d86c4 Fix for #1647 2018-06-16 17:04:29 -04:00
blitzmann
7e6fc4e6c2 Fix issue with closing item stats 2018-06-16 15:58:30 -04:00
Maru Maru
6bbfb18680 Merge branch 'master' into py3EFFS 2018-06-16 04:52:10 -04:00
Maru Maru
d61ab0ff5a Refactoring for various EFS export code 2018-06-16 04:50:55 -04:00
blitzmann
47016c682e Don't destroy ItemStats window on close. Instead, Skip() the event so that it can finish processing events correctly. (#1650) 2018-06-15 02:27:41 -04:00
blitzmann
eece7de547 Merge branch 'issue/1642' into mutaplasmids 2018-06-15 01:32:03 -04:00
blitzmann
ed94294584 Finish implementing the translated values for the Mutators 2018-06-15 01:31:51 -04:00
blitzmann
634bdab396 Merge branch 'master' of https://github.com/pyfa-org/Pyfa 2018-06-14 22:53:33 -04:00
blitzmann
3462252ecc Automatically check on character load that the character at least has all skills in the database for it (#1645) 2018-06-14 22:53:16 -04:00
blitzmann
5a085b6e27 Automatically check on character load that the character at least has all skills in the database for it (#1645) 2018-06-14 22:52:33 -04:00
blitzmann
12c491a6b3 Merge branch 'mutaplasmids' of https://github.com/pyfa-org/Pyfa into mutaplasmids 2018-06-13 23:11:37 -04:00
Ryan Holmes
4d8240a588 Merge pull request #1643 from burnsypet/mutaplasmids
Added reset and randomize buttons to mutaplasmid view
2018-06-13 23:10:55 -04:00
blitzmann
154b07e0d6 Move the attribute unit translations from the GUI to the Unit class and tweak the display of mutator ranges to use this. Additionally, develop inverse functions to the value translations for eventual use in the mutator slider 2018-06-13 23:10:48 -04:00
burnsypet
59a5b68152 Added reset and randomize buttons to mutaplasmid view 2018-06-13 22:52:36 +01:00
Ryan Holmes
f0a6034cec Merge pull request #1632 from WatchMeCalculate/Issue-#1627
Adds exception handler for when HttpServer fails on init
2018-06-13 00:21:46 -04:00
Ryan Holmes
6224286524 Merge pull request #1639 from burnsypet/issue-1637
HTML export now contains EFT block
2018-06-13 00:20:14 -04:00
Ryan Holmes
eefc84465f Merge pull request #1638 from surculus12/issue-1633
resolves #1633
2018-06-13 00:18:15 -04:00
blitzmann
4fd54ca74a bump beta version 2018-06-12 22:23:57 -04:00
blitzmann
779b9f0821 Fix attribute icons to use new method 2018-06-12 21:51:58 -04:00
blitzmann
3ae10fe483 adding icons 2018-06-12 21:46:31 -04:00
blitzmann
88be999899 update database 2018-06-12 21:46:05 -04:00
blitzmann
6fdcce12a3 Merge branch 'icons-1621' into v2.2.0b1
# Conflicts:
#	eos/db/__init__.py
#	eos/db/gamedata/__init__.py
#	eos/db/gamedata/item.py
#	eos/gamedata.py
#	eve.db
2018-06-12 21:43:28 -04:00
blitzmann
e19d231eba Merge branch 'master' into v2.2.0b1
# Conflicts:
#	eve.db
2018-06-12 21:41:04 -04:00
blitzmann
d4d55c026a tweak font sizes 2018-06-12 21:29:00 -04:00
blitzmann
3ebfe045c5 Catch a rare error with mutators that are kinda orphaned (not via module, but the mod doesn't have base or mutaplasmid) 2018-06-12 21:15:31 -04:00
blitzmann
75230a78a6 Do not explicitly add the mutator to the module. Setting the Mutator.module property is sufficient, and prevents from a duplicate one from being added with a None key. 2018-06-12 20:57:06 -04:00
burnsypet
ab6200e2c1 Fixed line length for PEP8 2018-06-12 20:11:39 +01:00
burnsypet
8a18047957 HTML export now contains EFT block 2018-06-12 19:17:39 +01:00
blitzmann
fccd4b61f4 Recalc fit after a mutator change and 1 sec has passed. This allows for both gui animations to finish and prevent multiple quick changes form clogging everything up) 2018-06-12 01:55:40 -04:00
blitzmann
bceaa0d1d5 Get mutations to save 2018-06-11 23:44:34 -04:00
blitzmann
994521f654 Move some functionality tot he mutator object, and clean some stuff up 2018-06-11 23:09:21 -04:00
surculus12
b7b60e4ea6 resolves #1633 2018-06-11 15:24:17 +00:00
blitzmann
6a03ff59af Attribute graph: add edge on neutral 2018-06-10 02:28:01 -04:00
blitzmann
f8b5adb31d Determine validity via mod, not value (prevents weirdness with negatives) 2018-06-10 01:30:05 -04:00
blitzmann
e8b56b076b Instantiate mutators when a mutated module is created / loaded from DB. Some bug fixes for a few things. 2018-06-10 01:10:53 -04:00
blitzmann
fe47ebd1f5 Merge branch 'attribute_gauge' of https://bitbucket.org/blitzmann/pyfa-playground into attribute_gauge 2018-06-09 20:35:08 -04:00
blitzmann
3b310e9b61 Tweaks to slider logic with respect to negative values 2018-06-09 20:34:59 -04:00
Ryan Holmes
07737a1f6d more refactoring and bug fixes for gui 2018-06-09 11:03:04 -04:00
blitzmann
962789bf63 More tweaks 2018-06-09 09:49:32 -04:00
blitzmann
ab2d6dbf3a Flesh out a lot of the small graphical specifics. Stilll needs a bit of work and a few bugs worked out, but I feel it's coming along. 2018-06-08 22:34:15 -04:00
blitzmann
542f2b3061 More tweaks 2018-06-07 19:38:40 -04:00
WatchMeCalculate
abefe21796 Adds exception handler for when HttpServer fails on init 2018-06-05 23:42:00 -07:00
blitzmann
cc529d3499 Penalized drone velocity rigs (#1630) 2018-06-06 00:25:45 -04:00
blitzmann
aee225d11a Only apply thermodynamics skill to modules with heatDamage attribute 2018-06-05 23:59:01 -04:00
Ryan Holmes
0b45438981 Merge pull request #1626 from WatchMeCalculate/Issue-#1519
Issue #1519, on fitting restriction toggle, accurately keep valid modules
2018-06-05 20:26:16 -04:00
DarkPhoenix
d48f9354ec Update database (vedmak fitting changes) and do relevant string updates
Also change jsontosql script to ignore fsdtypeoverrides which is no longer dumpable by phobos
2018-06-05 20:02:00 +03:00
blitzmann
58b422a6d9 Add a bunch of tests, and get it looking just right. Still need to do some general cleanup 2018-06-05 09:02:15 -04:00
blitzmann
b1dce3b7b6 Changes to attribute slider, and thinking about dropping it in support of a modified pyfa gauge 2018-06-04 22:55:34 -04:00
blitzmann
460ba81d44 Some tweaks to the attribute slider 2018-06-04 19:18:18 -04:00
Ryan Holmes
e01699f738 Add a SetValue method to the attribute slider 2018-06-04 17:24:49 -04:00
blitzmann
c9f555a860 Move the slider to another file (makes it easier to test), and adjust the logic so that the base value is always considered in the center, no matter the skew of the ranges 2018-06-04 02:53:14 -04:00
blitzmann
b3acc8fd21 Get a slider interface going for the items stats. Starting to come together! 2018-06-04 02:21:52 -04:00
blitzmann
3670f3289c Convert a module to an abyssal with a mutaplasmid - saving to and loading from database confirmed. 2018-06-03 19:50:50 -04:00
blitzmann
04171b243b Get the mutaplasmid context men working to display the mutaplasmids 2018-06-03 16:48:31 -04:00
blitzmann
20f57146c4 Merge branch 'master' into mutaplasmids
# Conflicts:
#	eve.db
2018-06-03 16:31:20 -04:00
blitzmann
012c5f536b Add mutaplasmid context menu 2018-06-03 16:29:00 -04:00
blitzmann
3fbd869821 Get some basic relationships added for mutaplasmids 2018-06-03 16:28:33 -04:00
blitzmann
19cf3c2036 Update various GUI things to show new location for ship icon 2018-06-02 14:54:59 -04:00
blitzmann
18bbe49c49 support renders 2018-06-02 14:34:00 -04:00
blitzmann
e806471b47 Run icon script to remove the clothing icons 2018-06-02 14:10:37 -04:00
blitzmann
59d56fc333 Remove clothing form the database 2018-06-02 14:04:34 -04:00
blitzmann
926299c20e Add process for getting graphic ids from fsdbinary (not utilizing them yet) 2018-06-02 11:58:38 -04:00
blitzmann
e8d5e9f9f2 More icons fixes 2018-06-02 10:18:56 -04:00
WatchMeCalculate
a5b5cec919 Fixed flake8 issues 2018-06-01 13:08:25 -07:00
Ryan Holmes
bb978c3dff Implement a profiling option. x_x 2018-06-01 15:46:45 -04:00
WatchMeCalculate
cbb8545c30 If module had previously violated fitting restrictions, but now is a valid module, recolor background 2018-06-01 02:22:29 -07:00
WatchMeCalculate
87660246b6 When re-enabling restrictions only delete incompatible modules
Hardpoints past limit will show up highlighted red.
2018-06-01 02:19:14 -07:00
WatchMeCalculate
cc586f6532 For modules with maxfitting, ensure on validity count, don't count itself 2018-06-01 02:18:03 -07:00
WatchMeCalculate
02103b6d2e Refactor checking if Hardpoints has free spots into a function fit can use 2018-06-01 02:16:29 -07:00
blitzmann
94b1876cf1 icon script tweak 2018-05-31 21:36:22 -04:00
blitzmann
8bb3cbb25e More icon fixes 2018-05-31 21:20:47 -04:00
blitzmann
5388ba7a70 Remove need for Icon class, references to it's DB relationship, and remove from DB. Also, add the files. All the files. 2018-05-31 21:13:12 -04:00
blitzmann
ff1d8109cd Start updating the icons script. You can now point it at an EVE installation and an icons.json, which is generated via the icons.yaml from from the SDE (for now, unless we can figure out how to access that info form the res files. it's in CCPs format).
Lots of old stuff still here, needs cleanup. We no longer restrict the queries to certain categories / groups, seemed like extra logic to remember whenever new stuff is potentially added.
2018-05-31 21:09:35 -04:00
DarkPhoenix
408e1246c7 Reduce font size for chrome tabs 2018-05-31 14:47:38 +03:00
DarkPhoenix
051e601f14 Use system font for fitting pane 2018-05-31 13:26:54 +03:00
blitzmann
fb5849e43e Bump version 2018-05-31 01:03:14 -04:00
blitzmann
367b26816b Add some missing stuffs in the manifest (don't know if needed) 2018-05-31 00:54:54 -04:00
blitzmann
e3bec84d31 Tweaks to the Inno Setup file 2018-05-31 00:44:31 -04:00
blitzmann
d92ccffc8d Test a few fixes for the windows installer 2018-05-31 00:01:36 -04:00
blitzmann
e8efa22a95 Merge branch 'singularity' 2018-05-30 19:49:40 -04:00
blitzmann
861d034635 Bump version 2018-05-30 19:49:21 -04:00
blitzmann
7a18224800 pep8 2018-05-30 19:34:14 -04:00
Ryan Holmes
92a906611b Merge pull request #1619 from fsufitch/master
Tweak jargon defaults for more entries based on personal experience
2018-05-30 15:53:27 -04:00
Filip Sufitchi
6fc532a6a2 Tweak jargon defaults for more entries based on personal experience 2018-05-30 15:31:12 -04:00
blitzmann
d0777602e7 Clean up unused effect files now that the effects script works (hopefully) 2018-05-29 21:49:32 -04:00
blitzmann
618507f88c Fix the effects used by script (no longer restricted on category / group), and fix many effects headers 2018-05-29 21:43:25 -04:00
blitzmann
c5bc9e2534 Added missing effectsm, and update headers 2018-05-29 21:39:11 -04:00
blitzmann
b097818f1b Do not allow import of unpublished items (temporary measure to prevent abyssal items) 2018-05-29 21:01:55 -04:00
blitzmann
ba2471e75c Add new icons files 2018-05-29 20:15:05 -04:00
blitzmann
de7a5361fd Add triglavian icon to ship browser 2018-05-29 19:58:59 -04:00
blitzmann
0827e13b31 Add some missing icons 2018-05-29 19:40:55 -04:00
blitzmann
ec2bf8d4ed Update renders 2018-05-29 19:40:01 -04:00
blitzmann
8ab709e590 * Update database (unpublish Abyssal items, for now)
* Add eve data version and datetime to about window (temp measure until we can get a better about window implemented)
2018-05-29 19:37:55 -04:00
Ryan Holmes
efe974f8f9 Merge pull request #1616 from WatchMeCalculate/issue-#1599
Remove asterisk next to character name after API refresh
2018-05-28 17:55:23 -04:00
WatchMeCalculate
da85c66089 Make sure to clear dirty skills when clearing all skills 2018-05-28 13:33:19 -07:00
blitzmann
a02f863bc8 update database 2018-05-27 17:30:12 -04:00
blitzmann
553a181966 Merge branch 'abysmal_weather' into singularity
# Conflicts:
#	eve.db
2018-05-27 17:25:47 -04:00
blitzmann
4a1e4853fb fix issue with display 2018-05-27 17:25:04 -04:00
blitzmann
9f560584ce Fix fighter DPS graph (#1521) 2018-05-27 16:29:47 -04:00
blitzmann
670f19ce95 fixed attribute export (#1613) 2018-05-27 16:25:10 -04:00
blitzmann
3944545721 Support for Abyssal module loading base item attributes 2018-05-27 14:58:14 -04:00
blitzmann
a706da8adc Remove some of the redundant jargon keywords 2018-05-27 12:12:20 -04:00
Ryan Holmes
829fd12163 Merge pull request #1575 from ftsartek/patch-1
Jargon defaults updated for significantly more options
2018-05-27 12:08:55 -04:00
Maru Maru
f8504cfa6e Merge branch 'master' into py3EFFS 2018-05-27 04:08:42 -04:00
Maru Maru
05e76a884a Partially cleaned up efs utilities 2018-05-27 04:07:21 -04:00
Ryan Holmes
b5addc8a87 Merge pull request #1609 from minlexx/copy_text
Copy text from item traits and desription panels
2018-05-26 22:35:24 -04:00
Alexey Min
8cb592db6f Make item description copyable 2018-05-26 14:34:54 +03:00
Alexey Min
be21fec2d2 Make item traits copyable 2018-05-26 14:34:40 +03:00
blitzmann
154ac6b045 forgot the DB 2018-05-25 23:20:36 -04:00
blitzmann
d3bd52fe07 Get dynamic attributes JSON saved to the database... now for the tinkering to begin! 2018-05-25 19:18:51 -04:00
DarkPhoenix
d4beba8b7b Fix ammo picker for disintegrators 2018-05-24 14:35:17 +03:00
DarkPhoenix
4141a9df45 Do not show falloff range if it's too low (disintegrators fetch base value of 1 and show it) 2018-05-24 14:32:35 +03:00
DarkPhoenix
b6181f8ad6 Update db to latest sisi 2018-05-24 09:37:54 +03:00
blitzmann
fabf759aa7 Start implementing support for mutaplasmids.
* There's a new table `mutators` that has an FK back to a module, and links to an attribute ID with it's new value
* Fixes an issue in the item state where the "base" value showed the literal base value for the attribute, regardless of override / mutators
* If there is an override and a mutated attribute, mutated value takes effect
2018-05-24 01:26:49 -04:00
blitzmann
c0f34f1117 update database, and a code tweak 2018-05-23 01:12:46 -04:00
blitzmann
5cf9e0c4ff Merge branch 'singularity' into abysmal_weather
# Conflicts:
#	eve.db
2018-05-23 00:49:29 -04:00
blitzmann
33d4a8a691 update database 2018-05-23 00:46:51 -04:00
blitzmann
9268dc36bf Give the abyssal effect name some custom, directed loving. Mmm. 2018-05-23 00:45:11 -04:00
blitzmann
e95cbdd19b Re-work the wormhole (now call Environmental) context menu 2018-05-23 00:38:30 -04:00
blitzmann
c4177f8911 Remove .zip check for img files (no longer part of build, wondering if this is causing slow start up times) 2018-05-22 00:06:06 -04:00
blitzmann
eaae51f8d8 Add status messages back to ESI fitting export (#1502) 2018-05-21 23:37:15 -04:00
blitzmann
9f69c76380 Reimplement support for exporting ESI fittings... whoops (#1593) 2018-05-21 23:23:21 -04:00
blitzmann
2f9d2e2a60 Force command processors not to show (#1562) 2018-05-21 23:15:41 -04:00
blitzmann
f9e60a00f2 Remove the CREST table from a migration, since it no longer exist (was causing issues for some folks with very old databases) 2018-05-21 23:03:25 -04:00
blitzmann
fde449c7d8 more whoops 2018-05-21 22:09:30 -04:00
blitzmann
6b346c4b37 Whoops 2018-05-21 22:08:56 -04:00
blitzmann
aeb1a80e73 fix attempt for #1602 2018-05-21 21:11:51 -04:00
blitzmann
1c359fb6ed tox 2018-05-20 15:58:25 -04:00
blitzmann
a8c57bbdeb Merge branch 'singularity' into abysmal_weather 2018-05-20 15:57:17 -04:00
blitzmann
752c67bc0b tox 2018-05-20 15:57:02 -04:00
blitzmann
e7c826b71c Merge branch 'master' into singularity 2018-05-20 15:56:12 -04:00
blitzmann
2cac214f46 tox 2018-05-20 15:55:26 -04:00
blitzmann
c1f24a1979 Merge branch 'singularity' into abysmal_weather 2018-05-20 15:51:47 -04:00
blitzmann
63e5b6da68 Merge branch 'master' into singularity 2018-05-20 15:51:22 -04:00
blitzmann
23d9e7a91b Fix travis config 2018-05-20 15:50:56 -04:00
blitzmann
7ac4b52d20 Do all localization effects 2018-05-20 15:05:41 -04:00
blitzmann
d110dd4c76 Implement xeon gas and electric store weather effects 2018-05-20 14:33:37 -04:00
blitzmann
a5b959fbf8 Implement caustic and darkness weather 2018-05-20 14:22:58 -04:00
blitzmann
90f1947ea7 Implement caustic weather 2018-05-20 14:14:35 -04:00
blitzmann
afd16e1afd Add new warfareBuffID, and fix issue with going to effect file in debug 2018-05-20 14:10:37 -04:00
blitzmann
bc23417eae Start working on Abysmal space environment effects. The values produced for the infernal weather (calm firestorm) thermic resist penalties are spot on according to my testing. :D 2018-05-20 12:53:33 -04:00
Maru Maru
2a410a13a0 EFS mass export now uses the configured save path for consistancy. 2018-05-20 04:36:20 -04:00
blitzmann
d84525876a Gather abysmal environnments into database 2018-05-20 00:52:48 -04:00
Maru Maru
d5afacef3f Merge branch 'master' into py3EFFS 2018-05-20 00:39:08 -04:00
blitzmann
891c20eea7 Merge branch 'master' into singularity 2018-05-20 00:22:24 -04:00
blitzmann
020cc9e295 Revert "Clean up unused effects"
This reverts commit 842be9535b.
2018-05-20 00:22:14 -04:00
blitzmann
e423c9248a Fixes for some odd markdown2 bugs (#1532) 2018-05-19 23:57:40 -04:00
blitzmann
b138fea245 Tweak rack labels 2018-05-19 17:56:48 -04:00
blitzmann
cb509a832e Add number of slots in the rack heading (#1535) 2018-05-19 17:55:17 -04:00
blitzmann
155a3a4e42 Tweak the ammo sorter to be more consistent, and not go off of calculated values for the modules (which may change based on the current charge) (#1520) 2018-05-19 17:41:04 -04:00
Ryan Holmes
a59949a57a Merge pull request #1578 from minlexx/esi_proxy
Use proxies from Pyfa's "Network settings" for ESI requests
2018-05-19 17:07:57 -04:00
blitzmann
4ba33aa5b8 Fix two structure rig effects related to missile charge bonuses (#1526) 2018-05-19 17:07:01 -04:00
blitzmann
6dbb61dc12 Merge branch 'master' of https://github.com/pyfa-org/Pyfa 2018-05-19 14:53:07 -04:00
blitzmann
f1d3b68308 Bump version 2018-05-19 14:52:58 -04:00
blitzmann
cec61fc225 Some QOL tweaks to the character editor SSO section 2018-05-18 23:41:37 -04:00
blitzmann
caf31517ca Fix attempt for #1560 2018-05-18 01:18:46 -04:00
blitzmann
22edebbf9b More stuff for #1586 2018-05-18 01:18:31 -04:00
blitzmann
806f17f6ea Test fix for #1586 2018-05-17 00:50:17 -04:00
ftsartek
5aa14de0c4 Update defaults.yaml
extra update to include two more american/british english translations
2018-05-17 14:49:00 +12:00
Ryan Holmes
77a5896997 Merge pull request #1584 from minlexx/fix_browse_esi_fittings
Skip fits for unknown ships in "Browse EVE Fittings"
2018-05-15 17:49:41 -04:00
Alexey Min
cc754342c8 Skip fits for unknown ships in "Browsing EVE Fittings" 2018-05-16 00:36:37 +03:00
Alexey Min
63074a2b85 Reduce code duplication:
Network settings class now provides its own method to get proxy settings dict in requests format.
This method can be used both in network service and esi access, reducing code duplication.
2018-05-15 22:13:04 +03:00
Alexey Minnekhanov
bec746b76f Use proxies from Pyfa's "Network settings" for ESI requests 2018-05-15 12:48:18 +03:00
blitzmann
eeb700c75d Get back into tox's good graces 2018-05-15 01:41:32 -04:00
blitzmann
deecfb31dc Merge tag 'v2.0.1' into singularity (bring sisi code up to date with pyfa 2 / py3 / wx4)
# Conflicts:
#	eos/effects/techtwocommandburstbonus.py
2018-05-15 01:17:51 -04:00
blitzmann
9bb83d4574 Merge branch 'master' of https://github.com/pyfa-org/pyfa 2018-05-14 22:08:07 -04:00
blitzmann
8023b2ea29 Bump version 2018-05-14 21:59:25 -04:00
blitzmann
3e1244a27a Fix for not being able to drag fit to tab area (#1569) 2018-05-14 19:26:23 -04:00
blitzmann
51e610830f Fix (not really) an issue with a dead character editor still receiving events 2018-05-14 18:27:53 -04:00
ftsartek
f52d091f9a Updated for significantly more options 2018-05-15 10:05:42 +12:00
blitzmann
a2877f6b5f Merge branch 'master' of https://github.com/pyfa-org/Pyfa 2018-05-14 01:03:06 -04:00
Ryan Holmes
acf6b3dffd Merge pull request #1549 from flashspys/patch-1
Add Drone Damage Amplifier to defaults
2018-05-14 00:39:44 -04:00
blitzmann
b6a1c4b308 Add support for using own client details (messy code, but it works!) 2018-05-14 00:37:26 -04:00
blitzmann
e29ab817af Add the client details back to the preferences page 2018-05-13 13:27:49 -04:00
blitzmann
86576581cd Break out the phobos dump from the data compilation (dump has to work in py2, whereas compilation requires py3 due to hooking directly in with EOS classes). protip: PyCharm configurations are awesome 2018-05-13 01:17:59 -04:00
blitzmann
50bd46015b fix the osx icon 2018-05-12 23:10:27 -04:00
blitzmann
aa2ffaf1ea Update installer script and create new dist script for windows. todo: find out hwo to invoke PyInstaller from python 2018-05-12 22:49:18 -04:00
blitzmann
5cc6b6c69c Move over all esi stuff to it's own class, which the esi service extends from. Also fix an issue in the EVE fittings browser where deleting a fit didn't actually remove it from the list of fits (due to that list being populated by the return data of ESI, which can be cached). More clean up. 2018-05-12 13:57:14 -04:00
blitzmann
0365f71c00 Move over ESI functionality to be completely separate from esipy 2018-05-12 12:25:34 -04:00
blitzmann
4d666907c9 Start breaking out esipy, first up: getting for login 2018-05-11 23:24:30 -04:00
Felix Wehnert
0466678176 Add Drone Damage Amplifier to defaults 2018-05-09 10:20:11 +02:00
blitzmann
c1e239b9b3 Add a message box informing user of failed ESI initialization 2018-05-08 22:00:35 -04:00
blitzmann
26aaeabd7f Bump version 2018-05-08 21:33:20 -04:00
blitzmann
0e0bc9dfd2 Remove some references to old api stuff (#1547) 2018-05-08 21:06:32 -04:00
DarkPhoenix
df24313bcf Update to recent sisi changes 2018-05-08 14:58:25 +03:00
blitzmann
8990cbfd6a update readme 2018-05-08 00:01:55 -04:00
blitzmann
8f34c03289 implement a stop gap measure for #1384 2018-05-07 23:20:11 -04:00
blitzmann
c1322a3566 Run through pyfa.io for update checks (allows us to log version usage and provide more flexibility going forward). Falls back to simple github request 2018-05-07 22:55:50 -04:00
blitzmann
5101e2851a replace eve-central with evemarketer 2018-05-07 22:28:40 -04:00
blitzmann
7b7f67ad2e bump version 2018-05-07 22:24:18 -04:00
blitzmann
dbdc566ae4 Only raise exception for status code > 400 (was previously excluding 201 and the like) 2018-05-07 22:09:31 -04:00
blitzmann
f4fd991907 Remove some event handling from the ESI windows to prevent errors from happening (#1501) 2018-05-07 22:00:41 -04:00
blitzmann
42ad74158b Remove the ASCII text from console 2018-05-07 21:55:47 -04:00
blitzmann
c99afa79e1 Merge branch 'test-3' 2018-05-07 21:54:51 -04:00
blitzmann
789c3b869a Add new Exception type 2018-05-06 13:04:02 -04:00
blitzmann
7d8d87662b Merge remote-tracking branch 'origin/py3' into test-3 2018-05-06 12:58:04 -04:00
blitzmann
645a5ced14 check response for a 200 2018-05-06 12:57:48 -04:00
Maru Maru
56a3911b96 Adjusted effs export to remove bugs with python3 2018-05-05 04:09:01 -04:00
Ryan Holmes
5ed98e8fed Update requirements.txt 2018-05-04 23:30:43 -04:00
DarkPhoenix
a1c894bb22 Provide safe fallback for hardshell booster effect (currently broken on sisi) 2018-05-04 16:01:29 +03:00
DarkPhoenix
32c6dcdb79 Sort fits during search the same way they are sorted normally 2018-05-03 11:24:01 +03:00
DarkPhoenix
842be9535b Clean up unused effects 2018-05-03 09:58:44 +03:00
DarkPhoenix
7b6cb25ac4 Fix disintegrator group name 2018-05-03 09:50:36 +03:00
Ryan Holmes
f12370389c Merge pull request #1538 from fsufitch/issue/1533
Improve user experience customizing jargon.yaml
2018-05-02 22:36:44 -04:00
blitzmann
fc35d7bb26 Add mutaplasmids to group listing for sql inclusion 2018-05-02 22:32:49 -04:00
DarkPhoenix
94e1515b43 Update database after recent ship changes 2018-05-03 01:06:01 +03:00
Filip Sufitchi
95c1f7bde0 Improve user experience customizing jargon.yaml 2018-05-02 11:02:46 -04:00
Maru Maru
dba86edff2 Added python3 functionality to effs exporter 2018-05-02 03:25:20 -04:00
Maru Maru
e2d8a3a4e8 Merge branch 'effsExpBack' into py3EFFS 2018-05-01 00:03:42 -04:00
Maru Maru
090065ddd4 Removed sepurflous effs related files 2018-04-30 20:44:14 -04:00
Maru Maru
acade56769 Adjusted effs fit name prefixing 2018-04-30 20:38:38 -04:00
blitzmann
d52c249921 Remove client path hashing for secret file (was interfering with OS X build, because it unpacks pyfa into a different, random directory each time it runs) 2018-04-29 12:49:03 -04:00
blitzmann
0b9a50cd8d fix mac spec 2018-04-29 11:56:47 -04:00
blitzmann
25bbfec318 add a few things to requirements.txt 2018-04-29 11:31:33 -04:00
blitzmann
1192c26b8f Add the jargon yaml files to the build process 2018-04-29 11:30:41 -04:00
blitzmann
4a3201ffd4 Merge branch 'py3' of https://github.com/pyfa-org/Pyfa into test-3 2018-04-28 20:35:26 -04:00
blitzmann
406a22100d Merge branch 'esi' into test-3 2018-04-28 20:35:14 -04:00
Ryan Holmes
2547cf70c2 Merge pull request #1515 from Neugeniko/Issue#1511
Fix new sustained reps code for logistic drones.
2018-04-28 20:08:07 -04:00
DarkPhoenix
1fc4eab1ce Add spoolup time to misc column 2018-04-28 07:49:04 +03:00
DarkPhoenix
e1e4efde7a Update stats to latest sisi data 2018-04-27 23:24:57 +03:00
DarkPhoenix
cf5769e0f8 Add missing skill and damage mod effects 2018-04-24 20:52:46 +03:00
DarkPhoenix
a8b1f38e84 Update database and implement ship effects, also make pyfa to show final damage value for disintegrators after ramp-up time is complete
(if you don't want me to commit here just write phoenix@mail.ru, i have no way to communicate with you otherwise)
2018-04-24 19:13:30 +03:00
Ryan Holmes
e83fa4d40b Merge pull request #1513 from fsufitch/issue/1369
Issue/1369
2018-04-07 09:10:44 -04:00
Ryan Holmes
c552cb5e40 Merge pull request #1510 from fsufitch/issue/1509
Use list control length instead of sys.maxsize for platform compatibility
2018-04-07 08:27:40 -04:00
Maru Maru
49b1e2ee36 Added option to copy EFFS stats to the clipboard via the CopySelectDialog UI 2018-04-05 02:35:12 -04:00
Maru Maru
aec9202be1 added more data to effs exports, including module names. 2018-04-05 02:24:44 -04:00
Neugeniko
363904411d Projected Logistic Drones don't have a cap use or rawCycleTime.
Only call the logic for the appropriate module groups.
2018-04-04 16:55:05 +10:00
Filip Sufitchi
49bc9f50bc Add a comprehensive default jargon file 2018-04-02 17:35:58 -04:00
Filip Sufitchi
30501feb99 Raise search limit back up to 3 2018-04-02 17:25:45 -04:00
Filip Sufitchi
efc07e1553 Move minimum search length check to the service, to cover jargon 2018-04-02 17:23:30 -04:00
Filip Sufitchi
9bbeec523e Remove some debug try/except stuff 2018-04-02 16:44:14 -04:00
Filip Sufitchi
943ee517f4 Add jargon service
Jargon service translates search strings for the market
using community-sourced abbreviations. It also creates the
jargon.yaml file in the user's save directory, for
future customization (either manual, or via the UI) and
provides the code hooks to load and update it. The
JargonLoader is capable of hot-loading new jargon.yaml
configurations without restarting Pyfa.
2018-04-02 16:40:39 -04:00
Filip Sufitchi
18bb3bf246 Use list control length instead of sys.maxsize for platform compatibility 2018-03-31 16:28:59 -04:00
blitzmann
117d51caab change back to the py3-dev database 2018-03-25 21:42:51 -04:00
blitzmann
a3e411f225 Merge tag 'v2.0.0b5' into esi
# Conflicts:
#	eos/saveddata/character.py
2018-03-25 19:21:32 -04:00
blitzmann
083af3ebc7 Suppress pre-release notification only if current build is not a pre-release 2018-03-25 13:25:09 -04:00
blitzmann
3fd4d106d9 Merge branch 'master' into test-3
# Conflicts:
#	config.py
#	eos/effects/warpdisruptsphere.py
#	service/update.py
2018-03-25 13:16:07 -04:00
Ryan Holmes
7c376c93a2 Merge pull request #1500 from pyfa-org/release/1.36
Release/1.36
2018-03-25 13:12:46 -04:00
blitzmann
4ef7b645a8 Update effects, icons, db, version bump 2018-03-25 13:11:29 -04:00
blitzmann
cccc7ff2d0 Merge branch 'master' into release/1.36
# Conflicts:
#	service/update.py
2018-03-25 13:03:52 -04:00
blitzmann
b7c45f4c6e Fix the update check logic; only go through the 5 latests updates, and if the check fails (specifically due to our new beta tagging for v2) then simply continue to the next one instead of failing outright 2018-03-25 03:33:02 -04:00
blitzmann
3964658d9a Enable cargohold for structures (#1414) 2018-03-25 03:18:34 -04:00
blitzmann
03212be54a Merge branch 'master' into test-3
# Conflicts:
#	eos/capSim.py
#	eos/effects/structurewarpscrambleblockmwdwithnpceffect.py
#	eos/effects/warpdisruptsphere.py
2018-03-25 03:03:59 -04:00
blitzmann
46098f2127 Merge branch 'master' into release/1.36 2018-03-25 03:00:28 -04:00
Ryan Holmes
2005d0b0b9 Merge pull request #1494 from Neugeniko/Issue#1439-2
Respect 'Factor in Reload' preference for sustainable tank (tidied up).
2018-03-25 02:59:48 -04:00
blitzmann
3293380515 styling fix 2018-03-24 18:18:16 -04:00
Neugeniko
68e5b22fe2 Implement effect for Standup Warp Disruption Burst Projector.
Make active so we can see its effect on capacitor.

(cherry picked from commit 03c2088e6b)
2018-03-24 17:59:49 -04:00
Neugeniko
0f7dd7cc0c Correct the structure guidance enhancers to apply bonuses to relevant charges.
(cherry picked from commit 5c20ee7ade)
2018-03-24 17:59:34 -04:00
Neugeniko
0713251685 Redefine scrambler operation.
If we are projecting effects, modify warpScrambleStatus all the time, and turn off modules requiring 'High Speed Maneuvering' (MWDs) or "Micro Jump Drive Operation" (MJD etc) if a scrambling script is loaded.

(cherry picked from commit 04c62aabea)
2018-03-24 17:59:23 -04:00
Neugeniko
3fda62e320 Redefne structure mounted disruptor operation
If we are projecting effects, modify warpScrambleStatus all the time, and turn off modules requiring 'High Speed Maneuvering' (MWDs) or "Micro Jump Drive Operation" (MJD etc) if a scrambling script is loaded.

(cherry picked from commit 0994158abd)
2018-03-24 17:59:08 -04:00
Neugeniko
5f1c2d6676 Redefine Warp Disruption Field Generators operation
If we are applying effects onto our self, disallowAssistance all the time, and go into low mass/high sig etc mode when no script is loaded.

If we are projecting effects, modify warpScrambleStatus all the time, and turn off modules requiring 'High Speed Maneuvering' (MWDs) or "Micro Jump Drive Operation" (MJD etc) if a scrambling script is loaded.

(cherry picked from commit 77a66a66ea)
2018-03-24 17:58:52 -04:00
blitzmann
c0ba559ca6 Merge branch 'master' into release/1.36 2018-03-24 17:52:22 -04:00
Ryan Holmes
164720db3d Merge pull request #1495 from Neugeniko/Issue#1482-2
Fix cap use for non repeatable modules.
2018-03-22 00:58:16 -04:00
blitzmann
bd90ec4bf0 Don't fail an api update when a skill has been removed (#1473) 2018-03-21 22:12:21 -04:00
blitzmann
d7e24dfa8f Merge branch 'Issue#1486' 2018-03-21 21:51:13 -04:00
Ebag333
2f1ad21392 Calculate DPS for beam type doomsdays. 2018-03-21 21:49:04 -04:00
Ebag333
687d539534 Enable misc info for doomsdays. 2018-03-21 21:48:46 -04:00
Ryan Holmes
bd6793bc19 Merge pull request #1498 from Neugeniko/Issue#1484
Create basic effects files for various modules.
2018-03-21 21:18:08 -04:00
Ryan Holmes
6dd6452c11 Merge pull request #1491 from Neugeniko/Capsimreload
CapSim changes to make reloadtime a variable.
2018-03-21 21:03:40 -04:00
Ryan Holmes
e59a1cd27b Merge pull request #1489 from Neugeniko/Issue#1488
Bomb Launcher Problems Issue#1488
2018-03-21 20:55:05 -04:00
blitzmann
24d14d5e19 Fix attribute that was changed on some items 2018-03-21 20:48:05 -04:00
blitzmann
e0584367c5 fix some update logic for the new beta releases 2018-03-21 20:32:59 -04:00
blitzmann
a2f48e8944 update effects and a few tox fixes 2018-03-21 20:18:00 -04:00
blitzmann
95ba18f8a9 Update database 2018-03-20 23:03:02 -04:00
blitzmann
122d8ef367 Add Monitor effects 2018-03-20 23:01:05 -04:00
blitzmann
281d2ed1f4 Add Praxis effect 2018-03-20 22:55:12 -04:00
blitzmann
48924774f9 Add drake navy issue effects 2018-03-20 22:53:34 -04:00
blitzmann
ee00914a2b Renamed attribute 2018-03-20 22:49:40 -04:00
Maru Maru
ed3083aa77 Fixed indentation issues and corrected fighters damage reduction factor to include sensitivity 2018-03-19 22:56:42 -04:00
Ryan Holmes
48d90c1eca Add login method to login request 2018-03-18 00:54:59 -04:00
Ryan Holmes
415b3db809 Merge branch 'esi-noserver' into esi 2018-03-18 00:47:07 -04:00
Ryan Holmes
53451dfaf6 Implement a setting for manual vs server login method 2018-03-18 00:46:53 -04:00
Ryan Holmes
49181dce2b Develop dialog to input SSO Info from pyfa.io, and handle the login. Still need to hook this up to a settings option 2018-03-17 21:08:11 -04:00
Ryan Holmes
199763bcca Separate the server login handler from the sso info handler 2018-03-17 20:31:38 -04:00
Ryan Holmes
033647da61 Move to a central login() method 2018-03-17 20:23:14 -04:00
Ryan Holmes
00e8e9d84a Send pyfa version to server when logging in 2018-03-17 20:18:28 -04:00
Neugeniko
96b701687b pep 8 2018-03-17 13:53:03 +11:00
Neugeniko
e1e90cc23e pep 8 2018-03-17 13:43:19 +11:00
Neugeniko
f41ecae8c8 Add a minimal effects files for mjfg, lance dd's,
reaper dd's, bosonic dd's and gtfo dd's.
2018-03-17 13:23:58 +11:00
Neugeniko
65ec8cf4ee Take into consideration reactivation time for non repeatable modules
like the assault DC and MJD when calculating their 'actual'
cycle time.
2018-03-17 11:44:29 +11:00
Neugeniko
4fc93f7089 Respect 'Factor in Reload' preference for sustainable tank (tidied up). 2018-03-17 09:39:50 +11:00
Ryan Holmes
3ec01a20c2 Bunch of renaming to bring variables up to speed 2018-03-16 18:15:48 -04:00
Ryan Holmes
8a10f0a766 sCrest > sEsi 2018-03-16 18:06:33 -04:00
Ryan Holmes
0db125177f Remove some more cruft 2018-03-16 18:05:49 -04:00
Ryan Holmes
a3f532f62f Remove some cruft, and show EVE fitting when selecting it, rather than double clicking 2018-03-16 18:01:47 -04:00
Neugeniko
234f36c8c0 Zero reload times when reloads are off so we can group modules
with normally different reload times.
2018-03-16 15:57:14 +11:00
Ryan Holmes
2c3957b2db Disable CREST settings in preferences 2018-03-15 23:07:34 -04:00
Ryan Holmes
79deca41c1 Fix skill fetching 2018-03-15 23:05:28 -04:00
Ryan Holmes
570df7f645 Fix a bug with the character selection, and automatically assign a character after logging into eve via character editor 2018-03-15 22:13:56 -04:00
Ryan Holmes
8153b80d05 Work around for sso character not being delete from characters after sso deleted, some other minor tweaks 2018-03-15 19:58:17 -04:00
Ryan Holmes
b74654a5b3 Fix relationships for sso / characters 2018-03-15 02:58:58 -04:00
Ryan Holmes
4c6f68b07e Move sso character stuff to character file (for now while I try to figure out how to properly delete these) 2018-03-14 18:46:49 -04:00
Ryan Holmes
9839efc2dc Fix sso character relationship to not delete sso character (whoops) 2018-03-14 18:40:38 -04:00
Ryan Holmes
9d379d966c Implement working character associations with SSO character 2018-03-14 17:53:48 -04:00
Neugeniko
61086989dc Need to wait speed + reactivation delay between void bomb. 2018-03-14 16:04:15 +11:00
Neugeniko
023ea43611 Divide by numShots not need as we do that below. 2018-03-14 15:39:20 +11:00
Neugeniko
044e032ab3 Allow variable reload time in CapSim. 2018-03-14 13:40:49 +11:00
Neugeniko
da7b95041d Allow variable reload time in CapSim. 2018-03-14 13:40:31 +11:00
blitzmann
f52f39984f Add api view back to character editor (non functioning) 2018-03-12 21:13:18 -04:00
blitzmann
1513b07071 set cargo amoutninput to select all instead of inserstion end 2018-03-11 19:40:38 -04:00
blitzmann
be19b7414a Make a relation between characters and sso chars 2018-03-11 19:39:58 -04:00
blitzmann
75f9a0252a Start working on character to SSO character mapping 2018-03-11 17:38:51 -04:00
blitzmann
5169c35d5c Implement SSO Character delete, Remove some unused character logout code (still need to hook this up with character delete functionality) 2018-03-11 16:50:12 -04:00
blitzmann
bbdf1ee6cc More tweaks / error handling for esi 2018-03-11 15:31:41 -04:00
blitzmann
6c6e8a9972 Do some error handling 2018-03-11 14:47:57 -04:00
Neugeniko
97742b08c8 Attribute disallowRepeatingAction has been renamed to
disallowRepeatingActivation in the database. Make appropriate
modification to instances of this attribute name in code.

(cherry picked from commit ff607e4b03)
2018-03-11 12:19:43 -04:00
Ryan Holmes
8ef4c61fc3 Merge pull request #1481 from Neugeniko/Issue#1480
Attribute disallowRepeatingAction has been renamed.
2018-03-11 12:19:12 -04:00
Neugeniko
ff607e4b03 Attribute disallowRepeatingAction has been renamed to
disallowRepeatingActivation in the database. Make appropriate
modification to instances of this attribute name in code.
2018-03-11 21:38:46 +11:00
Maru Maru
4b2a58ca6f Updated .gitignore to include the generated export files 2018-03-11 03:51:41 -04:00
Maru Maru
0de950862b Added a crude data exporter for effs
Known to be quite buggy and needs formating adjustments.
In order to export fit data it first requires data to be exported with pyfas minimal html exporter.
The resulting pyfaFits.html file should be placed in the project directory before running effs_stat_export.py.
2018-03-11 03:28:48 -04:00
blitzmann
30c1ab125c Increase esipy requirement 2018-03-10 17:58:47 -05:00
blitzmann
8276746dad Do custom EsiPY prefix, change sso endpoint to look at pyfa.io instead of localhost 2018-03-10 15:46:23 -05:00
blitzmann
5560ef4d34 Merge branch 'test-3' into esi
# Conflicts:
#	eos/saveddata/character.py
#	service/character.py
#	service/eveapi.py
#	service/pycrest/eve.py
2018-03-10 15:32:21 -05:00
blitzmann
fac31f7254 Merge branch 'py3-requests-proxy' of git://github.com/minlexx/Pyfa into minlexx-py3-requests-proxy 2018-03-10 12:10:54 -05:00
blitzmann
1efcc8d3ef style 2018-03-10 12:09:51 -05:00
Neugeniko
03c2088e6b Implement effect for Standup Warp Disruption Burst Projector.
Make active so we can see its effect on capacitor.
2018-03-10 10:08:22 +11:00
Neugeniko
5c20ee7ade Correct the structure guidance enhancers to apply bonuses to relevant charges. 2018-03-10 00:50:58 +11:00
Neugeniko
04c62aabea Redefine scrambler operation.
If we are projecting effects, modify warpScrambleStatus all the time, and turn off modules requiring 'High Speed Maneuvering' (MWDs) or "Micro Jump Drive Operation" (MJD etc) if a scrambling script is loaded.
2018-03-07 15:29:31 +11:00
Neugeniko
0994158abd Redefne structure mounted disruptor operation
If we are projecting effects, modify warpScrambleStatus all the time, and turn off modules requiring 'High Speed Maneuvering' (MWDs) or "Micro Jump Drive Operation" (MJD etc) if a scrambling script is loaded.
2018-03-07 15:27:53 +11:00
Neugeniko
77a66a66ea Redefine Warp Disruption Field Generators operation
If we are applying effects onto our self, disallowAssistance all the time, and go into low mass/high sig etc mode when no script is loaded.

If we are projecting effects, modify warpScrambleStatus all the time, and turn off modules requiring 'High Speed Maneuvering' (MWDs) or "Micro Jump Drive Operation" (MJD etc) if a scrambling script is loaded.
2018-03-07 15:25:57 +11:00
Alexey Minnekhanov
0b615b578a Bring back proxy settings in network preferences view 2018-03-05 18:02:34 +03:00
Alexey Minnekhanov
53f07db5fe Network: apply proxy settings for requests library call 2018-03-05 16:24:00 +03:00
Alexey Minnekhanov
4d4815d6af Network: change User-Agent header from "urllib" to "requests" with version 2018-03-05 16:16:06 +03:00
blitzmann
b296e0709c Merge branch 'master' into test-3 2018-03-05 00:07:28 -05:00
blitzmann
373e0a390b Don't multiple HP of structure, instead assign it. Fixes #1460 2018-03-04 19:42:28 -05:00
blitzmann
222037ff40 Remove proxy support for the time being 2018-03-04 18:10:40 -05:00
blitzmann
4fac10ccb7 Fix update checker, migrate to requests package for all network stuff. The eveapi package is probably not going to work with caching and whatnot, but pyfa doesn't use it and XML API is EOL anyway 2018-03-04 18:08:34 -05:00
blitzmann
7956ca0409 Merge remote-tracking branch 'origin/master' into test-3
# Conflicts:
#	config.py
2018-03-04 16:47:08 -05:00
Ryan Holmes
5b27d0559f Merge pull request #1464 from pyfa-org/release/v1.35.2
Bump version
2018-03-04 16:44:28 -05:00
blitzmann
85157fdf85 Bump version 2018-03-04 16:44:00 -05:00
blitzmann
caf8e7f2d6 Test something on mac 2018-03-03 17:40:40 -05:00
blitzmann
124bb027ab Use bs4.UnicodeDammit to handle different encodings for file imports (fits only for now, can look into expanding for other file import types) 2018-03-03 14:21:55 -05:00
blitzmann
d5ca14ca52 Remove encoding checks for eft import (#1459) 2018-03-03 00:50:56 -05:00
blitzmann
99982aa547 Merge branch 'master' into test-3 2018-03-02 00:17:54 -05:00
blitzmann
3f4493c0ea Another fix for #1403 2018-03-02 00:17:33 -05:00
blitzmann
cdb604b29f Merge remote-tracking branch 'origin/py3' into test-3 2018-03-01 23:42:29 -05:00
blitzmann
d3b8cebc8a Merge branch 'master' into test-3 2018-03-01 23:42:22 -05:00
Ryan Holmes
7d245660bc Merge pull request #1455 from pyfa-org/issue/1451
Don't fail when trying to project a module that can't be projected.
2018-03-01 23:41:50 -05:00
blitzmann
b1e40427a3 Tox 2018-03-01 23:41:39 -05:00
blitzmann
73925df24b Don't fail when trying to project a module that can't be projected. 2018-03-01 23:24:00 -05:00
Ryan Holmes
04fbd3b548 Merge pull request #1454 from Neugeniko/py3
Resolves issue #1453 with xmlparser.ParseFile(file) wanting bytes.
2018-03-01 20:59:08 -05:00
Neugeniko
d9dd94d6c3 Update character.py
Resolves issue #1453 with xmlparser.ParseFile(file) wanting bytes.
2018-03-02 12:00:11 +11:00
blitzmann
963353a1dc Merge branch 'master' into test-3 2018-03-01 00:40:40 -05:00
Ryan Holmes
3411dcfd91 Merge pull request #1446 from pyfa-org/issue/1445-master
Issue/1445 master
2018-03-01 00:30:24 -05:00
blitzmann
ae6434affb Fix issue with importing EVE API XML 2018-03-01 00:30:08 -05:00
blitzmann
f773e0a935 fix misplaced parentheses
(cherry picked from commit 2a60216a92d39bb200c26bce8573484f54a80dc5)
2018-03-01 00:26:52 -05:00
blitzmann
7ab3ad9e08 Don't delete and recreate skills when updating char sheet. Instead, get each individual skill and change level.
(cherry picked from commit 55c79c1bafaa9a1b159b73a72c6480f7e8d6cb6b)
2018-03-01 00:26:47 -05:00
blitzmann
3f3a82ca6c Merge branch 'py3' of https://github.com/pyfa-org/Pyfa into test-3 2018-02-28 22:02:22 -05:00
blitzmann
e902cc5780 Add event.skip() to fit rename textCtrl focus loss 2018-02-28 22:00:48 -05:00
Ryan Holmes
fcb6952119 Merge pull request #1444 from Neugeniko/py3
Ensure graph frame unbinds its event handlers.
2018-02-27 21:09:10 -05:00
Neugeniko
3eecd57979 Update graphFrame.py 2018-02-28 03:17:37 +11:00
blitzmann
6e73b9fefd Tox 2018-02-27 00:52:15 -05:00
blitzmann
f0b0285f77 Merge branch 'development' of https://github.com/pyfa-org/Pyfa into development 2018-02-27 00:46:10 -05:00
blitzmann
e706a015b3 Merge branch 'issue/1397' into development 2018-02-27 00:45:53 -05:00
blitzmann
a804f9a1ad Fix working on missing skills context menu (#1412)
(cherry picked from commit 96c13c344a)
2018-02-27 00:45:46 -05:00
blitzmann
9e1b7dbb87 Add ability to drag a module from fitting window to projected pane 2018-02-27 00:44:42 -05:00
blitzmann
551ffe9ed3 Quick fix for #1430 2018-02-27 00:23:29 -05:00
blitzmann
cbe1ce5bcd Merge branch 'master' into test-3 2018-02-27 00:16:45 -05:00
Ryan Holmes
917afd5067 Merge pull request #1441 from pyfa-org/issue/1440
Convert sec status to float on character import (#1440)
2018-02-27 00:15:59 -05:00
blitzmann
c3fb9231a4 Convert sec status to float on character import (#1440) 2018-02-27 00:15:20 -05:00
blitzmann
2ed2f8e262 Fix issue with losing wrapper for FittingView when closing 2018-02-25 12:04:57 -05:00
blitzmann
390d90ac47 Merge branch 'issue/1434' into test-3 (#1434)
# Conflicts:
#	gui/builtinViews/fittingView.py
2018-02-25 01:57:36 -05:00
blitzmann
4c877e7a5a re-enable the tab preview 2018-02-25 01:45:43 -05:00
blitzmann
972fe433f7 remove vestigial file 2018-02-25 00:11:13 -05:00
blitzmann
ecaf6f96a9 guage: respect animation setting (#1434) 2018-02-25 00:10:17 -05:00
Ryan Holmes
8541e2a869 Merge pull request #1438 from pyfa-org/issue/1433
DNA export should respect Export Charges setting
2018-02-24 23:50:21 -05:00
blitzmann
48a2963472 Merge branch 'issue/1433' into test-3 2018-02-24 23:40:26 -05:00
blitzmann
f245a02372 DNA export should respect Export Charges setting 2018-02-24 23:37:53 -05:00
blitzmann
1c16343b46 Merge branch 'master' into test-3 2018-02-24 22:24:16 -05:00
Ryan Holmes
d0f66f2d16 Merge pull request #1437 from pyfa-org/issue/1432
Always open imports in a new tab (#1432)
2018-02-24 22:23:13 -05:00
blitzmann
df0c6ed269 Merge branch 'bug/amount-modal' into test-3 2018-02-24 22:21:02 -05:00
Ryan Holmes
9a4e26a5be Merge pull request #1436 from pyfa-org/bug/amount-modal
Handle getting value for Change Amount differently for projected fits (#1435)
2018-02-24 22:20:51 -05:00
blitzmann
2b87f91279 tox fix 2018-02-24 22:20:24 -05:00
blitzmann
9b48b61b9b Merge branch 'bug/amount-modal' into test-3 2018-02-24 22:17:22 -05:00
blitzmann
57e67b3699 Handle getting value for Change Amount differently for projected fits 2018-02-24 22:17:04 -05:00
blitzmann
15e60c3d24 Always open imports in a new tab (#1432) 2018-02-24 21:11:53 -05:00
blitzmann
ebf07db6c6 Partial fix for #1430 2018-02-24 19:01:54 -05:00
blitzmann
1559767201 Ensure that the event is propagated when the graph window handles FitChanged (#1430) 2018-02-24 18:21:32 -05:00
blitzmann
6e5e52df37 See #1429, version file not currently applied 2018-02-24 17:13:50 -05:00
blitzmann
e9289c102b Fix issue in notebook tab preview (this feature hasn't been enabled for a while, but we may want to turn it back on eventually. As such, ensure that we don't run into any problems here) 2018-02-24 13:53:56 -05:00
blitzmann
81d61d7e29 lol context management not available in 4.0.0b2, and can't update to >4.0 until #1421 is addressed 2018-02-24 13:49:17 -05:00
blitzmann
9ab4ec2d4f Convert AutoBufferedPaintDC > BufferedPaintDC (and use spiffy new context management). See #1418 2018-02-24 13:45:36 -05:00
blitzmann
565332dfcd Set wx requirement to v4b2, see #1421 2018-02-24 13:28:45 -05:00
blitzmann
f94fbd740a Merge branch 'bug/amount-modal' into test-3
# Conflicts:
#	gui/builtinContextMenus/amount.py
2018-02-24 02:55:40 -05:00
Ryan Holmes
a2719ec2f7 Merge pull request #1427 from pyfa-org/bug/amount-modal
Redesign amount modal
2018-02-24 02:54:38 -05:00
blitzmann
1da12cb18e tox fix 2018-02-24 02:54:23 -05:00
blitzmann
e0cddcd061 Redesign amount modal, basing style off wx.TextEntryDialog (but not a wx.TextEntryDialog, because there are possibilities to do a few different things in this modal) 2018-02-24 02:47:13 -05:00
blitzmann
78f632a4f6 Merge remote-tracking branch 'origin/master' into test-3 2018-02-24 02:03:29 -05:00
Ryan Holmes
52754535a0 Merge pull request #1426 from pyfa-org/issue/1416
Issue/1416
2018-02-24 02:02:57 -05:00
blitzmann
a9db667c9c Do the same treatment to Target Resists as Damage Patterns 2018-02-24 02:01:23 -05:00
blitzmann
f442632fbc Fix importing damage profiles which included overwriting existing ones and then performing a delete on one of them. #1416 2018-02-24 01:49:09 -05:00
blitzmann
362086cc83 Fix type in database default for damage types 2018-02-24 01:47:05 -05:00
blitzmann
73d59569ff Merge remote-tracking branch 'origin/master' into test-3
# Conflicts:
#	gui/characterEditor.py
2018-02-23 23:28:33 -05:00
Ryan Holmes
cb4fadf84c Merge pull request #1425 from pyfa-org/issue/1419
Migrate the Save Character As dialog tot he same dialog / validator a…
2018-02-23 23:26:44 -05:00
blitzmann
e85d144928 Migrate the Save Character As dialog tot he same dialog / validator as the Edit Character Name (#1419) 2018-02-23 23:25:11 -05:00
blitzmann
07099f4057 Fix working on missing skills context menu (#1412)
(cherry picked from commit 96c13c344a)
2018-02-23 01:17:18 -05:00
blitzmann
96c13c344a Fix working on missing skills context menu (#1412) 2018-02-23 01:15:57 -05:00
blitzmann
8f42822d9e Add roman package as a requirement, and remove the roman module from pyfa 2018-02-23 01:04:31 -05:00
blitzmann
c5ba79cfbb Merge branch 'master' into test-3
# Conflicts:
#	.gitignore
2018-02-23 01:02:51 -05:00
Ryan Holmes
f69f76856a Merge pull request #1391 from BlueShanks/acceptRomanNumerals
Character Editor: accept skill plans in Roman numerals too
2018-02-23 01:01:57 -05:00
Ryan Holmes
3a23d820cc Merge branch 'master' into acceptRomanNumerals 2018-02-23 01:01:07 -05:00
blitzmann
c917d22db5 tox fixes for the roman library to prevent travis from yelling at us 2018-02-23 01:00:43 -05:00
blitzmann
c3f8b102fa Add the romans library to pyfa itself to avoid having to modify the binaries 2018-02-23 00:57:26 -05:00
blitzmann
5e566db47d Fix attribute override export / import (#1420) 2018-02-23 00:36:52 -05:00
blitzmann
5b2c5907ed Skills needed export (#1412): Need to encode the string before we gzip it 2018-02-23 00:23:45 -05:00
blitzmann
dd78a41171 Fix HTML export (more encoding stuff). Also fix old bug in which unicode fit names don't display correctly in the webbrowser. #1411 2018-02-23 00:13:14 -05:00
blitzmann
201fb4e241 Remove all encoding bits from fit importing. Might not work 100% of the time, but as 2.0 gets introduced to the community, we'll get reports of possible problems. #1410 2018-02-23 00:00:53 -05:00
blitzmann
8abd25fe40 Use a scolled window in preference pages 2018-02-19 23:32:44 -05:00
blitzmann
d59c897921 Fix image list in preferences dialog 2018-02-19 01:20:57 -05:00
Ryan Holmes
cb89d13d9f Merge pull request #1409 from pyfa-org/bug/1403
Remove some defunct items from market service
2018-02-19 00:16:42 -05:00
blitzmann
a1aa78adc0 Remove some defunct items from market service 2018-02-18 23:28:17 -05:00
blitzmann
4bbbd33917 Return 0 instead of -1 when there is no charge on a weapon. It was changed from None to -1 during the py3 conversion (as None can no longer be compared against non-None types). -1 was throwing the capSim off by quite a bit. See #1405 2018-02-18 22:55:31 -05:00
blitzmann
42ccc53166 bit of clean up for reload setting 2018-02-18 20:35:46 -05:00
blitzmann
35ad21da38 Add pattern for commit hashes to update dialog 2018-02-17 16:27:12 -05:00
blitzmann
72efef818f Fix version stuff 2018-02-17 13:59:19 -05:00
blitzmann
5571bae8b2 Fix situation in which event propagation was not working properly for structures 2018-02-17 12:47:07 -05:00
blitzmann
8b2cfe44f2 Merge remote-tracking branch 'origin/master' into test-3
# Conflicts:
#	config.py
#	eos/saveddata/fighter.py
2018-02-17 12:31:58 -05:00
blitzmann
82e3db1ffb Centralize version string getting. Still trying to work out how we should handle automatic version increments so we don't have to modify files all the time. Remove version file from repo (should only be a thing when building binaries) 2018-02-17 11:10:42 -05:00
blitzmann
e779bb84e2 Fix for #1383. Due to the changed mechanics of None in py3, getModifiedItemAttr was defaulted to 0 instead of None. This adds an explicit default of None when trying to find the allowed drone group attribute 2018-02-17 10:53:29 -05:00
BlueShanks
bd0fcbef3a Fixed style issues which were throwing errors
The code was failing an automatic test because of style issues, which are hopefully fixed now
2018-02-17 18:26:00 +10:00
blitzmann
0456cb2f96 Merge remote-tracking branch 'origin/master' into test-3 2018-02-16 22:26:10 -05:00
blitzmann
cafd92f169 add a todo 2018-02-16 22:26:02 -05:00
blitzmann
05f08970c9 fix character editor not spawning on OSX 2018-02-16 20:40:51 -05:00
BlueShanks
c5c673e360 moved a line back to where it was
results in a net smaller diff
2018-02-16 00:46:51 +10:00
BlueShanks
5cd21da7b1 Character Editor: accept skill plans in Roman numerals too 2018-02-16 00:19:56 +10:00
blitzmann
da0f89ef91 Merge commit 'refs/tags/v1.35.0^{}' into test-3 2018-02-14 22:25:45 -05:00
blitzmann
efc3f1ba7d Don't display console for windows application 2018-02-14 22:23:42 -05:00
blitzmann
c6e715aa5c Merge branch 'master' into test-3 2018-02-14 22:07:33 -05:00
blitzmann
0e93136157 Merge branch 'release/v1.35.0' 2018-02-14 22:07:20 -05:00
blitzmann
23f0f48c80 Use a special dev database for py3 branch 2018-02-14 01:16:49 -05:00
blitzmann
fe1c4cc4d4 Make a callback for token refresh, not sure how I'm gonna handle this one yet 2018-02-12 21:43:23 -05:00
blitzmann
ed649dd4c7 Merge branch 'test-3' into esi 2018-02-11 23:23:30 -05:00
blitzmann
33618f12f7 Fix issue when error happens before wx is even initialized traceback is never set 2018-02-11 23:22:37 -05:00
blitzmann
33eccaa374 Merge branch 'test-3' into esi
# Conflicts:
#	requirements.txt
2018-02-11 23:17:50 -05:00
blitzmann
5f0ce58c29 Merge branch 'master' into test-3
# Conflicts:
#	gui/builtinShipBrowser/fitItem.py
#	service/port.py
2018-02-11 21:29:17 -05:00
blitzmann
c329f5eeb8 Bump up the wxPython requirement to 4.0.1 2018-02-11 21:22:35 -05:00
blitzmann
320a0230f4 fix version data file in mac spec file 2018-02-11 12:32:34 -05:00
blitzmann
50dd74dbe8 Add packaging requirement, and use it's PEP 440 version parsing for version comparisons. 2018-02-10 00:59:25 -05:00
blitzmann
9c355d8f96 update requirements 2018-02-09 18:53:14 -05:00
blitzmann
7b0f672f04 Get encrypted refresh tokens working 2018-02-09 18:25:53 -05:00
blitzmann
33bf5234d0 Goodbye eveapi! You have served us well all these years!
Start stripping XML API stuff and implement ESI skill fetching.
2018-02-09 00:42:59 -05:00
blitzmann
cb392e7e5f Rename a few things 2018-02-08 01:52:38 -05:00
blitzmann
dfba033190 Implement posting fit to EVE server 2018-02-08 01:50:52 -05:00
blitzmann
5fbe623ae6 get fit deletion working. Need to be aware that we are still using cached fit listing... 2018-02-08 01:38:24 -05:00
blitzmann
e025bff99b Get ESI fitting import working completely. Use a file cache for EsiApp to prevent long startup times (possibly cache for about a week or so, and start in background if it needs to be gotten again?) 2018-02-08 01:24:40 -05:00
blitzmann
e77dddc15b More work on getting fittings form a character via ESI. It's starting to be come a pain working with this client with having to background it until it initializes. Thinking about rolling my own, considering we only need a few calls and not a whole package. 2018-02-07 02:07:42 -05:00
blitzmann
eea8019593 Get fitting browser to show up with proper characters (still not functional). Start testing ways to store the esipy app on the service (it can take a few seconds to initialize due to network calls) 2018-02-07 01:21:22 -05:00
blitzmann
c7360c8cc3 Get logging into EVE working and SSO characters saving, along with client hashes being stored alongside characters. 2018-02-07 00:44:37 -05:00
blitzmann
2376148380 Start ripping CREST stuff out, add new SSOCharacter stuff in. Long process ahead. 2018-02-02 02:05:49 -05:00
blitzmann
2e8d7d3610 add markdown2 to requirements.txt 2018-02-01 23:09:08 -05:00
blitzmann
3179016aed Enhance the update modal to show a web view with html-rendered markdown of release ntoes 2018-02-01 21:58:29 -05:00
blitzmann
9e8166c13d Add ESI service skeleton, and my customer ESI Proxy class 2018-01-11 20:54:33 -05:00
blitzmann
9f7e4e0dc0 Fix issue with market search (None / int comparison) 2018-01-10 21:39:50 -05:00
blitzmann
29d175c7b3 Fix for error that happens when switching to/from firepower/mining 2018-01-10 00:51:21 -05:00
blitzmann
40ce7b7c0b Merge branch 'master' into test-3
# Conflicts:
#	.gitignore
#	eos/saveddata/character.py
#	service/network.py
#	service/price.py
2017-12-10 22:36:15 -05:00
blitzmann
2936b88c3d code cleanup 2017-11-27 21:05:06 -05:00
blitzmann
2365112292 Some file cleanup 2017-11-26 18:36:20 -05:00
blitzmann
1daef5354d remove old wx test file 2017-11-26 18:31:48 -05:00
blitzmann
6f19d45c6d fix mac spec 2017-11-26 18:29:03 -05:00
blitzmann
ac7908c62c rearrange spec files 2017-11-26 18:15:33 -05:00
blitzmann
c000b19986 Finish pulling all the cruft out of pyfa.py relating to logging and error handling. All that is now done in separate areas.
Also finally did some major reworking on the error dialog. Now it doesn't spawn a new wxApp and wxFrame for each and every error - attaches to MainFrame and sticks around, having exceptions append to it rather than spawn a new one. In the case that an error happens before MainFrame is available, it spins up a new wxApp. Yay cleanup!
2017-11-26 03:57:00 -05:00
blitzmann
1da127c898 Working commit to better handle errors 2017-11-26 01:54:36 -05:00
blitzmann
fcdf55632f working commit to try to clean up pyfa.py and re-implement version checking 2017-11-26 01:08:02 -05:00
blitzmann
dd3bc66896 Remove old py<2.6 OrderedDict compat module 2017-11-25 22:40:23 -05:00
blitzmann
da67cdba9b Get a mailmap working for properish tracking of authors 2017-11-25 20:34:03 -05:00
blitzmann
8850da6cdb OS X bundling puts it all into one file, which is extracted. We need to make sure the script knows of the actual path 2017-11-25 20:11:05 -05:00
blitzmann
7d46d7e22d fix crash dealing with CREST fitting window's cache timer 2017-11-25 17:31:19 -05:00
blitzmann
b3157303cd Reenable error dialog and remove versioning info - want to look into a more uniform way of doing this if possible, and the requirements are all changing. 2017-11-25 13:49:48 -05:00
blitzmann
65e17119af Deprecation fix 2017-11-25 13:12:26 -05:00
blitzmann
3c405f51d8 Remove platform-specific CREST checks (add for mac-deprecated client) 2017-11-24 17:27:44 -05:00
blitzmann
337f0a9c8a Fix stretchspacers 2017-11-24 17:23:04 -05:00
blitzmann
53936a3e66 Fix additional panel note toggling correctly 2017-11-24 12:44:00 -05:00
blitzmann
30a6e29b39 Fix slight sizing issue with toggle panel header arrow 2017-11-24 12:30:46 -05:00
blitzmann
f3dc3bc654 Fix tabs not disabling. It was primarily an issue with event propagation not being handled correctly, as well as some missing helper code in chrome_tabs 2017-11-24 12:22:21 -05:00
blitzmann
0a935cf149 fix gtk warnings 2017-11-24 02:02:09 -05:00
blitzmann
5697da7ec2 fix upgrade 2017-11-24 01:23:04 -05:00
blitzmann
a7086b78cb Fix an issue with with Cap Power Relay using an effect without an expecting source attribute. Used to work, but with changes to getModifiedItemAttr need to default these to None 2017-11-24 00:55:23 -05:00
blitzmann
e032c9c5b1 fix item stats dialog 2017-11-23 22:48:37 -05:00
blitzmann
46b0aded03 fixes 2017-11-23 22:43:41 -05:00
blitzmann
d23398ce29 fix for boosters 2017-11-23 20:51:03 -05:00
blitzmann
5e0a5da6d5 more post-merge work 2017-11-23 12:51:43 -05:00
blitzmann
6e112b9ed5 Fix issues with merge 2017-11-23 11:38:08 -05:00
blitzmann
b30b3fcbf1 Merge branch 'master' into test-3
Conflicts:
	eos/gamedata.py
	eos/saveddata/booster.py
	eos/saveddata/character.py
	gui/builtinAdditionPanes/commandView.py
	gui/builtinContextMenus/commandFits.py
	gui/builtinMarketBrowser/itemView.py
	gui/builtinMarketBrowser/marketTree.py
	gui/builtinPreferenceViews/pyfaGeneralPreferences.py
	gui/builtinShipBrowser/categoryItem.py
	gui/builtinShipBrowser/fitItem.py
	gui/builtinShipBrowser/navigationPanel.py
	gui/builtinShipBrowser/raceSelector.py
	gui/builtinShipBrowser/shipItem.py
	gui/builtinStatsViews/priceViewFull.py
	gui/builtinViews/fittingView.py
	gui/characterEditor.py
	gui/characterSelection.py
	gui/chromeTabs.py
	gui/crestFittings.py
	gui/itemStats.py
	gui/mainFrame.py
	scripts/itemDiff.py
	service/price.py
2017-11-23 11:19:05 -05:00
blitzmann
4a33365195 Add some debug and fix indentation issue causing fit deletion to crash open fittings views 2017-11-22 01:45:31 -05:00
blitzmann
5d5646df79 Fix BlankPage having binding issue 2017-11-22 01:45:06 -05:00
blitzmann
405a965046 Fix issue with loading fighters 2017-11-22 01:44:48 -05:00
blitzmann
4138088d4a Do not create a new fitting view every time we switch fits. 2017-11-21 23:46:50 -05:00
blitzmann
de44e6f932 Get rid of some annoying messages 2017-11-21 23:46:33 -05:00
blitzmann
d4df989427 Remove handlers from unbind (see https://github.com/wxWidgets/Phoenix/issues/624) 2017-11-21 23:04:51 -05:00
blitzmann
6c8b143936 Tentative .spec file for linux 2017-11-21 00:32:45 -05:00
blitzmann
0f94557699 Use wx.AutoBufferedPaintDC instead of wx.BufferedPaintDC (helps with drawing on linux) 2017-11-21 00:05:52 -05:00
blitzmann
a52b9e58e9 Testing some stuff out 2017-11-18 19:01:05 -05:00
blitzmann
0d8904d59f Fix None comparison operation 2017-11-16 01:35:26 -05:00
blitzmann
d956cb7861 use a different image to denote changed skills 2017-11-16 01:31:28 -05:00
blitzmann
e848cec815 Fix dirty skill indicator (* instead of blue text). Need to get a different icon working for those. Remove debugging prints() 2017-11-16 01:20:38 -05:00
blitzmann
ce8f1d385d Better fix for broken Entity Editor Validation 2017-11-15 21:43:36 -05:00
blitzmann
90e338b969 Fix for broken Entity Editor Validation 2017-11-14 00:07:12 -05:00
blitzmann
1978f5cb92 Test validator stuff 2017-11-13 22:45:12 -05:00
blitzmann
979bc494f0 deprecation 2017-11-13 22:29:58 -05:00
blitzmann
cc9b6ea04b More deprecation fixes 2017-11-13 00:18:24 -05:00
blitzmann
8cbb327659 Fix bug that caused race image to not appear in fitting tab 2017-11-12 23:58:30 -05:00
blitzmann
1fc9b2941d Add spac file for mac 2017-11-12 13:43:19 -05:00
blitzmann
e9be07f281 Rename pyfa.spec to pyfa-win.spec 2017-11-12 13:17:16 -05:00
blitzmann
df7dc30e7e Write out git version information to a file, use in about box, remove all the other stuff until I can format it correctly 2017-11-12 13:13:38 -05:00
blitzmann
d0235f6d93 Fix market browser meta filtering 2017-11-12 12:00:24 -05:00
blitzmann
de646cf252 Have a noticeable message show up (currently prints for everything, should restrict to only beta builds) 2017-11-12 02:30:15 -05:00
blitzmann
21838f2d9a Fix issue with pyinstaller not bundling required DLLs when building on Windows 10 / Python >= 3.5 2017-11-12 02:15:15 -05:00
blitzmann
266398b1de Get some things working for pyinstaller 2017-11-12 00:14:45 -05:00
blitzmann
0cc646bab9 Fix gauge resetting to 0 each time (should figure out how to utilize the existing set range and value, but for now this works) 2017-11-05 02:29:58 -05:00
blitzmann
cebca64e5e Fix CREST stuff 2017-11-05 01:43:39 -05:00
blitzmann
bd0de82a8e remove repo version of FloatSpin, go with wx bundled version 2017-11-05 01:10:22 -05:00
blitzmann
0f5ae8d9b6 Fix delete fix (renamed MiddleDown to MiddleIsDown) 2017-11-05 01:03:14 -05:00
blitzmann
5ae7805bb1 Fix ammo picker 2017-11-05 01:54:19 -04:00
blitzmann
6a382c4445 More tweaks to getModifiedItemAttr and fix deprecation warning 2017-11-05 01:51:19 -04:00
blitzmann
3b0c8b6117 Fix Racks having a CPU and Power value of 0 2017-11-04 18:32:26 -04:00
blitzmann
0e1e4cad6d Fix a few more deprecation warnings 2017-11-04 18:24:18 -04:00
blitzmann
e0b92198b0 Fix deprecation warnings 2017-11-04 18:20:54 -04:00
blitzmann
ce3b94696a Make sure getModifiedItemAttr always returns an int, unless otherwise wanting None
In py2, you could compare None to an int and it would always be less than. Unfortunately in py3, this is no longer the case. Returning getModifiedItemAttr as 0 allows us to not do a huge refactor.
2017-11-04 18:20:00 -04:00
blitzmann
56f34873a6 bleh 2017-10-08 22:51:06 -04:00
blitzmann
2afc8b1abe Get rack headers bold again (courtesy of @RobinD42 - https://github.com/wxWidgets/Phoenix/issues/525) 2017-09-25 01:58:31 -04:00
blitzmann
3b716e6e5e fix py2app setup file 2017-07-07 00:22:58 -04:00
blitzmann
961b389b40 test 2017-07-06 23:41:55 -04:00
Ryan Holmes
0527a506ac fix broken events preventing additions panels to not work 2017-07-03 01:46:46 -04:00
Ryan Holmes
1082d8a173 fix fix fix 2017-07-02 23:45:28 -04:00
Ryan Holmes
7ae41b71b2 Fix some deprecated things and a bug or two 2017-07-02 23:26:44 -04:00
Ryan Holmes
de5a734919 About dialog (looks like shit x_x) 2017-07-02 16:42:22 -04:00
Ryan Holmes
987c55ed8f Get preferences dialog up and running 2017-07-02 16:32:39 -04:00
Ryan Holmes
57783fe80f More work on character editor 2017-07-02 15:28:42 -04:00
Ryan Holmes
f24c2ddd22 Get skill list in character editor showing. Mostly doesn't work still 2017-07-02 14:12:00 -04:00
Ryan Holmes
f16e14e0b4 Fix gauges again, convert remaining IconFromBitmap > Icon 2017-06-14 15:05:12 -04:00
Ryan Holmes
729c46ab00 Revert "Remove EVT_ERASE_BACKGROUND events - pretty sure these were there for older versions of wx where the background wasn't erased properly"
This does help prevent flickering on resizing. Need to research more before removing them

This reverts commit 8c5c7fba29.
2017-06-14 03:57:57 -04:00
Ryan Holmes
3b546de070 More deprecated fixes, and re-enable a working stats view 2017-06-14 03:51:40 -04:00
Ryan Holmes
ba64f75f88 Add some missing features to the gauge (and the background erase event, which apparently is needed to prevent flickering. Still need to access if this is something I need to be concerned about in other areas) 2017-06-14 03:44:38 -04:00
Ryan Holmes
4b8f2ce9e7 Deprecation stuff 2017-06-14 01:07:18 -04:00
Ryan Holmes
8c5c7fba29 Remove EVT_ERASE_BACKGROUND events - pretty sure these were there for older versions of wx where the background wasn't erased properly 2017-06-14 01:02:27 -04:00
Ryan Holmes
bec26d5d05 Fix unable to close window 2017-06-14 00:53:22 -04:00
Ryan Holmes
8f369daf1e InsertStringItem > InsertItem 2017-06-14 00:46:38 -04:00
Ryan Holmes
43cbdc1e57 Fix issue with crashing (set weight not working as intended?) 2017-06-14 00:46:13 -04:00
Ryan Holmes
cf4d0706ae Fix column headers, and disable event posting which was causing crash 2017-06-14 00:09:30 -04:00
Ryan Holmes
2857eff884 Fix a few None comparison operations... python 3 has changed this. I'm sure there's going to be a lot of these issues popping up.
Oh, and now we get a hard crash when opening a fit. Yey!
2017-06-13 23:57:27 -04:00
Ryan Holmes
050f1b4add Fixed some missing chrome tab stuff, as well as more conversion issues 2017-06-13 15:18:40 -04:00
Ryan Holmes
2bbcd96ce3 Even more fixes 2017-06-13 15:01:30 -04:00
Ryan Holmes
1cbd8ee901 Fix some deprecated stuff 2017-06-12 21:31:37 -04:00
Ryan Holmes
7e86cb0f84 OMG I HAVE A SHIP BROWSER NOW :3 (replace old instances of GetSuitableColor with GetSuitable) 2017-06-12 21:25:07 -04:00
Ryan Holmes
0e7dccccfe Remove stat panels for now. I HAVE A FRAME SPAWNING OMG 2017-06-12 21:16:21 -04:00
Ryan Holmes
9d75dea31a "Fix" more spacers 2017-06-12 21:14:45 -04:00
Ryan Holmes
610f501608 "Color Correction" 2017-06-12 21:11:10 -04:00
Ryan Holmes
361f7fc5bb misc fixes 2017-06-12 21:09:50 -04:00
Ryan Holmes
951b35a345 PyDeadObjectError fixes and PFNotebook -> ChromeNotebook renaming 2017-06-12 20:50:05 -04:00
Ryan Holmes
6c317d56ee touch up the gauge code 2017-06-12 20:45:58 -04:00
Ryan Holmes
2acb3e759e Touch up toggle panel 2017-06-12 20:42:03 -04:00
Ryan Holmes
9712ec4fbf Fix up some stuff, migrate to cleaned up chrome tabs 2017-06-12 20:38:00 -04:00
Ryan Holmes
ae0da59ed2 Clean up draw and color utils 2017-06-12 18:14:29 -04:00
Ryan Holmes
8e4db5a8c3 Do some renaming of some files 2017-06-12 18:08:07 -04:00
Ryan Holmes
7f392006d1 comment out most of the fluff in pyfa.py. Need to come back to this and get it all working 2017-06-12 16:37:15 -04:00
Ryan Holmes
828b18d0fd py2to3 automatic conversion. Woot! 2017-06-12 16:12:45 -04:00
5910 changed files with 59723 additions and 38655 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
#
#

5
.gitignore vendored
View File

@@ -118,3 +118,8 @@ ENV/
.idea
eos.iml
gitversion
.version
/.version
*.swp
*.fsdbinary

14
.mailmap Normal file
View File

@@ -0,0 +1,14 @@
cncfanatics <diego.duclos@gmail.com> cncfanatics <cncfanatics@titanium.(none)>
blitzmann <holmes.ryan.90@gmail.com>
blitzmann <holmes.ryan.90@gmail.com> blitzmann <ryan.xgamer99@gmail.com>
blitzmann <holmes.ryan.90@gmail.com>
blitzmann <holmes.ryan.90@gmail.com> blitzman <ryan.xgamer99@gmail.com>
blitzmann <holmes.ryan.90@gmail.com> Ryan Holmes <ryan.holmes.90@gmail.com>
blitzmann <holmes.ryan.90@gmail.com>
Corollax <corollax@gmail.com> Corollax <corollax@corollax-laptop.(none)>
Corollax <corollax@gmail.com> Corollax <corollax@corollax-N76VM.(none)>
Mr. Nukealizer <mr.nukealizer@gmail.com> Mr. Nukealizer <MrNukealizer@users.noreply.github.com>
DarkPhoenix <phoenix@mail.ru>
Sakari Orisi <sakari@evefit.org>
Will Wykeham <will@wykeham.net> Will Wykeham <will.wykeham@paconsulting.com>
OISumeko <camerongrout@gmail.com> OISumeko <cameron@sporadic.co.nz>

View File

@@ -1,39 +1,29 @@
os: linux
language: python
cache: pip
python:
- '2.7'
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
# 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
- bash scripts/setup-osx.sh
install:
# install wxPython 3.0.0.0
- conda install -c https://conda.anaconda.org/travis wxpython
before_script:
- pip install -r requirements.txt
- pip install -r requirements_test.txt
script:
- py.test --cov=./
after_success:
- bash <(curl -s https://codecov.io/bash)
- export PYFA_VERSION="$(python3 scripts/dump_version.py)"
- bash scripts/package-osx.sh
before_deploy:
- pip install -r requirements_build_linux.txt
- 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

@@ -15,12 +15,8 @@ The latest version along with release notes can always be found on the project's
Windows and OS X users are supplied self-contained builds of pyfa on the [latest releases](https://github.com/pyfa-org/Pyfa/releases/latest) page. An `.exe` installer is also available for Windows builds. Linux users can run pyfa using their distribution's Python interpreter. There is no official self-contained package for Linux, however, there are a number of third-party packages available through distribution-specific repositories.
#### OS X
There are two different distributives for OS X: `-mac` and `-mac-deprecated`.
* `-mac`: based on wxPython 3.0.2.0 and has updated libraries. This is the recommended build.
* `-mac-deprecated`: utilizes older binaries running on wxPython 2.8; because of this, some features are not available (currently CREST support and Attribute Overrides). Additionally, as development happens primarily on wxPython 3.0, a few GUI bugs may pop up as `-mac-deprecated` is not actively tested. However, due to some general issues with wxPython 3.0, especially on some newer OS X versions, `-mac-deprecated` is still offered for those that need it.
There is also a [Homebrew](http://brew.sh) option for installing pyfa on OS X. Please note this is maintained by a third-party and is not tested by pyfa developers. Simply fire up in terminal:
Apart from the official release, there is also a [Homebrew](http://brew.sh) option for installing pyfa on OS X. Please note this is maintained by a third-party and is not tested by pyfa developers. Simply fire up in terminal:
```
$ brew install Caskroom/cask/pyfa
```
@@ -36,13 +32,8 @@ The following is a list of pyfa packages available for certain distributions. Pl
### Dependencies
If you wish to help with development or simply need to run pyfa through a Python interpreter, the following software is required:
* Python 2.7
* `wxPython` 2.8/3.0
* `sqlalchemy` >= 1.0.5
* `dateutil`
* `matplotlib` (for some Linux distributions you may need to install separate wxPython bindings such as `python-matplotlib-wx`)
* `requests`
* `logbook` >= 1.0.0
* Python 3.6
* Requirements as listed in `requirements.txt`
## Bug Reporting
The preferred method of reporting bugs is through the project's [GitHub Issues interface](https://github.com/pyfa-org/Pyfa/issues). Alternatively, posting a report in the [pyfa thread](http://forums.eveonline.com/default.aspx?g=posts&t=247609) on the official EVE Online forums is acceptable. Guidelines for bug reporting can be found on [this wiki page](https://github.com/DarkFenX/Pyfa/wiki/Bug-Reporting).

View File

@@ -28,7 +28,7 @@ def DBInMemory_test():
gamedataCache = True
saveddataCache = True
gamedata_version = ""
gamedata_connectionstring = 'sqlite:///' + realpath(join(dirname(abspath(unicode(__file__))), "..", "eve.db"))
gamedata_connectionstring = 'sqlite:///' + realpath(join(dirname(abspath(str(__file__))), "..", "eve.db"))
saveddata_connectionstring = 'sqlite:///:memory:'
class ReadOnlyException(Exception):
@@ -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,7 +1,6 @@
import pytest
# noinspection PyPackageRequirements
from _development.helpers import DBInMemory as DB, Gamedata, Saveddata
# noinspection PyShadowingNames
@@ -41,7 +40,7 @@ def CurseFit(DB, Gamedata, Saveddata):
mod.state = Saveddata['State'].ONLINE
# Add 5 neuts
for _ in xrange(5):
for _ in range(5):
fit.modules.append(mod)
return fit
@@ -60,7 +59,7 @@ def HeronFit(DB, Gamedata, Saveddata):
mod.state = Saveddata['State'].ONLINE
# Add 5 neuts
for _ in xrange(4):
for _ in range(4):
fit.modules.append(mod)
return fit

View File

@@ -1,7 +1,6 @@
import pytest
# noinspection PyPackageRequirements
from _development.helpers import DBInMemory as DB, Gamedata, Saveddata
# noinspection PyShadowingNames

View File

@@ -94,8 +94,8 @@ def GetUnicodePath(root, file=None, codec=None):
path = os.path.join(path, file)
if codec:
path = unicode(path, codec)
path = str(path, codec)
else:
path = unicode(path)
path = str(path)
return path

165
config.py
View File

@@ -1,7 +1,14 @@
import os
import sys
import yaml
import wx
from logbook import Logger
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
pyfalog = Logger(__name__)
@@ -18,18 +25,40 @@ debug = False
# Defines if our saveddata will be in pyfa root or not
saveInRoot = False
# Version data
version = "1.35.1"
tag = "Stable"
expansionName = "YC120.2"
expansionVersion = "1.2"
evemonMinVersion = "4081"
minItemSearchLength = 3
pyfaPath = None
savePath = None
saveDB = None
gameDB = None
logPath = None
loggingLevel = None
logging_setup = None
cipher = None
clientHash = None
ESI_CACHE = 'esi_cache'
LOGLEVEL_MAP = {
"critical": CRITICAL,
"error": ERROR,
"warning": WARNING,
"info": INFO,
"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
def isFrozen():
@@ -45,23 +74,33 @@ def __createDirs(path):
def getPyfaRoot():
base = getattr(sys.modules['__main__'], "__file__", sys.executable) if isFrozen() else sys.argv[0]
if hasattr(sys, '_MEIPASS'):
return sys._MEIPASS
base = getattr(sys.modules['__main__'], "__file__", sys.executable) if isFrozen() else __file__
root = os.path.dirname(os.path.realpath(os.path.abspath(base)))
root = unicode(root, sys.getfilesystemencoding())
root = root
return root
def getVersion():
return version
def getDefaultSave():
return unicode(os.path.expanduser(os.path.join("~", ".pyfa")), sys.getfilesystemencoding())
return os.path.expanduser(os.path.join("~", ".pyfa"))
def defPaths(customSavePath):
def defPaths(customSavePath=None):
global debug
global pyfaPath
global savePath
global saveDB
global gameDB
global saveInRoot
global logPath
global cipher
global clientHash
global version
pyfalog.debug("Configuring Pyfa")
@@ -71,6 +110,12 @@ def defPaths(customSavePath):
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.FullLoader)
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)
@@ -86,9 +131,19 @@ def defPaths(customSavePath):
__createDirs(savePath)
if isFrozen():
os.environ["REQUESTS_CA_BUNDLE"] = os.path.join(pyfaPath, "cacert.pem").encode('utf8')
os.environ["SSL_CERT_FILE"] = os.path.join(pyfaPath, "cacert.pem").encode('utf8')
secret_file = os.path.join(savePath, ".secret")
if not os.path.exists(secret_file):
with open(secret_file, "wb") as _file:
_file.write(Fernet.generate_key())
with open(secret_file, 'rb') as fp:
key = fp.read()
clientHash = hashlib.sha3_256(key).hexdigest()
cipher = Fernet(key)
# if isFrozen():
# os.environ["REQUESTS_CA_BUNDLE"] = os.path.join(pyfaPath, "cacert.pem")
# os.environ["SSL_CERT_FILE"] = os.path.join(pyfaPath, "cacert.pem")
# The database where we store all the fits etc
saveDB = os.path.join(savePath, "saveddata.db")
@@ -100,6 +155,13 @@ def defPaths(customSavePath):
if not gameDB:
gameDB = os.path.join(pyfaPath, "eve.db")
if debug:
logFile = "pyfa_debug.log"
else:
logFile = "pyfa.log"
logPath = os.path.join(savePath, logFile)
# DON'T MODIFY ANYTHING BELOW
import eos.config
@@ -112,3 +174,80 @@ def defPaths(customSavePath):
# initialize the settings
from service.settings import EOSSettings
eos.config.settings = EOSSettings.getInstance().EOSSettings # this is kind of confusing, but whatever
def defLogging():
global debug
global logPath
global loggingLevel
global logging_setup
try:
if debug:
logging_setup = NestedSetup([
# make sure we never bubble up to the stderr handler
# if we run out of setup handling
NullHandler(),
StreamHandler(
sys.stdout,
bubble=False,
level=loggingLevel
),
TimedRotatingFileHandler(
logPath,
level=0,
backup_count=3,
bubble=True,
date_format='%Y-%m-%d',
),
])
else:
logging_setup = NestedSetup([
# make sure we never bubble up to the stderr handler
# if we run out of setup handling
NullHandler(),
FingersCrossedHandler(
TimedRotatingFileHandler(
logPath,
level=0,
backup_count=3,
bubble=False,
date_format='%Y-%m-%d',
),
action_level=ERROR,
buffer_size=1000,
# pull_information=True,
# reset=False,
)
])
except:
print("Critical error attempting to setup logging. Falling back to console only.")
logging_setup = NestedSetup([
# make sure we never bubble up to the stderr handler
# if we run out of setup handling
NullHandler(),
StreamHandler(
sys.stdout,
bubble=False
)
])
class LoggerWriter(object):
def __init__(self, level):
# self.level is really like using log.debug(message)
# at least in my case
self.level = level
def write(self, message):
# if statement reduces the amount of newlines that are
# printed to the logger
if message.strip() != '':
self.level(message.replace("\n", ""))
def flush(self):
# create a flush method so things can be flushed when
# the system wants to. Not sure if simply 'printing'
# sys.stderr is the correct way to do it, but it seemed
# to work properly for me.
self.level(sys.stderr)

View File

@@ -0,0 +1,70 @@
# -*- mode: python -*-
import os
from itertools import chain
import subprocess
label = subprocess.check_output([
"git", "describe", "--tags"]).strip()
with open('gitversion', 'w+') as f:
f.write(label.decode())
block_cipher = None
added_files = [
( 'imgs/gui/*.png', 'imgs/gui' ),
( 'imgs/gui/*.gif', 'imgs/gui' ),
( 'imgs/icons/*.png', 'imgs/icons' ),
( 'imgs/renders/*.png', 'imgs/renders' ),
( 'dist_assets/win/pyfa.ico', '.' ),
( 'dist_assets/cacert.pem', '.' ),
( 'eve.db', '.' ),
( 'README.md', '.' ),
( 'LICENSE', '.' ),
( 'gitversion', '.' ),
]
import_these = []
# Walk directories that do dynamic importing
paths = ('eos/effects', '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("_"):
mod_name = "{}.{}".format(
root.replace("/", "."),
file_.split(".py")[0],
)
import_these.append(mod_name)
a = Analysis(['pyfa.py'],
pathex=[],
binaries=[],
datas=added_files,
hiddenimports=import_these,
hookspath=[],
runtime_hooks=[],
excludes=[],
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,
exclude_binaries=True,
name='pyfa',
debug=False,
strip=False,
upx=True,
console=True )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
name='pyfa')

89
dist_assets/mac/pyfa.spec Normal file
View File

@@ -0,0 +1,89 @@
# -*- mode: python -*-
import os
from itertools import chain
import subprocess
import requests.certs
label = subprocess.check_output([
"git", "describe", "--tags"]).strip()
with open('.version', 'w+') as f:
f.write(label.decode())
block_cipher = None
added_files = [
('../../imgs/gui/*.png', 'imgs/gui'),
('../../imgs/gui/*.gif', 'imgs/gui'),
('../../imgs/icons/*.png', 'imgs/icons'),
('../../imgs/renders/*.png', 'imgs/renders'),
('../../dist_assets/win/pyfa.ico', '.'),
('../../service/jargon/*.yaml', 'service/jargon'),
(requests.certs.where(), '.'), # is this needed anymore?
('../../eve.db', '.'),
('../../README.md', '.'),
('../../LICENSE', '.'),
('../../version.yml', '.'),
]
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/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("_"):
mod_name = "{}.{}".format(
root.replace("/", "."),
file_.split(".py")[0],
)
import_these.append(mod_name)
a = Analysis([r'../../pyfa.py'],
pathex=[],
binaries=[],
datas=added_files,
hiddenimports=import_these,
hookspath=['dist_assets/pyinstaller_hooks'],
runtime_hooks=[],
excludes=[],
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,
a.zipfiles,
a.datas,
name='pyfa',
debug=False,
strip=False,
upx=True,
runtime_tmpdir=None,
console=False ,
icon=icon,
)
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

@@ -0,0 +1,78 @@
# This apes hook-matplotlib.backends.py, but REMOVES backends, all but
# the ones in the list below.
# Courtesy of https://github.com/bpteague/cytoflow/blob/70f9291/packaging/hook-matplotlib.backends.py
KEEP = ["WXAgg", "WX", "agg"]
from PyInstaller.compat import is_darwin
from PyInstaller.utils.hooks import (
eval_statement, exec_statement, logger)
def get_matplotlib_backend_module_names():
"""
List the names of all matplotlib backend modules importable under the
current Python installation.
Returns
----------
list
List of the fully-qualified names of all such modules.
"""
# Statement safely importing a single backend module.
import_statement = """
import os, sys
# Preserve stdout.
sys_stdout = sys.stdout
try:
# Redirect output printed by this importation to "/dev/null", preventing
# such output from being erroneously interpreted as an error.
with open(os.devnull, 'w') as dev_null:
sys.stdout = dev_null
__import__('%s')
# If this is an ImportError, print this exception's message without a traceback.
# ImportError messages are human-readable and require no additional context.
except ImportError as exc:
sys.stdout = sys_stdout
print(exc)
# Else, print this exception preceded by a traceback. traceback.print_exc()
# prints to stderr rather than stdout and must not be called here!
except Exception:
sys.stdout = sys_stdout
import traceback
print(traceback.format_exc())
"""
# List of the human-readable names of all available backends.
backend_names = eval_statement(
'import matplotlib; print(matplotlib.rcsetup.all_backends)')
# List of the fully-qualified names of all importable backend modules.
module_names = []
# If the current system is not OS X and the "CocoaAgg" backend is available,
# remove this backend from consideration. Attempting to import this backend
# on non-OS X systems halts the current subprocess without printing output
# or raising exceptions, preventing its reliable detection.
if not is_darwin and 'CocoaAgg' in backend_names:
backend_names.remove('CocoaAgg')
# For safety, attempt to import each backend in a unique subprocess.
for backend_name in backend_names:
if backend_name in KEEP:
continue
module_name = 'matplotlib.backends.backend_%s' % backend_name.lower()
stdout = exec_statement(import_statement % module_name)
# If no output was printed, this backend is importable.
if not stdout:
module_names.append(module_name)
logger.info(' Matplotlib backend "%s": removed' % backend_name)
return module_names
# Freeze all importable backends, as PyInstaller is unable to determine exactly
# which backends are required by the current program.
e=get_matplotlib_backend_module_names()
print(e)
excludedimports = e

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<noInheritable/>
<assemblyIdentity
type="win32"
name="Microsoft.VC90.CRT"
version="9.0.21022.8"
processorArchitecture="x86"
publicKeyToken="1fc8b3b9a1e18e3b"/>
<file name="MSVCR90.DLL"/>
<file name="MSVCM90.DLL"/>
<file name="MSVCP90.DLL"/>
</assembly>

37
dist_assets/win/dist.py Normal file
View File

@@ -0,0 +1,37 @@
# helper script to zip up pyinstaller distribution and create installer file
import os.path
from subprocess import call
import zipfile
from packaging.version import Version
import yaml
with open("version.yml", 'r') as file:
data = yaml.load(file, Loader=yaml.FullLoader)
version = data['version']
os.environ["PYFA_DIST_DIR"] = os.path.join(os.getcwd(), 'dist')
os.environ["PYFA_VERSION"] = version
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")
fileName = "pyfa-{}-win".format(os.environ["PYFA_VERSION"])
print("Compiling EXE")
v = Version(version)
print(v)
call([
iscc,
os.path.join(os.getcwd(), "dist_assets", "win", "pyfa-setup.iss"),
"/dMyAppVersion=%s" % v,
"/dMyAppDir=%s" % source,
"/dMyOutputDir=%s" % os.path.join(os.getcwd()),
"/dMyOutputFile=%s" % fileName]) # stdout=devnull, stderr=devnull
print("Done")

View File

@@ -5,24 +5,22 @@
; we do some #ifdef conditionals because automated compilation passes these as arguments
#ifndef MyAppVersion
#define MyAppVersion "1.15.0"
#endif
#ifndef MyAppExpansion
#define MyAppExpansion "Vanguard 1.0"
#define MyAppVersion "2.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
#define VersionFlag 16
#define MajorVersionFlag 2
#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"
@@ -38,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}
@@ -50,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"
@@ -63,7 +59,7 @@ Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{
Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 0,6.1
[Files]
Source: "{#MyAppDir}\pyfa.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#MyAppDir}\pyfa.exe"; DestDir: "{app}"; Flags: ignoreversion; AfterInstall: RemoveFromVirtualStore
Source: "{#MyAppDir}\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
@@ -103,6 +99,22 @@ begin
FSWbemLocator := Unassigned;
end;
procedure RemoveFromVirtualStore;
var
VirtualStore,FileName,FilePath:String;
DriveChars:Integer;
begin
VirtualStore:=AddBackslash(ExpandConstant('{localappdata}'))+'VirtualStore';
FileName:=ExpandConstant(CurrentFileName);
DriveChars:=Length(ExtractFileDrive(FileName));
if DriveChars>0 then begin
Delete(FileName,1,DriveChars);
FileName:=VirtualStore+FileName;
FilePath:=ExtractFilePath(FileName);
DelTree(FilePath, True, True, True);
end;
end;
function PrepareToInstall(var NeedsRestart: Boolean): String;
begin
if(IsAppRunning( 'pyfa.exe' )) then
@@ -138,15 +150,19 @@ var
V: Integer;
iResultCode: Integer;
sUnInstallString: string;
iOldVersion: Cardinal;
iOldVersionMajor: Cardinal;
iOldVersionMinor: Cardinal;
begin
Result := True; // in case when no previous version is found
if RegValueExists(HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion\Uninstall\{3DA39096-C08D-49CD-90E0-1D177F32C8AA}_is1', 'UninstallString') then //Your App GUID/ID
begin
RegQueryDWordValue(HKEY_LOCAL_MACHINE,
'Software\Microsoft\Windows\CurrentVersion\Uninstall\{3DA39096-C08D-49CD-90E0-1D177F32C8AA}_is1',
'MinorVersion', iOldVersion);
if iOldVersion < {#VersionFlag} then // If old version with old structure is installed.
'MajorVersion', iOldVersionMajor);
RegQueryDWordValue(HKEY_LOCAL_MACHINE,
'Software\Microsoft\Windows\CurrentVersion\Uninstall\{3DA39096-C08D-49CD-90E0-1D177F32C8AA}_is1',
'MinorVersion', iOldVersionMinor);
if (iOldVersionMajor < {#MajorVersionFlag}) or ((iOldVersionMajor = {#MajorVersionFlag}) and (iOldVersionMinor < {#MinorVersionFlag})) then // If old version with old structure is installed.
begin
V := MsgBox(ExpandConstant('An old version of pyfa was detected. Due to recent changes in the application structure, you must uninstall the previous version first. This will not affect your user data (saved fittings, characters, etc.). Do you want to uninstall now?'), mbInformation, MB_YESNO); //Custom Message if App installed
if V = IDYES then

View File

@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity name="pyfa" processorArchitecture="x86" type="win32" version="1.0.0.0"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
</requestedPrivileges>
</security>
</trustInfo>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</dependentAssembly>
</dependency>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
</application>
</compatibility>
</assembly>

View File

@@ -1,35 +1,40 @@
# -*- mode: python -*-
# Note: This script is provided AS-IS for those that may be interested.
# pyfa does not currently support pyInstaller (or any other build process) 100% at the moment
# Command line to build:
# (Run from directory where pyfa.py and pyfa.spec lives.)
# c:\Python27\scripts\pyinstaller.exe --clean --noconfirm --windowed --upx-dir=.\scripts\upx.exe pyfa.spec
# Don't forget to change the path to where your pyfa.py and pyfa.spec lives
# pathex=['C:\\Users\\Ebag333\\Documents\\GitHub\\Ebag333\\Pyfa'],
import os
from itertools import chain
import subprocess
import requests.certs
label = subprocess.check_output(["git", "describe", "--tags"]).strip()
with open('.version', 'w+') as f:
f.write(label.decode())
block_cipher = None
added_files = [
( 'imgs/gui/*.png', 'imgs/gui' ),
( 'imgs/gui/*.gif', 'imgs/gui' ),
( 'imgs/icons/*.png', 'imgs/icons' ),
( 'imgs/renders/*.png', 'imgs/renders' ),
( 'dist_assets/win/pyfa.ico', '.' ),
( 'dist_assets/cacert.pem', '.' ),
( 'eve.db', '.' ),
( 'README.md', '.' ),
( 'LICENSE', '.' ),
('../../imgs/gui/*.png', 'imgs/gui'),
('../../imgs/gui/*.gif', 'imgs/gui'),
('../../imgs/icons/*.png', 'imgs/icons'),
('../../imgs/renders/*.png', 'imgs/renders'),
('../../service/jargon/*.yaml', 'service/jargon'),
('../../dist_assets/win/pyfa.ico', '.'),
('../../dist_assets/win/pyfa.exe.manifest', '.'),
('../../dist_assets/win/Microsoft.VC90.CRT.manifest', '.'),
(requests.certs.where(), '.'), # is this needed anymore?
('../../eve.db', '.'),
('../../README.md', '.'),
('../../LICENSE', '.'),
('../../version.yml', '.'),
]
import_these = []
import_these = [
'numpy.core._dtype_ctypes' # https://github.com/pyinstaller/pyinstaller/issues/3982
]
# Walk eos.effects and add all effects so we can import them properly
for root, folders, files in os.walk("eos/effects"):
# Walk directories that do dynamic importing
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("_"):
mod_name = "{}.{}".format(
@@ -38,25 +43,24 @@ for root, folders, files in os.walk("eos/effects"):
)
import_these.append(mod_name)
a = Analysis(
['pyfa.py'],
pathex=['C:\\projects\\pyfa\\'],
a = Analysis(['../../pyfa.py'],
pathex=[
# Need this, see https://github.com/pyinstaller/pyinstaller/issues/1566
# To get this, download and install windows 10 SDK
# If not building on Windows 10, this might be optional
r'C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x86'],
binaries=[],
datas=added_files,
hiddenimports=import_these,
hookspath=[],
hookspath=['dist_assets/pyinstaller_hooks'],
runtime_hooks=[],
excludes=[],
excludes=['Tkinter'],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
)
cipher=block_cipher)
pyz = PYZ(
a.pure,
a.zipped_data,
cipher=block_cipher,
)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
@@ -67,7 +71,6 @@ exe = EXE(pyz,
upx=True,
name='pyfa',
icon='dist_assets/win/pyfa.ico',
onefile=False,
)
coll = COLLECT(
@@ -77,7 +80,7 @@ coll = COLLECT(
a.datas,
strip=False,
upx=True,
onefile=False,
name='pyfa',
icon='dist_assets/win/pyfa.ico',
)

View File

@@ -0,0 +1,45 @@
# UTF-8
#
# For more details about fixed file info 'ffi' see:
# http://msdn.microsoft.com/en-us/library/ms646997.aspx
VSVersionInfo(
ffi=FixedFileInfo(
# filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4)
# Set not needed items to zero 0.
filevers=(1, 15, 1, 0),
prodvers=(1, 15, 1, 0),
# Contains a bitmask that specifies the valid bits 'flags'r
mask=0x3f,
# Contains a bitmask that specifies the Boolean attributes of the file.
flags=0x0,
# The operating system for which this file was designed.
# 0x4 - NT and there is no need to change it.
OS=0x40004,
# The general type of file.
# 0x1 - the file is an application.
fileType=0x1,
# The function of the file.
# 0x0 - the function is not defined for this fileType
subtype=0x0,
# Creation date and time stamp.
date=(0, 0)
),
kids=[
StringFileInfo(
[
StringTable(
u'040904E4',
[StringStruct(u'LegalCopyright', u''),
StringStruct(u'InternalName', u'pyfa.exe'),
StringStruct(u'FileVersion', u'1.15.1.0'),
StringStruct(u'CompanyName', u''),
StringStruct(u'OriginalFilename', u'pyfa.exe'),
StringStruct(u'ProductVersion', u'1.15.1.0'),
StringStruct(u'FileDescription', u'Python fitting assistant'),
StringStruct(u'LegalTrademarks', u''),
StringStruct(u'Comments', u''),
StringStruct(u'ProductName', u'pyfa')])
]),
VarFileInfo([VarStruct(u'Translation', [1033, 1252])])
]
)

View File

@@ -1,6 +1,7 @@
import heapq
import time
from math import sqrt, exp
from functools import reduce
DAY = 24 * 60 * 60 * 1000
@@ -71,7 +72,7 @@ class CapSimulator(object):
disable_period = False
# Loop over modules, clearing clipSize if applicable, and group modules based on attributes
for (duration, capNeed, clipSize, disableStagger) in self.modules:
for (duration, capNeed, clipSize, disableStagger, reloadTime) in self.modules:
if self.scale:
duration, capNeed = self.scale_activation(duration, capNeed)
@@ -79,24 +80,25 @@ class CapSimulator(object):
# a cap booster module.
if not self.reload and capNeed > 0:
clipSize = 0
reloadTime = 0
# Group modules based on their properties
if (duration, capNeed, clipSize, disableStagger) in mods:
mods[(duration, capNeed, clipSize, disableStagger)] += 1
if (duration, capNeed, clipSize, disableStagger, reloadTime) in mods:
mods[(duration, capNeed, clipSize, disableStagger, reloadTime)] += 1
else:
mods[(duration, capNeed, clipSize, disableStagger)] = 1
mods[(duration, capNeed, clipSize, disableStagger, reloadTime)] = 1
# Loop over grouped modules, configure staggering and push to the simulation state
for (duration, capNeed, clipSize, disableStagger), amount in mods.iteritems():
for (duration, capNeed, clipSize, disableStagger, reloadTime), amount in mods.items():
if self.stagger and not disableStagger:
if clipSize == 0:
duration = int(duration / amount)
else:
stagger_amount = (duration * clipSize + 10000) / (amount * clipSize)
stagger_amount = (duration * clipSize + reloadTime) / (amount * clipSize)
for i in range(1, amount):
heapq.heappush(self.state,
[i * stagger_amount, duration,
capNeed, 0, clipSize])
capNeed, 0, clipSize, reloadTime])
else:
capNeed *= amount
@@ -106,7 +108,7 @@ class CapSimulator(object):
if clipSize:
disable_period = True
heapq.heappush(self.state, [0, duration, capNeed, 0, clipSize])
heapq.heappush(self.state, [0, duration, capNeed, 0, clipSize, reloadTime])
if disable_period:
self.period = self.t_max
@@ -143,7 +145,7 @@ class CapSimulator(object):
while 1:
activation = pop(state)
t_now, duration, capNeed, shot, clipSize = activation
t_now, duration, capNeed, shot, clipSize, reloadTime = activation
if t_now >= t_max:
break
@@ -179,7 +181,7 @@ class CapSimulator(object):
if clipSize:
if shot % clipSize == 0:
shot = 0
t_now += 10000 # include reload time
t_now += reloadTime # include reload time
activation[0] = t_now
activation[3] = shot
@@ -192,7 +194,7 @@ class CapSimulator(object):
# calculate EVE's stability value
try:
avgDrain = reduce(float.__add__, map(lambda x: x[2] / x[1], self.state), 0.0)
avgDrain = reduce(float.__add__, [x[2] / x[1] for x in self.state], 0.0)
self.cap_stable_eve = 0.25 * (1.0 + sqrt(-(2.0 * avgDrain * tau - capCapacity) / capCapacity)) ** 2
except ValueError:
self.cap_stable_eve = 0.0

View File

@@ -11,21 +11,23 @@ debug = False
gamedataCache = True
saveddataCache = True
gamedata_version = ""
gamedata_connectionstring = 'sqlite:///' + unicode(realpath(join(dirname(abspath(__file__)), "..", "eve.db")), sys.getfilesystemencoding())
gamedata_date = ""
gamedata_connectionstring = 'sqlite:///' + realpath(join(dirname(abspath(__file__)), "..", "eve.db"))
pyfalog.debug("Gamedata connection string: {0}", gamedata_connectionstring)
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:///' + unicode(realpath(join(dirname(abspath(__file__)), "..", "saveddata", "saveddata.db")), sys.getfilesystemencoding())
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.
path = dirname(unicode(__file__, sys.getfilesystemencoding()))
path = dirname(__file__)

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

@@ -22,7 +22,7 @@ import threading
from sqlalchemy import MetaData, create_engine
from sqlalchemy.orm import sessionmaker
import migration
from . import migration
from eos import config
from logbook import Logger
@@ -51,10 +51,14 @@ try:
config.gamedata_version = gamedata_session.execute(
"SELECT `field_value` FROM `metadata` WHERE `field_name` LIKE 'client_build'"
).fetchone()[0]
config.gamedata_date = gamedata_session.execute(
"SELECT `field_value` FROM `metadata` WHERE `field_name` LIKE 'dump_time'"
).fetchone()[0]
except Exception as e:
pyfalog.warning("Missing gamedata version.")
pyfalog.critical(e)
config.gamedata_version = None
config.gamedata_date = None
saveddata_connectionstring = config.saveddata_connectionstring
if saveddata_connectionstring is not None:
@@ -74,10 +78,10 @@ sd_lock = threading.RLock()
# Import all the definitions for all our database stuff
# noinspection PyPep8
from eos.db.gamedata import alphaClones, attribute, category, effect, group, icon, item, marketGroup, metaData, metaGroup, queries, traits, unit
from eos.db.gamedata import alphaClones, attribute, category, effect, group, item, marketGroup, metaData, metaGroup, queries, traits, unit, dynamicAttributes
# noinspection PyPep8
from eos.db.saveddata import booster, cargo, character, crest, damagePattern, databaseRepair, drone, fighter, fit, implant, implantSet, loadDefaultDatabaseValues, \
miscData, module, override, price, queries, skill, targetResists, user
from eos.db.saveddata import booster, cargo, character, damagePattern, databaseRepair, drone, fighter, fit, implant, implantSet, loadDefaultDatabaseValues, \
miscData, mutator, module, override, price, queries, skill, targetResists, user
# Import queries
# noinspection PyPep8

View File

@@ -1,2 +1,2 @@
__all__ = ["attribute", "category", "effect", "group", "metaData",
"icon", "item", "marketGroup", "metaGroup", "unit", "alphaClones"]
__all__ = ["attribute", "category", "effect", "group", "metaData", "dynamicAttributes",
"item", "marketGroup", "metaGroup", "unit", "alphaClones"]

View File

@@ -22,7 +22,7 @@ from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.orm import relation, mapper, synonym, deferred
from eos.db import gamedata_meta
from eos.gamedata import Attribute, AttributeInfo, Unit, Icon
from eos.gamedata import Attribute, AttributeInfo, Unit
typeattributes_table = Table("dgmtypeattribs", gamedata_meta,
Column("value", Float),
@@ -38,7 +38,9 @@ attributes_table = Table("dgmattribs", gamedata_meta,
Column("published", Boolean),
Column("displayName", String),
Column("highIsGood", Boolean),
Column("iconID", Integer, ForeignKey("icons.iconID")),
Column("iconID", Integer),
Column("attributeCategory", Integer),
Column("tooltipDescription", Integer),
Column("unitID", Integer, ForeignKey("dgmunits.unitID")))
mapper(Attribute, typeattributes_table,
@@ -46,7 +48,6 @@ mapper(Attribute, typeattributes_table,
mapper(AttributeInfo, attributes_table,
properties={
"icon" : relation(Icon),
"unit" : relation(Unit),
"ID" : synonym("attributeID"),
"name" : synonym("attributeName"),

View File

@@ -17,22 +17,21 @@
# along with eos. If not, see <http://www.gnu.org/licenses/>.
# ===============================================================================
from sqlalchemy import Column, String, Integer, ForeignKey, Boolean, Table
from sqlalchemy.orm import relation, mapper, synonym, deferred
from sqlalchemy import Boolean, Column, Integer, String, Table
from sqlalchemy.orm import deferred, mapper, synonym
from eos.db import gamedata_meta
from eos.gamedata import Category, Icon
from eos.gamedata import Category
categories_table = Table("invcategories", gamedata_meta,
Column("categoryID", Integer, primary_key=True),
Column("categoryName", String),
Column("description", String),
Column("published", Boolean),
Column("iconID", Integer, ForeignKey("icons.iconID")))
Column("iconID", Integer))
mapper(Category, categories_table,
properties={
"icon" : relation(Icon),
"ID" : synonym("categoryID"),
"name" : synonym("categoryName"),
"description": deferred(categories_table.c.description)

View File

@@ -0,0 +1,65 @@
# ===============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of eos.
#
# eos is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# eos is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with eos. If not, see <http://www.gnu.org/licenses/>.
# ===============================================================================
from sqlalchemy import Column, Float, Integer, Table, ForeignKey
from sqlalchemy.orm import mapper, relation, synonym
from sqlalchemy.ext.associationproxy import association_proxy
from eos.db import gamedata_meta
from eos.gamedata import DynamicItem, DynamicItemAttribute, DynamicItemItem, Item
from eos.gamedata import AttributeInfo
dynamic_table = Table("mutaplasmids", gamedata_meta,
Column("typeID", ForeignKey("invtypes.typeID"), primary_key=True, index=True),
Column("resultingTypeID", ForeignKey("invtypes.typeID"), primary_key=True))
dynamicAttributes_table = Table("mutaplasmidAttributes", gamedata_meta,
Column("typeID", Integer, ForeignKey("mutaplasmids.typeID"), primary_key=True),
Column("attributeID", ForeignKey("dgmattribs.attributeID"), primary_key=True),
Column("min", Float),
Column("max", Float))
dynamicApplicable_table = Table("mutaplasmidItems", gamedata_meta,
Column("typeID", ForeignKey("mutaplasmids.typeID"), primary_key=True),
Column("applicableTypeID", ForeignKey("invtypes.typeID"), primary_key=True),)
mapper(DynamicItem, dynamic_table, properties={
"attributes": relation(DynamicItemAttribute),
"item": relation(Item, foreign_keys=[dynamic_table.c.typeID]),
"resultingItem": relation(Item, foreign_keys=[dynamic_table.c.resultingTypeID]),
"ID": synonym("typeID"),
})
mapper(DynamicItemAttribute, dynamicAttributes_table,
properties={"info": relation(AttributeInfo, lazy=False)})
mapper(DynamicItemItem, dynamicApplicable_table, properties={
"mutaplasmid": relation(DynamicItem),
})
DynamicItemAttribute.ID = association_proxy("info", "attributeID")
DynamicItemAttribute.name = association_proxy("info", "attributeName")
DynamicItemAttribute.description = association_proxy("info", "description")
DynamicItemAttribute.published = association_proxy("info", "published")
DynamicItemAttribute.displayName = association_proxy("info", "displayName")
DynamicItemAttribute.highIsGood = association_proxy("info", "highIsGood")
DynamicItemAttribute.iconID = association_proxy("info", "iconID")
DynamicItemAttribute.icon = association_proxy("info", "icon")
DynamicItemAttribute.unit = association_proxy("info", "unit")

View File

@@ -18,10 +18,10 @@
# ===============================================================================
from sqlalchemy import Column, String, Integer, Boolean, ForeignKey, Table
from sqlalchemy.orm import relation, mapper, synonym, deferred
from sqlalchemy.orm import relation, mapper, synonym, deferred, backref
from eos.db import gamedata_meta
from eos.gamedata import Category, Group, Icon
from eos.gamedata import Category, Group
groups_table = Table("invgroups", gamedata_meta,
Column("groupID", Integer, primary_key=True),
@@ -29,12 +29,11 @@ groups_table = Table("invgroups", gamedata_meta,
Column("description", String),
Column("published", Boolean),
Column("categoryID", Integer, ForeignKey("invcategories.categoryID")),
Column("iconID", Integer, ForeignKey("icons.iconID")))
Column("iconID", Integer))
mapper(Group, groups_table,
properties={
"category" : relation(Category, backref="groups"),
"icon" : relation(Icon),
"category" : relation(Category, backref=backref("groups", cascade="all,delete")),
"ID" : synonym("groupID"),
"name" : synonym("groupName"),
"description": deferred(groups_table.c.description)

View File

@@ -1,35 +0,0 @@
# ===============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of eos.
#
# eos is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# eos is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with eos. If not, see <http://www.gnu.org/licenses/>.
# ===============================================================================
from sqlalchemy import Column, String, Integer, Table
from sqlalchemy.orm import mapper, synonym, deferred
from eos.db import gamedata_meta
from eos.gamedata import Icon
icons_table = Table("icons", gamedata_meta,
Column("iconID", Integer, primary_key=True),
Column("description", String),
Column("iconFile", String))
mapper(Icon, icons_table,
properties={
"ID" : synonym("iconID"),
"description": deferred(icons_table.c.description)
})

View File

@@ -17,14 +17,15 @@
# along with eos. If not, see <http://www.gnu.org/licenses/>.
# ===============================================================================
from sqlalchemy import Column, String, Integer, Boolean, ForeignKey, Table, Float
from sqlalchemy import Boolean, Column, Float, ForeignKey, Integer, String, Table
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.orm import relation, mapper, synonym, deferred
from sqlalchemy.orm import backref, deferred, mapper, relation, synonym
from sqlalchemy.orm.collections import attribute_mapped_collection
from eos.db.gamedata.effect import typeeffects_table
from eos.db import gamedata_meta
from eos.gamedata import Attribute, Effect, Group, Icon, Item, MetaType, Traits
from eos.db.gamedata.dynamicAttributes import dynamicApplicable_table
from eos.db.gamedata.effect import typeeffects_table
from eos.gamedata import Attribute, DynamicItem, Effect, Group, Item, MetaType, Traits
items_table = Table("invtypes", gamedata_meta,
Column("typeID", Integer, primary_key=True),
@@ -37,16 +38,17 @@ items_table = Table("invtypes", gamedata_meta,
Column("capacity", Float),
Column("published", Boolean),
Column("marketGroupID", Integer, ForeignKey("invmarketgroups.marketGroupID")),
Column("iconID", Integer, ForeignKey("icons.iconID")),
Column("groupID", Integer, ForeignKey("invgroups.groupID"), index=True))
Column("iconID", Integer),
Column("graphicID", Integer),
Column("groupID", Integer, ForeignKey("invgroups.groupID"), index=True),
Column("replacements", String))
from .metaGroup import metatypes_table # noqa
from .traits import traits_table # noqa
mapper(Item, items_table,
properties={
"group" : relation(Group, backref="items"),
"icon" : relation(Icon),
"group" : relation(Group, backref=backref("items", cascade="all,delete")),
"_Item__attributes": relation(Attribute, cascade='all, delete, delete-orphan', collection_class=attribute_mapped_collection('name')),
"effects": relation(Effect, secondary=typeeffects_table, collection_class=attribute_mapped_collection('name')),
"metaGroup" : relation(MetaType,
@@ -57,7 +59,12 @@ mapper(Item, items_table,
"description" : deferred(items_table.c.description),
"traits" : relation(Traits,
primaryjoin=traits_table.c.typeID == items_table.c.typeID,
uselist=False)
uselist=False),
"mutaplasmids": relation(DynamicItem,
primaryjoin=dynamicApplicable_table.c.applicableTypeID == items_table.c.typeID,
secondaryjoin=dynamicApplicable_table.c.typeID == DynamicItem.typeID,
secondary=dynamicApplicable_table,
backref="applicableItems")
})
Item.category = association_proxy("group", "category")

View File

@@ -21,7 +21,7 @@ from sqlalchemy import Column, String, Integer, Boolean, ForeignKey, Table
from sqlalchemy.orm import relation, mapper, synonym, deferred
from eos.db import gamedata_meta
from eos.gamedata import Icon, Item, MarketGroup
from eos.gamedata import Item, MarketGroup
marketgroups_table = Table("invmarketgroups", gamedata_meta,
Column("marketGroupID", Integer, primary_key=True),
@@ -30,14 +30,13 @@ marketgroups_table = Table("invmarketgroups", gamedata_meta,
Column("hasTypes", Boolean),
Column("parentGroupID", Integer,
ForeignKey("invmarketgroups.marketGroupID", initially="DEFERRED", deferrable=True)),
Column("iconID", Integer, ForeignKey("icons.iconID")))
Column("iconID", Integer))
mapper(MarketGroup, marketgroups_table,
properties={
"items" : relation(Item, backref="marketGroup"),
"parent" : relation(MarketGroup, backref="children",
remote_side=[marketgroups_table.c.marketGroupID]),
"icon" : relation(Icon),
"ID" : synonym("marketGroupID"),
"name" : synonym("marketGroupName"),
"description": deferred(marketgroups_table.c.description)

View File

@@ -17,15 +17,16 @@
# along with eos. If not, see <http://www.gnu.org/licenses/>.
# ===============================================================================
from sqlalchemy.orm import join, exc, aliased
from sqlalchemy.inspection import inspect
from sqlalchemy.orm import aliased, exc, join
from sqlalchemy.sql import and_, or_, select
import eos.config
from eos.db import gamedata_session
from eos.db.gamedata.metaGroup import metatypes_table, items_table
from eos.db.gamedata.group import groups_table
from eos.db.gamedata.metaGroup import items_table, metatypes_table
from eos.db.util import processEager, processWhere
from eos.gamedata import AlphaClone, Attribute, Category, Group, Item, MarketGroup, MetaGroup, AttributeInfo, MetaData
from eos.gamedata import AlphaClone, Attribute, AttributeInfo, Category, DynamicItem, Group, Item, MarketGroup, MetaData, MetaGroup
cache = {}
configVal = getattr(eos.config, "gamedataCache", None)
@@ -81,7 +82,7 @@ def getItem(lookfor, eager=None):
item = gamedata_session.query(Item).get(lookfor)
else:
item = gamedata_session.query(Item).options(*processEager(eager)).filter(Item.ID == lookfor).first()
elif isinstance(lookfor, basestring):
elif isinstance(lookfor, str):
if lookfor in itemNameMap:
id = itemNameMap[lookfor]
if eager is None:
@@ -97,6 +98,36 @@ def getItem(lookfor, eager=None):
return item
def getMutaplasmid(lookfor, eager=None):
if isinstance(lookfor, int):
item = gamedata_session.query(DynamicItem).filter(DynamicItem.ID == lookfor).first()
else:
raise TypeError("Need integer as argument")
return item
def getItemWithBaseItemAttribute(lookfor, baseItemID, eager=None):
# A lot of this is described in more detail in #1597
item = gamedata_session.query(Item).get(lookfor)
base = getItem(baseItemID)
# we have to load all attributes for this object, otherwise we'll lose access to them when we expunge.
# todo: figure out a way to eagerly load all these via the query...
for x in [*inspect(Item).relationships.keys(), 'description']:
getattr(item, x)
# Copy over the attributes from the base, but ise the items attributes when there's an overlap
# WARNING: the attribute object still has the old typeID. I don't believe we access this typeID anywhere in the code,
# but should keep this in mind for now.
item._Item__attributes = {**base.attributes, **item.attributes}
# Expunge the item form the session. This is required to have different Abyssal / Base combinations loaded in memory.
# Without expunging it, once one Abyssal Web is created, SQLAlchmey will use it for all others. We don't want this,
# we want to generate a completely new object to work with
gamedata_session.expunge(item)
return item
@cachedQuery(1, "lookfor")
def getItems(lookfor, eager=None):
"""
@@ -154,7 +185,7 @@ def getGroup(lookfor, eager=None):
group = gamedata_session.query(Group).get(lookfor)
else:
group = gamedata_session.query(Group).options(*processEager(eager)).filter(Group.ID == lookfor).first()
elif isinstance(lookfor, basestring):
elif isinstance(lookfor, str):
if lookfor in groupNameMap:
id = groupNameMap[lookfor]
if eager is None:
@@ -181,7 +212,7 @@ def getCategory(lookfor, eager=None):
else:
category = gamedata_session.query(Category).options(*processEager(eager)).filter(
Category.ID == lookfor).first()
elif isinstance(lookfor, basestring):
elif isinstance(lookfor, str):
if lookfor in categoryNameMap:
id = categoryNameMap[lookfor]
if eager is None:
@@ -210,7 +241,7 @@ def getMetaGroup(lookfor, eager=None):
else:
metaGroup = gamedata_session.query(MetaGroup).options(*processEager(eager)).filter(
MetaGroup.ID == lookfor).first()
elif isinstance(lookfor, basestring):
elif isinstance(lookfor, str):
if lookfor in metaGroupNameMap:
id = metaGroupNameMap[lookfor]
if eager is None:
@@ -245,7 +276,7 @@ def getMarketGroup(lookfor, eager=None):
def getItemsByCategory(filter, where=None, eager=None):
if isinstance(filter, int):
filter = Category.ID == filter
elif isinstance(filter, basestring):
elif isinstance(filter, str):
filter = Category.name == filter
else:
raise TypeError("Need integer or string as argument")
@@ -257,7 +288,7 @@ def getItemsByCategory(filter, where=None, eager=None):
@cachedQuery(3, "where", "nameLike", "join")
def searchItems(nameLike, where=None, join=None, eager=None):
if not isinstance(nameLike, basestring):
if not isinstance(nameLike, str):
raise TypeError("Need string as argument")
if join is None:
@@ -268,7 +299,7 @@ def searchItems(nameLike, where=None, join=None, eager=None):
items = gamedata_session.query(Item).options(*processEager(eager)).join(*join)
for token in nameLike.split(' '):
token_safe = u"%{0}%".format(sqlizeString(token))
token_safe = "%{0}%".format(sqlizeString(token))
if where is not None:
items = items.filter(and_(Item.name.like(token_safe, escape="\\"), where))
else:
@@ -279,12 +310,12 @@ def searchItems(nameLike, where=None, join=None, eager=None):
@cachedQuery(3, "where", "nameLike", "join")
def searchSkills(nameLike, where=None, eager=None):
if not isinstance(nameLike, basestring):
if not isinstance(nameLike, str):
raise TypeError("Need string as argument")
items = gamedata_session.query(Item).options(*processEager(eager)).join(Item.group, Group.category)
for token in nameLike.split(' '):
token_safe = u"%{0}%".format(sqlizeString(token))
token_safe = "%{0}%".format(sqlizeString(token))
if where is not None:
items = items.filter(and_(Item.name.like(token_safe, escape="\\"), Category.ID == 16, where))
else:
@@ -322,7 +353,7 @@ def getVariations(itemids, groupIDs=None, where=None, eager=None):
@cachedQuery(1, "attr")
def getAttributeInfo(attr, eager=None):
if isinstance(attr, basestring):
if isinstance(attr, str):
filter = AttributeInfo.name == attr
elif isinstance(attr, int):
filter = AttributeInfo.ID == attr
@@ -337,7 +368,7 @@ def getAttributeInfo(attr, eager=None):
@cachedQuery(1, "field")
def getMetaData(field):
if isinstance(field, basestring):
if isinstance(field, str):
data = gamedata_session.query(MetaData).get(field)
else:
raise TypeError("Need string as argument")
@@ -361,13 +392,32 @@ def directAttributeRequest(itemIDs, attrIDs):
return result
def getAbyssalTypes():
return set([r.resultingTypeID for r in gamedata_session.query(DynamicItem.resultingTypeID).distinct()])
@cachedQuery(1, "itemID")
def getDynamicItem(itemID, eager=None):
try:
if isinstance(itemID, int):
if eager is None:
result = gamedata_session.query(DynamicItem).filter(DynamicItem.ID == itemID).one()
else:
result = gamedata_session.query(DynamicItem).options(*processEager(eager)).filter(DynamicItem.ID == itemID).one()
else:
raise TypeError("Need integer as argument")
except exc.NoResultFound:
result = None
return result
def getRequiredFor(itemID, attrMapping):
Attribute1 = aliased(Attribute)
Attribute2 = aliased(Attribute)
skillToLevelClauses = []
for attrSkill, attrLevel in attrMapping.iteritems():
for attrSkill, attrLevel in attrMapping.items():
skillToLevelClauses.append(and_(Attribute1.attributeID == attrSkill, Attribute2.attributeID == attrLevel))
queryOr = or_(*skillToLevelClauses)

View File

@@ -3,7 +3,7 @@ import shutil
import time
import config
import migrations
from . import migrations
pyfalog = Logger(__name__)
@@ -34,7 +34,7 @@ def update(saveddata_engine):
shutil.copyfile(config.saveDB, toFile)
for version in xrange(dbVersion, appVersion):
for version in range(dbVersion, appVersion):
func = migrations.updates[version + 1]
if func:
pyfalog.info("Applying database update: {0}", version + 1)

View File

@@ -15,7 +15,27 @@ updates = {}
appVersion = 0
prefix = __name__ + "."
for importer, modname, ispkg in pkgutil.iter_modules(__path__, prefix):
# load modules to work based with and without pyinstaller
# from: https://github.com/webcomics/dosage/blob/master/dosagelib/loader.py
# see: https://github.com/pyinstaller/pyinstaller/issues/1905
# load modules using iter_modules()
# (should find all filters in normal build, but not pyinstaller)
module_names = [m[1] for m in pkgutil.iter_modules(__path__, prefix)]
# special handling for PyInstaller
importers = map(pkgutil.get_importer, __path__)
toc = set()
for i in importers:
if hasattr(i, 'toc'):
toc |= i.toc
for elm in toc:
if elm.startswith(prefix):
module_names.append(elm)
for modname in module_names:
# loop through python files, extracting update number and function, and
# adding it to a list
modname_tail = modname.rsplit('.', 1)[-1]

View File

@@ -91,7 +91,7 @@ def upgrade(saveddata_engine):
saveddata_engine.execute("ALTER TABLE fits ADD COLUMN targetResistsID INTEGER;")
# Convert modules
for replacement_item, list in CONVERSIONS.iteritems():
for replacement_item, list in CONVERSIONS.items():
for retired_item in list:
saveddata_engine.execute('UPDATE "modules" SET "itemID" = ? WHERE "itemID" = ?',
(replacement_item, retired_item))

View File

@@ -108,7 +108,7 @@ CONVERSIONS = {
def upgrade(saveddata_engine):
# Convert modules
for replacement_item, list in CONVERSIONS.iteritems():
for replacement_item, list in CONVERSIONS.items():
for retired_item in list:
saveddata_engine.execute('UPDATE "modules" SET "itemID" = ? WHERE "itemID" = ?',
(replacement_item, retired_item))

View File

@@ -332,7 +332,7 @@ CONVERSIONS = {
def upgrade(saveddata_engine):
# Convert modules
for replacement_item, list in CONVERSIONS.iteritems():
for replacement_item, list in CONVERSIONS.items():
for retired_item in list:
saveddata_engine.execute('UPDATE "modules" SET "itemID" = ? WHERE "itemID" = ?',
(replacement_item, retired_item))

View File

@@ -60,7 +60,7 @@ CONVERSIONS = {
def upgrade(saveddata_engine):
# Convert modules
for replacement_item, list in CONVERSIONS.iteritems():
for replacement_item, list in CONVERSIONS.items():
for retired_item in list:
saveddata_engine.execute('UPDATE "modules" SET "itemID" = ? WHERE "itemID" = ?',
(replacement_item, retired_item))

View File

@@ -14,7 +14,7 @@ def upgrade(saveddata_engine):
"boosters": 2,
"cargo": 2,
"characters": 2,
"crest": 1,
# "crest": 1,
"damagePatterns": 2,
"drones": 2,
"fighters": 2,
@@ -29,7 +29,7 @@ def upgrade(saveddata_engine):
"targetResists": 2
}
for table in tables.keys():
for table in list(tables.keys()):
# midnight brain, there's probably a much more simple way to do this, but fuck it
if tables[table] > 0:

View File

@@ -4204,7 +4204,7 @@ conversion2 = {
def upgrade(saveddata_engine):
# First we want to get a list of fittings that are completely fitted out with subsystems
oldItems = [str(x) for x in conversion2.iterkeys()]
oldItems = [str(x) for x in conversion2.keys()]
# I can't figure out a way to get IN operator to work when supplying a list using a parameterized query. So I'm
# doing it the shitty way by formatting the SQL string. Don't do this kids!
@@ -4239,7 +4239,7 @@ def upgrade(saveddata_engine):
# if something fails, fuck it, we tried. It'll default to the generic conversion below
continue
for oldItem, newItem in conversion2.iteritems():
for oldItem, newItem in conversion2.items():
saveddata_engine.execute('UPDATE "modules" SET "itemID" = ? WHERE "itemID" = ?',
(newItem, oldItem))
saveddata_engine.execute('UPDATE "cargo" SET "itemID" = ? WHERE "itemID" = ?',

View File

@@ -0,0 +1,18 @@
"""
Migration 28
- adds baseItemID and mutaplasmidID to modules table
"""
import sqlalchemy
def upgrade(saveddata_engine):
try:
saveddata_engine.execute("SELECT baseItemID FROM modules LIMIT 1")
except sqlalchemy.exc.DatabaseError:
saveddata_engine.execute("ALTER TABLE modules ADD COLUMN baseItemID INT;")
try:
saveddata_engine.execute("SELECT mutaplasmidID FROM modules LIMIT 1")
except sqlalchemy.exc.DatabaseError:
saveddata_engine.execute("ALTER TABLE modules ADD COLUMN mutaplasmidID 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

@@ -133,7 +133,7 @@ CONVERSIONS = {
def upgrade(saveddata_engine):
# Convert modules
for replacement_item, list in CONVERSIONS.iteritems():
for replacement_item, list in CONVERSIONS.items():
for retired_item in list:
saveddata_engine.execute('UPDATE "modules" SET "itemID" = ? WHERE "itemID" = ?',
(replacement_item, retired_item))

View File

@@ -17,7 +17,7 @@ CONVERSIONS = {
def upgrade(saveddata_engine):
# Convert ships
for replacement_item, list in CONVERSIONS.iteritems():
for replacement_item, list in CONVERSIONS.items():
for retired_item in list:
saveddata_engine.execute('UPDATE "fits" SET "shipID" = ? WHERE "shipID" = ?',
(replacement_item, retired_item))

View File

@@ -77,7 +77,7 @@ CONVERSIONS = {
def upgrade(saveddata_engine):
# Convert modules
for replacement_item, list in CONVERSIONS.iteritems():
for replacement_item, list in CONVERSIONS.items():
for retired_item in list:
saveddata_engine.execute('UPDATE "modules" SET "itemID" = ? WHERE "itemID" = ?',
(replacement_item, retired_item))

View File

@@ -1,6 +1,7 @@
__all__ = [
"character",
"fit",
"mutator",
"module",
"user",
"skill",
@@ -12,7 +13,6 @@ __all__ = [
"miscData",
"targetResists",
"override",
"crest",
"implantSet",
"loadDefaultDatabaseValues"
]

View File

@@ -17,24 +17,21 @@
# along with eos. If not, see <http://www.gnu.org/licenses/>.
# ===============================================================================
from sqlalchemy import Table, Column, Integer, ForeignKey, String, DateTime, Float
from sqlalchemy import Table, Column, Integer, ForeignKey, String, DateTime, Float, UniqueConstraint
from sqlalchemy.orm import relation, mapper
import datetime
from eos.db import saveddata_meta
from eos.db.saveddata.implant import charImplants_table
from eos.effectHandlerHelpers import HandledImplantBoosterList
from eos.effectHandlerHelpers import HandledImplantBoosterList, HandledSsoCharacterList
from eos.saveddata.implant import Implant
from eos.saveddata.user import User
from eos.saveddata.character import Character, Skill
from eos.saveddata.ssocharacter import SsoCharacter
characters_table = Table("characters", saveddata_meta,
Column("ID", Integer, primary_key=True),
Column("name", String, nullable=False),
Column("apiID", Integer),
Column("apiKey", String),
Column("defaultChar", Integer),
Column("chars", String, nullable=True),
Column("defaultLevel", Integer, nullable=True),
Column("alphaCloneID", Integer, nullable=True),
Column("ownerID", ForeignKey("users.ID"), nullable=True),
@@ -42,6 +39,28 @@ characters_table = Table("characters", saveddata_meta,
Column("created", DateTime, nullable=True, default=datetime.datetime.now),
Column("modified", DateTime, nullable=True, onupdate=datetime.datetime.now))
sso_table = Table("ssoCharacter", saveddata_meta,
Column("ID", Integer, primary_key=True),
Column("client", String, nullable=False),
Column("characterID", Integer, nullable=False),
Column("characterName", String, nullable=False),
Column("refreshToken", String, nullable=False),
Column("accessToken", String, nullable=False),
Column("accessTokenExpires", DateTime, nullable=False),
Column("created", DateTime, nullable=True, default=datetime.datetime.now),
Column("modified", DateTime, nullable=True, onupdate=datetime.datetime.now),
UniqueConstraint('client', 'characterID', name='uix_client_characterID'),
UniqueConstraint('client', 'characterName', name='uix_client_characterName')
)
sso_character_map_table = Table("ssoCharacterMap", saveddata_meta,
Column("characterID", ForeignKey("characters.ID"), primary_key=True),
Column("ssoCharacterID", ForeignKey("ssoCharacter.ID"), primary_key=True),
)
mapper(SsoCharacter, sso_table)
mapper(Character, characters_table,
properties={
"_Character__alphaCloneID": characters_table.c.alphaCloneID,
@@ -63,5 +82,10 @@ mapper(Character, characters_table,
primaryjoin=charImplants_table.c.charID == characters_table.c.ID,
secondaryjoin=charImplants_table.c.implantID == Implant.ID,
secondary=charImplants_table),
"_Character__ssoCharacters" : relation(
SsoCharacter,
collection_class=HandledSsoCharacterList,
backref='characters',
secondary=sso_character_map_table)
}
)

View File

@@ -1,34 +0,0 @@
# ===============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of eos.
#
# eos is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# eos is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with eos. If not, see <http://www.gnu.org/licenses/>.
# ===============================================================================
from sqlalchemy import Table, Column, Integer, String, DateTime
from sqlalchemy.orm import mapper
import datetime
from eos.db import saveddata_meta
from eos.saveddata.crestchar import CrestChar
crest_table = Table("crest", saveddata_meta,
Column("ID", Integer, primary_key=True),
Column("name", String, nullable=False, unique=True),
Column("refresh_token", String, nullable=False),
# These records aren't updated. Instead, they are dropped and created, hence we don't have a modified field
Column("created", DateTime, nullable=True, default=datetime.datetime.now))
mapper(CrestChar, crest_table)

View File

@@ -17,33 +17,32 @@
# along with eos. If not, see <http://www.gnu.org/licenses/>.
# ===============================================================================
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.orm.collections import attribute_mapped_collection
from sqlalchemy.sql import and_
from sqlalchemy.orm import relation, reconstructor, mapper, relationship
from sqlalchemy import ForeignKey, Column, Integer, String, Table, Boolean, DateTime
import datetime
from eos.db import saveddata_meta
from eos.db import saveddata_session
from sqlalchemy import Boolean, Column, DateTime, ForeignKey, Integer, String, Table
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.orm import mapper, reconstructor, relation, relationship
from sqlalchemy.orm.collections import attribute_mapped_collection
from sqlalchemy.sql import and_
from eos.db import saveddata_meta, saveddata_session
from eos.db.saveddata.cargo import cargo_table
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 HandledModuleList, HandledImplantBoosterList, HandledProjectedModList, \
HandledDroneCargoList, HandledProjectedDroneList
from eos.saveddata.implant import Implant
from eos.saveddata.character import Character
from eos.saveddata.user import User
from eos.saveddata.fighter import Fighter
from eos.saveddata.fit import Fit as es_Fit, ImplantLocation
from eos.saveddata.drone import Drone
from eos.effectHandlerHelpers import HandledDroneCargoList, HandledImplantBoosterList, HandledModuleList, HandledProjectedDroneList, HandledProjectedModList
from eos.saveddata.booster import Booster
from eos.saveddata.module import Module
from eos.saveddata.cargo import Cargo
from eos.saveddata.character import Character
from eos.saveddata.damagePattern import DamagePattern
from eos.saveddata.drone import Drone
from eos.saveddata.fighter import Fighter
from eos.saveddata.fit import Fit as es_Fit
from eos.saveddata.implant import Implant
from eos.saveddata.module import Module
from eos.saveddata.targetResists import TargetResists
from eos.saveddata.user import User
fits_table = Table("fits", saveddata_meta,
Column("ID", Integer, primary_key=True),
@@ -56,7 +55,7 @@ fits_table = Table("fits", saveddata_meta,
Column("booster", Boolean, nullable=False, index=True, default=0),
Column("targetResistsID", ForeignKey("targetResists.ID"), nullable=True),
Column("modeID", Integer, nullable=True),
Column("implantLocation", Integer, nullable=False, default=ImplantLocation.FIT),
Column("implantLocation", Integer, nullable=False),
Column("notes", String, nullable=True),
Column("ignoreRestrictions", Boolean, default=0),
Column("created", DateTime, nullable=True, default=datetime.datetime.now),
@@ -132,13 +131,13 @@ class CommandFit(object):
)
es_Fit._Fit__projectedFits = association_proxy(
es_Fit.projectedFitDict = association_proxy(
"victimOf", # look at the victimOf association...
"source_fit", # .. and return the source fits
creator=lambda sourceID, source_fit: ProjectedFit(sourceID, source_fit)
)
es_Fit._Fit__commandFits = association_proxy(
es_Fit.commandFitDict = association_proxy(
"boostedOf", # look at the boostedOf association...
"booster_fit", # .. and return the booster fit
creator=lambda boosterID, booster_fit: CommandFit(boosterID, booster_fit)

View File

@@ -68,7 +68,7 @@ class DefaultDatabaseValues(object):
["[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"],
["[Missiles][Structure) Standup Missile", "100", "100", "100", "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"],

View File

@@ -17,18 +17,22 @@
# 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
from eos.db import saveddata_meta
from eos.saveddata.module import Module
from eos.saveddata.mutator import Mutator
from eos.saveddata.fit import Fit
modules_table = Table("modules", saveddata_meta,
Column("ID", Integer, primary_key=True),
Column("fitID", Integer, ForeignKey("fits.ID"), nullable=False, index=True),
Column("itemID", Integer, nullable=True),
Column("baseItemID", Integer, nullable=True),
Column("mutaplasmidID", Integer, nullable=True),
Column("dummySlot", Integer, nullable=True, default=None),
Column("chargeID", Integer),
Column("state", Integer, CheckConstraint("state >= -1"), CheckConstraint("state <= 2")),
@@ -36,7 +40,17 @@ 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,
properties={"owner": relation(Fit)})
properties={
"owner": relation(Fit),
"mutators": relation(
Mutator,
backref="module",
cascade="all,delete-orphan",
collection_class=attribute_mapped_collection('attrID')
)
})

View File

@@ -0,0 +1,35 @@
# ===============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of eos.
#
# eos is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# eos is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with eos. If not, see <http://www.gnu.org/licenses/>.
# ===============================================================================
import datetime
from sqlalchemy import Column, DateTime, Float, ForeignKey, Integer, Table
from sqlalchemy.orm import mapper
from eos.db import saveddata_meta
from eos.saveddata.mutator import Mutator
mutator_table = Table("mutators", saveddata_meta,
Column("moduleID", Integer, ForeignKey("modules.ID"), primary_key=True, index=True),
Column("attrID", Integer, primary_key=True, index=True),
Column("value", Float, nullable=False),
Column("created", DateTime, nullable=True, default=datetime.datetime.now),
Column("modified", DateTime, nullable=True, onupdate=datetime.datetime.now))
mapper(Mutator, mutator_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,13 +21,14 @@ 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
from eos.db.util import processEager, processWhere
from eos.saveddata.price import Price
from eos.saveddata.user import User
from eos.saveddata.crestchar import CrestChar
from eos.saveddata.ssocharacter import SsoCharacter
from eos.saveddata.damagePattern import DamagePattern
from eos.saveddata.targetResists import TargetResists
from eos.saveddata.character import Character
@@ -109,9 +110,9 @@ if configVal is True:
if type not in queryCache:
return
functionCache = queryCache[type]
for _, localCache in functionCache.iteritems():
for _, localCache in functionCache.items():
toDelete = set()
for cacheKey, info in localCache.iteritems():
for cacheKey, info in localCache.items():
IDs = info[1]
if ID in IDs:
toDelete.add(cacheKey)
@@ -156,7 +157,7 @@ def getUser(lookfor, eager=None):
eager = processEager(eager)
with sd_lock:
user = saveddata_session.query(User).options(*eager).filter(User.ID == lookfor).first()
elif isinstance(lookfor, basestring):
elif isinstance(lookfor, str):
eager = processEager(eager)
with sd_lock:
user = saveddata_session.query(User).options(*eager).filter(User.username == lookfor).first()
@@ -175,7 +176,7 @@ def getCharacter(lookfor, eager=None):
eager = processEager(eager)
with sd_lock:
character = saveddata_session.query(Character).options(*eager).filter(Character.ID == lookfor).first()
elif isinstance(lookfor, basestring):
elif isinstance(lookfor, str):
eager = processEager(eager)
with sd_lock:
character = saveddata_session.query(Character).options(*eager).filter(
@@ -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.
@@ -337,7 +344,7 @@ def clearPrices():
def getMiscData(field):
if isinstance(field, basestring):
if isinstance(field, str):
with sd_lock:
data = saveddata_session.query(MiscData).get(field)
else:
@@ -391,7 +398,7 @@ def getDamagePattern(lookfor, eager=None):
with sd_lock:
pattern = saveddata_session.query(DamagePattern).options(*eager).filter(
DamagePattern.ID == lookfor).first()
elif isinstance(lookfor, basestring):
elif isinstance(lookfor, str):
eager = processEager(eager)
with sd_lock:
pattern = saveddata_session.query(DamagePattern).options(*eager).filter(
@@ -412,7 +419,7 @@ def getTargetResists(lookfor, eager=None):
with sd_lock:
pattern = saveddata_session.query(TargetResists).options(*eager).filter(
TargetResists.ID == lookfor).first()
elif isinstance(lookfor, basestring):
elif isinstance(lookfor, str):
eager = processEager(eager)
with sd_lock:
pattern = saveddata_session.query(TargetResists).options(*eager).filter(
@@ -433,7 +440,7 @@ def getImplantSet(lookfor, eager=None):
with sd_lock:
pattern = saveddata_session.query(ImplantSet).options(*eager).filter(
TargetResists.ID == lookfor).first()
elif isinstance(lookfor, basestring):
elif isinstance(lookfor, str):
eager = processEager(eager)
with sd_lock:
pattern = saveddata_session.query(ImplantSet).options(*eager).filter(TargetResists.name == lookfor).first()
@@ -443,10 +450,10 @@ def getImplantSet(lookfor, eager=None):
def searchFits(nameLike, where=None, eager=None):
if not isinstance(nameLike, basestring):
if not isinstance(nameLike, str):
raise TypeError("Need string as argument")
# Prepare our string for request
nameLike = u"%{0}%".format(sqlizeString(nameLike))
nameLike = "%{0}%".format(sqlizeString(nameLike))
# Add any extra components to the search to our where clause
filter = processWhere(Fit.name.like(nameLike, escape="\\"), where)
@@ -467,29 +474,28 @@ def getProjectedFits(fitID):
raise TypeError("Need integer as argument")
def getCrestCharacters(eager=None):
def getSsoCharacters(clientHash, eager=None):
eager = processEager(eager)
with sd_lock:
characters = saveddata_session.query(CrestChar).options(*eager).all()
characters = saveddata_session.query(SsoCharacter).filter(SsoCharacter.client == clientHash).options(*eager).all()
return characters
@cachedQuery(CrestChar, 1, "lookfor")
def getCrestCharacter(lookfor, eager=None):
@cachedQuery(SsoCharacter, 1, "lookfor", "clientHash")
def getSsoCharacter(lookfor, clientHash, eager=None):
filter = SsoCharacter.client == clientHash
if isinstance(lookfor, int):
if eager is None:
with sd_lock:
character = saveddata_session.query(CrestChar).get(lookfor)
else:
eager = processEager(eager)
with sd_lock:
character = saveddata_session.query(CrestChar).options(*eager).filter(CrestChar.ID == lookfor).first()
elif isinstance(lookfor, basestring):
eager = processEager(eager)
with sd_lock:
character = saveddata_session.query(CrestChar).options(*eager).filter(CrestChar.name == lookfor).first()
filter = and_(filter, SsoCharacter.ID == lookfor)
elif isinstance(lookfor, str):
filter = and_(filter, SsoCharacter.characterName == lookfor)
else:
raise TypeError("Need integer or string as argument")
eager = processEager(eager)
with sd_lock:
character = saveddata_session.query(SsoCharacter).options(*eager).filter(filter).first()
return character
@@ -515,8 +521,8 @@ def removeInvalid(fits):
invalids = [f for f in fits if f.isInvalid]
if invalids:
map(fits.remove, invalids)
map(saveddata_session.delete, invalids)
list(map(fits.remove, invalids))
list(map(saveddata_session.delete, invalids))
saveddata_session.commit()
return fits
@@ -543,8 +549,17 @@ def commit():
with sd_lock:
try:
saveddata_session.commit()
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], exc_info[2]
raise exc_info[0](exc_info[1]).with_traceback(exc_info[2])

View File

@@ -39,7 +39,7 @@ def processEager(eager):
return tuple()
else:
l = []
if isinstance(eager, basestring):
if isinstance(eager, str):
eager = (eager,)
for e in eager:
@@ -50,7 +50,7 @@ def processEager(eager):
def _replacements(eagerString):
splitEager = eagerString.split(".")
for i in xrange(len(splitEager)):
for i in range(len(splitEager)):
part = splitEager[i]
replacement = replace.get(part)
if replacement:

View File

@@ -18,6 +18,7 @@
# ===============================================================================
from logbook import Logger
from utils.deprecated import deprecated
pyfalog = Logger(__name__)
@@ -113,9 +114,10 @@ class HandledList(list):
class HandledModuleList(HandledList):
def append(self, mod):
emptyPosition = float("Inf")
for i in xrange(len(self)):
for i in range(len(self)):
currMod = self[i]
if currMod.isEmpty and not mod.isEmpty and currMod.slot == mod.slot:
currPos = mod.position or i
@@ -130,12 +132,32 @@ class HandledModuleList(HandledList):
self.remove(mod)
return
self.appendIgnoreEmpty(mod)
def appendIgnoreEmpty(self, mod):
mod.position = len(self)
HandledList.append(self, mod)
if mod.isInvalid:
self.remove(mod)
return
def replaceRackPosition(self, rackPosition, mod):
listPositions = []
for currMod in self:
if currMod.slot == mod.slot:
listPositions.append(currMod.position)
listPositions.sort()
try:
modListPosition = listPositions[rackPosition]
except IndexError:
self.appendIgnoreEmpty(mod)
else:
self.toDummy(modListPosition)
if not mod.isEmpty:
self.toModule(modListPosition, mod)
if mod.isInvalid:
self.toDummy(modListPosition)
def insert(self, index, mod):
mod.position = index
i = index
@@ -149,7 +171,7 @@ class HandledModuleList(HandledList):
oldPos = mod.position
mod.position = None
for i in xrange(oldPos, len(self)):
for i in range(oldPos, len(self)):
self[i].position -= 1
def toDummy(self, index):
@@ -163,6 +185,7 @@ class HandledModuleList(HandledList):
mod.position = index
self[index] = mod
@deprecated
def freeSlot(self, slot):
for i in range(len(self)):
mod = self[i]
@@ -195,14 +218,30 @@ class HandledImplantBoosterList(HandledList):
self.remove(thing)
return
self.makeRoom(thing)
HandledList.append(self, thing)
def makeRoom(self, thing):
# 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)
pyfalog.info("Slot {0} occupied with {1}, replacing with {2}", thing.slot, oldObj.item.name,
thing.item.name)
itemID = oldObj.itemID
oldObj.itemID = 0 # hack to remove from DB. See GH issue #324
self.remove(oldObj)
return itemID
return None
HandledList.append(self, thing)
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:
pyfalog.warning("Removing SSO Character with same hash: {}".format(repr(old)))
list.remove(self, old)
list.append(self, character)
class HandledProjectedModList(HandledList):
@@ -215,22 +254,30 @@ class HandledProjectedModList(HandledList):
return
proj.projected = True
isSystemEffect = proj.item.group.name == "Effect Beacon"
if isSystemEffect:
# 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 oldEffect:
pyfalog.info("System effect occupied with {0}, replacing with {1}", oldEffect.item.name, proj.item.name)
self.remove(oldEffect)
if proj.isExclusiveSystemEffect:
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)
@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 = 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
class HandledProjectedDroneList(HandledDroneCargoList):
def append(self, proj):

35599
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,125 +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
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.")
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}",
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 (33 of 33)
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("agilityMultiplier"), 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 (478 of 925)
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 (572 of 925)
type = "passive"
def handler(fit, module, context):
module.multiplyItemAttr("maxRange", module.getModifiedChargeAttr("weaponRangeMultiplier"))

View File

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

View File

@@ -1,15 +0,0 @@
# ammoTrackingMultiplier
#
# 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)
# 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,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,12 +0,0 @@
# armorAllRepairSystemsAmountBonusPassive
#
# Used by:
# 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"))

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 (48 of 48)
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 (48 of 48)
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 (105 of 105)
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,10 +0,0 @@
# Not used by any item
type = "gang", "active"
gangBonus = "armorHpBonus2"
gangBoost = "armorHP"
def handler(fit, module, context):
if "gang" not in context:
return
fit.ship.boostItemAttr("armorHP", module.getModifiedItemAttr("armorHpBonus2"))

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"))

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