Compare commits

...

459 Commits

Author SHA1 Message Date
blitzmann
d52c249921 Remove client path hashing for secret file (was interfering with OS X build, because it unpacks pyfa into a different, random directory each time it runs) 2018-04-29 12:49:03 -04:00
blitzmann
0b9a50cd8d fix mac spec 2018-04-29 11:56:47 -04:00
blitzmann
25bbfec318 add a few things to requirements.txt 2018-04-29 11:31:33 -04:00
blitzmann
1192c26b8f Add the jargon yaml files to the build process 2018-04-29 11:30:41 -04:00
blitzmann
4a3201ffd4 Merge branch 'py3' of https://github.com/pyfa-org/Pyfa into test-3 2018-04-28 20:35:26 -04:00
blitzmann
406a22100d Merge branch 'esi' into test-3 2018-04-28 20:35:14 -04:00
Ryan Holmes
e83fa4d40b Merge pull request #1513 from fsufitch/issue/1369
Issue/1369
2018-04-07 09:10:44 -04:00
Ryan Holmes
c552cb5e40 Merge pull request #1510 from fsufitch/issue/1509
Use list control length instead of sys.maxsize for platform compatibility
2018-04-07 08:27:40 -04:00
Filip Sufitchi
49bc9f50bc Add a comprehensive default jargon file 2018-04-02 17:35:58 -04:00
Filip Sufitchi
30501feb99 Raise search limit back up to 3 2018-04-02 17:25:45 -04:00
Filip Sufitchi
efc07e1553 Move minimum search length check to the service, to cover jargon 2018-04-02 17:23:30 -04:00
Filip Sufitchi
9bbeec523e Remove some debug try/except stuff 2018-04-02 16:44:14 -04:00
Filip Sufitchi
943ee517f4 Add jargon service
Jargon service translates search strings for the market
using community-sourced abbreviations. It also creates the
jargon.yaml file in the user's save directory, for
future customization (either manual, or via the UI) and
provides the code hooks to load and update it. The
JargonLoader is capable of hot-loading new jargon.yaml
configurations without restarting Pyfa.
2018-04-02 16:40:39 -04:00
Filip Sufitchi
18bb3bf246 Use list control length instead of sys.maxsize for platform compatibility 2018-03-31 16:28:59 -04:00
blitzmann
117d51caab change back to the py3-dev database 2018-03-25 21:42:51 -04:00
blitzmann
a3e411f225 Merge tag 'v2.0.0b5' into esi
# Conflicts:
#	eos/saveddata/character.py
2018-03-25 19:21:32 -04:00
blitzmann
083af3ebc7 Suppress pre-release notification only if current build is not a pre-release 2018-03-25 13:25:09 -04:00
blitzmann
3fd4d106d9 Merge branch 'master' into test-3
# Conflicts:
#	config.py
#	eos/effects/warpdisruptsphere.py
#	service/update.py
2018-03-25 13:16:07 -04:00
Ryan Holmes
7c376c93a2 Merge pull request #1500 from pyfa-org/release/1.36
Release/1.36
2018-03-25 13:12:46 -04:00
blitzmann
4ef7b645a8 Update effects, icons, db, version bump 2018-03-25 13:11:29 -04:00
blitzmann
cccc7ff2d0 Merge branch 'master' into release/1.36
# Conflicts:
#	service/update.py
2018-03-25 13:03:52 -04:00
blitzmann
b7c45f4c6e Fix the update check logic; only go through the 5 latests updates, and if the check fails (specifically due to our new beta tagging for v2) then simply continue to the next one instead of failing outright 2018-03-25 03:33:02 -04:00
blitzmann
3964658d9a Enable cargohold for structures (#1414) 2018-03-25 03:18:34 -04:00
blitzmann
03212be54a Merge branch 'master' into test-3
# Conflicts:
#	eos/capSim.py
#	eos/effects/structurewarpscrambleblockmwdwithnpceffect.py
#	eos/effects/warpdisruptsphere.py
2018-03-25 03:03:59 -04:00
blitzmann
46098f2127 Merge branch 'master' into release/1.36 2018-03-25 03:00:28 -04:00
Ryan Holmes
2005d0b0b9 Merge pull request #1494 from Neugeniko/Issue#1439-2
Respect 'Factor in Reload' preference for sustainable tank (tidied up).
2018-03-25 02:59:48 -04:00
blitzmann
3293380515 styling fix 2018-03-24 18:18:16 -04:00
Neugeniko
68e5b22fe2 Implement effect for Standup Warp Disruption Burst Projector.
Make active so we can see its effect on capacitor.

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

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

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

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

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

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

If we are projecting effects, modify warpScrambleStatus all the time, and turn off modules requiring 'High Speed Maneuvering' (MWDs) or "Micro Jump Drive Operation" (MJD etc) if a scrambling script is loaded.
2018-03-07 15:25:57 +11:00
Alexey Minnekhanov
0b615b578a Bring back proxy settings in network preferences view 2018-03-05 18:02:34 +03:00
Alexey Minnekhanov
53f07db5fe Network: apply proxy settings for requests library call 2018-03-05 16:24:00 +03:00
Alexey Minnekhanov
4d4815d6af Network: change User-Agent header from "urllib" to "requests" with version 2018-03-05 16:16:06 +03:00
blitzmann
b296e0709c Merge branch 'master' into test-3 2018-03-05 00:07:28 -05:00
blitzmann
373e0a390b Don't multiple HP of structure, instead assign it. Fixes #1460 2018-03-04 19:42:28 -05:00
blitzmann
222037ff40 Remove proxy support for the time being 2018-03-04 18:10:40 -05:00
blitzmann
4fac10ccb7 Fix update checker, migrate to requests package for all network stuff. The eveapi package is probably not going to work with caching and whatnot, but pyfa doesn't use it and XML API is EOL anyway 2018-03-04 18:08:34 -05:00
blitzmann
7956ca0409 Merge remote-tracking branch 'origin/master' into test-3
# Conflicts:
#	config.py
2018-03-04 16:47:08 -05:00
Ryan Holmes
5b27d0559f Merge pull request #1464 from pyfa-org/release/v1.35.2
Bump version
2018-03-04 16:44:28 -05:00
blitzmann
85157fdf85 Bump version 2018-03-04 16:44:00 -05:00
blitzmann
caf8e7f2d6 Test something on mac 2018-03-03 17:40:40 -05:00
blitzmann
124bb027ab Use bs4.UnicodeDammit to handle different encodings for file imports (fits only for now, can look into expanding for other file import types) 2018-03-03 14:21:55 -05:00
blitzmann
d5ca14ca52 Remove encoding checks for eft import (#1459) 2018-03-03 00:50:56 -05:00
blitzmann
99982aa547 Merge branch 'master' into test-3 2018-03-02 00:17:54 -05:00
blitzmann
3f4493c0ea Another fix for #1403 2018-03-02 00:17:33 -05:00
blitzmann
cdb604b29f Merge remote-tracking branch 'origin/py3' into test-3 2018-03-01 23:42:29 -05:00
blitzmann
d3b8cebc8a Merge branch 'master' into test-3 2018-03-01 23:42:22 -05:00
Ryan Holmes
7d245660bc Merge pull request #1455 from pyfa-org/issue/1451
Don't fail when trying to project a module that can't be projected.
2018-03-01 23:41:50 -05:00
blitzmann
b1e40427a3 Tox 2018-03-01 23:41:39 -05:00
blitzmann
73925df24b Don't fail when trying to project a module that can't be projected. 2018-03-01 23:24:00 -05:00
Ryan Holmes
04fbd3b548 Merge pull request #1454 from Neugeniko/py3
Resolves issue #1453 with xmlparser.ParseFile(file) wanting bytes.
2018-03-01 20:59:08 -05:00
Neugeniko
d9dd94d6c3 Update character.py
Resolves issue #1453 with xmlparser.ParseFile(file) wanting bytes.
2018-03-02 12:00:11 +11:00
blitzmann
963353a1dc Merge branch 'master' into test-3 2018-03-01 00:40:40 -05:00
Ryan Holmes
3411dcfd91 Merge pull request #1446 from pyfa-org/issue/1445-master
Issue/1445 master
2018-03-01 00:30:24 -05:00
blitzmann
ae6434affb Fix issue with importing EVE API XML 2018-03-01 00:30:08 -05:00
blitzmann
f773e0a935 fix misplaced parentheses
(cherry picked from commit 2a60216a92d39bb200c26bce8573484f54a80dc5)
2018-03-01 00:26:52 -05:00
blitzmann
7ab3ad9e08 Don't delete and recreate skills when updating char sheet. Instead, get each individual skill and change level.
(cherry picked from commit 55c79c1bafaa9a1b159b73a72c6480f7e8d6cb6b)
2018-03-01 00:26:47 -05:00
blitzmann
3f3a82ca6c Merge branch 'py3' of https://github.com/pyfa-org/Pyfa into test-3 2018-02-28 22:02:22 -05:00
blitzmann
e902cc5780 Add event.skip() to fit rename textCtrl focus loss 2018-02-28 22:00:48 -05:00
Ryan Holmes
fcb6952119 Merge pull request #1444 from Neugeniko/py3
Ensure graph frame unbinds its event handlers.
2018-02-27 21:09:10 -05:00
Neugeniko
3eecd57979 Update graphFrame.py 2018-02-28 03:17:37 +11:00
blitzmann
6e73b9fefd Tox 2018-02-27 00:52:15 -05:00
blitzmann
f0b0285f77 Merge branch 'development' of https://github.com/pyfa-org/Pyfa into development 2018-02-27 00:46:10 -05:00
blitzmann
e706a015b3 Merge branch 'issue/1397' into development 2018-02-27 00:45:53 -05:00
blitzmann
a804f9a1ad Fix working on missing skills context menu (#1412)
(cherry picked from commit 96c13c344a)
2018-02-27 00:45:46 -05:00
blitzmann
9e1b7dbb87 Add ability to drag a module from fitting window to projected pane 2018-02-27 00:44:42 -05:00
blitzmann
551ffe9ed3 Quick fix for #1430 2018-02-27 00:23:29 -05:00
blitzmann
cbe1ce5bcd Merge branch 'master' into test-3 2018-02-27 00:16:45 -05:00
Ryan Holmes
917afd5067 Merge pull request #1441 from pyfa-org/issue/1440
Convert sec status to float on character import (#1440)
2018-02-27 00:15:59 -05:00
blitzmann
c3fb9231a4 Convert sec status to float on character import (#1440) 2018-02-27 00:15:20 -05:00
blitzmann
2ed2f8e262 Fix issue with losing wrapper for FittingView when closing 2018-02-25 12:04:57 -05:00
blitzmann
390d90ac47 Merge branch 'issue/1434' into test-3 (#1434)
# Conflicts:
#	gui/builtinViews/fittingView.py
2018-02-25 01:57:36 -05:00
blitzmann
4c877e7a5a re-enable the tab preview 2018-02-25 01:45:43 -05:00
blitzmann
972fe433f7 remove vestigial file 2018-02-25 00:11:13 -05:00
blitzmann
ecaf6f96a9 guage: respect animation setting (#1434) 2018-02-25 00:10:17 -05:00
Ryan Holmes
8541e2a869 Merge pull request #1438 from pyfa-org/issue/1433
DNA export should respect Export Charges setting
2018-02-24 23:50:21 -05:00
blitzmann
48a2963472 Merge branch 'issue/1433' into test-3 2018-02-24 23:40:26 -05:00
blitzmann
f245a02372 DNA export should respect Export Charges setting 2018-02-24 23:37:53 -05:00
blitzmann
1c16343b46 Merge branch 'master' into test-3 2018-02-24 22:24:16 -05:00
Ryan Holmes
d0f66f2d16 Merge pull request #1437 from pyfa-org/issue/1432
Always open imports in a new tab (#1432)
2018-02-24 22:23:13 -05:00
blitzmann
df0c6ed269 Merge branch 'bug/amount-modal' into test-3 2018-02-24 22:21:02 -05:00
Ryan Holmes
9a4e26a5be Merge pull request #1436 from pyfa-org/bug/amount-modal
Handle getting value for Change Amount differently for projected fits (#1435)
2018-02-24 22:20:51 -05:00
blitzmann
2b87f91279 tox fix 2018-02-24 22:20:24 -05:00
blitzmann
9b48b61b9b Merge branch 'bug/amount-modal' into test-3 2018-02-24 22:17:22 -05:00
blitzmann
57e67b3699 Handle getting value for Change Amount differently for projected fits 2018-02-24 22:17:04 -05:00
blitzmann
15e60c3d24 Always open imports in a new tab (#1432) 2018-02-24 21:11:53 -05:00
blitzmann
ebf07db6c6 Partial fix for #1430 2018-02-24 19:01:54 -05:00
blitzmann
1559767201 Ensure that the event is propagated when the graph window handles FitChanged (#1430) 2018-02-24 18:21:32 -05:00
blitzmann
6e5e52df37 See #1429, version file not currently applied 2018-02-24 17:13:50 -05:00
blitzmann
e9289c102b Fix issue in notebook tab preview (this feature hasn't been enabled for a while, but we may want to turn it back on eventually. As such, ensure that we don't run into any problems here) 2018-02-24 13:53:56 -05:00
blitzmann
81d61d7e29 lol context management not available in 4.0.0b2, and can't update to >4.0 until #1421 is addressed 2018-02-24 13:49:17 -05:00
blitzmann
9ab4ec2d4f Convert AutoBufferedPaintDC > BufferedPaintDC (and use spiffy new context management). See #1418 2018-02-24 13:45:36 -05:00
blitzmann
565332dfcd Set wx requirement to v4b2, see #1421 2018-02-24 13:28:45 -05:00
blitzmann
f94fbd740a Merge branch 'bug/amount-modal' into test-3
# Conflicts:
#	gui/builtinContextMenus/amount.py
2018-02-24 02:55:40 -05:00
Ryan Holmes
a2719ec2f7 Merge pull request #1427 from pyfa-org/bug/amount-modal
Redesign amount modal
2018-02-24 02:54:38 -05:00
blitzmann
1da12cb18e tox fix 2018-02-24 02:54:23 -05:00
blitzmann
e0cddcd061 Redesign amount modal, basing style off wx.TextEntryDialog (but not a wx.TextEntryDialog, because there are possibilities to do a few different things in this modal) 2018-02-24 02:47:13 -05:00
blitzmann
78f632a4f6 Merge remote-tracking branch 'origin/master' into test-3 2018-02-24 02:03:29 -05:00
Ryan Holmes
52754535a0 Merge pull request #1426 from pyfa-org/issue/1416
Issue/1416
2018-02-24 02:02:57 -05:00
blitzmann
a9db667c9c Do the same treatment to Target Resists as Damage Patterns 2018-02-24 02:01:23 -05:00
blitzmann
f442632fbc Fix importing damage profiles which included overwriting existing ones and then performing a delete on one of them. #1416 2018-02-24 01:49:09 -05:00
blitzmann
362086cc83 Fix type in database default for damage types 2018-02-24 01:47:05 -05:00
blitzmann
73d59569ff Merge remote-tracking branch 'origin/master' into test-3
# Conflicts:
#	gui/characterEditor.py
2018-02-23 23:28:33 -05:00
Ryan Holmes
cb4fadf84c Merge pull request #1425 from pyfa-org/issue/1419
Migrate the Save Character As dialog tot he same dialog / validator a…
2018-02-23 23:26:44 -05:00
blitzmann
e85d144928 Migrate the Save Character As dialog tot he same dialog / validator as the Edit Character Name (#1419) 2018-02-23 23:25:11 -05:00
blitzmann
07099f4057 Fix working on missing skills context menu (#1412)
(cherry picked from commit 96c13c344a)
2018-02-23 01:17:18 -05:00
blitzmann
96c13c344a Fix working on missing skills context menu (#1412) 2018-02-23 01:15:57 -05:00
blitzmann
8f42822d9e Add roman package as a requirement, and remove the roman module from pyfa 2018-02-23 01:04:31 -05:00
blitzmann
c5ba79cfbb Merge branch 'master' into test-3
# Conflicts:
#	.gitignore
2018-02-23 01:02:51 -05:00
Ryan Holmes
f69f76856a Merge pull request #1391 from BlueShanks/acceptRomanNumerals
Character Editor: accept skill plans in Roman numerals too
2018-02-23 01:01:57 -05:00
Ryan Holmes
3a23d820cc Merge branch 'master' into acceptRomanNumerals 2018-02-23 01:01:07 -05:00
blitzmann
c917d22db5 tox fixes for the roman library to prevent travis from yelling at us 2018-02-23 01:00:43 -05:00
blitzmann
c3f8b102fa Add the romans library to pyfa itself to avoid having to modify the binaries 2018-02-23 00:57:26 -05:00
blitzmann
5e566db47d Fix attribute override export / import (#1420) 2018-02-23 00:36:52 -05:00
blitzmann
5b2c5907ed Skills needed export (#1412): Need to encode the string before we gzip it 2018-02-23 00:23:45 -05:00
blitzmann
dd78a41171 Fix HTML export (more encoding stuff). Also fix old bug in which unicode fit names don't display correctly in the webbrowser. #1411 2018-02-23 00:13:14 -05:00
blitzmann
201fb4e241 Remove all encoding bits from fit importing. Might not work 100% of the time, but as 2.0 gets introduced to the community, we'll get reports of possible problems. #1410 2018-02-23 00:00:53 -05:00
blitzmann
8abd25fe40 Use a scolled window in preference pages 2018-02-19 23:32:44 -05:00
blitzmann
d59c897921 Fix image list in preferences dialog 2018-02-19 01:20:57 -05:00
Ryan Holmes
cb89d13d9f Merge pull request #1409 from pyfa-org/bug/1403
Remove some defunct items from market service
2018-02-19 00:16:42 -05:00
blitzmann
a1aa78adc0 Remove some defunct items from market service 2018-02-18 23:28:17 -05:00
blitzmann
4bbbd33917 Return 0 instead of -1 when there is no charge on a weapon. It was changed from None to -1 during the py3 conversion (as None can no longer be compared against non-None types). -1 was throwing the capSim off by quite a bit. See #1405 2018-02-18 22:55:31 -05:00
blitzmann
42ccc53166 bit of clean up for reload setting 2018-02-18 20:35:46 -05:00
blitzmann
35ad21da38 Add pattern for commit hashes to update dialog 2018-02-17 16:27:12 -05:00
blitzmann
72efef818f Fix version stuff 2018-02-17 13:59:19 -05:00
blitzmann
5571bae8b2 Fix situation in which event propagation was not working properly for structures 2018-02-17 12:47:07 -05:00
blitzmann
8b2cfe44f2 Merge remote-tracking branch 'origin/master' into test-3
# Conflicts:
#	config.py
#	eos/saveddata/fighter.py
2018-02-17 12:31:58 -05:00
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
fe1c4cc4d4 Make a callback for token refresh, not sure how I'm gonna handle this one yet 2018-02-12 21:43:23 -05:00
blitzmann
ed649dd4c7 Merge branch 'test-3' into esi 2018-02-11 23:23:30 -05:00
blitzmann
33618f12f7 Fix issue when error happens before wx is even initialized traceback is never set 2018-02-11 23:22:37 -05:00
blitzmann
33eccaa374 Merge branch 'test-3' into esi
# Conflicts:
#	requirements.txt
2018-02-11 23:17:50 -05:00
blitzmann
5f0ce58c29 Merge branch 'master' into test-3
# Conflicts:
#	gui/builtinShipBrowser/fitItem.py
#	service/port.py
2018-02-11 21:29:17 -05:00
blitzmann
c329f5eeb8 Bump up the wxPython requirement to 4.0.1 2018-02-11 21:22:35 -05:00
blitzmann
320a0230f4 fix version data file in mac spec file 2018-02-11 12:32:34 -05:00
blitzmann
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
blitzmann
7b0f672f04 Get encrypted refresh tokens working 2018-02-09 18:25:53 -05:00
blitzmann
33bf5234d0 Goodbye eveapi! You have served us well all these years!
Start stripping XML API stuff and implement ESI skill fetching.
2018-02-09 00:42:59 -05:00
blitzmann
cb392e7e5f Rename a few things 2018-02-08 01:52:38 -05:00
blitzmann
dfba033190 Implement posting fit to EVE server 2018-02-08 01:50:52 -05:00
blitzmann
5fbe623ae6 get fit deletion working. Need to be aware that we are still using cached fit listing... 2018-02-08 01:38:24 -05:00
blitzmann
e025bff99b Get ESI fitting import working completely. Use a file cache for EsiApp to prevent long startup times (possibly cache for about a week or so, and start in background if it needs to be gotten again?) 2018-02-08 01:24:40 -05:00
blitzmann
e77dddc15b More work on getting fittings form a character via ESI. It's starting to be come a pain working with this client with having to background it until it initializes. Thinking about rolling my own, considering we only need a few calls and not a whole package. 2018-02-07 02:07:42 -05:00
blitzmann
eea8019593 Get fitting browser to show up with proper characters (still not functional). Start testing ways to store the esipy app on the service (it can take a few seconds to initialize due to network calls) 2018-02-07 01:21:22 -05:00
blitzmann
c7360c8cc3 Get logging into EVE working and SSO characters saving, along with client hashes being stored alongside characters. 2018-02-07 00:44:37 -05:00
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
2376148380 Start ripping CREST stuff out, add new SSOCharacter stuff in. Long process ahead. 2018-02-02 02:05:49 -05:00
blitzmann
2e8d7d3610 add markdown2 to requirements.txt 2018-02-01 23:09:08 -05:00
blitzmann
3179016aed Enhance the update modal to show a web view with html-rendered markdown of release ntoes 2018-02-01 21:58:29 -05:00
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
9e8166c13d Add ESI service skeleton, and my customer ESI Proxy class 2018-01-11 20:54:33 -05:00
blitzmann
9f7e4e0dc0 Fix issue with market search (None / int comparison) 2018-01-10 21:39:50 -05:00
blitzmann
29d175c7b3 Fix for error that happens when switching to/from firepower/mining 2018-01-10 00:51:21 -05:00
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
blitzmann
3b716e6e5e fix py2app setup file 2017-07-07 00:22:58 -04:00
blitzmann
961b389b40 test 2017-07-06 23:41:55 -04:00
Ryan Holmes
0527a506ac fix broken events preventing additions panels to not work 2017-07-03 01:46:46 -04:00
Ryan Holmes
1082d8a173 fix fix fix 2017-07-02 23:45:28 -04:00
Ryan Holmes
7ae41b71b2 Fix some deprecated things and a bug or two 2017-07-02 23:26:44 -04:00
Ryan Holmes
de5a734919 About dialog (looks like shit x_x) 2017-07-02 16:42:22 -04:00
Ryan Holmes
987c55ed8f Get preferences dialog up and running 2017-07-02 16:32:39 -04:00
Ryan Holmes
57783fe80f More work on character editor 2017-07-02 15:28:42 -04:00
Ryan Holmes
f24c2ddd22 Get skill list in character editor showing. Mostly doesn't work still 2017-07-02 14:12:00 -04:00
Ryan Holmes
f16e14e0b4 Fix gauges again, convert remaining IconFromBitmap > Icon 2017-06-14 15:05:12 -04:00
Ryan Holmes
729c46ab00 Revert "Remove EVT_ERASE_BACKGROUND events - pretty sure these were there for older versions of wx where the background wasn't erased properly"
This does help prevent flickering on resizing. Need to research more before removing them

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

177
config.py
View File

@@ -1,7 +1,11 @@
import os
import sys
from logbook import Logger
from logbook import CRITICAL, DEBUG, ERROR, FingersCrossedHandler, INFO, Logger, NestedSetup, NullHandler, \
StreamHandler, TimedRotatingFileHandler, WARNING
import hashlib
from cryptography.fernet import Fernet
pyfalog = Logger(__name__)
@@ -19,17 +23,39 @@ debug = False
saveInRoot = False
# Version data
version = "1.31.0"
tag = "Stable "
expansionName = "YC119.8"
expansionVersion = "1.0"
version = "2.0.0b5"
tag = "git"
expansionName = "YC120.3"
expansionVersion = "1.8"
evemonMinVersion = "4081"
minItemSearchLength = 3
pyfaPath = None
savePath = None
saveDB = None
gameDB = None
logPath = None
loggingLevel = None
logging_setup = None
cipher = None
clientHash = None
ESI_AUTH_PROXY = "https://www.pyfa.io" # "http://localhost:5015"
ESI_CACHE = 'esi_cache'
LOGLEVEL_MAP = {
"critical": CRITICAL,
"error": ERROR,
"warning": WARNING,
"info": INFO,
"debug": DEBUG,
}
def getClientSecret():
return clientHash
def isFrozen():
@@ -45,23 +71,37 @@ 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
global cipher
global clientHash
pyfalog.debug("Configuring Pyfa")
@@ -86,12 +126,22 @@ def defPaths(customSavePath):
__createDirs(savePath)
if isFrozen():
os.environ["REQUESTS_CA_BUNDLE"] = os.path.join(pyfaPath, "cacert.pem").encode('utf8')
os.environ["SSL_CERT_FILE"] = os.path.join(pyfaPath, "cacert.pem").encode('utf8')
secret_file = os.path.join(savePath, ".secret")
if not os.path.exists(secret_file):
with open(secret_file, "wb") as _file:
_file.write(Fernet.generate_key())
with open(secret_file, 'rb') as fp:
key = fp.read()
clientHash = hashlib.sha3_256(key).hexdigest()
cipher = Fernet(key)
# if isFrozen():
# os.environ["REQUESTS_CA_BUNDLE"] = os.path.join(pyfaPath, "cacert.pem")
# os.environ["SSL_CERT_FILE"] = os.path.join(pyfaPath, "cacert.pem")
# The database where we store all the fits etc
saveDB = os.path.join(savePath, "saveddata.db")
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 +150,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 +166,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')

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

@@ -0,0 +1,74 @@
# -*- mode: python -*-
import os
from itertools import chain
import subprocess
import requests.certs
label = subprocess.check_output([
"git", "describe", "--tags"]).strip()
with open('.version', 'w+') as f:
f.write(label.decode())
block_cipher = None
added_files = [
('../../imgs/gui/*.png', 'imgs/gui'),
('../../imgs/gui/*.gif', 'imgs/gui'),
('../../imgs/icons/*.png', 'imgs/icons'),
('../../imgs/renders/*.png', 'imgs/renders'),
('../../dist_assets/win/pyfa.ico', '.'),
('../../service/jargon/*.yaml', 'service/jargon'),
(requests.certs.where(), '.'), # is this needed anymore?
('../../eve.db', '.'),
('../../README.md', '.'),
('../../LICENSE', '.'),
('../../.version', '.'),
]
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,37 @@
# -*- mode: python -*-
# Note: This script is provided AS-IS for those that may be interested.
# pyfa does not currently support pyInstaller (or any other build process) 100% at the moment
# Command line to build:
# (Run from directory where pyfa.py and pyfa.spec lives.)
# c:\Python27\scripts\pyinstaller.exe --clean --noconfirm --windowed --upx-dir=.\scripts\upx.exe pyfa.spec
# Don't forget to change the path to where your pyfa.py and pyfa.spec lives
# pathex=['C:\\Users\\Ebag333\\Documents\\GitHub\\Ebag333\\Pyfa'],
import os
from itertools import chain
import subprocess
import requests.certs
label = subprocess.check_output([
"git", "describe", "--tags"]).strip()
with open('.version', 'w+') as f:
f.write(label.decode())
block_cipher = None
added_files = [
( 'imgs/gui/*.png', 'imgs/gui' ),
( 'imgs/gui/*.gif', 'imgs/gui' ),
( 'imgs/icons/*.png', 'imgs/icons' ),
( 'imgs/renders/*.png', 'imgs/renders' ),
( 'dist_assets/win/pyfa.ico', '.' ),
( 'dist_assets/cacert.pem', '.' ),
( 'eve.db', '.' ),
( 'README.md', '.' ),
( 'LICENSE', '.' ),
('../../imgs/gui/*.png', 'imgs/gui'),
('../../imgs/gui/*.gif', 'imgs/gui'),
('../../imgs/icons/*.png', 'imgs/icons'),
('../../imgs/renders/*.png', 'imgs/renders'),
('../../service/jargon/*.yaml', 'service/jargon'),
('../../dist_assets/win/pyfa.ico', '.'),
(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 +40,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 +68,6 @@ exe = EXE(pyz,
upx=True,
name='pyfa',
icon='dist_assets/win/pyfa.ico',
onefile=False,
)
coll = COLLECT(
@@ -77,7 +77,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
@@ -71,7 +72,7 @@ class CapSimulator(object):
disable_period = False
# Loop over modules, clearing clipSize if applicable, and group modules based on attributes
for (duration, capNeed, clipSize, disableStagger) in self.modules:
for (duration, capNeed, clipSize, disableStagger, reloadTime) in self.modules:
if self.scale:
duration, capNeed = self.scale_activation(duration, capNeed)
@@ -79,24 +80,25 @@ class CapSimulator(object):
# a cap booster module.
if not self.reload and capNeed > 0:
clipSize = 0
reloadTime = 0
# Group modules based on their properties
if (duration, capNeed, clipSize, disableStagger) in mods:
mods[(duration, capNeed, clipSize, disableStagger)] += 1
if (duration, capNeed, clipSize, disableStagger, reloadTime) in mods:
mods[(duration, capNeed, clipSize, disableStagger, reloadTime)] += 1
else:
mods[(duration, capNeed, clipSize, disableStagger)] = 1
mods[(duration, capNeed, clipSize, disableStagger, reloadTime)] = 1
# Loop over grouped modules, configure staggering and push to the simulation state
for (duration, capNeed, clipSize, disableStagger), amount in mods.iteritems():
for (duration, capNeed, clipSize, disableStagger, reloadTime), amount in mods.items():
if self.stagger and not disableStagger:
if clipSize == 0:
duration = int(duration / amount)
else:
stagger_amount = (duration * clipSize + 10000) / (amount * clipSize)
stagger_amount = (duration * clipSize + reloadTime) / (amount * clipSize)
for i in range(1, amount):
heapq.heappush(self.state,
[i * stagger_amount, duration,
capNeed, 0, clipSize])
capNeed, 0, clipSize, reloadTime])
else:
capNeed *= amount
@@ -106,7 +108,7 @@ class CapSimulator(object):
if clipSize:
disable_period = True
heapq.heappush(self.state, [0, duration, capNeed, 0, clipSize])
heapq.heappush(self.state, [0, duration, capNeed, 0, clipSize, reloadTime])
if disable_period:
self.period = self.t_max
@@ -143,7 +145,7 @@ class CapSimulator(object):
while 1:
activation = pop(state)
t_now, duration, capNeed, shot, clipSize = activation
t_now, duration, capNeed, shot, clipSize, reloadTime = activation
if t_now >= t_max:
break
@@ -179,7 +181,7 @@ class CapSimulator(object):
if clipSize:
if shot % clipSize == 0:
shot = 0
t_now += 10000 # include reload time
t_now += reloadTime # include reload time
activation[0] = t_now
activation[3] = shot
@@ -192,7 +194,7 @@ class CapSimulator(object):
# calculate EVE's stability value
try:
avgDrain = reduce(float.__add__, map(lambda x: x[2] / x[1], self.state), 0.0)
avgDrain = reduce(float.__add__, [x[2] / x[1] for x in self.state], 0.0)
self.cap_stable_eve = 0.25 * (1.0 + sqrt(-(2.0 * avgDrain * tau - capCapacity) / capCapacity)) ** 2
except ValueError:
self.cap_stable_eve = 0.0

View File

@@ -11,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
@@ -76,7 +76,7 @@ sd_lock = threading.RLock()
# noinspection PyPep8
from eos.db.gamedata import alphaClones, attribute, category, effect, group, icon, item, marketGroup, metaData, metaGroup, queries, traits, unit
# noinspection PyPep8
from eos.db.saveddata import booster, cargo, character, crest, damagePattern, databaseRepair, drone, fighter, fit, implant, implantSet, loadDefaultDatabaseValues, \
from eos.db.saveddata import booster, cargo, character, damagePattern, databaseRepair, drone, fighter, fit, implant, implantSet, loadDefaultDatabaseValues, \
miscData, module, override, price, queries, skill, targetResists, user
# Import queries

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:
@@ -322,7 +322,7 @@ def getVariations(itemids, groupIDs=None, where=None, eager=None):
@cachedQuery(1, "attr")
def getAttributeInfo(attr, eager=None):
if isinstance(attr, basestring):
if isinstance(attr, str):
filter = AttributeInfo.name == attr
elif isinstance(attr, int):
filter = AttributeInfo.ID == attr
@@ -337,7 +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

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

View File

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

View File

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

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

@@ -12,7 +12,6 @@ __all__ = [
"miscData",
"targetResists",
"override",
"crest",
"implantSet",
"loadDefaultDatabaseValues"
]

View File

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

View File

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

View File

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

@@ -27,7 +27,7 @@ from eos.db.saveddata.fit import projectedFits_table
from eos.db.util import processEager, processWhere
from eos.saveddata.price import Price
from eos.saveddata.user import User
from eos.saveddata.crestchar import CrestChar
from eos.saveddata.ssocharacter import SsoCharacter
from eos.saveddata.damagePattern import DamagePattern
from eos.saveddata.targetResists import TargetResists
from eos.saveddata.character import Character
@@ -109,9 +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)
@@ -156,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()
@@ -175,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(
@@ -337,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:
@@ -391,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(
@@ -412,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(
@@ -433,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()
@@ -443,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)
@@ -467,29 +467,28 @@ def getProjectedFits(fitID):
raise TypeError("Need integer as argument")
def getCrestCharacters(eager=None):
def getSsoCharacters(clientHash, eager=None):
eager = processEager(eager)
with sd_lock:
characters = saveddata_session.query(CrestChar).options(*eager).all()
characters = saveddata_session.query(SsoCharacter).filter(SsoCharacter.client == clientHash).options(*eager).all()
return characters
@cachedQuery(CrestChar, 1, "lookfor")
def getCrestCharacter(lookfor, eager=None):
@cachedQuery(SsoCharacter, 1, "lookfor", "clientHash")
def getSsoCharacter(lookfor, clientHash, eager=None):
filter = SsoCharacter.client == clientHash
if isinstance(lookfor, int):
if eager is None:
with sd_lock:
character = saveddata_session.query(CrestChar).get(lookfor)
else:
eager = processEager(eager)
with sd_lock:
character = saveddata_session.query(CrestChar).options(*eager).filter(CrestChar.ID == lookfor).first()
elif isinstance(lookfor, basestring):
eager = processEager(eager)
with sd_lock:
character = saveddata_session.query(CrestChar).options(*eager).filter(CrestChar.name == lookfor).first()
filter = and_(filter, SsoCharacter.ID == lookfor)
elif isinstance(lookfor, str):
filter = and_(filter, SsoCharacter.characterName == lookfor)
else:
raise TypeError("Need integer or string as argument")
eager = processEager(eager)
with sd_lock:
character = saveddata_session.query(SsoCharacter).options(*eager).filter(filter).first()
return character
@@ -515,8 +514,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
@@ -544,7 +543,7 @@ def commit():
try:
saveddata_session.commit()
saveddata_session.flush()
except Exception:
except Exception as ex:
saveddata_session.rollback()
exc_info = sys.exc_info()
raise exc_info[0], exc_info[1], exc_info[2]
raise exc_info[0](exc_info[1]).with_traceback(exc_info[2])

View File

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

View File

@@ -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):
@@ -205,6 +205,16 @@ class HandledImplantBoosterList(HandledList):
HandledList.append(self, thing)
class HandledSsoCharacterList(list):
def append(self, character):
old = next((x for x in self if x.client == character.client), None)
if old is not None:
pyfalog.warning("Removing SSO Character with same hash: {}".format(repr(old)))
list.remove(self, old)
list.append(self, character)
class HandledProjectedModList(HandledList):
def append(self, proj):
if proj.isInvalid:

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

@@ -1,9 +1,7 @@
# ammoInfluenceCapNeed
#
# Used by:
# Items from category: Charge (464 of 898)
# Charges from group: Frequency Crystal (184 of 184)
# Charges from group: Hybrid Charge (208 of 208)
# Items from category: Charge (478 of 928)
type = "passive"

View File

@@ -1,7 +1,7 @@
# ammoInfluenceRange
#
# Used by:
# Items from category: Charge (568 of 898)
# Items from category: Charge (572 of 928)
type = "passive"

View File

@@ -1,8 +1,9 @@
# ammoSpeedMultiplier
#
# Used by:
# Charges from group: Festival Charges (10 of 10)
# Charges from group: Festival Charges (23 of 23)
# Charges from group: Interdiction Probe (2 of 2)
# Charges from group: Structure Festival Charges (3 of 3)
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,7 +1,7 @@
# boosterArmorHpPenalty
#
# Used by:
# Implants from group: Booster (12 of 48)
# Implants from group: Booster (12 of 62)
type = "boosterSideEffect"
# User-friendly name for the side effect

View File

@@ -1,7 +1,7 @@
# boosterMaxVelocityPenalty
#
# Used by:
# Implants from group: Booster (12 of 48)
# Implants from group: Booster (12 of 62)
type = "boosterSideEffect"
# User-friendly name for the side effect

View File

@@ -14,4 +14,4 @@ attr = "boosterMissileVelocityPenalty"
def handler(fit, booster, context):
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Missile Launcher Operation"),
"maxVelocity", attr)
"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,7 +1,7 @@
# boosterShieldCapacityPenalty
#
# Used by:
# Implants from group: Booster (12 of 48)
# Implants from group: Booster (12 of 62)
type = "boosterSideEffect"
# User-friendly name for the side effect

View File

@@ -10,7 +10,7 @@ type = "boosterSideEffect"
displayName = "Turret Optimal Range"
# Attribute that this effect targets
attr = "boosterTurretOptimalRange"
attr = "boosterTurretOptimalRangePenalty"
def handler(fit, booster, context):

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

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

@@ -4,9 +4,9 @@
# 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)
# Ships from group: Titan (7 of 7)
# Subsystems named like: Offensive Support Processor (4 of 4)
# Ship: Orca
# Ship: Rorqual

View File

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

View File

@@ -1,12 +1,12 @@
# 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 8)
# Ships from group: Stealth Bomber (4 of 5)
# 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: Defensive Covert Reconfiguration (4 of 4)
# Ship: Astero

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

@@ -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 5)
# 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 5)
# 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 @@
# cynosuralDurationBonus
#
# Used by:
# Ships from group: Force Recon Ship (6 of 8)
# 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 8)
# 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,9 @@
# doomsdayAOEBubble
#
# Used by:
# Module: Warp Disruption Burst Projector
type = "projected", "active"
def handler(fit, module, context):
return

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

@@ -0,0 +1,9 @@
# doomsdayBeamDOT
#
# Used by:
# Modules named like: Lance (4 of 4)
type = "active"
def handler(fit, src, context):
pass

View File

@@ -0,0 +1,9 @@
# doomsdayConeDOT
#
# Used by:
# Module: Bosonic Field Generator
type = "active"
def handler(fit, src, context):
pass

View File

@@ -0,0 +1,9 @@
# doomsdayHOG
#
# Used by:
# Module: Gravitational Transportation Field Oscillator
type = "active"
def handler(fit, src, context):
pass

View File

@@ -0,0 +1,9 @@
# doomsdaySlash
#
# Used by:
# Modules named like: Reaper (4 of 4)
type = "active"
def handler(fit, src, context):
pass

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

View File

@@ -7,5 +7,5 @@ type = "passive"
def handler(fit, ship, context):
fit.modules.filteredChargeBoost(lambda mod: mod.charge.group.name == "Scanner Probe",
"baseSensorStrength", ship.getModifiedItemAttr("eliteBonusCoverOps2"),
"baseSensorStrength", ship.getModifiedItemAttr("eliteBonusCovertOps2"),
skill="Covert Ops")

View File

@@ -6,4 +6,4 @@ type = "passive"
def handler(fit, src, context):
fit.ship.boostItemAttr("warpSpeedMultiplier", src.getModifiedItemAttr("eliteBonusCoverOps1"), skill="Covert Ops")
fit.ship.boostItemAttr("warpSpeedMultiplier", src.getModifiedItemAttr("eliteBonusCovertOps1"), skill="Covert Ops")

View File

@@ -0,0 +1,10 @@
# eliteBonusCovertOpsSHTDamage3
#
# Used by:
# Ship: Virtuoso
type = "passive"
def handler(fit, src, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Small Hybrid Turret"), "damageMultiplier",
src.getModifiedItemAttr("eliteBonusCovertOps3"), skill="Covert Ops")

View File

@@ -0,0 +1,20 @@
# eliteBonusFlagCruiserAllResistances1
#
# Used by:
# Ship: Monitor
type = "passive"
def handler(fit, src, context):
fit.ship.boostItemAttr("explosiveDamageResonance", src.getModifiedItemAttr("eliteBonusFlagCruisers1"), skill="Flag Cruisers")
fit.ship.boostItemAttr("shieldKineticDamageResonance", src.getModifiedItemAttr("eliteBonusFlagCruisers1"), skill="Flag Cruisers")
fit.ship.boostItemAttr("shieldExplosiveDamageResonance", src.getModifiedItemAttr("eliteBonusFlagCruisers1"), skill="Flag Cruisers")
fit.ship.boostItemAttr("armorThermalDamageResonance", src.getModifiedItemAttr("eliteBonusFlagCruisers1"), skill="Flag Cruisers")
fit.ship.boostItemAttr("thermalDamageResonance", src.getModifiedItemAttr("eliteBonusFlagCruisers1"), skill="Flag Cruisers")
fit.ship.boostItemAttr("shieldEmDamageResonance", src.getModifiedItemAttr("eliteBonusFlagCruisers1"), skill="Flag Cruisers")
fit.ship.boostItemAttr("armorExplosiveDamageResonance", src.getModifiedItemAttr("eliteBonusFlagCruisers1"), skill="Flag Cruisers")
fit.ship.boostItemAttr("armorEmDamageResonance", src.getModifiedItemAttr("eliteBonusFlagCruisers1"), skill="Flag Cruisers")
fit.ship.boostItemAttr("shieldThermalDamageResonance", src.getModifiedItemAttr("eliteBonusFlagCruisers1"), skill="Flag Cruisers")
fit.ship.boostItemAttr("kineticDamageResonance", src.getModifiedItemAttr("eliteBonusFlagCruisers1"), skill="Flag Cruisers")
fit.ship.boostItemAttr("armorKineticDamageResonance", src.getModifiedItemAttr("eliteBonusFlagCruisers1"), skill="Flag Cruisers")
fit.ship.boostItemAttr("emDamageResonance", src.getModifiedItemAttr("eliteBonusFlagCruisers1"), skill="Flag Cruisers")

View File

@@ -1,7 +1,4 @@
# eliteBonusGunshipDroneCapacity2
#
# Used by:
# Ship: Ishkur
# Not used by any item
type = "passive"

View File

@@ -0,0 +1,7 @@
# Not used by any item
type = "passive"
def handler(fit, src, context):
fit.drones.filteredItemBoost(lambda mod: mod.item.requiresSkill("Drones"), "trackingSpeed",
src.getModifiedItemAttr("eliteBonusGunship2"), stackingPenalties=True, skill="Assault Frigates")

View File

@@ -0,0 +1,10 @@
# eliteBonusGunshipEMMissileDamage1
#
# Used by:
# Ship: Jaguar
type = "passive"
def handler(fit, src, context):
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Missile Launcher Operation"), "emDamage",
src.getModifiedItemAttr("eliteBonusGunship1"), skill="Assault Frigates")

View File

@@ -0,0 +1,10 @@
# eliteBonusGunshipExplosionVelocity2
#
# Used by:
# Ship: Jaguar
type = "passive"
def handler(fit, src, context):
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Missile Launcher Operation"), "aoeVelocity",
src.getModifiedItemAttr("eliteBonusGunship2"), stackingPenalties=True, skill="Assault Frigates")

View File

@@ -0,0 +1,10 @@
# eliteBonusGunshipExplosiveMissileDamage1
#
# Used by:
# Ship: Jaguar
type = "passive"
def handler(fit, src, context):
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Missile Launcher Operation"), "explosiveDamage",
src.getModifiedItemAttr("eliteBonusGunship1"), skill="Assault Frigates")

View File

@@ -0,0 +1,10 @@
# eliteBonusGunshipKineticMissileDamage1
#
# Used by:
# Ship: Jaguar
type = "passive"
def handler(fit, src, context):
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Missile Launcher Operation"), "kineticDamage",
src.getModifiedItemAttr("eliteBonusGunship1"), skill="Assault Frigates")

View File

@@ -1,7 +1,4 @@
# eliteBonusGunshipProjectileDamage2
#
# Used by:
# Ship: Jaguar
# Not used by any item
type = "passive"

View File

@@ -1,7 +1,4 @@
# eliteBonusGunshipProjectileOptimal1
#
# Used by:
# Ship: Jaguar
# Not used by any item
type = "passive"

View File

@@ -0,0 +1,10 @@
# eliteBonusGunshipThermalMissileDamage1
#
# Used by:
# Ship: Jaguar
type = "passive"
def handler(fit, src, context):
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Missile Launcher Operation"), "thermalDamage",
src.getModifiedItemAttr("eliteBonusGunship1"), skill="Assault Frigates")

View File

@@ -0,0 +1,10 @@
# eliteCovertOpsBonusArmorRepAmount4
#
# Used by:
# Ship: Virtuoso
type = "passive"
def handler(fit, src, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Repair Systems"), "armorDamageAmount",
src.getModifiedItemAttr("eliteBonusCovertOps4"), skill="Covert Ops")

View File

@@ -0,0 +1,10 @@
# eliteReconBonusArmorRepAmount3
#
# Used by:
# Ship: Victor
type = "passive"
def handler(fit, src, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Repair Systems"), "armorDamageAmount",
src.getModifiedItemAttr("eliteBonusReconShip3"), skill="Recon Ships")

View File

@@ -0,0 +1,10 @@
# eliteReconBonusMHTDamage1
#
# Used by:
# Ship: Victor
type = "passive"
def handler(fit, src, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Medium Hybrid Turret"), "damageMultiplier",
src.getModifiedItemAttr("eliteBonusReconShip1"), skill="Recon Ships")

View File

@@ -4,6 +4,7 @@
# Ship: Huginn
# Ship: Moracha
# Ship: Rapier
# Ship: Victor
type = "passive"

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