Compare commits

...

209 Commits

Author SHA1 Message Date
blitzmann
df75646766 bump release 2018-07-17 02:10:24 -04:00
Ryan Holmes
6270d34dfd Merge pull request #1677 from MaruMaruOO/issue/1673
Have missing icons display as question mark icons
2018-07-16 21:00:10 -04:00
Ryan Holmes
497fdd7a11 Merge pull request #1675 from MaruMaruOO/port_bug_fix
Bug fix to set implantLocation when importing fits
2018-07-16 12:09:58 -04:00
MaruMaruOO
6583aa9b34 Have missing icons display as question mark icons 2018-07-16 10:26:29 -04:00
MaruMaruOO
910fe99e44 Bug fix to set implantLocation when importing from clipboard 2018-07-16 08:43:41 -04:00
blitzmann
fc921d2c16 Bump version 2018-07-15 17:44:13 -04:00
blitzmann
b57bede510 tox fixes 2018-07-15 02:51:53 -04:00
blitzmann
d4f719a428 Merge branch 'master' of https://github.com/pyfa-org/Pyfa 2018-07-15 02:38:08 -04:00
Ryan Holmes
6f8ff9255a Merge pull request #1660 from flashspys/patch-2
Make pyfa retina ready
2018-07-15 02:29:46 -04:00
Ryan Holmes
79d4b458c8 Merge pull request #1668 from MaruMaruOO/issue/1667
Added setting for default implant location
2018-07-15 02:29:29 -04:00
Ryan Holmes
c7d9c0e0e0 Merge pull request #1671 from MaruMaruOO/copy_improvements
Added missing data to fit copying
2018-07-15 02:29:00 -04:00
blitzmann
b7be0d0dfb fix database (give name to Small Abyssal Energy Nosferatu - this is a known EVE bug) 2018-07-15 02:20:28 -04:00
blitzmann
475e8f1ff2 Update effect headers and some icons 2018-07-15 01:09:07 -04:00
blitzmann
9298dcd454 Update to 1348988 2018-07-15 00:54:50 -04:00
blitzmann
3b13712db1 Add missing effect 2018-07-15 00:47:50 -04:00
blitzmann
df92b857c9 Add a script to extract the dynamic attribute mappings from the client 2018-07-15 00:47:26 -04:00
MaruMaruOO
d5aee34aa8 Added missing data to fit copying 2018-07-12 07:35:14 -04:00
MaruMaruOO
7a4c7a8f9f Removed excess diagnostic information 2018-07-11 10:28:39 -04:00
Maru Maru
1699b8ceee Add ability to use character implants by default 2018-07-11 05:35:19 -04:00
blitzmann
89efa9cbf9 Fix syntax issue (see #1657) 2018-07-09 22:59:26 -04:00
Ryan Holmes
786864b146 Merge pull request #1663 from MaruMaruOO/patch-1
Fixes the Helios's drone damage bonus.
2018-07-09 22:17:22 -04:00
Ryan Holmes
8383a645da Merge pull request #1652 from WatchMeCalculate/Issue-1621
Address Issue where evemon xml was not being imported
2018-07-09 22:16:07 -04:00
Ryan Holmes
1c579c9134 Merge pull request #1665 from MaruMaruOO/issue/1662
Allow drone skill effects to process implants
2018-07-09 22:12:33 -04:00
Ryan Holmes
b8c09429db Merge pull request #1664 from MaruMaruOO/patch-2
Typo fix for eos.gamedata.translations["Boolean"]
2018-07-09 22:10:21 -04:00
Ryan Holmes
090b61778f Merge pull request #1666 from MaruMaruOO/issue/1657
Make itemStats.closeBtn fire a wx.CloseEvent
2018-07-09 22:07:32 -04:00
MaruMaruOO
29541bc5d9 Make itemStats.closeBtn fire a close event 2018-07-09 05:51:23 -04:00
MaruMaruOO
3fcad7ed3f Allow drone skill effects to process implants 2018-07-09 01:37:40 -04:00
MaruMaruOO
fe951e2ca1 Typo fix for eos.gamedata.translations["Boolean"]
Fix for #1659.
I assume the second argument is a typo given the use case.
If not giving it a default value also works.
2018-07-08 21:44:55 -04:00
MaruMaruOO
0603e0c89d Fixes the Helios's drone damage bonus.
The required skill should be Light Drone Operation as light drones don't require Drone Avionics.
This causes the damage bonus to apply correctly. Giving a max skill Hobgoblin II 29.7dps rather than 19.8dps.
2018-07-06 23:41:34 -04:00
Felix Wehnert
9f580597fd Make pyfa retina ready
This should help pyfa to look better on macOS 📺
2018-07-02 18:55:48 +02:00
blitzmann
819c0ba321 Fix eve db 2018-06-21 00:28:15 -04:00
blitzmann
b68e7d9344 Merge branch 'profile' 2018-06-21 00:24:19 -04:00
blitzmann
86333a05fb Remove redundant import 2018-06-21 00:24:07 -04:00
blitzmann
39f7ecdf5c Merge branch 'mutaplasmids'
# Conflicts:
#	eve.db
2018-06-21 00:22:57 -04:00
blitzmann
6c184e9184 Merge branch 'master' of https://github.com/pyfa-org/Pyfa 2018-06-21 00:21:36 -04:00
blitzmann
c587fa1e84 Merge branch 'issue/1645' 2018-06-21 00:21:08 -04:00
DarkPhoenix
1b932fd885 Implants are not penalized 2018-06-19 16:10:41 +03:00
WatchMeCalculate
99f14746e4 Removed return and re-added apiUpdateCharSheet function 2018-06-19 00:16:32 -07:00
blitzmann
6c6423515c Fix for #1635 2018-06-18 20:55:16 -04:00
blitzmann
15216453c9 Update item attributes panel when mutation changes (#1644) 2018-06-17 13:01:54 -04:00
blitzmann
8f16fc5c1e Merge branch 'master' into mutaplasmids
# Conflicts:
#	eve.db
2018-06-17 12:52:49 -04:00
blitzmann
444f42ceee Change CREST export text to ESI 2018-06-17 12:51:57 -04:00
blitzmann
8bf9a9881f Add some invalidation logic to module for Abyysal modules without base or mutaplasmid 2018-06-17 12:23:05 -04:00
blitzmann
8f5060cc3e Fix some issues capping at a certain range (#1651) 2018-06-17 12:10:33 -04:00
blitzmann
b7458396ac Fix some rounding issues (#1651) 2018-06-17 01:48:51 -04:00
blitzmann
d4dba99363 Properly handle projecting an abyssal module (we now copy modules instead of using the same item ID) 2018-06-17 00:04:34 -04:00
blitzmann
710739696a Incorporate mutaplasmids within module copy 2018-06-16 23:25:27 -04:00
blitzmann
5c566bae73 Introduce special cases for cargo swapping when dealing with abyssal modules (#1649) 2018-06-16 21:50:18 -04:00
blitzmann
4e8e5d86c4 Fix for #1647 2018-06-16 17:04:29 -04:00
blitzmann
7e6fc4e6c2 Fix issue with closing item stats 2018-06-16 15:58:30 -04:00
blitzmann
47016c682e Don't destroy ItemStats window on close. Instead, Skip() the event so that it can finish processing events correctly. (#1650) 2018-06-15 02:27:41 -04:00
blitzmann
eece7de547 Merge branch 'issue/1642' into mutaplasmids 2018-06-15 01:32:03 -04:00
blitzmann
ed94294584 Finish implementing the translated values for the Mutators 2018-06-15 01:31:51 -04:00
blitzmann
634bdab396 Merge branch 'master' of https://github.com/pyfa-org/Pyfa 2018-06-14 22:53:33 -04:00
blitzmann
3462252ecc Automatically check on character load that the character at least has all skills in the database for it (#1645) 2018-06-14 22:53:16 -04:00
blitzmann
5a085b6e27 Automatically check on character load that the character at least has all skills in the database for it (#1645) 2018-06-14 22:52:33 -04:00
blitzmann
12c491a6b3 Merge branch 'mutaplasmids' of https://github.com/pyfa-org/Pyfa into mutaplasmids 2018-06-13 23:11:37 -04:00
Ryan Holmes
4d8240a588 Merge pull request #1643 from burnsypet/mutaplasmids
Added reset and randomize buttons to mutaplasmid view
2018-06-13 23:10:55 -04:00
blitzmann
154b07e0d6 Move the attribute unit translations from the GUI to the Unit class and tweak the display of mutator ranges to use this. Additionally, develop inverse functions to the value translations for eventual use in the mutator slider 2018-06-13 23:10:48 -04:00
burnsypet
59a5b68152 Added reset and randomize buttons to mutaplasmid view 2018-06-13 22:52:36 +01:00
Ryan Holmes
f0a6034cec Merge pull request #1632 from WatchMeCalculate/Issue-#1627
Adds exception handler for when HttpServer fails on init
2018-06-13 00:21:46 -04:00
Ryan Holmes
6224286524 Merge pull request #1639 from burnsypet/issue-1637
HTML export now contains EFT block
2018-06-13 00:20:14 -04:00
Ryan Holmes
eefc84465f Merge pull request #1638 from surculus12/issue-1633
resolves #1633
2018-06-13 00:18:15 -04:00
blitzmann
4fd54ca74a bump beta version 2018-06-12 22:23:57 -04:00
blitzmann
779b9f0821 Fix attribute icons to use new method 2018-06-12 21:51:58 -04:00
blitzmann
3ae10fe483 adding icons 2018-06-12 21:46:31 -04:00
blitzmann
88be999899 update database 2018-06-12 21:46:05 -04:00
blitzmann
6fdcce12a3 Merge branch 'icons-1621' into v2.2.0b1
# Conflicts:
#	eos/db/__init__.py
#	eos/db/gamedata/__init__.py
#	eos/db/gamedata/item.py
#	eos/gamedata.py
#	eve.db
2018-06-12 21:43:28 -04:00
blitzmann
e19d231eba Merge branch 'master' into v2.2.0b1
# Conflicts:
#	eve.db
2018-06-12 21:41:04 -04:00
blitzmann
d4d55c026a tweak font sizes 2018-06-12 21:29:00 -04:00
blitzmann
3ebfe045c5 Catch a rare error with mutators that are kinda orphaned (not via module, but the mod doesn't have base or mutaplasmid) 2018-06-12 21:15:31 -04:00
blitzmann
75230a78a6 Do not explicitly add the mutator to the module. Setting the Mutator.module property is sufficient, and prevents from a duplicate one from being added with a None key. 2018-06-12 20:57:06 -04:00
burnsypet
ab6200e2c1 Fixed line length for PEP8 2018-06-12 20:11:39 +01:00
burnsypet
8a18047957 HTML export now contains EFT block 2018-06-12 19:17:39 +01:00
blitzmann
fccd4b61f4 Recalc fit after a mutator change and 1 sec has passed. This allows for both gui animations to finish and prevent multiple quick changes form clogging everything up) 2018-06-12 01:55:40 -04:00
blitzmann
bceaa0d1d5 Get mutations to save 2018-06-11 23:44:34 -04:00
blitzmann
994521f654 Move some functionality tot he mutator object, and clean some stuff up 2018-06-11 23:09:21 -04:00
surculus12
b7b60e4ea6 resolves #1633 2018-06-11 15:24:17 +00:00
blitzmann
6a03ff59af Attribute graph: add edge on neutral 2018-06-10 02:28:01 -04:00
blitzmann
f8b5adb31d Determine validity via mod, not value (prevents weirdness with negatives) 2018-06-10 01:30:05 -04:00
blitzmann
e8b56b076b Instantiate mutators when a mutated module is created / loaded from DB. Some bug fixes for a few things. 2018-06-10 01:10:53 -04:00
blitzmann
fe47ebd1f5 Merge branch 'attribute_gauge' of https://bitbucket.org/blitzmann/pyfa-playground into attribute_gauge 2018-06-09 20:35:08 -04:00
blitzmann
3b310e9b61 Tweaks to slider logic with respect to negative values 2018-06-09 20:34:59 -04:00
Ryan Holmes
07737a1f6d more refactoring and bug fixes for gui 2018-06-09 11:03:04 -04:00
blitzmann
962789bf63 More tweaks 2018-06-09 09:49:32 -04:00
blitzmann
ab2d6dbf3a Flesh out a lot of the small graphical specifics. Stilll needs a bit of work and a few bugs worked out, but I feel it's coming along. 2018-06-08 22:34:15 -04:00
blitzmann
542f2b3061 More tweaks 2018-06-07 19:38:40 -04:00
WatchMeCalculate
abefe21796 Adds exception handler for when HttpServer fails on init 2018-06-05 23:42:00 -07:00
blitzmann
cc529d3499 Penalized drone velocity rigs (#1630) 2018-06-06 00:25:45 -04:00
blitzmann
aee225d11a Only apply thermodynamics skill to modules with heatDamage attribute 2018-06-05 23:59:01 -04:00
Ryan Holmes
0b45438981 Merge pull request #1626 from WatchMeCalculate/Issue-#1519
Issue #1519, on fitting restriction toggle, accurately keep valid modules
2018-06-05 20:26:16 -04:00
DarkPhoenix
d48f9354ec Update database (vedmak fitting changes) and do relevant string updates
Also change jsontosql script to ignore fsdtypeoverrides which is no longer dumpable by phobos
2018-06-05 20:02:00 +03:00
blitzmann
58b422a6d9 Add a bunch of tests, and get it looking just right. Still need to do some general cleanup 2018-06-05 09:02:15 -04:00
blitzmann
b1dce3b7b6 Changes to attribute slider, and thinking about dropping it in support of a modified pyfa gauge 2018-06-04 22:55:34 -04:00
blitzmann
460ba81d44 Some tweaks to the attribute slider 2018-06-04 19:18:18 -04:00
Ryan Holmes
e01699f738 Add a SetValue method to the attribute slider 2018-06-04 17:24:49 -04:00
blitzmann
c9f555a860 Move the slider to another file (makes it easier to test), and adjust the logic so that the base value is always considered in the center, no matter the skew of the ranges 2018-06-04 02:53:14 -04:00
blitzmann
b3acc8fd21 Get a slider interface going for the items stats. Starting to come together! 2018-06-04 02:21:52 -04:00
blitzmann
3670f3289c Convert a module to an abyssal with a mutaplasmid - saving to and loading from database confirmed. 2018-06-03 19:50:50 -04:00
blitzmann
04171b243b Get the mutaplasmid context men working to display the mutaplasmids 2018-06-03 16:48:31 -04:00
blitzmann
20f57146c4 Merge branch 'master' into mutaplasmids
# Conflicts:
#	eve.db
2018-06-03 16:31:20 -04:00
blitzmann
012c5f536b Add mutaplasmid context menu 2018-06-03 16:29:00 -04:00
blitzmann
3fbd869821 Get some basic relationships added for mutaplasmids 2018-06-03 16:28:33 -04:00
blitzmann
19cf3c2036 Update various GUI things to show new location for ship icon 2018-06-02 14:54:59 -04:00
blitzmann
18bbe49c49 support renders 2018-06-02 14:34:00 -04:00
blitzmann
e806471b47 Run icon script to remove the clothing icons 2018-06-02 14:10:37 -04:00
blitzmann
59d56fc333 Remove clothing form the database 2018-06-02 14:04:34 -04:00
blitzmann
926299c20e Add process for getting graphic ids from fsdbinary (not utilizing them yet) 2018-06-02 11:58:38 -04:00
blitzmann
e8d5e9f9f2 More icons fixes 2018-06-02 10:18:56 -04:00
WatchMeCalculate
a5b5cec919 Fixed flake8 issues 2018-06-01 13:08:25 -07:00
Ryan Holmes
bb978c3dff Implement a profiling option. x_x 2018-06-01 15:46:45 -04:00
WatchMeCalculate
cbb8545c30 If module had previously violated fitting restrictions, but now is a valid module, recolor background 2018-06-01 02:22:29 -07:00
WatchMeCalculate
87660246b6 When re-enabling restrictions only delete incompatible modules
Hardpoints past limit will show up highlighted red.
2018-06-01 02:19:14 -07:00
WatchMeCalculate
cc586f6532 For modules with maxfitting, ensure on validity count, don't count itself 2018-06-01 02:18:03 -07:00
WatchMeCalculate
02103b6d2e Refactor checking if Hardpoints has free spots into a function fit can use 2018-06-01 02:16:29 -07:00
blitzmann
94b1876cf1 icon script tweak 2018-05-31 21:36:22 -04:00
blitzmann
8bb3cbb25e More icon fixes 2018-05-31 21:20:47 -04:00
blitzmann
5388ba7a70 Remove need for Icon class, references to it's DB relationship, and remove from DB. Also, add the files. All the files. 2018-05-31 21:13:12 -04:00
blitzmann
ff1d8109cd Start updating the icons script. You can now point it at an EVE installation and an icons.json, which is generated via the icons.yaml from from the SDE (for now, unless we can figure out how to access that info form the res files. it's in CCPs format).
Lots of old stuff still here, needs cleanup. We no longer restrict the queries to certain categories / groups, seemed like extra logic to remember whenever new stuff is potentially added.
2018-05-31 21:09:35 -04:00
DarkPhoenix
408e1246c7 Reduce font size for chrome tabs 2018-05-31 14:47:38 +03:00
DarkPhoenix
051e601f14 Use system font for fitting pane 2018-05-31 13:26:54 +03:00
blitzmann
fb5849e43e Bump version 2018-05-31 01:03:14 -04:00
blitzmann
367b26816b Add some missing stuffs in the manifest (don't know if needed) 2018-05-31 00:54:54 -04:00
blitzmann
e3bec84d31 Tweaks to the Inno Setup file 2018-05-31 00:44:31 -04:00
blitzmann
d92ccffc8d Test a few fixes for the windows installer 2018-05-31 00:01:36 -04:00
blitzmann
e8efa22a95 Merge branch 'singularity' 2018-05-30 19:49:40 -04:00
blitzmann
861d034635 Bump version 2018-05-30 19:49:21 -04:00
blitzmann
7a18224800 pep8 2018-05-30 19:34:14 -04:00
Ryan Holmes
92a906611b Merge pull request #1619 from fsufitch/master
Tweak jargon defaults for more entries based on personal experience
2018-05-30 15:53:27 -04:00
Filip Sufitchi
6fc532a6a2 Tweak jargon defaults for more entries based on personal experience 2018-05-30 15:31:12 -04:00
blitzmann
d0777602e7 Clean up unused effect files now that the effects script works (hopefully) 2018-05-29 21:49:32 -04:00
blitzmann
618507f88c Fix the effects used by script (no longer restricted on category / group), and fix many effects headers 2018-05-29 21:43:25 -04:00
blitzmann
c5bc9e2534 Added missing effectsm, and update headers 2018-05-29 21:39:11 -04:00
blitzmann
b097818f1b Do not allow import of unpublished items (temporary measure to prevent abyssal items) 2018-05-29 21:01:55 -04:00
blitzmann
ba2471e75c Add new icons files 2018-05-29 20:15:05 -04:00
blitzmann
de7a5361fd Add triglavian icon to ship browser 2018-05-29 19:58:59 -04:00
blitzmann
0827e13b31 Add some missing icons 2018-05-29 19:40:55 -04:00
blitzmann
ec2bf8d4ed Update renders 2018-05-29 19:40:01 -04:00
blitzmann
8ab709e590 * Update database (unpublish Abyssal items, for now)
* Add eve data version and datetime to about window (temp measure until we can get a better about window implemented)
2018-05-29 19:37:55 -04:00
Ryan Holmes
efe974f8f9 Merge pull request #1616 from WatchMeCalculate/issue-#1599
Remove asterisk next to character name after API refresh
2018-05-28 17:55:23 -04:00
WatchMeCalculate
da85c66089 Make sure to clear dirty skills when clearing all skills 2018-05-28 13:33:19 -07:00
blitzmann
a02f863bc8 update database 2018-05-27 17:30:12 -04:00
blitzmann
553a181966 Merge branch 'abysmal_weather' into singularity
# Conflicts:
#	eve.db
2018-05-27 17:25:47 -04:00
blitzmann
4a1e4853fb fix issue with display 2018-05-27 17:25:04 -04:00
blitzmann
9f560584ce Fix fighter DPS graph (#1521) 2018-05-27 16:29:47 -04:00
blitzmann
670f19ce95 fixed attribute export (#1613) 2018-05-27 16:25:10 -04:00
blitzmann
3944545721 Support for Abyssal module loading base item attributes 2018-05-27 14:58:14 -04:00
blitzmann
a706da8adc Remove some of the redundant jargon keywords 2018-05-27 12:12:20 -04:00
Ryan Holmes
829fd12163 Merge pull request #1575 from ftsartek/patch-1
Jargon defaults updated for significantly more options
2018-05-27 12:08:55 -04:00
Ryan Holmes
b5addc8a87 Merge pull request #1609 from minlexx/copy_text
Copy text from item traits and desription panels
2018-05-26 22:35:24 -04:00
Alexey Min
8cb592db6f Make item description copyable 2018-05-26 14:34:54 +03:00
Alexey Min
be21fec2d2 Make item traits copyable 2018-05-26 14:34:40 +03:00
blitzmann
154ac6b045 forgot the DB 2018-05-25 23:20:36 -04:00
blitzmann
d3bd52fe07 Get dynamic attributes JSON saved to the database... now for the tinkering to begin! 2018-05-25 19:18:51 -04:00
DarkPhoenix
d4beba8b7b Fix ammo picker for disintegrators 2018-05-24 14:35:17 +03:00
DarkPhoenix
4141a9df45 Do not show falloff range if it's too low (disintegrators fetch base value of 1 and show it) 2018-05-24 14:32:35 +03:00
DarkPhoenix
b6181f8ad6 Update db to latest sisi 2018-05-24 09:37:54 +03:00
blitzmann
fabf759aa7 Start implementing support for mutaplasmids.
* There's a new table `mutators` that has an FK back to a module, and links to an attribute ID with it's new value
* Fixes an issue in the item state where the "base" value showed the literal base value for the attribute, regardless of override / mutators
* If there is an override and a mutated attribute, mutated value takes effect
2018-05-24 01:26:49 -04:00
blitzmann
c0f34f1117 update database, and a code tweak 2018-05-23 01:12:46 -04:00
blitzmann
5cf9e0c4ff Merge branch 'singularity' into abysmal_weather
# Conflicts:
#	eve.db
2018-05-23 00:49:29 -04:00
blitzmann
33d4a8a691 update database 2018-05-23 00:46:51 -04:00
blitzmann
9268dc36bf Give the abyssal effect name some custom, directed loving. Mmm. 2018-05-23 00:45:11 -04:00
blitzmann
e95cbdd19b Re-work the wormhole (now call Environmental) context menu 2018-05-23 00:38:30 -04:00
blitzmann
c4177f8911 Remove .zip check for img files (no longer part of build, wondering if this is causing slow start up times) 2018-05-22 00:06:06 -04:00
blitzmann
eaae51f8d8 Add status messages back to ESI fitting export (#1502) 2018-05-21 23:37:15 -04:00
blitzmann
9f69c76380 Reimplement support for exporting ESI fittings... whoops (#1593) 2018-05-21 23:23:21 -04:00
blitzmann
2f9d2e2a60 Force command processors not to show (#1562) 2018-05-21 23:15:41 -04:00
blitzmann
f9e60a00f2 Remove the CREST table from a migration, since it no longer exist (was causing issues for some folks with very old databases) 2018-05-21 23:03:25 -04:00
blitzmann
fde449c7d8 more whoops 2018-05-21 22:09:30 -04:00
blitzmann
6b346c4b37 Whoops 2018-05-21 22:08:56 -04:00
blitzmann
aeb1a80e73 fix attempt for #1602 2018-05-21 21:11:51 -04:00
blitzmann
1c359fb6ed tox 2018-05-20 15:58:25 -04:00
blitzmann
a8c57bbdeb Merge branch 'singularity' into abysmal_weather 2018-05-20 15:57:17 -04:00
blitzmann
752c67bc0b tox 2018-05-20 15:57:02 -04:00
blitzmann
e7c826b71c Merge branch 'master' into singularity 2018-05-20 15:56:12 -04:00
blitzmann
2cac214f46 tox 2018-05-20 15:55:26 -04:00
blitzmann
c1f24a1979 Merge branch 'singularity' into abysmal_weather 2018-05-20 15:51:47 -04:00
blitzmann
63e5b6da68 Merge branch 'master' into singularity 2018-05-20 15:51:22 -04:00
blitzmann
23d9e7a91b Fix travis config 2018-05-20 15:50:56 -04:00
blitzmann
7ac4b52d20 Do all localization effects 2018-05-20 15:05:41 -04:00
blitzmann
d110dd4c76 Implement xeon gas and electric store weather effects 2018-05-20 14:33:37 -04:00
blitzmann
a5b959fbf8 Implement caustic and darkness weather 2018-05-20 14:22:58 -04:00
blitzmann
90f1947ea7 Implement caustic weather 2018-05-20 14:14:35 -04:00
blitzmann
afd16e1afd Add new warfareBuffID, and fix issue with going to effect file in debug 2018-05-20 14:10:37 -04:00
blitzmann
bc23417eae Start working on Abysmal space environment effects. The values produced for the infernal weather (calm firestorm) thermic resist penalties are spot on according to my testing. :D 2018-05-20 12:53:33 -04:00
blitzmann
d84525876a Gather abysmal environnments into database 2018-05-20 00:52:48 -04:00
blitzmann
891c20eea7 Merge branch 'master' into singularity 2018-05-20 00:22:24 -04:00
blitzmann
020cc9e295 Revert "Clean up unused effects"
This reverts commit 842be9535b.
2018-05-20 00:22:14 -04:00
blitzmann
e423c9248a Fixes for some odd markdown2 bugs (#1532) 2018-05-19 23:57:40 -04:00
blitzmann
b138fea245 Tweak rack labels 2018-05-19 17:56:48 -04:00
blitzmann
cb509a832e Add number of slots in the rack heading (#1535) 2018-05-19 17:55:17 -04:00
blitzmann
155a3a4e42 Tweak the ammo sorter to be more consistent, and not go off of calculated values for the modules (which may change based on the current charge) (#1520) 2018-05-19 17:41:04 -04:00
Ryan Holmes
a59949a57a Merge pull request #1578 from minlexx/esi_proxy
Use proxies from Pyfa's "Network settings" for ESI requests
2018-05-19 17:07:57 -04:00
blitzmann
4ba33aa5b8 Fix two structure rig effects related to missile charge bonuses (#1526) 2018-05-19 17:07:01 -04:00
ftsartek
5aa14de0c4 Update defaults.yaml
extra update to include two more american/british english translations
2018-05-17 14:49:00 +12:00
Alexey Min
63074a2b85 Reduce code duplication:
Network settings class now provides its own method to get proxy settings dict in requests format.
This method can be used both in network service and esi access, reducing code duplication.
2018-05-15 22:13:04 +03:00
Alexey Minnekhanov
bec746b76f Use proxies from Pyfa's "Network settings" for ESI requests 2018-05-15 12:48:18 +03:00
blitzmann
deecfb31dc Merge tag 'v2.0.1' into singularity (bring sisi code up to date with pyfa 2 / py3 / wx4)
# Conflicts:
#	eos/effects/techtwocommandburstbonus.py
2018-05-15 01:17:51 -04:00
ftsartek
f52d091f9a Updated for significantly more options 2018-05-15 10:05:42 +12:00
DarkPhoenix
df24313bcf Update to recent sisi changes 2018-05-08 14:58:25 +03:00
DarkPhoenix
a1c894bb22 Provide safe fallback for hardshell booster effect (currently broken on sisi) 2018-05-04 16:01:29 +03:00
DarkPhoenix
32c6dcdb79 Sort fits during search the same way they are sorted normally 2018-05-03 11:24:01 +03:00
DarkPhoenix
842be9535b Clean up unused effects 2018-05-03 09:58:44 +03:00
DarkPhoenix
7b6cb25ac4 Fix disintegrator group name 2018-05-03 09:50:36 +03:00
DarkPhoenix
94e1515b43 Update database after recent ship changes 2018-05-03 01:06:01 +03:00
DarkPhoenix
1fc4eab1ce Add spoolup time to misc column 2018-04-28 07:49:04 +03:00
DarkPhoenix
e1e4efde7a Update stats to latest sisi data 2018-04-27 23:24:57 +03:00
DarkPhoenix
cf5769e0f8 Add missing skill and damage mod effects 2018-04-24 20:52:46 +03:00
DarkPhoenix
a8b1f38e84 Update database and implement ship effects, also make pyfa to show final damage value for disintegrators after ramp-up time is complete
(if you don't want me to commit here just write phoenix@mail.ru, i have no way to communicate with you otherwise)
2018-04-24 19:13:30 +03:00
2244 changed files with 3897 additions and 2287 deletions

1
.gitignore vendored
View File

@@ -122,3 +122,4 @@ gitversion
/.version
*.swp
*.fsdbinary

View File

@@ -1,7 +1,9 @@
dist: trusty
sudo: required
language: python
cache: pip
python:
- '2.7'
- '3.6'
env:
- TOXENV=pep8
addons:
@@ -12,28 +14,23 @@ before_install:
- pip install tox
# We're not actually installing Tox, but have to run it before we install wxPython via Conda. This is fugly but vOv
- tox
# get Conda
- if [[ "$TRAVIS_PYTHON_VERSION" == "2.7" ]]; then
wget https://repo.continuum.io/miniconda/Miniconda-latest-Linux-x86_64.sh -O miniconda.sh;
else
wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh;
fi
- bash miniconda.sh -b -p $HOME/miniconda
- export PATH="$HOME/miniconda/bin:$PATH"
- hash -r
- conda config --set always_yes yes --set changeps1 no
- conda update -q conda
# Useful for debugging any issues with conda
- conda info -a
install:
- pip install -U -f https://extras.wxpython.org/wxPython4/extras/linux/gtk2/ubuntu-14.04 wxPython==4.0.0b2
# # get Conda
# - if [[ "$TRAVIS_PYTHON_VERSION" == "2.7" ]]; then
# wget https://repo.continuum.io/miniconda/Miniconda-latest-Linux-x86_64.sh -O miniconda.sh;
# else
# wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh;
# fi
# - bash miniconda.sh -b -p $HOME/miniconda
# - export PATH="$HOME/miniconda/bin:$PATH"
# - hash -r
# - conda config --set always_yes yes --set changeps1 no
# - conda update -q conda
# # Useful for debugging any issues with conda
# - conda info -a
#install:
# install wxPython 3.0.0.0
- conda install -c https://conda.anaconda.org/travis wxpython
before_script:
- pip install -r requirements.txt
- pip install -r requirements_test.txt
# - conda install -c https://conda.anaconda.org/travis wxpython=4.0.0b2
script:
- py.test --cov=./
after_success:
- bash <(curl -s https://codecov.io/bash)
before_deploy:
- pip install -r requirements_build_linux.txt
- tox

View File

@@ -24,10 +24,10 @@ saveInRoot = False
# Version data
version = "2.0.2"
version = "2.3.1"
tag = "Stable"
expansionName = "YC120.3"
expansionVersion = "1.8"
expansionName = "YC120.7"
expansionVersion = "1.2"
evemonMinVersion = "4081"
minItemSearchLength = 3

View File

@@ -73,4 +73,7 @@ exe = EXE(pyz,
app = BUNDLE(exe,
name='pyfa.app',
icon=icon,
bundle_identifier=None)
bundle_identifier=None,
info_plist={
'NSHighResolutionCapable': 'True'
})

View File

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

View File

@@ -5,7 +5,7 @@
; we do some #ifdef conditionals because automated compilation passes these as arguments
#ifndef MyAppVersion
#define MyAppVersion "1.15.0"
#define MyAppVersion "2.1.0"
#endif
#ifndef MyAppExpansion
#define MyAppExpansion "Vanguard 1.0"
@@ -64,7 +64,7 @@ Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{
Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 0,6.1
[Files]
Source: "{#MyAppDir}\pyfa.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#MyAppDir}\pyfa.exe"; DestDir: "{app}"; Flags: ignoreversion; AfterInstall: RemoveFromVirtualStore
Source: "{#MyAppDir}\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
@@ -104,6 +104,22 @@ begin
FSWbemLocator := Unassigned;
end;
procedure RemoveFromVirtualStore;
var
VirtualStore,FileName,FilePath:String;
DriveChars:Integer;
begin
VirtualStore:=AddBackslash(ExpandConstant('{localappdata}'))+'VirtualStore';
FileName:=ExpandConstant(CurrentFileName);
DriveChars:=Length(ExtractFileDrive(FileName));
if DriveChars>0 then begin
Delete(FileName,1,DriveChars);
FileName:=VirtualStore+FileName;
FilePath:=ExtractFilePath(FileName);
DelTree(FilePath, True, True, True);
end;
end;
function PrepareToInstall(var NeedsRestart: Boolean): String;
begin
if(IsAppRunning( 'pyfa.exe' )) then

View File

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

View File

@@ -20,6 +20,8 @@ added_files = [
('../../imgs/renders/*.png', 'imgs/renders'),
('../../service/jargon/*.yaml', 'service/jargon'),
('../../dist_assets/win/pyfa.ico', '.'),
('../../dist_assets/win/pyfa.exe.manifest', '.'),
('../../dist_assets/win/Microsoft.VC90.CRT.manifest', '.'),
(requests.certs.where(), '.'), # is this needed anymore?
('../../eve.db', '.'),
('../../README.md', '.'),

View File

@@ -11,6 +11,7 @@ debug = False
gamedataCache = True
saveddataCache = True
gamedata_version = ""
gamedata_date = ""
gamedata_connectionstring = 'sqlite:///' + realpath(join(dirname(abspath(__file__)), "..", "eve.db"))
pyfalog.debug("Gamedata connection string: {0}", gamedata_connectionstring)

View File

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

View File

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

View File

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

View File

@@ -21,18 +21,17 @@ from sqlalchemy import Column, String, Integer, ForeignKey, Boolean, Table
from sqlalchemy.orm import relation, mapper, synonym, deferred
from eos.db import gamedata_meta
from eos.gamedata import Category, Icon
from eos.gamedata import Category
categories_table = Table("invcategories", gamedata_meta,
Column("categoryID", Integer, primary_key=True),
Column("categoryName", String),
Column("description", String),
Column("published", Boolean),
Column("iconID", Integer, ForeignKey("icons.iconID")))
Column("iconID", Integer))
mapper(Category, categories_table,
properties={
"icon" : relation(Icon),
"ID" : synonym("categoryID"),
"name" : synonym("categoryName"),
"description": deferred(categories_table.c.description)

View File

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

View File

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

View File

@@ -19,12 +19,13 @@
from sqlalchemy import Column, String, Integer, Boolean, ForeignKey, Table, Float
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.orm import relation, mapper, synonym, deferred
from sqlalchemy.orm import relation, mapper, synonym, deferred, backref
from sqlalchemy.orm.collections import attribute_mapped_collection
from eos.db.gamedata.effect import typeeffects_table
from eos.db import gamedata_meta
from eos.gamedata import Attribute, Effect, Group, Icon, Item, MetaType, Traits
from eos.gamedata import Attribute, Effect, Group, Item, MetaType, Traits, DynamicItemItem, DynamicItem
from eos.db.gamedata.dynamicAttributes import dynamicApplicable_table, dynamic_table
items_table = Table("invtypes", gamedata_meta,
Column("typeID", Integer, primary_key=True),
@@ -37,7 +38,8 @@ items_table = Table("invtypes", gamedata_meta,
Column("capacity", Float),
Column("published", Boolean),
Column("marketGroupID", Integer, ForeignKey("invmarketgroups.marketGroupID")),
Column("iconID", Integer, ForeignKey("icons.iconID")),
Column("iconID", Integer),
Column("graphicID", Integer),
Column("groupID", Integer, ForeignKey("invgroups.groupID"), index=True))
from .metaGroup import metatypes_table # noqa
@@ -45,8 +47,7 @@ from .traits import traits_table # noqa
mapper(Item, items_table,
properties={
"group" : relation(Group, backref="items"),
"icon" : relation(Icon),
"group" : relation(Group, backref=backref("items", cascade="all,delete")),
"_Item__attributes": relation(Attribute, cascade='all, delete, delete-orphan', collection_class=attribute_mapped_collection('name')),
"effects": relation(Effect, secondary=typeeffects_table, collection_class=attribute_mapped_collection('name')),
"metaGroup" : relation(MetaType,
@@ -57,7 +58,12 @@ mapper(Item, items_table,
"description" : deferred(items_table.c.description),
"traits" : relation(Traits,
primaryjoin=traits_table.c.typeID == items_table.c.typeID,
uselist=False)
uselist=False),
"mutaplasmids": relation(DynamicItem,
primaryjoin=dynamicApplicable_table.c.applicableTypeID == items_table.c.typeID,
secondaryjoin=dynamicApplicable_table.c.typeID == DynamicItem.typeID,
secondary=dynamicApplicable_table,
backref="applicableItems")
})
Item.category = association_proxy("group", "category")

View File

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

View File

@@ -17,15 +17,16 @@
# along with eos. If not, see <http://www.gnu.org/licenses/>.
# ===============================================================================
from sqlalchemy.orm import join, exc, aliased
from sqlalchemy.orm import join, exc, aliased, joinedload, subqueryload
from sqlalchemy.sql import and_, or_, select
from sqlalchemy.inspection import inspect
import eos.config
from eos.db import gamedata_session
from eos.db.gamedata.metaGroup import metatypes_table, items_table
from eos.db.gamedata.group import groups_table
from eos.db.util import processEager, processWhere
from eos.gamedata import AlphaClone, Attribute, Category, Group, Item, MarketGroup, MetaGroup, AttributeInfo, MetaData
from eos.gamedata import AlphaClone, Attribute, Category, Group, Item, MarketGroup, MetaGroup, AttributeInfo, MetaData, DynamicItem
cache = {}
configVal = getattr(eos.config, "gamedataCache", None)
@@ -97,6 +98,36 @@ def getItem(lookfor, eager=None):
return item
def getMutaplasmid(lookfor, eager=None):
if isinstance(lookfor, int):
item = gamedata_session.query(DynamicItem).filter(DynamicItem.ID == lookfor).first()
else:
raise TypeError("Need integer as argument")
return item
def getItemWithBaseItemAttribute(lookfor, baseItemID, eager=None):
# A lot of this is described in more detail in #1597
item = gamedata_session.query(Item).get(lookfor)
base = getItem(baseItemID)
# we have to load all attributes for this object, otherwise we'll lose access to them when we expunge.
# todo: figure out a way to eagerly load all these via the query...
for x in [*inspect(Item).relationships.keys(), 'description']:
getattr(item, x)
# Copy over the attributes from the base, but ise the items attributes when there's an overlap
# WARNING: the attribute object still has the old typeID. I don't believe we access this typeID anywhere in the code,
# but should keep this in mind for now.
item._Item__attributes = {**base.attributes, **item.attributes}
# Expunge the item form the session. This is required to have different Abyssal / Base combinations loaded in memory.
# Without expunging it, once one Abyssal Web is created, SQLAlchmey will use it for all others. We don't want this,
# we want to generate a completely new object to work with
gamedata_session.expunge(item)
return item
@cachedQuery(1, "lookfor")
def getItems(lookfor, eager=None):
"""
@@ -361,6 +392,10 @@ def directAttributeRequest(itemIDs, attrIDs):
return result
def getAbyssalTypes():
return set([r.resultingTypeID for r in gamedata_session.query(DynamicItem.resultingTypeID).distinct()])
def getRequiredFor(itemID, attrMapping):
Attribute1 = aliased(Attribute)
Attribute2 = aliased(Attribute)

View File

@@ -14,7 +14,7 @@ def upgrade(saveddata_engine):
"boosters": 2,
"cargo": 2,
"characters": 2,
"crest": 1,
# "crest": 1,
"damagePatterns": 2,
"drones": 2,
"fighters": 2,

View File

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

View File

@@ -1,6 +1,7 @@
__all__ = [
"character",
"fit",
"mutator",
"module",
"user",
"skill",

View File

@@ -56,7 +56,7 @@ fits_table = Table("fits", saveddata_meta,
Column("booster", Boolean, nullable=False, index=True, default=0),
Column("targetResistsID", ForeignKey("targetResists.ID"), nullable=True),
Column("modeID", Integer, nullable=True),
Column("implantLocation", Integer, nullable=False, default=ImplantLocation.FIT),
Column("implantLocation", Integer, nullable=False),
Column("notes", String, nullable=True),
Column("ignoreRestrictions", Boolean, default=0),
Column("created", DateTime, nullable=True, default=datetime.datetime.now),

View File

@@ -18,17 +18,21 @@
# ===============================================================================
from sqlalchemy import Table, Column, Integer, ForeignKey, CheckConstraint, Boolean, DateTime
from sqlalchemy.orm.collections import attribute_mapped_collection
from sqlalchemy.orm import relation, mapper
import datetime
from eos.db import saveddata_meta
from eos.saveddata.module import Module
from eos.saveddata.mutator import Mutator
from eos.saveddata.fit import Fit
modules_table = Table("modules", saveddata_meta,
Column("ID", Integer, primary_key=True),
Column("fitID", Integer, ForeignKey("fits.ID"), nullable=False, index=True),
Column("itemID", Integer, nullable=True),
Column("baseItemID", Integer, nullable=True),
Column("mutaplasmidID", Integer, nullable=True),
Column("dummySlot", Integer, nullable=True, default=None),
Column("chargeID", Integer),
Column("state", Integer, CheckConstraint("state >= -1"), CheckConstraint("state <= 2")),
@@ -39,4 +43,12 @@ modules_table = Table("modules", saveddata_meta,
CheckConstraint('("dummySlot" = NULL OR "itemID" = NULL) AND "dummySlot" != "itemID"'))
mapper(Module, modules_table,
properties={"owner": relation(Fit)})
properties={
"owner": relation(Fit),
"mutators": relation(
Mutator,
backref="module",
cascade="all,delete-orphan",
collection_class=attribute_mapped_collection('attrID')
)
})

View File

@@ -17,19 +17,18 @@
# along with eos. If not, see <http://www.gnu.org/licenses/>.
# ===============================================================================
from sqlalchemy import Column, String, Integer, Table
from sqlalchemy.orm import mapper, synonym, deferred
from sqlalchemy import Table, Column, Integer, ForeignKey, Boolean, DateTime, Float
from sqlalchemy.orm import mapper
import datetime
from eos.db import gamedata_meta
from eos.gamedata import Icon
from eos.db import saveddata_meta
from eos.saveddata.mutator import Mutator
icons_table = Table("icons", gamedata_meta,
Column("iconID", Integer, primary_key=True),
Column("description", String),
Column("iconFile", String))
mutator_table = Table("mutators", saveddata_meta,
Column("moduleID", Integer, ForeignKey("modules.ID"), primary_key=True, index=True),
Column("attrID", Integer, primary_key=True, index=True),
Column("value", Float, nullable=False),
Column("created", DateTime, nullable=True, default=datetime.datetime.now),
Column("modified", DateTime, nullable=True, onupdate=datetime.datetime.now))
mapper(Icon, icons_table,
properties={
"ID" : synonym("iconID"),
"description": deferred(icons_table.c.description)
})
mapper(Mutator, mutator_table)

View File

@@ -13,11 +13,14 @@ type = "active"
def handler(fit, module, context):
damagePattern = fit.damagePattern
# pyfalog.debug("==============================")
static_adaptive_behavior = eos.config.settings['useStaticAdaptiveArmorHardener']
if (damagePattern.emAmount == damagePattern.thermalAmount == damagePattern.kineticAmount == damagePattern.explosiveAmount) and static_adaptive_behavior:
pyfalog.debug("Setting adaptivearmorhardener resists to uniform profile.")
# pyfalog.debug("Setting adaptivearmorhardener resists to uniform profile.")
for attr in ("armorEmDamageResonance", "armorThermalDamageResonance", "armorKineticDamageResonance", "armorExplosiveDamageResonance"):
fit.ship.multiplyItemAttr(attr, module.getModifiedItemAttr(attr), stackingPenalties=True, penaltyGroup="preMul")
return
# Skip if there is no damage pattern. Example: projected ships or fleet boosters
@@ -30,7 +33,7 @@ def handler(fit, module, context):
damagePattern.kineticAmount * fit.ship.getModifiedItemAttr('armorKineticDamageResonance'),
damagePattern.explosiveAmount * fit.ship.getModifiedItemAttr('armorExplosiveDamageResonance'),
)
# pyfalog.debug("Damage Adjusted for Armor Resists: %f/%f/%f/%f", baseDamageTaken[0], baseDamageTaken[1], baseDamageTaken[2], baseDamageTaken[3])
# pyfalog.debug("Damage Adjusted for Armor Resists: %f/%f/%f/%f" % (baseDamageTaken[0], baseDamageTaken[1], baseDamageTaken[2], baseDamageTaken[3]))
resistanceShiftAmount = module.getModifiedItemAttr(
'resistanceShiftAmount') / 100 # The attribute is in percent and we want a fraction
@@ -46,7 +49,7 @@ def handler(fit, module, context):
cycleList = []
loopStart = -20
for num in range(50):
# pyfalog.debug("Starting cycle %d.", num)
# pyfalog.debug("Starting cycle %d." % num)
# The strange order is to emulate the ingame sorting when different types have taken the same amount of damage.
# This doesn't take into account stacking penalties. In a few cases fitting a Damage Control causes an inaccurate result.
damagePattern_tuples = [
@@ -84,7 +87,7 @@ def handler(fit, module, context):
RAHResistance[sortedDamagePattern_tuples[1][0]] = sortedDamagePattern_tuples[1][2] + change1
RAHResistance[sortedDamagePattern_tuples[2][0]] = sortedDamagePattern_tuples[2][2] + change2
RAHResistance[sortedDamagePattern_tuples[3][0]] = sortedDamagePattern_tuples[3][2] + change3
# pyfalog.debug("Resistances shifted to %f/%f/%f/%f", RAHResistance[0], RAHResistance[1], RAHResistance[2], RAHResistance[3])
# pyfalog.debug("Resistances shifted to %f/%f/%f/%f" % ( RAHResistance[0], RAHResistance[1], RAHResistance[2], RAHResistance[3]))
# See if the current RAH profile has been encountered before, indicating a loop.
for i, val in enumerate(cycleList):
@@ -94,16 +97,16 @@ def handler(fit, module, context):
abs(RAHResistance[2] - val[2]) <= tolerance and \
abs(RAHResistance[3] - val[3]) <= tolerance:
loopStart = i
# pyfalog.debug("Loop found: %d-%d", loopStart, num)
# pyfalog.debug("Loop found: %d-%d" % (loopStart, num))
break
if loopStart >= 0:
break
cycleList.append(list(RAHResistance))
if loopStart < 0:
pyfalog.error("Reactive Armor Hardener failed to find equilibrium. Damage profile after armor: {0}/{1}/{2}/{3}",
baseDamageTaken[0], baseDamageTaken[1], baseDamageTaken[2], baseDamageTaken[3])
# if loopStart < 0:
# pyfalog.error("Reactive Armor Hardener failed to find equilibrium. Damage profile after armor: {0}/{1}/{2}/{3}".format(
# baseDamageTaken[0], baseDamageTaken[1], baseDamageTaken[2], baseDamageTaken[3]))
# Average the profiles in the RAH loop, or the last 20 if it didn't find a loop.
loopCycles = cycleList[loopStart:]
@@ -117,7 +120,7 @@ def handler(fit, module, context):
average[i] = round(average[i] / numCycles, 3)
# Set the new resistances
# pyfalog.debug("Setting new resist profile: %f/%f/%f/%f", average[0], average[1], average[2],average[3])
# pyfalog.debug("Setting new resist profile: %f/%f/%f/%f" % ( average[0], average[1], average[2],average[3]))
for i, attr in enumerate((
'armorEmDamageResonance', 'armorThermalDamageResonance', 'armorKineticDamageResonance',
'armorExplosiveDamageResonance')):

View File

@@ -2,7 +2,7 @@
#
# Used by:
# Modules from group: Missile Launcher Bomb (2 of 2)
# Modules from group: Shield Extender (33 of 33)
# Modules from group: Shield Extender (36 of 36)
type = "passive"

View File

@@ -1,7 +1,7 @@
# ammoInfluenceCapNeed
#
# Used by:
# Items from category: Charge (478 of 928)
# Items from category: Charge (493 of 947)
type = "passive"

View File

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

View File

@@ -4,6 +4,7 @@
# Charges from group: Festival Charges (23 of 23)
# Charges from group: Interdiction Probe (2 of 2)
# Charges from group: Structure Festival Charges (3 of 3)
# Special Edition Assetss from group: Festival Charges Expired (2 of 2)
type = "passive"

View File

@@ -1,12 +1,7 @@
# ammoTrackingMultiplier
#
# Used by:
# Charges from group: Advanced Artillery Ammo (8 of 8)
# Charges from group: Advanced Autocannon Ammo (8 of 8)
# Charges from group: Advanced Beam Laser Crystal (8 of 8)
# Charges from group: Advanced Blaster Charge (8 of 8)
# Charges from group: Advanced Pulse Laser Crystal (8 of 8)
# Charges from group: Advanced Railgun Charge (8 of 8)
# Items from category: Charge (182 of 947)
# Charges from group: Projectile Ammo (128 of 128)
type = "passive"

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,7 +1,7 @@
# armorHPBonusAdd
#
# Used by:
# Modules from group: Armor Reinforcer (48 of 48)
# Modules from group: Armor Reinforcer (51 of 51)
type = "passive"

View File

@@ -1,7 +1,7 @@
# armorReinforcerMassAdd
#
# Used by:
# Modules from group: Armor Reinforcer (48 of 48)
# Modules from group: Armor Reinforcer (51 of 51)
type = "passive"

View File

@@ -1,7 +1,7 @@
# armorRepair
#
# Used by:
# Modules from group: Armor Repair Unit (105 of 105)
# Modules from group: Armor Repair Unit (108 of 108)
runTime = "late"
type = "active"

View File

@@ -1,10 +0,0 @@
# Not used by any item
type = "gang", "active"
gangBonus = "armorHpBonus2"
gangBoost = "armorHP"
def handler(fit, module, context):
if "gang" not in context:
return
fit.ship.boostItemAttr("armorHP", module.getModifiedItemAttr("armorHpBonus2"))

View File

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

View File

@@ -1,7 +1,8 @@
# boosterMaxVelocityPenalty
#
# Used by:
# Implants from group: Booster (12 of 62)
# Implants named like: Crash Booster (3 of 4)
# Items from market group: Implants & Boosters > Booster > Booster Slot 02 (9 of 13)
type = "boosterSideEffect"
# User-friendly name for the side effect

View File

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

View File

@@ -1,7 +1,7 @@
# capacitorCapacityBonus
#
# Used by:
# Modules from group: Capacitor Battery (27 of 27)
# Modules from group: Capacitor Battery (30 of 30)
type = "passive"

View File

@@ -4,7 +4,7 @@
# Modules from group: Capacitor Flux Coil (6 of 6)
# Modules from group: Capacitor Power Relay (20 of 20)
# Modules from group: Power Diagnostic System (23 of 23)
# Modules from group: Propulsion Module (65 of 127)
# Modules from group: Propulsion Module (68 of 133)
# Modules from group: Reactor Control Unit (22 of 22)
type = "passive"

View File

@@ -1,4 +1,7 @@
# Not used by any item
# citadelRigBonus
#
# Used by:
# Structures from group: Citadel (9 of 9)
type = "passive"
runTime = "early"

View File

@@ -2,6 +2,7 @@
#
# Used by:
# Modules from group: CPU Enhancer (19 of 19)
# Variations of structure module: Standup Co-Processor Array I (2 of 2)
type = "passive"

View File

@@ -1,9 +0,0 @@
# Not used by any item
type = "active", "projected"
def handler(fit, module, context):
if "projected" not in context:
return
fit.ship.boostItemAttr("maxVelocity", module.getModifiedItemAttr("speedFactor"),
stackingPenalties=True)

View File

@@ -0,0 +1,11 @@
# disintegratorWeaponDamageMultiply
#
# Used by:
# Modules from group: Entropic Radiation Sink (3 of 3)
type = "passive"
def handler(fit, module, context):
fit.modules.filteredItemMultiply(lambda mod: mod.item.group.name == "Precursor Weapon",
"damageMultiplier", module.getModifiedItemAttr("damageMultiplier"),
stackingPenalties=True)

View File

@@ -0,0 +1,11 @@
# disintegratorWeaponSpeedMultiply
#
# Used by:
# Modules from group: Entropic Radiation Sink (3 of 3)
type = "passive"
def handler(fit, module, context):
fit.modules.filteredItemMultiply(lambda mod: mod.item.group.name == "Precursor Weapon",
"speed", module.getModifiedItemAttr("speedMultiplier"),
stackingPenalties=True)

View File

@@ -2,6 +2,7 @@
#
# Used by:
# Module: Warp Disruption Burst Projector
# Structure Module: Standup Warp Disruption Burst Projector
type = "projected", "active"

View File

@@ -2,6 +2,7 @@
#
# Used by:
# Module: Sensor Dampening Burst Projector
# Structure Module: Standup Sensor Dampening Burst Projector
type = "projected", "active"

View File

@@ -2,6 +2,7 @@
#
# Used by:
# Module: ECM Jammer Burst Projector
# Structure Module: Standup ECM Jammer Burst Projector
from eos.modifiedAttributeDict import ModifiedAttributeDict
type = "projected", "active"

View File

@@ -2,6 +2,7 @@
#
# Used by:
# Module: Energy Neutralization Burst Projector
# Structure Module: Standup Energy Neutralization Burst Projector
from eos.saveddata.module import State
from eos.modifiedAttributeDict import ModifiedAttributeDict

View File

@@ -2,6 +2,7 @@
#
# Used by:
# Module: Target Illumination Burst Projector
# Structure Module: Standup Target Illumination Burst Projector
type = "projected", "active"

View File

@@ -2,6 +2,7 @@
#
# Used by:
# Module: Weapon Disruption Burst Projector
# Structure Module: Standup Weapon Disruption Burst Projector
type = "active", "projected"

View File

@@ -2,6 +2,7 @@
#
# Used by:
# Module: Stasis Webification Burst Projector
# Structure Module: Standup Stasis Webification Burst Projector
type = "active", "projected"

View File

@@ -1,7 +0,0 @@
# Not used by any item
type = "passive"
def handler(fit, skill, context):
fit.drones.filteredItemBoost(lambda drone: drone.item.requiresSkill("Drones"),
"damageMultiplier", skill.getModifiedItemAttr("damageMultiplierBonus") * skill.level)

View File

@@ -8,4 +8,4 @@ type = "passive"
def handler(fit, container, context):
level = container.level if "skill" in context else 1
fit.drones.filteredItemBoost(lambda drone: drone.item.requiresSkill("Drones"),
"maxVelocity", container.getModifiedItemAttr("droneMaxVelocityBonus") * level)
"maxVelocity", container.getModifiedItemAttr("droneMaxVelocityBonus") * level, stackingPenalties=True)

View File

@@ -1,9 +0,0 @@
# Not used by any item
type = "passive"
def handler(fit, src, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Information Command Specialist"),
"commandBonusHidden",
src.getModifiedItemAttr("eliteBonusCommandDestroyer1"),
skill="Command Destroyers")

View File

@@ -1,7 +0,0 @@
# Not used by any item
type = "passive"
def handler(fit, src, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("High Speed Maneuvering"), "signatureRadiusBonus",
src.getModifiedItemAttr("eliteBonusCommandDestroyer3"), skill="Command Destroyers")

View File

@@ -1,7 +0,0 @@
# Not used by any item
type = "passive"
def handler(fit, module, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Information Command Specialist"),
"commandBonusHidden", module.getModifiedItemAttr("eliteBonusCommandShips3"), skill="Command Ships")

View File

@@ -1,6 +0,0 @@
# Not used by any item
type = "passive"
def handler(fit, ship, context):
fit.ship.increaseItemAttr("droneCapacity", ship.getModifiedItemAttr("eliteBonusGunship2"), skill="Assault Frigates")

View File

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

View File

@@ -1,12 +0,0 @@
# Not used by any item
from eos.saveddata.module import State
type = "active", "projected"
def handler(fit, src, context):
if "projected" in context and ((hasattr(src, "state") and src.state >= State.ACTIVE) or hasattr(src, "amountActive")):
multiplier = src.amountActive if hasattr(src, "amountActive") else 1
amount = src.getModifiedItemAttr("energyNeutralizerAmount")
time = src.getModifiedItemAttr("duration")
fit.addDrain(src, time, amount * multiplier, 0)

View File

@@ -1,7 +1,7 @@
# energyNeutralizerFalloff
#
# Used by:
# Modules from group: Energy Neutralizer (51 of 51)
# Modules from group: Energy Neutralizer (54 of 54)
from eos.saveddata.module import State
from eos.modifiedAttributeDict import ModifiedAttributeDict

View File

@@ -1,7 +1,7 @@
# energyNosferatuFalloff
#
# Used by:
# Modules from group: Energy Nosferatu (51 of 51)
# Modules from group: Energy Nosferatu (54 of 54)
from eos.modifiedAttributeDict import ModifiedAttributeDict
type = "active", "projected"

View File

@@ -1,9 +0,0 @@
# Not used by any item
type = "projected", "active"
def handler(fit, src, context):
if "projected" in context:
amount = src.getModifiedItemAttr("powerTransferAmount")
duration = src.getModifiedItemAttr("duration")
fit.addDrain(src, duration, -amount, 0)

View File

@@ -1,8 +0,0 @@
# Not used by any item
type = "projected", "active"
def handler(fit, container, context):
if "projected" in context:
fit.ship.boostItemAttr("signatureRadius", container.getModifiedItemAttr("signatureRadiusBonus"),
stackingPenalties=True)

View File

@@ -1,4 +1,8 @@
# Not used by any item
# fighterAbilityAttackM
#
# Used by:
# Items from category: Fighter (50 of 82)
# Fighters from group: Heavy Fighter (34 of 34)
"""
Since fighter abilities do not have any sort of item entity in the EVE database, we must derive the abilities from the
effects, and thus this effect file contains some custom information useful only to fighters.

View File

@@ -1,4 +1,7 @@
# Not used by any item
# fighterAbilityECM
#
# Used by:
# Fighters named like: Scarab (4 of 4)
"""
Since fighter abilities do not have any sort of item entity in the EVE database, we must derive the abilities from the
effects, and thus this effect file contains some custom information useful only to fighters.

View File

@@ -1,4 +1,7 @@
# Not used by any item
# fighterAbilityEnergyNeutralizer
#
# Used by:
# Fighters named like: Cenobite (4 of 4)
"""
Since fighter abilities do not have any sort of item entity in the EVE database, we must derive the abilities from the
effects, and thus this effect file contains some custom information useful only to fighters.

View File

@@ -1,4 +1,7 @@
# Not used by any item
# fighterAbilityEvasiveManeuvers
#
# Used by:
# Fighters from group: Light Fighter (16 of 32)
"""
Since fighter abilities do not have any sort of item entity in the EVE database, we must derive the abilities from the
effects, and thus this effect file contains some custom information useful only to fighters.

View File

@@ -1,4 +1,7 @@
# Not used by any item
# fighterAbilityLaunchBomb
#
# Used by:
# Fighters from group: Heavy Fighter (16 of 34)
"""
Since fighter abilities do not have any sort of item entity in the EVE database, we must derive the abilities from the
effects, and thus this effect file contains some custom information useful only to fighters.

View File

@@ -1,4 +1,7 @@
# Not used by any item
# fighterAbilityMicroWarpDrive
#
# Used by:
# Items from category: Fighter (48 of 82)
"""
Since fighter abilities do not have any sort of item entity in the EVE database, we must derive the abilities from the
effects, and thus this effect file contains some custom information useful only to fighters.

View File

@@ -1,4 +1,8 @@
# Not used by any item
# fighterAbilityMissiles
#
# Used by:
# Items from category: Fighter (48 of 82)
# Fighters from group: Light Fighter (32 of 32)
"""
Since fighter abilities do not have any sort of item entity in the EVE database, we must derive the abilities from the
effects, and thus this effect file contains some custom information useful only to fighters.

View File

@@ -1,4 +1,7 @@
# Not used by any item
# fighterAbilityStasisWebifier
#
# Used by:
# Fighters named like: Dromi (4 of 4)
"""
Since fighter abilities do not have any sort of item entity in the EVE database, we must derive the abilities from the
effects, and thus this effect file contains some custom information useful only to fighters.

View File

@@ -1,4 +1,7 @@
# Not used by any item
# fighterAbilityWarpDisruption
#
# Used by:
# Fighters named like: Siren (4 of 4)
"""
Since fighter abilities do not have any sort of item entity in the EVE database, we must derive the abilities from the
effects, and thus this effect file contains some custom information useful only to fighters.

View File

@@ -1,11 +0,0 @@
# Not used by any item
type = "passive"
def handler(fit, module, context):
# Note: we increase maxGroupActive by two.
# If we only increased it by one, we'd get the number to stay equal
# As Comman Processors use one themselves too
fit.modules.filteredItemIncrease(lambda mod: mod.item.group.name == "Gang Coordinator" and
"maxGroupActive" in mod.itemModifiedAttributes,
"maxGroupActive", 1)

View File

@@ -1,7 +1,7 @@
# fueledArmorRepair
#
# Used by:
# Modules from group: Ancillary Armor Repairer (4 of 4)
# Modules from group: Ancillary Armor Repairer (7 of 7)
runTime = "late"
type = "active"

View File

@@ -1,7 +1,7 @@
# fueledShieldBoosting
#
# Used by:
# Modules from group: Ancillary Shield Booster (5 of 5)
# Modules from group: Ancillary Shield Booster (8 of 8)
runTime = "late"
type = "active"

View File

@@ -1,7 +0,0 @@
# Not used by any item
type = "passive"
def handler(fit, ship, context):
fit.modules.filteredItemMultiply(lambda mod: mod.item.requiresSkill("Ice Harvesting"),
"capacitorNeed", ship.getModifiedItemAttr("iceHarvestCycleBonus"))

View File

@@ -1,8 +0,0 @@
# Not used by any item
type = "gang"
gangBoost = "maxTargetRange"
gangBonus = "maxTargetRangeBonus"
def handler(fit, container, context):
fit.ship.boostItemAttr(gangBoost, container.getModifiedItemAttr(gangBonus))

View File

@@ -1,8 +0,0 @@
# Not used by any item
type = "passive"
def handler(fit, implant, context):
fit.character.getSkill("Information Command").suppress()
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Information Command Specialist"),
"commandBonusHidden", implant.getModifiedItemAttr("mindlinkBonus"))

View File

@@ -0,0 +1,11 @@
# largeDisintegratorSkillDmgBonus
#
# Used by:
# Skill: Large Disintegrator Specialization
type = "passive"
def handler(fit, container, context):
level = container.level if "skill" in context else 1
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Large Disintegrator Specialization"),
"damageMultiplier", container.getModifiedItemAttr("damageMultiplierBonus") * level)

View File

@@ -0,0 +1,11 @@
# largePrecursorTurretDmgBonusRequiredSkill
#
# Used by:
# Skill: Large Precursor Weapon
type = "passive"
def handler(fit, container, context):
level = container.level if "skill" in context else 1
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Large Precursor Weapon"),
"damageMultiplier", container.getModifiedItemAttr("damageMultiplierBonus") * level)

View File

@@ -1,4 +1,7 @@
# Not used by any item
# lightningWeapon
#
# Used by:
# Structure Module: Standup Arcing Vorton Projector I
type = 'active'

View File

@@ -1,52 +0,0 @@
# Not used by any item
type = "active"
runTime = "early"
def handler(fit, module, context):
# Resistances
for layer, attrPrefix in (('shield', 'shield'), ('armor', 'armor'), ('hull', '')):
for damageType in ('Kinetic', 'Thermal', 'Explosive', 'Em'):
bonus = "%s%sDamageResonance" % (attrPrefix, damageType)
bonus = "%s%s" % (bonus[0].lower(), bonus[1:])
booster = "%s%sDamageResonance" % (layer, damageType)
penalize = False if layer == 'hull' else True
fit.ship.multiplyItemAttr(bonus, module.getModifiedItemAttr(booster),
stackingPenalties=penalize, penaltyGroup="preMul")
# Turrets
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Large Energy Turret") or
mod.item.requiresSkill("Large Hybrid Turret") or
mod.item.requiresSkill("Large Projectile Turret"),
"maxRange", module.getModifiedItemAttr("maxRangeBonus"),
stackingPenalties=True)
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Large Energy Turret") or
mod.item.requiresSkill("Large Hybrid Turret") or
mod.item.requiresSkill("Large Projectile Turret"),
"falloff", module.getModifiedItemAttr("falloffBonus"),
stackingPenalties=True)
# Missiles
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Torpedoes") or
mod.charge.requiresSkill("Cruise Missiles") or
mod.charge.requiresSkill("Heavy Missiles"),
"maxVelocity", module.getModifiedItemAttr("missileVelocityBonus"))
# Tanking
fit.modules.filteredItemBoost(
lambda mod: mod.item.requiresSkill("Capital Repair Systems") or mod.item.requiresSkill("Repair Systems"),
"armorDamageAmount", module.getModifiedItemAttr("armorDamageAmountBonus"),
stackingPenalties=True)
fit.modules.filteredItemBoost(
lambda mod: mod.item.requiresSkill("Capital Shield Operation") or mod.item.requiresSkill("Shield Operation"),
"shieldBonus", module.getModifiedItemAttr("shieldBoostMultiplier"),
stackingPenalties=True)
# Speed penalty
fit.ship.boostItemAttr("maxVelocity", module.getModifiedItemAttr("speedFactor"))
# Max locked targets
fit.ship.forceItemAttr("maxLockedTargets", module.getModifiedItemAttr("maxLockedTargets"))
# Block Hostile ewar
fit.ship.forceItemAttr("disallowOffensiveModifiers", module.getModifiedItemAttr("disallowOffensiveModifiers"))

View File

@@ -1,6 +0,0 @@
# Not used by any item
type = "passive"
def handler(fit, module, context):
fit.ship.increaseItemAttr("mass", module.getModifiedItemAttr("mass") or 0)

View File

@@ -1,6 +0,0 @@
# Not used by any item
type = "passive"
def handler(fit, module, context):
fit.ship.increaseItemAttr("maxVelocity", module.getModifiedItemAttr("maxVelocity"))

View File

@@ -0,0 +1,11 @@
# mediumDisintegratorSkillDmgBonus
#
# Used by:
# Skill: Medium Disintegrator Specialization
type = "passive"
def handler(fit, container, context):
level = container.level if "skill" in context else 1
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Medium Disintegrator Specialization"),
"damageMultiplier", container.getModifiedItemAttr("damageMultiplierBonus") * level)

View File

@@ -0,0 +1,11 @@
# mediumPrecursorTurretDmgBonusRequiredSkill
#
# Used by:
# Skill: Medium Precursor Weapon
type = "passive"
def handler(fit, container, context):
level = container.level if "skill" in context else 1
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Medium Precursor Weapon"),
"damageMultiplier", container.getModifiedItemAttr("damageMultiplierBonus") * level)

View File

@@ -1,7 +0,0 @@
# Not used by any item
type = "passive"
def handler(fit, ship, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Mining Director"),
"commandBonus", ship.getModifiedItemAttr("commandBonusEffective"))

View File

@@ -1,7 +1,7 @@
# missileSkillWarheadUpgradesEmDamageBonus
#
# Used by:
# Implants named like: Agency 'Pyrolancea' DB Dose (3 of 3)
# Implants named like: Agency 'Pyrolancea' DB Dose (4 of 4)
# Skill: Warhead Upgrades
type = "passive"

View File

@@ -1,7 +1,7 @@
# missileSkillWarheadUpgradesExplosiveDamageBonus
#
# Used by:
# Implants named like: Agency 'Pyrolancea' DB Dose (3 of 3)
# Implants named like: Agency 'Pyrolancea' DB Dose (4 of 4)
# Skill: Warhead Upgrades
type = "passive"

View File

@@ -1,7 +1,7 @@
# missileSkillWarheadUpgradesKineticDamageBonus
#
# Used by:
# Implants named like: Agency 'Pyrolancea' DB Dose (3 of 3)
# Implants named like: Agency 'Pyrolancea' DB Dose (4 of 4)
# Skill: Warhead Upgrades
type = "passive"

View File

@@ -1,7 +1,7 @@
# missileSkillWarheadUpgradesThermalDamageBonus
#
# Used by:
# Implants named like: Agency 'Pyrolancea' DB Dose (3 of 3)
# Implants named like: Agency 'Pyrolancea' DB Dose (4 of 4)
# Skill: Warhead Upgrades
type = "passive"

View File

@@ -1,8 +0,0 @@
# Not used by any item
type = "passive"
def handler(fit, module, context):
for type in ("Em", "Explosive", "Kinetic", "Thermal"):
fit.ship.preAssignItemAttr("armor{0}DamageResonance".format(type),
module.getModifiedItemAttr("passiveArmor{0}DamageResonance".format(type)))

View File

@@ -1,7 +1,7 @@
# modifyEnergyWarfareResistance
#
# Used by:
# Modules from group: Capacitor Battery (27 of 27)
# Modules from group: Capacitor Battery (30 of 30)
type = "passive"

View File

@@ -1,8 +0,0 @@
# Not used by any item
type = "passive"
def handler(fit, module, context):
for type in ("Em", "Explosive", "Kinetic", "Thermal"):
fit.ship.preAssignItemAttr("shield{0}DamageResonance".format(type),
module.getModifiedItemAttr("passiveShield{0}DamageResonance".format(type)))

View File

@@ -1,7 +0,0 @@
# Not used by any item
runTime = "early"
type = "passive"
def handler(fit, module, context):
fit.ship.preAssignItemAttr("agility", module.getModifiedItemAttr("agility"))

View File

@@ -1,7 +1,7 @@
# moduleBonusAfterburner
#
# Used by:
# Modules from group: Propulsion Module (62 of 127)
# Modules from group: Propulsion Module (65 of 133)
type = "active"
runTime = "late"

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