Compare commits

..

476 Commits

Author SHA1 Message Date
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
Ryan Holmes
5ea7215ec0 Merge pull request #1400 from pyfa-org/release/v1.35.1
Release/v1.35.1
2018-02-17 12:28:48 -05:00
blitzmann
e2ac90a040 Bump release 2018-02-17 12:27:12 -05:00
blitzmann
6ab84240a2 Add missing effect for scram script for standup warp disruptor. Update database to make sure everything is updated. 2018-02-17 12:22:35 -05:00
blitzmann
12a526fa9e Fix for some standup fighter errors 2018-02-17 11:59:51 -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
Ryan Holmes
f66485c48a Merge pull request #1396 from pyfa-org/bug/citadels
Bug/citadels
2018-02-16 17:42:50 -05:00
Ryan Holmes
2153c05183 Merge branch 'master' into bug/citadels 2018-02-16 17:42:03 -05:00
blitzmann
f66c36e42b disable tests preventing branch from passing tox 2018-02-16 17:32:45 -05:00
DarkPhoenix
8771de9c1f Fix retribution rof effect 2018-02-16 23:03:51 +03:00
blitzmann
fa3cf90421 add / update effects for citadels 2018-02-16 00:44:26 -05:00
blitzmann
636ee1de23 Get new Standup fighters working 2018-02-15 22:26:42 -05:00
blitzmann
b36bf8fb21 Fix issue restricting structure modules from fitting onto a structure 2018-02-15 21:03:25 -05:00
blitzmann
55ad52919e Add missing Ishkur effect (drone tracking) 2018-02-15 20:09:50 -05:00
blitzmann
0648feaa7b Handle a couple of group renamings 2018-02-15 20:07:57 -05:00
blitzmann
e16ae88ed9 Fix the item diff script not looking at all items needed 2018-02-15 20:07:06 -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
Ryan Holmes
8d7f0b56f1 Merge pull request #1382 from pyfa-org/release/v1.35.0
Release/v1.35.0
2018-02-14 22:19:46 -05:00
blitzmann
89b6e8f8c3 fix tox stuff 2018-02-14 22:15:48 -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
89c84aac96 update effect headers, add some icons, update DB to final 1248987 2018-02-14 22:05:55 -05:00
blitzmann
649ba9f3e4 Merge branch 'master' into singularity 2018-02-14 21:31:54 -05:00
blitzmann
2d38fd4773 Update to tq 2018-02-14 01:30:24 -05:00
blitzmann
23f0f48c80 Use a special dev database for py3 branch 2018-02-14 01:16:49 -05:00
Ryan Holmes
6254fa3e23 Merge pull request #1380 from pyfa-org/bug/1377
Add stacking penalties to dromi fighters
2018-02-12 23:35:40 -05:00
blitzmann
8686c02b1f Add stacking penalties to dromi fighters 2018-02-12 23:33:16 -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
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
d94d49f0a9 Add misc column to booster panel, and show booster duration 2018-02-10 20:45:26 -05:00
Ryan Holmes
9bfc5b35b6 Merge pull request #1378 from pyfa-org/bug/1377
Fix for #1377 - group up support fighters and modify the bonus based …
2018-02-10 14:14:57 -05:00
blitzmann
0f30ea554d Fix for #1377 - group up support fighters and modify the bonus based on amount active 2018-02-10 14:14:31 -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
Ryan Holmes
f81179db4b Merge pull request #1374 from pyfa-org/bug/1355
Fix for #1355 - we were not properly deleting the fit from the list b…
2018-02-06 00:37:56 -05:00
blitzmann
2d7eed4aac Fix for #1355 - we were not properly deleting the fit from the list being passed into the Import event (which the history functionality piggy backs on). This also fixes the same bug with the import list. 2018-02-06 00:36:57 -05:00
blitzmann
96828a5611 Add assualt damage control effect 2018-02-05 23:12:58 -05:00
blitzmann
8a0f8ae609 Add module renames from singularity 2018-02-05 22:52:24 -05:00
Ryan Holmes
ac8f805fcb Merge pull request #1373 from pyfa-org/bug/1372
Add stacking penalty to Fighter's MWD ability
2018-02-05 22:46:37 -05:00
blitzmann
9f3c2ca7a8 Add stacking penalty to Fighter's MWD ability 2018-02-05 22:34:25 -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
Ryan Holmes
514db91d7a Merge pull request #1367 from burnsypet/issue-1360
Remove energy warfare resistance on capNeed calc
2018-01-31 23:50:44 -05:00
Ryan Holmes
269d3f326d Update ISSUE_TEMPLATE.md 2018-01-31 23:10:27 -05:00
Ryan Holmes
b04fcb0d15 Merge pull request #1366 from burnsypet/issue-1362
Include service modules in EFT export
2018-01-31 22:59:44 -05:00
blitzmann
a29b3da8a6 Update DB and effects 2018-01-30 00:05:11 -05:00
blitzmann
18a5e35e80 Merge commit 'refs/tags/v1.34.0^{}' into singularity
# Conflicts:
#	eve.db
#	gui/builtinViewColumns/misc.py
2018-01-29 23:34:24 -05:00
burnsypet
3072dbb3ff Remove energy warfare resistance on capNeed calc
When calculating the capactitor need of an energy nosferatu the
amount was being modified incorrectly by the energy warfare
resistance of the ship. Change to only apply energy warfare
resitance modifier if this is a projected effect.
2018-01-26 14:48:35 +00:00
burnsypet
b103f0df7e Include service modules in EFT export
Change to service/port.py to include Slot.SERVICE in export
Also fixes a crash when attempting to export citadel with service
modules to CREST
2018-01-26 13:53:07 +00: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
Ryan Holmes
0c971a127c Fix loggerhead drone bonus (#1348) (#1358) 2018-01-02 01:43:55 -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
Ryan Holmes
a8060a5e15 Merge pull request #1347 from pyfa-org/release/v1.34.0_3
Release/v1.34.0 3
2017-12-10 18:17:21 -05:00
blitzmann
cc063d1934 Bump release 2017-12-10 18:07:45 -05:00
blitzmann
531721ef5e Merge branch 'master' into development 2017-12-10 16:25:20 -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
f7b509f9a9 code styling 2017-11-25 04:04:13 -05:00
blitzmann
dea775058d * Try other price sources if user's preferred fails (#1342)
* Handle cached prices better when eve-marketdata returns 0 for lack of price data (#1334)
2017-11-25 02:50:46 -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
Ryan Holmes
455fea75c0 Merge pull request #1341 from pyfa-org/bug/1335
Bug/1335
2017-11-22 23:22:53 -05:00
blitzmann
bd181559ed Don't show Side Effects menu if there are no side effects (eg: Synths) 2017-11-22 23:19:03 -05:00
blitzmann
967128cb69 Added missing effect for shield booster penalty on crash 2017-11-22 23:16:28 -05:00
blitzmann
5fa43138b3 Merge branch 'master' into development
Conflicts:
	config.py
2017-11-22 23:06:36 -05:00
blitzmann
f0baba10df Update effects 2017-11-22 23:04:32 -05:00
blitzmann
7058018aed Fix alpha clones 2017-11-22 21:51:40 -05:00
blitzmann
d45d7204d2 Merge branch 'release/v1.33.2' into development
Conflicts:
	config.py
2017-11-22 21:51:19 -05:00
Ryan Holmes
b596447095 Fix issue with deleting a fit while having certain other fits open (#1339) (#1340)
Also, bump dev version
2017-11-22 21:44:15 -05:00
blitzmann
25df05a15d Clean up alpha clones for December 2017 release - also runs a few sanity checks to make sure that CCP doesn't forget to include a skill in one of the races 2017-11-22 21:42:25 -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
Ryan Holmes
2f6e306f8e Merge pull request #1336 from pyfa-org/release/v1.33.2
Release/v1.33.2
2017-11-12 16:59:03 -05:00
blitzmann
065747f425 bump release 2017-11-12 16:54:28 -05:00
blitzmann
c4f41fb5fa Update to 1209099 and rename old komodo skill 2017-11-12 16:52:56 -05:00
Ryan Holmes
e4f3ed05cc Merge pull request #1328 from burnsypet/wcs-display
Display warp core strength on warp speed tooltip
2017-11-12 15:38:25 -05:00
Ryan Holmes
0e84d6c557 Merge branch 'development' into wcs-display 2017-11-12 15:34:17 -05:00
blitzmann
c384848870 Merge branch 'master' into development
Conflicts:
	config.py
2017-11-12 15:33:59 -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
oaao
cacf286176 [fix] eos - remove Komodo thermalDamage double-dipping 2017-11-02 04:41:57 -04:00
burnsypet
a02bbe3964 Removed traces 2017-11-01 23:31:17 +00:00
burnsypet
866d410695 Added logic for WDFG MWD scrambling 2017-11-01 23:27:34 +00:00
burnsypet
ea6f31c021 Added disruption effect for WDFG 2017-11-01 22:55:05 +00:00
burnsypet
d522fff511 Add projected warp strength to scrams
Changes to effects:
Added warp strength projected effects to all kinds of warp disruption
modules except for WDFG (this will need some more thinking). Fixed
a bug where warp disruptors appeared to reduce the warp strength of
the ship they were fitted to

Changes to targetingMiscView*.py:
Replaced abs() with multiplication by -1 where appropriate
2017-10-30 21:05:46 +00:00
Ryan Holmes
ca27cd3250 bump stable release (#1329) 2017-10-29 18:54:46 -04:00
burnsypet
20a1618e41 Display warp core strength as warp speed tooltip
Changes to antiwarpscramblingpassive.py:
Fixed a typo of "warmScrambleStatus" to "warpScrambleStatus"

Changes to targetingMiscViewMinimal.py:
Extended existing tooltip to include warp core strength. Warp core
strength is none for ships that do not have a hull bonus (venture etc.)
or do not have any warp core stabs fitted so logic is added to
default value to 0.

Changes to targetingMiscViewFull.py:
As above.
2017-10-29 20:40:39 +00:00
Alex
2830729cb4 Merge pull request #1 from pyfa-org/master
Updating fork with bugfixes from master
2017-10-29 20:21:34 +00:00
Ryan Holmes
c0e15f61c6 Merge pull request #1322 from burnsypet/issue-1315
Stop applying neut resistance twice
2017-10-29 15:27:27 -04:00
blitzmann
4355f35eef Revert "Stop applying neut resistance twice" and instead remove the resistance application from addDrain()
This reverts commit 7b32fe08ac.
2017-10-29 15:07:05 -04:00
Ryan Holmes
029e61edaf Merge branch 'master' into issue-1315 2017-10-29 12:36:29 -04:00
Ryan Holmes
b18f82505b Merge pull request #1327 from pyfa-org/bug1316
Bug1316
2017-10-29 12:25:00 -04:00
blitzmann
f8a65de47f tox fix 2017-10-29 12:23:45 -04:00
blitzmann
e5a0ef1877 Re-work menu spawning for Command and Projected views to be a bit more straightforward and allow spawning up context menu when right clicking the DummyEntry (#1316) 2017-10-29 12:22:15 -04:00
Ryan Holmes
8647fe460c Merge pull request #1326 from pyfa-org/133bugfixes
133bugfixes
2017-10-28 22:44:27 -04:00
blitzmann
a4950e9015 Remove the rifter test as it's not properly mocked out and recent balancing passes have since made it useless 2017-10-28 22:36:00 -04:00
blitzmann
82d50cfa0d Fix effect that used to only be for skill, but is now for a booster (#1324) 2017-10-28 21:04:51 -04:00
blitzmann
efea46006a Better include all missiles in the MISC column (#1325) 2017-10-28 20:37:29 -04:00
blitzmann
d9800dcf19 Fix some effects for #1320 2017-10-28 19:45:09 -04:00
blitzmann
266b3ce985 Set Victor and Virtuso to not published, and fix bug which allowed user fits to return in search even if ship isn't published (#1310) 2017-10-28 19:25:19 -04:00
blitzmann
3b61a07c55 Fix for #1321 - make sure we have attribute on ship 2017-10-28 19:25:15 -04:00
blitzmann
5dc092ace5 bump dev 2017-10-28 19:25:10 -04:00
burnsypet
7b32fe08ac Stop applying neut resistance twice
Energy neut/nos resistance was being applied twice when a nos or
neut is projected onto a fit. I have removed the redundant resistance
application in energyneutralizerfalloff.py and also in
energynosferatufalloff.py as they are already being applied once in
eos.saveddata.fit.addDrain.
2017-10-26 17:53:16 +01:00
Ryan Holmes
fd6e318ae3 Release/v1.33.0 (#1319)
* update database file to SISI 1202899

* Effect and group renaming

* Add civilian modules (#1308)

* Add new effects

* update effect headers

* update database to tq - lifeblood (1203953)

* Update renders

* Update icons

* bump version

* fix tox errors

* change up tox config to ignore E722

* more tox ignores

* Try disabling tests for now. Rifter stats changed, causing breakage. This is why we need properly mocked data, not crap straight from the database.

* Try this

* more testing

* Fuck it, disable branch protection until I can evaluate the test failures and what needs to be done to get them back on the path
2017-10-25 23:33:05 -04:00
blitzmann
504c395ea2 Add civilian modules (#1308) 2017-10-22 16:18:35 -04:00
blitzmann
9ed210d5b5 Effect and group renaming 2017-10-22 16:03:21 -04:00
blitzmann
c7f0f6215a update database file to SISI 1202899 2017-10-22 15:57:17 -04:00
Ryan Holmes
34c692c972 Use unicode string to prevent non-ASCII ship names from causing error (#1317) 2017-10-21 22:04:40 -04:00
blitzmann
56f34873a6 bleh 2017-10-08 22:51:06 -04:00
Ryan Holmes
b4dfcf53fb Merge pull request #1303 from burnsypet/issue-1289
Change how skillsMap is generated
2017-10-08 21:42:40 -04:00
Ryan Holmes
3c26676b66 Merge branch 'master' into issue-1289 2017-10-08 21:30:53 -04:00
Ryan Holmes
3fb7411b9d Issue/1305 (#1311)
* Bump dev version

* fix issue in itemDiff

* Do not apply Prop Jamming to Grapplers (#1305)
2017-10-08 21:13:38 -04:00
burnsypet
cac8e528a3 Change how skillsMap is generated
Changes to characterSelection.py:
grantMissingSkills now uses _buildSkillsTooltipCondensed to
generate a list of skills to update
_buildSkillsTooltipCondensed now outputs level and ID rather than
just level so that it can be used by grantMissingSkills
Anything else using _buildSkillsTooltipCondensed like exportSkills
and fitChanged have been amended to extract just the level from
the skills map rather than level and ID
2017-09-26 18:22:24 +01: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
06e82a04b4 fix issue in itemDiff 2017-09-25 01:15:14 -04:00
blitzmann
782df18501 Bump dev version 2017-09-24 18:23:01 -04:00
blitzmann
a87d659e5d Merge remote-tracking branch 'origin/master' into development 2017-09-24 18:20:53 -04:00
blitzmann
cd35c9319c Merge branch 'development' of https://github.com/pyfa-org/Pyfa into development 2017-09-24 18:20:26 -04:00
Ryan Holmes
dfe3d5c82a Update forum references (#1301) 2017-09-24 18:00:21 -04:00
blitzmann
ccd8cdd099 Update forum references 2017-09-24 17:54:19 -04:00
Ryan Holmes
72062e6213 Release/1.32.0 (#1300)
* update database

* update effect headers

* Bump version
2017-09-24 16:43:51 -04:00
Ryan Holmes
10836acab2 Bug/1275 (#1299)
* Add stacking penalties to the max targeting range bonus of the Info Command Burst : Sensor Optimization

* Move Information Burst: Sensor Optimization: Targeting Range effect to proper position

* Fix tox issue
2017-09-24 13:38:52 -04:00
Ryan Holmes
08ab8fbc5b Make sure efxBmp is created (#1265) (#1298) 2017-09-24 13:29:57 -04:00
Ryan Holmes
da5aaf2f78 Feature/evemarketdata (#1297)
* Add preliminary support for eve market data

* Break out market sources into their own classes and register them onto the price service. Create preference option to select which source user wants. Default to eve central

* fix tox stuff
2017-09-23 19:39:38 -04:00
Ryan Holmes
4484b68a3a Fix for #1260 - need to unbind event handling from frame when closed (#1296) 2017-09-23 19:15:03 -04:00
Ryan Holmes
81fce93186 Merge pull request #1294 from pyfa-org/bug/1263
Bug/1263
2017-09-23 13:18:01 -04:00
Ryan Holmes
d58987e427 Merge branch 'master' into bug/1263 2017-09-23 12:56:29 -04:00
Ryan Holmes
05a5ebff00 Merge pull request #1293 from pyfa-org/bug/1278
Bug/1278
2017-09-23 12:56:13 -04:00
blitzmann
2f28afc7ae Merge branch 'bug/1278' of https://github.com/pyfa-org/Pyfa into bug/1278 2017-09-23 12:49:05 -04:00
blitzmann
0134c3b9a1 Fix formatting 2017-09-23 12:33:51 -04:00
Ryan Holmes
9f433fd072 Merge branch 'master' into bug/1278 2017-09-23 03:11:04 -04:00
blitzmann
7729bd9210 Opps commented wrong thing 2017-09-22 02:35:01 -04:00
blitzmann
ce5803dd9c Disable an odd bit of code from a long time ago that fitting max group fitting restrictions to be bypassed (#1278) 2017-09-22 02:33:46 -04:00
blitzmann
821ede8579 Do the same thing for damage patterns as we did for character for global setting 2017-09-22 02:08:53 -04:00
blitzmann
592f9a2298 Trigger a recalc on fit switching if the characters are not the same and the global character flag is set. 2017-09-22 02:01:27 -04:00
blitzmann
c30c07b91c fix tox stuff 2017-09-21 21:21:14 -04:00
Ryan Holmes
73d9dd60e6 Don't return None as a price, always return a float (#1291) (#1292) 2017-09-21 21:13:05 -04:00
blitzmann
dbdbe155f3 Merge branch 'feature/evemarketdata' into development 2017-09-21 21:12:42 -04:00
blitzmann
7d41260863 Break out market sources into their own classes and register them onto the price service. Create preference option to select which source user wants. Default to eve central 2017-09-21 20:50:37 -04:00
blitzmann
d53ff0f502 Add preliminary support for eve market data 2017-09-21 00:10:33 -04:00
Ryan Holmes
f37f4573bf Add missing effect (#1290) 2017-09-20 00:11:32 -04:00
Ryan Holmes
ee392e07c4 Fixes (#1288)
* Provide correct text formatting index

* Fix remove item context menu in projected pane
2017-09-19 19:20:10 -04:00
Ryan Holmes
59b09a255a Fix override importing (and possibly some other bugs revolving around this?) (#1285) 2017-09-18 23:28:39 -04:00
Ryan Holmes
3e73c2eb34 Fix setting implant set for character implants (#1284) 2017-09-18 20:36:41 -04:00
Ryan Holmes
3625b4395a Merge pull request #1272 from burnsypet/issue-1264
Issue #1264 Don't attempt PopupMenu if getMenu returned False
2017-09-18 20:12:34 -04:00
Ryan Holmes
1444a24e70 Merge branch 'master' into issue-1264 2017-09-18 20:04:09 -04:00
Ryan Holmes
73dfa25ef0 Merge pull request #1282 from burnsypet/issue-1280
Convert booster attribute to value before applying
2017-09-18 19:25:32 -04:00
burnsypet
a01284ff1c Convert booster attribute to value before applying
Changes to boostermissilevelocitypenalty.py:
Get booster attribute value using booster.getModifiedItemAttr()
before attempting to apply it to avoid type error
2017-09-14 21:53:53 +01:00
burnsypet
8cc81cebdd Don't attempt PopupMenu if getMenu returned False
Change to characterEditor.py:
Added logic to prevent a crash when attempting to execute
self.PopupMenu(menu) when menu was False. This would occur in the
situation where there were no saved implant sets.
2017-08-19 18:47:58 +01:00
Ryan Holmes
c33aeb7275 Merge pull request #1270 from pyfa-org/release/v1.31.0
Release/v1.31.0
2017-08-16 20:57:04 -04:00
blitzmann
c0237905b6 Ignore F401 warning (# noqa: E402, F401 isn't being honored ion Travis??) 2017-08-16 20:50:18 -04:00
blitzmann
eda6d738a4 fix some whitespace stuff, update database, effect headers, and release version 2017-08-16 20:39:26 -04:00
blitzmann
eef3b420a9 Merge branch 'burnsypet-issue-1241' into development 2017-08-16 20:36:38 -04:00
burnsypet
caef752a74 Bind contextHandler to children of contentPanel
Changes to statsPane.py:
Added new method applyBinding which loops through all the children
of the contentPanel passed to it and binds contextHandler to each of them

Changes to miningyieldViewFull.py:
Call to new method applyBinding
2017-08-16 22:54:32 +01:00
blitzmann
e13bd7af52 Merge branch 'development' of https://github.com/pyfa-org/Pyfa into development 2017-08-15 21:52:16 -04:00
Ryan Holmes
c263575788 Merge pull request #1262 from burnsypet/issue-1261
Issue #1261 show variations menu for cargo items
2017-08-15 21:51:50 -04:00
Ryan Holmes
5bd80d3d06 Merge pull request #1267 from w9jds/input-fix
Amounts window crashes pyfa if you paste with characters
2017-08-15 21:47:22 -04:00
blitzmann
47cbc71e8a Implement simple skill import/export functionality, and some cleanup top pass tox 2017-08-14 23:28:50 -04:00
blitzmann
fdba8d147f Merge remote-tracking branch 'petosorus/master' into development 2017-08-14 22:22:47 -04:00
Jeremy Shore
4720b611b0 Support Decimals 2017-08-14 15:48:18 -05:00
blitzmann
1f43410780 Merge branch 'qol/file-reorg' into development 2017-08-13 21:20:20 -04:00
blitzmann
ead595e666 Allow burst projector to be projected 2017-08-13 21:19:55 -04:00
Jeremy Shore
89cf40423b Fixed issue crashing pyfa when pasting from calculator with commas 2017-08-13 01:54:59 -05:00
burnsypet
95d6944298 Merge branch 'issue-1261' of https://github.com/burnsypet/Pyfa into issue-1261
Conflicts:
	gui/builtinContextMenus/metaSwap.py
2017-07-30 21:35:59 +01:00
burnsypet
a3c19d1d1c Issue #1261 show variations menu for cargo items
Added logic to condition statement in metaSwap.py to accomodate
cargoItem context. Will replace existing cargo item with selected
item and retain the original stack amount.
2017-07-30 21:34:21 +01:00
burnsypet
88185cb886 Issue #1261 show variations menu for cargo items
Added logic to condition statement in metaSwap.py to accomodate
cargoItem context. Will replace existing cargo item with selected
item and retain the original stack amount.
2017-07-30 21:18:47 +01:00
blitzmann
7962aa7b1b Reorganize file structure of item stats dialog box 2017-07-23 17:55:18 -04:00
Ryan Holmes
220ce23e8f Merge pull request #1254 from pyfa-org/bug-1246
Bug 1246 fix
2017-07-15 21:57:54 -04:00
blitzmann
66752b2cbf Fix cargo bonus for Covert subsytems (#1246) 2017-07-15 21:51:32 -04:00
blitzmann
f59a65f314 bump dev 2017-07-15 21:49:58 -04:00
blitzmann
725034ebc5 Merge remote-tracking branch 'origin/master' into development 2017-07-11 23:00:50 -04:00
Ryan Holmes
0210020658 Merge pull request #1245 from pyfa-org/release/1.30.0
Release/1.30.0
2017-07-11 19:45:44 -04:00
blitzmann
22dc6512c0 Final updates and bump version :D 2017-07-11 19:39:13 -04:00
blitzmann
709b4524e6 Bump version :D 2017-07-11 19:26:02 -04:00
blitzmann
bc462ede3e Fix some back event reference due to sleepiness last night ;_; 2017-07-11 19:23:29 -04:00
blitzmann
277bd14453 See #1234 - temporarily add conditional to ensure we run the skill level checking code only when a character exists to prevent error. This may cause some issues with the alpha characters since that may not get checked anymore. 2017-07-11 19:23:08 -04:00
blitzmann
59fed2c516 Update to TQ 1164320 2017-07-11 19:09:32 -04:00
blitzmann
d19486ce15 cleanup 2017-07-11 02:30:26 -04:00
blitzmann
b55fcfaf04 cleanup 2017-07-11 02:06:09 -04:00
blitzmann
60e5085724 ohgodwhathaveidone.jpg 2017-07-11 01:50:54 -04:00
blitzmann
5adde95807 Remove print statement 2017-07-11 01:42:45 -04:00
blitzmann
3da0b8bc29 Effect header update 2017-07-11 01:31:02 -04:00
blitzmann
0104e8954a Remove the -dev suffix for the user database 2017-07-11 01:17:30 -04:00
blitzmann
78e065feff Apparently, my IDE settings changed from spaces to tabs. Changing this back :3 2017-07-11 01:13:25 -04:00
blitzmann
30fe7930a9 Remove log spam 2017-07-11 01:10:55 -04:00
blitzmann
453054f6c7 Remove command fitting from the command fits context menu upon deletion (#1244) 2017-07-11 01:10:39 -04:00
blitzmann
231f9a91c2 Do not assume number of columns for damagePatterns, see #1238 2017-07-10 22:46:30 -04:00
blitzmann
c553790eaf move the "generating effect" spam - doesn't need to happen every time the handler is called 2017-07-10 01:48:10 -04:00
blitzmann
f2e8506ea7 Merge remote-tracking branch 'origin/singularity' into development 2017-07-10 01:39:32 -04:00
Ryan Holmes
76b22dfe17 Merge pull request #1243 from wendazhou/singularity-fix-loki-effects
Fix loki effects
2017-07-10 01:39:16 -04:00
blitzmann
1202c335d9 Fix implant set clipboard import (#1237) 2017-07-10 00:28:22 -04:00
blitzmann
f70d671f1d Fix implant set copy (#1236) 2017-07-10 00:21:52 -04:00
blitzmann
1305a1f2b6 Do not get variations by "group" unless the item is part of a set of hard-coded categories. #1232 2017-07-10 00:11:54 -04:00
blitzmann
f5108c34db Do not kill the entire XML import if one fitting fails (#1231) 2017-07-09 19:08:46 -04:00
Ebag333
d553c60b65 Fix errors caused by importing a few "skinned" ships. Patch by ebag. See #1231 2017-07-09 19:08:06 -04:00
blitzmann
be84cf1db7 formatting 2017-07-09 18:59:07 -04:00
blitzmann
854d7cb09c Rename "system effects" to "wormhole effects" (#1229) 2017-07-09 18:35:44 -04:00
blitzmann
b70f401a91 Merge branch 'qol/file-reorg' into development 2017-07-09 18:27:18 -04:00
blitzmann
496b28226d Merge branch 'feature/booster-side-effects' into development 2017-07-09 18:26:38 -04:00
blitzmann
fec7c8fd0b Merge branch 'singularity' into development 2017-07-09 18:26:28 -04:00
blitzmann
f8e5e15051 Fixed bug with meta swap context menu for subsystems 2017-07-09 15:08:59 -04:00
blitzmann
78b273455d Fix up some effects 2017-07-09 14:44:57 -04:00
blitzmann
de35692666 Fix a few things with affected by tab (indentation issue, overwriting modifier incorrectly) 2017-07-09 13:18:28 -04:00
blitzmann
49b2e42d8c Fix subsystem count, requires post processing of data from CCP when building the database... this may be fixed by the time it releases, but maybe not, and I don't want to forget about it 2017-07-09 12:17:07 -04:00
blitzmann
307ccd10e8 Implement migration for t3c configurations 2017-07-09 00:34:12 -04:00
blitzmann
1225f2074a update to 1163182 2017-07-08 21:59:28 -04:00
Wenda Zhou
afee4469f0 fix loki effects to apply correctly 2017-07-07 00:26:38 -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
blitzmann
e9c691575f Fix RR effect 2017-07-05 23:48:44 -04:00
blitzmann
27236feec3 Add new effects 2017-07-03 22:24:27 -04:00
Ryan Holmes
2e598a7ef7 update sisi database 2017-07-03 14:59:28 -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
blitzmann
58a242f753 update effect headers 2017-06-27 21:03:16 -04:00
blitzmann
5c2cf6dd15 Add last bit of t3 effects from sisi data 2017-06-27 21:02:27 -04:00
blitzmann
287f3bc510 Fix some broken effects (due to effect renames) 2017-06-25 02:54:14 -04:00
blitzmann
caaa6bcd0c update config.py to reflect sisi version 2017-06-25 01:33:18 -04:00
blitzmann
b01c961251 change path to database in case these sisi releases screw with data 2017-06-25 01:27:29 -04:00
blitzmann
826c73c903 Merge branch 'strat_cruisers' into singularity 2017-06-25 01:26:55 -04:00
blitzmann
b6a28ae15f Merge branch 'master' into development
Conflicts:
	config.py
2017-06-25 01:23:08 -04:00
blitzmann
ad0d55faed update effect headers 2017-06-25 01:21:37 -04:00
blitzmann
910ae6315d More work on subsystems 2017-06-25 01:19:48 -04:00
blitzmann
25b4d3a45b More work on strat cruiser updates 2017-06-25 00:33:36 -04:00
blitzmann
f355cb3a72 Update effect headers 2017-06-25 00:18:06 -04:00
blitzmann
ff58648f94 start picking at strat cruiser update 2017-06-21 22:19:37 -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
Ryan Holmes
ad535ccc78 Merge branch 'qol/additionPanes' into qol/file-reorg 2017-06-12 01:17:22 -04:00
Ryan Holmes
9dee761f6d Move addition pane views into their own directory 2017-06-12 01:17:00 -04:00
Ryan Holmes
f5531b458b Fix up focus for ship browser, allowing space or enter to work to open up new stage 2017-06-12 00:28:06 -04:00
Ryan Holmes
a7c89f7b40 break out market browser to individual class files 2017-06-11 17:54:36 -04:00
Ryan Holmes
048ae0205c Breakout shipBrowser into individual class files 2017-06-11 17:32:43 -04:00
Ryan Holmes
e6a0784466 space to select fit when it's focus'd 2017-06-11 15:43:01 -04:00
blitzmann
53d15425f3 tab / tab+shift to change focus of ship browser items 2017-06-09 01:27:28 -04:00
Ryan Holmes
a79257271e bump to stable 1.29.4 (#1228) 2017-06-08 22:22:30 -04:00
Ryan Holmes
94256876e4 Add tooltip for alpha clones to explain functionality (#1227)
See #1219
2017-06-08 22:13:46 -04:00
Ryan Holmes
d319b74d7a Fix exception when double clicking CREST fit browser hull (#1226) 2017-06-08 21:58:20 -04:00
petosorus
acb7c0878e Basic skill reqs export 2017-06-07 11:17:13 +02:00
blitzmann
47fcbefe8b Finish off user-selectable booster side effects - effects are applied correctly now and each has their own display name. Implements #642 2017-06-05 00:18:36 -04:00
blitzmann
c2cb5d763f Implement selectable booster side effects and persist them to the database, very much based on the fighter ability code. Still need to name them and enable the effects.
This also removes the old boosterActiveSideEffect table definition (migration script to drop table still needs to be written)
2017-06-04 23:33:11 -04:00
Ryan Holmes
208148b670 Fix issue with fit deletion (#1211)
* bump dev

* Fix issue with deleted fit not being removed from database cache (#1207). Also, include some error handling around the our commit stuff
2017-06-02 00:30:58 -04:00
blitzmann
cf02c74272 bump dev 2017-06-01 00:33:46 -04:00
blitzmann
f77cd0b834 Merge branch 'master' into development 2017-06-01 00:32:06 -04:00
Ryan Holmes
461f5219e5 bump release (#1204) 2017-05-31 23:51:46 -04:00
Ryan Holmes
373ead8da6 Add structure painter / web to dps graph (#1203) (#1202) 2017-05-31 23:14:17 -04:00
Ryan Holmes
3371086d54 Fix for #1193 - compounded bonuses during recursive command / projected fittings (#1197)
* Teak calculated logic

* test

* clear() on every calculation if it's not already calculated

* tox fix
2017-05-31 00:01:59 -04:00
Ryan Holmes
45c3533501 Make some extra logging statements and stuff to troubleshoot fit deletion bugs (#1199) 2017-05-30 22:57:52 -04:00
Ryan Holmes
4286f2ea5a Add stacking penalties to armor and shield resist command links (#1198) 2017-05-30 22:44:01 -04:00
Ryan Holmes
344546a583 Merge pull request #1196 from jasconius/mactest
updated drag and drop behavior to not trigger a suspected wx bug on Mac
2017-05-30 22:26:59 -04:00
Michael Ryan
46f61ecfa3 address travis errors 2017-05-30 21:07:02 -05:00
Ryan Holmes
2ec9c5addb Merge pull request #1194 from petosorus/pricing-pane-1158
Pricing pane 1158
2017-05-30 21:42:05 -04:00
Michael Ryan
d09f21fe15 updated drag and drop behavior to not trigger a suspected wx bug on Mac 2017-05-30 20:18:32 -05:00
petosorus
33410f0618 Formatting 2017-05-30 15:51:48 +02:00
petosorus
2c98baade8 Price options labels + total computing in minimal 2017-05-29 15:24:21 +02:00
petosorus
380f90d065 Price options in context menu 2017-05-24 17:30:55 +02:00
petosorus
1781c6dcf0 total computation + settings 2017-05-24 16:27:32 +02:00
Ryan Holmes
cff3d0ee95 Don't process removeModule is ctrl / cmd key is active (#1190) 2017-05-22 01:50:13 -04:00
Ryan Holmes
d1fc2dd6ec Fix issue with calculateSustainableTank not considering remote ancil modules (from https://forums.eveonline.com/default.aspx?g=posts&m=6948134#post6948134) (#1189) 2017-05-22 00:55:35 -04:00
Ryan Holmes
218712835e Merge pull request #1188 from pyfa-org/bug/evemon-char
EVEMon import fix
2017-05-22 00:41:12 -04:00
Ebag333
5a60cff9a1 Fixes EVEMon import. Security status was added, but wasn't handled in the EVEMon import. Also, default secstatus to 0 if it's somehow missing. 2017-05-22 00:29:29 -04:00
Ryan Holmes
18554e3186 Fix a bunch of item swapping mechanisms (see #1186) (#1187) 2017-05-21 20:31:12 -04:00
Ryan Holmes
2e2303c9aa Update some migrations to consider new schema (#1185)
* Update some migrations to consider new schema

* tox
2017-05-20 02:44:26 -04:00
blitzmann
fbf455c9fe Fix for fighter prices (#1178) 2017-05-18 22:28:09 -04:00
blitzmann
00dcda6fad Check if projected / command thing actually exist before attempting to remove it 2017-05-18 22:22:02 -04:00
blitzmann
3be7538daa Bump dev 2017-05-18 22:22:02 -04:00
Ryan Holmes
9e0638c54c Merge pull request #1175 from pyfa-org/bumprelease
Bumprelease
2017-05-16 22:12:29 -04:00
blitzmann
a5ff46fbd1 Bump stable 2017-05-16 21:34:09 -04:00
Ebag333
6900938208 Set all strings to be unicode when referencing fit.name. This won't catch all conversion errors, but it should catch most. 2017-05-16 21:33:45 -04:00
blitzmann
4887817142 Revert "Set all strings to be unicode when referencing fit.name. This won't catch all conversion errors, but it should catch most. (#1168)"
This reverts commit da33a372cb. Was squashed by mistake, commit author was lost
2017-05-16 21:33:28 -04:00
Ryan Holmes
0d721b55a7 Fix for when factor reload when module doesn't have a cycle time (#1171) (#1173) 2017-05-16 00:09:51 -04:00
Ryan Holmes
65f71b6f6b Fix exception with character implants, and don't show implant set menu if there aren't any (#1172) 2017-05-15 22:59:47 -04:00
Ryan Holmes
89b508d0f6 Merge pull request #1170 from pyfa-org/bug/char_fixes
Various character fixes
2017-05-14 23:05:18 -04:00
Ryan Holmes
6344f7a975 Merge branch 'master' into bug/char_fixes 2017-05-14 22:56:34 -04:00
blitzmann
11eea37aa7 Remove duplication of Character.ro property 2017-05-14 22:50:18 -04:00
blitzmann
bff44c46f8 Fix character list sorting (https://forums.eveonline.com/default.aspx?g=posts&m=6940327#post6940327) 2017-05-14 22:44:02 -04:00
blitzmann
7a0ea759ef Fix issue with character copy, as well as instantiating character with duplicate skills (since Skill has a backref to charactrer, it's automatically added to the characters skill list. No more need for the append()) 2017-05-14 22:24:05 -04:00
blitzmann
f9419977c0 Instantiate skills with a character (may help to solve https://forums.eveonline.com/default.aspx?g=posts&m=6939299#post6939299) 2017-05-14 20:55:48 -04:00
Ryan Holmes
da33a372cb Set all strings to be unicode when referencing fit.name. This won't catch all conversion errors, but it should catch most. (#1168) 2017-05-14 20:52:06 -04:00
blitzmann
0db141d0a6 Fix exception when reverting character skills 2017-05-14 02:26:32 -04:00
blitzmann
79445225de fix issue with market shortcuts if not active items are present 2017-05-14 02:21:23 -04:00
Ryan Holmes
a0f5e4cbb3 Merge pull request #1166 from pyfa-org/bug/t3d-mod-delete
Bug/t3d mod delete
2017-05-14 01:59:38 -04:00
blitzmann
3b23c9eacd flake8 2017-05-14 01:41:15 -04:00
blitzmann
d4ce1ef3db Fix issue with Delete key event on t3d mode causing exception (#1160). Additionally, work around the fact that every module that is removed also recalculates the fit, allowing for a faster response time when deleting multiple modules at a time. This is somewhat ugly as the removeModule function was originally based on the assumption of removing only one module. Should clean it up at some point. 2017-05-14 01:37:49 -04:00
Ryan Holmes
b4f063b07a Merge pull request #1165 from pyfa-org/bug/fit-delete-stuff2
Bug/fit delete stuff2
2017-05-14 00:42:26 -04:00
blitzmann
ffe840e245 Fix for #1161. Can't reproduce, but I'm unsure what the root cause is (probably something firing in the wrong order). 9be4ae may also alleviate the root cause. 2017-05-13 23:28:51 -04:00
blitzmann
2e3c3e92f1 Fix for a possible bug (see comments in #1147). 2017-05-13 23:28:50 -04:00
blitzmann
5e20d6973f Fix situation in which deleting a fit that was both a command and projected fit for the same target threw an error 2017-05-13 23:28:49 -04:00
blitzmann
c68739d78c Move the FitRemoved event before the stage selected events. Otherwise, if the stage is selected first and the FitItem (self) is deleted before the FitRemoved is done, we get an error about how self is not valid anymore 2017-05-13 23:28:49 -04:00
blitzmann
5392aaa27e refresh command fits on boosted fits when the booster is deleted 2017-05-13 23:28:48 -04:00
Ryan Holmes
fee82d294b Bump dev and include fix for #1162 (#1163)
* Add some logging to try to figure out what happens with #1149

* Add some logging to try to figure out what happens with #1149, along with some other fixes

* bump dev

* Add remote hull repairers in the calculateSustainableTank() mappings
2017-05-13 22:36:03 -04:00
755 changed files with 20719 additions and 11042 deletions

5
.gitignore vendored
View File

@@ -117,3 +117,8 @@ ENV/
# Pycharm project settings
.idea
eos.iml
gitversion
.version
/.version
*.swp

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,11 +1,13 @@
# Submit a bug report bug report or feature request
<!--
Submit a bug report bug report or feature request
Here you can inform pyfa developers of potential bugs or suggest features / improvements to the project. Please check
to make sure that the bug hasn't been reported or feature requested before submitting. If you have general questions
about the project and want to reach out to the developers personally, please check out out our [Slack]
(https://pyfainvite.azurewebsites.net/).
---
-->
## Bug Report

View File

@@ -36,13 +36,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).
@@ -52,7 +47,7 @@ pyfa is licensed under the GNU GPL v3.0, see LICENSE
## Resources
* Development repository: [https://github.com/pyfa-org/Pyfa](https://github.com/pyfa-org/Pyfa)
* [EVE forum thread](https://forums.eveonline.com/default.aspx?g=posts&t=466425)
* [EVE forum thread](https://forums.eveonline.com/t/27156)
* [EVE University guide using pyfa](http://wiki.eveuniversity.org/Guide_to_using_PYFA)
* [EVE Online website](http://www.eveonline.com/)

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):
@@ -100,8 +100,8 @@ def DBInMemory():
import eos.db
# Output debug info to help us troubleshoot Travis
print(eos.db.saveddata_engine)
print(eos.db.gamedata_engine)
print((eos.db.saveddata_engine))
print((eos.db.gamedata_engine))
helper = {
'config': eos.config,

View File

@@ -41,7 +41,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 +60,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

@@ -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

151
config.py
View File

@@ -1,7 +1,8 @@
import os
import sys
from logbook import Logger
from logbook import CRITICAL, DEBUG, ERROR, FingersCrossedHandler, INFO, Logger, NestedSetup, NullHandler, \
StreamHandler, TimedRotatingFileHandler, WARNING
pyfalog = Logger(__name__)
@@ -19,10 +20,11 @@ debug = False
saveInRoot = False
# Version data
version = "1.29.1"
tag = "Stable"
expansionName = "YC119.5"
expansionVersion = "1.0"
version = "2.0.0b4"
tag = "git"
expansionName = "YC120.2"
expansionVersion = "1.2"
evemonMinVersion = "4081"
pyfaPath = None
@@ -30,6 +32,16 @@ savePath = None
saveDB = None
gameDB = None
logPath = None
loggingLevel = None
logging_setup = None
LOGLEVEL_MAP = {
"critical": CRITICAL,
"error": ERROR,
"warning": WARNING,
"info": INFO,
"debug": DEBUG,
}
def isFrozen():
@@ -45,23 +57,35 @@ 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():
if os.path.isfile(os.path.join(pyfaPath, '.version')):
with open(os.path.join(pyfaPath, '.version')) as f:
gitVersion = f.readline()
return gitVersion
# if no version file exists, then user is running from source or not an official build
return version + " (git)"
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
pyfalog.debug("Configuring Pyfa")
@@ -86,12 +110,12 @@ 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')
# 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")
saveDB = os.path.join(savePath, "saveddata-py3-dev.db")
# The database where the static EVE data from the datadump is kept.
# This is not the standard sqlite datadump but a modified version created by eos
@@ -100,6 +124,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
@@ -109,6 +140,100 @@ def defPaths(customSavePath):
eos.config.saveddata_connectionstring = "sqlite:///" + saveDB + "?check_same_thread=False"
eos.config.gamedata_connectionstring = "sqlite:///" + gameDB + "?check_same_thread=False"
print(eos.config.saveddata_connectionstring)
print(eos.config.gamedata_connectionstring)
# initialize the settings
from service.settings import EOSSettings
eos.config.settings = EOSSettings.getInstance().EOSSettings # this is kind of confusing, but whatever
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
)
])
with logging_setup.threadbound():
# Output all stdout (print) messages as warnings
try:
sys.stdout = LoggerWriter(pyfalog.warning)
except:
pyfalog.critical("Cannot redirect. Continuing without writing stdout to log.")
# Output all stderr (stacktrace) messages as critical
try:
sys.stderr = LoggerWriter(pyfalog.critical)
except:
pyfalog.critical("Cannot redirect. Continuing without writing stderr to log.")
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')

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

@@ -0,0 +1,73 @@
# -*- 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', '.'),
(requests.certs.where(), '.'), # is this needed anymore?
('../../eve.db', '.'),
('../../README.md', '.'),
('../../LICENSE', '.'),
('../../.version', '.'),
]
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([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='dist_assets/mac/pyfa.icns',
)
app = BUNDLE(exe,
name='pyfa.app',
icon=None,
bundle_identifier=None)

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

@@ -1,35 +1,36 @@
# -*- 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'),
('../../dist_assets/win/pyfa.ico', '.'),
(requests.certs.where(), '.'), # is this needed anymore?
('../../eve.db', '.'),
('../../README.md', '.'),
('../../LICENSE', '.'),
('../../.version', '.'),
]
import_these = []
# 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/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(
@@ -38,25 +39,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 +67,6 @@ exe = EXE(pyz,
upx=True,
name='pyfa',
icon='dist_assets/win/pyfa.ico',
onefile=False,
)
coll = COLLECT(
@@ -77,7 +76,6 @@ 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
@@ -87,7 +88,7 @@ class CapSimulator(object):
mods[(duration, capNeed, clipSize, disableStagger)] = 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), amount in mods.items():
if self.stagger and not disableStagger:
if clipSize == 0:
duration = int(duration / amount)
@@ -192,7 +193,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,14 +11,14 @@ debug = False
gamedataCache = True
saveddataCache = True
gamedata_version = ""
gamedata_connectionstring = 'sqlite:///' + unicode(realpath(join(dirname(abspath(__file__)), "..", "eve.db")), sys.getfilesystemencoding())
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-py3-db.db"))
pyfalog.debug("Saveddata connection string: {0}", saveddata_connectionstring)
@@ -28,4 +28,4 @@ settings = {
}
# Autodetect path, only change if the autodetection bugs out.
path = dirname(unicode(__file__, sys.getfilesystemencoding()))
path = dirname(__file__)

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

View File

@@ -47,7 +47,7 @@ mapper(Item, items_table,
properties={
"group" : relation(Group, backref="items"),
"icon" : relation(Icon),
"_Item__attributes": relation(Attribute, collection_class=attribute_mapped_collection('name')),
"_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,
primaryjoin=metatypes_table.c.typeID == items_table.c.typeID,

View File

@@ -81,7 +81,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:
@@ -154,7 +154,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 +181,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 +210,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 +245,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 +257,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 +268,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 +279,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:
@@ -317,12 +317,12 @@ def getVariations(itemids, groupIDs=None, where=None, eager=None):
vars = gamedata_session.query(Item).options(*processEager(eager)).join((groups_table, joinon)).filter(
filter).all()
return vars
return vars
@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 +337,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")
@@ -367,7 +367,7 @@ def getRequiredFor(itemID, attrMapping):
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

@@ -16,23 +16,27 @@ def upgrade(saveddata_engine):
JOIN wings w on w.ID = s.wingID
JOIN gangs g on g.ID = w.gangID
"""
try:
results = saveddata_session.execute(sql)
results = saveddata_session.execute(sql)
inserts = []
inserts = []
for row in results:
boosted = row["boostedFit"]
types = ("squad", "wing", "gang")
for x in types:
value = row["{}Boost".format(x)]
if value is None:
continue
for row in results:
boosted = row["boostedFit"]
types = ("squad", "wing", "gang")
for x in types:
value = row["{}Boost".format(x)]
if value is None:
continue
inserts.append({"boosterID": value, "boostedID": boosted, "active": 1})
try:
saveddata_session.execute(commandFits_table.insert(),
{"boosterID": value, "boostedID": boosted, "active": 1})
except Exception:
pass
saveddata_session.commit()
inserts.append({"boosterID": value, "boostedID": boosted, "active": 1})
try:
saveddata_session.execute(commandFits_table.insert(),
{"boosterID": value, "boostedID": boosted, "active": 1})
except Exception:
pass
saveddata_session.commit()
except:
# Shouldn't fail unless you have updated database without the old fleet schema and manually modify the database version
# If it does, simply fail. Fleet data migration isn't critically important here
pass

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

@@ -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:

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,9 @@
"""
Migration 26
- Deletes invalid command fit relationships caused by a bug (see #1244)
"""
def upgrade(saveddata_engine):
saveddata_engine.execute("DELETE FROM commandFits WHERE boosterID NOT IN (SELECT ID FROM fits) OR boostedID NOT IN (SELECT ID FROM fits)")

View File

@@ -0,0 +1,9 @@
"""
Migration 27
- Resets all alpha clones to 1 (CCP consolidated all alpha's into one skillset)
"""
def upgrade(saveddata_engine):
saveddata_engine.execute("UPDATE characters SET alphaCloneID = 1 WHERE alphaCloneID IS NOT NULL")

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

@@ -7,5 +7,5 @@ Overwrites damage profile 0 to reset bad uniform values (bad values set with bug
def upgrade(saveddata_engine):
saveddata_engine.execute('DELETE FROM damagePatterns WHERE name LIKE ? OR ID LIKE ?', ("Uniform", "1"))
saveddata_engine.execute('INSERT INTO damagePatterns VALUES (?, ?, ?, ?, ?, ?, ?)',
saveddata_engine.execute('INSERT INTO damagePatterns (ID, name, emAmount, thermalAmount, kineticAmount, explosiveAmount, ownerID) VALUES (?, ?, ?, ?, ?, ?, ?)',
(1, "Uniform", 25, 25, 25, 25, None))

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

@@ -18,35 +18,38 @@
# ===============================================================================
from sqlalchemy import Table, Column, ForeignKey, Integer, Boolean, DateTime
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.orm import mapper, relation
import datetime
from eos.db import saveddata_meta
from eos.saveddata.booster import Booster
from eos.saveddata.boosterSideEffect import BoosterSideEffect
boosters_table = Table("boosters", saveddata_meta,
Column("ID", Integer, primary_key=True),
Column("itemID", Integer),
Column("fitID", Integer, ForeignKey("fits.ID"), nullable=False),
Column("active", Boolean),
Column("created", DateTime, nullable=True, default=datetime.datetime.now),
Column("modified", DateTime, nullable=True, onupdate=datetime.datetime.now),
Column("ID", Integer, primary_key=True),
Column("itemID", Integer),
Column("fitID", Integer, ForeignKey("fits.ID"), nullable=False),
Column("active", Boolean),
Column("created", DateTime, nullable=True, default=datetime.datetime.now),
Column("modified", DateTime, nullable=True, onupdate=datetime.datetime.now),
)
# Legacy booster side effect code, should disable but a mapper relies on it.
activeSideEffects_table = Table("boostersActiveSideEffects", saveddata_meta,
Column("boosterID", ForeignKey("boosters.ID"), primary_key=True),
Column("effectID", Integer, primary_key=True))
booster_side_effect_table = Table("boosterSideEffects", saveddata_meta,
Column("boosterID", Integer, ForeignKey("boosters.ID"), primary_key=True, index=True),
Column("effectID", Integer, nullable=False, primary_key=True),
Column("active", Boolean, default=False)
)
class ActiveSideEffectsDummy(object):
def __init__(self, effectID):
self.effectID = effectID
mapper(ActiveSideEffectsDummy, activeSideEffects_table)
mapper(Booster, boosters_table,
properties={"_Booster__activeSideEffectDummies": relation(ActiveSideEffectsDummy)})
properties={
"_Booster__sideEffects": relation(
BoosterSideEffect,
backref="booster",
cascade='all, delete, delete-orphan'),
}
)
Booster._Booster__activeSideEffectIDs = association_proxy("_Booster__activeSideEffectDummies", "effectID")
mapper(BoosterSideEffect, booster_side_effect_table)

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

@@ -25,8 +25,10 @@ from eos.saveddata.price import Price
prices_table = Table("prices", saveddata_meta,
Column("typeID", Integer, primary_key=True),
Column("price", Float),
Column("price", Float, default=0.0),
Column("time", Integer, nullable=False),
Column("failed", Integer))
mapper(Price, prices_table)
mapper(Price, prices_table, properties={
"_Price__price": prices_table.c.price,
})

View File

@@ -17,6 +17,8 @@
# along with eos. If not, see <http://www.gnu.org/licenses/>.
# ===============================================================================
import sys
from sqlalchemy.sql import and_
from sqlalchemy import desc, select
@@ -107,9 +109,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)
@@ -154,7 +156,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()
@@ -173,7 +175,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(
@@ -335,7 +337,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:
@@ -389,7 +391,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(
@@ -410,7 +412,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(
@@ -431,7 +433,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()
@@ -441,10 +443,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)
@@ -482,7 +484,7 @@ def getCrestCharacter(lookfor, eager=None):
eager = processEager(eager)
with sd_lock:
character = saveddata_session.query(CrestChar).options(*eager).filter(CrestChar.ID == lookfor).first()
elif isinstance(lookfor, basestring):
elif isinstance(lookfor, str):
eager = processEager(eager)
with sd_lock:
character = saveddata_session.query(CrestChar).options(*eager).filter(CrestChar.name == lookfor).first()
@@ -513,8 +515,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
@@ -539,5 +541,10 @@ def remove(stuff):
def commit():
with sd_lock:
saveddata_session.commit()
saveddata_session.flush()
try:
saveddata_session.commit()
saveddata_session.flush()
except Exception:
saveddata_session.rollback()
exc_info = sys.exc_info()
raise exc_info[0](exc_info[1]).with_traceback(exc_info[2])

View File

@@ -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

@@ -115,7 +115,7 @@ 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
@@ -149,7 +149,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):

View File

@@ -2,6 +2,7 @@
#
# 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"

View File

@@ -0,0 +1,9 @@
# 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,9 +1,7 @@
# ammoInfluenceCapNeed
#
# Used by:
# Items from category: Charge (466 of 913)
# Charges from group: Frequency Crystal (185 of 185)
# Charges from group: Hybrid Charge (209 of 209)
# Items from category: Charge (478 of 925)
type = "passive"

View File

@@ -1,7 +1,7 @@
# ammoInfluenceRange
#
# Used by:
# Items from category: Charge (571 of 913)
# Items from category: Charge (572 of 925)
type = "passive"

View File

@@ -1,9 +1,8 @@
# ammoSpeedMultiplier
#
# Used by:
# Charges from group: Festival Charges (22 of 22)
# Charges from group: Festival Charges (23 of 23)
# Charges from group: Interdiction Probe (2 of 2)
# Charges from group: Survey Probe (3 of 3)
type = "passive"

View File

@@ -7,7 +7,7 @@
# 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 (129 of 129)
# Charges from group: Projectile Ammo (128 of 128)
type = "passive"

View File

@@ -6,4 +6,4 @@ type = "passive"
def handler(fit, module, context):
fit.ship.increaseItemAttr("warmScrambleStatus", module.getModifiedItemAttr("warpScrambleStrength"))
fit.ship.increaseItemAttr("warpScrambleStatus", module.getModifiedItemAttr("warpScrambleStrength"))

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,10 +1,15 @@
# boosterMaxVelocityPenalty
#
# Used by:
# Implants from group: Booster (12 of 48)
# Implants from group: Booster (12 of 54)
type = "boosterSideEffect"
activeByDefault = False
# User-friendly name for the side effect
displayName = "Velocity"
# Attribute that this effect targets
attr = "boosterMaxVelocityPenalty"
def handler(fit, booster, context):
fit.ship.boostItemAttr("maxVelocity", booster.getModifiedItemAttr("boosterMaxVelocityPenalty"))
fit.ship.boostItemAttr("maxVelocity", booster.getModifiedItemAttr(attr))

View File

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

View File

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

View File

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

View File

@@ -9,7 +9,7 @@ type = "passive"
def handler(fit, container, context):
level = container.level if "skill" in context else 1
attrs = ("boosterTurretFalloffPenalty", "boosterTurretOptimalRange", "boosterTurretTrackingPenalty")
attrs = ("boosterTurretFalloffPenalty", "boosterTurretOptimalRangePenalty", "boosterTurretTrackingPenalty")
for attr in attrs:
fit.boosters.filteredItemBoost(lambda booster: True, attr,
container.getModifiedItemAttr("boosterAttributeModifier") * level)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,11 +1,9 @@
# capacitorCapacityAddPassive
#
# Used by:
# Subsystems from group: Engineering Systems (16 of 16)
# Subsystem: Tengu Offensive - Magnetic Infusion Basin
# Items from category: Subsystem (20 of 48)
type = "passive"
def handler(fit, module, context):
fit.ship.increaseItemAttr("capacitorCapacity",
module.getModifiedItemAttr("capacitorCapacity"))
fit.ship.increaseItemAttr("capacitorCapacity", module.getModifiedItemAttr("capacitorCapacity") or 0)

View File

@@ -10,4 +10,6 @@ type = "passive"
def handler(fit, module, context):
fit.ship.multiplyItemAttr("capacitorCapacity", module.getModifiedItemAttr("capacitorCapacityMultiplier"))
# We default this to None as there are times when the source attribute doesn't exist (for example, Cap Power Relay).
# It will return 0 as it doesn't exist, which would nullify whatever the target attribute is
fit.ship.multiplyItemAttr("capacitorCapacity", module.getModifiedItemAttr("capacitorCapacityMultiplier", None))

View File

@@ -1,9 +1,10 @@
# capacityAddPassive
#
# Used by:
# Subsystems from group: Defensive Systems (16 of 16)
# Subsystems named like: Defensive Covert Reconfiguration (4 of 4)
# Subsystem: Legion Defensive - Nanobot Injector
type = "passive"
def handler(fit, subsystem, context):
fit.ship.increaseItemAttr("capacity", subsystem.getModifiedItemAttr("capacity") or 0)
fit.ship.increaseItemAttr("capacity", subsystem.getModifiedItemAttr("cargoCapacityAdd") or 0)

View File

@@ -6,6 +6,6 @@ type = "active"
def handler(fit, module, context):
for x in xrange(1, 4):
for x in range(1, 4):
value = module.getModifiedChargeAttr("warfareBuff{}Multiplier".format(x))
module.multiplyItemAttr("warfareBuff{}Value".format(x), value)

View File

@@ -0,0 +1,21 @@
# Not used by any item
type = "passive"
runTime = "early"
def handler(fit, src, context):
for attr in [
"structureRigDoomsdayDamageLossTargetBonus",
"structureRigScanResBonus",
"structureRigPDRangeBonus",
"structureRigPDCapUseBonus",
"structureRigMissileExploVeloBonus",
"structureRigMissileVelocityBonus",
"structureRigEwarOptimalBonus",
"structureRigEwarFalloffBonus",
"structureRigEwarCapUseBonus",
"structureRigMissileExplosionRadiusBonus"
]:
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Jury Rigging"),
attr, src.getModifiedItemAttr("structureRoleBonus"))

View File

@@ -8,6 +8,5 @@ type = "passive"
def handler(fit, src, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Leadership"),
"maxRange",
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Leadership"), "maxRange",
src.getModifiedItemAttr("areaOfEffectBonus") * src.level)

View File

@@ -4,10 +4,10 @@
# Ships from group: Carrier (4 of 4)
# Ships from group: Combat Battlecruiser (13 of 13)
# Ships from group: Command Ship (8 of 8)
# Ships from group: Force Auxiliary (5 of 5)
# Ships from group: Force Auxiliary (6 of 6)
# Ships from group: Supercarrier (6 of 6)
# Ships from group: Titan (6 of 6)
# Subsystems named like: Defensive Warfare Processor (4 of 4)
# Ships from group: Titan (7 of 7)
# Subsystems named like: Offensive Support Processor (4 of 4)
# Ship: Orca
# Ship: Rorqual
type = "passive"

View File

@@ -2,6 +2,7 @@
#
# Used by:
# Ship: Enforcer
# Ship: Marshal
# Ship: Pacifier
type = "passive"

View File

@@ -1,7 +1,7 @@
# covertCynoCpuPenalty
#
# Used by:
# Subsystems from group: Offensive Systems (12 of 16)
# Subsystems from group: Defensive Systems (8 of 12)
type = "passive"

View File

@@ -1,14 +1,14 @@
# covertOpsAndReconOpsCloakModuleDelayBonus
#
# Used by:
# Ships from group: Black Ops (4 of 4)
# Ships from group: Black Ops (5 of 5)
# Ships from group: Blockade Runner (4 of 4)
# Ships from group: Covert Ops (7 of 7)
# Ships from group: Expedition Frigate (2 of 2)
# Ships from group: Force Recon Ship (7 of 7)
# Ships from group: Stealth Bomber (4 of 4)
# Ships from group: Force Recon Ship (8 of 8)
# Ships from group: Stealth Bomber (5 of 5)
# Ships named like: Stratios (2 of 2)
# Subsystems named like: Offensive Covert Reconfiguration (4 of 4)
# Subsystems named like: Defensive Covert Reconfiguration (4 of 4)
# Ship: Astero
# Ship: Rabisu
type = "passive"

View File

@@ -1,7 +1,7 @@
# covertOpsCloakCpuPenalty
#
# Used by:
# Subsystems from group: Offensive Systems (12 of 16)
# Subsystems from group: Defensive Systems (8 of 12)
type = "passive"

View File

@@ -8,4 +8,4 @@ runTime = "early"
def handler(fit, ship, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Cloaking"),
"cpu", ship.getModifiedItemAttr("eliteBonusCoverOps1"), skill="Covert Ops")
"cpu", ship.getModifiedItemAttr("eliteBonusCovertOps1"), skill="Covert Ops")

View File

@@ -5,7 +5,9 @@
# Ship: Astero
# Ship: Enforcer
# Ship: Pacifier
# Ship: Victor
# Ship: Victorieux Luxury Yacht
# Ship: Virtuoso
type = "passive"
runTime = "early"

View File

@@ -1,8 +1,8 @@
# covertOpsCpuBonus1
#
# Used by:
# Ships from group: Stealth Bomber (4 of 4)
# Subsystems named like: Offensive Covert Reconfiguration (4 of 4)
# Ships from group: Stealth Bomber (4 of 5)
# Subsystems named like: Defensive Covert Reconfiguration (4 of 4)
type = "passive"

View File

@@ -0,0 +1,10 @@
# covertOpsStealthBomberSiegeMissileLauncherCPUNeedBonus
#
# Used by:
# Ship: Virtuoso
type = "passive"
def handler(fit, ship, context):
fit.modules.filteredItemMultiply(lambda mod: mod.item.group.name == "Missile Launcher Torpedo",
"cpu", ship.getModifiedItemAttr("stealthBomberLauncherCPU"))

View File

@@ -1,7 +1,7 @@
# covertOpsStealthBomberSiegeMissileLauncerPowerNeedBonus
# covertOpsStealthBomberSiegeMissileLauncherPowerNeedBonus
#
# Used by:
# Ships from group: Stealth Bomber (4 of 4)
# Ships from group: Stealth Bomber (5 of 5)
type = "passive"

View File

@@ -1,8 +1,8 @@
# covertOpsStealthBomberTargettingDelayBonus
#
# Used by:
# Ships from group: Black Ops (4 of 4)
# Ships from group: Stealth Bomber (4 of 4)
# Ships from group: Black Ops (5 of 5)
# Ships from group: Stealth Bomber (5 of 5)
# Ship: Caedes
# Ship: Chremoas
# Ship: Endurance

View File

@@ -1,7 +1,7 @@
# cpuOutputAddCpuOutputPassive
#
# Used by:
# Items from category: Subsystem (40 of 80)
# Subsystems from group: Offensive Systems (8 of 12)
type = "passive"

View File

@@ -1,7 +1,7 @@
# cynosuralDurationBonus
#
# Used by:
# Ships from group: Force Recon Ship (6 of 7)
# Ships from group: Force Recon Ship (7 of 8)
type = "passive"

View File

@@ -1,7 +1,7 @@
# cynosuralTheoryConsumptionBonus
#
# Used by:
# Ships from group: Force Recon Ship (6 of 7)
# Ships from group: Force Recon Ship (7 of 8)
# Skill: Cynosural Field Theory
type = "passive"

View File

@@ -1,8 +1,7 @@
# damageControl
#
# Used by:
# Variations of module: Damage Control I (16 of 16)
# Module: Civilian Damage Control
# Modules from group: Damage Control (22 of 27)
type = "passive"

View File

@@ -1,7 +1,7 @@
# doHacking
#
# Used by:
# Modules from group: Data Miners (15 of 16)
# Modules from group: Data Miners (9 of 9)
type = "active"

View File

@@ -0,0 +1,16 @@
# doomsdayAOEDamp
#
# Used by:
# Module: Sensor Dampening Burst Projector
type = "projected", "active"
def handler(fit, module, context, *args, **kwargs):
if "projected" not in context:
return
fit.ship.boostItemAttr("maxTargetRange", module.getModifiedItemAttr("maxTargetRangeBonus"),
stackingPenalties=True, *args, **kwargs)
fit.ship.boostItemAttr("scanResolution", module.getModifiedItemAttr("scanResolutionBonus"),
stackingPenalties=True, *args, **kwargs)

View File

@@ -0,0 +1,18 @@
# doomsdayAOEECM
#
# Used by:
# Module: ECM Jammer Burst Projector
from eos.modifiedAttributeDict import ModifiedAttributeDict
type = "projected", "active"
def handler(fit, module, context, **kwargs):
if "projected" in context:
# jam formula: 1 - (1- (jammer str/ship str))^(# of jam mods with same str))
strModifier = 1 - module.getModifiedItemAttr("scan{0}StrengthBonus".format(fit.scanType)) / fit.scanStrength
if 'effect' in kwargs:
strModifier *= ModifiedAttributeDict.getResistance(fit, kwargs['effect'])
fit.ecmProjectedStr *= strModifier

View File

@@ -0,0 +1,21 @@
# doomsdayAOENeut
#
# Used by:
# Module: Energy Neutralization Burst Projector
from eos.saveddata.module import State
from eos.modifiedAttributeDict import ModifiedAttributeDict
type = "active", "projected"
def handler(fit, src, context, **kwargs):
if "projected" in context and ((hasattr(src, "state") and src.state >= State.ACTIVE) or
hasattr(src, "amountActive")):
amount = src.getModifiedItemAttr("energyNeutralizerAmount")
if 'effect' in kwargs:
amount *= ModifiedAttributeDict.getResistance(fit, kwargs['effect'])
time = src.getModifiedItemAttr("duration")
fit.addDrain(src, time, amount, 0)

View File

@@ -0,0 +1,11 @@
# doomsdayAOEPaint
#
# Used by:
# Module: Target Illumination Burst Projector
type = "projected", "active"
def handler(fit, container, context, *args, **kwargs):
if "projected" in context:
fit.ship.boostItemAttr("signatureRadius", container.getModifiedItemAttr("signatureRadiusBonus"),
stackingPenalties=True, *args, **kwargs)

View File

@@ -0,0 +1,29 @@
# doomsdayAOETrack
#
# Used by:
# Module: Weapon Disruption Burst Projector
type = "active", "projected"
def handler(fit, module, context, *args, **kwargs):
if "projected" in context:
for srcAttr, tgtAttr in (
("aoeCloudSizeBonus", "aoeCloudSize"),
("aoeVelocityBonus", "aoeVelocity"),
("missileVelocityBonus", "maxVelocity"),
("explosionDelayBonus", "explosionDelay"),
):
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Missile Launcher Operation"),
tgtAttr, module.getModifiedItemAttr(srcAttr),
stackingPenalties=True, *args, **kwargs)
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Gunnery"),
"trackingSpeed", module.getModifiedItemAttr("trackingSpeedBonus"),
stackingPenalties=True, *args, **kwargs)
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Gunnery"),
"maxRange", module.getModifiedItemAttr("maxRangeBonus"),
stackingPenalties=True, *args, **kwargs)
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Gunnery"),
"falloff", module.getModifiedItemAttr("falloffBonus"),
stackingPenalties=True, *args, **kwargs)

View File

@@ -0,0 +1,12 @@
# doomsdayAOEWeb
#
# Used by:
# Module: Stasis Webification Burst Projector
type = "active", "projected"
def handler(fit, module, context, *args, **kwargs):
if "projected" not in context:
return
fit.ship.boostItemAttr("maxVelocity", module.getModifiedItemAttr("speedFactor"),
stackingPenalties=True, *args, **kwargs)

View File

@@ -1,8 +1,7 @@
# droneBandwidthAddPassive
#
# Used by:
# Subsystems from group: Engineering Systems (13 of 16)
# Subsystems from group: Offensive Systems (16 of 16)
# Subsystems from group: Offensive Systems (12 of 12)
type = "passive"

View File

@@ -1,7 +1,7 @@
# droneCapacityAdddroneCapacityPassive
#
# Used by:
# Items from category: Subsystem (42 of 80)
# Subsystems from group: Offensive Systems (12 of 12)
type = "passive"

View File

@@ -3,6 +3,7 @@
# Used by:
# Implants named like: Zainou 'Gypsy' CPU Management EE (6 of 6)
# Modules named like: Processor Overclocking Unit (8 of 8)
# Subsystems named like: Core Electronic Efficiency Gate (2 of 2)
# Implant: Genolution Core Augmentation CA-2
# Skill: CPU Management
type = "passive"

View File

@@ -1,7 +1,7 @@
# eliteBonusBlackOpsCloakVelocity2
#
# Used by:
# Ships from group: Black Ops (4 of 4)
# Ships from group: Black Ops (5 of 5)
type = "passive"

View File

@@ -0,0 +1,10 @@
# eliteBonusBlackOpsScramblerRange4
#
# Used by:
# Ship: Marshal
type = "passive"
def handler(fit, src, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Warp Scrambler", "maxRange",
src.getModifiedItemAttr("eliteBonusBlackOps4"), stackingPenalties=True, skill="Black Ops")

View File

@@ -0,0 +1,9 @@
# eliteBonusBlackOpsWarpVelocity1
#
# Used by:
# Ship: Marshal
type = "passive"
def handler(fit, src, context):
fit.ship.boostItemAttr("warpSpeedMultiplier", src.getModifiedItemAttr("eliteBonusBlackOps1"), stackingPenalties=True, skill="Black Ops")

View File

@@ -0,0 +1,10 @@
# eliteBonusBlackOpsWebRange3
#
# Used by:
# Ship: Marshal
type = "passive"
def handler(fit, src, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Stasis Web", "maxRange",
src.getModifiedItemAttr("eliteBonusBlackOps3"), stackingPenalties=True, skill="Black Ops")

View File

@@ -7,4 +7,4 @@ type = "passive"
def handler(fit, ship, context):
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Bomb Deployment"),
"emDamage", ship.getModifiedItemAttr("eliteBonusCoverOps1"), skill="Covert Ops")
"emDamage", ship.getModifiedItemAttr("eliteBonusCovertOps1"), skill="Covert Ops")

View File

@@ -2,10 +2,11 @@
#
# Used by:
# Ship: Hound
# Ship: Virtuoso
type = "passive"
def handler(fit, ship, context):
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Bomb Deployment"),
"explosiveDamage", ship.getModifiedItemAttr("eliteBonusCoverOps1"),
"explosiveDamage", ship.getModifiedItemAttr("eliteBonusCovertOps1"),
skill="Covert Ops")

View File

@@ -7,5 +7,5 @@ type = "passive"
def handler(fit, ship, context):
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Bomb Deployment"),
"kineticDamage", ship.getModifiedItemAttr("eliteBonusCoverOps1"),
"kineticDamage", ship.getModifiedItemAttr("eliteBonusCovertOps1"),
skill="Covert Ops")

View File

@@ -2,10 +2,11 @@
#
# Used by:
# Ship: Nemesis
# Ship: Virtuoso
type = "passive"
def handler(fit, ship, context):
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Bomb Deployment"),
"thermalDamage", ship.getModifiedItemAttr("eliteBonusCoverOps1"),
"thermalDamage", ship.getModifiedItemAttr("eliteBonusCovertOps1"),
skill="Covert Ops")

View File

@@ -7,5 +7,5 @@ type = "passive"
def handler(fit, src, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name in ("Energy Nosferatu", "Energy Neutralizer"),
"falloffEffectiveness", src.getModifiedItemAttr("eliteBonusCoverOps1"),
"falloffEffectiveness", src.getModifiedItemAttr("eliteBonusCovertOps1"),
stackingPenalties=True, skill="Covert Ops")

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