Compare commits

...

747 Commits

Author SHA1 Message Date
blitzmann
ae55a2c1d2 Fix Nestor RR falloff effect 2015-12-08 12:21:21 -05:00
blitzmann
43ae593568 Bump to Stable 2015-12-07 20:12:19 -05:00
blitzmann
81963a6a7d Update effect files 2015-12-07 20:10:44 -05:00
blitzmann
fbf67c134b Merge remote-tracking branch 'origin/singularity' 2015-12-07 19:39:45 -05:00
blitzmann
a0cfe05eb5 Update to 988883, fix market conversion and add the converted modules, and improve on rename/conversion helper script 2015-12-07 19:38:54 -05:00
blitzmann
ba6e8d7ad1 Add renamed items 2015-12-06 14:28:35 -05:00
blitzmann
cbd2ed603f Possible fix for character editor crash 2015-12-06 11:16:54 -05:00
blitzmann
a2f1623b00 Fix icon script (no longer use icon prefix) and update icons 2015-12-06 10:22:25 -05:00
blitzmann
87ebcf0818 Update renders 2015-12-06 01:42:12 -05:00
blitzmann
f329c9956e Fix for icon conversion 2015-12-06 01:30:21 -05:00
blitzmann
2ac62ece06 Remove erroneous command causing a break in ship booster menu 2015-12-05 22:53:51 -05:00
blitzmann
f9db5eb201 Update to 988638 2015-12-05 22:35:03 -05:00
blitzmann
0a10f2d72a If running under OSX and wx3, override wx.ID_COPY and wx.ID_PASTE. See GH Issue #456 2015-12-04 01:06:35 -05:00
blitzmann
4325ccab8a Different fix for #397 and fix #458 2015-12-03 22:04:59 -05:00
blitzmann
04c6fad531 Change user agent of CREST calls 2015-12-03 20:50:01 -05:00
blitzmann
ca92285ff3 Fix some Weapon Disruption effects 2015-12-03 20:40:23 -05:00
blitzmann
96eee3a173 Fix Nos/Neut effects 2015-12-03 20:21:57 -05:00
blitzmann
a74c3c9b3d Fix #461 2015-12-02 20:38:45 -05:00
blitzmann
b4373cb0c5 Fix #451 2015-11-29 17:56:39 -05:00
blitzmann
9029c04ce6 Merge branch 'master' into singularity 2015-11-27 22:45:28 -05:00
blitzmann
c7c0c49218 Fix #434 2015-11-27 20:12:02 -05:00
blitzmann
191dd1c71b Add new mining frigate effects 2015-11-27 16:15:16 -05:00
blitzmann
3b64373393 Add more missing effects 2015-11-27 15:58:53 -05:00
blitzmann
0f6c67e852 Add missing effect for Oneiros 2015-11-27 15:03:41 -05:00
blitzmann
209297769f Missed an effect 2015-11-27 01:20:08 -05:00
blitzmann
2d4e3a6ddf Rename Logi skill to Logistic Cruiser 2015-11-27 01:18:32 -05:00
blitzmann
350f4c9f89 Add new effects. This commit uses a new helper script that automatically writes the effect file for the more straightforward effects. 2015-11-27 01:14:59 -05:00
blitzmann
9c9a6b69fe Revert "Add new nos/neut effect files, and change module/drone files to account for new attributes. This does not add the database"
This reverts commit 7dbe6dbe2d.
2015-11-27 00:07:24 -05:00
blitzmann
2b9d85a4bc Update setup-osx.py 2015-11-26 19:10:06 -05:00
blitzmann
f053e45671 Create setup-osx.py 2015-11-26 19:09:23 -05:00
blitzmann
4d701f561e fix booster menu causing crashes (#424) 2015-11-26 18:56:20 -05:00
blitzmann
3cb6d03487 Fix issue with OSX passing an unknown argument 2015-11-25 19:23:59 -05:00
blitzmann
7dbe6dbe2d Add new nos/neut effect files, and change module/drone files to account for new attributes. This does not add the database 2015-11-22 23:03:46 -05:00
blitzmann
81f122467a Fix #432 2015-11-20 01:29:46 -05:00
blitzmann
20759d205c Merge pull request #429 from Neugeniko/master
Added detection of Unicode BOM (Byte Order Mark) ...
2015-11-15 17:27:51 -05:00
blitzmann
b37aea40a7 fix exception when setting a unicode fit as booster (should hopefully fix all timer-related unicode errors) 2015-11-15 17:18:44 -05:00
blitzmann
f95e864119 Fix mindlink effects 2015-11-15 17:18:33 -05:00
blitzmann
7a9de8cd99 Bump dev version 2015-11-15 17:18:25 -05:00
Neugeniko
dde8b1f802 Added detection of Unicode BOM (Byte Order Mark) to determine the encoding used in imported files. 2015-11-14 01:00:32 +11:00
blitzmann
89b756d760 Bump release 2015-11-08 20:23:12 -05:00
blitzmann
3b1edd3283 Add error handling to CREST functions when no connection can be made. 2015-11-08 20:07:30 -05:00
blitzmann
5369b17ebf Update 977931 2015-11-08 19:55:34 -05:00
blitzmann
2fadaa890b fix save character as on os x 2015-11-08 13:52:53 -05:00
blitzmann
31bdb75c51 Added confirmation dialog when deleting character 2015-11-08 12:49:00 -05:00
blitzmann
0124f63d9a Fix amount change dialog for os x 2015-11-08 12:44:32 -05:00
blitzmann
95dba166eb Remove some debugging prints 2015-11-08 12:37:31 -05:00
blitzmann
83adadd71f Convert pubsub to wx events 2015-11-08 12:33:56 -05:00
blitzmann
4baf65c0c7 Merge pull request #414 from andrewd18/master
Add "requests" to README.md
2015-11-07 10:16:44 -05:00
Andrew Dorney
72cdd3e104 Add "requests" to README.md
CREST support requires the requests module which may not be included by default in all users' distributions.
2015-11-07 06:57:34 -06:00
blitzmann
febc2eee09 Add some conditionals to disable Attribute Editor for wxPython 2.8 2015-11-06 20:23:09 -05:00
blitzmann
b302a0a6e5 Weak ciphers aren't needed to CREST it seems (probably was at one point) 2015-11-06 20:06:08 -05:00
blitzmann
1f6a14ee36 Fallback to wx2.8 if 3.0 is not found 2015-11-06 16:04:20 -05:00
blitzmann
99a15af26e Merge pull request #408 from fj/patch-1
Fix typo in README.md
2015-11-06 14:40:43 -05:00
John Feminella
dff7a4d6ac Fix typo in README.md
"liscense" ⇒ "license"
2015-11-06 11:32:28 -05:00
blitzmann
3c8e6a61f2 Fix #406 2015-11-05 20:30:11 -05:00
blitzmann
fb997ab16d bump stable 1.16.1 2015-11-03 22:44:52 -05:00
blitzmann
8fe5f43875 fix some stuff 2015-11-03 22:44:01 -05:00
blitzmann
c8cfee3511 More mac fixes 2015-11-03 22:12:35 -05:00
blitzmann
bf0b89f3b5 Old mac client shouldn't even know about CREST / override. Disable all instances of them for this build. 2015-11-03 21:25:52 -05:00
blitzmann
1d295c04e3 Fix for missing attributes 2015-11-03 20:43:49 -05:00
blitzmann
11ebde87c9 Change attr override window from ctrl+a to ctrl+b 2015-11-03 19:38:03 -05:00
blitzmann
88c4de9820 reintroduce mac-wx3. Split platform build are likely needed right now 2015-11-03 19:28:08 -05:00
blitzmann
09e0a0576c MainFrame pointer was accidentally deleted from characterEditor.py, causing issues. 2015-11-03 19:21:45 -05:00
blitzmann
fc84c5dc94 Whoops 2015-11-03 13:24:49 -05:00
blitzmann
687ebbc41b Bump Stable 2015-11-03 06:21:29 -05:00
blitzmann
0abe953a70 Update dist script to replace mac skel 2015-11-02 21:34:55 -05:00
blitzmann
2a8f3e4855 Merge branch 'singularity' 2015-11-02 21:28:26 -05:00
blitzmann
8cd36f3cbf Add item renames 2015-11-02 21:06:54 -05:00
blitzmann
5577e1976b Update to SISI w/ effects 2015-11-02 20:55:23 -05:00
blitzmann
4b27becb5f Merge branch 'overrides' into singularity
Conflicts:
	eos/db/__init__.py
	eos/db/saveddata/__init__.py
	eos/db/saveddata/queries.py
	gui/mainFrame.py
	gui/mainMenuBar.py
2015-11-02 19:01:12 -05:00
blitzmann
3c055b78d3 Fix clearing of all overrides 2015-11-02 18:55:21 -05:00
blitzmann
eb5ce91cb2 Fix gitignore 2015-11-02 18:47:06 -05:00
blitzmann
ef36dc5ba3 Import/export/clear overrides, add missing files due to bad gitignore entry 2015-11-02 18:45:56 -05:00
blitzmann
d9c710c5a1 Minor improvements 2015-11-01 21:36:04 -05:00
blitzmann
c436e0e669 Create a proper menu item toggle for overrides 2015-11-01 21:19:49 -05:00
blitzmann
e80917e3d1 Things are saved now via GUI 2015-11-01 20:52:22 -05:00
blitzmann
0d0ec42daf Initial GUI commit. Still need to actually handle the attribute change 2015-11-01 19:49:22 -05:00
blitzmann
0e4cca6138 Load overrides from database 2015-11-01 15:00:09 -05:00
blitzmann
b701acb275 Overrides work properly now. Currently toggled on/off by opening character editor, this will be taken over by a menu option 2015-11-01 13:02:29 -05:00
blitzmann
4eb61051c6 Add overrides to the modifiedAttributeDict. Still need to figure out how to switch between the original and the override 2015-11-01 12:04:02 -05:00
blitzmann
56aba37758 Fix PoC so that it actually works, and add a working test case for Web II (changing speedfactor to -80%) 2015-11-01 09:43:34 -05:00
blitzmann
f432b08149 Proof of concept. Need to save overrides in user database and create GUI for it. May be difficult to collect and apply considering the Item container is attached to the eve db and not the user. 2015-10-31 16:53:20 -04:00
blitzmann
3e0b2fd09c Add debug info 2015-10-31 16:52:10 -04:00
blitzmann
c7b8d94e4f Merge branch 'crest_fitting' into singularity 2015-10-31 15:02:24 -04:00
blitzmann
31a9b03436 Merge pull request #390 from OISumeko/weaponStagger
Added option for disabling capacitor simulation staggering for certain modules
2015-10-31 14:55:22 -04:00
blitzmann
f33f558006 Fix prep_data.py 2015-10-31 14:27:43 -04:00
blitzmann
bb4fe63a7c Add CREST preference icon (basic EVE icon), and fix menus when changing modes and whatnot 2015-10-31 14:10:41 -04:00
blitzmann
ccb9e085b2 Setting to change server for CREST, and some other improvements. 2015-10-31 13:20:13 -04:00
Cameron Grout
702d249bad Updated turret detection as advised 2015-10-31 16:15:35 +13:00
Cameron Grout
cc2835a341 Turrets of the same type now do not stagger
Playing with the cap simulator, I noticed that turrets of the same type
stack and have staggering applied when running through the cap
simulator. This is not realistic behaviour as most (all?) pilots will
have grouped their turrets in-game, meaning they will all activate
simultaneously rather than activating individually, offset from
each other.

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

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

Conflicts:
	eos/db/saveddata/queries.py
2015-09-13 16:53:42 -04:00
blitzmann
1584586fd2 Try a different approach to temp skill levels 2015-09-13 16:51:36 -04:00
blitzmann
1402ceec63 Fix API stuff. This should theoretically work, but it's untested. 2015-09-12 13:15:59 -04:00
blitzmann
4663270067 Since we now have a list of skills by default on our character, remove the iterSkills iterator which helped fetch skills that were not previously loaded 2015-09-12 11:06:21 -04:00
blitzmann
0b9cdaa944 Change the way skills are loaded. We now load all skills when character is created, instead of just creating character and loading skills on demand. This fixes a bug in which new characters were not saving their skills to the database. 2015-09-12 10:59:44 -04:00
blitzmann
89c011d37e Minor modifications. 2015-09-12 10:30:51 -04:00
blitzmann
c72f049ccd Fix character rename, delete, and copy. 2015-09-09 23:12:59 -04:00
blitzmann
ca34217f3b Added character saving.
Deleting characters is broken for now due to using wrong session, but I believe creating character works. Further tests needed
2015-09-09 20:33:15 -04:00
blitzmann
3521b3887d Separate characters from Fit relationship and create new character session. At this point, changes to characters do not persist. Efforts must still be made to focus on creating a character save function as well as ensure characters that are dirty are loaded correctly for fresh fits. 2015-09-09 19:08:38 -04:00
blitzmann
492776c5a8 Fix Scram effect to turn off MWDs. Fixes #70 2015-09-06 11:06:52 -04:00
blitzmann
51a8076d30 Comment cleanup 2015-09-01 23:29:47 -04:00
blitzmann
decf7ff028 Fix #351 2015-09-01 23:23:52 -04:00
DarkPhoenix
31b1c94c0f Add AT13 prize ships 2015-09-01 01:26:30 +03:00
DarkPhoenix
a9fc457510 Bump dev version 2015-09-01 00:09:10 +03:00
blitzmann
7c3c8182a7 Fix initial database creation 2015-08-28 22:03:54 -04:00
blitzmann
b162927f79 Merge branch 'master' into wx3 2015-08-27 22:05:38 -04:00
blitzmann
6dbed1403a Bump stable 2015-08-27 21:50:13 -04:00
blitzmann
aa5eb7ac92 Update DB, force Imp and Fiend as not published again (will publish these when they are live) 2015-08-27 21:49:06 -04:00
blitzmann
e0fbcc91f1 Update effect headers 2015-08-25 17:47:15 -04:00
blitzmann
b2dce223b0 Add AT13 prizes 2015-08-25 17:42:34 -04:00
blitzmann
4b7b22025c Add new drifter incursion effect 2015-08-25 17:39:57 -04:00
blitzmann
8e37dab37e Disallow assistance with active Estonis link 2015-08-25 17:37:17 -04:00
blitzmann
6e95f69565 Support speedLimit introduced with Entosis Link 2015-08-25 17:26:25 -04:00
blitzmann
31331b1e34 Update to 957210 - Galatea 1.0 2015-08-25 17:25:12 -04:00
blitzmann
05b3777ad2 Add build directory to ignore file. 2015-08-25 16:06:38 -04:00
blitzmann
cda8dd4c8b Windows skel has an issue with this, so if there is an issue, use default path to cache file. 2015-08-21 19:04:42 -04:00
blitzmann
e7542fec44 move debug setting, remove debug print 2015-08-21 18:23:46 -04:00
blitzmann
e7fcdd86ac Well, adding this caused severe issues. >_> 2015-08-21 18:02:06 -04:00
blitzmann
d909e8adc4 Fix config file, clean up pyfa.py 2015-08-21 16:48:07 -04:00
blitzmann
def20311a8 New migration import mechanics, borrowed from market conversion imports, because we can't os.listdir from a zipfile 2015-08-21 15:10:00 -04:00
blitzmann
503907e2d8 Fix setup so that we can execute it from dist script and not have it complain 2015-08-21 15:08:51 -04:00
blitzmann
88dc1edfb4 Work on dist script 2015-08-21 15:08:23 -04:00
blitzmann
cbedf03026 Another fix to prep_data. I'll get this right one day 2015-08-21 12:08:57 -04:00
blitzmann
a69589dd23 Merge pull request #346 from Will-W/master
Context menu to swap modules for different variation
2015-08-18 13:08:15 -04:00
Will Wykeham
2904ab6afa Non-windows platform fix for variations menu 2015-08-18 15:59:02 +01:00
Will Wykeham
c763595cc4 Remove debug print statement 2015-08-17 15:41:58 +01:00
Will Wykeham
8fe97180ed Sort higher metalevel items properly in variations menu 2015-08-16 21:56:39 +01:00
Will Wykeham
6a4b2ffe69 Make variations menu handle multiple selections
Ensure the variations menu only shows when you've got
a matching set of items selected.
2015-08-16 21:45:20 +01:00
Will Wykeham
7f100353e2 Make variations menu actually swap out module
Functional, but not handling multiple selections well
2015-08-16 18:30:27 +01:00
Will Wykeham
97ac0804c5 Add Submenu of variations of module type.
Non functional so far.
2015-08-15 19:35:31 +01:00
blitzmann
48f96a7a32 Merge branch 'master' into wx3
Conflicts:
	config.py
	staticdata/icons/icon01_08.png
	staticdata/icons/icon02_11.png
	staticdata/icons/icon105_46.png
	staticdata/icons/icon105_47.png
	staticdata/icons/icon105_48.png
	staticdata/icons/icon105_49.png
	staticdata/icons/icon108_5.png
	staticdata/icons/icon113_64_1.png
	staticdata/icons/icon113_64_2.png
	staticdata/icons/icon113_64_3.png
	staticdata/icons/icon34_16.png
	staticdata/icons/iconMarketIcon_16px_Amarr.png
	staticdata/icons/iconMarketIcon_16px_Caldari.png
	staticdata/icons/iconMarketIcon_16px_Gallente.png
	staticdata/icons/iconMarketIcon_16px_Minmatar.png
2015-08-15 10:50:58 -04:00
DarkPhoenix
598512a904 Fix stacking penalties on active tank effects 2015-08-13 02:21:24 +03:00
DarkPhoenix
121a81ce70 Remove few debugging prints 2015-08-11 15:59:38 +03:00
blitzmann
a2e031cf27 Fix prep_data script so that it actually works 2015-08-09 23:20:00 -04:00
DarkPhoenix
f18ba6160a Do 2 blank lines between cargo contents and the rest of the fit, and when exported with the implants - do cargo items after the implants 2015-08-08 13:36:16 +03:00
blitzmann
c2ca5dffe8 Fix incorrect bitmap rendering of OSX-wx3. MacSetTheme was removed, but it's still required for 2.8 otherwise we get an off-color background 2015-08-04 23:48:31 -04:00
blitzmann
ab7bbcb6ef Remove matplotlib's font cache. Fixes #234 2015-08-04 22:18:28 -04:00
blitzmann
e5e7311748 Revert "Fix preferenceDialog list view width" and actually fix it. OS X untested
This reverts commit 9ba3ca3f5f.
2015-07-26 19:34:42 -04:00
blitzmann
9ba3ca3f5f Fix preferenceDialog list view width 2015-07-26 19:19:53 -04:00
blitzmann
cc59612fa4 Debug logging when flag is set 2015-07-23 16:58:55 -04:00
Ryan Holmes
01db1efdf7 Merge pull request #336 from blitzmann/regSkills
Register skills when applying ship bonuses
2015-07-23 15:58:07 -04:00
blitzmann
e74e2615ad Merge remote-tracking branch 'origin/projections' 2015-07-23 15:46:32 -04:00
blitzmann
2f246d0897 Add context menu to affected by list 2015-07-23 15:32:27 -04:00
DarkPhoenix
505b0ce38f Clear info dicts in-place instead of replacing them with new ones
Sometimes it can cause fuckups, so who knows how PIL works with them...
2015-07-23 20:34:02 +03:00
DarkPhoenix
8c19a956e0 Strip ICC color profile data
Fixes #337
2015-07-23 20:32:40 +03:00
blitzmann
9de3600d7f Fix self-boosting 2015-07-23 01:38:51 -04:00
blitzmann
5a4f526b2b Fix fit copying 2015-07-22 14:27:44 -04:00
blitzmann
cd0b0eada0 Fix graphing 2015-07-22 13:12:57 -04:00
blitzmann
17733d5951 Added missing tactical mode calculations... whoops 2015-07-22 13:02:08 -04:00
blitzmann
0a1f324053 Fix Advanced Spaceship Command skill and resists for Occator 2015-07-21 12:27:46 -04:00
blitzmann
e12b3f3054 Merge tag 'v1.13.2' into wx3
Conflicts:
	config.py
	A lot of icons
2015-07-20 13:21:00 -04:00
blitzmann
b32f76cfde Show affecting skills for charges as well 2015-07-19 16:39:07 -04:00
blitzmann
182104a010 Fix #109 2015-07-19 16:20:42 -04:00
blitzmann
90c883da67 Fix some syntax errors. 2015-07-19 15:51:03 -04:00
blitzmann
ac08b1b264 Add check for current skill level 2015-07-19 15:16:29 -04:00
blitzmann
f17d015ebe Fix having multiple skills in skill list (happens when multiple attributes are modified) 2015-07-19 15:02:50 -04:00
blitzmann
d496637614 Add ship skill bonuses to modified modules. Modify effect files for new skill parameter. Enable affecting skill menu. 2015-07-19 14:19:24 -04:00
blitzmann
4596c526a2 Fix #335 - properly represent charge modifiers 2015-07-18 23:39:16 -04:00
blitzmann
9941b6c74b Make default view module again 2015-07-18 15:23:10 -04:00
blitzmann
b06ce24d4a Fix attribute view items (two of the same item would merge into one, even if they had different modifiers. now simply list them individually) 2015-07-18 15:20:15 -04:00
blitzmann
2f8c201ab3 Add attribute view 2015-07-18 14:45:26 -04:00
blitzmann
d184820728 Fix toggle attribute names. Previous way assumed no other trees apart from first child and siblings. Not true now with projected fit trees. Instead of attempting to walk the tree, we simply store the items in a list that we later iterate over. Much easier 2015-07-17 18:28:31 -04:00
blitzmann
40aeb1ed4a Move active fir to init, fixes bug when refreshing with another active fit 2015-07-17 16:33:07 -04:00
blitzmann
71b258a8f5 Merge fit attributes with ship 2015-07-17 16:32:42 -04:00
blitzmann
cd7579a4bf Fix #332 - offline rigs calculated in calibration stats 2015-07-17 00:01:31 -04:00
blitzmann
d6199a58c2 Separate projected fits from list of affectors. Also, show when affected module is projected. Still need to clean up affector tree stuff 2015-07-16 23:59:37 -04:00
blitzmann
3ad5aaac89 Fix #331 - gang boosts not applied to self projection 2015-07-15 16:52:09 -04:00
blitzmann
3bed268d81 Fix use case for downgrading and adding a row with NULL 2015-07-14 19:13:56 -04:00
blitzmann
9a1b0f07c0 Added documentation on why projections don't respect the __calculated flag which gang boosts do 2015-07-14 16:32:10 -04:00
blitzmann
f591ecba10 Fix use case where gang boosts were not being applied when projections were added/removed. 2015-07-14 16:15:52 -04:00
blitzmann
c571fdc5e6 Fit fit alterations with self projections 2015-07-13 19:29:23 -04:00
DarkPhoenix
6f944fc7db Stacking penalize missile flight time rigs 2015-07-12 02:12:59 +03:00
blitzmann
63fce4be17 Handle self projections by creating a copy of the fit. Due to the way effects are calculated, we would have double effects implemented if not for the copy 2015-07-11 16:28:09 -04:00
blitzmann
86ee5292d8 Fix fit copying and deleting fits not being reflected in other fits. 2015-07-11 12:43:47 -04:00
blitzmann
0060f58e3d Support evemon character imports. 2015-07-11 10:17:02 -04:00
blitzmann
23b458534f Remove unneeded collection class for projected fits 2015-07-10 23:22:58 -04:00
blitzmann
2256efacb0 Do migration stuff for projected fits 2015-07-10 16:40:00 -04:00
blitzmann
28a5318e3b Merge branch 'master' into toggleProjectionFit
Conflicts:
	config.py
2015-07-10 16:09:00 -04:00
blitzmann
609ee13cd6 Redirect stderr and stdout to logger when we are frozen. Need to test this. 2015-07-10 15:58:45 -04:00
blitzmann
4216904736 Remove function to remove projected fits correctly. This is now handled by proper DB relationships 2015-07-10 15:46:42 -04:00
blitzmann
496e9b56b5 Handle use case of invalid fit's mucking things up 2015-07-10 15:46:15 -04:00
blitzmann
b8f73a7c94 bump dev 2015-07-10 12:58:03 -04:00
blitzmann
b4604f8207 Bump Stable... maybe it will be this time 2015-07-10 12:17:14 -04:00
blitzmann
68dddf2810 Fix for init projected fit. Took a long time to figure out what was happening. 2015-07-10 11:58:15 -04:00
blitzmann
4c17f38b1a Fix for #324 - do not reset itemID automatically upon removal due to way modules are swapped. 2015-07-09 18:36:11 -04:00
blitzmann
221a3fde14 Being extra cautious 2015-07-09 18:18:36 -04:00
blitzmann
c17e03d8d0 Fixes critical design issue when it comes to projected fits. Disabled some of the more advanced functionality (projection amount and active) to cope to development. Crash still happens occasionally when adding projected fit for unknown reasons - not 100% reproducable yet 2015-07-09 17:53:41 -04:00
blitzmann
af9f64db5f Move the chain into the runtime loop, otherwise projections won't work for some odd reason. 2015-07-09 14:48:15 -04:00
blitzmann
1f82465a65 Return None for price column on ship modes, fixes #322 2015-07-09 12:13:13 -04:00
blitzmann
d885bd4636 Bump dev and Fix #321 - oversight in tactical mode selection 2015-07-09 11:48:11 -04:00
blitzmann
c17bce55bb Lots of stuff
- Added logging and replaced Timer class with more useful one
- Move projected fit loop out of runtimes
- Eliminate recursions from Fit.clear()
- Clean up overall fit calc logic
2015-07-09 10:43:39 -04:00
blitzmann
4137a7cda9 Bump stable 2015-07-08 11:20:18 -04:00
blitzmann
c92911b79a Work around for lack of flag_modified() support 2015-07-08 10:54:26 -04:00
DarkPhoenix
adc9fb6d00 Don't call function multiple times after first unconditional call 2015-07-08 17:45:25 +03:00
Ryan Holmes
5baf70694a Merge pull request #318 from poettler-ric/fix-logging
Fix logging
2015-07-08 10:14:46 -04:00
Richard Poettler
f08dc97576 logging crashes if the directory doesn't exist 2015-07-08 10:47:25 +02:00
Richard Poettler
35094ae1ce moved dublicate code into one method 2015-07-08 10:45:37 +02:00
DarkPhoenix
5ac31920ee Fix #317
Crop images to square form before making thumbnail, not square images cause issues on Windows
2015-07-08 11:39:01 +03:00
DarkPhoenix
e63c3541c4 Bump for next development release 2015-07-08 00:09:34 +03:00
DarkPhoenix
4976516d4d Bump for a stable version 2015-07-07 23:36:03 +03:00
Ryan Holmes
e042a21d32 Merge pull request #315 from lunedis/resistmultiplier
Showing Resist Multiplier in Tooltip
2015-07-07 14:42:50 -04:00
Kalu
8a22907940 newline in resist multiplier tooltip and explanation 2015-07-07 20:38:27 +02:00
Kalu
a97847e644 show rr factor in tooltip 2015-07-07 20:38:16 +02:00
blitzmann
23309a5da6 Remove unneeded code that created a bitmap for checkboxes 2015-07-07 13:49:40 -04:00
blitzmann
06e4a7e80f Support changing amount of projected fits 2015-07-07 13:49:39 -04:00
blitzmann
b95a10d284 Add active column. Looping the fit to apply it x amount of times doesn't seem to work. Probably because it's been flagged calculated and returns early 2015-07-07 13:49:38 -04:00
blitzmann
2bca3ddcc8 GUI support (also made regular checkboxes pretty for drones/implant/etc) 2015-07-07 13:49:37 -04:00
blitzmann
9ef182aa99 First working prototype of toggleable projected fits. Creates a new association object that stores projection-specific information. GUI hasn't been touched (need to show state), and there are a lot of variables that I need to rename. 2015-07-07 13:49:35 -04:00
blitzmann
5e56107582 Revert changes to minimum / default sizes of splitter windows 2015-07-07 13:28:02 -04:00
DarkPhoenix
972c08e7e4 Remove AT13 prizes from ship list for now 2015-07-07 16:10:29 +03:00
DarkPhoenix
091832af21 Fix bug in script and add missing icons 2015-07-07 16:09:13 +03:00
DarkPhoenix
16d1891e16 Add script which updates renders and update them using aegis release export 2015-07-07 16:05:44 +03:00
DarkPhoenix
40ee68e2cf Update module/attribute icons 2015-07-07 15:11:55 +03:00
DarkPhoenix
bfe3b4a26d Add new entosis offline mass penalty 2015-07-07 15:10:37 +03:00
DarkPhoenix
9aa1332b15 Update database to 912410 2015-07-07 15:07:39 +03:00
DarkPhoenix
0521d242eb Make sure bitmap loader searches for proper file (w/o EVE embedfs-specific path and extension) 2015-07-06 11:31:02 +03:00
DarkPhoenix
2b3f3773e5 Merge branch 'master' into singularity 2015-07-06 01:39:50 +03:00
DarkPhoenix
4041407878 Also make sure to process icons for categories and attributes 2015-07-06 01:38:51 +03:00
blitzmann
1b5e0467fc Save browser sizes 2015-07-05 13:59:18 -04:00
DarkPhoenix
a7c346f78e Add script which is supposed to update icons 2015-07-05 20:59:15 +03:00
blitzmann
3cc51aaf89 Change logging location to ~/.pyfa and set default level to WARN 2015-07-05 13:15:26 -04:00
Ryan Holmes
a339ae1c55 Merge pull request #312 from blitzmann/dbCorruption
Fixes for database rot
2015-07-05 13:08:11 -04:00
blitzmann
3773d1c28e Improvements to fit initializations and logging 2015-07-05 12:57:04 -04:00
blitzmann
41b8db346f Fix broken drone drag 2015-07-05 01:16:53 -04:00
blitzmann
7959593c6c Improve object initialization and add support for logging the errors. 2015-07-05 00:31:52 -04:00
blitzmann
aaa60cbc14 Fix instance where some items were being re-added due to lack of return. Also, implement some basic logging. 2015-07-05 00:28:55 -04:00
DarkPhoenix
8ae5a96047 Merge branch 'master' into singularity 2015-07-04 12:45:15 +03:00
blitzmann
8c90b3132b Use lunedis's method and apply it to additions pane, cleans up code 2015-07-04 01:38:11 -04:00
blitzmann
1326e21f6b Fix IndexError when selecting module index that doesn't exist. Also, tweaked setting the selItem variable. 2015-07-04 01:27:57 -04:00
blitzmann
bfdc2161e0 Add shortcut cues as toggle in prefs 2015-07-04 00:52:44 -04:00
blitzmann
9ab79af70c Show shortcut values in market list 2015-07-04 00:44:19 -04:00
Ryan Holmes
f0de2000bf Merge pull request #313 from lunedis/quickfit
Quickly fitting modules using ALT+1-9
2015-07-04 00:34:43 -04:00
blitzmann
5991d19b3e Allow Subsystems as modules. 2015-07-04 00:32:28 -04:00
Kalu
51fed996f1 refactor quickfit shortcuts with list 2015-07-03 23:43:04 +02:00
Kalu
f6bbc6c410 Implemented using Alt+1-5 for quickly fitting modules, see issue #183 2015-07-03 23:42:54 +02:00
blitzmann
3de6b63325 Fix oversight when creating a new database 2015-07-03 14:18:11 -04:00
blitzmann
dd48815f30 Offline rigs, closes #100 2015-07-03 14:05:57 -04:00
DarkPhoenix
5608676dc8 Merge branch 'master' into singularity 2015-07-03 12:37:08 +03:00
DarkPhoenix
86ab1f7444 Ignore python pyc files and rely on index within file rather than just on amount of files 2015-07-03 12:36:17 +03:00
DarkPhoenix
8f51642f70 Merge branch 'master' into singularity 2015-07-03 12:13:53 +03:00
blitzmann
de71123a48 Merge branch 'pricing' 2015-07-03 02:38:23 -04:00
blitzmann
874cf4ef0a Use old price information if update fails. Add "(!)" to show that price is out of date 2015-07-03 02:37:52 -04:00
blitzmann
87e5929cb1 DB migration is triggered by number of upgrade files found, rather than number in config.py. This allows us to remove the db version variable in config.py and not worry about it. 2015-07-02 19:35:53 -04:00
blitzmann
84b1e0ac41 Migrate boosters table to new schema that drops the UNIQUE constraint (causes issues and is unneeded) 2015-07-02 19:34:02 -04:00
blitzmann
539360d5f6 Remove old debug print 2015-07-02 15:04:07 -04:00
blitzmann
ca08f8d8da Handle fits with invalid ships by removing and deleting them when loaded. 2015-07-02 15:03:56 -04:00
blitzmann
e1ce672569 Move flag_modified to HandledList.remove() so that it takes care of all our use cases. Give fits an itemID like everything else so that projected fits can be removed correctly by this logic. No reason for them to be special snowflakes. 2015-07-02 11:22:26 -04:00
blitzmann
717080b58c Handle invalid implants and boosters. Uses a different method to ensure implant and booster slot is not duplicated. Still need to modify existing databases to remove Booster table constraint. Reverts a previous commit: "Gracefully handle invalid boosters in database (both itemIDs that don't exist as well as non-booster items). Implants need a little more work" (aaa5a6ae18) 2015-07-02 00:48:32 -04:00
blitzmann
51696c509f Merged Cargo and Drone collection class (essentially the same). Utilized SQLAlchemy's flag_modified() to force SA to update DB (in this case, remove the entry) 2015-07-01 20:54:40 -04:00
blitzmann
4a5ae9f6f1 Handle invalid cargo. Noticed that cargo nor drones are removed from the database with these methods. Not sure why - projected drones and modules are correctly removed in similar ways 2015-07-01 15:21:27 -04:00
blitzmann
fa9f324f78 Handle invalid drones 2015-07-01 14:55:05 -04:00
blitzmann
bcc77f11cd Handle invalid projected drones 2015-07-01 14:50:08 -04:00
blitzmann
f737f292e3 Refine appending projected modules. Ensure that module can actually be projected, and also ensure that we only have 1 system effect running at a time. Invalid modules are removed at earliest opportunity as we are later accessing attributes that may not be there for corrupted data. 2015-07-01 13:34:19 -04:00
blitzmann
1c18a5207c System Effects are wrapped in Module class, even though they are not modules. Account for this. 2015-07-01 13:32:31 -04:00
blitzmann
fa2b1e3821 Handle invalid modules. This streamlines the module init code from both program and database sources. When loading from the database, we ensure that the module item is actually an item. If not, we set a flag to delete it (which is picked up by the collection class)(can't use exceptions as there's no place to catch them) 2015-07-01 02:20:56 -04:00
DarkPhoenix
6184753822 Merge branch 'master' into singularity 2015-06-30 21:16:15 +03:00
DarkPhoenix
91a9c860ea Merge branch 'singularity' of github.com:DarkFenX/Pyfa into singularity 2015-06-30 21:15:10 +03:00
DarkPhoenix
0730ac369f Update data to 910808 2015-06-30 21:14:22 +03:00
blitzmann
aaa5a6ae18 Gracefully handle invalid boosters in database (both itemIDs that don't exist as well as non-booster items). Implants need a little more work 2015-06-30 13:51:49 -04:00
blitzmann
5372f31be8 Revert "Revert "Merge branch 'master' into wx3"". So many reverts.
This reverts commit cca7f1112a.
2015-06-27 21:53:59 -04:00
blitzmann
6d01877d78 Merge branch 'master' into wx3
Conflicts:
	pyfa.py
2015-06-27 19:33:12 -04:00
blitzmann
646f3afd27 Fixed oversights 2015-06-27 19:32:21 -04:00
blitzmann
030f22b66f Merge branch 'debugGtk' into wx3 2015-06-27 18:25:31 -04:00
blitzmann
98815f2b85 Fix #307 by moving menu code to spawn event 2015-06-27 18:18:43 -04:00
blitzmann
a4fe3fe142 Fix crash in character editor 2015-06-27 15:56:34 -04:00
blitzmann
5b0857e169 Ensure that resources gauge is not drawn with a width of 0 to make GTK happy 2015-06-27 15:35:22 -04:00
blitzmann
975a414c5f Ensure that SetSize() does not take values less than -1 2015-06-27 14:39:35 -04:00
Ryan Holmes
95eb5a6117 Update README.md
Added note for Linux users and wxPython 2.8
2015-06-25 21:45:06 -04:00
blitzmann
8a7e69b902 Fix progress dialog stuff. Closes #281 2015-06-25 16:43:39 -04:00
blitzmann
dc035469ed Fix background color for certain panels under Linux 2015-06-25 16:09:56 -04:00
DarkPhoenix
ec4a00cdfc Merge branch 'master' into singularity 2015-06-25 12:12:33 +03:00
blitzmann
21937c02ff Made it look nicer 2015-06-24 19:53:55 -04:00
DarkPhoenix
edfd446e46 Update to 908326 2015-06-25 00:33:37 +03:00
blitzmann
7ec78b941e Add help text for why api is disabled, per #269. I may or may not make it look nicer later 2015-06-24 15:10:37 -04:00
blitzmann
95bf1039c0 Fix #291 - Triage not properly implemented on projected fit 2015-06-24 14:36:31 -04:00
blitzmann
e6def6f5f9 Fix #299 - fit not recalculated after module states change upon module append 2015-06-24 00:40:13 -04:00
DarkPhoenix
de0b03630a Bump version 2015-06-23 00:17:41 +03:00
DarkPhoenix
90a2a79d5b Add hecate effects, update database to 906843 2015-06-23 00:00:09 +03:00
DarkPhoenix
21efd6d06a CCP added faction 200mm plates back to the game 2015-06-22 22:22:35 +03:00
DarkPhoenix
ea288a6133 Update conversion scripts to use new scheme 2015-06-21 16:50:07 +03:00
blitzmann
da16f6cee7 Fix closing of progress dialogs 2015-06-20 15:00:02 -04:00
blitzmann
f285395e0f Fix black bitmap when dragging fit, closes #303 2015-06-17 19:43:48 -04:00
blitzmann
b54e3aeaf9 See #303 2015-06-16 15:28:23 -04:00
blitzmann
23baaa7dba Merge branch 'master' of https://github.com/DarkFenX/Pyfa 2015-06-16 13:14:28 -04:00
blitzmann
8008c986d3 Fix #302 - Projected fit applying Tactical Destroyer mode effects on projectee 2015-06-16 13:14:16 -04:00
DarkPhoenix
b9efc919ea Add missing RHML rof effect 2015-06-16 16:53:21 +03:00
blitzmann
6cc6fd9468 Instead of icon, use unicode refresh. Minor issues with image and GUI flickering 2015-06-06 22:42:42 -05:00
blitzmann
53c9169043 Simplified price pane. Will show pricing update label and will only clear it when prices are done. Removed all timer code as it makes it overly complicated and I suspect half of it didn't work as intended anyway 2015-06-05 15:39:10 -05:00
blitzmann
eb2f4991ee Fix search in wx3 (and remove some needless crap... seriously, why was all that there?) 2015-06-04 22:48:46 -05:00
blitzmann
16017a3c31 Remove middle click to open new page, fixing wx3 deprecation warning (didn't seem to work anyway) 2015-06-04 21:01:49 -05:00
blitzmann
98d9adef8a Fix for libpng hating our color profiles 2015-06-04 17:27:11 -05:00
blitzmann
9e96aac04d Fix situation in which module prices are fetched individually (which the price column). Instead, have them wait in a queue that is processed when the entire fit is called and calculated (with the price pane). Also adds a little refresh icon to know that prices are updating and it's not just blank (might change) 2015-06-04 14:10:27 -05:00
DarkPhoenix
3395f8ebe6 Bump for next development release 2015-06-02 23:43:16 +03:00
DarkPhoenix
1d45102100 Bump for a stable release 2015-06-02 23:32:16 +03:00
DarkPhoenix
1694d74afa Add Carnyx tiericide module upgrade/import paths 2015-06-02 23:27:08 +03:00
DarkPhoenix
9c9f1dcefa Get faction 200mm plates back 2015-06-02 19:37:32 +03:00
DarkPhoenix
a4ca2e90f9 Add effect which affects entosis duration on cap ships 2015-06-02 16:48:58 +03:00
DarkPhoenix
dbfcfd9acf Change expansion data in config and update database to 893722 2015-06-02 16:38:38 +03:00
DarkPhoenix
8c30ee3fd3 Merge branch 'master' into singularity 2015-05-28 15:21:28 +03:00
Anton Vorobyov
ca17d17232 Merge pull request #292 from wolfwood/master
fix issue copying fits with sqlalchemy 1.0
2015-05-28 15:17:02 +03:00
wolfwood
b78c0a5845 fix issue copying fits with sqlalchemy 1.0 2015-05-27 10:21:16 -07:00
DarkPhoenix
ef6e25bfce Merge branch 'master' into singularity 2015-05-27 14:55:12 +03:00
DarkPhoenix
e81f7eb765 Change validator requirement for owner ID
This fixes bug related to sqlalch 1.0
2015-05-27 14:54:37 +03:00
DarkPhoenix
26122f6da7 Add latest changes from Singularity 2015-05-21 16:44:39 +03:00
blitzmann
e7264108dd Fix #287 2015-05-05 23:23:38 -04:00
blitzmann
2bcbb03c10 Fix #286 and another minor bug related to colors 2015-05-05 22:56:40 -04:00
DarkPhoenix
9cf20942f1 Change validator requirement for owner ID
This fixes bug related to sqlalch 1.0
2015-05-01 20:15:08 +03:00
DarkPhoenix
dbb98e981a Merge branch 'wx3' of github.com:DarkFenX/Pyfa into wx3 2015-05-01 19:03:04 +03:00
DarkPhoenix
3ae39b2e7c Remove unused import 2015-05-01 19:02:13 +03:00
DarkPhoenix
7b43b516c9 Add effect i should've added for mosaic release 2015-05-01 18:50:11 +03:00
DarkPhoenix
12d6a2c5de Bundle runtime libs with windows executable 2015-05-01 16:37:13 +03:00
DarkPhoenix
26bba49193 Work around bug in wxpython
Button is specified as property in wx docs, but it returns bound method instead of actually being a property
2015-05-01 16:00:26 +03:00
DarkPhoenix
4e69a2656c Add some options for Mac binary generation
Can't test it atm, but whatever
2015-05-01 15:37:09 +03:00
DarkPhoenix
68d504c79d Force writing errors/output to file in case of frozen distributive 2015-05-01 15:08:14 +03:00
DarkPhoenix
2180b1ac3b Add folder with assets used for distributives 2015-05-01 14:50:09 +03:00
DarkPhoenix
32712a8798 Fetch app version from config file 2015-05-01 14:20:01 +03:00
DarkPhoenix
73c7ad55b6 Add comment which shows how to use script 2015-05-01 14:00:31 +03:00
DarkPhoenix
a34c5ace5c Change setup file to make sure msi installer can be built 2015-05-01 13:54:40 +03:00
DarkPhoenix
fd77661f41 Tune setup file a bit more 2015-05-01 04:02:10 +03:00
DarkPhoenix
ad07cf25d8 Settle on just Tkinter in excludes 2015-05-01 03:23:57 +03:00
DarkPhoenix
4daf1b1ba3 Merge branch 'wx3' of github.com:DarkFenX/Pyfa into wx3 2015-05-01 01:28:18 +03:00
DarkPhoenix
4b189ab146 Remove obsolete readme 2015-05-01 01:27:54 +03:00
DarkPhoenix
64a69e3910 Remove tcl/tk from distributive 2015-05-01 01:27:07 +03:00
DarkPhoenix
9482404ca7 Remove setting locale
Who knows what it may cause, i'm not an wx expert, but wx3 bundled with xc_freeze keeps bitching about it...
2015-05-01 00:04:35 +03:00
DarkPhoenix
124d4fab9b Change the way we fetch conversions from package to make it compatible with frozen and packed builds 2015-04-30 23:59:56 +03:00
DarkPhoenix
722406f636 Change the way we detect root
This is needed for executable freeze to work correctly
2015-04-30 23:08:42 +03:00
DarkPhoenix
6d4957b148 Add setup.py for building binary distributives with wx3 2015-04-30 22:24:27 +03:00
DarkPhoenix
cca7f1112a Revert "Merge branch 'master' into wx3"
This reverts commit 33a0c10650, reversing
changes made to 2077655694.

Reverting merges fucks up git, but oh well - we probably better merge stuff manually rather than fucking up master with wx3 which is apparently buggy
2015-04-30 19:47:15 +03:00
DarkPhoenix
c809a614f9 Revert "Move logging initialization back to pyfa.py"
This reverts commit d18cf7b3b0.

Reverting all wx3 commits in master
2015-04-30 19:39:11 +03:00
DarkPhoenix
2c366faa66 Revert "Remove setting locale"
This reverts commit 7606bded40.

Reverting all wx3 commits on master
2015-04-30 19:38:47 +03:00
DarkPhoenix
06252d761d Revert "Change the way we detect pyfa path"
This reverts commit bb8d5d0d65.

Reverting all wx3 commits in master
2015-04-30 19:38:18 +03:00
DarkPhoenix
bb8d5d0d65 Change the way we detect pyfa path
This ensures that it works even with frozen executable
2015-04-29 00:27:42 +03:00
DarkPhoenix
7606bded40 Remove setting locale
It causes issues with wx3 on windows
2015-04-28 23:49:11 +03:00
DarkPhoenix
daaf48d02a Add effect i should've added for mosaic release 2015-04-28 21:59:54 +03:00
DarkPhoenix
d18cf7b3b0 Move logging initialization back to pyfa.py 2015-04-28 21:59:14 +03:00
DarkPhoenix
33a0c10650 Merge branch 'master' into wx3 2015-04-28 21:53:27 +03:00
DarkPhoenix
2077655694 Bump version for next development release 2015-04-28 21:43:22 +03:00
DarkPhoenix
0dc3cbb7c7 Bump version for a stable release 2015-04-28 19:50:53 +03:00
Anton Vorobyov
a3c19f6f2b Merge pull request #271 from BlckKnght/fix_stagger
Fix stagger
2015-04-28 19:34:58 +03:00
DarkPhoenix
f97b037011 Forgot to save file for previous commit 2015-04-28 19:18:56 +03:00
DarkPhoenix
dd3dd799b2 Move loggin configuration to config temporarily 2015-04-28 19:17:50 +03:00
Anton Vorobyov
ac881ac371 Merge pull request #276 from kainz/master
Support fits exported from jEveAssets
2015-04-28 18:30:20 +03:00
DarkPhoenix
d734ccbf0d Add effect for entosis link and update effect comments 2015-04-28 18:24:25 +03:00
DarkPhoenix
024e0ad4f5 Support proper migration for ishukone scorp (which is skin for regular scorp now) 2015-04-28 18:19:58 +03:00
DarkPhoenix
545d98883a Update DB to mosaic 2015-04-28 18:06:03 +03:00
DarkPhoenix
742abc3250 Remove bunch of chinese skinned ships 2015-04-28 18:05:15 +03:00
DarkPhoenix
294e213ac2 Remove support for vanity ships which were converted into base hulls in game
We do not need any DB conversion for them because we converted them into base hull during import time. Also it breaks import of old posted EFT-style fits with removed skinned ships, but i can't say we care alot about this case
2015-04-28 18:01:06 +03:00
Bryon Roche
557f32ab91 Implement support for loading utf-16 XML.
Such XML is generated by software like jEveAssets's owned ships->fitting
export tool.

Without such detection, pyfa will go and try to import those as DNA
fits, with all the ensuing hilarity, thus the DNA import debug code as
well.
2015-04-22 05:05:48 -07:00
DarkPhoenix
e5430cac84 Do not apply ES bonus to weapon locus rigs 2015-04-20 15:07:19 +03:00
blitzmann
39c14b62fd Merge branch 'master' into wx3 2015-04-17 17:48:56 -04:00
DarkPhoenix
940035fa8c Fix market groups of civilian modules 2015-04-13 15:48:35 +03:00
blitzmann
5eaaaf070b Merge branch 'master' of https://github.com/DarkFenX/Pyfa 2015-04-08 23:44:51 -04:00
blitzmann
0bc9264c28 Fix #268 2015-04-08 23:43:56 -04:00
Steven Barker
cb1de9589e fix typo, pick a better stagger amount 2015-03-31 12:09:27 -07:00
Steven Barker
370e34cff9 Make staggerred modules with ammo work 2015-03-30 21:02:56 -07:00
Anton Vorobyov
28c3fc720f Merge pull request #249 from f-andrey/master
Update gpl.txt
2015-03-27 22:03:08 +03:00
DarkPhoenix
04b3a687fc Add new yacht to LIS category and add its render 2015-03-26 15:42:32 +03:00
DarkPhoenix
629f6e60a4 Mark as development 2015-03-26 15:35:05 +03:00
blitzmann
f801d7905c Update effect file headers, mark as stable 2015-03-24 16:30:40 -04:00
blitzmann
694a2a3d9b Fix #267 2015-03-23 21:21:38 -04:00
blitzmann
222888984a Update to 871030 SISI, also fix prep_data script for changes in Phobos / reverence 2015-03-23 18:00:38 -04:00
Ryan Holmes
bb96ecb647 Merge pull request #263 from OISumeko/master
Fix for #261
2015-02-22 23:51:04 -05:00
Cameron Grout
e082077dfc Updated None || 0 check to meet requested style
Updated for pull  request #263
2015-02-23 17:02:47 +13:00
blitzmann
a31769bde3 Remove problematic pyd files upon installation 2015-02-22 21:17:20 -05:00
Cameron Grout
be7e8be85b Fix for bug #261
Missile launchers do not have a "capacitorNeed" attribute (while other
capless weapon systems do), so getModifiedItemAttr will return None
rather than 0. Added a check for this.
2015-02-22 23:52:58 +13:00
DarkPhoenix
b16d2eae15 Bump for a next development release 2015-02-18 15:48:40 +03:00
DarkPhoenix
0ef05ffaf8 Bump version 2015-02-18 15:47:43 +03:00
DarkPhoenix
9ee7671a3c Update DB to 862956 2015-02-18 13:55:23 +03:00
DarkPhoenix
ca301f8d5b Fix svipul's sensor str effect on sharpshooter mode 2015-02-15 14:27:32 +03:00
blitzmann
471261275a Commit missing database 862583 2015-02-14 21:56:10 -05:00
blitzmann
55f2f3bfe8 Merge remote-tracking branch 'blitzmann/singularity' into singularity 2015-02-14 01:33:08 -05:00
blitzmann
3ce673d8af Merge remote-tracking branch 'origin/master' into singularity 2015-02-14 01:32:44 -05:00
blitzmann
3e2053b2dd Update 862583 sans database 2015-02-14 01:27:52 -05:00
DarkPhoenix
931e48d9a0 Fix ES effect affecting local modules 2015-02-13 22:09:38 +03:00
blitzmann
6c19f446be Sort import stage results 2015-02-09 22:44:33 -05:00
Ryan Holmes
d4842c2f8e Merge pull request #260 from blitzmann/importStage
Import stage, resolves #93
2015-02-09 22:25:01 -05:00
blitzmann
dc77ee9353 Add import stage to goTo logic, and fixed a bug with search initiating a goTo to the last hx item 2015-02-09 22:05:56 -05:00
blitzmann
6d29fd6bc1 Simplified stage 3 history handling. Fixes:
* Hitting back button after creating/copying new fit breaks stage
* Importing more than 1 fit while on the search stage and hitting the back button breaks stage
2015-02-08 21:12:56 -05:00
blitzmann
cbcd5ccca5 Fixed bugs:
* Importing 1 fit would open stage3 of that ship, but add incorrect history data.
* Deleting fit from search stage caused blank stage most times, fixed this.
2015-02-08 20:29:54 -05:00
blitzmann
30d2ab23ad Initial support for import stage in shipBrowser. Few bugs, see issue #93 2015-02-08 16:14:52 -05:00
blitzmann
f4f028b843 Fix #258: broken EFT cfg import 2015-02-07 22:59:55 -05:00
blitzmann
ef62f102bc Fix #256 2015-02-07 21:15:23 -05:00
blitzmann
7b8bb79cbe Fix error when loading previous fits that no longer exist in DB 2015-02-03 15:23:31 -05:00
blitzmann
3a26790109 If in debug, publish ship mode items (makes it easy to find in market and look at stats).
Tweak effectsUsedBy.py to publish all modes in group rather than individually listing them.
2015-02-03 14:16:09 -05:00
blitzmann
c861adc5ed Sanity check to importing effect handler
Tweaks to opening effect files when in debug (support for OS X and Linux)
2015-02-03 14:07:21 -05:00
blitzmann
36a3ac70b6 Removed unneeded variable in effect file 2015-01-26 23:51:46 -05:00
blitzmann
54d1b35ce7 Fix path to point to actual gamedata - useful when importing from terminal and has no effect on pyfa's import (as it is specifically provided in pyfa/config.py) 2015-01-25 11:09:43 -05:00
blitzmann
675213f20f Fix #252 2015-01-21 11:18:58 -05:00
blitzmann
3a9e1f8b85 Fix XML export 2015-01-17 13:41:49 -05:00
blitzmann
e520758334 dev version 2015-01-15 12:29:16 -05:00
blitzmann
073309de0a Increment database version and bump to 1.8.1 stable 2015-01-15 12:08:35 -05:00
DarkPhoenix
1bce724190 Do not write non-ascii comments to effect files 2015-01-15 12:17:30 +03:00
blitzmann
2c47d0758e Bump to stable 2015-01-14 21:31:28 -05:00
blitzmann
8f7ae4b00c Remove Chinese ships from effect "used by" header 2015-01-14 21:04:12 -05:00
DarkPhoenix
f11f3bfb79 Implement recon effect changes 2015-01-15 02:35:22 +03:00
DarkPhoenix
68703f3db5 Put old innerzone names back
To make sure EFT fittings with these are imported & converted properly
2015-01-14 23:03:14 +03:00
Andrey
ad18560412 Update gpl.txt
Fix license text http://www.gnu.org/licenses/gpl-3.0.txt
2015-01-14 12:27:47 +03:00
blitzmann
d3def54b5a Conversion pack for Proteus Module Tiericide + conversion helper script 2015-01-13 22:37:20 -05:00
DarkPhoenix
27d72ed909 Add vanity ship changes from proteus 2015-01-14 03:22:28 +03:00
DarkPhoenix
55e45b6bc1 Remove published chinese ships from visibility 2015-01-14 03:15:35 +03:00
DarkPhoenix
252f56732b Merge branch 'master' of github.com:DarkFenX/Pyfa 2015-01-14 03:00:15 +03:00
DarkPhoenix
d52e88cdaa Update database to proteus & add tiericide item conversions 2015-01-14 02:59:15 +03:00
blitzmann
371e33764e Ammo name tooltip added to charge icon 2015-01-13 17:26:56 -05:00
blitzmann
9b8b7aba07 Add module state information to state tooltip 2015-01-12 23:37:40 -05:00
blitzmann
0a6274474e Fixes #204 2015-01-10 21:53:30 -05:00
Ryan Holmes
0ff69068c0 Merge pull request #241 from cockroach/master
Make tab tooltips optional
2015-01-10 20:13:35 -06:00
DarkPhoenix
731477b366 Open fit upon importing 2015-01-11 00:43:05 +03:00
Anton Vorobyov
0295f04ec4 Merge pull request #243 from blitzmann/issue-156
Fix #156
2015-01-10 18:21:30 +03:00
blitzmann
059af217aa Fix #246 2015-01-08 15:04:22 -05:00
Ryan Holmes
2a391fa38b Merge pull request #242 from blitzmann/issue-233
Fix #233
2015-01-08 13:26:26 -06:00
Ryan Holmes
88b1426fe0 Merge pull request #232 from blitzmann/progress
Port custom wait dialog to wx.ProgressDialog
2015-01-08 12:15:05 -06:00
blitzmann
07da5aa861 Resolve #245 - Adding tooltips to fitting columns 2015-01-08 12:39:16 -05:00
blitzmann
192d6f4605 Fix #156 2015-01-05 22:50:33 -05:00
blitmann
487f65d62b Fix #233 2015-01-04 17:19:53 -06:00
Stefan Ott
c202aefd2e Reverted accidentally committed change 2015-01-02 17:06:26 +01:00
Stefan Ott
0ed91e4079 Fixed code formatting 2015-01-02 17:04:10 +01:00
Stefan Ott
9c2a667635 Made tab tooltips optional 2015-01-02 16:55:05 +01:00
blitzmann
19579fb087 Implement middle click to offline modules 2014-12-31 20:18:16 -05:00
blitzmann
ea77e6851e Fix #238 2014-12-31 20:07:36 -05:00
blitzmann
1c3f9ccf5b Fix #240 2014-12-31 19:57:10 -05:00
blitzmann
e42671fbec Workaround for seg fault (see comments in pull request # 232) 2014-12-31 16:20:25 -05:00
blitzmann
18c86daea6 Do not include rigs in skill requirement checks 2014-12-30 21:08:55 -05:00
blitzmann
c59b818677 Add wx.ProgressDialog to HTML export, along with some documentation and silent try-except in HTML export 2014-12-19 00:13:06 -05:00
Ryan Holmes
71bf1556a1 Fix column name in upgrade3 migration script 2014-12-19 00:02:39 -05:00
blitzmann
26e50f2e8a Implement ProgressDialog for fit file imports (EVE XML / EFT cfg).
To make it simpler, changed the way fits are imported and saved from a per-file basis (process file->save fits->process file->save fits) to a per-batch basis (process file->process file -> save all fits).
2014-12-17 21:36:42 -05:00
blitzmann
25e30672fe Start conversion of various wait dialogs to wx.ProgresDialog. Implemented new wx.ProgresDialog for fitting backup 2014-12-15 20:01:03 -05:00
DarkPhoenix
e8268633e3 Merge branch 'master' into wx3
Used code from the master on conflicts
2014-12-15 15:45:33 +03:00
blitzmann
1b3c058eab Put XML export in a try-except block so that a failed export of 1 fit doesn't crash the whole process 2014-12-13 20:12:24 -05:00
blitzmann
adcae42ae7 Goodbye CREST support, we hardly used ya! (close #201) 2014-12-13 19:03:22 -05:00
blitzmann
238712e62c Add consumption info for siege/cyno module in misc column (resolves #219) 2014-12-13 18:39:06 -05:00
Ryan Holmes
f2b959895e Merge pull request #227 from unpoetical/master
Show amount over limit on pg/cpu/drone displays
2014-12-12 19:04:41 -05:00
blitzmann
ffb7719937 Fix #228 - missing Heretic effect 2014-12-12 18:49:00 -05:00
DarkPhoenix
3c1bf22e87 Merge branch 'master' into wx3 2014-12-12 14:42:25 +03:00
unpoetical
e0488dce4f Update powergrid, CPU, drone bandwidth, and drone bay displays to show remaining units so I don't have to do math. Could affect other gauge displays? 2014-12-11 22:15:50 -08:00
blitzmann
88074c8516 Fix fonts and lag with OS X 2014-12-11 23:25:44 -05:00
blitzmann
359840aee8 bump dev 2014-12-11 23:13:04 -05:00
blitzmann
77e3a0f666 Bump Stable 2014-12-11 14:39:01 -05:00
blitzmann
3d4eef2466 Fix #197, again 2014-12-11 11:34:21 -05:00
blitzmann
663cf7104c Fix #226, as well as another bug with coloring rack that had too many modules 2014-12-11 10:37:07 -05:00
blitzmann
0d6a55dcb6 Fix #224 2014-12-10 22:09:46 -05:00
blitzmann
85608616dd readjust some mode logic 2014-12-10 22:04:12 -05:00
blitzmann
d5ce666d8d Fix #225 - set mode whenever the ship is set. 2014-12-10 21:54:26 -05:00
blitzmann
2bff11e5ab bump dev 2014-12-09 19:31:01 -05:00
blitzmann
5adaaac75e Bump release 2014-12-09 18:50:34 -05:00
blitzmann
a49269b759 Edit effect headers and fix effects script 2014-12-09 18:49:40 -05:00
blitzmann
a96efaee1a Revert "Bump release", forgot effect headers 2014-12-09 18:49:10 -05:00
blitzmann
299de38bf6 Bump release 2014-12-09 18:37:24 -05:00
DarkPhoenix
b29019f0a7 Restore old race detection mechanism, but new has priority over it
Few unique ships still have no factionID
2014-12-10 01:13:58 +03:00
DarkPhoenix
da15b63831 Fix race detection 2014-12-10 01:01:51 +03:00
DarkPhoenix
20b2f1e5fc Merge branch 'singularity' 2014-12-09 23:39:57 +03:00
blitzmann
f1cdabf37c Fix bullets in traits 2014-12-08 23:10:55 -05:00
blitzmann
94e1c7aba3 Fix more bindings 2014-12-08 15:10:45 -05:00
blitzmann
797db36a42 Fix menu spawning when no fit open 2014-12-08 12:26:51 -05:00
blitzmann
ac18c58a0a fix menu bindings 2014-12-08 12:12:50 -05:00
Anton Vorobyov
281850d7df Merge pull request #214 from blitzmann/singularity 2014-12-08 03:05:04 +03:00
blitzmann
2e460adbc9 Add drone volleys 2014-12-04 21:08:41 -05:00
blitzmann
5660b2b8ed Add missing icons 2014-12-02 18:57:33 -05:00
blitzmann
de9fbd672f Fix scripts for t3 tactical modes 2014-12-02 18:33:59 -05:00
blitzmann
85029f6be8 Add mode to blanks list to avoid exception in module operations 2014-12-02 14:52:56 -05:00
blitzmann
337db326fd Add Mode and separation to fitting list.
Todo: A few exceptions are thrown when trying to remove mode via double click, spawn context menu, move to a different position, etc. All simply because Mode is not a Module. Will need to add try-except blocks to cover these instances
2014-12-02 14:33:47 -05:00
blitzmann
795230dae6 Quick fix for game version bug when running jsonToSql 2014-12-02 12:53:02 -05:00
blitzmann
022a929399 Fix initial mode assignment 2014-12-02 12:31:10 -05:00
blitzmann
b64238634a Merge branch 'master' into singularity
Conflicts:
	gui/builtinContextMenus/__init__.py
2014-12-02 02:50:27 -05:00
blitzmann
4b0e0300ad Fix path for .git directory 2014-12-02 02:48:50 -05:00
blitzmann
7762bb365f Set debug back to False 2014-12-02 02:45:46 -05:00
blitzmann
dfec7d8fa2 Added new skinned ships to conversions 2014-12-02 02:42:05 -05:00
blitzmann
5c5ec60efd Bowhead effects 2014-12-02 02:28:54 -05:00
blitzmann
2a7e35ff6f Fix exception with non-t3-dessys context menu 2014-12-02 02:15:01 -05:00
blitzmann
d7ab709d52 Add EVE version to about box 2014-12-02 01:35:30 -05:00
blitzmann
831478e034 Finish effects for Confessor 2014-12-02 01:15:06 -05:00
blitzmann
d0b5f3ad78 Fixed Confessor Prop mode effects and added Defense / Sharpshooter mode effects 2014-12-02 00:50:02 -05:00
blitzmann
190c1f135f Add slot modifiers to misc column for subsystems 2014-11-30 22:36:52 -05:00
blitzmann
374d6d6d34 Publish other modes to market 2014-11-30 16:59:55 -05:00
blitzmann
edbdaf5631 Add .Check() to tactical mode menu items 2014-11-30 16:56:43 -05:00
blitzmann
23a71e7448 Implement service layer mode setter. Modes now have basic support and testing.
Also decided to have two separate functions that return the mode items as Items or Modes. Returning them as Items makes it easier to check if provided modeID from user database is valid (since we cannot easily map the modeID to create a Mode), returning as Modes allows us to easily use them for setters. There's probably a better way to do this, but w/e
2014-11-30 16:43:15 -05:00
blitzmann
892c5c5b60 Various event binding fixes for context menus. It's still a mess, but it's not as bad of a mess.
(cherry picked from commit 081e32da6f)
2014-11-30 01:19:10 -05:00
blitzmann
081e32da6f Various event binding fixes for context menus. It's still a mess, but it's not as bad of a mess. 2014-11-30 01:14:47 -05:00
blitzmann
7100e8997b Merge branch 'master' into singularity 2014-11-29 21:53:22 -05:00
blitzmann
9a8642e789 Fix more paths 2014-11-29 20:57:44 -05:00
blitzmann
a565abe6f7 Added script to automate json dump, sql convert, and diff prep. Also adds metadata to eve.db 2014-11-29 20:50:34 -05:00
blitzmann
b93b59fe4d Add windows installer generation to dist.py 2014-11-29 20:49:58 -05:00
blitzmann
9782ca3a29 Improvements on distributable generator 2014-11-29 20:49:40 -05:00
blitzmann
f9fd894c9f Rename nighty to dist and fix path in itemDiff 2014-11-29 20:49:27 -05:00
blitzmann
ee8395e8fd Fix paths 2014-11-29 20:49:10 -05:00
blitzmann
7836506444 Move scripts directory 2014-11-29 20:48:58 -05:00
blitzmann
8df7593223 Moved compat.py to new dir utils/ and also added timer class 2014-11-29 20:47:53 -05:00
blitzmann
8351b0fc9d Fix gitignore 2014-11-29 20:46:16 -05:00
blitzmann
88ee1d60be Fix loading of mode, and add some (untested) setting functions 2014-11-29 02:58:43 -05:00
blitzmann
dda1494b90 Added method to check/get modes, and start GUI integration (simple context menu) 2014-11-28 01:23:44 -05:00
blitzmann
f53384c4c2 Preliminary backend support for tactical destroyer modes.
* Modifies fits table to add "mode" column, which contains typeID of mode for fit
* Introduces Mode type, similar to Ship and Module type
* Includes effects for Amarr Tactical Destroyer Propulsion Mode

Still a lot to do: GUI switching, constraints on which ships get modes, etc
2014-11-27 23:23:24 -05:00
blitzmann
d4af877e47 Update to 848581 2014-11-27 23:15:45 -05:00
blitzmann
5242c6df60 Fix #192
If price is not valid, cancel it out. This will force an update.
2014-11-25 23:54:24 -05:00
blitzmann
8c1d14ec4a Add version to title bar 2014-11-21 13:39:14 -05:00
blitzmann
f187caa549 Reduce minimum vertical size 2014-11-20 13:00:57 -05:00
blitzmann
70d52fd0b2 Moved price update info to header 2014-11-20 12:27:32 -05:00
blitzmann
222ee22fe3 Ability to remove Cargo from context menu 2014-11-20 00:45:30 -05:00
blitzmann
76f1f217e1 Implements forced price refresh (resolves #196) 2014-11-20 00:29:53 -05:00
blitzmann
6f42e7c286 Bump dev version 2014-11-18 20:05:25 -05:00
blitzmann
aab2ec5f96 Bump to Stable 2014-11-18 19:04:59 -05:00
blitzmann
9831ed5c3d Fix old migrations 2014-11-18 18:55:03 -05:00
Ryan Holmes
399ec7d009 Update README.md 2014-11-13 18:07:50 -05:00
Ryan Holmes
bf91e82813 Rename readme.md to README.md 2014-11-13 18:02:14 -05:00
Ryan Holmes
7ca1fc4cfb Merge pull request #202 from danmane/master
Change README to Markdown
2014-11-13 18:01:52 -05:00
Daniel Mane
3f86d3c33d Fix syntax 2014-11-13 10:47:16 -08:00
Daniel Mane
fd1dc5b4e2 Move README to Markdown so it gets displayed better in Github UI 2014-11-13 10:45:23 -08:00
blitzmann
05c73d1b1b If something happens and an error happens, return so that status is not reset later on 2014-11-13 11:18:44 -05:00
blitzmann
7a6e3ac665 Fix #199 2014-11-13 11:06:15 -05:00
DarkPhoenix
9de8fe5884 Fix graphs for drones (#197) 2014-11-11 00:40:31 +03:00
blitzmann
ff55f2817b Fix for collapsible stats panels 2014-11-08 18:17:57 -05:00
Gleb Golubitsky
198ee8d129 Icon column size bumped to 24
Signed-off-by: Gleb Golubitsky <sectoid@gnolltech.org>
2014-11-08 17:33:37 +02:00
Gleb Golubitsky
7db13bd3ba Fixed ChromeTabs not rendering properly in wx 3.0
Signed-off-by: Gleb Golubitsky <sectoid@gnolltech.org>
2014-11-08 17:33:04 +02:00
blitzmann
5be0d4b70e Added version selection logic 2014-11-08 16:45:09 +02:00
blitzmann
a603a4359a Fixed font discrepancy from different wxPython versions. 2014-11-08 16:45:09 +02:00
blitzmann
b4f4024903 Fixed some bugs that blocked startup 2014-11-08 16:38:18 +02:00
blitzmann
df18651b4f Bump wxPython requirements 2014-11-08 16:38:18 +02:00
blitzmann
61197ec061 Fixed old variable name in docstring 2014-11-07 23:40:58 -05:00
blitzmann
9f2124ac9f Forgot to edit main comment =/ 2014-11-07 23:36:50 -05:00
blitzmann
dbacfc19f0 Reintroduced old migration path. 2014-11-07 23:25:51 -05:00
blitzmann
6fafe40f35 Fix for a fix that was removed with a fix (see #62) 2014-11-07 23:17:14 -05:00
DarkPhoenix
7641384aba Remove unused import 2014-11-07 12:52:01 +03:00
DarkPhoenix
15087a290a Add proper support of attribute value limit
This fixes issue with blighted/polarized weapons getting resistances down to negative values
2014-11-07 12:49:34 +03:00
DarkPhoenix
cb27efd5e1 Mark next development cycle 2014-11-07 01:33:57 +03:00
DarkPhoenix
091935259a Bump version and mark as stable 2014-11-07 01:08:57 +03:00
DarkPhoenix
1fca17f5dd Do not add time to misc column for ASB/AAR when factor reload time is turned on, fixes #123 2014-11-06 23:51:37 +03:00
DarkPhoenix
98cac2a0da Penalize speed ganglinks against overheat on module itself (fixes #170) 2014-11-06 23:17:44 +03:00
DarkPhoenix
c28e52f2d1 Disable global ammo picker until we find alternative solution to using it (RMB or modifier keys for regular ammo picker) 2014-11-06 23:02:16 +03:00
DarkPhoenix
36df6878e8 Remove couple of skinned variations from ship browser 2014-11-06 02:45:26 +03:00
DarkPhoenix
7077261fe1 Work around EVE bug (Assault Frigs have raceID assigned) and make race detection to cope with 3+ skill reqs better overall, which fixes race detection for revenant and alike 2014-11-06 02:42:05 +03:00
DarkPhoenix
89052edda2 Commit new Phoebe effect files 2014-11-06 02:22:06 +03:00
DarkPhoenix
e60b677b3f Update to Phoebe 1.0 data 2014-11-06 02:17:29 +03:00
DarkPhoenix
bf5c443053 Fix command processors - they used to allow to have 2 more ganglinks online 2014-11-05 22:03:43 +03:00
DarkPhoenix
d298ed8e01 Fix for new ammo picker (which borked resistance profile selector) 2014-11-05 22:00:55 +03:00
Ryan Holmes
28f2644a15 Merge pull request #189 from Headpigeon/master
Global Charge Switcher
2014-11-04 10:30:20 -05:00
Headpigeon
635e684c3a Added module context menu entry for changing charges on all modules of same type at once (no need to manually select them) 2014-11-02 19:12:03 +01:00
DarkPhoenix
d991048be3 Fix crash on opening stats for items w/o traits 2014-10-30 14:12:37 +03:00
blitzmann
69e99d98c2 Fix minor formatting consistency issue for gauge tooltip 2014-10-26 00:24:40 -04:00
blitzmann
20362d2c0c Added thousands separators to price tooltip 2014-10-26 00:18:54 -04:00
blitzmann
2e1d0c43a1 Added agility and mass to align time tooltip 2014-10-26 00:13:22 -04:00
DarkPhoenix
f78e2ed405 Adapt pyfa scripts to latest Phobos changes 2014-10-25 17:39:33 +04:00
blitzmann
23906d5824 Fix #126 2014-10-14 00:10:47 -04:00
blitzmann
41a67bfae2 Fix some inconsistent behavior and a possible issue with adding a GUI element twice 2014-10-03 23:35:56 -04:00
blitzmann
df58614674 Fix #180 2014-10-03 23:13:12 -04:00
blitzmann
90369b679c Fix #179 2014-10-03 21:25:28 -04:00
blitzmann
fed7107857 Implement better system for item conversions / definitions 2014-10-03 00:32:05 -04:00
blitzmann
4a2223323d Bump dev version 2014-10-01 18:21:45 -04:00
blitzmann
0bbc35cd1b Bump to v1.5.1 stable, fix for #176 (pyfa update breaks skeletons) 2014-10-01 17:43:54 -04:00
blitzmann
9b8c1ff3ba Bump dev cycle 2014-09-30 21:56:54 -04:00
blitzmann
3394fabfc8 Bump to stable version 2014-09-30 19:37:23 -04:00
blitzmann
1bdfd7f924 Those who keep up with dev branch had issues with new migrations. 2014-09-30 18:03:04 -04:00
blitzmann
b69a46f9b1 Update to Oceanus 1.0 2014-09-30 13:28:56 -04:00
blitzmann
c17579505c Merge branch 'singularity' 2014-09-30 13:28:08 -04:00
blitzmann
2f990b9de2 Add auto backup when migrating data 2014-09-30 13:20:51 -04:00
blitzmann
c9f33f200d Fix #119 2014-09-29 16:20:59 -04:00
blitzmann
4abde609d8 Remove old effects, and modify current effects using new header with real effect name 2014-09-29 14:20:12 -04:00
blitzmann
9c09cef783 Added option to automatically remove unused effects with --remove flag 2014-09-29 14:09:56 -04:00
blitzmann
7570fee97b Include real effect name in effect file comments to assist with debugging 2014-09-29 14:02:05 -04:00
blitzmann
22e8330045 Add Scram effect (does not include projection effects) 2014-09-29 13:43:21 -04:00
blitzmann
98c37a253f Fix background color on fleet view on Linux 2014-09-29 11:38:49 -04:00
blitzmann
a931d46cb0 Implement open fit context item for projected fits 2014-09-29 01:02:00 -04:00
blitzmann
f4de596193 Add Oceanus module conversions to market item overrides 2014-09-28 02:54:36 -04:00
blitzmann
973a081e8d Update to 829786 2014-09-28 02:08:33 -04:00
blitzmann
3054ac9d90 Introduce new migration procedure.
This creates a new migration module that include upgrade logic files, one file for each DB version. It should be noted that this will not support downgrades (the previous method didn't really support them either)
2014-09-28 00:14:10 -04:00
blitzmann
4ea2636788 Fix #171 2014-09-21 23:44:19 -04:00
Ryan Holmes
b5f2df58ce Merge pull request #168 from blitzmann/161-effDps
Implement effective DPS
2014-09-19 19:18:20 -04:00
blitzmann
6d15645198 Added some docs to chrome tabs, and removed / commented some slight redundancies as well as style tweaks 2014-09-19 00:07:55 -04:00
blitzmann
a1bd671d89 Give a bit more horizontal room for fleet view (more work needs to be done - looks like crap on gtk) 2014-09-19 00:05:27 -04:00
blitzmann
aba5d43fc7 Added some docs ChromeTabs and did some cleaning 2014-09-17 19:00:09 -04:00
blitzmann
c903dff8ad Removed debugging prints 2014-09-15 18:02:49 -04:00
blitzmann
35d5c49745 Allow us to select target resist after creating / renaming it 2014-09-15 16:11:30 -04:00
blitzmann
030e6aa9db Instead of sending id, send parent item (which contains ID). This allows us to access the item to modify bitmap or any other value for it. 2014-09-15 15:48:26 -04:00
blitzmann
cc770898d9 Fixes issue where cargo is not copied with fit 2014-09-14 17:46:14 -04:00
blitzmann
8e383a085e Enable Ctrl+Page(Up/Down) for fitting tab navigation 2014-09-13 00:32:00 -04:00
blitzmann
5fef07a552 Fix background color for empty fitting view on Linux (and osx?) 2014-09-13 00:14:30 -04:00
DarkPhoenix
72e272084e Fix #159
Added all new system-wide effects as postMul, removed penalty group for cases where in coincides with 'default' group (e.g. it's also postMul for turret damage mods)
2014-09-09 19:54:38 +04:00
Anton Vorobyov
a2499cc070 Merge pull request #160 from blitzmann/fix-159
Fixes for stacking penalties for various wormhole effects
2014-09-09 19:16:42 +04:00
DarkPhoenix
c262acd0dc RR drone rigs are penalized 2014-09-09 15:44:21 +04:00
blitzmann
da047106f3 Implements support for child menus for damage patterns. 2014-09-08 01:11:38 -04:00
blitzmann
c04bb8f82c Greatly simplified target resists menu logic. Also added active bitmap 2014-09-04 00:23:41 -04:00
blitzmann
bb16e649af Added message to damage profile export 2014-09-03 18:45:04 -04:00
blitzmann
035443b4ff We now use EFT-style import/exports for damage profiles.
Also, percentages now shown next to damage amount instead of foot (where notifications are going)
2014-09-03 14:56:44 -04:00
blitzmann
0e10ac3928 Damage Pattern editor cleanup / GUI improvements 2014-09-03 13:52:42 -04:00
blitzmann
f0473f1eab Added support to show errors for resist imports, as well as many improvements to GUI logic. 2014-09-03 12:52:05 -04:00
blitzmann
a95eabac7b TargetResists: drones work. Also cleaned up redundancy in module.damageStats() 2014-09-03 01:37:59 -04:00
blitzmann
1ab76a7170 Commit initial work for effect DPS / Target resists 2014-09-03 00:49:53 -04:00
blitzmann
53c4a31334 Fix Guided Missile Precision skill for Citadel missiles 2014-08-30 13:07:18 -04:00
blitzmann
f02be0b0fd Update Notifications: Sort release results by published date before iterating 2014-08-28 20:34:16 -04:00
blitzmann
0524b901f5 Fixes for stacking penalties for various wormhole effects 2014-08-27 23:12:30 -04:00
blitzmann
d5a701ab31 If in debug mode, open effect file when double clicking effect (windows only) 2014-08-27 21:29:04 -04:00
DarkPhoenix
55c7488a0d Update ship icons 2014-08-27 02:52:25 +04:00
DarkPhoenix
8c8cf05207 Add icons for AT12 prize ships and move them to limited issue category 2014-08-27 02:34:19 +04:00
DarkPhoenix
ab9822b37e Bump version to indicate next development cycle 2014-08-27 01:21:49 +04:00
DarkPhoenix
4e5f27a643 Bump version for stable release 2014-08-27 00:44:25 +04:00
DarkPhoenix
92c9e1afc3 Fix black hole missile velocity effect 2014-08-27 00:13:59 +04:00
DarkPhoenix
e6e503f9e8 Merge branch 'master' of github.com:DarkFenX/Pyfa 2014-08-27 00:03:18 +04:00
DarkPhoenix
578716767f Hide tournament MJU 2014-08-27 00:02:39 +04:00
blitzmann
ec083428da Fit search shortcut: Fix focus issues for Linux 2014-08-26 16:01:39 -04:00
DarkPhoenix
f57c18810e Fix broken refresh button in item stats view 2014-08-26 23:59:05 +04:00
DarkPhoenix
5d4c0b443e Added couple of vanity variations (which are not so vanity - their stats differ from original) to limited issue group 2014-08-26 23:20:23 +04:00
DarkPhoenix
b89f55c675 Remove obsolete scripts 2014-08-26 22:59:23 +04:00
DarkPhoenix
81d991b48d Update database to 820762 2014-08-26 22:57:48 +04:00
DarkPhoenix
944bc971bd Update chatroom to the one we're actually using 2014-08-26 22:53:48 +04:00
DarkPhoenix
cf44af3586 Merge branch 'master' into singularity 2014-08-26 22:47:50 +04:00
DarkPhoenix
3e70a6fd7c Fix #139 (Compare Charges mismatch) 2014-08-26 18:19:39 +04:00
blitzmann
59be18506c Added "Open in Ship Browser" to fitting context menu, and modified a bit of the history logic in shipBrowser. 2014-08-19 23:50:10 -04:00
Ryan Holmes
b1bf14de29 Merge pull request #155 from blitzmann/network
Network service, other things - Resolves #135
2014-08-19 16:50:32 -04:00
blitzmann
2dd8453bbb Give itemStat width more room on GTK, resolves #113 2014-08-19 16:22:37 -04:00
blitzmann
4e61d1b17a Update 818790 2014-08-19 09:00:54 -04:00
blitzmann
458e89a534 Fixes #154 2014-08-18 17:46:51 -04:00
blitzmann
493bf5cb0d Merge remote-tracking branch 'origin/master' 2014-08-18 01:24:04 -04:00
Ryan Holmes
0032163a38 Merge pull request #152 from DarkFenX/jams
Adds "Chance to Jam" to Sensor Strength tooltip, resolves #114
2014-08-18 01:20:06 -04:00
blitzmann
84ac71f528 Fixed bugs introduced from code consistency fix 2014-08-18 01:10:49 -04:00
blitzmann
e8041470c8 Remove / disable debugging prints 2014-08-17 23:40:22 -04:00
blitzmann
8928d394c0 Updates "update" prefs to reflect new changes 2014-08-17 23:27:07 -04:00
blitzmann
0881abae7b Moves price fetching to new service as well as removes old and defunct c0rporation price source (along with much of the price fetching logic used to support multiple sources) 2014-08-17 21:47:07 -04:00
blitzmann
0686b602c6 Adds network toggling to the preferences, as well as a few tweaks to network service 2014-08-15 01:00:31 -04:00
blitzmann
fa5edbb804 Fix reference to old eveapi 2014-08-14 22:52:55 -04:00
blitzmann
1279b20370 Some (bad) network error handling logic, borrowed from eveapi 2014-08-14 22:52:27 -04:00
blitzmann
ed1b9854a0 Modify eveapi to work with pyfa service, move all character API calls from EOS to Character service and use new network service 2014-08-14 11:44:50 -04:00
blitzmann
4fe80b7554 Implement new network service for: Updates, CREST. 2014-08-14 11:43:25 -04:00
blitzmann
a5773a3fd6 Update to eveapi 1.3.0, and move to service. 2014-08-14 01:59:03 -04:00
blitzmann
ca61be2476 Bump SISI version 2014-08-11 17:14:23 -04:00
Ryan Holmes
ae02e214f0 Add effects up to 8.47.816656 2014-08-11 21:06:09 +00:00
blitzmann
a0093d9760 Update to EVE 8.47.816656 2014-08-11 14:03:44 -04:00
blitzmann
11891340af Merge branch 'linux' 2014-08-11 13:31:35 -04:00
blitzmann
e60735a1f2 wxGTK itemStats Improvements: fixes button sizes, removes first column size on effects and increases second colum to prevent clipping
with window borders.
2014-08-11 02:15:34 -04:00
blitzmann
ce3772ecee Set a min size for character selection. This prevents the character selector from stretching the entire stats panel with long character names 2014-08-11 01:27:47 -04:00
blitzmann
bec61e43ae Only do overload effect if not projecting (otherwise overload bonus is applied twice) 2014-08-07 23:09:03 -04:00
blitzmann
d29b4d91e9 Adds "Chance to Jam" to Sensor Strength tooltip 2014-08-07 22:47:59 -04:00
3743 changed files with 19556 additions and 9110 deletions

7
.gitignore vendored
View File

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

674
LICENSE Normal file
View File

@@ -0,0 +1,674 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.

48
README.md Normal file
View File

@@ -0,0 +1,48 @@
# pyfa
![pyfa](https://cloud.githubusercontent.com/assets/3904767/10271512/af385ef2-6ade-11e5-8f67-52b8b1e4c797.PNG)
## What is it?
pyfa, short for **py**thon **f**itting **a**ssistant, allows you to create, experiment with, and save ship fittings without being in game. Open source and written in Python, it is available on any platform where Python 2.x and wxWidgets are available, including Windows, Mac OS X, and Linux.
## Latest Version and Changelogs
The latest version along with release notes can always be found on the projects [Releases](https://github.com/DarkFenX/Pyfa/releases) page. pyfa will notify you if you are running an outdated version.
## Installing
Windows and OS X users are supplied self-contained builds of pyfa that can be run without additional software. An `.exe` installer is also available for the Windows builds. There is no self-contained package for Linux users, which are expected to run pyfa through their distributions Python interpreter. However, there are a number of third-party packages available that handle the dependencies and updates for pyfa (for example, [pyfa for Arch Linux](https://aur.archlinux.org/packages/pyfa/)). Please check your distributions repositories.
## Requirements
If you wish to help with development or simply need to run pyfa through a Python interpreter, the following software is required:
* Python >= 2.6
* `wxPython` 2.8/3.0
* `sqlalchemy` >= 0.6
* `dateutil`
* `matplotlib` (for some Linux distributions, you may need to install separate wxPython bindings, such as `python-matplotlib-wx`)
* `requests`
## Bug Reporting
The preferred method of reporting bugs is through the projects GitHub Issues interface. Alternatively, posting a report in the pyfa thread on the official EVE Online forums is acceptable. Guidelines for bug reporting can be found on [this wiki page](https://github.com/DarkFenX/Pyfa/wiki/Bug-Reporting).
## License
pyfa is licensed under the GNU GPL v3.0, see LICENSE
## Resources
* Development repository: [http://github.com/DarkFenX/Pyfa](http://github.com/DarkFenX/Pyfa)
* XMPP conference: [pyfa@conference.jabber.org](pyfa@conference.jabber.org)
* [EVE forum thread](http://forums.eveonline.com/default.aspx?g=posts&t=247609)
* [EVE University guide using pyfa](http://wiki.eveuniversity.org/Guide_to_using_PYFA)
* [EVE Online website](http://www.eveonline.com/)
## Contacts:
* Kadesh Priestess
* GitHub: @DarkFenX
* [TweetFleet Slack](https://www.fuzzwork.co.uk/tweetfleet-slack-invites/): @kadesh
* Sable Blitzmann
* GitHub: @blitzmann
* [TweetFleet Slack](https://www.fuzzwork.co.uk/tweetfleet-slack-invites/): @blitzmann
* Email: sable.blitzmann@gmail.com
## CCP Copyright Notice
EVE Online, the EVE logo, EVE and all associated logos and designs are the intellectual property of CCP hf. All artwork, screenshots, characters, vehicles, storylines, world facts or other recognizable features of the intellectual property relating to these trademarks are likewise the intellectual property of CCP hf. EVE Online and the EVE logo are the registered trademarks of CCP hf. All rights are reserved worldwide. All other trademarks are the property of their respective owners. CCP hf. has granted permission to Osmium to use EVE Online and all associated logos and designs for promotional and information purposes on its website but does not endorse, and is not in any way affiliated with, Osmium. CCP is in no way responsible for the content on or functioning of this website, nor can it be liable for any damage arising from the use of this website.

219
config.py
View File

@@ -1,86 +1,133 @@
import os
import sys
# Load variable overrides specific to distribution type
try:
import configforced
except ImportError:
configforced = None
# Turns on debug mode
debug = False
# Defines if our saveddata will be in pyfa root or not
saveInRoot = False
# Version data
version = "1.3.1"
tag = "git"
expansionName = "Crius"
expansionVersion = "1.0"
evemonMinVersion = "4081"
pyfaPath = None
savePath = None
staticPath = None
saveDB = None
gameDB = None
def defPaths():
global pyfaPath
global savePath
global staticPath
global saveDB
global gameDB
global saveInRoot
# The main pyfa directory which contains run.py
# Python 2.X uses ANSI by default, so we need to convert the character encoding
pyfaPath = getattr(configforced, "pyfaPath", pyfaPath)
if pyfaPath is None:
pyfaPath = unicode(os.path.dirname(os.path.realpath(os.path.abspath(
sys.modules['__main__'].__file__))), sys.getfilesystemencoding())
# Where we store the saved fits etc, default is the current users home directory
if saveInRoot is True:
savePath = getattr(configforced, "savePath", None)
if savePath is None:
savePath = os.path.join(pyfaPath, "saveddata")
else:
savePath = getattr(configforced, "savePath", None)
if savePath is None:
savePath = unicode(os.path.expanduser(os.path.join("~", ".pyfa")),
sys.getfilesystemencoding())
# Redirect stderr to file if we're requested to do so
stderrToFile = getattr(configforced, "stderrToFile", None)
if stderrToFile is True:
if not os.path.exists(savePath):
os.mkdir(savePath)
sys.stderr = open(os.path.join(savePath, "error_log.txt"), "w")
# Same for stdout
stdoutToFile = getattr(configforced, "stdoutToFile", None)
if stdoutToFile is True:
if not os.path.exists(savePath):
os.mkdir(savePath)
sys.stdout = open(os.path.join(savePath, "output_log.txt"), "w")
# Static EVE Data from the staticdata repository, should be in the staticdata
# directory in our pyfa directory
staticPath = os.path.join(pyfaPath, "staticdata")
# The database where we store all the fits etc
saveDB = os.path.join(savePath, "saveddata.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
# maintenance script
gameDB = os.path.join(staticPath, "eve.db")
## DON'T MODIFY ANYTHING BELOW ##
import eos.config
#Caching modifiers, disable all gamedata caching, its unneeded.
eos.config.gamedataCache = False
# saveddata db location modifier, shouldn't ever need to touch this
eos.config.saveddata_connectionstring = "sqlite:///" + saveDB + "?check_same_thread=False"
eos.config.gamedata_connectionstring = "sqlite:///" + gameDB + "?check_same_thread=False"
import os
import sys
# TODO: move all logging back to pyfa.py main loop
# We moved it here just to avoid rebuilding windows skeleton for now (any change to pyfa.py needs it)
import logging
import logging.handlers
# Load variable overrides specific to distribution type
try:
import configforced
except ImportError:
configforced = None
# Turns on debug mode
debug = False
# Defines if our saveddata will be in pyfa root or not
saveInRoot = False
# Version data
version = "1.17.0"
tag = "Stable"
expansionName = "Frostline"
expansionVersion = "1.0"
evemonMinVersion = "4081"
pyfaPath = None
savePath = None
saveDB = None
gameDB = None
class StreamToLogger(object):
"""
Fake file-like stream object that redirects writes to a logger instance.
From: http://www.electricmonk.nl/log/2011/08/14/redirect-stdout-and-stderr-to-a-logger-in-python/
"""
def __init__(self, logger, log_level=logging.INFO):
self.logger = logger
self.log_level = log_level
self.linebuf = ''
def write(self, buf):
for line in buf.rstrip().splitlines():
self.logger.log(self.log_level, line.rstrip())
def isFrozen():
if hasattr(sys, 'frozen'):
return True
else:
return False
def getPyfaRoot():
base = getattr(sys.modules['__main__'], "__file__", sys.executable) if isFrozen() else sys.argv[0]
root = os.path.dirname(os.path.realpath(os.path.abspath(base)))
root = unicode(root, sys.getfilesystemencoding())
return root
def __createDirs(path):
if not os.path.exists(path):
os.makedirs(path)
def defPaths():
global debug
global pyfaPath
global savePath
global saveDB
global gameDB
global saveInRoot
if debug:
logLevel = logging.DEBUG
else:
logLevel = logging.WARN
# The main pyfa directory which contains run.py
# Python 2.X uses ANSI by default, so we need to convert the character encoding
pyfaPath = getattr(configforced, "pyfaPath", pyfaPath)
if pyfaPath is None:
pyfaPath = getPyfaRoot()
# Where we store the saved fits etc, default is the current users home directory
if saveInRoot is True:
savePath = getattr(configforced, "savePath", None)
if savePath is None:
savePath = os.path.join(pyfaPath, "saveddata")
else:
savePath = getattr(configforced, "savePath", None)
if savePath is None:
savePath = unicode(os.path.expanduser(os.path.join("~", ".pyfa")),
sys.getfilesystemencoding())
__createDirs(savePath)
if isFrozen():
os.environ["REQUESTS_CA_BUNDLE"] = os.path.join(pyfaPath, "cacert.pem")
os.environ["SSL_CERT_FILE"] = os.path.join(pyfaPath, "cacert.pem")
format = '%(asctime)s %(name)-24s %(levelname)-8s %(message)s'
logging.basicConfig(format=format, level=logLevel)
handler = logging.handlers.RotatingFileHandler(os.path.join(savePath, "log.txt"), maxBytes=1000000, backupCount=3)
formatter = logging.Formatter(format)
handler.setFormatter(formatter)
logging.getLogger('').addHandler(handler)
logging.info("Starting pyfa")
if hasattr(sys, 'frozen'):
stdout_logger = logging.getLogger('STDOUT')
sl = StreamToLogger(stdout_logger, logging.INFO)
sys.stdout = sl
# This interferes with cx_Freeze's own handling of exceptions. Find a way to fix this.
#stderr_logger = logging.getLogger('STDERR')
#sl = StreamToLogger(stderr_logger, logging.ERROR)
#sys.stderr = sl
# The database where we store all the fits etc
saveDB = os.path.join(savePath, "saveddata.db")
# The database where the static EVE data from the datadump is kept.
# This is not the standard sqlite datadump but a modified version created by eos
# maintenance script
gameDB = os.path.join(pyfaPath, "eve.db")
## DON'T MODIFY ANYTHING BELOW ##
import eos.config
#Caching modifiers, disable all gamedata caching, its unneeded.
eos.config.gamedataCache = False
# saveddata db location modifier, shouldn't ever need to touch this
eos.config.saveddata_connectionstring = "sqlite:///" + saveDB + "?check_same_thread=False"
eos.config.gamedata_connectionstring = "sqlite:///" + gameDB + "?check_same_thread=False"

BIN
dist_assets/mac/pyfa.icns Normal file

Binary file not shown.

BIN
dist_assets/win/pyfa.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

View File

@@ -59,41 +59,50 @@ class CapSimulator(object):
return duration, capNeed
def init(self, modules):
"""prepare modules. a list of (duration, capNeed, clipSize) tuples is
"""prepare modules. a list of (duration, capNeed, clipSize, disableStagger) tuples is
expected, with clipSize 0 if the module has infinite ammo.
"""
mods = {}
for module in modules:
if module in mods:
mods[module] += 1
else:
mods[module] = 1
self.modules = mods
self.modules = modules
def reset(self):
"""Reset the simulator state"""
self.state = []
mods = {}
period = 1
disable_period = False
for (duration, capNeed, clipSize), amount in self.modules.iteritems():
# Loop over modules, clearing clipSize if applicable, and group modules based on attributes
for (duration, capNeed, clipSize, disableStagger) in self.modules:
if self.scale:
duration, capNeed = self.scale_activation(duration, capNeed)
if self.stagger:
duration = int(duration/amount)
else:
capNeed *= amount
period = lcm(period, duration)
# set clipSize to infinite if reloads are disabled unless it's
# a cap booster module.
if not self.reload and capNeed > 0:
clipSize = 0
# Group modules based on their properties
if (duration, capNeed, clipSize, disableStagger) in mods:
mods[(duration, capNeed, clipSize, disableStagger)] += 1
else:
mods[(duration, capNeed, clipSize, disableStagger)] = 1
# Loop over grouped modules, configure staggering and push to the simulation state
for (duration, capNeed, clipSize, disableStagger), amount in mods.iteritems():
if self.stagger and not disableStagger:
if clipSize == 0:
duration = int(duration/amount)
else:
stagger_amount = (duration*clipSize+10000)/(amount*clipSize)
for i in range(1, amount):
heapq.heappush(self.state,
[i*stagger_amount, duration,
capNeed, 0, clipSize])
else:
capNeed *= amount
period = lcm(period, duration)
# period optimization doesn't work when reloads are active.
if clipSize:
disable_period = True
@@ -160,13 +169,13 @@ class CapSimulator(object):
iterations += 1
t_last = t_now
if cap < cap_lowest:
if cap < 0.0:
break
cap_lowest = cap
t_last = t_now
# queue the next activation of this module
t_now += duration
shot += 1

View File

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

View File

@@ -40,6 +40,15 @@ gamedata_meta = MetaData()
gamedata_meta.bind = gamedata_engine
gamedata_session = sessionmaker(bind=gamedata_engine, autoflush=False, expire_on_commit=False)()
# This should be moved elsewhere, maybe as an actual query. Current, without try-except, it breaks when making a new
# game db because we haven't reached gamedata_meta.create_all()
try:
config.gamedata_version = gamedata_session.execute(
"SELECT `field_value` FROM `metadata` WHERE `field_name` LIKE 'client_build'"
).fetchone()[0]
except:
config.gamedata_version = None
saveddata_connectionstring = config.saveddata_connectionstring
if saveddata_connectionstring is not None:
if callable(saveddata_connectionstring):
@@ -49,7 +58,6 @@ if saveddata_connectionstring is not None:
saveddata_meta = MetaData()
saveddata_meta.bind = saveddata_engine
migration.update(saveddata_engine)
saveddata_session = sessionmaker(bind=saveddata_engine, autoflush=False, expire_on_commit=False)()
# Lock controlling any changes introduced to session
@@ -60,13 +68,8 @@ from eos.db.gamedata import *
from eos.db.saveddata import *
#Import queries
from eos.db.gamedata.queries import getItem, searchItems, getVariations, getItemsByCategory, directAttributeRequest, \
getMarketGroup, getGroup, getCategory, getAttributeInfo, getMetaData, getMetaGroup
from eos.db.saveddata.queries import getUser, getCharacter, getFit, getFitsWithShip, countFitsWithShip, searchFits, \
getCharacterList, getPrice, getDamagePatternList, getDamagePattern, \
getFitList, getFleetList, getFleet, save, remove, commit, add, \
getCharactersForUser, getMiscData, getSquadsIDsWithFitID, getWing, \
getSquad, getBoosterFits, getProjectedFits
from eos.db.gamedata.queries import *
from eos.db.saveddata.queries import *
#If using in memory saveddata, you'll want to reflect it so the data structure is good.
if config.saveddata_connectionstring == "sqlite:///:memory:":
@@ -75,3 +78,4 @@ if config.saveddata_connectionstring == "sqlite:///:memory:":
def rollback():
with sd_lock:
saveddata_session.rollback()

View File

@@ -31,6 +31,7 @@ attributes_table = Table("dgmattribs", gamedata_meta,
Column("attributeID", Integer, primary_key = True),
Column("attributeName", String),
Column("defaultValue", Float),
Column("maxAttributeID", Integer, ForeignKey("dgmattribs.attributeID")),
Column("description", Unicode),
Column("published", Boolean),
Column("displayName", String),

View File

@@ -30,6 +30,7 @@ items_table = Table("invtypes", gamedata_meta,
Column("typeName", String, index=True),
Column("description", String),
Column("raceID", Integer),
Column("factionID", Integer),
Column("volume", Float),
Column("mass", Float),
Column("capacity", Float),
@@ -53,9 +54,8 @@ mapper(Item, items_table,
"name" : synonym("typeName"),
"description" : deferred(items_table.c.description),
"traits" : relation(Traits,
primaryjoin = traits_table.c.typeID == items_table.c.typeID,
order_by = traits_table.c.typeID,
uselist = True)
primaryjoin = traits_table.c.typeID == items_table.c.typeID,
uselist = False)
})
Item.category = association_proxy("group", "category")

View File

@@ -23,7 +23,7 @@ from eos.types import MetaData
from eos.db import gamedata_meta
metadata_table = Table("metadata", gamedata_meta,
Column("fieldName", String, primary_key=True),
Column("fieldValue", String))
Column("field_name", String, primary_key=True),
Column("field_value", String))
mapper(MetaData, metadata_table)

View File

@@ -1,22 +1,11 @@
from sqlalchemy import Column, Table, Integer, String, ForeignKey, and_, select
from sqlalchemy.orm import mapper, column_property
from eos.types import Item, Traits
from sqlalchemy import Column, Table, Integer, String, ForeignKey
from sqlalchemy.orm import mapper
from eos.types import Traits
from eos.db import gamedata_meta
traits_table = Table("invtraits", gamedata_meta,
Column("typeID", Integer, ForeignKey("invtypes.typeID"), primary_key=True),
Column("skillID", Integer, ForeignKey("invtypes.typeID"), primary_key=True),
Column("bonusText", String, primary_key=True))
Column("traitText", String))
from .item import items_table
mapper(Traits, traits_table,
properties = {"skillName" : column_property(
select([items_table.c.typeName],
and_(
items_table.c.typeID == traits_table.c.skillID,
traits_table.c.skillID != -1
)))
});
mapper(Traits, traits_table);

View File

@@ -1,59 +1,40 @@
import sqlalchemy
import config
import shutil
import time
import re
import os
import migrations
def getVersion(db):
cursor = db.execute('PRAGMA user_version')
return cursor.fetchone()[0]
def getAppVersion():
return migrations.appVersion
def update(saveddata_engine):
checkPriceFailures(saveddata_engine)
checkApiDefaultChar(saveddata_engine)
checkFitBooster(saveddata_engine)
dbVersion = getVersion(saveddata_engine)
appVersion = getAppVersion()
def checkPriceFailures(saveddata_engine):
# Check if we have 'failed' column
try:
saveddata_engine.execute("SELECT failed FROM prices")
except sqlalchemy.exc.DatabaseError:
# As we don't have any important data there, let's just drop
# and recreate whole table
from eos.db.saveddata.price import prices_table
# Attempt to drop/create table only if it's already there
try:
prices_table.drop(saveddata_engine)
prices_table.create(saveddata_engine)
except sqlalchemy.exc.DatabaseError:
pass
if dbVersion == appVersion:
return
if dbVersion < appVersion:
# Automatically backup database
toFile = "%s/saveddata_migration_%d-%d_%s.db"%(
config.savePath,
dbVersion,
appVersion,
time.strftime("%Y%m%d_%H%M%S"))
def checkApiDefaultChar(saveddata_engine):
try:
saveddata_engine.execute("SELECT * FROM characters LIMIT 1")
# If table doesn't exist, it means we're doing everything from scratch
# and sqlalchemy will process everything as needed
except sqlalchemy.exc.DatabaseError:
pass
# If not, we're running on top of existing DB
else:
# Check that we have columns
try:
saveddata_engine.execute("SELECT defaultChar, chars FROM characters LIMIT 1")
# If we don't, create them
# This is ugly as hell, but we can't use proper migrate packages as it
# will require us to rebuild skeletons, including mac
except sqlalchemy.exc.DatabaseError:
saveddata_engine.execute("ALTER TABLE characters ADD COLUMN defaultChar INTEGER;")
saveddata_engine.execute("ALTER TABLE characters ADD COLUMN chars VARCHAR;")
shutil.copyfile(config.saveDB, toFile)
def checkFitBooster(saveddata_engine):
try:
saveddata_engine.execute("SELECT * FROM fits LIMIT 1")
# If table doesn't exist, it means we're doing everything from scratch
# and sqlalchemy will process everything as needed
except sqlalchemy.exc.DatabaseError:
pass
# If not, we're running on top of existing DB
else:
# Check that we have columns
try:
saveddata_engine.execute("SELECT booster FROM fits LIMIT 1")
# If we don't, create them
except sqlalchemy.exc.DatabaseError:
saveddata_engine.execute("ALTER TABLE fits ADD COLUMN booster BOOLEAN;")
# Set NULL data to 0 (needed in case of downgrade, see GH issue #62
saveddata_engine.execute("UPDATE fits SET booster = 0 WHERE booster IS NULL;")
for version in xrange(dbVersion, appVersion):
func = migrations.updates[version+1]
if func:
print "applying update",version+1
func(saveddata_engine)
# when all is said and done, set version to current
saveddata_engine.execute("PRAGMA user_version = {}".format(appVersion))

View File

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

View File

@@ -0,0 +1,97 @@
"""
Migration 1
- Alters fits table to introduce target resist attribute
- Converts modules based on Oceanus Module Tiericide
Some modules have been deleted, which causes pyfa to crash when fits are
loaded as they no longer exist in the database. We therefore replace these
modules with their new replacements
Based on http://community.eveonline.com/news/patch-notes/patch-notes-for-oceanus/
and output of itemDiff.py
"""
import sqlalchemy
CONVERSIONS = {
6135: [ # Scoped Cargo Scanner
6133, # Interior Type-E Cargo Identifier
],
6527: [ # Compact Ship Scanner
6525, # Ta3 Perfunctory Vessel Probe
6529, # Speculative Ship Identifier I
6531, # Practical Type-E Ship Probe
],
6569: [ # Scoped Survey Scanner
6567, # ML-3 Amphilotite Mining Probe
6571, # Rock-Scanning Sensor Array I
6573, # 'Dactyl' Type-E Asteroid Analyzer
],
509: [ # 'Basic' Capacitor Flux Coil
8163, # Partial Power Plant Manager: Capacitor Flux
8165, # Alpha Reactor Control: Capacitor Flux
8167, # Type-E Power Core Modification: Capacitor Flux
8169, # Marked Generator Refitting: Capacitor Flux
],
8135: [ # Restrained Capacitor Flux Coil
8131, # Local Power Plant Manager: Capacitor Flux I
],
8133: [ # Compact Capacitor Flux Coil
8137, # Mark I Generator Refitting: Capacitor Flux
],
3469: [ # Basic Co-Processor
8744, # Nanoelectrical Co-Processor
8743, # Nanomechanical CPU Enhancer
8746, # Quantum Co-Processor
8745, # Photonic CPU Enhancer
15425, # Naiyon's Modified Co-Processor (never existed but convert
# anyway as some fits may include it)
],
8748: [ # Upgraded Co-Processor
8747, # Nanomechanical CPU Enhancer I
8750, # Quantum Co-Processor I
8749, # Photonic CPU Enhancer I
],
1351: [ # Basic Reactor Control Unit
8251, # Partial Power Plant Manager: Reaction Control
8253, # Alpha Reactor Control: Reaction Control
8257, # Marked Generator Refitting: Reaction Control
],
8263: [ # Compact Reactor Control Unit
8259, # Local Power Plant Manager: Reaction Control I
8265, # Mark I Generator Refitting: Reaction Control
8261, # Beta Reactor Control: Reaction Control I
],
16537: [ # Compact Micro Auxiliary Power Core
16539, # Micro B88 Core Augmentation
16541, # Micro K-Exhaust Core Augmentation
],
31936: [ # Navy Micro Auxiliary Power Core
16543, # Micro 'Vigor' Core Augmentation
],
8089: [ # Compact Light Missile Launcher
8093, # Prototype 'Arbalest' Light Missile Launcher
],
8091: [ # Ample Light Missile Launcher
7993, # Experimental TE-2100 Light Missile Launcher
],
# Surface Cargo Scanner I was removed from game, however no mention of
# replacement module in patch notes. Morphing it to meta 0 module to be safe
442: [ # Cargo Scanner I
6129, # Surface Cargo Scanner I
]
}
def upgrade(saveddata_engine):
# Update fits schema to include target resists attribute
try:
saveddata_engine.execute("SELECT targetResistsID FROM fits LIMIT 1")
except sqlalchemy.exc.DatabaseError:
saveddata_engine.execute("ALTER TABLE fits ADD COLUMN targetResistsID INTEGER;")
# Convert modules
for replacement_item, list in CONVERSIONS.iteritems():
for retired_item in list:
saveddata_engine.execute('UPDATE "modules" SET "itemID" = ? WHERE "itemID" = ?', (replacement_item, retired_item))
saveddata_engine.execute('UPDATE "cargo" SET "itemID" = ? WHERE "itemID" = ?', (replacement_item, retired_item))

View File

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

View File

@@ -0,0 +1,116 @@
"""
Migration 11
- Converts modules based on December Release 2015 Tiericide
Some modules have been unpublished (and unpublished module attributes are removed
from database), which causes pyfa to crash. We therefore replace these
modules with their new replacements
"""
CONVERSIONS = {
16467: ( # Medium Gremlin Compact Energy Neutralizer
16471, # Medium Unstable Power Fluctuator I
),
22947: ( # 'Beatnik' Small Remote Armor Repairer
23414, # 'Brotherhood' Small Remote Armor Repairer
),
8295: ( # Type-D Restrained Shield Flux Coil
8293, # Beta Reactor Control: Shield Flux I
),
16499: ( # Heavy Knave Scoped Energy Nosferatu
16501, # E500 Prototype Energy Vampire
),
16477: ( # Heavy Infectious Scoped Energy Neutralizer
16473, # Heavy Rudimentary Energy Destabilizer I
),
16475: ( # Heavy Gremlin Compact Energy Neutralizer
16479, # Heavy Unstable Power Fluctuator I
),
16447: ( # Medium Solace Scoped Remote Armor Repairer
16445, # Medium 'Arup' Remote Armor Repairer
),
508: ( # 'Basic' Shield Flux Coil
8325, # Alpha Reactor Shield Flux
8329, # Marked Generator Refitting: Shield Flux
8323, # Partial Power Plant Manager: Shield Flux
8327, # Type-E Power Core Modification: Shield Flux
),
1419: ( # 'Basic' Shield Power Relay
8341, # Alpha Reactor Shield Power Relay
8345, # Marked Generator Refitting: Shield Power Relay
8339, # Partial Power Plant Manager: Shield Power Relay
8343, # Type-E Power Core Modification: Shield Power Relay
),
16439: ( # Small Solace Scoped Remote Armor Repairer
16437, # Small 'Arup' Remote Armor Repairer
),
16505: ( # Medium Ghoul Compact Energy Nosferatu
16511, # Medium Diminishing Power System Drain I
),
8297: ( # Mark I Compact Shield Flux Coil
8291, # Local Power Plant Manager: Reaction Shield Flux I
),
16455: ( # Large Solace Scoped Remote Armor Repairer
16453, # Large 'Arup' Remote Armor Repairer
),
6485: ( # M51 Benefactor Compact Shield Recharger
6491, # Passive Barrier Compensator I
6489, # 'Benefactor' Ward Reconstructor
6487, # Supplemental Screen Generator I
),
5137: ( # Small Knave Scoped Energy Nosferatu
5135, # E5 Prototype Energy Vampire
),
8579: ( # Medium Murky Compact Remote Shield Booster
8581, # Medium 'Atonement' Remote Shield Booster
),
8531: ( # Small Murky Compact Remote Shield Booster
8533, # Small 'Atonement' Remote Shield Booster
),
16497: ( # Heavy Ghoul Compact Energy Nosferatu
16503, # Heavy Diminishing Power System Drain I
),
4477: ( # Small Gremlin Compact Energy Neutralizer
4475, # Small Unstable Power Fluctuator I
),
8337: ( # Mark I Compact Shield Power Relay
8331, # Local Power Plant Manager: Reaction Shield Power Relay I
),
23416: ( # 'Peace' Large Remote Armor Repairer
22951, # 'Pacifier' Large Remote Armor Repairer
),
5141: ( # Small Ghoul Compact Energy Nosferatu
5139, # Small Diminishing Power System Drain I
),
4471: ( # Small Infectious Scoped Energy Neutralizer
4473, # Small Rudimentary Energy Destabilizer I
),
16469: ( # Medium Infectious Scoped Energy Neutralizer
16465, # Medium Rudimentary Energy Destabilizer I
),
8335: ( # Type-D Restrained Shield Power Relay
8333, # Beta Reactor Control: Shield Power Relay I
),
405: ( # 'Micro' Remote Shield Booster
8631, # Micro Asymmetric Remote Shield Booster
8627, # Micro Murky Remote Shield Booster
8629, # Micro 'Atonement' Remote Shield Booster
8633, # Micro S95a Remote Shield Booster
),
8635: ( # Large Murky Compact Remote Shield Booster
8637, # Large 'Atonement' Remote Shield Booster
),
16507: ( # Medium Knave Scoped Energy Nosferatu
16509, # E50 Prototype Energy Vampire
),
}
def upgrade(saveddata_engine):
# Convert modules
for replacement_item, list in CONVERSIONS.iteritems():
for retired_item in list:
saveddata_engine.execute('UPDATE "modules" SET "itemID" = ? WHERE "itemID" = ?', (replacement_item, retired_item))
saveddata_engine.execute('UPDATE "cargo" SET "itemID" = ? WHERE "itemID" = ?', (replacement_item, retired_item))

View File

@@ -0,0 +1,21 @@
"""
Migration 2
- Includes old upgrade paths pre-1.5.0. See GH issue #190 for why this is needed
"""
import sqlalchemy
def upgrade(saveddata_engine):
# Update characters schema to include default chars
try:
saveddata_engine.execute("SELECT defaultChar, chars FROM characters LIMIT 1")
except sqlalchemy.exc.DatabaseError:
saveddata_engine.execute("ALTER TABLE characters ADD COLUMN defaultChar INTEGER")
saveddata_engine.execute("ALTER TABLE characters ADD COLUMN chars VARCHAR")
# Update fits schema to include booster attribute
try:
saveddata_engine.execute("SELECT booster FROM fits LIMIT 1")
except sqlalchemy.exc.DatabaseError:
saveddata_engine.execute("ALTER TABLE fits ADD COLUMN booster BOOLEAN")

View File

@@ -0,0 +1,13 @@
"""
Migration 3
- Adds mode column for fits (t3 dessy)
"""
import sqlalchemy
def upgrade(saveddata_engine):
try:
saveddata_engine.execute("SELECT modeID FROM fits LIMIT 1")
except sqlalchemy.exc.DatabaseError:
saveddata_engine.execute("ALTER TABLE fits ADD COLUMN modeID INTEGER")

View File

@@ -0,0 +1,141 @@
"""
Migration 4
- Converts modules based on Proteus Module Tiericide
Some modules have been unpublished (and unpublished module attributes are removed
from database), which causes pyfa to crash. We therefore replace these
modules with their new replacements
Based on http://community.eveonline.com/news/patch-notes/patch-notes-for-proteus/
and output of itemDiff.py
"""
CONVERSIONS = {
506: ( # 'Basic' Capacitor Power Relay
8205, # Alpha Reactor Control: Capacitor Power Relay
8209, # Marked Generator Refitting: Capacitor Power Relay
8203, # Partial Power Plant Manager: Capacity Power Relay
8207, # Type-E Power Core Modification: Capacitor Power Relay
),
8177: ( # Mark I Compact Capacitor Power Relay
8173, # Beta Reactor Control: Capacitor Power Relay I
),
8175: ( # Type-D Restrained Capacitor Power Relay
8171, # Local Power Plant Manager: Capacity Power Relay I
),
421: ( # 'Basic' Capacitor Recharger
4425, # AGM Capacitor Charge Array,
4421, # F-a10 Buffer Capacitor Regenerator
4423, # Industrial Capacitor Recharger
4427, # Secondary Parallel Link-Capacitor
),
4435: ( # Eutectic Compact Cap Recharger
4433, # Barton Reactor Capacitor Recharger I
4431, # F-b10 Nominal Capacitor Regenerator
4437, # Fixed Parallel Link-Capacitor I
),
1315: ( # 'Basic' Expanded Cargohold
5483, # Alpha Hull Mod Expanded Cargo
5479, # Marked Modified SS Expanded Cargo
5481, # Partial Hull Conversion Expanded Cargo
5485, # Type-E Altered SS Expanded Cargo
),
5493: ( # Type-D Restrained Expanded Cargo
5491, # Beta Hull Mod Expanded Cargo
5489, # Local Hull Conversion Expanded Cargo I
5487, # Mark I Modified SS Expanded Cargo
),
1401: ( # 'Basic' Inertial Stabilizers
5523, # Alpha Hull Mod Inertial Stabilizers
5521, # Partial Hull Conversion Inertial Stabilizers
5525, # Type-E Altered SS Inertial Stabilizers
),
5533: ( # Type-D Restrained Inertial Stabilizers
5531, # Beta Hull Mod Inertial Stabilizers
5529, # Local Hull Conversion Inertial Stabilizers I
5527, # Mark I Modified SS Inertial Stabilizers
5519, # Marked Modified SS Inertial Stabilizers
),
5239: ( # EP-S Gaussian Scoped Mining Laser
5241, # Dual Diode Mining Laser I
),
5233: ( # Single Diode Basic Mining Laser
5231, # EP-R Argon Ion Basic Excavation Pulse
5237, # Rubin Basic Particle Bore Stream
5235, # Xenon Basic Drilling Beam
),
5245: ( # Particle Bore Compact Mining Laser
5243, # XeCl Drilling Beam I
),
22619: ( # Frigoris Restrained Ice Harvester Upgrade
22617, # Crisium Ice Harvester Upgrade
),
22611: ( # Elara Restrained Mining Laser Upgrade
22609, # Erin Mining Laser Upgrade
),
1242: ( # 'Basic' Nanofiber Internal Structure
5591, # Alpha Hull Mod Nanofiber Structure
5595, # Marked Modified SS Nanofiber Structure
5559, # Partial Hull Conversion Nanofiber Structure
5593, # Type-E Altered SS Nanofiber Structure
),
5599: ( # Type-D Restrained Nanofiber Structure
5597, # Beta Hull Mod Nanofiber Structure
5561, # Local Hull Conversion Nanofiber Structure I
5601, # Mark I Modified SS Nanofiber Structure
),
1192: ( # 'Basic' Overdrive Injector System
5613, # Alpha Hull Mod Overdrive Injector
5617, # Marked Modified SS Overdrive Injector
5611, # Partial Hull Conversion Overdrive Injector
5615, # Type-E Altered SS Overdrive Injector
),
5631: ( # Type-D Restrained Overdrive Injector
5629, # Beta Hull Mod Overdrive Injector
5627, # Local Hull Conversion Overdrive Injector I
5633, # Mark I Modified SS Overdrive Injector
),
1537: ( # 'Basic' Power Diagnostic System
8213, # Alpha Reactor Control: Diagnostic System
8217, # Marked Generator Refitting: Diagnostic System
8211, # Partial Power Plant Manager: Diagnostic System
8215, # Type-E Power Core Modification: Diagnostic System
8255, # Type-E Power Core Modification: Reaction Control
),
8225: ( # Mark I Compact Power Diagnostic System
8221, # Beta Reactor Control: Diagnostic System I
8219, # Local Power Plant Manager: Diagnostic System I
8223, # Type-D Power Core Modification: Diagnostic System
),
1240: ( # 'Basic' Reinforced Bulkheads
5677, # Alpha Hull Mod Reinforced Bulkheads
5681, # Marked Modified SS Reinforced Bulkheads
5675, # Partial Hull Conversion Reinforced Bulkheads
5679, # Type-E Altered SS Reinforced Bulkheads
),
5649: ( # Mark I Compact Reinforced Bulkheads
5645, # Beta Hull Mod Reinforced Bulkheads
),
5647: ( # Type-D Restrained Reinforced Bulkheads
5643, # Local Hull Conversion Reinforced Bulkheads I
),
}
def upgrade(saveddata_engine):
# Convert modules
for replacement_item, list in CONVERSIONS.iteritems():
for retired_item in list:
saveddata_engine.execute('UPDATE "modules" SET "itemID" = ? WHERE "itemID" = ?', (replacement_item, retired_item))
saveddata_engine.execute('UPDATE "cargo" SET "itemID" = ? WHERE "itemID" = ?', (replacement_item, retired_item))

View File

@@ -0,0 +1,8 @@
"""
Migration 5
Simply deletes damage profiles with a blank name. See GH issue #256
"""
def upgrade(saveddata_engine):
saveddata_engine.execute('DELETE FROM damagePatterns WHERE name LIKE ?', ("",))

View File

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

View File

@@ -0,0 +1,24 @@
"""
Migration 7
- Converts Scorpion Ishukone Watch to Scorpion
Mosaic introduced proper skinning system, and Ishukone Scorp
was the only ship which was presented as stand-alone ship in
Pyfa.
"""
CONVERSIONS = {
640: ( # Scorpion
4005, # Scorpion Ishukone Watch
)
}
def upgrade(saveddata_engine):
# Convert ships
for replacement_item, list in CONVERSIONS.iteritems():
for retired_item in list:
saveddata_engine.execute('UPDATE "fits" SET "shipID" = ? WHERE "shipID" = ?', (replacement_item, retired_item))

View File

@@ -0,0 +1,85 @@
"""
Migration 8
- Converts modules based on Carnyx Module Tiericide
Some modules have been unpublished (and unpublished module attributes are removed
from database), which causes pyfa to crash. We therefore replace these
modules with their new replacements
"""
CONVERSIONS = {
8529: ( # Large F-S9 Regolith Compact Shield Extender
8409, # Large Subordinate Screen Stabilizer I
),
8419: ( # Large Azeotropic Restrained Shield Extender
8489, # Large Supplemental Barrier Emitter I
),
8517: ( # Medium F-S9 Regolith Compact Shield Extender
8397, # Medium Subordinate Screen Stabilizer I
),
8433: ( # Medium Azeotropic Restrained Shield Extender
8477, # Medium Supplemental Barrier Emitter I
),
20627: ( # Small 'Trapper' Shield Extender
8437, # Micro Azeotropic Ward Salubrity I
8505, # Micro F-S9 Regolith Shield Induction
3849, # Micro Shield Extender I
3851, # Micro Shield Extender II
8387, # Micro Subordinate Screen Stabilizer I
8465, # Micro Supplemental Barrier Emitter I
),
8521: ( # Small F-S9 Regolith Compact Shield Extender
8401, # Small Subordinate Screen Stabilizer I
),
8427: ( # Small Azeotropic Restrained Shield Extender
8481, # Small Supplemental Barrier Emitter I
),
11343: ( # 100mm Crystalline Carbonide Restrained Plates
11345, # 100mm Reinforced Nanofiber Plates I
),
11341: ( # 100mm Rolled Tungsten Compact Plates
11339, # 100mm Reinforced Titanium Plates I
),
11327: ( # 1600mm Crystalline Carbonide Restrained Plates
11329, # 1600mm Reinforced Nanofiber Plates I
),
11325: ( # 1600mm Rolled Tungsten Compact Plates
11323, # 1600mm Reinforced Titanium Plates I
),
11351: ( # 200mm Crystalline Carbonide Restrained Plates
11353, # 200mm Reinforced Nanofiber Plates I
),
11349: ( # 200mm Rolled Tungsten Compact Plates
11347, # 200mm Reinforced Titanium Plates I
),
11311: ( # 400mm Crystalline Carbonide Restrained Plates
11313, # 400mm Reinforced Nanofiber Plates I
),
11309: ( # 400mm Rolled Tungsten Compact Plates
11307, # 400mm Reinforced Titanium Plates I
),
23791: ( # 'Citadella' 100mm Steel Plates
11335, # 50mm Reinforced Crystalline Carbonide Plates I
11337, # 50mm Reinforced Nanofiber Plates I
11333, # 50mm Reinforced Rolled Tungsten Plates I
11291, # 50mm Reinforced Steel Plates I
20343, # 50mm Reinforced Steel Plates II
11331, # 50mm Reinforced Titanium Plates I
),
11319: ( # 800mm Crystalline Carbonide Restrained Plates
11321, # 800mm Reinforced Nanofiber Plates I
),
11317: ( # 800mm Rolled Tungsten Compact Plates
11315, # 800mm Reinforced Titanium Plates I
),
}
def upgrade(saveddata_engine):
# Convert modules
for replacement_item, list in CONVERSIONS.iteritems():
for retired_item in list:
saveddata_engine.execute('UPDATE "modules" SET "itemID" = ? WHERE "itemID" = ?', (replacement_item, retired_item))
saveddata_engine.execute('UPDATE "cargo" SET "itemID" = ? WHERE "itemID" = ?', (replacement_item, retired_item))

View File

@@ -0,0 +1,23 @@
"""
Migration 9
Effectively drops UNIQUE constraint from boosters table. SQLite does not support
this, so we have to copy the table to the updated schema and then rename it
"""
tmpTable = """
CREATE TABLE boostersTemp (
'ID' INTEGER NOT NULL,
'itemID' INTEGER,
'fitID' INTEGER NOT NULL,
'active' BOOLEAN,
PRIMARY KEY(ID),
FOREIGN KEY('fitID') REFERENCES fits ('ID')
)
"""
def upgrade(saveddata_engine):
saveddata_engine.execute(tmpTable)
saveddata_engine.execute("INSERT INTO boostersTemp (ID, itemID, fitID, active) SELECT ID, itemID, fitID, active FROM boosters")
saveddata_engine.execute("DROP TABLE boosters")
saveddata_engine.execute("ALTER TABLE boostersTemp RENAME TO boosters")

View File

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

View File

@@ -29,7 +29,7 @@ boosters_table = Table("boosters", saveddata_meta,
Column("itemID", Integer),
Column("fitID", Integer, ForeignKey("fits.ID"), nullable = False),
Column("active", Boolean),
UniqueConstraint("itemID", "fitID"))
)
activeSideEffects_table = Table("boostersActiveSideEffects", saveddata_meta,
Column("boosterID", ForeignKey("boosters.ID"), primary_key = True),

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

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

View File

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

View File

@@ -0,0 +1,31 @@
#===============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of eos.
#
# eos is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# eos is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with eos. If not, see <http://www.gnu.org/licenses/>.
#===============================================================================
from sqlalchemy import Table, Column, Integer, Float
from sqlalchemy.orm import mapper
from eos.db import saveddata_meta
from eos.types import Override
overrides_table = Table("overrides", saveddata_meta,
Column("itemID", Integer, primary_key=True, index = True),
Column("attrID", Integer, primary_key=True, index = True),
Column("value", Float, nullable = False))
mapper(Override, overrides_table)

View File

@@ -19,7 +19,8 @@
from eos.db.util import processEager, processWhere
from eos.db import saveddata_session, sd_lock
from eos.types import User, Character, Fit, Price, DamagePattern, Fleet, MiscData, Wing, Squad
from eos.types import User, Character, Fit, Price, DamagePattern, Fleet, MiscData, Wing, Squad, TargetResists, Override, CrestChar
from eos.db.saveddata.fleet import squadmembers_table
from eos.db.saveddata.fit import projectedFits_table
from sqlalchemy.sql import and_
@@ -182,9 +183,15 @@ def getFit(lookfor, eager=None):
else:
eager = processEager(eager)
with sd_lock:
fit = saveddata_session.query(Fit).options(*eager).filter(Fit.ID == fitID).first()
fit = saveddata_session.query(Fit).options(*eager).filter(Fit.ID == lookfor).first()
else:
raise TypeError("Need integer as argument")
if fit and fit.isInvalid:
with sd_lock:
removeInvalid([fit])
return None
return fit
@cachedQuery(Fleet, 1, "fleetID")
@@ -244,9 +251,10 @@ def getFitsWithShip(shipID, ownerID=None, where=None, eager=None):
filter = processWhere(filter, where)
eager = processEager(eager)
with sd_lock:
fits = saveddata_session.query(Fit).options(*eager).filter(filter).all()
fits = removeInvalid(saveddata_session.query(Fit).options(*eager).filter(filter).all())
else:
raise TypeError("ShipID must be integer")
return fits
def getBoosterFits(ownerID=None, where=None, eager=None):
@@ -264,9 +272,15 @@ def getBoosterFits(ownerID=None, where=None, eager=None):
filter = processWhere(filter, where)
eager = processEager(eager)
with sd_lock:
fits = saveddata_session.query(Fit).options(*eager).filter(filter).all()
fits = removeInvalid(saveddata_session.query(Fit).options(*eager).filter(filter).all())
return fits
def countAllFits():
with sd_lock:
count = saveddata_session.query(Fit).count()
return count
def countFitsWithShip(shipID, ownerID=None, where=None, eager=None):
"""
Get all the fits using a certain ship.
@@ -290,7 +304,8 @@ def countFitsWithShip(shipID, ownerID=None, where=None, eager=None):
def getFitList(eager=None):
eager = processEager(eager)
with sd_lock:
fits = saveddata_session.query(Fit).options(*eager).all()
fits = removeInvalid(saveddata_session.query(Fit).options(*eager).all())
return fits
def getFleetList(eager=None):
@@ -308,6 +323,12 @@ def getPrice(typeID):
raise TypeError("Need integer as argument")
return price
def clearPrices():
with sd_lock:
deleted_rows = saveddata_session.query(Price).delete()
commit()
return deleted_rows
def getMiscData(field):
if isinstance(field, basestring):
with sd_lock:
@@ -322,6 +343,12 @@ def getDamagePatternList(eager=None):
patterns = saveddata_session.query(DamagePattern).options(*eager).all()
return patterns
def getTargetResistsList(eager=None):
eager = processEager(eager)
with sd_lock:
patterns = saveddata_session.query(TargetResists).options(*eager).all()
return patterns
@cachedQuery(DamagePattern, 1, "lookfor")
def getDamagePattern(lookfor, eager=None):
if isinstance(lookfor, int):
@@ -340,6 +367,24 @@ def getDamagePattern(lookfor, eager=None):
raise TypeError("Need integer or string as argument")
return pattern
@cachedQuery(TargetResists, 1, "lookfor")
def getTargetResists(lookfor, eager=None):
if isinstance(lookfor, int):
if eager is None:
with sd_lock:
pattern = saveddata_session.query(TargetResists).get(lookfor)
else:
eager = processEager(eager)
with sd_lock:
pattern = saveddata_session.query(TargetResists).options(*eager).filter(TargetResists.ID == lookfor).first()
elif isinstance(lookfor, basestring):
eager = processEager(eager)
with sd_lock:
pattern = saveddata_session.query(TargetResists).options(*eager).filter(TargetResists.name == lookfor).first()
else:
raise TypeError("Need integer or string as argument")
return pattern
def searchFits(nameLike, where=None, eager=None):
if not isinstance(nameLike, basestring):
raise TypeError("Need string as argument")
@@ -350,7 +395,8 @@ def searchFits(nameLike, where=None, eager=None):
filter = processWhere(Fit.name.like(nameLike, escape="\\"), where)
eager = processEager(eager)
with sd_lock:
fits = saveddata_session.query(Fit).options(*eager).filter(filter).all()
fits = removeInvalid(saveddata_session.query(Fit).options(*eager).filter(filter).all())
return fits
def getSquadsIDsWithFitID(fitID):
@@ -361,7 +407,7 @@ def getSquadsIDsWithFitID(fitID):
return squads
else:
raise TypeError("Need integer as argument")
def getProjectedFits(fitID):
if isinstance(fitID, int):
with sd_lock:
@@ -369,7 +415,56 @@ def getProjectedFits(fitID):
fits = saveddata_session.query(Fit).filter(filter).all()
return fits
else:
raise TypeError("Need integer as argument")
raise TypeError("Need integer as argument")
def getCrestCharacters(eager=None):
eager = processEager(eager)
with sd_lock:
characters = saveddata_session.query(CrestChar).options(*eager).all()
return characters
@cachedQuery(CrestChar, 1, "lookfor")
def getCrestCharacter(lookfor, eager=None):
if isinstance(lookfor, int):
if eager is None:
with sd_lock:
character = saveddata_session.query(CrestChar).get(lookfor)
else:
eager = processEager(eager)
with sd_lock:
character = saveddata_session.query(CrestChar).options(*eager).filter(CrestChar.ID == lookfor).first()
elif isinstance(lookfor, basestring):
eager = processEager(eager)
with sd_lock:
character = saveddata_session.query(CrestChar).options(*eager).filter(CrestChar.name == lookfor).first()
else:
raise TypeError("Need integer or string as argument")
return character
def getOverrides(itemID, eager=None):
if isinstance(itemID, int):
return saveddata_session.query(Override).filter(Override.itemID == itemID).all()
else:
raise TypeError("Need integer as argument")
def clearOverrides():
with sd_lock:
deleted_rows = saveddata_session.query(Override).delete()
commit()
return deleted_rows
def getAllOverrides(eager=None):
return saveddata_session.query(Override).all()
def removeInvalid(fits):
invalids = [f for f in fits if f.isInvalid]
if invalids:
map(fits.remove, invalids)
map(saveddata_session.delete, invalids)
saveddata_session.commit()
return fits
def add(stuff):
with sd_lock:

View File

@@ -0,0 +1,35 @@
#===============================================================================
# Copyright (C) 2014 Ryan Holmes
#
# 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, Float, ForeignKey, String
from sqlalchemy.orm import mapper
from eos.db import saveddata_meta
from eos.types import TargetResists
targetResists_table = Table("targetResists", saveddata_meta,
Column("ID", Integer, primary_key = True),
Column("name", String),
Column("emAmount", Float),
Column("thermalAmount", Float),
Column("kineticAmount", Float),
Column("explosiveAmount", Float),
Column("ownerID", ForeignKey("users.ID"), nullable=True))
mapper(TargetResists, targetResists_table)

View File

@@ -17,8 +17,12 @@
# along with eos. If not, see <http://www.gnu.org/licenses/>.
#===============================================================================
#from sqlalchemy.orm.attributes import flag_modified
import eos.db
import eos.types
import logging
logger = logging.getLogger(__name__)
class HandledList(list):
def filteredItemPreAssign(self, filter, *args, **kwargs):
@@ -101,6 +105,14 @@ class HandledList(list):
except AttributeError:
pass
def remove(self, thing):
# We must flag it as modified, otherwise it not be removed from the database
# @todo: flag_modified isn't in os x skel. need to rebuild to include
#flag_modified(thing, "itemID")
if thing.isInvalid: # see GH issue #324
thing.itemID = 0
list.remove(self, thing)
class HandledModuleList(HandledList):
def append(self, mod):
emptyPosition = float("Inf")
@@ -115,10 +127,14 @@ class HandledModuleList(HandledList):
del self[emptyPosition]
mod.position = emptyPosition
HandledList.insert(self, emptyPosition, mod)
if mod.isInvalid:
self.remove(mod)
return
mod.position = len(self)
HandledList.append(self, mod)
if mod.isInvalid:
self.remove(mod)
def insert(self, index, mod):
mod.position = index
@@ -143,139 +159,82 @@ class HandledModuleList(HandledList):
dummy.position = index
self[index] = dummy
def toModule(self, index, mod):
mod.position = index
self[index] = mod
def freeSlot(self, slot):
for i in range(len(self) -1, -1, -1):
mod = self[i]
if mod.getModifiedItemAttr("subSystemSlot") == slot:
del self[i]
class HandledDroneList(HandledList):
class HandledDroneCargoList(HandledList):
def find(self, item):
for d in self:
if d.item == item:
yield d
for o in self:
if o.item == item:
yield o
def findFirst(self, item):
for d in self.find(item):
return d
for o in self.find(item):
return o
def append(self, drone):
list.append(self, drone)
def append(self, thing):
HandledList.append(self, thing)
def remove(self, drone):
HandledList.remove(self, drone)
def appendItem(self, item, amount = 1):
if amount < 1: ValueError("Amount of drones to add should be >= 1")
d = self.findFirst(item)
if d is None:
d = eos.types.Drone(item)
self.append(d)
d.amount += amount
return d
def removeItem(self, item, amount):
if amount < 1: ValueError("Amount of drones to remove should be >= 1")
d = self.findFirst(item)
if d is None: return
d.amount -= amount
if d.amount <= 0:
self.remove(d)
return None
return d
class HandledCargoList(HandledList):
# shameless copy of HandledDroneList
# I have no idea what this does, but I needed it
# @todo: investigate this
def find(self, item):
for d in self:
if d.item == item:
yield d
def findFirst(self, item):
for d in self.find(item):
return d
def append(self, cargo):
list.append(self, cargo)
def remove(self, cargo):
HandledList.remove(self, cargo)
def appendItem(self, item, qty = 1):
if qty < 1: ValueError("Amount of cargo to add should be >= 1")
d = self.findFirst(item)
if d is None:
d = eos.types.Cargo(item)
self.append(d)
d.qty += qty
return d
def removeItem(self, item, qty):
if qty < 1: ValueError("Amount of cargo to remove should be >= 1")
d = self.findFirst(item)
if d is None: return
d.qty -= qty
if d.qty <= 0:
self.remove(d)
return None
return d
if thing.isInvalid:
self.remove(thing)
class HandledImplantBoosterList(HandledList):
def __init__(self):
self.__slotCache = {}
def append(self, thing):
if thing.isInvalid:
HandledList.append(self, thing)
self.remove(thing)
return
def append(self, implant):
if self.__slotCache.has_key(implant.slot):
raise ValueError("Implant/Booster slot already in use, remove the old one first or set replace = True")
self.__slotCache[implant.slot] = implant
HandledList.append(self, implant)
# if needed, remove booster that was occupying slot
oldObj = next((m for m in self if m.slot == thing.slot), None)
if oldObj:
logging.info("Slot %d occupied with %s, replacing with %s", thing.slot, oldObj.item.name, thing.item.name)
oldObj.itemID = 0 # hack to remove from DB. See GH issue #324
self.remove(oldObj)
def remove(self, implant):
HandledList.remove(self, implant)
del self.__slotCache[implant.slot]
# While we deleted this implant, in edge case seems like not all references
# to it are removed and object still lives in session; forcibly remove it,
# or otherwise when adding the same booster twice booster's table (typeID, fitID)
# constraint will report database integrity error
# TODO: make a proper fix, probably by adjusting fit-boosters sqlalchemy relationships
eos.db.remove(implant)
def freeSlot(self, slot):
if hasattr(slot, "slot"):
slot = slot.slot
try:
implant = self.__slotCache[slot]
except KeyError:
return False
try:
self.remove(implant)
except ValueError:
return False
return True
HandledList.append(self, thing)
class HandledProjectedModList(HandledList):
def append(self, proj):
if proj.isInvalid:
# we must include it before we remove it. doing it this way ensures
# rows and relationships in database are removed as well
HandledList.append(self, proj)
self.remove(proj)
return
proj.projected = True
isSystemEffect = proj.item.group.name == "Effect Beacon"
if isSystemEffect:
# remove other system effects - only 1 per fit plz
oldEffect = next((m for m in self if m.item.group.name == "Effect Beacon"), None)
if oldEffect:
logging.info("System effect occupied with %s, replacing with %s", oldEffect.item.name, proj.item.name)
self.remove(oldEffect)
HandledList.append(self, proj)
# Remove non-projectable modules
if not proj.item.isType("projected") and not isSystemEffect:
self.remove(proj)
class HandledProjectedDroneList(HandledDroneCargoList):
def append(self, proj):
proj.projected = True
HandledList.append(self, proj)
class HandledProjectedDroneList(HandledDroneList):
def append(self, proj):
proj.projected = True
list.append(self, proj)
class HandledProjectedFitList(HandledList):
def append(self, proj):
proj.projected = True
list.append(self, proj)
# Remove invalid or non-projectable drones
if proj.isInvalid or not proj.item.isType("projected"):
self.remove(proj)
class HandledItem(object):
def preAssignItemAttr(self, *args, **kwargs):

View File

@@ -1,3 +1,5 @@
# accerationControlCapNeedBonusPostPercentCapacitorNeedLocationShipGroupAfterburner
#
# Used by:
# Modules named like: Dynamic Fuel Valve (8 of 8)
type = "passive"

View File

@@ -1,3 +1,5 @@
# accerationControlSkillAb&MwdSpeedBoost
#
# Used by:
# Implant: Zor's Custom Navigation Hyper-Link
# Skill: Acceleration Control

View File

@@ -1,3 +1,5 @@
# accerationControlSpeedFBonusPostPercentSpeedFactorLocationShipGroupAfterburner
#
# Used by:
# Implants named like: Eifyr and Co. 'Rogue' Acceleration Control AC (6 of 6)
type = "passive"

View File

@@ -1,3 +1,5 @@
# accessDifficultyBonusModifierRequiringArchaelogy
#
# Used by:
# Modules named like: Emission Scope Sharpener (8 of 8)
# Implant: Poteque 'Prospector' Archaeology AC-905

View File

@@ -1,3 +1,5 @@
# accessDifficultyBonusModifierRequiringHacking
#
# Used by:
# Modules named like: Memetic Algorithm Bank (8 of 8)
# Implant: Poteque 'Prospector' Environmental Analysis EY-1005

View File

@@ -1,3 +1,5 @@
# adaptiveArmorHardener
#
# Used by:
# Module: Reactive Armor Hardener
type = "active"

View File

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

View File

@@ -1,3 +1,5 @@
# advancedDroneInterfacingMaxGroupDCUSkillLevel
#
# Used by:
# Skill: Advanced Drone Interfacing
type = "passive"

View File

@@ -1,3 +1,5 @@
# afterburnerDurationBonusPostPercentDurationLocationShipModulesRequiringAfterburner
#
# Used by:
# Implants named like: Eifyr and Co. 'Rogue' Afterburner AB (6 of 6)
# Implant: Zor's Custom Navigation Link

View File

@@ -1,7 +1,9 @@
# agilityMultiplierEffect
#
# Used by:
# Modules from group: Inertia Stabilizer (12 of 12)
# Modules from group: Nanofiber Internal Structure (14 of 14)
# Modules from group: Reinforced Bulkhead (12 of 12)
# Modules from group: Inertial Stabilizer (7 of 7)
# Modules from group: Nanofiber Internal Structure (7 of 7)
# Modules from group: Reinforced Bulkhead (8 of 8)
type = "passive"
def handler(fit, module, context):
fit.ship.boostItemAttr("agility",

View File

@@ -1,3 +1,5 @@
# agilityMultiplierEffectPassive
#
# Used by:
# Modules named like: Polycarbon Engine Housing (8 of 8)
type = "passive"

View File

@@ -1,3 +1,5 @@
# ammoFallofMultiplier
#
# Used by:
# Charges from group: Advanced Artillery Ammo (6 of 6)
# Charges from group: Advanced Autocannon Ammo (6 of 6)

View File

@@ -1,5 +1,7 @@
# ammoInfluenceCapNeed
#
# Used by:
# Items from category: Charge (458 of 828)
# Items from category: Charge (458 of 833)
type = "passive"
def handler(fit, module, context):
# Dirty hack to work around cap charges setting cap booster

View File

@@ -1,5 +1,7 @@
# ammoInfluenceRange
#
# Used by:
# Items from category: Charge (559 of 828)
# Items from category: Charge (559 of 833)
type = "passive"
def handler(fit, module, context):
module.multiplyItemAttr("maxRange", module.getModifiedChargeAttr("weaponRangeMultiplier"))

View File

@@ -1,7 +1,9 @@
# ammoSpeedMultiplier
#
# Used by:
# Charges from group: Festival Charges (8 of 8)
# Charges from group: Interdiction Probe (2 of 2)
# Charges from group: Survey Probe (3 of 3)
# Charge: Warp Disrupt Probe
type = "passive"
def handler(fit, module, context):
module.multiplyItemAttr("speed", module.getModifiedChargeAttr("speedMultiplier") or 1)

View File

@@ -1,3 +1,5 @@
# ammoTrackingMultiplier
#
# Used by:
# Charges from group: Advanced Artillery Ammo (6 of 6)
# Charges from group: Advanced Autocannon Ammo (6 of 6)

View File

@@ -1,3 +1,5 @@
# angelsetbonus
#
# Used by:
# Implants named like: grade Halo (18 of 18)
runTime = "early"

View File

@@ -1,3 +1,5 @@
# antiWarpScramblingPassive
#
# Used by:
# Modules from group: Warp Core Stabilizer (8 of 8)
type = "passive"

View File

@@ -1,3 +1,5 @@
# archaeologySkillVirusBonus
#
# Used by:
# Modules named like: Emission Scope Sharpener (8 of 8)
# Implant: Poteque 'Prospector' Archaeology AC-905

View File

@@ -1,3 +1,5 @@
# armorAllRepairSystemsAmountBonusPassive
#
# Used by:
# Implants named like: Exile Booster (4 of 4)
type = "passive"

View File

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

View File

@@ -1,3 +1,5 @@
# armoredSquadronCommand
#
# Used by:
# Skill: Armored Warfare Specialist
runTime = "early"

View File

@@ -1,3 +1,5 @@
# armoredWarfareMindlink
#
# Used by:
# Implant: Armored Warfare Mindlink
# Implant: Federation Navy Warfare Mindlink

View File

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

View File

@@ -1,3 +1,5 @@
# armorHPBonusAddPassive
#
# Used by:
# Subsystems from group: Defensive Systems (16 of 16)
type = "passive"

View File

@@ -1,3 +1,5 @@
# armorHPMultiply
#
# Used by:
# Modules from group: Armor Coating (202 of 202)
# Modules from group: Armor Plating Energized (187 of 187)

View File

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

View File

@@ -1,3 +1,5 @@
# armorRepair
#
# Used by:
# Modules from group: Armor Repair Unit (100 of 100)
runTime = "late"

View File

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

View File

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

View File

@@ -1,3 +1,5 @@
# armorTankingGang
#
# Used by:
# Skill: Armored Warfare
type = "gang"

View File

@@ -1,10 +0,0 @@
# Used by:
# Implant: Armored Warfare Mindlink
# Implant: Federation Navy Warfare Mindlink
# Implant: Imperial Navy Warfare Mindlink
type = "gang", "active"
gangBonus = "armorHpBonus2"
gangBoost = "armorHP"
def handler(fit, module, context):
if "gang" not in context: return
fit.ship.boostItemAttr("armorHP", module.getModifiedItemAttr("armorHpBonus2"))

View File

@@ -1,3 +1,5 @@
# armorUpgradesMassPenaltyReductionBonus
#
# Used by:
# Skill: Armor Layering
type = "passive"

View File

@@ -0,0 +1,12 @@
# armorWarfareArmorHpReplacer
#
# Used by:
# Implant: Armored Warfare Mindlink
# Implant: Federation Navy Warfare Mindlink
# Implant: Imperial Navy Warfare Mindlink
type = "gang", "active"
gangBonus = "armorHpBonus2"
gangBoost = "armorHP"
def handler(fit, module, context):
if "gang" not in context: return
fit.ship.boostItemAttr("armorHP", module.getModifiedItemAttr("armorHpBonus2"))

View File

@@ -1,3 +1,5 @@
# astrogeologyMiningAmountBonusPostPercentMiningAmountLocationShipModulesRequiringMining
#
# Used by:
# Implants named like: Inherent Implants 'Highwall' Mining MX (3 of 3)
# Implant: Michi's Excavation Augmentor

View File

@@ -1,3 +1,5 @@
# baseMaxScanDeviationModifierModuleOnline2None
#
# Used by:
# Variations of module: Scan Pinpointing Array I (2 of 2)
type = "passive"

View File

@@ -1,3 +1,5 @@
# baseMaxScanDeviationModifierRequiringAstrometrics
#
# Used by:
# Implants named like: Poteque 'Prospector' Astrometric Pinpointing AP (3 of 3)
# Skill: Astrometric Pinpointing

View File

@@ -1,3 +1,5 @@
# baseSensorStrengthModifierModule
#
# Used by:
# Variations of module: Scan Rangefinding Array I (2 of 2)
type = "passive"

View File

@@ -1,3 +1,5 @@
# baseSensorStrengthModifierRequiringAstrometrics
#
# Used by:
# Modules from group: Scan Probe Launcher (4 of 7)
# Implants named like: Poteque 'Prospector' Astrometric Rangefinding AR (3 of 3)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,3 +1,5 @@
# bcLargeEnergyTurretCapacitorNeedBonus
#
# Used by:
# Ship: Oracle
type = "passive"

View File

@@ -1,3 +1,5 @@
# bcLargeEnergyTurretCPUNeedBonus
#
# Used by:
# Ship: Oracle
type = "passive"

View File

@@ -1,3 +1,5 @@
# bcLargeEnergyTurretPowerNeedBonus
#
# Used by:
# Ship: Oracle
type = "passive"

View File

@@ -1,3 +1,5 @@
# bcLargeHybridTurretCapacitorNeedBonus
#
# Used by:
# Ship: Naga
# Ship: Talos

View File

@@ -1,3 +1,5 @@
# bcLargeHybridTurretCPUNeedBonus
#
# Used by:
# Ship: Naga
# Ship: Talos

View File

@@ -1,3 +1,5 @@
# bcLargeHybridTurretPowerNeedBonus
#
# Used by:
# Ship: Naga
# Ship: Talos

View File

@@ -1,3 +1,5 @@
# bcLargeProjectileTurretCPUNeedBonus
#
# Used by:
# Ship: Tornado
type = "passive"

View File

@@ -1,3 +1,5 @@
# bcLargeProjectileTurretPowerNeedBonus
#
# Used by:
# Ship: Tornado
type = "passive"

View File

@@ -1,3 +1,5 @@
# biologyTimeBonusFixed
#
# Used by:
# Implants named like: Eifyr and Co. 'Alchemist' Biology BY (2 of 2)
# Skill: Biology

View File

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

View File

@@ -1,3 +1,5 @@
# boosterArmorHpPenalty
#
# Used by:
# Implants from group: Booster (12 of 37)
type = "boosterSideEffect"

View File

@@ -1,3 +1,5 @@
# boosterArmorRepairAmountPenalty
#
# Used by:
# Implants from group: Booster (9 of 37)
type = "boosterSideEffect"

View File

@@ -1,3 +1,5 @@
# boosterCapacitorCapacityPenalty
#
# Used by:
# Implants named like: Blue Pill Booster (3 of 5)
# Implants named like: Exile Booster (3 of 4)

View File

@@ -1,3 +1,5 @@
# boosterMaxVelocityPenalty
#
# Used by:
# Implants from group: Booster (12 of 37)
type = "boosterSideEffect"

View File

@@ -1,3 +1,5 @@
# boosterMissileExplosionCloudPenaltyFixed
#
# Used by:
# Implants named like: Exile Booster (3 of 4)
# Implants named like: Mindflood Booster (3 of 4)

View File

@@ -1,3 +1,5 @@
# boosterMissileExplosionVelocityPenalty
#
# Used by:
# Implants named like: Blue Pill Booster (3 of 5)
type = "boosterSideEffect"

View File

@@ -1,3 +1,5 @@
# boosterMissileVelocityPenalty
#
# Used by:
# Implants named like: Crash Booster (3 of 4)
# Implants named like: X Instinct Booster (3 of 4)

View File

@@ -1,5 +1,7 @@
# boosterModifyBoosterArmorPenalties
#
# Used by:
# Implants named like: Eifyr and Co. 'Alchemist' Nanite Control NC (2 of 2)
# Implants named like: Eifyr and Co. 'Alchemist' Neurotoxin Control NC (2 of 2)
# Implants named like: grade Edge (10 of 12)
# Skill: Neurotoxin Control
type = "passive"

View File

@@ -1,5 +1,7 @@
# boosterModifyBoosterMaxVelocityAndCapacitorPenalty
#
# Used by:
# Implants named like: Eifyr and Co. 'Alchemist' Nanite Control NC (2 of 2)
# Implants named like: Eifyr and Co. 'Alchemist' Neurotoxin Control NC (2 of 2)
# Implants named like: grade Edge (10 of 12)
# Skill: Neurotoxin Control
type = "passive"

View File

@@ -1,5 +1,7 @@
# boosterModifyBoosterMissilePenalty
#
# Used by:
# Implants named like: Eifyr and Co. 'Alchemist' Nanite Control NC (2 of 2)
# Implants named like: Eifyr and Co. 'Alchemist' Neurotoxin Control NC (2 of 2)
# Implants named like: grade Edge (10 of 12)
# Skill: Neurotoxin Control
type = "passive"

View File

@@ -1,5 +1,7 @@
# boosterModifyBoosterShieldPenalty
#
# Used by:
# Implants named like: Eifyr and Co. 'Alchemist' Nanite Control NC (2 of 2)
# Implants named like: Eifyr and Co. 'Alchemist' Neurotoxin Control NC (2 of 2)
# Implants named like: grade Edge (10 of 12)
# Skill: Neurotoxin Control
type = "passive"

View File

@@ -1,5 +1,7 @@
# boosterModifyBoosterTurretPenalty
#
# Used by:
# Implants named like: Eifyr and Co. 'Alchemist' Nanite Control NC (2 of 2)
# Implants named like: Eifyr and Co. 'Alchemist' Neurotoxin Control NC (2 of 2)
# Implants named like: grade Edge (10 of 12)
# Skill: Neurotoxin Control
type = "passive"

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