Compare commits

...

687 Commits

Author SHA1 Message Date
blitzman
e30040c9fd Bump pre-release 2016-11-22 20:53:57 -05:00
blitzman
6bbfb8e837 Update database to final version for pre-release 2016-11-22 20:50:39 -05:00
blitzman
2ec203a3a2 Update renders 2016-11-22 20:47:28 -05:00
blitzman
4df22d2063 Add new icons 2016-11-22 20:44:56 -05:00
blitzman
bf16246825 Disable booster fit icon (for now) 2016-11-22 20:44:19 -05:00
blitzman
0eed01811c Conversion mappings 2016-11-22 20:36:52 -05:00
blitzman
96b3d5637a Fix industrial core effect 2016-11-22 20:04:57 -05:00
blitzman
4a09cbcec9 Merge branch 'Acendency-IndustrialCoreEffect' of https://github.com/Ebag333/Pyfa into Ebag333-Acendency-IndustrialCoreEffect 2016-11-22 20:00:00 -05:00
Ebag333
964493d701 add logi falloff 2016-11-22 16:52:53 -08:00
Ebag333
f1b9c788f3 Added falloffeffectiveness 2016-11-22 16:38:55 -08:00
Ebag333
a50f89db67 Added stacking penalties, fixed range buff 2016-11-22 16:36:19 -08:00
blitzman
0d94ffe27a Merge branch 'singularity' of https://github.com/pyfa-org/Pyfa into singularity 2016-11-22 18:45:27 -05:00
Ebag333
dc4c4c7353 Change to skill req 2016-11-22 15:03:21 -08:00
Ryan Holmes
8d4e0a259e Fix for #833 2016-11-22 15:35:04 -05:00
Ryan Holmes
91f87b02cc Merge branch 'EffectTest' of https://github.com/Ebag333/Pyfa into Ebag333-EffectTest
Conflicts:
	eos/saveddata/fit.py
	eos/saveddata/module.py
2016-11-22 12:34:10 -05:00
Ebag333
870e333605 Rebase from pyfa.org/master
# Conflicts:
#	eos/effects/boosterarmorhppenalty.py
#	eos/effects/boosterarmorrepairamountpenalty.py
#	eos/effects/boostercapacitorcapacitypenalty.py
#	eos/effects/boostermaxvelocitypenalty.py
#	eos/effects/boostermissileexplosioncloudpenaltyfixed.py
#	eos/effects/boostermissileexplosionvelocitypenalty.py
#	eos/effects/boostermissilevelocitypenalty.py
#	eos/effects/boostershieldcapacitypenalty.py
#	eos/effects/boosterturretfalloffpenalty.py
#	eos/effects/boosterturretoptimalrangepenalty.py
#	eos/effects/boosterturrettrackingpenalty.py
#	eos/saveddata/character.py
#	eos/saveddata/drone.py
#	eos/saveddata/fighter.py
#	eos/saveddata/mode.py
#	eos/saveddata/module.py
2016-11-21 22:21:25 -08:00
Ebag333
7ea3103c25 Updated docstring with more information 2016-11-21 22:02:16 -08:00
Ebag333
3aa60ac669 Make Effects Togglable 2016-11-21 22:02:16 -08:00
blitzman
81612cc32a Remove border from note box text area 2016-11-21 23:51:18 -05:00
Ryan Holmes
d3caee328f Merge pull request #799 from IndictionEve/ActiveFighterAbilities
Activate fighter standard attack and limit active fighters
2016-11-21 23:18:40 -05:00
blitzman
d5af6127e5 Tweaks 2016-11-21 23:02:29 -05:00
blitzman
5eb5fb3310 Merge branch 'drop-null-sec-com' of git://github.com/resinneublem/Pyfa into resinneublem-drop-null-sec-com 2016-11-21 22:56:01 -05:00
blitzman
8605bab4d4 Fix effects running when they shouldn't 2016-11-21 21:59:44 -05:00
Ebag333
1540c9463a Added unused attributes 2016-11-21 13:10:59 -08:00
Ebag333
130105ca9f Fixed attribute, removed duplicate 2016-11-21 12:53:57 -08:00
blitzman
cb225eabb3 Get a working migration for command fits. 2016-11-20 22:06:26 -05:00
blitzman
72245d8ebe Fix bad merge 2016-11-20 21:53:49 -05:00
Ebag333
96505e4421 Industrial core for Rorq 2016-11-20 18:37:12 -08:00
blitzman
fbb1750528 Merge branch 'master' into singularity
Conflicts:
	eos/db/saveddata/fit.py
	gui/additionsPane.py
2016-11-20 20:52:23 -05:00
Ryan Holmes
dad63b6d77 Merge pull request #821 from resinneublem/notes-field
Adds a new notes pane for each fit
2016-11-20 20:48:02 -05:00
blitzman
14e69b1e59 Add "Command Fit" context menu 2016-11-20 19:19:03 -05:00
blitzman
883917d5d6 Add missing effects 2016-11-20 19:17:40 -05:00
blitzman
deeccc85a3 Fix command boosts (attributes renamed) 2016-11-20 19:08:23 -05:00
blitzman
e6dfb1e90a Update some effects and headers 2016-11-20 16:04:32 -05:00
blitzman
e03d3278a0 Update effect headers 2016-11-20 15:37:55 -05:00
blitzman
eae4bb75e5 more fixes 2016-11-20 15:37:12 -05:00
blitzman
59b854b00d Fix some effects 2016-11-20 15:25:27 -05:00
Resin Neublem
675533a732 Drops null-sec.com as an option
It seems like it would be a good idea to make this user configurable so they could enter whatever domain they want.

However with this entire HTML export feature being questionable, I didn't go that far. https://github.com/pyfa-org/Pyfa/issues/825

closes: https://github.com/pyfa-org/Pyfa/issues/826
2016-11-20 14:46:18 -05:00
blitzman
7751a2e072 Merge branch 'AscendencyPatch' of https://github.com/Ebag333/Pyfa into Ebag333-AscendencyPatch 2016-11-20 14:44:53 -05:00
blitzman
b4bbc82ba1 Merge branch 'master' into singularity
Conflicts:
	eos/db/saveddata/fit.py
	eos/effects/armoredwarfaremindlink.py
	eos/effects/elitebonuscommanddestroyerarmored1.py
	eos/effects/elitebonuscommanddestroyerinfo1.py
	eos/effects/elitebonuscommanddestroyerinfohidden1.py
	eos/effects/elitebonuscommanddestroyersiege1.py
	eos/effects/elitebonuscommanddestroyerskirmish1.py
	eos/effects/elitebonuscommandshiparmoredcs3.py
	eos/effects/elitebonuscommandshipinformationcs3.py
	eos/effects/elitebonuscommandshipinformationhiddencs3.py
	eos/effects/elitebonuscommandshipsiegecs3.py
	eos/effects/elitebonuscommandshipskirmishcs3.py
	eos/effects/miningforemanmindlink.py
	eos/effects/shipbonuscarriera4warfarelinksbonus.py
	eos/effects/shipbonuscarrierc4warfarelinksbonus.py
	eos/effects/shipbonuscarrierg4warfarelinksbonus.py
	eos/effects/shipbonuscarrierm4warfarelinksbonus.py
	eos/effects/shipbonusforceauxiliarya4warfarelinksbonus.py
	eos/effects/shipbonusforceauxiliaryc4warfarelinksbonus.py
	eos/effects/shipbonusforceauxiliaryg4warfarelinksbonus.py
	eos/effects/shipbonusforceauxiliarym4warfarelinksbonus.py
	eos/effects/shipbonussupercarriera5warfarelinksbonus.py
	eos/effects/shipbonussupercarrierc5warfarelinksbonus.py
	eos/effects/shipbonussupercarrierg5warfarelinksbonus.py
	eos/effects/shipbonussupercarrierm5warfarelinksbonus.py
	eos/effects/subsystembonusamarrdefensivearmoredwarfare.py
	eos/effects/subsystembonusamarrdefensiveinformationwarfare.py
	eos/effects/subsystembonusamarrdefensiveinformationwarfarehidden.py
	eos/effects/subsystembonusamarrdefensiveskirmishwarfare.py
	eos/effects/subsystembonuscaldaridefensiveinformationwarfare.py
	eos/effects/subsystembonuscaldaridefensiveinformationwarfarehidden.py
	eos/effects/subsystembonuscaldaridefensivesiegewarfare.py
	eos/effects/subsystembonuscaldaridefensiveskirmishwarfare.py
	eos/effects/subsystembonusgallentedefensivearmoredwarfare.py
	eos/effects/subsystembonusgallentedefensiveinformationwarfare.py
	eos/effects/subsystembonusgallentedefensiveinformationwarfarehidden.py
	eos/effects/subsystembonusgallentedefensiveskirmishwarfare.py
	eos/effects/subsystembonusminmatardefensivearmoredwarfare.py
	eos/effects/subsystembonusminmatardefensivesiegewarfare.py
	eos/effects/subsystembonusminmatardefensiveskirmishwarfare.py
	eos/saveddata/fit.py
	eos/saveddata/module.py
	gui/shipBrowser.py
	scripts/prep_data.py
	service/fit.py
2016-11-20 14:42:19 -05:00
blitzman
a0a0ec9b1f Merge branch 'master' of https://github.com/pyfa-org/Pyfa 2016-11-20 14:29:18 -05:00
blitzman
26285cfc95 Tweaks 2016-11-20 14:28:51 -05:00
blitzman
6799e71f1a Merge branch 'projectedRightClickMenu' of git://github.com/IndictionEve/Pyfa into IndictionEve-projectedRightClickMenu 2016-11-20 14:19:45 -05:00
Ryan Holmes
8806c941a8 Merge pull request #816 from Ebag333/LimitLanaguage
Limit lanaguage from multi to en-us
2016-11-20 14:16:47 -05:00
Resin Neublem
78cbed516a Adds a new notes pane for each fit
This allows users to save text notes for each fit. They may do this for history, or usage, etc.
2016-11-20 14:11:42 -05:00
blitzman
2281fae615 Merge branch 'EosCodeCleanup-V2' of https://github.com/Ebag333/Pyfa into Ebag333-EosCodeCleanup-V2
Conflicts:
	eos/effects/mininginfomultiplier.py
2016-11-20 13:59:14 -05:00
Ryan Holmes
1192a0658a Merge pull request #806 from Ebag333/GitIgnore
Ignore temp files
2016-11-20 13:55:18 -05:00
blitzman
7f2ac25455 Remove fleet booster context menu on fit 2016-11-20 13:54:56 -05:00
blitzman
62a696cc4b Only apply command boosts when command module is active, and add t2 command burst effect 2016-11-20 13:21:59 -05:00
blitzman
11716f7f94 Add command processor effect 2016-11-20 03:22:28 -05:00
blitzman
180166156a Revert mining change (#771) 2016-11-20 02:51:15 -05:00
blitzman
3c8bab92b5 Add some missing effects 2016-11-20 02:17:57 -05:00
Ryan Holmes
cf361593a4 Merge pull request #771 from Ebag333/MiningCrystalBonus
Applied Mining Crystal Bonus to modules
2016-11-20 02:00:02 -05:00
blitzman
8ad639a122 Add titan command effects 2016-11-20 01:54:45 -05:00
blitzman
a7cd445cef Add Mining Burst effects 2016-11-20 01:33:22 -05:00
blitzman
380d74b333 Fix issue with gangboost not recalculating. We really should ensure that a command fit that has been calcuated does not need ot recalculate unless it's changed / is needed. But that's for a different time. 2016-11-20 01:14:40 -05:00
blitzman
eade4f0ebd Add the four main combat boost module effects 2016-11-20 00:59:07 -05:00
blitzman
08be50caf2 More work on command boosts 2016-11-19 23:53:49 -05:00
Ebag333
6a5c86b84f Should be all the Rorq and Orca effects. 2016-11-19 18:51:59 -08:00
Ebag333
1fb5bbc36e Effects used by Orca
first pass
2016-11-18 20:53:57 -08:00
Ebag333
d6edb57a10 Update to current TQ DB 2016-11-18 20:53:39 -08:00
Ebag333
3217980ada Revert "Switch Shield/Cap to using new formula"
This reverts commit d2a52e26b2.
2016-11-16 12:11:27 -08:00
Ryan Holmes
29b5a7433d Trying to flesh out how command boosts are gonna work. 2016-11-16 09:54:02 -05:00
Ebag333
5bca2d723e Change from multi to en-us only
Allows this to run in 32 bit Python.
2016-11-15 10:10:19 -08:00
Ebag333
d2a52e26b2 Switch Shield/Cap to using new formula
The old formula was surpsingly close in most scenarios.  It is, however,
hardcoded to 25% which isn't always peak cap/shield regen.
2016-11-14 05:27:16 -08:00
Indiction
a9fb55fedd Add "projected" to selected fitting via shipbrowser right click menu 2016-11-13 20:48:44 +01:00
Ebag333
c0210895e9 Ignore temp files
These don't exist for long, but could catch them in a commit if you
clicked commit too quickly.
2016-11-09 07:44:24 -08:00
Ebag333
fe9917e620 Updated docstring with more information 2016-11-09 07:21:27 -08:00
Ebag333
a3dfa3b5ba Make Effects Togglable 2016-11-09 00:46:19 -08:00
blitzmann
34243b7b71 Get a working UI skeleton going for assigning boost fits 2016-11-08 19:36:57 -05:00
blitzmann
9fd81e8acd Copy projected view into a command view, first step to developing new command burst structure 2016-11-08 00:21:25 -05:00
Indiction
bbc4ef8146 Activate "standard attack" if available.
If there is no "standard attack" all other abilities set active except propmods
2016-11-07 23:28:27 +01:00
blitzman
6849478226 Change hyphens in fitting tooltip to unicode dashes 2016-11-06 21:51:33 -05:00
Indiction
6cda47be9f Activate all fighter abilities by default and deactivate fighter groups if more than the maximum number of fighters are in bay 2016-11-06 23:19:18 +01:00
Indiction
a0ef1a3d9b change to ternary operators (less ugly) 2016-11-06 20:37:24 +01:00
Indiction
ba47420577 Bugfix: Unable to handle ships without traits (Citadels) 2016-11-06 18:47:56 +01:00
Indiction
806f17545f Moved HTML remover into ShipItem and FitItem function 2016-11-06 16:36:12 +01:00
Indiction
f0f5b4c04c Tooltip to Ships and Fittings 2016-11-06 16:14:49 +01:00
Ebag333
ad76104033 Revert "Create variables before they are referenced. "
1dc15936ed

This is a problem for us.  See #794 for more details.
2016-11-04 14:18:18 -07:00
Ryan Holmes
c6e481efcf Merge pull request #791 from IndictionEve/OpenFittingsInNewPage
open fittings in new page by default
2016-11-04 12:48:23 -04:00
Ryan Holmes
2ad0c00c17 Merge pull request #792 from ppfeufer/patch-1
fixed link to development repository
2016-11-04 12:43:19 -04:00
Peter Pfeufer
26ab7d5e6f fixed link to development repository 2016-11-04 07:18:35 +01:00
Ebag333
832e7e6637 Revert moving projectionInfo out
Need to handle this better. :/
2016-11-03 22:15:40 -07:00
Ryan Holmes
8c7972ed78 Merge pull request #784 from Ebag333/Gitignore
Include more standard exceptions to gitignore
2016-11-03 15:01:23 -04:00
Ryan Holmes
05bbc14965 Merge pull request #789 from Ebag333/BurstJammerStrengthFix
Add Burst Jammer to effects modified by Scorpion hull bonus
2016-11-03 14:59:21 -04:00
Ryan Holmes
e7feee6878 Merge pull request #759 from minlexx/feature/proxy_auth
Add login/password for proxy authorization in network settings
2016-11-03 14:58:08 -04:00
Indiction
791ddcb9a1 load fitting in selected page if ctrl-key pressed and option active 2016-10-30 01:05:22 +02:00
Indiction
12d5a21982 Option to open fittings in a new page by default 2016-10-30 00:43:23 +02:00
Ebag333
e7c79e58b4 Use in instead of or, because that makes sense 2016-10-26 10:09:43 -07:00
Ebag333
0dbdbf7cfe Add Burst Jammer to effects modified by Scorpion hull bonus 2016-10-26 08:42:49 -07:00
Ebag333
f39ca66dbf Include more standard exceptions to gitignore 2016-10-23 13:20:45 -07:00
Ryan Holmes
8d80494b8d Merge pull request #783 from Ebag333/ExportHiddenAttribs
Implement new method for exporting values
2016-10-23 14:40:38 -04:00
Ebag333
058768baab Implement new method for finding values
Original method would only export values that were attached directly to
the ship.  New method starts from the modified dict, which will export
values without attribute IDs or original values.
2016-10-23 10:44:59 -07:00
blitzman
cfee6fdcd0 Add effects for command mindlinks 2016-10-23 03:02:47 -04:00
blitzman
34c95bea5d Apply command burst skills to the bursts and charges. Handle renamed items. 2016-10-23 02:34:29 -04:00
blitzman
50911c7fc8 test 2016-10-22 00:02:12 -04:00
Ryan Holmes
4e1f0f9cc6 Merge pull request #779 from Ebag333/ExportButton
Add button for exports
2016-10-21 22:29:40 -04:00
Ebag333
2b1abfc9b2 No longer refresh GUI. They can click the refresh button themselves, lazy jerks. 2016-10-21 19:28:54 -07:00
Ebag333
595c139ca8 Add button for exports 2016-10-21 10:53:47 -07:00
blitzman
6637feb3a6 Update to sisi 1086428 2016-10-20 00:43:45 -04:00
Ebag333
928246a8ca Even more PEP8 fixes!
Also, create a variable so we can't reference it and have it not exist.
Because that would be bad.
2016-10-19 14:26:46 -07:00
Ebag333
fd3e0bbebf Formatting and spacing 2016-10-19 14:14:34 -07:00
Ebag333
2a0a572b76 PEP8 formatting! \o/ 2016-10-19 14:03:31 -07:00
Ebag333
a314cd7cfd Revert adding the __init___ 2016-10-19 13:33:25 -07:00
Ebag333
cd28375019 Put some imports back. Prooooobably not needed but vOv 2016-10-19 13:32:57 -07:00
Ebag333
7cf4134a73 SQLAlchemy doesns't like is, requires ==
Oops.
2016-10-19 13:32:35 -07:00
Ebag333
44c76f0b98 Even more PEP8 cleanup 2016-10-19 12:29:33 -07:00
Ebag333
69a122a271 more PEP8 cleanup 2016-10-19 12:26:03 -07:00
Ebag333
0c0eb327f7 lots of PEP8 cleanup 2016-10-19 12:25:31 -07:00
Ebag333
74ce79ba8f Add inspection exception to ignore reassignment of self 2016-10-19 12:11:30 -07:00
Ebag333
1dc15936ed Create variables before they are referenced.
Resolves attribute reference validation errors in pyCharm
2016-10-19 12:08:35 -07:00
Ebag333
126fa7be29 remove trailing semicolon 2016-10-19 11:51:12 -07:00
Ebag333
d61251e9b3 Reformatting eos (root) 2016-10-19 11:46:26 -07:00
Ebag333
f9f53a13c0 Reformatting eos.saveddata 2016-10-19 11:42:45 -07:00
Ebag333
b4360d44f1 Reformatting eos.graph 2016-10-19 11:38:43 -07:00
Ebag333
574d575cad Reformatting eos.db 2016-10-19 11:37:28 -07:00
Ebag333
5e10339c20 Reformatting eos.db.saveddata 2016-10-19 11:33:29 -07:00
Ebag333
feb83cf737 Revert "Revert "Reformatting eos.db.gamedata""
This reverts commit 0ff4aec400.
2016-10-19 11:26:40 -07:00
Ebag333
0ff4aec400 Revert "Reformatting eos.db.gamedata"
This reverts commit e2944f6be7.
2016-10-19 11:24:03 -07:00
Ebag333
e2944f6be7 Reformatting eos.db.gamedata 2016-10-19 11:19:24 -07:00
Ebag333
3e842f30f1 Reformatting all effect files for readability and better PEP8 compliance 2016-10-19 11:16:32 -07:00
Ebag333
481619101b Reformatting for PEP8 standards 2016-10-19 11:09:13 -07:00
Ebag333
2ac66d87af commented out reload as not used 2016-10-19 10:54:59 -07:00
Ebag333
e818ce62c8 Removed line from legacy implementation 2016-10-19 10:54:47 -07:00
Ebag333
49851d1131 Removed unnecessary assignment (variable assigned later) 2016-10-19 10:37:59 -07:00
Ebag333
a8061c9276 Remove unnecessary backslash
and a bit of reformatting
2016-10-19 08:58:19 -07:00
Ebag333
4036ac8cd2 Move projectionInfo so it can't be referenced without being assigned 2016-10-19 08:53:11 -07:00
Ebag333
57bbbfcc3b Convert triple single quote docstring to triple double quote docstring
For better consistency
2016-10-19 08:39:12 -07:00
Ebag333
68f769aac2 Remove redundent parentheses 2016-10-19 08:37:07 -07:00
Ebag333
ef9bd3edc8 Change class method from self to cls
Better match coding standards
2016-10-19 08:33:28 -07:00
Ebag333
45f88a92dc Use list literal 2016-10-19 08:27:29 -07:00
Ebag333
02c8b46b74 Fixed formatting issues
Mixed spaces/tabs.  Also converted to using container instead of module.
Reformatted file.
2016-10-19 08:26:18 -07:00
Ebag333
32068e8d8e Create set directly 2016-10-19 08:22:45 -07:00
Ebag333
ccd8ee87f3 Create dictionary directly 2016-10-19 08:18:47 -07:00
Ebag333
c73b446482 Comparison with None performed iwth equality operators 2016-10-19 08:17:34 -07:00
Ebag333
699276ca58 Add __init__ to classes missing it
Mostly just to shut pyCharm up, but it's good practice.
2016-10-19 08:15:36 -07:00
Ebag333
3187bab90a Simplified Chained Comparison 2016-10-19 08:11:20 -07:00
Ebag333
c1dfd676e1 Simplified boolean check 2016-10-19 08:08:50 -07:00
Ebag333
c7554ec400 Removed reassigned var
i was already declared by the parent loop, removed reassignment
2016-10-19 08:06:39 -07:00
Ryan Holmes
f1771a61d0 We're now using Slack for communications \o/ 2016-10-18 11:31:41 -04:00
Ebag333
d3cb968c19 Why the hacks, CCP? 2016-10-16 21:44:11 -07:00
blitzman
9c685263bb Merge branch 'master' of https://github.com/pyfa-org/Pyfa 2016-10-17 00:14:37 -04:00
blitzman
d43db40469 Fix running mining effect for every active drone in the stack 2016-10-17 00:14:06 -04:00
blitzman
a50471c0a6 Merge branch 'MiningDroneBonus' of https://github.com/Ebag333/Pyfa into Ebag333-MiningDroneBonus 2016-10-17 00:01:49 -04:00
Ryan Holmes
8d215f7d7f Merge pull request #764 from Ebag333/MiningDroneRigStackingPenalty
Removed stacking penalty from Mining Drone Rigs
2016-10-17 00:00:23 -04:00
Ebag333
eb9b034d65 Fixed maths with more than 1 drone
Also tightened up code a bit. Does nothing now if there isn't a
miningDroneAmountPercent
2016-10-16 20:52:09 -07:00
blitzman
c52fecead3 Fix fit drag image getting stuck when mouse capture is lost (#479) 2016-10-16 22:32:40 -04:00
Ryan Holmes
5b09cf7c4d Merge pull request #769 from Ebag333/IntegratedAnyalyzersEffectCountedTwice
Integrated Hacking Modules Give Double Bonus Incorrectly
2016-10-16 22:13:55 -04:00
Ebag333
9be9a21b22 Applied Mining Crystal Bonus to modules
Previously the mining crystal bonus was not applied to modules, so
adding a crystal didn't change the amount mined at all.  This now
applies.  Left the old application in place, so it still applies to a
nonsense `specialtyMiningAmount` stat if you want to see that seperated
out for some weird reason.
2016-10-16 15:09:17 -07:00
Ebag333
9fe91472cf Integrated Hacking Modules Give Double Bonus Incorrectl
Because integrated modules are a single module with both Data and Relic
analizer built into one, ship hulls were giving a bonus twice over.
Changed it from adding the bonus for each individually (which worked
fine when it was broken out) to simply adding it if either Hacking or
Archaeology skill is present.
2016-10-16 12:14:21 -07:00
Alexey Min
a06810c7c8 Network settings GUI: Use "Username:" and "Password:" for labels, as you wish 2016-10-09 13:20:20 +05:00
Alexey Min
160de64135 Network settings GUI: be prepared for None return from getProxyAuthDetails() 2016-10-09 13:16:38 +05:00
Alexey Min
2b5535c5d1 service/network: change "if" condition as suggested by @blitzmann 2016-10-09 13:14:37 +05:00
Alexey Min
1e9f911385 service/settings: setProxyAuthDetails(): empty string as login means no password too 2016-10-09 13:07:13 +05:00
Alexey Min
2a9a4fbdff service/settings: make getProxyAuthDetails() return None again 2016-10-09 13:05:39 +05:00
Ryan Holmes
7331c158b6 Merge pull request #756 from MrNukealizer/FighterFixes
Fixed a few fighter/carrier bugs:
2016-10-08 23:07:01 -04:00
Ebag333
ddcbbb7fcf Use the mining effect
This effect is only used by mining drones, and it's not been
implemented.

See #762 for more info
2016-10-07 20:43:14 -07:00
Ebag333
e7ac1597bb Removed stacking penalty 2016-10-07 09:05:18 -07:00
Ryan Holmes
11e8ea4fe8 Merge pull request #761 from petosorus/fix-numCharges
Fix of the number of charges in multibuy
2016-10-06 10:49:50 -04:00
petosorus
1853500729 Fix of the number of charges in multibuy 2016-10-06 08:45:35 +02:00
Mr. Nukealizer
a349626923 Changed fighter selection for NSA bonus 2016-10-05 22:44:10 -07:00
Ryan Holmes
f466f9cc49 Merge pull request #751 from Ebag333/T2-Resist-Profiles
Add T2 resists and 90% resist profile
2016-10-05 22:27:07 -04:00
blitzman
13b452223d bump dev 2016-10-02 22:02:50 -04:00
Alexey Min
c166fa6bf5 service/network: revert to simple ProxyHandler with login:password@host:port format
previous sh@t with password managers and proxy basic auth handlers did not work for me :(
this way is simpler AND working.

Also explicitly use the default urllib2 opener if proxy is disabled (bug fix)
2016-10-02 22:08:58 +05:00
Alexey Min
3a7e343f1c Network preferences settings: GUI to set proxy login/password 2016-10-02 19:15:32 +05:00
Alexey Min
02557701f0 NetworkSettings: never return None in proxy auth details getter,
return a tuple with empty strings instead
2016-10-01 13:47:27 +05:00
Mr. Nukealizer
30755fbb73 Made fighter DPS calculations more accurate when factoring in reload time. 2016-09-30 23:44:12 -07:00
Mr. Nukealizer
c1b3491933 Fixed superiority fighter attack and added Evasive Maneuvers ability. 2016-09-30 21:40:10 -07:00
Mr. Nukealizer
5467a58b04 Fixed a few fighter/carrier bugs:
* Omnidirectional Tracking Link overheat applies to explosion radius/velocity bonuses.
* Networked Sensor Array affects fighters' sensor strengths.
* Long range heavy fighters no longer appear to require Bomb Deployment.
* Carriers and supercarriers are no longer capped at 300km lock range.
2016-09-30 20:25:55 -07:00
Alexey Min
75f07afcb7 NetworkSettings: add setter method for proxy auth details (login, password) 2016-09-29 20:21:11 +05:00
blitzman
c64838f7f5 Update effect headers and bump stable 2016-09-28 00:20:30 -04:00
Alexey Min
a0359b8bd9 [WIP] Add basic proxy authorization support to Network service class.
not tested yet, will test later
2016-09-28 01:42:59 +05:00
Ryan Holmes
e2434619b5 Merge pull request #733 from petosorus/multibuy-export
Multibuy format export feature, adresses #726
2016-09-27 01:49:12 -04:00
blitzman
becb3d4bb6 Fit Citadel imports (#749) 2016-09-27 01:45:21 -04:00
blitzman
44fb4a558c fix some rigs 2016-09-27 01:25:49 -04:00
Ryan Holmes
9a574cb31b Merge pull request #740 from Ebag333/ECM-Burst-Effect
Implementing ECM Burst Jammer as a projected effect
2016-09-27 00:35:26 -04:00
blitzman
4fa4640991 Update to YC118.8 1.3 2016-09-27 00:34:14 -04:00
Ebag333
35b5002eca Add T2 resists and 90% resist profile 2016-09-25 22:52:11 -07:00
blitzman
b5574ca535 bump dev 2016-09-25 22:04:54 -04:00
Alexey Min
8fec03bcbf Add proxy login/pass fields to NetworkSettings class.
Use named "constants" instead of hardcoded numbers for proxy "mode" parameter
2016-09-25 04:16:07 +05:00
Ebag333
48f264851d Implementing ECM Burst Jammer as a projected effect 2016-09-16 11:39:00 -07:00
petosorus
467d244bea Booster export in EFT Implants export 2016-09-16 18:40:24 +02:00
petosorus
840c041f8c Fighters get exported in EFT export 2016-09-16 12:06:17 +02:00
petosorus
43ee031121 Number of charges loaded 2016-09-15 16:01:32 +02:00
petosorus
533c86de16 Removal of empty lines when there are empty slots 2016-09-15 11:20:45 +02:00
petosorus
ba3c9b87b5 Fighters handling in Multibuy export 2016-09-15 08:27:38 +02:00
petosorus
8338b6adb3 Implants and boosters in Multibuy export 2016-09-15 08:19:21 +02:00
petosorus
54c950f951 Multibuy format export feature 2016-09-14 23:38:09 +02:00
blitzman
d1c18d9642 Bump stable 2016-09-06 23:51:25 -04:00
Ryan Holmes
19090e7353 Merge pull request #720 from BartMassey/master
fixed syntax typo in modulebonusomnidirectionaltrackingenhancer.py
2016-09-06 23:45:01 -04:00
Bart Massey
1d52382460 fixed syntax typo in modulebonusomnidirectionaltrackingenhancer.py 2016-09-03 00:26:29 -07:00
blitzman
a074199219 Bump stable 2016-09-01 22:20:51 -04:00
blitzman
c1179ddb40 Fix issue with fighter bomber charges causing skill requirement warnings 2016-08-30 23:45:21 -04:00
blitzman
ef06a1ccb1 Merge remote-tracking branch 'origin/master' 2016-08-30 23:16:12 -04:00
Ryan Holmes
e31f3cb46e Update modulebonusomnidirectionaltrackingenhancer.py 2016-08-30 23:14:48 -04:00
Ryan Holmes
9f9cd29a7f Merge pull request #712 from pyfa-org/feature/citadels
Feature/citadels
2016-08-30 09:23:34 -04:00
blitzman
ed24ef2615 Delete projected modules from citadels 2016-08-28 20:22:30 -04:00
blitzman
c5b78c20e5 Do not allow projection to citadels 2016-08-28 20:00:46 -04:00
blitzman
f98f6a120b Bump dev, fix issue with applying fleet boosts 2016-08-28 19:35:55 -04:00
blitzman
6192343add bump stable 2016-08-26 21:55:52 -04:00
blitzman
6728aba0a5 Fix icons 2016-08-26 21:53:47 -04:00
blitzman
64b75303af Quick fix for override window crashing trying to load items that no longer exist (#706) 2016-08-26 21:52:56 -04:00
blitzman
0eef1ee480 Fix for #705 2016-08-26 21:29:12 -04:00
blitzman
fef087ae46 jk 2016-08-26 21:13:03 -04:00
blitzman
0e15adecf2 Bump stable 2016-08-24 22:31:44 -04:00
blitzman
be6addf4d0 update dist (holy shit how long has this not been in master?) 2016-08-24 22:16:05 -04:00
blitzman
052e9b68b5 add missing service slot 2016-08-24 22:01:39 -04:00
blitzman
fd91f56e55 Give citadels their own Upwell logo 2016-08-24 21:46:14 -04:00
Ryan Holmes
a0a35d60ec Merge pull request #700 from PageArkanis/feature/citadels
fixed exception that froze interface
2016-08-24 20:45:01 -04:00
blitzman
639f3d27b4 Fix citadel rig bonuses 2016-08-24 20:41:38 -04:00
blitzman
e3040854d8 Merge remote-tracking branch 'origin/master' 2016-08-24 20:23:22 -04:00
Ryan Holmes
4597fd27da Merge pull request #701 from shagie/master
Update README.md with current brew instructions
2016-08-19 14:36:50 -04:00
shagie
88bceae6b0 Update README.md with current brew instructions
```
Error: No available formula with the name "pyfa" 
==> Searching for similarly named formulae...
Error: No similarly named formulae found.
==> Searching taps...
This formula was found in a tap:
Caskroom/cask/pyfa
To install it, run:
  brew install Caskroom/cask/pyfa
```
2016-08-19 13:00:07 -05:00
PageArkanis
9ace9815b6 fixed exception that froze interface 2016-08-19 15:11:06 +01:00
blitzman
bfda7014db Fix citadels not showing up in ship search 2016-08-14 21:05:30 -04:00
blitzman
5107d383e0 Merge branch 'citadel' 2016-08-14 20:40:32 -04:00
blitzman
32ba3fa516 Fix targeting delay effect running when rig is offline (#696) 2016-08-12 21:08:21 -04:00
blitzman
69723d1bd0 Fix for #695 2016-08-12 21:01:22 -04:00
blitzman
5a5ab846c2 Fix for search 2016-08-12 20:05:22 -04:00
blitzman
d81a51bd8c bump version 2016-07-24 18:29:36 -04:00
blitzman
3ac733a30c Merge branch 'master' into citadel 2016-07-24 01:25:57 -04:00
Ryan Holmes
7a715fc471 Merge pull request #684 from Ebag333/Neuts
Applied size reduction effect to neut/nos
2016-07-24 01:25:15 -04:00
Ryan Holmes
b9b72ebf40 Merge pull request #685 from Ebag333/RAHBug
RAH gets pissy if there is no damage profile
2016-07-18 23:26:00 -04:00
Ebag333
071dfaf656 Removed ship size, as this applies only to NPCs 2016-07-18 06:41:50 -07:00
Ebag333
88384a2fd8 RAH gets pissy if there is no damage profile
If there is no damage profile (likely from one that's deleted, and
somehow the profile doesn't get set back to uniform), then RAH tries to
apply null values.  This skips making the RAH reactive if that scenario
happens.
2016-07-17 14:10:58 -07:00
Ebag333
a2c0049488 Moved neut reduction logic into fit.py 2016-07-17 13:43:52 -07:00
Ebag333
60288204fc switched from using container/module to bag_of_dicks
Also cleaned up some warnings PyCharm was throwing.
2016-07-17 11:24:24 -07:00
Ebag333
7d0f65c1f3 Moved the sig size reduction under projected 2016-07-17 10:52:08 -07:00
Ebag333
a35b9b5d3f Added sig reduction for cap neuts 2016-07-17 10:47:15 -07:00
Ebag333
2a2842100a Applied size reduction effect to neut/nos 2016-07-17 00:01:41 -07:00
blitzmann
faed0ce159 Merge remote-tracking branch 'origin/master' into citadel
Conflicts:
	config.py
2016-07-16 21:45:28 -04:00
blitzmann
23a6849fe3 Bump release 2016-07-07 19:40:21 -04:00
blitzmann
91c6e91023 Fix Cataclysmic Variable effects (#628) 2016-07-07 19:21:41 -04:00
blitzmann
8f64c91677 Update effect headers 2016-07-06 23:52:42 -04:00
blitzmann
842ee3d426 Fix Genolution implant set bonus (#672) 2016-07-06 23:50:31 -04:00
blitzmann
45d338ba3d Add price to item compare (#673) 2016-07-06 22:30:31 -04:00
blitzmann
f141fac3a2 Add fighters to overall fitting price (#674) 2016-07-05 23:34:19 -04:00
blitzmann
7b2a89d66b Add structure rig effects (untested) 2016-07-05 23:26:24 -04:00
blitzmann
4d158d99fd Fix crash related to structure rigs not having meta level, and a traceback that might happen occasionally. 2016-07-05 23:23:55 -04:00
blitzmann
c3983a26c5 Add structure rigs 2016-07-05 00:21:08 -04:00
blitzmann
016854a292 Clean up effects 2016-07-04 23:31:41 -04:00
Ebag333
5d7252cbec fixed referencec 2016-07-04 15:50:00 -07:00
Ebag333
0e0bcf51fc Added Effects Files for Citadel Modules 2016-07-04 14:27:35 -07:00
blitzmann
f396077cd6 Remove stacking penalty from Asklepian implants 2016-07-04 13:52:25 -04:00
blitzmann
1c194b67f3 Restrict projected view after speaking with CCP Larrikin about mechanics 2016-07-04 11:18:47 -04:00
blitzmann
72e77d2264 Fix some wording 2016-07-04 11:05:50 -04:00
blitzmann
10c79ac812 More work on restrictions 2016-07-04 11:01:08 -04:00
blitzmann
fe8c3a4957 Disable fit add on pages based on context (ship vs citadel) 2016-07-04 10:30:04 -04:00
blitzmann
3734be21d6 Fix icons and script and version 2016-07-03 20:48:20 -04:00
blitzmann
8ae6ad879e Add structure skill effects 2016-07-03 20:03:00 -04:00
blitzmann
92b2a35888 Fix omega implant 2016-07-03 17:42:12 -04:00
blitzmann
fb2e6e5c17 Restrict skills being applied to citadels. The effect must be of type "structure" for it to apply. Fix issue with agility 2016-07-03 14:52:00 -04:00
blitzmann
2212311a44 Add effects for Asklepian implant set 2016-07-03 14:25:05 -04:00
blitzmann
ef3791f845 bump dev 2016-07-03 01:11:28 -04:00
blitzmann
6e2878194c Merge branch 'master' into citadel
Conflicts:
	config.py
	service/market.py
2016-07-03 01:10:26 -04:00
blitzmann
e7780485f1 Bump release 2016-07-03 00:41:21 -04:00
blitzmann
7831999563 Update effect headers 2016-07-03 00:40:10 -04:00
blitzmann
7020f4bda9 Fix compare when item doesn't have a meta (#667) 2016-07-03 00:38:22 -04:00
Ryan Holmes
dcd21bd165 Merge pull request #669 from Ebag333/VehementDPSEffectsFile
Fixed type of weapon
2016-07-03 00:26:58 -04:00
Ebag333
4a70028762 Fixed type of weapon
Used to be applied to Naglfar, but everyone knows that Vehement is the
new Naglfar, and never use projectiles after memorial day (only
hybrids).
2016-07-02 01:02:03 -07:00
blitzmann
9255a9e638 bump dev 2016-07-01 23:38:06 -04:00
blitzmann
02736ac92d Bump version 2016-07-01 22:07:56 -04:00
blitzmann
2df01c7157 Merge branch 'singularity' 2016-07-01 22:04:25 -04:00
blitzmann
01a0745b9b Update database and fix some icon related bugs 2016-07-01 22:03:51 -04:00
blitzmann
c7573ad4c3 Update icons / fix script 2016-07-01 00:44:17 -04:00
blitzmann
06f402bb9d Add sde icon script 2016-06-28 23:34:39 -04:00
blitzmann
b9f0812b38 Fix issue with entity editor and wxPython 2.8 2016-06-28 23:24:01 -04:00
blitzmann
cdca8fe236 New effects 2016-06-28 22:00:18 -04:00
blitzmann
c8175d1191 Only compare attributes with display names (ones that don't have display names are normally internal attributes) 2016-06-23 23:19:08 -04:00
blitzmann
7a7a0f1eff Merge branch 'feature/item-compare' into singularity 2016-06-23 22:57:09 -04:00
blitzmann
5176fe0366 Sort by meta level 2016-06-23 22:56:40 -04:00
blitzmann
b4bd6e7acd Ensure we have an active fit when exporting to crest 2016-06-23 22:44:24 -04:00
blitzmann
bd4dbf45af Beautify pyfa's CREST login message 2016-06-23 22:16:08 -04:00
blitzmann
d9fc3d436b Allow EHP toggle to persist between fits (#641) 2016-06-19 23:50:42 -04:00
blitzmann
67143cbc0e Fix for siege stacking penalty (#653) 2016-06-19 23:18:59 -04:00
blitzmann
ed3b2eb1bf Fix energy warfare 2016-06-19 23:04:52 -04:00
blitzmann
7a5e4291a5 Handle renamed groups 2016-06-19 12:40:49 -04:00
blitzmann
d1c6810e1e Update to SISI 1050133 2016-06-19 12:39:09 -04:00
blitzmann
faa9c0a2b9 Fix my merge fail 2016-06-18 23:29:53 -04:00
Ryan Holmes
0456973093 Merge pull request #639 from Ebag333/default-database-profiles
Default database profiles
2016-06-18 23:25:07 -04:00
blitzmann
4a79a4e4d9 Merge remote-tracking branch 'origin/master'
Conflicts:
	gui/mainMenuBar.py
2016-06-18 23:14:23 -04:00
blitzmann
ac46d33a60 Fix CREST export (#655) 2016-06-18 23:10:01 -04:00
Ebag333
0f958bef81 Removed _init_ definition as it's redundant 2016-06-16 19:08:29 -07:00
Ebag333
b79009517e Updated po-ta-toe to po-tah-toh 2016-06-16 14:46:22 -07:00
Ebag333
12ccc96f46 Updated as per Blitzmanns feedback
https://github.com/pyfa-org/Pyfa/pull/639#issuecomment-225749245
2016-06-15 23:42:38 -07:00
Ebag333
47828c38d2 Merged differences from master (more catching up) 2016-06-15 19:40:45 -07:00
blitzmann
afdae6a3d6 Added first iteration of item comparisons. 2016-06-15 22:26:48 -04:00
Ebag333
03d1d8f5a4 Merged changes from pyfa-org/master into branch
Merged changes to see if we can clear up the merge conflict warning
2016-06-15 18:24:40 -07:00
Ryan Holmes
cc4e4c0f13 Merge pull request #649 from Ebag333/ECM-Misc-Column-Improvements
Updated ECM to be more descriptive
2016-06-13 21:21:29 -04:00
Ebag333
2f6f14fef2 Update misc.py 2016-06-13 18:14:41 -07:00
Ryan Holmes
fb590ddfdd Merge pull request #644 from Ebag333/Item-Attributes--Show-Base-Value
Added base column to item window
2016-06-13 20:44:15 -04:00
Ryan Holmes
a5e674cdc4 Merge pull request #650 from Ebag333/Group-Attribute-Overrides-Menu
Grouped Attributes override
2016-06-13 20:37:56 -04:00
blitzmann
e28883dd47 Merge branch 'default-database-profiles' of git://github.com/Ebag333/Pyfa 2016-06-13 20:01:35 -04:00
Ebag333
b4694dcf03 Implemented menu option to import default database values
Allows for existing databases to be updated with the current default
profiles.  Can also be used to inject other defaults (maybe 0 and V
chars?)
2016-06-13 14:13:38 -07:00
Ebag333
4c05d9a687 Grouped Attributes override
Users are confused because they find the menu to edit attribute
overrides, change values, then do not see their values reflected.  There
is an option that needs to be enabled under the edit menu to show the
users overrides.

Moved this option from the edit menu to the window menu (next to the
existing attributes override editor), and grouped them together.
Functionality is not changed, merely placement of the overrides toggle.
2016-06-13 13:54:15 -07:00
Ebag333
53da2f9bb2 Many updates
Redid all the values, especially updated target resist profiles.
Re-implemented the _init_ on service\damagePattern.py to check for
default values.
2016-06-13 13:49:56 -07:00
Ebag333
ea106b6064 Updated to round values that are floats to int
Only ints are handled currently, if you throw a float at it, you'll get
a stacktrace.  This is just a little safety to convert it to an int, so
if we somehow get a float (like via database injection/modification), we
quietly convert it to the expected format
2016-06-12 17:24:49 -07:00
Ebag333
32f671b4f2 No longer show "base" column when looking at a market item
Since they are identical.
2016-06-12 17:07:37 -07:00
Ebag333
25e298ff69 Updated ECM to be more descriptive
Gave it the RAH treatment. Now shows min/max values if it's a racial,
and only one for multispectral.  Tooltip shows all four broken out.
2016-06-12 16:46:18 -07:00
Ebag333
45006fe043 reverted back to original 2016-06-12 12:30:29 -07:00
blitzmann
3e1c561752 Implement reload time in fighter dps logic (#627) 2016-06-12 14:15:25 -04:00
blitzmann
be4b78ee1c Module replacement when dropping market module onto fitting view (#528) 2016-06-12 12:38:25 -04:00
Ryan Holmes
5a2989cae4 Update README
Yes, I originally copied it from Osmium, because :effort:
2016-06-12 03:22:21 -04:00
Ryan Holmes
15519fd783 Update misc.py 2016-06-12 02:18:18 -04:00
Ryan Holmes
a357a5b845 Merge pull request #643 from Ebag333/SeBo-Misc-Column-Improvements
Added sensor strength to handle scripting the SeBo
2016-06-12 02:16:13 -04:00
Ryan Holmes
806b8f135b Merge pull request #634 from Ebag333/master
RAH follows damage profile
2016-06-12 02:13:03 -04:00
Ebag333
f2b636bd44 Rewrote function 2016-06-11 00:50:40 -07:00
Ebag333
0d25eca6e5 Added base column 2016-06-10 21:10:04 -07:00
Ebag333
e5dcac43dc Added sensor strength to handle scripting the SeBo 2016-06-10 20:36:20 -07:00
Ebag333
8629710223 Add RAH misc column and tooltip 2016-06-10 19:33:13 -07:00
Ebag333
111e2cc0de Loads default database values on DB creation
Loads defaults for target resists and damage profiles....for now.

Can be extended to add anything we want on DB creation.  Can be extended to add a "load default value to database" button somewhere down the line, to support people who have existing databases and don't want to recreate them.
2016-06-06 16:25:20 -07:00
Ebag333
8eb0b942c8 Remove _init_ hack to import the default pattern
Removed the kludgey method of using _init_ to check to see if the Uniform 25/25/25/25 damage pattern exists, and if missing create it.

Moved creation of it to prefetch.py.
2016-06-06 16:22:08 -07:00
Ebag333
4c55827aa4 call function to import defaults to database 2016-06-06 16:18:16 -07:00
Ebag333
0a1be7d966 Update adaptivearmorhardener.py 2016-06-06 16:16:56 -07:00
Ebag333
8f3370307a Merge branch 'master' of https://github.com/Ebag333/Pyfa 2016-06-05 00:13:22 -07:00
Ebag333
dd1545c7e1 Merge remote-tracking branch 'refs/remotes/pyfa-org/master' 2016-06-05 00:13:09 -07:00
Ebag333
8ea9bee810 Update adaptivearmorhardener.py 2016-06-04 23:58:34 -07:00
blitzmann
6141356754 Add Ice Products to search results (#600) 2016-05-30 22:43:31 -04:00
blitzmann
e70ea67fec Proper fix to attribute caps 2016-05-30 12:29:06 -04:00
blitzmann
62be4c5bce Merge branch 'master' of git://github.com/Timmeey/Pyfa into Timmeey-master 2016-05-28 17:01:58 -04:00
blitzmann
394a9540b0 Bump dev 2016-05-28 17:01:52 -04:00
Ryan Holmes
62d22f0e74 Merge pull request #629 from wolfwood/aar-amount-display 2016-05-28 16:57:51 -04:00
wolfwood
1cd7b9a250 correct '(E)HP restored over duration' calculation to reflect removal of AAR multiplier from armorDamageAmount 2016-05-27 20:19:24 -07:00
TimmeeY
7044534765 Added Shiptype to fitting name in minimal html export
On minimalistic HTMLExport, the shiptype (name) will be added infront of
the fitting name to all fits on export
2016-05-26 15:03:34 +02:00
blitzmann
9c3b50d622 Bump stable 2016-05-23 23:23:27 -04:00
blitzmann
fd62c254a4 Update to Citadel 1.14 and update effect headers0 2016-05-23 23:22:44 -04:00
blitzmann
90e54c6334 Fix Minokawa and Apostle remote effects (#623) 2016-05-23 23:05:50 -04:00
blitzmann
f423c67979 Fix remote ancillary bonus effects (#626) 2016-05-23 20:19:30 -04:00
blitzmann
4607dd788c Implement ewar resists (#597) 2016-05-22 15:15:21 -04:00
Ryan Holmes
f9c595473f Merge pull request #621 from blitzmann/context-menu-ids
Context menu ids
2016-05-22 14:43:27 -04:00
blitzmann
de6c843e1c Remove cap from target range (#620) 2016-05-22 14:24:43 -04:00
blitzmann
b45924aa52 Fix cycle time bonuses for Lif and Ninazu (#591) 2016-05-22 13:54:58 -04:00
blitzmann
d04ea5b061 Fix EV drones (#619) 2016-05-22 13:33:25 -04:00
blitzmann
7406210c4a Fix remote AAR 2016-05-22 01:38:40 -04:00
blitzmann
c24986fba3 Add missing effect for ancil shield boosts 2016-05-18 00:01:49 -04:00
blitzmann
30c1c00b9b Bump dev 2016-05-18 00:01:48 -04:00
blitzmann
655d658a52 Remove prints 2016-05-16 23:56:46 -04:00
Ebag333
a089c4cbc2 Merge remote-tracking branch 'refs/remotes/pyfa-org/master' 2016-05-16 07:55:15 -07:00
blitzmann
62fd545d24 Restrict citadels to only use citadel modules. Rename Ships tab to Fittings as it no longer just carries ships :(. Fix crash on item stats. 2016-05-15 23:18:39 -04:00
blitzmann
4041ecddc4 Create Citadel class that inherits from Ship. Add Service slots 2016-05-15 22:23:23 -04:00
blitzmann
10f51b41b7 Fix context menu with structure modules (no meta information), add citadel icons. 2016-05-15 19:16:51 -04:00
blitzmann
7cf0a35a7a Add citadel fittings to market browser, and get rid of some initial errors 2016-05-15 18:58:47 -04:00
blitzmann
523f7793b5 Add Citadel to ship root 2016-05-15 18:42:01 -04:00
blitzmann
9891aecf19 Bump dev 2016-05-15 18:40:54 -04:00
Ryan Holmes
fd700f73e5 Update README.md 2016-05-15 12:53:37 -04:00
blitzmann
d71b05095d Clean up 2016-05-15 12:43:24 -04:00
blitzmann
d061a13b58 Move ID pool to context menu class rather than individual menu items 2016-05-15 12:18:56 -04:00
blitzmann
5176cc3b06 Testing a new way of generating context menu id's 2016-05-15 02:35:35 -04:00
blitzmann
1e364913cd Bump version 2016-05-14 23:23:04 -04:00
blitzmann
1adc7c77ac Update to Citadel 1.11 2016-05-14 22:54:53 -04:00
blitzmann
51fbcce803 Add middle click to close fit (#608) 2016-05-14 22:47:44 -04:00
blitzmann
80dab63119 Add missing effect for remote ancil reppers 2016-05-14 22:26:07 -04:00
blitzmann
8c769f152b Fix capacitor need bonus for Stasis Grapplers (#615) 2016-05-14 02:00:50 -04:00
blitzmann
3673391f5a Moved DPS calc from fighter to fighter ability, and fixed fighters in the graph to consider target values. 2016-05-14 01:48:22 -04:00
blitzmann
f96a2e72f7 Merge branch 'master' of https://github.com/pyfa-org/Pyfa 2016-05-11 21:35:25 -04:00
blitzmann
19929ef3ba Increment/decrement cargo instead of adding/removing (#610) 2016-05-11 21:29:17 -04:00
blitzmann
e3a3d287bf Strip leading/trailing whitespace from strings when converting data to json (#607) 2016-05-11 21:07:22 -04:00
blitzmann
b2b92b00f3 Update to Citadel 1.10 and fix gang effects (#592) 2016-05-11 21:04:25 -04:00
Ryan Holmes
6bd2c19b21 Merge pull request #595 from evrial/patch-1
Update README.md
2016-05-10 14:28:21 -04:00
TimmeeY
eb8e5c5135 Added an option for HTML Export, to produce a minimal html version
Added an Opton in the HTMLExport menu to set the HTML export to produce
a minimal HTML version, without any styles or Javscript dependencies.
This can be useful if you are not javascript capable, or if you just
want to copy'n'pase the exported HTML into some web-editor (wordpress).
2016-05-08 23:50:41 +02:00
blitzmann
5a07be40f1 Update to 1037828 (Citadel 1.9) 2016-05-07 20:02:24 -04:00
blitzmann
13a15a38c5 Fix line break in some descriptions (#596) 2016-05-06 20:50:34 -04:00
blitzmann
caa10614d9 Bump dev, and fix flex hardeners (#601) 2016-05-06 20:42:46 -04:00
Alex Grigoryev
0943b4b097 Update README.md
Added Homebrew formula 0ed8244441
2016-05-03 17:43:07 +03:00
blitzmann
8823baaef4 Bump stable 2016-05-02 21:11:29 -04:00
blitzmann
5a5e77414a Remove rigs from prereq checking 2016-05-02 21:10:29 -04:00
blitzmann
f524591327 Fix prereq skill checking for fighters 2016-05-02 20:58:35 -04:00
blitzmann
55ae7c39a4 Fix Shield Harmonizing / Shield Efficiency warfare links 2016-05-02 20:19:47 -04:00
blitzmann
d4e5f8d165 Fix damage profile / target resists editor (#587) 2016-05-02 20:06:53 -04:00
blitzmann
b9dad60b61 Fix icon logic / add some missing icons 2016-05-01 22:21:14 -04:00
blitzmann
57b9b916ed Take care of empty market groups 2016-05-01 19:06:34 -04:00
blitzmann
854476db76 Revert "Fix runtime for all ganglink module effects" (#582)
This reverts commit 373ccbcee5.
2016-05-01 17:50:56 -04:00
blitzmann
941c57b4a8 Fix titan fleet bonii (#577) 2016-05-01 16:45:19 -04:00
blitzmann
fb1c5a760f Fix projected remote cap transfers (#585) 2016-05-01 16:18:27 -04:00
blitzmann
e5367127ea Adds migration path from pre-release database to stable (previously unsupported) (#586) 2016-05-01 14:46:51 -04:00
blitzmann
ffebd3f311 Fix charges for small ancillary shield boosters (#581) 2016-05-01 14:15:44 -04:00
blitzmann
d8fcbd4032 Fix market group sourcing when generating database. 2016-05-01 11:54:39 -04:00
blitzmann
583f416373 Fix FSUs 2016-04-30 23:18:52 -04:00
blitzmann
f605b37a1e Fix OTLs (#579) 2016-04-30 22:48:33 -04:00
Ryan Holmes
a1d64acff4 Merge pull request #578 from lunedis/dda_stacking_fix
Fixing Drone Damage Amplifier fighter stacking issue #576
2016-04-30 22:43:27 -04:00
blitzmann
1fe42f6a79 Bump dev 2016-04-30 22:43:12 -04:00
Kalu
3ce5f69225 Fixing Drone Damage Amplifier fighter stacking issue #576 2016-05-01 03:31:19 +02:00
blitzmann
985107c601 Bump version =D 2016-04-30 19:56:49 -04:00
blitzmann
d416124081 Implemented projected fighters, and various fighter bugfixes / improvements 2016-04-30 19:52:13 -04:00
blitzmann
3a62a6c40d Add fighters to DPS graph 2016-04-30 18:37:00 -04:00
blitzmann
8f6f55b001 Merge branch 'singularity' 2016-04-30 18:23:32 -04:00
blitzmann
6d1ae39bc6 Merge branch 'master' of https://github.com/pyfa-org/Pyfa 2016-04-30 18:21:30 -04:00
Ryan Holmes
850197faa1 Merge pull request #572 from Tandrial/master
Import DNA fittings from ingame urls
2016-04-30 18:16:35 -04:00
blitzmann
1aa206bc82 Merge branch 'master' of https://github.com/pyfa-org/Pyfa 2016-04-30 18:10:06 -04:00
Ryan Holmes
5a9cdb67f9 Merge pull request #568 from mmaucher/fix-for-511
fix separation of moving/non-moving drones
2016-04-30 18:07:58 -04:00
blitzmann
c9810cd019 Fix bug when importing fit 2016-04-30 18:03:03 -04:00
blitzmann
8bf75e38ad Add loaded charges export to CREST (#569) 2016-04-29 23:42:47 -04:00
blitzmann
fe9139ae93 Fix issue with adding multiples of the same skill to character via character import (#563) 2016-04-29 23:32:22 -04:00
blitzmann
87a354a314 Add SerializableUriCharacter to EVEMon import check (#557) 2016-04-29 23:15:30 -04:00
blitzmann
270ac99a1e update effects 2016-04-29 22:59:09 -04:00
blitzmann
dc5d6a4ef8 Add conversion pack 2016-04-29 22:54:44 -04:00
blitzmann
4cdb36de09 update icons 2016-04-29 22:42:15 -04:00
blitzmann
7fce1d00d7 Update to TQ again 2016-04-29 22:37:29 -04:00
blitzmann
26c27153f0 Fix FAUX role bonus 2016-04-29 19:11:13 -04:00
blitzmann
b5420e9c6a Add fighter bomb launcher logic 2016-04-29 19:10:51 -04:00
blitzmann
cfd82a6ad4 Add titan gang bonuses, along with other things 2016-04-29 18:47:53 -04:00
Ryan Holmes
7a352b49a0 Merge pull request #534 from Wozbo/EWAR-fix-532
Fixed ewar on damage graphs,
2016-04-29 09:44:26 -04:00
Michael Krane
8a4f3b7642 Code clean Up 2016-04-28 22:59:47 +02:00
Michael Krane
a09d4139d5 Removes everything before and after the DNA 2016-04-28 19:06:53 +02:00
Michael Krane
a257ac87f7 Allows to import DNA fittings via ingame urls 2016-04-28 18:30:41 +02:00
blitzmann
1669a5434c Removing debugging 2016-04-28 00:42:09 -04:00
blitzmann
2fc83aa61c Update to TQ 2016-04-28 00:38:49 -04:00
blitzmann
ed6f00a893 Added column for fighter abilities, fixed some fighter bugs, added some context menus to them 2016-04-28 00:29:25 -04:00
blitzmann
b15f9766c1 * Show fighter bay resources in fighter pane
* Give fighters a state
* Include some toggled stats on the resources pane
* Add some decent icons for fighter stuff
2016-04-28 00:10:01 -04:00
blitzmann
0ad4f07591 Add drone DPS/Volley to stats pane 2016-04-26 22:18:00 -04:00
blitzmann
4704c5a1b0 Limit fighters to fit's available slots. We hijack the module slot bit to do the dirty work >_> 2016-04-25 23:45:01 -04:00
blitzmann
034a9bc3c3 Publish fighter bombs in jsonToSql.py script 2016-04-25 22:49:52 -04:00
Markus Maucher
e7dc9db75a fix separation of moving/non-moving drones 2016-04-25 12:10:00 +02:00
blitzmann
4a2d1b7997 Fix subsystem slots (#553) 2016-04-22 20:49:16 -04:00
blitzmann
a5e2a32fb8 Merge remote-tracking branch 'origin/master' into singularity 2016-04-22 20:38:33 -04:00
blitzmann
43f69bb184 Only show fighter abilites which have been implemented. 2016-04-21 22:20:53 -04:00
blitzmann
71482c2359 Fix network sensor array effect 2016-04-21 22:14:45 -04:00
blitzmann
84a27a60a5 Fix Seige torp bonus 2016-04-19 21:39:56 -04:00
Ryan Holmes
87f865ce1f Merge pull request #562 from DuLLSoN/master
Added website selection for HTML Export
2016-04-17 23:53:36 -04:00
Ryan Holmes
12c78b41af Merge pull request #560 from aacn500/aacn500-t3c-import
Fix importing T3 cruisers #556
2016-04-17 23:52:36 -04:00
blitzmann
c3db808b7c Update 1030624 2016-04-17 23:42:31 -04:00
blitzmann
af9a9c5698 More fighter work. Basic abilities now work correctly. 2016-04-17 13:28:12 -04:00
Dullson
a7e6d3e969 Feature: Ability to select between different online fitting tools while using HTML Export. 2016-04-17 17:32:51 +03:00
blitzmann
708425c67a Toggle fighter abilities in fighter context menu 2016-04-17 02:16:58 -04:00
blitzmann
021de1af80 Get fighter abilities saved into database 2016-04-17 00:37:52 -04:00
blitzmann
b66e98f697 Fix Leviathan effect 2016-04-17 00:10:16 -04:00
blitzmann
28ad32aad5 Fix Character Editor 2016-04-16 23:55:28 -04:00
aacn500
94dc3117bc Fix importing T3 cruisers #556 2016-04-15 22:14:29 +01:00
blitzmann
803ada4b27 Fix siege, bastion, and triage effects. 2016-04-13 20:05:39 -04:00
blitzmann
e7118f637c Merge branch 'charImplants' into singularity
# Conflicts:
#	eos/db/saveddata/fit.py
#	gui/builtinContextMenus/itemStats.py
2016-04-12 20:16:53 -04:00
blitzmann
e11e368c4b Bump dev version 2016-04-12 20:02:30 -04:00
blitzmann
27a9051822 Update 1027729 2016-04-11 22:53:02 -04:00
blitzmann
54caece5b3 Update to 1027624, commit changes to itemDiff, and remove icon fetching from prep_data (need to use old dump info for now) (as well as other misc stuff) 2016-04-10 23:46:37 -04:00
blitzmann
b1fade5d3b Update bastion, siege, triage effects; add networked sensor array effect 2016-04-10 12:55:43 -04:00
blitzmann
8ed485df0e Group renames 2016-04-06 00:22:19 -04:00
blitzmann
9c33947a45 Update effect headers 2016-04-06 00:12:44 -04:00
blitzmann
33dc06055c Fix some more effects 2016-04-06 00:10:51 -04:00
blitzmann
8ff4a99cf3 Add missing Force Aux effects 2016-04-05 22:57:44 -04:00
blitzmann
d38abec819 Add some missing drone module effects 2016-04-05 22:47:20 -04:00
blitzmann
0ba48aa230 Fix energy effects 2016-04-05 22:27:41 -04:00
blitzmann
acf47ad7a6 Add missing Titan effects 2016-04-05 22:05:02 -04:00
blitzmann
c948c62cac Add missing Dreadnaught effects 2016-04-05 21:55:10 -04:00
blitzmann
eee4dbf66c Add missing Supercarrier effects 2016-04-05 21:46:57 -04:00
blitzmann
653b995774 Update eve.db and add missing carrier effects 2016-04-05 21:36:47 -04:00
blitzmann
a78151c5aa Add skill effects for Fighters 2016-04-04 23:52:09 -04:00
blitzmann
3177713447 Add preliminary (database/gui) fighter support. No effects / calculations. 2016-04-04 23:32:03 -04:00
blitzmann
0769df1e55 Update eve.db 2016-04-04 22:18:02 -04:00
blitzmann
0cfa7cb28f Ensure we get all ship group and ship type restrictions 2016-04-03 16:51:01 -04:00
blitzmann
1e621ee133 Fix issue when module is loaded with invalid item causing crash due to no item being available (incorrect logic) 2016-04-03 02:04:52 -04:00
blitzmann
a203799bd2 Merge branch 'master' into singularity 2016-03-30 18:48:17 -04:00
blitzmann
8fc9724204 Switch over to HTTPS protocol for jQuery CDN (#549). Also fix an issue that caused page to not load in Chrome 2016-03-30 00:25:11 -04:00
blitzmann
0d41cb96ab Merge branch 'refactor-entityEditor' into charImplants 2016-03-30 00:04:44 -04:00
blitzmann
39b2f87194 Add in logic that required an entity for implant sets and target resists (not needed for character or damage profiles as we have read-only defaults) 2016-03-30 00:03:48 -04:00
blitzmann
1161037092 Migrate implant set editor to new entity editor 2016-03-29 21:51:39 -04:00
blitzmann
a3d9d5cca8 Migrate character editor to use new entity editor. 2016-03-29 21:19:20 -04:00
Ryan Holmes
4b67411ca6 Merge pull request #550 from MarkNBroadhead/master
Update README
2016-03-29 15:24:22 -04:00
Mark N Broadhead
126b807dc7 Add links and make punctuation and stylistic changes
I am making changes here to help the README be consistent in its styling
and gramatically correct. Specifically distro vs distribution and places
where there are no links where they would be useful.

* Add link to GitHub Issues
* Add link to EVE pyfa forum thread
* Rename Installing to Installation
* Change distros to distributions
* Add apostrophe to "projects" where it is posessive
2016-03-29 12:09:22 -06:00
Mark N Broadhead
ca81d2d602 Reword Installing section
* Reword text and include link to latest builds page
* Remove link to Arch repo
2016-03-29 12:04:48 -06:00
Mark N Broadhead
015c195c9f Move Package list closer to installation section and add link
It makes sense for the Linux Distro-specific Packages section to
immediately follow the text about 3rd party repos in the Installing
section

* Move Linux Distro-specific Packages section
* Add link to issue #484 for FreeBSD installation
2016-03-29 11:52:55 -06:00
Mark N Broadhead
5fd170d480 Rename requirements to dependencies 2016-03-29 11:46:08 -06:00
Mark N Broadhead
4b167ba9de Add gitter chat link in contact information section 2016-03-29 11:45:08 -06:00
Mark N Broadhead
38ac41bccb Remove contact info for Kadeshs per blitzmann
Kadeshs is no longer with the projects per a conversation with blitzmann
on 29/3/2016 in gitter. He has requested I remove the contact info.
2016-03-29 11:18:52 -06:00
blitzmann
3315d27d45 Applied entity editor to resist editor.
Fixed issue with checking for same name in validator.
Center dialogs on parents to make it look nicer
2016-03-27 22:12:59 -04:00
blitzmann
c3dcdb0686 Entity = characters, damage profiles... anything with the generic drop down list of entities along with new/rename/etc buttons. This commit starts refactoring how we handle this, hopefully simplifying the process to a series of dialogs rather than trying to manage multiple control in the window. 2016-03-27 21:48:19 -04:00
blitzmann
ca91f6bd92 Remove debugging print 2016-03-22 23:21:39 -04:00
blitzmann
65483309ab Clear character implants during recalculation 2016-03-22 23:17:05 -04:00
blitzmann
71d33f3429 Fit implant effects (now applies to whichever implant source is selected) 2016-03-22 23:16:31 -04:00
blitzmann
9b1c543eb7 Support multi-select 2016-03-21 23:56:00 -04:00
blitzmann
24bb0ff39a Fix issue in which implant editor did not spawn if no implant sets 2016-03-21 23:49:01 -04:00
blitzmann
3ae312db37 Import / export implants sets 2016-03-21 23:43:45 -04:00
blitzmann
94f73241ea Implement implant set application in character implants. 2016-03-20 23:45:42 -04:00
blitzmann
d4632b9059 Add context menu to apply implant set to fit 2016-03-20 22:28:18 -04:00
blitzmann
dd15d52130 Merge pull request #541 from aacn500/missing-charge-skills
Fix "Change charge skills" showing module skills #535
2016-03-20 19:55:16 -04:00
blitzmann
145f252ca6 Add icon for implant set editor 2016-03-20 19:49:53 -04:00
blitzmann
731b54a1f7 Continued work on implant set editor 2016-03-20 18:58:13 -04:00
aacn500
f8d7b68289 Fix "Change charge skills" showing module skills 2016-03-20 22:56:27 +00:00
blitzmann
80e47d5157 Add some functionality to implantSet service, and get editor working correctly with implant editor view 2016-03-20 12:49:29 -04:00
blitzmann
c1653c5f2e Abstract the implant editor to work with different sources 2016-03-20 12:26:37 -04:00
blitzmann
36ad31ab25 Get some initial scaffolding up for implant sets sourced from the resist code. 2016-03-20 02:04:55 -04:00
blitzmann
6f1872fb94 Disable implants for read-only characters 2016-03-19 22:10:09 -04:00
blitzmann
ff56e70b81 Opps, dunno how this happened 2016-03-19 22:09:31 -04:00
blitzmann
201263237f Add migration to update fits tablet for implant source 2016-03-19 21:20:20 -04:00
blitzmann
1ddd37f381 Enable implant searching. 2016-03-19 20:55:29 -04:00
blitzmann
f9d2a78c5e Fix up styling for character implants and fitting window implant view 2016-03-19 19:30:42 -04:00
blitzmann
443c917c6b Get context menus working for character implants 2016-03-19 18:23:34 -04:00
blitzmann
7c787cd13b Recalc fit when changing implant source 2016-03-19 15:42:49 -04:00
blitzmann
dc8aff6b6c Merge branch 'master' into charImplants 2016-03-19 15:33:35 -04:00
blitzmann
397040549f Merge branch 'aacn500-validate-import' 2016-03-18 23:52:11 -04:00
blitzmann
0b858d6e94 Clean up call to checkStates 2016-03-18 23:51:55 -04:00
blitzmann
6c8efcda12 Fix traceback when ship is missing launcher / turret attribute (#539) 2016-03-18 23:31:19 -04:00
blitzmann
3fa0aa9242 Bump dev 2016-03-18 23:30:40 -04:00
aacn500
18775286c0 only check states when first loading a fit from db 2016-03-17 11:56:00 +00:00
aacn500
57433efe80 Check that modules fit on imported fits #512 #522 2016-03-16 20:12:26 +00:00
blitzmann
c42748a5dd Fix #537 - cap battery causing remote cap transfers to apply incorrect values.
Bump to stable 1.20.1
2016-03-15 22:46:51 -04:00
blitzmann
b5cf835959 Add a toggle between fit-specific implants and character implants. This avoids a lot of the problems of how to mix these two sources of implants. Character implants cannot change stage. 2016-03-13 14:48:43 -04:00
blitzmann
48b45b5f51 Merge branch 'master' into charImplants
# Conflicts:
#	gui/characterEditor.py
2016-03-12 23:20:26 -05:00
cwozniak
7d658c3f3d Fixed ewar on damage graphs, and added a quick formula for module falloff and applied it to Target Painters and Heavy Grapplers. 2016-03-11 16:15:08 -05:00
blitzmann
91980c9f2c Bump release 2016-03-11 00:20:26 -05:00
blitzmann
db1c80c7e3 Update effect headers 2016-03-11 00:18:33 -05:00
blitzmann
e53bd70c2c Merge pull request #497 from SpeedProg/master
Added commandline arguments to specify window title and path for savefiles
2016-03-10 23:58:56 -05:00
blitzmann
fe64e2e24c Fix module states when loading from database with an incorrect state (see #529) 2016-03-10 23:55:12 -05:00
blitzmann
a020ca9a71 Fix tracking / guidance disrupters 2016-03-10 23:43:24 -05:00
blitzmann
7a9fde822c Add some missing icons to the database and image store 2016-03-10 23:28:56 -05:00
blitzmann
152af02336 Fix effects involving XL missiles 2016-03-10 20:37:09 -05:00
blitzmann
be7d3a921a Update database to TQ 1017528 2016-03-10 20:17:26 -05:00
blitzmann
78acb205d3 Merge branch 'singularity' 2016-03-10 20:16:57 -05:00
blitzmann
627dac692c Modify applied cap drain based on ship's cap resistance 2016-03-08 18:23:35 -05:00
blitzmann
68a6a828d8 Revert "Disable setting new database version and bump pre-release"
This reverts commit d36bf41ecf.
2016-03-08 16:55:03 -05:00
blitzmann
e8604788df Replace locale formating with regular string formatting due to issues with setting locale. 2016-03-06 11:48:01 -05:00
blitzmann
d36bf41ecf Disable setting new database version and bump pre-release 2016-03-05 22:25:35 -05:00
blitzmann
821d9ea330 Add the renamed items to the conversion sheet 2016-03-05 21:54:32 -05:00
blitzmann
65eb0fac3d Fix syntax errors 2016-03-05 21:51:11 -05:00
blitzmann
e9a0c5456e Fix group matching: Capital charges 2016-03-05 21:48:12 -05:00
blitzmann
e2d33beb34 Fix group matching: Remote Sensor Dampener -> Sensor Dampener 2016-03-05 21:44:02 -05:00
blitzmann
b44c8461d4 Fix group matching: ECM Burst -> Burst Jammer 2016-03-05 21:41:01 -05:00
blitzmann
38cc13ff2c Update to 1015913 2016-03-05 21:37:12 -05:00
blitzmann
53a46dcec6 Fix bug causing fitting view to crash if ammo does not have icon 2016-03-05 21:32:02 -05:00
blitzmann
c01e506eb1 Add some debug info to item stats (effect and attribute IDs) 2016-03-05 15:42:31 -05:00
blitzmann
ad61795e80 Add conversions, TODO: Confirm with some testing! 2016-03-05 15:41:39 -05:00
blitzmann
bd802ab926 Fix typing issue with cargo stat 2016-03-05 01:08:53 -05:00
blitzmann
a25a1c0415 Reintroduce thousands separators for certain stats, tweak precision of cargo stat and displays 2016-02-28 18:14:27 -05:00
blitzmann
969952cccc Add support for user-defined server timeout setting (#492) 2016-02-14 18:51:18 -05:00
blitzmann
d85f8c0744 bump dev 2016-02-14 18:10:13 -05:00
Constantin Wenger
cf60bbc904 Merge remote-tracking branch 'upstream/master'
updated from upstream
2016-02-11 06:53:01 +01:00
blitzmann
9c67e7dd93 Fix database for icons (using old data), bump for release 2016-02-10 20:07:56 -05:00
blitzmann
df81a146d2 Bump dev 2016-02-10 15:08:42 -05:00
blitzmann
9bfb697f1e Bump version 2016-02-10 13:22:39 -05:00
blitzmann
2e227cdbd5 Update to TQ 1006189 2016-02-10 11:49:58 -05:00
blitzmann
fb7c227a10 Add a few market conversions and change cap drone group name (Feb '16 release) 2016-02-10 01:24:21 -05:00
blitzmann
e3742c0420 Fix double calculations on projected fits that double as boosters (#496) 2016-02-10 00:04:19 -05:00
blitzmann
373ccbcee5 Fix runtime for all ganglink module effects 2016-02-07 23:46:20 -05:00
blitzmann
785060f12b Merge branch 'test' 2016-02-06 16:07:44 -05:00
blitzmann
4e509bbaee Fix character editor crash on Windows by disallowing resizing. (#441) 2016-02-06 16:04:29 -05:00
Constantin Wenger
02d4ac81dd renamed parameter savepath to customSavePath for better distinguishability to savePath 2016-02-05 13:10:18 +01:00
blitzmann
7e305aab67 Revert "Tentative fix for character editor issues."
This reverts commit 253ebdc4e1.
2016-01-31 10:52:00 -05:00
blitzmann
55eed0d029 Revert "Fix Character Editor Dialog for osx"
This reverts commit 9fc31d6a55.
2016-01-31 10:51:45 -05:00
blitzmann
c7d5f2533a Merge pull request #514 from gitter-badger/gitter-badge
Add a Gitter chat badge to README.md
2016-01-29 14:49:08 -05:00
The Gitter Badger
a6cfbcb331 Add Gitter badge 2016-01-29 19:41:11 +00:00
blitzmann
45074952fd Merge pull request #504 from resinneublem/export-charges-optional
Make exporting charges a preference
2016-01-26 15:34:23 -05:00
blitzmann
a73d9abc60 Fix stacking for leadership, skirmish, and Information skill effects 2016-01-26 05:12:46 -05:00
blitzmann
9fc31d6a55 Fix Character Editor Dialog for osx 2016-01-25 22:47:27 -05:00
blitzmann
9cb99a1170 Update README.md 2016-01-25 21:36:50 -05:00
blitzmann
f3f1d022ef Updated to new repo location and forum thread 2016-01-25 21:14:45 -05:00
blitzmann
253ebdc4e1 Tentative fix for character editor issues. 2016-01-25 21:10:20 -05:00
blitzmann
5d45f1d3f3 Update README.md 2016-01-25 20:37:35 -05:00
blitzmann
e253af9763 Added links to distro-specific packages 2016-01-25 20:37:17 -05:00
blitzmann
a355a82f8a Merge pull request #503 from resinneublem/osx-preferences-shortcut
Use idiomatic osx preferences shortcut
2016-01-16 23:31:05 -05:00
Resin Neublem
ceb7eb15c3 Make exporting charges a preference
Some users don't want to export equiped charges because it might
conflict with their cargo hold (don't need 2x of the same type of script)

They just be equipping the items to see the different stats
2016-01-16 13:45:13 -05:00
Resin Neublem
115b154f0b Use idiomatic osx preferences shortcut
OSX uses "Command-," for application preferences
2016-01-16 13:09:13 -05:00
blitzmann
2d1344b785 Fix issue with accidental whitespace in CREST user-defined settings 2016-01-13 19:41:58 -05:00
blitzmann
bdf793072c Fix for t2 cloaks on prospect 2016-01-12 17:38:00 -05:00
blitzmann
2f879d39f3 Bump dev 2016-01-12 17:34:53 -05:00
Constantin Wenger
f0775af439 added command line option to specify the savepath 2016-01-12 21:28:15 +01:00
Constantin Wenger
96048b5133 added command line option to set the window title 2016-01-12 21:28:15 +01:00
blitzmann
36ab224853 Update to 996005 and bump stable 2016-01-12 00:28:19 -05:00
blitzmann
52d19b8de4 Remove debug prints 2016-01-09 14:48:13 -05:00
blitzmann
7be5ec844f Update README.md 2016-01-09 14:13:20 -05:00
blitzmann
3d26a31ee2 Add option to disable gauge animations (primarily for osx 10.11 users, see #438) 2016-01-09 12:36:55 -05:00
blitzmann
343d605a84 Fitting file import improvements:
- Blank files don't cause crash
- If error happens during processing, notify user
2016-01-03 21:45:19 -05:00
blitzmann
ef1228eb32 Ensure that utf-8 is tested when importing fits 2016-01-03 13:24:05 -05:00
blitzmann
ad738f7e7c Fix exporting fit to XML when name is unicode 2016-01-03 00:06:53 -05:00
blitzmann
4a66fa0138 Revert "Fix Command Destroyer MWD sig radius issue"
This reverts commit 331338e7b9.
2015-12-30 23:17:42 -05:00
blitzmann
331338e7b9 Fix Command Destroyer MWD sig radius issue 2015-12-30 23:02:27 -05:00
blitzmann
8e28925336 Add civilian weapons 2015-12-20 21:10:18 -05:00
blitzmann
df0e829dbe Merge pull request #478 from Neugeniko/master
Handle Crest Import and Export of Drone Bay and Cargo Bay contents.
2015-12-20 18:35:36 -05:00
Neugeniko
0c278b668c Handle Crest Import and Export of Drone Bay and Cargo Bay contents. 2015-12-16 12:56:28 +11:00
blitzmann
6e7ba714a8 Bump Dev, and fix import errors (#474) 2015-12-13 22:26:36 -05:00
blitzmann
d8e2e3ace1 Fix triage effects on weapon disrupters, update DB, and bump release 2015-12-10 20:18:02 -05:00
blitzmann
69c3dd188e Merge pull request #472 from wendazhou/FixNeutNosDisruptor
Fixed display of neut and nos amount, and guidance disruptors
2015-12-10 19:50:58 -05:00
Wenda Zhou
57da36f1cf Fixed category names for neut, nos and tracking disruptor.
With the implementation of falloff for energy neutralizer
and nosferatus, their names has changed so had to update
for correct display.

Also added some display for the new guidance disruptors
(i.e. missile disruptors). This also fixes the category
change for weapon disruptor (both are now called weapon
disruptor).
2015-12-09 22:50:30 -05:00
blitzmann
753ba00ac0 Update icons and EVE data 2015-12-09 21:56:22 -05:00
blitzmann
290f7d116f Fix some RR shield effects, and bump dev because I forgot 2015-12-09 21:09:50 -05:00
blitzmann
81fa88a36d Remove previously mentioned old item 2015-12-09 20:55:34 -05:00
blitzmann
0dd98330aa Fix issue with old item in market service causing error due to being non-existent. 2015-12-09 20:54:29 -05:00
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
ca34d7cced Differentiate between character implants and fits 2015-11-10 02:06:44 -05:00
blitzmann
938e2a871d Merge branch 'master' into charImplants
Conflicts:
	gui/characterEditor.py
2015-11-08 21:19:04 -05: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
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
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
dc55dbdf36 Polish some events 2015-09-25 14:48:05 -04:00
blitzmann
d0ec17feba Some syntax 2015-09-25 14:13:33 -04:00
blitzmann
5b5fdd97d6 Enable and fix market tree for character implant view 2015-09-25 13:59:37 -04:00
3407 changed files with 26346 additions and 4257 deletions

113
.gitignore vendored
View File

@@ -4,20 +4,117 @@
#Kwrite/Gedit/Other crapapps making backups
*~
#Eclipse
.project
.pydevproject
.settings
#Patch files
*.patch
#Personal
/saveddata/
#PyCharm
.idea/
#Pyfa file
pyfaFits.html
#Temporary files
*.py__jb_tmp__
# Based on https://github.com/github/gitignore
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
env/
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
*.egg-info/
.installed.cfg
*.egg
Pyfa.egg-info/
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*,cover
.hypothesis/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
target/
# IPython Notebook
.ipynb_checkpoints
# pyenv
.python-version
# celery beat schedule file
celerybeat-schedule
# dotenv
.env
# virtualenv
.venv/
venv/
ENV/
# Spyder project settings
.spyderproject
# Rope project settings
.ropeproject
# Eclipse project settings
.project
.pydevproject
.settings
# Pycharm project settings
.idea
eos.iml

View File

@@ -1,5 +1,7 @@
# pyfa
[![Join us on Slack!](https://pyfainvite.azurewebsites.net/badge.svg)](https://pyfainvite.azurewebsites.net/)
![pyfa](https://cloud.githubusercontent.com/assets/3904767/10271512/af385ef2-6ade-11e5-8f67-52b8b1e4c797.PNG)
## What is it?
@@ -7,41 +9,59 @@
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.
The latest version along with release notes can always be found on the project's [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.
## Installation
Windows and OS X users are supplied self-contained builds of pyfa on the [latest releases](https://github.com/pyfa-org/Pyfa/releases/latest) page. An `.exe` installer is also available for Windows builds. Linux users can run pyfa using their distribution's Python interpreter. There is no official self-contained package for Linux, however, there are a number of third-party packages available through distribution-specific repositories.
## Requirements
#### OS X
There are two different distributives for OS X: `-mac` and `-mac-deprecated`.
* `-mac`: based on wxPython 3.0.2.0 and has updated libraries. This is the recommended build.
* `-mac-deprecated`: utilizes older binaries running on wxPython 2.8; because of this, some features are not available (currently CREST support and Attribute Overrides). Additionally, as development happens primarily on wxPython 3.0, a few GUI bugs may pop up as `-mac-deprecated` is not actively tested. However, due to some general issues with wxPython 3.0, especially on some newer OS X versions, `-mac-deprecated` is still offered for those that need it.
There is also a [Homebrew](http://brew.sh) option for installing pyfa on OS X. Please note this is maintained by a third-party and is not tested by pyfa developers. Simply fire up in terminal:
```
$ brew install Caskroom/cask/pyfa
```
### Linux Distro-specific Packages
The following is a list of pyfa packages available for certain distributions. Please note that these packages are maintained by third-parties and are not evaluated by the pyfa developers.
* Debian/Ubuntu/derivitives: https://github.com/AdamMajer/Pyfa/releases
* Arch: https://aur.archlinux.org/packages/pyfa/
* openSUSE: https://build.opensuse.org/package/show/home:rmk2/pyfa
* FreeBSD: http://www.freshports.org/games/pyfa/ (see [#484](https://github.com/pyfa-org/Pyfa/issues/484) for instructions)
### Dependencies
If you wish to help with development or simply need to run pyfa through a Python interpreter, the following software is required:
* Python >= 2.6
* Python 2.7
* `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`)
* `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).
The preferred method of reporting bugs is through the project's [GitHub Issues interface](https://github.com/pyfa-org/Pyfa/issues). Alternatively, posting a report in the [pyfa thread](http://forums.eveonline.com/default.aspx?g=posts&t=247609) on the official EVE Online forums is acceptable. Guidelines for bug reporting can be found on [this wiki page](https://github.com/DarkFenX/Pyfa/wiki/Bug-Reporting).
## Liscense
## 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)
* Development repository: [https://github.com/pyfa-org/Pyfa](https://github.com/pyfa-org/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
* [Gitter chat](https://gitter.im/pyfa-org/Pyfa): @ 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.
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 pyfa 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, pyfa. CCP is in no way responsible for the content on or functioning of this program, nor can it be liable for any damage arising from the use of this program.

View File

@@ -18,14 +18,12 @@ debug = False
saveInRoot = False
# Version data
version = "1.15.1"
version = "1.24.1"
tag = "git"
expansionName = "Vanguard"
expansionVersion = "1.0"
expansionName = "Singularity"
expansionVersion = "1099916"
evemonMinVersion = "4081"
clientID = 'af87365240d644f7950af563b8418bad'
pyfaPath = None
savePath = None
saveDB = None
@@ -62,7 +60,7 @@ def __createDirs(path):
if not os.path.exists(path):
os.makedirs(path)
def defPaths():
def defPaths(customSavePath):
global debug
global pyfaPath
global savePath
@@ -89,13 +87,17 @@ def defPaths():
else:
savePath = getattr(configforced, "savePath", None)
if savePath is None:
savePath = unicode(os.path.expanduser(os.path.join("~", ".pyfa")),
if customSavePath is None: # customSavePath is not overriden
savePath = unicode(os.path.expanduser(os.path.join("~", ".pyfa")),
sys.getfilesystemencoding())
else:
savePath = customSavePath
__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)

View File

@@ -1,6 +1,7 @@
version = "0.2.3"
tag = "git"
def test():
import tests.runTests
import unittest

View File

@@ -1,12 +1,12 @@
import heapq
from math import sqrt, exp
import time
from math import sqrt, exp
DAY = 24 * 60 * 60 * 1000
def lcm(a,b):
n = a*b
def lcm(a, b):
n = a * b
while b:
a, b = b, a % b
return n / a
@@ -40,45 +40,38 @@ class CapSimulator(object):
# relevant decimal digits of capacitor for LCM period optimization
self.stability_precision = 1
def scale_activation(self, duration, capNeed):
for res in self.scale_resolutions:
mod = duration % res
if mod:
if mod > res/2.0:
mod = res-mod
if mod > res / 2.0:
mod = res - mod
else:
mod = -mod
if abs(mod) <= duration/100.0:
if abs(mod) <= duration / 100.0:
# only adjust if the adjustment is less than 1%
duration += mod
capNeed += float(mod)/duration * capNeed
capNeed += float(mod) / duration * capNeed
break
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)
@@ -87,14 +80,22 @@ class CapSimulator(object):
if not self.reload and capNeed > 0:
clipSize = 0
if self.stagger:
# 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)
duration = int(duration / amount)
else:
stagger_amount = (duration*clipSize+10000)/(amount*clipSize)
stagger_amount = (duration * clipSize + 10000) / (amount * clipSize)
for i in range(1, amount):
heapq.heappush(self.state,
[i*stagger_amount, duration,
[i * stagger_amount, duration,
capNeed, 0, clipSize])
else:
capNeed *= amount
@@ -107,13 +108,11 @@ class CapSimulator(object):
heapq.heappush(self.state, [0, duration, capNeed, 0, clipSize])
if disable_period:
self.period = self.t_max
else:
self.period = period
def run(self):
"""Run the simulation"""
@@ -133,13 +132,13 @@ class CapSimulator(object):
capCapacity = self.capacitorCapacity
tau = self.capacitorRecharge / 5.0
cap_wrap = capCapacity # cap value at last period
cap_lowest = capCapacity # lowest cap value encountered
cap_lowest_pre = capCapacity # lowest cap value before activations
cap = capCapacity # current cap value
t_wrap = self.period # point in time of next period
cap_wrap = capCapacity # cap value at last period
cap_lowest = capCapacity # lowest cap value encountered
cap_lowest_pre = capCapacity # lowest cap value before activations
cap = capCapacity # current cap value
t_wrap = self.period # point in time of next period
t_now = t_last = 0
t_last = 0
t_max = self.t_max
while 1:
@@ -148,7 +147,7 @@ class CapSimulator(object):
if t_now >= t_max:
break
cap = ((1.0+(sqrt(cap/capCapacity)-1.0)*exp((t_last-t_now)/tau))**2)*capCapacity
cap = ((1.0 + (sqrt(cap / capCapacity) - 1.0) * exp((t_last - t_now) / tau)) ** 2) * capCapacity
if t_now != t_last:
if cap < cap_lowest_pre:
@@ -167,20 +166,20 @@ 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
if clipSize:
if shot % clipSize == 0:
shot = 0
t_now += 10000 # include reload time
t_now += 10000 # include reload time
activation[0] = t_now
activation[3] = shot
@@ -193,19 +192,17 @@ class CapSimulator(object):
# calculate EVE's stability value
try:
avgDrain = reduce(float.__add__, map(lambda x: x[2]/x[1], self.state), 0.0)
self.cap_stable_eve = 0.25 * (1.0 + sqrt(-(2.0 * avgDrain * tau - capCapacity)/capCapacity)) ** 2
avgDrain = reduce(float.__add__, map(lambda x: x[2] / x[1], self.state), 0.0)
self.cap_stable_eve = 0.25 * (1.0 + sqrt(-(2.0 * avgDrain * tau - capCapacity) / capCapacity)) ** 2
except ValueError:
self.cap_stable_eve = 0.0
if cap > 0.0:
# capacitor low/high water marks
self.cap_stable_low = cap_lowest
self.cap_stable_high = cap_lowest_pre
else:
self.cap_stable_low =\
self.cap_stable_high = 0.0
self.cap_stable_low = \
self.cap_stable_high = 0.0
self.runtime = time.time()-start
self.runtime = time.time() - start

View File

@@ -1,11 +1,13 @@
from os.path import realpath, join, dirname, abspath
import sys
from os.path import realpath, join, dirname, abspath
debug = False
gamedataCache = True
saveddataCache = True
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())
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.
# Autodetect path, only change if the autodetection bugs out.
path = dirname(unicode(__file__, sys.getfilesystemencoding()))

View File

@@ -1,4 +1,4 @@
#===============================================================================
# ===============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of eos.
@@ -15,7 +15,7 @@
#
# You should have received a copy of the GNU Lesser General Public License
# along with eos. If not, see <http://www.gnu.org/licenses/>.
#===============================================================================
# ===============================================================================
import threading
@@ -24,17 +24,20 @@ from sqlalchemy.orm import sessionmaker, scoped_session
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import pool
from eos import config
import migration
from eos import config
class ReadOnlyException(Exception):
pass
gamedata_connectionstring = config.gamedata_connectionstring
if callable(gamedata_connectionstring):
gamedata_engine = create_engine("sqlite://", creator=gamedata_connectionstring, echo = config.debug)
gamedata_engine = create_engine("sqlite://", creator=gamedata_connectionstring, echo=config.debug)
else:
gamedata_engine = create_engine(gamedata_connectionstring, echo = config.debug)
gamedata_engine = create_engine(gamedata_connectionstring, echo=config.debug)
gamedata_meta = MetaData()
gamedata_meta.bind = gamedata_engine
@@ -44,8 +47,8 @@ gamedata_session = sessionmaker(bind=gamedata_engine, autoflush=False, expire_on
# 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]
"SELECT `field_value` FROM `metadata` WHERE `field_name` LIKE 'client_build'"
).fetchone()[0]
except:
config.gamedata_version = None
@@ -63,25 +66,19 @@ if saveddata_connectionstring is not None:
# Lock controlling any changes introduced to session
sd_lock = threading.Lock()
#Import all the definitions for all our database stuff
# Import all the definitions for all our database stuff
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, getTargetResistsList, getTargetResists,\
clearPrices, countAllFits, getCrestCharacters, getCrestCharacter
# Import queries
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 using in memory saveddata, you'll want to reflect it so the data structure is good.
if config.saveddata_connectionstring == "sqlite:///:memory:":
saveddata_meta.create_all()
def rollback():
with sd_lock:
saveddata_session.rollback()

View File

@@ -1,4 +1,4 @@
#===============================================================================
# ===============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of eos.
@@ -15,20 +15,22 @@
#
# 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, Unicode, ForeignKey, String, Boolean
from sqlalchemy.orm import relation, mapper, synonym, deferred
from sqlalchemy.ext.associationproxy import association_proxy
from eos.types import Attribute, Icon, AttributeInfo, Unit
from sqlalchemy.orm import relation, mapper, synonym, deferred
from eos.db import gamedata_meta
from eos.types import Attribute, Icon, AttributeInfo, Unit
typeattributes_table = Table("dgmtypeattribs", gamedata_meta,
Column("value", Float),
Column("typeID", Integer, ForeignKey("invtypes.typeID"), primary_key=True, index=True),
Column("attributeID", ForeignKey("dgmattribs.attributeID"), primary_key=True))
Column("value", Float),
Column("typeID", Integer, ForeignKey("invtypes.typeID"), primary_key=True, index=True),
Column("attributeID", ForeignKey("dgmattribs.attributeID"), primary_key=True))
attributes_table = Table("dgmattribs", gamedata_meta,
Column("attributeID", Integer, primary_key = True),
Column("attributeID", Integer, primary_key=True),
Column("attributeName", String),
Column("defaultValue", Float),
Column("maxAttributeID", Integer, ForeignKey("dgmattribs.attributeID")),
@@ -40,14 +42,14 @@ attributes_table = Table("dgmattribs", gamedata_meta,
Column("unitID", Integer, ForeignKey("dgmunits.unitID")))
mapper(Attribute, typeattributes_table,
properties = {"info": relation(AttributeInfo, lazy=False)})
properties={"info": relation(AttributeInfo, lazy=False)})
mapper(AttributeInfo, attributes_table,
properties = {"icon" : relation(Icon),
"unit": relation(Unit),
"ID": synonym("attributeID"),
"name": synonym("attributeName"),
"description" : deferred(attributes_table.c.description)})
properties={"icon": relation(Icon),
"unit": relation(Unit),
"ID": synonym("attributeID"),
"name": synonym("attributeName"),
"description": deferred(attributes_table.c.description)})
Attribute.ID = association_proxy("info", "attributeID")
Attribute.name = association_proxy("info", "attributeName")

View File

@@ -1,4 +1,4 @@
#===============================================================================
# ===============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of eos.
@@ -15,7 +15,7 @@
#
# You should have received a copy of the GNU Lesser General Public License
# along with eos. If not, see <http://www.gnu.org/licenses/>.
#===============================================================================
# ===============================================================================
from sqlalchemy import Column, String, Integer, ForeignKey, Boolean, Table
from sqlalchemy.orm import relation, mapper, synonym, deferred
@@ -24,14 +24,14 @@ from eos.db import gamedata_meta
from eos.types import Category, Icon
categories_table = Table("invcategories", gamedata_meta,
Column("categoryID", Integer, primary_key = True),
Column("categoryID", Integer, primary_key=True),
Column("categoryName", String),
Column("description", String),
Column("published", Boolean),
Column("iconID", Integer, ForeignKey("icons.iconID")))
mapper(Category, categories_table,
properties = {"icon" : relation(Icon),
"ID" : synonym("categoryID"),
"name" : synonym("categoryName"),
"description" : deferred(categories_table.c.description)})
properties={"icon": relation(Icon),
"ID": synonym("categoryID"),
"name": synonym("categoryName"),
"description": deferred(categories_table.c.description)})

View File

@@ -1,4 +1,4 @@
#===============================================================================
# ===============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of eos.
@@ -15,35 +15,35 @@
#
# You should have received a copy of the GNU Lesser General Public License
# along with eos. If not, see <http://www.gnu.org/licenses/>.
#===============================================================================
# ===============================================================================
from sqlalchemy import Column, String, Integer, Boolean, Table, ForeignKey
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.orm import mapper, synonym, relation, deferred
from eos.types import Effect, EffectInfo
from eos.db import gamedata_meta
from eos.types import Effect, EffectInfo
typeeffects_table = Table("dgmtypeeffects", gamedata_meta,
Column("typeID", Integer, ForeignKey("invtypes.typeID"), primary_key=True, index=True),
Column("effectID", Integer, ForeignKey("dgmeffects.effectID"), primary_key=True))
effects_table = Table("dgmeffects", gamedata_meta,
Column("effectID", Integer, primary_key = True),
Column("effectID", Integer, primary_key=True),
Column("effectName", String),
Column("description", String),
Column("published", Boolean),
Column("isAssistance", Boolean),
Column("isOffensive", Boolean))
mapper(EffectInfo, effects_table,
properties = {"ID" : synonym("effectID"),
"name" : synonym("effectName"),
"description" : deferred(effects_table.c.description)})
properties={"ID": synonym("effectID"),
"name": synonym("effectName"),
"description": deferred(effects_table.c.description)})
mapper(Effect, typeeffects_table,
properties = {"ID": synonym("effectID"),
"info": relation(EffectInfo, lazy=False)})
properties={"ID": synonym("effectID"),
"info": relation(EffectInfo, lazy=False)})
Effect.name = association_proxy("info", "name")
Effect.description = association_proxy("info", "description")

View File

@@ -1,4 +1,4 @@
#===============================================================================
# ===============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of eos.
@@ -15,7 +15,7 @@
#
# You should have received a copy of the GNU Lesser General Public License
# along with eos. If not, see <http://www.gnu.org/licenses/>.
#===============================================================================
# ===============================================================================
from sqlalchemy import Column, String, Integer, Boolean, ForeignKey, Table
from sqlalchemy.orm import relation, mapper, synonym, deferred
@@ -24,7 +24,7 @@ from eos.db import gamedata_meta
from eos.types import Group, Icon, Category
groups_table = Table("invgroups", gamedata_meta,
Column("groupID", Integer, primary_key = True),
Column("groupID", Integer, primary_key=True),
Column("groupName", String),
Column("description", String),
Column("published", Boolean),
@@ -32,8 +32,8 @@ groups_table = Table("invgroups", gamedata_meta,
Column("iconID", Integer, ForeignKey("icons.iconID")))
mapper(Group, groups_table,
properties = {"category" : relation(Category, backref = "groups"),
"icon" : relation(Icon),
"ID" : synonym("groupID"),
"name" : synonym("groupName"),
"description" : deferred(groups_table.c.description)})
properties={"category": relation(Category, backref="groups"),
"icon": relation(Icon),
"ID": synonym("groupID"),
"name": synonym("groupName"),
"description": deferred(groups_table.c.description)})

View File

@@ -1,4 +1,4 @@
#===============================================================================
# ===============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of eos.
@@ -15,7 +15,7 @@
#
# You should have received a copy of the GNU Lesser General Public License
# along with eos. If not, see <http://www.gnu.org/licenses/>.
#===============================================================================
# ===============================================================================
from sqlalchemy import Column, String, Integer, Table
from sqlalchemy.orm import mapper, synonym, deferred
@@ -24,10 +24,10 @@ from eos.db import gamedata_meta
from eos.types import Icon
icons_table = Table("icons", gamedata_meta,
Column("iconID", Integer, primary_key = True),
Column("iconID", Integer, primary_key=True),
Column("description", String),
Column("iconFile", String))
mapper(Icon, icons_table,
properties = {"ID" : synonym("iconID"),
"description" : deferred(icons_table.c.description)})
properties={"ID": synonym("iconID"),
"description": deferred(icons_table.c.description)})

View File

@@ -1,4 +1,4 @@
#===============================================================================
# ===============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of eos.
@@ -15,18 +15,18 @@
#
# You should have received a copy of the GNU Lesser General Public License
# along with eos. If not, see <http://www.gnu.org/licenses/>.
#===============================================================================
# ===============================================================================
from sqlalchemy import Column, String, Integer, Boolean, ForeignKey, Table, Float
from sqlalchemy.orm import relation, mapper, synonym, deferred
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.orm import relation, mapper, synonym, deferred
from sqlalchemy.orm.collections import attribute_mapped_collection
from eos.db import gamedata_meta
from eos.types import Icon, Attribute, Item, Effect, MetaType, Group, Traits
items_table = Table("invtypes", gamedata_meta,
Column("typeID", Integer, primary_key = True),
Column("typeID", Integer, primary_key=True),
Column("typeName", String, index=True),
Column("description", String),
Column("raceID", Integer),
@@ -43,19 +43,19 @@ from .metaGroup import metatypes_table
from .traits import traits_table
mapper(Item, items_table,
properties = {"group" : relation(Group, backref = "items"),
"icon" : relation(Icon),
"_Item__attributes" : relation(Attribute, collection_class = attribute_mapped_collection('name')),
"effects" : relation(Effect, collection_class = attribute_mapped_collection('name')),
"metaGroup" : relation(MetaType,
primaryjoin = metatypes_table.c.typeID == items_table.c.typeID,
uselist = False),
"ID" : synonym("typeID"),
"name" : synonym("typeName"),
"description" : deferred(items_table.c.description),
"traits" : relation(Traits,
primaryjoin = traits_table.c.typeID == items_table.c.typeID,
uselist = False)
})
properties={"group": relation(Group, backref="items"),
"icon": relation(Icon),
"_Item__attributes": relation(Attribute, collection_class=attribute_mapped_collection('name')),
"effects": relation(Effect, collection_class=attribute_mapped_collection('name')),
"metaGroup": relation(MetaType,
primaryjoin=metatypes_table.c.typeID == items_table.c.typeID,
uselist=False),
"ID": synonym("typeID"),
"name": synonym("typeName"),
"description": deferred(items_table.c.description),
"traits": relation(Traits,
primaryjoin=traits_table.c.typeID == items_table.c.typeID,
uselist=False)
})
Item.category = association_proxy("group", "category")

View File

@@ -1,4 +1,4 @@
#===============================================================================
# ===============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of eos.
@@ -15,7 +15,7 @@
#
# You should have received a copy of the GNU Lesser General Public License
# along with eos. If not, see <http://www.gnu.org/licenses/>.
#===============================================================================
# ===============================================================================
from sqlalchemy import Column, String, Integer, Boolean, ForeignKey, Table
from sqlalchemy.orm import relation, mapper, synonym, deferred
@@ -24,17 +24,19 @@ from eos.db import gamedata_meta
from eos.types import Item, MarketGroup, Icon
marketgroups_table = Table("invmarketgroups", gamedata_meta,
Column("marketGroupID", Integer, primary_key = True),
Column("marketGroupID", Integer, primary_key=True),
Column("marketGroupName", String),
Column("description", String),
Column("hasTypes", Boolean),
Column("parentGroupID", Integer, ForeignKey("invmarketgroups.marketGroupID", initially="DEFERRED", deferrable=True)),
Column("parentGroupID", Integer,
ForeignKey("invmarketgroups.marketGroupID", initially="DEFERRED", deferrable=True)),
Column("iconID", Integer, ForeignKey("icons.iconID")))
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)})
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

@@ -1,4 +1,4 @@
#===============================================================================
# ===============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of eos.
@@ -15,15 +15,16 @@
#
# 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, Table, String
from sqlalchemy.orm import mapper
from eos.types import MetaData
from eos.db import gamedata_meta
from eos.types import MetaData
metadata_table = Table("metadata", gamedata_meta,
Column("field_name", String, primary_key=True),
Column("field_value", String))
Column("field_name", String, primary_key=True),
Column("field_value", String))
mapper(MetaData, metadata_table)

View File

@@ -1,4 +1,4 @@
#===============================================================================
# ===============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of eos.
@@ -15,33 +15,33 @@
#
# 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, ForeignKey, String
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.orm import relation, mapper, synonym
from eos.db import gamedata_meta
from eos.db.gamedata.item import items_table
from eos.types import MetaGroup, Item, MetaType
from sqlalchemy.ext.associationproxy import association_proxy
metagroups_table = Table("invmetagroups", gamedata_meta,
Column("metaGroupID", Integer, primary_key = True),
Column("metaGroupID", Integer, primary_key=True),
Column("metaGroupName", String))
metatypes_table = Table("invmetatypes", gamedata_meta,
Column("typeID", Integer, ForeignKey("invtypes.typeID"), primary_key = True),
Column("typeID", Integer, ForeignKey("invtypes.typeID"), primary_key=True),
Column("parentTypeID", Integer, ForeignKey("invtypes.typeID")),
Column("metaGroupID", Integer, ForeignKey("invmetagroups.metaGroupID")))
mapper(MetaGroup, metagroups_table,
properties = {"ID" : synonym("metaGroupID"),
"name" : synonym("metaGroupName")})
properties={"ID": synonym("metaGroupID"),
"name": synonym("metaGroupName")})
mapper(MetaType, metatypes_table,
properties = {"ID" : synonym("metaGroupID"),
"parent" : relation(Item, primaryjoin = metatypes_table.c.parentTypeID == items_table.c.typeID),
"items" : relation(Item, primaryjoin = metatypes_table.c.typeID == items_table.c.typeID),
"info": relation(MetaGroup, lazy=False)})
properties={"ID": synonym("metaGroupID"),
"parent": relation(Item, primaryjoin=metatypes_table.c.parentTypeID == items_table.c.typeID),
"items": relation(Item, primaryjoin=metatypes_table.c.typeID == items_table.c.typeID),
"info": relation(MetaGroup, lazy=False)})
MetaType.name = association_proxy("info", "name")

View File

@@ -1,4 +1,4 @@
#===============================================================================
# ===============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of eos.
@@ -15,21 +15,23 @@
#
# 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.orm import join, exc
from sqlalchemy.sql import and_, or_, select
import eos.config
from eos.db import gamedata_session
from eos.db.gamedata.metaGroup import metatypes_table, items_table
from sqlalchemy.sql import and_, or_, select, func
from sqlalchemy.orm import join, exc
from eos.types import Item, Category, Group, MarketGroup, AttributeInfo, MetaData, MetaGroup
from eos.db.util import processEager, processWhere
import eos.config
from eos.types import Item, Category, Group, MarketGroup, AttributeInfo, MetaData, MetaGroup
configVal = getattr(eos.config, "gamedataCache", None)
if configVal is True:
def cachedQuery(amount, *keywords):
def deco(function):
cache = {}
def checkAndReturn(*args, **kwargs):
useCache = kwargs.pop("useCache", True)
cacheKey = []
@@ -45,6 +47,7 @@ if configVal is True:
return handler
return checkAndReturn
return deco
elif callable(configVal):
@@ -56,8 +59,10 @@ else:
return function(*args, **kwargs)
return checkAndReturn
return deco
def sqlizeString(line):
# Escape backslashes first, as they will be as escape symbol in queries
# Then escape percent and underscore signs
@@ -65,7 +70,10 @@ def sqlizeString(line):
line = line.replace("\\", "\\\\").replace("%", "\\%").replace("_", "\\_").replace("*", "%")
return line
itemNameMap = {}
@cachedQuery(1, "lookfor")
def getItem(lookfor, eager=None):
if isinstance(lookfor, int):
@@ -88,7 +96,10 @@ def getItem(lookfor, eager=None):
raise TypeError("Need integer or string as argument")
return item
groupNameMap = {}
@cachedQuery(1, "lookfor")
def getGroup(lookfor, eager=None):
if isinstance(lookfor, int):
@@ -111,63 +122,78 @@ def getGroup(lookfor, eager=None):
raise TypeError("Need integer or string as argument")
return group
categoryNameMap = {}
@cachedQuery(1, "lookfor")
def getCategory(lookfor, eager=None):
if isinstance(lookfor, int):
if eager is None:
category = gamedata_session.query(Category).get(lookfor)
else:
category = gamedata_session.query(Category).options(*processEager(eager)).filter(Category.ID == lookfor).first()
category = gamedata_session.query(Category).options(*processEager(eager)).filter(
Category.ID == lookfor).first()
elif isinstance(lookfor, basestring):
if lookfor in categoryNameMap:
id = categoryNameMap[lookfor]
if eager is None:
category = gamedata_session.query(Category).get(id)
else:
category = gamedata_session.query(Category).options(*processEager(eager)).filter(Category.ID == id).first()
category = gamedata_session.query(Category).options(*processEager(eager)).filter(
Category.ID == id).first()
else:
# Category names are unique, so we can use first() instead of one()
category = gamedata_session.query(Category).options(*processEager(eager)).filter(Category.name == lookfor).first()
category = gamedata_session.query(Category).options(*processEager(eager)).filter(
Category.name == lookfor).first()
categoryNameMap[lookfor] = category.ID
else:
raise TypeError("Need integer or string as argument")
return category
metaGroupNameMap = {}
@cachedQuery(1, "lookfor")
def getMetaGroup(lookfor, eager=None):
if isinstance(lookfor, int):
if eager is None:
metaGroup = gamedata_session.query(MetaGroup).get(lookfor)
else:
metaGroup = gamedata_session.query(MetaGroup).options(*processEager(eager)).filter(MetaGroup.ID == lookfor).first()
metaGroup = gamedata_session.query(MetaGroup).options(*processEager(eager)).filter(
MetaGroup.ID == lookfor).first()
elif isinstance(lookfor, basestring):
if lookfor in metaGroupNameMap:
id = metaGroupNameMap[lookfor]
if eager is None:
metaGroup = gamedata_session.query(MetaGroup).get(id)
else:
metaGroup = gamedata_session.query(MetaGroup).options(*processEager(eager)).filter(MetaGroup.ID == id).first()
metaGroup = gamedata_session.query(MetaGroup).options(*processEager(eager)).filter(
MetaGroup.ID == id).first()
else:
# MetaGroup names are unique, so we can use first() instead of one()
metaGroup = gamedata_session.query(MetaGroup).options(*processEager(eager)).filter(MetaGroup.name == lookfor).first()
metaGroup = gamedata_session.query(MetaGroup).options(*processEager(eager)).filter(
MetaGroup.name == lookfor).first()
metaGroupNameMap[lookfor] = metaGroup.ID
else:
raise TypeError("Need integer or string as argument")
return metaGroup
@cachedQuery(1, "lookfor")
def getMarketGroup(lookfor, eager=None):
if isinstance(lookfor, int):
if eager is None:
marketGroup = gamedata_session.query(MarketGroup).get(lookfor)
else:
marketGroup = gamedata_session.query(MarketGroup).options(*processEager(eager)).filter(MarketGroup.ID == lookfor).first()
marketGroup = gamedata_session.query(MarketGroup).options(*processEager(eager)).filter(
MarketGroup.ID == lookfor).first()
else:
raise TypeError("Need integer as argument")
return marketGroup
@cachedQuery(2, "where", "filter")
def getItemsByCategory(filter, where=None, eager=None):
if isinstance(filter, int):
@@ -178,7 +204,9 @@ def getItemsByCategory(filter, where=None, eager=None):
raise TypeError("Need integer or string as argument")
filter = processWhere(filter, where)
return gamedata_session.query(Item).options(*processEager(eager)).join(Item.group, Group.category).filter(filter).all()
return gamedata_session.query(Item).options(*processEager(eager)).join(Item.group, Group.category).filter(
filter).all()
@cachedQuery(3, "where", "nameLike", "join")
def searchItems(nameLike, where=None, join=None, eager=None):
@@ -194,10 +222,14 @@ def searchItems(nameLike, where=None, join=None, eager=None):
items = gamedata_session.query(Item).options(*processEager(eager)).join(*join)
for token in nameLike.split(' '):
token_safe = u"%{0}%".format(sqlizeString(token))
items = items.filter(processWhere(Item.name.like(token_safe, escape="\\"), where))
if where is not None:
items = items.filter(and_(Item.name.like(token_safe, escape="\\"), where))
else:
items = items.filter(Item.name.like(token_safe, escape="\\"))
items = items.limit(100).all()
return items
@cachedQuery(2, "where", "itemids")
def getVariations(itemids, where=None, eager=None):
for itemid in itemids:
@@ -210,9 +242,11 @@ def getVariations(itemids, where=None, eager=None):
itemfilter = or_(*(metatypes_table.c.parentTypeID == itemid for itemid in itemids))
filter = processWhere(itemfilter, where)
joinon = items_table.c.typeID == metatypes_table.c.typeID
vars = gamedata_session.query(Item).options(*processEager(eager)).join((metatypes_table, joinon)).filter(filter).all()
vars = gamedata_session.query(Item).options(*processEager(eager)).join((metatypes_table, joinon)).filter(
filter).all()
return vars
@cachedQuery(1, "attr")
def getAttributeInfo(attr, eager=None):
if isinstance(attr, basestring):
@@ -227,6 +261,7 @@ def getAttributeInfo(attr, eager=None):
result = None
return result
@cachedQuery(1, "field")
def getMetaData(field):
if isinstance(field, basestring):
@@ -235,6 +270,7 @@ def getMetaData(field):
raise TypeError("Need string as argument")
return data
@cachedQuery(2, "itemIDs", "attributeID")
def directAttributeRequest(itemIDs, attrIDs):
for itemID in itemIDs:
@@ -245,8 +281,8 @@ def directAttributeRequest(itemIDs, attrIDs):
raise TypeError("All itemIDs must be integer")
q = select((eos.types.Item.typeID, eos.types.Attribute.attributeID, eos.types.Attribute.value),
and_(eos.types.Attribute.attributeID.in_(attrIDs), eos.types.Item.typeID.in_(itemIDs)),
from_obj=[join(eos.types.Attribute, eos.types.Item)])
and_(eos.types.Attribute.attributeID.in_(attrIDs), eos.types.Item.typeID.in_(itemIDs)),
from_obj=[join(eos.types.Attribute, eos.types.Item)])
result = gamedata_session.execute(q).fetchall()
return result

View File

@@ -1,11 +1,11 @@
from sqlalchemy import Column, Table, Integer, String, ForeignKey
from sqlalchemy.orm import mapper
from eos.types import Traits
from eos.db import gamedata_meta
from eos.types import Traits
traits_table = Table("invtraits", gamedata_meta,
Column("typeID", Integer, ForeignKey("invtypes.typeID"), primary_key=True),
Column("traitText", String))
mapper(Traits, traits_table);
mapper(Traits, traits_table)

View File

@@ -1,4 +1,4 @@
#===============================================================================
# ===============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of eos.
@@ -15,7 +15,7 @@
#
# 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, Table, Integer, String
from sqlalchemy.orm import mapper, synonym
@@ -24,10 +24,10 @@ from eos.db import gamedata_meta
from eos.types import Unit
groups_table = Table("dgmunits", gamedata_meta,
Column("unitID", Integer, primary_key = True),
Column("unitID", Integer, primary_key=True),
Column("unitName", String),
Column("displayName", String))
mapper(Unit, groups_table,
properties = {"ID" : synonym("unitID"),
"name" : synonym("unitName")})
properties={"ID": synonym("unitID"),
"name": synonym("unitName")})

View File

@@ -1,17 +1,22 @@
import config
import logging
import shutil
import time
import re
import os
import config
import migrations
logger = logging.getLogger(__name__)
def getVersion(db):
cursor = db.execute('PRAGMA user_version')
return cursor.fetchone()[0]
def getAppVersion():
return migrations.appVersion
def update(saveddata_engine):
dbVersion = getVersion(saveddata_engine)
appVersion = getAppVersion()
@@ -21,7 +26,7 @@ def update(saveddata_engine):
if dbVersion < appVersion:
# Automatically backup database
toFile = "%s/saveddata_migration_%d-%d_%s.db"%(
toFile = "%s/saveddata_migration_%d-%d_%s.db" % (
config.savePath,
dbVersion,
appVersion,
@@ -30,10 +35,9 @@ def update(saveddata_engine):
shutil.copyfile(config.saveDB, toFile)
for version in xrange(dbVersion, appVersion):
func = migrations.updates[version+1]
func = migrations.updates[version + 1]
if func:
print "applying update",version+1
logger.info("Applying database update: %d", version + 1)
func(saveddata_engine)
# when all is said and done, set version to current

View File

@@ -11,7 +11,6 @@ upgrade files 1-5)
import pkgutil
import re
updates = {}
appVersion = 0

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,340 @@
"""
Migration 12
- Converts modules based on March 2016 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 = {
16457: ( # Crosslink Compact Ballistic Control System
16459, # Muon Coil Bolt Array I
16461, # Multiphasic Bolt Array I
16463, # 'Pandemonium' Ballistic Enhancement
),
5281: ( # Coadjunct Scoped Remote Sensor Booster
7218, # Piercing ECCM Emitter I
),
5365: ( # Cetus Scoped Burst Jammer
5359, # 1Z-3 Subversive ECM Eruption
),
1973: ( # Sensor Booster I
1947, # ECCM - Radar I
2002, # ECCM - Ladar I
2003, # ECCM - Magnetometric I
2004, # ECCM - Gravimetric I
2005, # ECCM - Omni I
),
1951: ( # 'Basic' Tracking Enhancer
6322, # Beta-Nought Tracking Mode
6323, # Azimuth Descalloping Tracking Enhancer
6324, # F-AQ Delay-Line Scan Tracking Subroutines
6321, # Beam Parallax Tracking Program
),
521: ( # 'Basic' Damage Control
5829, # GLFF Containment Field
5831, # Interior Force Field Array
5835, # F84 Local Damage System
5833, # Systematic Damage Control
),
22925: ( # 'Bootleg' Remote Sensor Booster
22939, # 'Boss' Remote Sensor Booster
22941, # 'Entrepreneur' Remote Sensor Booster
),
5443: ( # Faint Epsilon Scoped Warp Scrambler
5441, # Fleeting Progressive Warp Scrambler I
),
1963: ( # Remote Sensor Booster I
1959, # ECCM Projector I
),
6325: ( # Fourier Compact Tracking Enhancer
6326, # Sigma-Nought Tracking Mode I
6327, # Auto-Gain Control Tracking Enhancer I
6328, # F-aQ Phase Code Tracking Subroutines
),
21486: ( # 'Kindred' Gyrostabilizer
21488, # Monophonic Stabilization Actuator I
),
19927: ( # Hypnos Scoped Magnetometric ECM
9518, # Initiated Ion Field ECM I
),
10188: ( # 'Basic' Magnetic Field Stabilizer
11111, # Insulated Stabilizer Array
11109, # Linear Flux Stabilizer
11115, # Gauss Field Balancer
11113, # Magnetic Vortex Stabilizer
),
22919: ( # 'Monopoly' Magnetic Field Stabilizer
22917, # 'Capitalist' Magnetic Field Stabilizer I
),
5839: ( # IFFA Compact Damage Control
5841, # Emergency Damage Control I
5843, # F85 Peripheral Damage System I
5837, # Pseudoelectron Containment Field I
),
522: ( # 'Micro' Cap Battery
4747, # Micro Ld-Acid Capacitor Battery I
4751, # Micro Ohm Capacitor Reserve I
4745, # Micro F-4a Ld-Sulfate Capacitor Charge Unit
4749, # Micro Peroxide Capacitor Power Cell
3480, # Micro Capacitor Battery II
),
518: ( # 'Basic' Gyrostabilizer
5915, # Lateral Gyrostabilizer
5919, # F-M2 Weapon Inertial Suspensor
5913, # Hydraulic Stabilization Actuator
5917, # Stabilized Weapon Mounts
),
19931: ( # Compulsive Scoped Multispectral ECM
19933, # 'Hypnos' Multispectral ECM I
),
5403: ( # Faint Scoped Warp Disruptor
5401, # Fleeting Warp Disruptor I
),
23902: ( # 'Trebuchet' Heat Sink I
23900, # 'Mangonel' Heat Sink I
),
1893: ( # 'Basic' Heat Sink
5845, # Heat Exhaust System
5856, # C3S Convection Thermal Radiator
5855, # 'Boreas' Coolant System
5854, # Stamped Heat Sink
),
6160: ( # F-90 Compact Sensor Booster
20214, # Extra Radar ECCM Scanning Array I
20220, # Extra Ladar ECCM Scanning Array I
20226, # Extra Gravimetric ECCM Scanning Array I
20232, # Extra Magnetometric ECCM Scanning Array I
7948, # Gravimetric Positional ECCM Sensor System I
7964, # Radar Positional ECCM Sensor System I
7965, # Omni Positional ECCM Sensor System I
7966, # Ladar Positional ECCM Sensor System I
7970, # Magnetometric Positional ECCM Sensor System I
20218, # Conjunctive Radar ECCM Scanning Array I
20224, # Conjunctive Ladar ECCM Scanning Array I
20230, # Conjunctive Gravimetric ECCM Scanning Array I
20236, # Conjunctive Magnetometric ECCM Scanning Array I
6157, # Supplemental Scanning CPU I
),
23418: ( # 'Radical' Damage Control
22893, # 'Gonzo' Damage Control I
),
19952: ( # Umbra Scoped Radar ECM
9520, # 'Penumbra' White Noise ECM
),
1952: ( # Sensor Booster II
2258, # ECCM - Omni II
2259, # ECCM - Gravimetric II
2260, # ECCM - Ladar II
2261, # ECCM - Magnetometric II
2262, # ECCM - Radar II
),
5282: ( # Linked Enduring Sensor Booster
7219, # Scattering ECCM Projector I
),
1986: ( # Signal Amplifier I
2579, # Gravimetric Backup Array I
2583, # Ladar Backup Array I
2587, # Magnetometric Backup Array I
2591, # Multi Sensor Backup Array I
4013, # RADAR Backup Array I
),
4871: ( # Large Compact Pb-Acid Cap Battery
4875, # Large Ohm Capacitor Reserve I
4869, # Large F-4a Ld-Sulfate Capacitor Charge Unit
4873, # Large Peroxide Capacitor Power Cell
),
1964: ( # Remote Sensor Booster II
1960, # ECCM Projector II
),
5933: ( # Counterbalanced Compact Gyrostabilizer
5931, # Cross-Lateral Gyrostabilizer I
5935, # F-M3 Munition Inertial Suspensor
5929, # Pneumatic Stabilization Actuator I
),
4025: ( # X5 Enduring Stasis Webifier
4029, # 'Langour' Drive Disruptor I
),
4027: ( # Fleeting Compact Stasis Webifier
4031, # Patterned Stasis Web I
),
22937: ( # 'Enterprise' Remote Tracking Computer
22935, # 'Tycoon' Remote Tracking Computer
),
22929: ( # 'Marketeer' Tracking Computer
22927, # 'Economist' Tracking Computer I
),
1987: ( # Signal Amplifier II
2580, # Gravimetric Backup Array II
2584, # Ladar Backup Array II
2588, # Magnetometric Backup Array II
2592, # Multi Sensor Backup Array II
4014, # RADAR Backup Array II
),
19939: ( # Enfeebling Scoped Ladar ECM
9522, # Faint Phase Inversion ECM I
),
5340: ( # P-S Compact Remote Tracking Computer
5341, # 'Prayer' Remote Tracking Computer
),
19814: ( # Phased Scoped Target Painter
19808, # Partial Weapon Navigation
),
1949: ( # 'Basic' Signal Amplifier
1946, # Basic RADAR Backup Array
1982, # Basic Ladar Backup Array
1983, # Basic Gravimetric Backup Array
1984, # Basic Magnetometric Backup Array
1985, # Basic Multi Sensor Backup Array
6193, # Emergency Magnetometric Scanners
6194, # Emergency Multi-Frequency Scanners
6202, # Emergency RADAR Scanners
6216, # Emergency Ladar Scanners
6217, # Emergency Gravimetric Scanners
6225, # Sealed RADAR Backup Cluster
6238, # Sealed Magnetometric Backup Cluster
6239, # Sealed Multi-Frequency Backup Cluster
6241, # Sealed Ladar Backup Cluster
6242, # Sealed Gravimetric Backup Cluster
6257, # Surplus RADAR Reserve Array
6258, # F-42 Reiterative RADAR Backup Sensors
6283, # Surplus Magnetometric Reserve Array
6284, # F-42 Reiterative Magnetometric Backup Sensors
6285, # Surplus Multi-Frequency Reserve Array
6286, # F-42 Reiterative Multi-Frequency Backup Sensors
6289, # Surplus Ladar Reserve Array
6290, # F-42 Reiterative Ladar Backup Sensors
6291, # Surplus Gravimetric Reserve Array
6292, # F-42 Reiterative Gravimetric Backup Sensors
6309, # Amplitude Signal Enhancer
6310, # 'Acolyth' Signal Booster
6311, # Type-E Discriminative Signal Augmentation
6312, # F-90 Positional Signal Amplifier
),
21527: ( # 'Firewall' Signal Amplifier
21521, # Gravimetric Firewall
21523, # Ladar Firewall
21525, # Magnetometric Firewall
21527, # Multi Sensor Firewall
21529, # RADAR Firewall
),
23416: ( # 'Peace' Large Remote Armor Repairer
None, # 'Pacifier' Large Remote Armor Repairer
),
6176: ( # F-12 Enduring Tracking Computer
6174, # Monopulse Tracking Mechanism I
),
6159: ( # Alumel-Wired Enduring Sensor Booster
7917, # Alumel Radar ECCM Sensor Array I
7918, # Alumel Ladar ECCM Sensor Array I
7922, # Alumel Gravimetric ECCM Sensor Array I
7926, # Alumel Omni ECCM Sensor Array I
7937, # Alumel Magnetometric ECCM Sensor Array I
7867, # Supplemental Ladar ECCM Scanning Array I
7869, # Supplemental Gravimetric ECCM Scanning Array I
7870, # Supplemental Omni ECCM Scanning Array I
7887, # Supplemental Radar ECCM Scanning Array I
7889, # Supplemental Magnetometric ECCM Scanning Array I
20216, # Incremental Radar ECCM Scanning Array I
20222, # Incremental Ladar ECCM Scanning Array I
20228, # Incremental Gravimetric ECCM Scanning Array I
20234, # Incremental Magnetometric ECCM Scanning Array I
7892, # Prototype ECCM Radar Sensor Cluster
7893, # Prototype ECCM Ladar Sensor Cluster
7895, # Prototype ECCM Gravimetric Sensor Cluster
7896, # Prototype ECCM Omni Sensor Cluster
7914, # Prototype ECCM Magnetometric Sensor Cluster
6158, # Prototype Sensor Booster
),
5849: ( # Extruded Compact Heat Sink
5846, # Thermal Exhaust System I
5858, # C4S Coiled Circuit Thermal Radiator
5857, # 'Skadi' Coolant System I
),
22895: ( # 'Shady' Sensor Booster
22897, # 'Forger' ECCM - Magnetometric I
),
11105: ( # Vortex Compact Magnetic Field Stabilizer
11103, # Insulated Stabilizer Array I
11101, # Linear Flux Stabilizer I
11107, # Gauss Field Balancer I
),
22945: ( # 'Executive' Remote Sensor Dampener
22943, # 'Broker' Remote Sensor Dampener I
),
6173: ( # Optical Compact Tracking Computer
6175, # 'Orion' Tracking CPU I
),
5279: ( # F-23 Compact Remote Sensor Booster
7217, # Spot Pulsing ECCM I
7220, # Phased Muon ECCM Caster I
5280, # Connected Remote Sensor Booster
),
4787: ( # Small Compact Pb-Acid Cap Battery
4791, # Small Ohm Capacitor Reserve I
4785, # Small F-4a Ld-Sulfate Capacitor Charge Unit
4789, # Small Peroxide Capacitor Power Cell
),
19946: ( # BZ-5 Scoped Gravimetric ECM
9519, # FZ-3 Subversive Spatial Destabilizer ECM
),
6073: ( # Medium Compact Pb-Acid Cap Battery
6097, # Medium Ohm Capacitor Reserve I
6111, # Medium F-4a Ld-Sulfate Capacitor Charge Unit
6083, # Medium Peroxide Capacitor Power Cell
),
21484: ( # 'Full Duplex' Ballistic Control System
21482, # Ballistic 'Purge' Targeting System I
),
6296: ( # F-89 Compact Signal Amplifier
6218, # Protected Gravimetric Backup Cluster I
6222, # Protected Ladar Backup Cluster I
6226, # Protected Magnetometric Backup Cluster I
6230, # Protected Multi-Frequency Backup Cluster I
6234, # Protected RADAR Backup Cluster I
6195, # Reserve Gravimetric Scanners
6199, # Reserve Ladar Scanners
6203, # Reserve Magnetometric Scanners
6207, # Reserve Multi-Frequency Scanners
6212, # Reserve RADAR Scanners
20238, # Secure Gravimetric Backup Cluster I
20244, # Secure Ladar Backup Cluster I
20250, # Secure Magnetometric Backup Cluster I
20260, # Secure Radar Backup Cluster I
6244, # F-43 Repetitive Gravimetric Backup Sensors
6252, # F-43 Repetitive Ladar Backup Sensors
6260, # F-43 Repetitive Magnetometric Backup Sensors
6268, # F-43 Repetitive Multi-Frequency Backup Sensors
6276, # F-43 Repetitive RADAR Backup Sensors
20240, # Shielded Gravimetric Backup Cluster I
20246, # Shielded Ladar Backup Cluster I
20252, # Shielded Magnetometric Backup Cluster I
20262, # Shielded Radar Backup Cluster I
6243, # Surrogate Gravimetric Reserve Array I
6251, # Surrogate Ladar Reserve Array I
6259, # Surrogate Magnetometric Reserve Array I
6267, # Surrogate Multi-Frequency Reserve Array I
6275, # Surrogate RADAR Reserve Array I
20242, # Warded Gravimetric Backup Cluster I
20248, # Warded Ladar Backup Cluster I
20254, # Warded Magnetometric Backup Cluster I
20264, # Warded Radar Backup Cluster I
6294, # 'Mendicant' Signal Booster I
6293, # Wavelength Signal Enhancer I
6295, # Type-D Attenuation Signal Augmentation
),
5302: ( # Phased Muon Scoped Sensor Dampener
5300, # Indirect Scanning Dampening Unit 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,15 @@
"""
Migration 13
- Alters fits table to introduce implant location attribute
"""
import sqlalchemy
def upgrade(saveddata_engine):
# Update fits schema to include implant location attribute
try:
saveddata_engine.execute("SELECT implantLocation FROM fits LIMIT 1")
except sqlalchemy.exc.DatabaseError:
saveddata_engine.execute("ALTER TABLE fits ADD COLUMN implantLocation INTEGER;")
saveddata_engine.execute("UPDATE fits SET implantLocation = 0")

View File

@@ -0,0 +1,19 @@
"""
Migration 14
- This should take care of issue #586.
"""
import sqlalchemy
def upgrade(saveddata_engine):
if saveddata_engine.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='fighters'").scalar() == 'fighters':
# Fighters table exists
try:
saveddata_engine.execute("SELECT active FROM fighters LIMIT 1")
except sqlalchemy.exc.DatabaseError:
# if we don't have the active column, we are on an old pre-release version. Drop the tables and move on
# (they will be recreated)
saveddata_engine.execute("DROP TABLE fighters")
saveddata_engine.execute("DROP TABLE fightersAbilities")

View File

@@ -0,0 +1,21 @@
"""
Migration 15
- Delete projected modules on citadels
"""
import sqlalchemy
def upgrade(saveddata_engine):
sql = """
DELETE FROM modules WHERE ID IN
(
SELECT m.ID FROM modules AS m
JOIN fits AS f ON m.fitID = f.ID
WHERE f.shipID IN ("35832", "35833", "35834", "40340")
AND m.projected = 1
)
"""
saveddata_engine.execute(sql)

View File

@@ -0,0 +1,14 @@
"""
Migration 16
- Alters fits table to introduce notes attribute
"""
import sqlalchemy
def upgrade(saveddata_engine):
# Update fits schema to include notes attribute
try:
saveddata_engine.execute("SELECT notes FROM fits LIMIT 1")
except sqlalchemy.exc.DatabaseError:
saveddata_engine.execute("ALTER TABLE fits ADD COLUMN notes VARCHAR;")

View File

@@ -0,0 +1,39 @@
"""
Migration 17
- Moves all fleet boosters to the new schema
"""
import sqlalchemy
def upgrade(saveddata_engine):
from eos.db import saveddata_session
from eos.db.saveddata.fit import commandFits_table
sql = """
SELECT sm.memberID as boostedFit, s.leaderID AS squadBoost, w.leaderID AS wingBoost, g.leaderID AS gangBoost
FROM squadmembers sm
JOIN squads s ON s.ID = sm.squadID
JOIN wings w on w.ID = s.wingID
JOIN gangs g on g.ID = w.gangID
"""
results = saveddata_session.execute(sql)
inserts = []
for row in results:
boosted = row["boostedFit"]
types = ("squad", "wing", "gang")
for x in types:
value = row["{}Boost".format(x)]
if value is None:
continue
inserts.append({"boosterID": value, "boostedID": boosted, "active": 1})
try:
saveddata_session.execute(commandFits_table.insert(), {"boosterID": value, "boostedID": boosted, "active": 1})
except Exception, e:
pass
saveddata_session.commit()

View File

@@ -0,0 +1,68 @@
"""
Migration 8
- Converts modules from old Warfare Links to Command Modules
"""
CONVERSIONS = {
42526: ( # Armor Command Burst I
20069, # Armored Warfare Link - Damage Control I
20409, # Armored Warfare Link - Passive Defense I
22227, # Armored Warfare Link - Rapid Repair I
),
43552: ( # Armor Command Burst II
4264, # Armored Warfare Link - Damage Control II
4266, # Armored Warfare Link - Passive Defense II
4266, # Armored Warfare Link - Rapid Repair II
),
42527: ( # Information Command Burst I
11052, # Information Warfare Link - Sensor Integrity I
20405, # Information Warfare Link - Recon Operation I
20406, # Information Warfare Link - Electronic Superiority I
),
43554: ( # Information Command Burst II
4268, # Information Warfare Link - Electronic Superiority II
4270, # Information Warfare Link - Recon Operation II
4272, # Information Warfare Link - Sensor Integrity II
),
42529: ( # Shield Command Burst I
20124, # Siege Warfare Link - Active Shielding I
20514, # Siege Warfare Link - Shield Harmonizing I
22228, # Siege Warfare Link - Shield Efficiency I
),
43555: ( # Shield Command Burst II
4280, # Siege Warfare Link - Active Shielding II
4282, # Siege Warfare Link - Shield Efficiency II
4284 # Siege Warfare Link - Shield Harmonizing II
),
42530: ( # Skirmish Command Burst I
11017, # Skirmish Warfare Link - Interdiction Maneuvers I
20070, # Skirmish Warfare Link - Evasive Maneuvers I
20408, # Skirmish Warfare Link - Rapid Deployment I
),
43556: ( # Skirmish Command Burst II
4286, # Skirmish Warfare Link - Evasive Maneuvers II
4288, # Skirmish Warfare Link - Interdiction Maneuvers II
4290 # Skirmish Warfare Link - Rapid Deployment II
),
42528: ( # Mining Foreman Burst I
22553, # Mining Foreman Link - Harvester Capacitor Efficiency I
22555, # Mining Foreman Link - Mining Laser Field Enhancement I
22557, # Mining Foreman Link - Laser Optimization I
),
43551: ( # Mining Foreman Burst II
4274, # Mining Foreman Link - Harvester Capacitor Efficiency II
4276, # Mining Foreman Link - Laser Optimization II
4278 # Mining Foreman Link - Mining Laser Field Enhancement II
),
}
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

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

View File

@@ -1,4 +1,4 @@
#===============================================================================
# ===============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of eos.
@@ -15,25 +15,27 @@
#
# 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, ForeignKey, Integer, UniqueConstraint, Boolean
from sqlalchemy.orm import mapper, relation
from sqlalchemy import Table, Column, ForeignKey, Integer, Boolean
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.orm import mapper, relation
from eos.db import saveddata_meta
from eos.types import Booster
boosters_table = Table("boosters", saveddata_meta,
Column("ID", Integer, primary_key = True),
Column("ID", Integer, primary_key=True),
Column("itemID", Integer),
Column("fitID", Integer, ForeignKey("fits.ID"), nullable = False),
Column("fitID", Integer, ForeignKey("fits.ID"), nullable=False),
Column("active", Boolean),
)
# Legacy booster side effect code, should disable but a mapper relies on it.
activeSideEffects_table = Table("boostersActiveSideEffects", saveddata_meta,
Column("boosterID", ForeignKey("boosters.ID"), primary_key = True),
Column("effectID", Integer, primary_key = True))
Column("boosterID", ForeignKey("boosters.ID"), primary_key=True),
Column("effectID", Integer, primary_key=True))
class ActiveSideEffectsDummy(object):
def __init__(self, effectID):
@@ -42,6 +44,6 @@ class ActiveSideEffectsDummy(object):
mapper(ActiveSideEffectsDummy, activeSideEffects_table)
mapper(Booster, boosters_table,
properties = {"_Booster__activeSideEffectDummies" : relation(ActiveSideEffectsDummy)})
properties={"_Booster__activeSideEffectDummies": relation(ActiveSideEffectsDummy)})
Booster._Booster__activeSideEffectIDs = association_proxy("_Booster__activeSideEffectDummies", "effectID")

View File

@@ -1,4 +1,4 @@
#===============================================================================
# ===============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of eos.
@@ -15,18 +15,18 @@
#
# 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, ForeignKey, Boolean
from sqlalchemy import Table, Column, Integer, ForeignKey
from sqlalchemy.orm import mapper
from eos.db import saveddata_meta
from eos.types import Cargo
cargo_table = Table("cargo", saveddata_meta,
Column("ID", Integer, primary_key=True),
Column("fitID", Integer, ForeignKey("fits.ID"), nullable = False, index = True),
Column("itemID", Integer, nullable = False),
Column("amount", Integer, nullable = False))
Column("ID", Integer, primary_key=True),
Column("fitID", Integer, ForeignKey("fits.ID"), nullable=False, index=True),
Column("itemID", Integer, nullable=False),
Column("amount", Integer, nullable=False))
mapper(Cargo, cargo_table)
mapper(Cargo, cargo_table)

View File

@@ -1,4 +1,4 @@
#===============================================================================
# ===============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of eos.
@@ -15,30 +15,44 @@
#
# 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, ForeignKey, String
from sqlalchemy.orm import relation, mapper
from eos.db import saveddata_meta
from eos.db.saveddata.implant import charImplants_table
from eos.types import Character, User, Skill, Implant
from eos.effectHandlerHelpers import HandledImplantBoosterList
from eos.types import Character, User, Skill, Implant
characters_table = Table("characters", saveddata_meta,
Column("ID", Integer, primary_key = True),
Column("name", String, nullable = False),
Column("ID", Integer, primary_key=True),
Column("name", String, nullable=False),
Column("apiID", Integer),
Column("apiKey", String),
Column("defaultChar", Integer),
Column("chars", String, nullable = True),
Column("chars", String, nullable=True),
Column("defaultLevel", Integer, nullable=True),
Column("ownerID", ForeignKey("users.ID"), nullable = True))
Column("ownerID", ForeignKey("users.ID"), nullable=True))
mapper(Character, characters_table,
properties = {"_Character__owner" : relation(User, backref = "characters"),
"_Character__skills" : relation(Skill, backref="character", cascade = "all,delete-orphan"),
"_Character__implants" : relation(Implant, collection_class = HandledImplantBoosterList, cascade='all,delete-orphan', single_parent=True,
primaryjoin = charImplants_table.c.charID == characters_table.c.ID,
secondaryjoin = charImplants_table.c.implantID == Implant.ID,
secondary = charImplants_table),})
properties={
"savedName": characters_table.c.name,
"_Character__owner": relation(
User,
backref="characters"),
"_Character__skills": relation(
Skill,
backref="character",
cascade="all,delete-orphan"),
"_Character__implants": relation(
Implant,
collection_class=HandledImplantBoosterList,
cascade='all,delete-orphan',
backref='character',
single_parent=True,
primaryjoin=charImplants_table.c.charID == characters_table.c.ID,
secondaryjoin=charImplants_table.c.implantID == Implant.ID,
secondary=charImplants_table),
}
)

View File

@@ -1,4 +1,4 @@
#===============================================================================
# ===============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of eos.
@@ -15,17 +15,17 @@
#
# 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 import Table, Column, Integer, String
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))
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

@@ -1,4 +1,4 @@
#===============================================================================
# ===============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of eos.
@@ -15,7 +15,7 @@
#
# 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, ForeignKey, String
from sqlalchemy.orm import mapper
@@ -24,7 +24,7 @@ from eos.db import saveddata_meta
from eos.types import DamagePattern
damagePatterns_table = Table("damagePatterns", saveddata_meta,
Column("ID", Integer, primary_key = True),
Column("ID", Integer, primary_key=True),
Column("name", String),
Column("emAmount", Integer),
Column("thermalAmount", Integer),

View File

@@ -1,4 +1,4 @@
#===============================================================================
# ===============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of eos.
@@ -15,19 +15,20 @@
#
# 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, ForeignKey, Boolean
from sqlalchemy.orm import mapper
from eos.db import saveddata_meta
from eos.types import Drone
drones_table = Table("drones", saveddata_meta,
Column("groupID", Integer, primary_key=True),
Column("fitID", Integer, ForeignKey("fits.ID"), nullable = False, index = True),
Column("itemID", Integer, nullable = False),
Column("amount", Integer, nullable = False),
Column("amountActive", Integer, nullable = False),
Column("projected", Boolean, default = False))
Column("fitID", Integer, ForeignKey("fits.ID"), nullable=False, index=True),
Column("itemID", Integer, nullable=False),
Column("amount", Integer, nullable=False),
Column("amountActive", Integer, nullable=False),
Column("projected", Boolean, default=False))
mapper(Drone, drones_table)

View File

@@ -0,0 +1,50 @@
# ===============================================================================
# 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, ForeignKey, Boolean
from sqlalchemy.orm import *
from eos.db import saveddata_meta
from eos.types import Fighter, Fit
from eos.types import FighterAbility
fighters_table = Table("fighters", saveddata_meta,
Column("groupID", Integer, primary_key=True),
Column("fitID", Integer, ForeignKey("fits.ID"), nullable=False, index=True),
Column("itemID", Integer, nullable=False),
Column("active", Boolean, nullable=True),
Column("amount", Integer, nullable=False),
Column("projected", Boolean, default=False))
fighter_abilities_table = Table("fightersAbilities", saveddata_meta,
Column("groupID", Integer, ForeignKey("fighters.groupID"), primary_key=True,
index=True),
Column("effectID", Integer, nullable=False, primary_key=True),
Column("active", Boolean, default=False))
mapper(Fighter, fighters_table,
properties={
"owner": relation(Fit),
"_Fighter__abilities": relation(
FighterAbility,
backref="fighter",
cascade='all, delete, delete-orphan'),
})
mapper(FighterAbility, fighter_abilities_table)

View File

@@ -1,4 +1,4 @@
#===============================================================================
# ===============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of eos.
@@ -15,41 +15,51 @@
#
# 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 *
from sqlalchemy.orm import *
from sqlalchemy.sql import and_
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.orm import *
from sqlalchemy.orm.collections import attribute_mapped_collection
from sqlalchemy.sql import and_
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.drone import drones_table
from eos.db.saveddata.fighter import fighters_table
from eos.db.saveddata.implant import fitImplants_table
from eos.types import Fit, Module, User, Booster, Drone, Cargo, Implant, Character, DamagePattern, TargetResists
from eos.db.saveddata.module import modules_table
from eos.effectHandlerHelpers import *
from eos.types import Fit, Module, User, Booster, Drone, Fighter, Cargo, Implant, Character, DamagePattern, \
TargetResists, ImplantLocation
fits_table = Table("fits", saveddata_meta,
Column("ID", Integer, primary_key = True),
Column("ownerID", ForeignKey("users.ID"), nullable = True, index = True),
Column("shipID", Integer, nullable = False, index = True),
Column("name", String, nullable = False),
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("targetResistsID", ForeignKey("targetResists.ID"), nullable=True),
Column("modeID", Integer, nullable=True),
)
Column("ID", Integer, primary_key=True),
Column("ownerID", ForeignKey("users.ID"), nullable=True, index=True),
Column("shipID", Integer, nullable=False, index=True),
Column("name", String, nullable=False),
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("targetResistsID", ForeignKey("targetResists.ID"), nullable=True),
Column("modeID", Integer, nullable=True),
Column("implantLocation", Integer, nullable=False, default=ImplantLocation.FIT),
Column("notes", String, 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, nullable = False, default = 1),
Column("active", Boolean, nullable = False, default = 1),
)
Column("sourceID", ForeignKey("fits.ID"), primary_key=True),
Column("victimID", ForeignKey("fits.ID"), primary_key=True),
Column("amount", Integer, nullable=False, default=1),
Column("active", Boolean, nullable=False, default=1),
)
commandFits_table = Table("commandFits", saveddata_meta,
Column("boosterID", ForeignKey("fits.ID"), primary_key=True),
Column("boostedID", ForeignKey("fits.ID"), primary_key=True),
Column("active", Boolean, nullable=False, default=1)
)
class ProjectedFit(object):
def __init__(self, sourceID, source_fit, amount=1, active=True):
@@ -81,85 +91,135 @@ class ProjectedFit(object):
self.sourceID, self.victimID, self.amount, self.active, hex(id(self))
)
class CommandFit(object):
def __init__(self, boosterID, booster_fit, active=True):
self.boosterID = boosterID
self.booster_fit = booster_fit
self.active = active
@reconstructor
def init(self):
if self.booster_fit.isInvalid:
# Very rare for this to happen, but be prepared for it
eos.db.saveddata_session.delete(self.booster_fit)
eos.db.saveddata_session.flush()
eos.db.saveddata_session.refresh(self.boosted_fit)
def __repr__(self):
return "CommandFit(boosterID={}, boostedID={}, active={}) at {}".format(
self.boosterID, self.boostedID, 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)
)
Fit._Fit__commandFits = association_proxy(
"boostedOf", # look at the boostedOf association...
"booster_fit", # .. and return the booster fit
creator=lambda boosterID, booster_fit: CommandFit(boosterID, booster_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"),
"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'),
}
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__fighters": relation(
Fighter,
collection_class=HandledDroneCargoList,
cascade='all, delete, delete-orphan',
single_parent=True,
primaryjoin=and_(fighters_table.c.fitID == fits_table.c.ID, fighters_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__projectedFighters": relation(
Fighter,
collection_class=HandledProjectedDroneList,
cascade='all, delete, delete-orphan',
single_parent=True,
primaryjoin=and_(fighters_table.c.fitID == fits_table.c.ID, fighters_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'),
"boostedOnto": relationship(
CommandFit,
primaryjoin=commandFits_table.c.boosterID == fits_table.c.ID,
backref='booster_fit',
collection_class=attribute_mapped_collection('boostedID'),
cascade='all, delete, delete-orphan'),
"boostedOf": relationship(
CommandFit,
primaryjoin=fits_table.c.ID == commandFits_table.c.boostedID,
backref='boosted_fit',
collection_class=attribute_mapped_collection('boosterID'),
cascade='all, delete, delete-orphan'),
}
)
mapper(ProjectedFit, projectedFits_table,
properties = {
"_ProjectedFit__amount": projectedFits_table.c.amount,
}
properties={
"_ProjectedFit__amount": projectedFits_table.c.amount,
}
)
mapper(CommandFit, commandFits_table)

View File

@@ -1,4 +1,4 @@
#===============================================================================
# ===============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of eos.
@@ -15,52 +15,51 @@
#
# 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, ForeignKey, String
from sqlalchemy.orm import mapper, relation
from eos.db import saveddata_meta
from eos.types import Fleet, Wing, Squad, Fit
from eos.db.saveddata.fit import fits_table
from eos.types import Fleet, Wing, Squad, Fit
gangs_table = Table("gangs", saveddata_meta,
Column("ID", Integer, primary_key = True),
Column("ID", Integer, primary_key=True),
Column("leaderID", ForeignKey("fits.ID")),
Column("boosterID", ForeignKey("fits.ID")),
Column("name", String))
wings_table = Table("wings", saveddata_meta,
Column("ID", Integer, primary_key = True),
Column("ID", Integer, primary_key=True),
Column("gangID", ForeignKey("gangs.ID")),
Column("boosterID", ForeignKey("fits.ID")),
Column("leaderID", ForeignKey("fits.ID")))
squads_table = Table("squads", saveddata_meta,
Column("ID", Integer, primary_key = True),
Column("ID", Integer, primary_key=True),
Column("wingID", ForeignKey("wings.ID")),
Column("leaderID", ForeignKey("fits.ID")),
Column("boosterID", ForeignKey("fits.ID")))
squadmembers_table = Table("squadmembers", saveddata_meta,
Column("squadID", ForeignKey("squads.ID"), primary_key = True),
Column("memberID", ForeignKey("fits.ID"), primary_key = True))
Column("squadID", ForeignKey("squads.ID"), primary_key=True),
Column("memberID", ForeignKey("fits.ID"), primary_key=True))
mapper(Fleet, gangs_table,
properties = {"wings" : relation(Wing, backref="gang"),
"leader" : relation(Fit, primaryjoin = gangs_table.c.leaderID == fits_table.c.ID),
"booster": relation(Fit, primaryjoin = gangs_table.c.boosterID == fits_table.c.ID)})
properties={"wings": relation(Wing, backref="gang"),
"leader": relation(Fit, primaryjoin=gangs_table.c.leaderID == fits_table.c.ID),
"booster": relation(Fit, primaryjoin=gangs_table.c.boosterID == fits_table.c.ID)})
mapper(Wing, wings_table,
properties = {"squads" : relation(Squad, backref="wing"),
"leader" : relation(Fit, primaryjoin = wings_table.c.leaderID == fits_table.c.ID),
"booster": relation(Fit, primaryjoin = wings_table.c.boosterID == fits_table.c.ID)})
properties={"squads": relation(Squad, backref="wing"),
"leader": relation(Fit, primaryjoin=wings_table.c.leaderID == fits_table.c.ID),
"booster": relation(Fit, primaryjoin=wings_table.c.boosterID == fits_table.c.ID)})
mapper(Squad, squads_table,
properties = {"leader" : relation(Fit, primaryjoin = squads_table.c.leaderID == fits_table.c.ID),
"booster" : relation(Fit, primaryjoin = squads_table.c.boosterID == fits_table.c.ID),
"members" : relation(Fit,
primaryjoin = squads_table.c.ID == squadmembers_table.c.squadID,
secondaryjoin = squadmembers_table.c.memberID == fits_table.c.ID,
secondary = squadmembers_table)})
properties={"leader": relation(Fit, primaryjoin=squads_table.c.leaderID == fits_table.c.ID),
"booster": relation(Fit, primaryjoin=squads_table.c.boosterID == fits_table.c.ID),
"members": relation(Fit,
primaryjoin=squads_table.c.ID == squadmembers_table.c.squadID,
secondaryjoin=squadmembers_table.c.memberID == fits_table.c.ID,
secondary=squadmembers_table)})

View File

@@ -1,4 +1,4 @@
#===============================================================================
# ===============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of eos.
@@ -15,7 +15,7 @@
#
# 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, ForeignKey, Boolean
from sqlalchemy.orm import mapper
@@ -24,16 +24,20 @@ from eos.db import saveddata_meta
from eos.types import Implant
implants_table = Table("implants", saveddata_meta,
Column("ID", Integer, primary_key = True),
Column("itemID", Integer),
Column("active", Boolean))
Column("ID", Integer, primary_key=True),
Column("itemID", Integer),
Column("active", Boolean))
fitImplants_table = Table("fitImplants", saveddata_meta,
Column("fitID", ForeignKey("fits.ID"), index = True),
Column("implantID", ForeignKey("implants.ID"), primary_key = True))
Column("fitID", ForeignKey("fits.ID"), index=True),
Column("implantID", ForeignKey("implants.ID"), primary_key=True))
charImplants_table = Table("charImplants", saveddata_meta,
Column("charID", ForeignKey("characters.ID"), index = True),
Column("implantID", ForeignKey("implants.ID"), primary_key = True))
Column("charID", ForeignKey("characters.ID"), index=True),
Column("implantID", ForeignKey("implants.ID"), primary_key=True))
implantsSetMap_table = Table("implantSetMap", saveddata_meta,
Column("setID", ForeignKey("implantSets.ID"), index=True),
Column("implantID", ForeignKey("implants.ID"), primary_key=True))
mapper(Implant, implants_table)

View File

@@ -0,0 +1,45 @@
# ===============================================================================
# Copyright (C) 2016 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, String
from sqlalchemy.orm import relation, mapper
from eos.db import saveddata_meta
from eos.db.saveddata.implant import implantsSetMap_table
from eos.effectHandlerHelpers import HandledImplantBoosterList
from eos.types import Implant, ImplantSet
implant_set_table = Table("implantSets", saveddata_meta,
Column("ID", Integer, primary_key=True),
Column("name", String, nullable=False),
)
mapper(ImplantSet, implant_set_table,
properties={
"_ImplantSet__implants": relation(
Implant,
collection_class=HandledImplantBoosterList,
cascade='all, delete, delete-orphan',
backref='set',
single_parent=True,
primaryjoin=implantsSetMap_table.c.setID == implant_set_table.c.ID,
secondaryjoin=implantsSetMap_table.c.implantID == Implant.ID,
secondary=implantsSetMap_table),
}
)

View File

@@ -0,0 +1,197 @@
# ===============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of pyfa.
#
# pyfa is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# pyfa is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with pyfa. If not, see <http://www.gnu.org/licenses/>.
# ===============================================================================
import eos.db
import eos.types
class ImportError(Exception):
pass
class DefaultDatabaseValues():
def __init__(self):
pass
instance = None
@classmethod
def importDamageProfileDefaults(cls):
damageProfileList = [["Uniform", "25", "25", "25", "25"], ["[Generic]EM", "100", "0", "0", "0"],
["[Generic]Thermal", "0", "100", "0", "0"], ["[Generic]Kinetic", "0", "0", "100", "0"],
["[Generic]Explosive", "0", "0", "0", "100"],
["[NPC][Asteroid] Blood Raiders", "5067", "4214", "0", "0"],
["[Bombs]Concussion Bomb", "0", "0", "6400", "0"],
["[Bombs]Electron Bomb", "6400", "0", "0", "0"],
["[Bombs]Scorch Bomb", "0", "6400", "0", "0"],
["[Bombs]Shrapnel Bomb", "0", "0", "0", "6400"],
["[Frequency Crystals][T2] Gleam", "56", "56", "0", "0"],
["[Frequency Crystals][T2] Aurora", "40", "24", "0", "0"],
["[Frequency Crystals][T2] Scorch", "72", "16", "0", "0"],
["[Frequency Crystals][T2] Conflagration", "61.6", "61.6", "0", "0"],
["[Frequency Crystals]Gamma", "61.6", "35.2", "0", "0"],
["[Frequency Crystals]Infrared", "44", "17.6", "0", "0"],
["[Frequency Crystals]Microwave", "35.2", "17.6", "0", "0"],
["[Frequency Crystals]Multifrequency", "61.6", "44", "0", "0"],
["[Frequency Crystals]Radio", "44", "0", "0", "0"],
["[Frequency Crystals]Standard", "44", "26.4", "0", "0"],
["[Frequency Crystals]Ultraviolet", "52.8", "26.4", "0", "0"],
["[Frequency Crystals]Xray", "52.8", "35.2", "0", "0"],
["[Hybrid Charges][T2] Void", "0", "61.6", "61.6", "0"],
["[Hybrid Charges][T2] Null", "0", "48", "40", "0"],
["[Hybrid Charges][T2] Javelin", "0", "64", "48", "0"],
["[Hybrid Charges][T2] Spike", "0", "32", "32", "0"],
["[Hybrid Charges]Antimatter", "0", "48", "67.2", "0"],
["[Hybrid Charges]Iridium", "0", "28.8", "38.4", "0"],
["[Hybrid Charges]Iron", "0", "19.2", "28.8", "0"],
["[Hybrid Charges]Lead", "0", "28.8", "48", "0"],
["[Hybrid Charges]Plutonium", "0", "48", "57.6", "0"],
["[Hybrid Charges]Thorium", "0", "38.4", "48", "0"],
["[Hybrid Charges]Tungsten", "0", "19.2", "38.4", "0"],
["[Hybrid Charges]Uranium", "0", "38.4", "57.6", "0"],
["[Missiles]Mjolnir", "100", "0", "0", "0"], ["[Missiles]Inferno", "0", "100", "0", "0"],
["[Missiles]Scourge", "0", "0", "100", "0"], ["[Missiles]Nova", "0", "0", "0", "100"],
["[Missiles][Structure) Standup Missile", "100", "100", "100", "100"],
["[Projectile Ammo][T2] Tremor", "0", "0", "24", "40"],
["[Projectile Ammo][T2] Quake", "0", "0", "40", "72"],
["[Projectile Ammo][T2] Hail", "0", "0", "26.4", "96.8"],
["[Projectile Ammo][T2] Barrage", "0", "0", "40", "48"],
["[Projectile Ammo]Carbonized Lead", "0", "0", "35.2", "8.8"],
["[Projectile Ammo]Depleted Uranium", "0", "26.4", "17.6", "26.4"],
["[Projectile Ammo]EMP", "79.2", "0", "8.8", "17.6"],
["[Projectile Ammo]Fusion", "0", "0", "17.6", "88"],
["[Projectile Ammo]Nuclear", "0", "0", "8.8", "35.2"],
["[Projectile Ammo]Phased Plasma", "0", "88", "17.6", "0"],
["[Projectile Ammo]Proton", "26.4", "0", "17.6", "0"],
["[Projectile Ammo]Titanium Sabot", "0", "0", "52.8", "176"],
["[NPC][Burner] Cruor (Blood Raiders)", "90", "90", "0", "0"],
["[NPC][Burner] Dramiel (Angel)", "55", "0", "20", "96"],
["[NPC][Burner] Daredevil (Serpentis)", "0", "110", "154", "0"],
["[NPC][Burner] Succubus (Sanshas Nation)", "135", "30", "0", "0"],
["[NPC][Burner] Worm (Guristas)", "0", "0", "228", "0"],
["[NPC][Burner] Enyo", "0", "147", "147", "0"],
["[NPC][Burner] Hawk", "0", "0", "247", "0"],
["[NPC][Burner] Jaguar", "36", "0", "50", "182"],
["[NPC][Burner] Vengeance", "232", "0", "0", "0"],
["[NPC][Burner] Ashimmu (Blood Raiders)", "260", "100", "0", "0"],
["[NPC][Burner] Talos", "0", "413", "413", "0"],
["[NPC][Burner] Sentinel", "0", "75", "0", "90"],
["[NPC][Asteroid] Angel Cartel", "1838", "562", "2215", "3838"],
["[NPC][Deadspace] Angel Cartel", "369", "533", "1395", "3302"],
["[NPC][Deadspace] Blood Raiders", "6040", "5052", "10", "15"],
["[NPC][Asteroid] Guristas", "0", "1828", "7413", "0"],
["[NPC][Deadspace] Guristas", "0", "1531", "9680", "0"],
["[NPC][Asteroid] Rogue Drone", "394", "666", "1090", "1687"],
["[NPC][Deadspace] Rogue Drone", "276", "1071", "1069", "871"],
["[NPC][Asteroid] Sanshas Nation", "5586", "4112", "0", "0"],
["[NPC][Deadspace] Sanshas Nation", "3009", "2237", "0", "0"],
["[NPC][Asteroid] Serpentis", "0", "5373", "4813", "0"],
["[NPC][Deadspace] Serpentis", "0", "3110", "1929", "0"],
["[NPC][Mission] Amarr Empire", "4464", "3546", "97", "0"],
["[NPC][Mission] Caldari State", "0", "2139", "4867", "0"],
["[NPC][Mission] CONCORD", "336", "134", "212", "412"],
["[NPC][Mission] Gallente Federation", "9", "3712", "2758", "0"],
["[NPC][Mission] Khanid", "612", "483", "43", "6"],
["[NPC][Mission] Minmatar Republic", "1024", "388", "1655", "4285"],
["[NPC][Mission] Mordus Legion", "25", "262", "625", "0"],
["[NPC][Mission] Thukker", "0", "52", "10", "79"],
["[NPC][Other] Sleepers", "1472", "1472", "1384", "1384"],
["[NPC][Other] Sansha Incursion", "1682", "1347", "3678", "3678"]]
for damageProfileRow in damageProfileList:
name, em, therm, kin, exp = damageProfileRow
damageProfile = eos.db.getDamagePattern(name)
if damageProfile is None:
damageProfile = eos.types.DamagePattern(em, therm, kin, exp)
damageProfile.name = name
eos.db.save(damageProfile)
@classmethod
def importResistProfileDefaults(cls):
targetResistProfileList = [["Uniform (25%)", "0.25", "0.25", "0.25", "0.25"],
["Uniform (50%)", "0.50", "0.50", "0.50", "0.50"],
["Uniform (75%)", "0.75", "0.75", "0.75", "0.75"],
["Uniform (90%)", "0.90", "0.90", "0.90", "0.90"],
["[T1 Resist]Shield", "0.0", "0.20", "0.40", "0.50"],
["[T1 Resist]Armor", "0.50", "0.45", "0.25", "0.10"],
["[T1 Resist]Hull", "0.33", "0.33", "0.33", "0.33"],
["[T1 Resist]Shield (+T2 DCU)", "0.125", "0.30", "0.475", "0.562"],
["[T1 Resist]Armor (+T2 DCU)", "0.575", "0.532", "0.363", "0.235"],
["[T1 Resist]Hull (+T2 DCU)", "0.598", "0.598", "0.598", "0.598"],
["[T2 Resist]Amarr (Shield)", "0.0", "0.20", "0.70", "0.875"],
["[T2 Resist]Amarr (Armor)", "0.50", "0.35", "0.625", "0.80"],
["[T2 Resist]Caldari (Shield)", "0.20", "0.84", "0.76", "0.60"],
["[T2 Resist]Caldari (Armor)", "0.50", "0.8625", "0.625", "0.10"],
["[T2 Resist]Gallente (Shield)", "0.0", "0.60", "0.85", "0.50"],
["[T2 Resist]Gallente (Armor)", "0.50", "0.675", "0.8375", "0.10"],
["[T2 Resist]Minmatar (Shield)", "0.75", "0.60", "0.40", "0.50"],
["[T2 Resist]Minmatar (Armor)", "0.90", "0.675", "0.25", "0.10"],
["[NPC][Asteroid] Angel Cartel", "0.54", "0.42", "0.37", "0.32"],
["[NPC][Asteroid] Blood Raiders", "0.34", "0.39", "0.45", "0.52"],
["[NPC][Asteroid] Guristas", "0.55", "0.35", "0.3", "0.48"],
["[NPC][Asteroid] Rogue Drones", "0.35", "0.38", "0.44", "0.49"],
["[NPC][Asteroid] Sanshas Nation", "0.35", "0.4", "0.47", "0.53"],
["[NPC][Asteroid] Serpentis", "0.49", "0.38", "0.29", "0.51"],
["[NPC][Deadspace] Angel Cartel", "0.59", "0.48", "0.4", "0.32"],
["[NPC][Deadspace] Blood Raiders", "0.31", "0.39", "0.47", "0.56"],
["[NPC][Deadspace] Guristas", "0.57", "0.39", "0.31", "0.5"],
["[NPC][Deadspace] Rogue Drones", "0.42", "0.42", "0.47", "0.49"],
["[NPC][Deadspace] Sanshas Nation", "0.31", "0.39", "0.47", "0.56"],
["[NPC][Deadspace] Serpentis", "0.49", "0.38", "0.29", "0.56"],
["[NPC][Mission] Amarr Empire", "0.34", "0.38", "0.42", "0.46"],
["[NPC][Mission] Caldari State", "0.51", "0.38", "0.3", "0.51"],
["[NPC][Mission] CONCORD", "0.47", "0.46", "0.47", "0.47"],
["[NPC][Mission] Gallente Federation", "0.51", "0.38", "0.31", "0.52"],
["[NPC][Mission] Khanid", "0.51", "0.42", "0.36", "0.4"],
["[NPC][Mission] Minmatar Republic", "0.51", "0.46", "0.41", "0.35"],
["[NPC][Mission] Mordus Legion", "0.32", "0.48", "0.4", "0.62"],
["[NPC][Other] Sleeper", "0.61", "0.61", "0.61", "0.61"],
["[NPC][Other] Sansha Incursion", "0.65", "0.63", "0.64", "0.65"],
["[NPC][Burner] Cruor (Blood Raiders)", "0.8", "0.73", "0.69", "0.67"],
["[NPC][Burner] Dramiel (Angel)", "0.35", "0.48", "0.61", "0.68"],
["[NPC][Burner] Daredevil (Serpentis)", "0.69", "0.59", "0.59", "0.43"],
["[NPC][Burner] Succubus (Sanshas Nation)", "0.35", "0.48", "0.61", "0.68"],
["[NPC][Burner] Worm (Guristas)", "0.48", "0.58", "0.69", "0.74"],
["[NPC][Burner] Enyo", "0.58", "0.72", "0.86", "0.24"],
["[NPC][Burner] Hawk", "0.3", "0.86", "0.79", "0.65"],
["[NPC][Burner] Jaguar", "0.78", "0.65", "0.48", "0.56"],
["[NPC][Burner] Vengeance", "0.66", "0.56", "0.75", "0.86"],
["[NPC][Burner] Ashimmu (Blood Raiders)", "0.8", "0.76", "0.68", "0.7"],
["[NPC][Burner] Talos", "0.68", "0.59", "0.59", "0.43"],
["[NPC][Burner] Sentinel", "0.58", "0.45", "0.52", "0.66"]]
for targetResistProfileRow in targetResistProfileList:
name, em, therm, kin, exp = targetResistProfileRow
resistsProfile = eos.db.eos.db.getTargetResists(name)
if resistsProfile is None:
resistsProfile = eos.types.TargetResists(em, therm, kin, exp)
resistsProfile.name = name
eos.db.save(resistsProfile)
@classmethod
def importRequiredDefaults(cls):
damageProfileList = [["Uniform", "25", "25", "25", "25"]]
for damageProfileRow in damageProfileList:
name, em, therm, kin, exp = damageProfileRow
damageProfile = eos.db.getDamagePattern(name)
if damageProfile is None:
damageProfile = eos.types.DamagePattern(em, therm, kin, exp)
damageProfile.name = name
eos.db.save(damageProfile)

View File

@@ -1,4 +1,4 @@
#===============================================================================
# ===============================================================================
# Copyright (C) 2011 Anton Vorobyov
#
# This file is part of eos.
@@ -15,15 +15,16 @@
#
# 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, Table, String
from sqlalchemy.orm import mapper
from eos.types import MiscData
from eos.db import saveddata_meta
from eos.types import MiscData
miscdata_table = Table("miscdata", saveddata_meta,
Column("fieldName", String, primary_key=True),
Column("fieldValue", String))
Column("fieldName", String, primary_key=True),
Column("fieldValue", String))
mapper(MiscData, miscdata_table)

View File

@@ -1,4 +1,4 @@
#===============================================================================
# ===============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of eos.
@@ -15,7 +15,7 @@
#
# 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, ForeignKey, CheckConstraint, Boolean
from sqlalchemy.orm import relation, mapper
@@ -24,16 +24,15 @@ from eos.db import saveddata_meta
from eos.types import Module, 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("dummySlot", Integer, nullable = True, default = None),
Column("ID", Integer, primary_key=True),
Column("fitID", Integer, ForeignKey("fits.ID"), nullable=False, index=True),
Column("itemID", Integer, nullable=True),
Column("dummySlot", Integer, nullable=True, default=None),
Column("chargeID", Integer),
Column("state", Integer, CheckConstraint("state >= -1"), CheckConstraint("state <= 2")),
Column("projected", Boolean, default = False, nullable = False),
Column("projected", Boolean, default=False, nullable=False),
Column("position", Integer),
CheckConstraint('("dummySlot" = NULL OR "itemID" = NULL) AND "dummySlot" != "itemID"'))
mapper(Module, modules_table,
properties = {"owner" : relation(Fit)})
properties={"owner": relation(Fit)})

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

@@ -1,4 +1,4 @@
#===============================================================================
# ===============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of eos.
@@ -15,17 +15,18 @@
#
# 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, Float, Integer
from sqlalchemy.orm import mapper
from eos.db import saveddata_meta
from eos.types import Price
prices_table = Table("prices", saveddata_meta,
Column("typeID", Integer, primary_key=True),
Column("price", Float),
Column("time", Integer, nullable = False),
Column("time", Integer, nullable=False),
Column("failed", Integer))
mapper(Price, prices_table)

View File

@@ -1,4 +1,4 @@
#===============================================================================
# ===============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of eos.
@@ -15,26 +15,33 @@
#
# 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 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, TargetResists, CrestChar
from eos.db.saveddata.fleet import squadmembers_table
from eos.db.saveddata.fit import projectedFits_table
from sqlalchemy.sql import and_
from eos.db import saveddata_session, sd_lock
from eos.db.saveddata.fit import projectedFits_table
from eos.db.saveddata.fleet import squadmembers_table
from eos.db.util import processEager, processWhere
from eos.types import *
import eos.config
configVal = getattr(eos.config, "saveddataCache", None)
if configVal is True:
import weakref
itemCache = {}
queryCache = {}
def cachedQuery(type, amount, *keywords):
itemCache[type] = localItemCache = weakref.WeakValueDictionary()
queryCache[type] = typeQueryCache = {}
def deco(function):
localQueryCache = typeQueryCache[function] = {}
def setCache(cacheKey, args, kwargs):
items = function(*args, **kwargs)
IDs = set()
@@ -43,7 +50,7 @@ if configVal is True:
for item in stuff:
ID = getattr(item, "ID", None)
if ID is None:
#Some uncachable data, don't cache this query
# Some uncachable data, don't cache this query
del localQueryCache[cacheKey]
break
localItemCache[ID] = item
@@ -69,7 +76,7 @@ if configVal is True:
for ID in IDs:
data = localItemCache.get(ID)
if data is None:
#Fuck, some of our stuff isn't cached it seems.
# Fuck, some of our stuff isn't cached it seems.
items = setCache(cacheKey, args, kwargs)
break
items.append(data)
@@ -81,11 +88,14 @@ if configVal is True:
break
return items
return checkAndReturn
return deco
def removeCachedEntry(type, ID):
if not type in queryCache:
if type not in queryCache:
return
functionCache = queryCache[type]
for _, localCache in functionCache.iteritems():
@@ -110,11 +120,14 @@ else:
return function(*args, **kwargs)
return checkAndReturn
return deco
def removeCachedEntry(*args, **kwargs):
return
def sqlizeString(line):
# Escape backslashes first, as they will be as escape symbol in queries
# Then escape percent and underscore signs
@@ -122,6 +135,7 @@ def sqlizeString(line):
line = line.replace("\\", "\\\\").replace("%", "\\%").replace("_", "\\_").replace("*", "%")
return line
@cachedQuery(User, 1, "lookfor")
def getUser(lookfor, eager=None):
if isinstance(lookfor, int):
@@ -140,6 +154,7 @@ def getUser(lookfor, eager=None):
raise TypeError("Need integer or string as argument")
return user
@cachedQuery(Character, 1, "lookfor")
def getCharacter(lookfor, eager=None):
if isinstance(lookfor, int):
@@ -153,17 +168,20 @@ def getCharacter(lookfor, eager=None):
elif isinstance(lookfor, basestring):
eager = processEager(eager)
with sd_lock:
character = saveddata_session.query(Character).options(*eager).filter(Character.name == lookfor).first()
character = saveddata_session.query(Character).options(*eager).filter(
Character.savedName == lookfor).first()
else:
raise TypeError("Need integer or string as argument")
return character
def getCharacterList(eager=None):
eager = processEager(eager)
with sd_lock:
characters = saveddata_session.query(Character).options(*eager).all()
return characters
def getCharactersForUser(lookfor, eager=None):
if isinstance(lookfor, int):
eager = processEager(eager)
@@ -173,6 +191,7 @@ def getCharactersForUser(lookfor, eager=None):
raise TypeError("Need integer as argument")
return characters
@cachedQuery(Fit, 1, "lookfor")
def getFit(lookfor, eager=None):
if isinstance(lookfor, int):
@@ -182,7 +201,7 @@ 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")
@@ -193,6 +212,7 @@ def getFit(lookfor, eager=None):
return fit
@cachedQuery(Fleet, 1, "fleetID")
def getFleet(fleetID, eager=None):
if isinstance(fleetID, int):
@@ -207,6 +227,7 @@ def getFleet(fleetID, eager=None):
raise TypeError("Need integer as argument")
return fleet
@cachedQuery(Wing, 1, "wingID")
def getWing(wingID, eager=None):
if isinstance(wingID, int):
@@ -221,6 +242,7 @@ def getWing(wingID, eager=None):
raise TypeError("Need integer as argument")
return wing
@cachedQuery(Squad, 1, "squadID")
def getSquad(squadID, eager=None):
if isinstance(squadID, int):
@@ -235,6 +257,7 @@ def getSquad(squadID, eager=None):
raise TypeError("Need integer as argument")
return squad
def getFitsWithShip(shipID, ownerID=None, where=None, eager=None):
"""
Get all the fits using a certain ship.
@@ -256,6 +279,7 @@ def getFitsWithShip(shipID, ownerID=None, where=None, eager=None):
return fits
def getBoosterFits(ownerID=None, where=None, eager=None):
"""
Get all the fits that are flagged as a boosting ship
@@ -275,11 +299,13 @@ def getBoosterFits(ownerID=None, where=None, eager=None):
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.
@@ -300,6 +326,7 @@ def countFitsWithShip(shipID, ownerID=None, where=None, eager=None):
raise TypeError("ShipID must be integer")
return count
def getFitList(eager=None):
eager = processEager(eager)
with sd_lock:
@@ -307,12 +334,14 @@ def getFitList(eager=None):
return fits
def getFleetList(eager=None):
eager = processEager(eager)
with sd_lock:
fleets = saveddata_session.query(Fleet).options(*eager).all()
return fleets
@cachedQuery(Price, 1, "typeID")
def getPrice(typeID):
if isinstance(typeID, int):
@@ -322,12 +351,14 @@ 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:
@@ -336,18 +367,28 @@ def getMiscData(field):
raise TypeError("Need string as argument")
return data
def getDamagePatternList(eager=None):
eager = processEager(eager)
with sd_lock:
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
def getImplantSetList(eager=None):
eager = processEager(eager)
with sd_lock:
sets = saveddata_session.query(ImplantSet).options(*eager).all()
return sets
@cachedQuery(DamagePattern, 1, "lookfor")
def getDamagePattern(lookfor, eager=None):
if isinstance(lookfor, int):
@@ -357,15 +398,18 @@ def getDamagePattern(lookfor, eager=None):
else:
eager = processEager(eager)
with sd_lock:
pattern = saveddata_session.query(DamagePattern).options(*eager).filter(DamagePattern.ID == lookfor).first()
pattern = saveddata_session.query(DamagePattern).options(*eager).filter(
DamagePattern.ID == lookfor).first()
elif isinstance(lookfor, basestring):
eager = processEager(eager)
with sd_lock:
pattern = saveddata_session.query(DamagePattern).options(*eager).filter(DamagePattern.name == lookfor).first()
pattern = saveddata_session.query(DamagePattern).options(*eager).filter(
DamagePattern.name == lookfor).first()
else:
raise TypeError("Need integer or string as argument")
return pattern
@cachedQuery(TargetResists, 1, "lookfor")
def getTargetResists(lookfor, eager=None):
if isinstance(lookfor, int):
@@ -375,22 +419,45 @@ def getTargetResists(lookfor, eager=None):
else:
eager = processEager(eager)
with sd_lock:
pattern = saveddata_session.query(TargetResists).options(*eager).filter(TargetResists.ID == lookfor).first()
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()
pattern = saveddata_session.query(TargetResists).options(*eager).filter(
TargetResists.name == lookfor).first()
else:
raise TypeError("Need integer or string as argument")
return pattern
@cachedQuery(ImplantSet, 1, "lookfor")
def getImplantSet(lookfor, eager=None):
if isinstance(lookfor, int):
if eager is None:
with sd_lock:
pattern = saveddata_session.query(ImplantSet).get(lookfor)
else:
eager = processEager(eager)
with sd_lock:
pattern = saveddata_session.query(ImplantSet).options(*eager).filter(
TargetResists.ID == lookfor).first()
elif isinstance(lookfor, basestring):
eager = processEager(eager)
with sd_lock:
pattern = saveddata_session.query(ImplantSet).options(*eager).filter(TargetResists.name == lookfor).first()
else:
raise TypeError("Improper argument")
return pattern
def searchFits(nameLike, where=None, eager=None):
if not isinstance(nameLike, basestring):
raise TypeError("Need string as argument")
# Prepare our string for request
nameLike = u"%{0}%".format(sqlizeString(nameLike))
#Add any extra components to the search to our where clause
# Add any extra components to the search to our where clause
filter = processWhere(Fit.name.like(nameLike, escape="\\"), where)
eager = processEager(eager)
with sd_lock:
@@ -398,15 +465,18 @@ def searchFits(nameLike, where=None, eager=None):
return fits
def getSquadsIDsWithFitID(fitID):
if isinstance(fitID, int):
with sd_lock:
squads = saveddata_session.query(squadmembers_table.c.squadID).filter(squadmembers_table.c.memberID == fitID).all()
squads = saveddata_session.query(squadmembers_table.c.squadID).filter(
squadmembers_table.c.memberID == fitID).all()
squads = tuple(entry[0] for entry in squads)
return squads
else:
raise TypeError("Need integer as argument")
def getProjectedFits(fitID):
if isinstance(fitID, int):
with sd_lock:
@@ -416,12 +486,14 @@ def getProjectedFits(fitID):
else:
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):
@@ -440,6 +512,25 @@ def getCrestCharacter(lookfor, eager=None):
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]
@@ -450,14 +541,17 @@ def removeInvalid(fits):
return fits
def add(stuff):
with sd_lock:
saveddata_session.add(stuff)
def save(stuff):
add(stuff)
commit()
def remove(stuff):
removeCachedEntry(type(stuff), stuff.ID)
with sd_lock:

View File

@@ -1,4 +1,4 @@
#===============================================================================
# ===============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of eos.
@@ -15,7 +15,7 @@
#
# 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, ForeignKey
from sqlalchemy.orm import mapper
@@ -24,8 +24,8 @@ from eos.db import saveddata_meta
from eos.types import Skill
skills_table = Table("characterSkills", saveddata_meta,
Column("characterID", ForeignKey("characters.ID"), primary_key = True, index = True),
Column("itemID", Integer, primary_key = True),
Column("_Skill__level", Integer, nullable = True))
Column("characterID", ForeignKey("characters.ID"), primary_key=True, index=True),
Column("itemID", Integer, primary_key=True),
Column("_Skill__level", Integer, nullable=True))
mapper(Skill, skills_table)

View File

@@ -1,4 +1,4 @@
#===============================================================================
# ===============================================================================
# Copyright (C) 2014 Ryan Holmes
#
# This file is part of eos.
@@ -15,7 +15,7 @@
#
# 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
@@ -24,12 +24,12 @@ 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))
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

@@ -1,4 +1,4 @@
#===============================================================================
# ===============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of eos.
@@ -15,7 +15,7 @@
#
# 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
@@ -24,9 +24,9 @@ from eos.db import saveddata_meta
from eos.types import User
users_table = Table("users", saveddata_meta,
Column("ID", Integer, primary_key = True),
Column("username", String, nullable = False, unique = True),
Column("password", String, nullable = False),
Column("admin", Boolean, nullable = False))
Column("ID", Integer, primary_key=True),
Column("username", String, nullable=False, unique=True),
Column("password", String, nullable=False),
Column("admin", Boolean, nullable=False))
mapper(User, users_table)

View File

@@ -1,4 +1,4 @@
#===============================================================================
# ===============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of eos.
@@ -15,7 +15,7 @@
#
# 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.orm import eagerload
from sqlalchemy.sql import and_
@@ -31,8 +31,9 @@ replace = {"attributes": "_Item__attributes",
"damagePattern": "_Fit__damagePattern",
"projectedFits": "_Fit__projectedFits"}
def processEager(eager):
if eager == None:
if eager is None:
return tuple()
else:
l = []
@@ -44,6 +45,7 @@ def processEager(eager):
return l
def _replacements(eagerString):
splitEager = eagerString.split(".")
for i in xrange(len(splitEager)):
@@ -54,6 +56,7 @@ def _replacements(eagerString):
return ".".join(splitEager)
def processWhere(clause, where):
if where is not None:
if not hasattr(where, "__iter__"):

View File

@@ -1,4 +1,4 @@
#===============================================================================
# ===============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of eos.
@@ -15,15 +15,17 @@
#
# 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.orm.attributes import flag_modified
import eos.db
import eos.types
# from sqlalchemy.orm.attributes import flag_modified
import logging
import eos.db
import eos.types
logger = logging.getLogger(__name__)
class HandledList(list):
def filteredItemPreAssign(self, filter, *args, **kwargs):
for element in self:
@@ -108,11 +110,12 @@ class HandledList(list):
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")
# 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")
@@ -135,6 +138,11 @@ class HandledModuleList(HandledList):
HandledList.append(self, mod)
if mod.isInvalid:
self.remove(mod)
return
# fix for #529, where a module may be in incorrect state after CCP changes mechanics of module
if not mod.isValidState(mod.state):
mod.state = eos.types.State.ONLINE
def insert(self, index, mod):
mod.position = index
@@ -164,11 +172,12 @@ class HandledModuleList(HandledList):
self[index] = mod
def freeSlot(self, slot):
for i in range(len(self) -1, -1, -1):
for i in range(len(self) - 1, -1, -1):
mod = self[i]
if mod.getModifiedItemAttr("subSystemSlot") == slot:
del self[i]
class HandledDroneCargoList(HandledList):
def find(self, item):
for o in self:
@@ -185,6 +194,7 @@ class HandledDroneCargoList(HandledList):
if thing.isInvalid:
self.remove(thing)
class HandledImplantBoosterList(HandledList):
def append(self, thing):
if thing.isInvalid:
@@ -201,6 +211,7 @@ class HandledImplantBoosterList(HandledList):
HandledList.append(self, thing)
class HandledProjectedModList(HandledList):
def append(self, proj):
if proj.isInvalid:
@@ -227,6 +238,7 @@ class HandledProjectedModList(HandledList):
if not proj.item.isType("projected") and not isSystemEffect:
self.remove(proj)
class HandledProjectedDroneList(HandledDroneCargoList):
def append(self, proj):
proj.projected = True
@@ -236,6 +248,7 @@ class HandledProjectedDroneList(HandledDroneCargoList):
if proj.isInvalid or not proj.item.isType("projected"):
self.remove(proj)
class HandledItem(object):
def preAssignItemAttr(self, *args, **kwargs):
self.itemModifiedAttributes.preAssign(*args, **kwargs)
@@ -252,6 +265,7 @@ class HandledItem(object):
def forceItemAttr(self, *args, **kwargs):
self.itemModifiedAttributes.force(*args, **kwargs)
class HandledCharge(object):
def preAssignChargeAttr(self, *args, **kwargs):
self.chargeModifiedAttributes.preAssign(*args, **kwargs)

View File

@@ -1,4 +1,4 @@
#===============================================================================
# ===============================================================================
# Copyright (C) 2010 Diego Duclos
# 2010 Anton Vorobyov
#
@@ -16,4 +16,4 @@
#
# You should have received a copy of the GNU Lesser General Public License
# along with eos. If not, see <http://www.gnu.org/licenses/>.
#===============================================================================
# ===============================================================================

View File

@@ -3,6 +3,8 @@
# Used by:
# Modules named like: Dynamic Fuel Valve (8 of 8)
type = "passive"
def handler(fit, container, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Propulsion Module",
"capacitorNeed", container.getModifiedItemAttr("capNeedBonus"))

View File

@@ -4,6 +4,8 @@
# Implant: Zor's Custom Navigation Hyper-Link
# Skill: Acceleration Control
type = "passive"
def handler(fit, container, context):
level = container.level if "skill" in context else 1
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Propulsion Module",

View File

@@ -3,6 +3,8 @@
# Used by:
# Implants named like: Eifyr and Co. 'Rogue' Acceleration Control AC (6 of 6)
type = "passive"
def handler(fit, implant, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Propulsion Module",
"speedFactor", implant.getModifiedItemAttr("speedFBonus"))

View File

@@ -5,6 +5,8 @@
# Implant: Poteque 'Prospector' Archaeology AC-905
# Implant: Poteque 'Prospector' Environmental Analysis EY-1005
type = "passive"
def handler(fit, container, context):
fit.modules.filteredItemIncrease(lambda module: module.item.requiresSkill("Archaeology"),
"accessDifficultyBonus",

View File

@@ -5,7 +5,9 @@
# Implant: Poteque 'Prospector' Environmental Analysis EY-1005
# Implant: Poteque 'Prospector' Hacking HC-905
type = "passive"
def handler(fit, container, context):
fit.modules.filteredItemIncrease(lambda c: c.item.requiresSkill("Hacking"),
"accessDifficultyBonus",
container.getModifiedItemAttr("accessDifficultyBonusModifier"), position="post")
"accessDifficultyBonus",
container.getModifiedItemAttr("accessDifficultyBonusModifier"), position="post")

View File

@@ -6,5 +6,13 @@ type = "active"
def handler(fit, module, context):
for type in ("kinetic", "thermal", "explosive", "em"):
attr = "armor%sDamageResonance" % type.capitalize()
fit.ship.multiplyItemAttr(attr, module.getModifiedItemAttr(attr),
stackingPenalties=True, penaltyGroup="preMul")
#Adjust RAH to match the current damage pattern
damagePattern = fit.damagePattern
if damagePattern:
attrDamagePattern = "%sAmount" % type
damagePatternModifier = getattr(damagePattern,attrDamagePattern)/float(sum((damagePattern.emAmount,damagePattern.thermalAmount,damagePattern.kineticAmount,damagePattern.explosiveAmount)))
modifiedResistModifier = (1-(((1-module.getModifiedItemAttr(attr))*4)*(damagePatternModifier)))
module.forceItemAttr(attr, modifiedResistModifier)
fit.ship.multiplyItemAttr(attr, module.getModifiedItemAttr(attr), stackingPenalties=True, penaltyGroup="preMul")

View File

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

View File

@@ -3,6 +3,8 @@
# Used by:
# Skill: Advanced Drone Interfacing
type = "passive"
def handler(fit, skill, context):
fit.modules.filteredItemIncrease(lambda mod: mod.item.group.name == "Drone Control Unit",
fit.modules.filteredItemIncrease(lambda mod: mod.item.group.name == "Fighter Support Unit",
"maxGroupActive", skill.level)

View File

@@ -5,7 +5,9 @@
# Implant: Zor's Custom Navigation Link
# Skill: Afterburner
type = "passive"
def handler(fit, container, context):
level = container.level if "skill" in context else 1
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Afterburner"),
"duration", container.getModifiedItemAttr("durationBonus") * level)
"duration", container.getModifiedItemAttr("durationBonus") * level)

View File

@@ -5,7 +5,9 @@
# Modules from group: Nanofiber Internal Structure (7 of 7)
# Modules from group: Reinforced Bulkhead (8 of 8)
type = "passive"
def handler(fit, module, context):
fit.ship.boostItemAttr("agility",
module.getModifiedItemAttr("agilityMultiplier"),
stackingPenalties = True)
stackingPenalties=True)

View File

@@ -3,5 +3,7 @@
# Used by:
# Modules named like: Polycarbon Engine Housing (8 of 8)
type = "passive"
def handler(fit, module, context):
fit.ship.boostItemAttr("agility", module.getModifiedItemAttr("agilityMultiplier"), stackingPenalties = True)
fit.ship.boostItemAttr("agility", module.getModifiedItemAttr("agilityMultiplier"), stackingPenalties=True)

View File

@@ -1,12 +1,14 @@
# ammoFallofMultiplier
#
# Used by:
# Charges from group: Advanced Artillery Ammo (6 of 6)
# Charges from group: Advanced Autocannon Ammo (6 of 6)
# Charges from group: Advanced Beam Laser Crystal (6 of 6)
# Charges from group: Advanced Blaster Charge (6 of 6)
# Charges from group: Advanced Pulse Laser Crystal (6 of 6)
# Charges from group: Advanced Railgun Charge (6 of 6)
# Charges from group: Advanced Artillery Ammo (8 of 8)
# Charges from group: Advanced Autocannon Ammo (8 of 8)
# Charges from group: Advanced Beam Laser Crystal (8 of 8)
# Charges from group: Advanced Blaster Charge (8 of 8)
# Charges from group: Advanced Pulse Laser Crystal (8 of 8)
# Charges from group: Advanced Railgun Charge (8 of 8)
type = "passive"
def handler(fit, module, context):
module.multiplyItemAttr("falloff", module.getModifiedChargeAttr("fallofMultiplier") or 1)

View File

@@ -1,8 +1,12 @@
# ammoInfluenceCapNeed
#
# Used by:
# Items from category: Charge (458 of 831)
# Items from category: Charge (465 of 899)
# Charges from group: Frequency Crystal (185 of 185)
# Charges from group: Hybrid Charge (209 of 209)
type = "passive"
def handler(fit, module, context):
# Dirty hack to work around cap charges setting cap booster
# injection amount to zero

View File

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

View File

@@ -5,5 +5,7 @@
# Charges from group: Interdiction Probe (2 of 2)
# Charges from group: Survey Probe (3 of 3)
type = "passive"
def handler(fit, module, context):
module.multiplyItemAttr("speed", module.getModifiedChargeAttr("speedMultiplier") or 1)

View File

@@ -1,13 +1,15 @@
# ammoTrackingMultiplier
#
# Used by:
# Charges from group: Advanced Artillery Ammo (6 of 6)
# Charges from group: Advanced Autocannon Ammo (6 of 6)
# Charges from group: Advanced Beam Laser Crystal (6 of 6)
# Charges from group: Advanced Blaster Charge (6 of 6)
# Charges from group: Advanced Pulse Laser Crystal (6 of 6)
# Charges from group: Advanced Railgun Charge (6 of 6)
# Charges from group: Advanced Artillery Ammo (8 of 8)
# Charges from group: Advanced Autocannon Ammo (8 of 8)
# Charges from group: Advanced Beam Laser Crystal (8 of 8)
# Charges from group: Advanced Blaster Charge (8 of 8)
# Charges from group: Advanced Pulse Laser Crystal (8 of 8)
# Charges from group: Advanced Railgun Charge (8 of 8)
# Charges from group: Projectile Ammo (129 of 129)
type = "passive"
def handler(fit, module, context):
module.multiplyItemAttr("trackingSpeed", module.getModifiedChargeAttr("trackingSpeedMultiplier"))
module.multiplyItemAttr("trackingSpeed", module.getModifiedChargeAttr("trackingSpeedMultiplier"))

View File

@@ -4,8 +4,11 @@
# Implants named like: grade Halo (18 of 18)
runTime = "early"
type = "passive"
def handler(fit, implant, context):
fit.implants.filteredItemMultiply(
lambda implant: "signatureRadiusBonus" in implant.itemModifiedAttributes and "implantSetAngel" in implant.itemModifiedAttributes,
fit.appliedImplants.filteredItemMultiply(
lambda
implant: "signatureRadiusBonus" in implant.itemModifiedAttributes and "implantSetAngel" in implant.itemModifiedAttributes,
"signatureRadiusBonus",
implant.getModifiedItemAttr("implantSetAngel"))
implant.getModifiedItemAttr("implantSetAngel"))

View File

@@ -3,5 +3,7 @@
# Used by:
# Modules from group: Warp Core Stabilizer (8 of 8)
type = "passive"
def handler(fit, module, context):
fit.ship.increaseItemAttr("warmScrambleStatus", module.getModifiedItemAttr("warpScrambleStrength"))
fit.ship.increaseItemAttr("warmScrambleStatus", module.getModifiedItemAttr("warpScrambleStrength"))

View File

@@ -6,6 +6,8 @@
# Implant: Poteque 'Prospector' Environmental Analysis EY-1005
# Skill: Archaeology
type = "passive"
def handler(fit, container, context):
level = container.level if "skill" in context else 1
fit.modules.filteredItemIncrease(lambda mod: mod.item.requiresSkill("Archaeology"),

View File

@@ -2,7 +2,11 @@
#
# Used by:
# Implants named like: Exile Booster (4 of 4)
# Implant: Antipharmakon Kosybo
type = "passive"
def handler(fit, booster, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Repair Systems") or mod.item.requiresSkill("Capital Repair Systems"),
"armorDamageAmount", booster.getModifiedItemAttr("armorDamageAmountBonus"))
fit.modules.filteredItemBoost(
lambda mod: mod.item.requiresSkill("Repair Systems") or mod.item.requiresSkill("Capital Repair Systems"),
"armorDamageAmount", booster.getModifiedItemAttr("armorDamageAmountBonus"))

View File

@@ -3,6 +3,8 @@
# 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"),

View File

@@ -0,0 +1,8 @@
# armoredCommandDurationBonus
#
# Used by:
# Skill: Armored Command
type = "passive"
def handler(fit, src, context):
lvl = src.level
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Armored Command"), "buffDuration", src.getModifiedItemAttr("durationBonus") * lvl)

View File

@@ -0,0 +1,13 @@
# armoredCommandMindlink
#
# Used by:
# Implant: Armored Command Mindlink
# Implant: Federation Navy Command Mindlink
# Implant: Imperial Navy Command Mindlink
type = "passive"
def handler(fit, src, context):
fit.modules.filteredChargeBoost(lambda mod: mod.item.requiresSkill("Armored Command"), "warfareBuff2Multiplier", src.getModifiedItemAttr("mindlinkBonus"))
fit.modules.filteredChargeBoost(lambda mod: mod.item.requiresSkill("Armored Command"), "warfareBuff1Multiplier", src.getModifiedItemAttr("mindlinkBonus"))
fit.modules.filteredChargeBoost(lambda mod: mod.item.requiresSkill("Armored Command"), "warfareBuff4Multiplier", src.getModifiedItemAttr("mindlinkBonus"))
fit.modules.filteredChargeBoost(lambda mod: mod.item.requiresSkill("Armored Command"), "warfareBuff3Multiplier", src.getModifiedItemAttr("mindlinkBonus"))
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Armored Command"), "buffDuration", src.getModifiedItemAttr("mindlinkBonus"))

View File

@@ -0,0 +1,11 @@
# armoredCommandStrengthBonus
#
# Used by:
# Skill: Armored Command Specialist
type = "passive"
def handler(fit, src, context):
lvl = src.level
fit.modules.filteredChargeBoost(lambda mod: mod.item.requiresSkill("Armored Command"), "warfareBuff1Multiplier", src.getModifiedItemAttr("commandStrengthBonus") * lvl)
fit.modules.filteredChargeBoost(lambda mod: mod.item.requiresSkill("Armored Command"), "warfareBuff2Multiplier", src.getModifiedItemAttr("commandStrengthBonus") * lvl)
fit.modules.filteredChargeBoost(lambda mod: mod.item.requiresSkill("Armored Command"), "warfareBuff4Multiplier", src.getModifiedItemAttr("commandStrengthBonus") * lvl)
fit.modules.filteredChargeBoost(lambda mod: mod.item.requiresSkill("Armored Command"), "warfareBuff3Multiplier", src.getModifiedItemAttr("commandStrengthBonus") * lvl)

View File

@@ -1,9 +1,11 @@
# armoredSquadronCommand
#
# Used by:
# Skill: Armored Warfare Specialist
# Skill: Armored Command Specialist
runTime = "early"
type = "passive"
def handler(fit, skill, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Armored Warfare Specialist"),
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Armored Command Specialist"),
"commandBonus", skill.getModifiedItemAttr("squadronCommandBonus") * skill.level)

View File

@@ -1,10 +1,12 @@
# armoredWarfareMindlink
#
# Used by:
# Implant: Armored Warfare Mindlink
# Implant: Armored Command Mindlink
# Implant: Federation Navy Warfare Mindlink
# Implant: Imperial Navy Warfare Mindlink
type = "passive"
def handler(fit, implant, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Armored Warfare Specialist"),
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Armored Command Specialist"),
"commandBonus", implant.getModifiedItemAttr("mindlinkBonus"))

View File

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

View File

@@ -3,5 +3,7 @@
# Used by:
# Subsystems from group: Defensive Systems (16 of 16)
type = "passive"
def handler(fit, module, context):
fit.ship.increaseItemAttr("armorHP", module.getModifiedItemAttr("armorHPBonusAdd"))

View File

@@ -5,5 +5,7 @@
# Modules from group: Armor Plating Energized (187 of 187)
# Modules named like: QA Multiship Module Players (4 of 4)
type = "passive"
def handler(fit, module, context):
fit.ship.multiplyItemAttr("armorHP", module.getModifiedItemAttr("armorHPMultiplier"))
fit.ship.multiplyItemAttr("armorHP", module.getModifiedItemAttr("armorHPMultiplier"))

View File

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

View File

@@ -1,10 +1,12 @@
# armorRepair
#
# Used by:
# Modules from group: Armor Repair Unit (100 of 100)
# Modules from group: Armor Repair Unit (105 of 105)
runTime = "late"
type = "active"
def handler(fit, module, context):
amount = module.getModifiedItemAttr("armorDamageAmount")
speed = module.getModifiedItemAttr("duration") / 1000.0
fit.extraAttributes.increase("armorRepair", amount / speed)
fit.extraAttributes.increase("armorRepair", amount / speed)

View File

@@ -0,0 +1,10 @@
# armorRepairAmountBonusSubcap
#
# Used by:
# Implants named like: Grade Asklepian (15 of 16)
type = "passive"
def handler(fit, src, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Repair Systems"),
"armorDamageAmount", src.getModifiedItemAttr("armorRepairBonus"))

View File

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

View File

@@ -1,11 +1,16 @@
# 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",
"maxRange", ship.getModifiedItemAttr("maxRangeBonus"))
def handler(fit, src, context):
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Remote Armor Repairer", "maxRange",
src.getModifiedItemAttr("maxRangeBonus"))
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Ancillary Remote Armor Repairer", "maxRange",
src.getModifiedItemAttr("maxRangeBonus"))

View File

@@ -1,9 +1,11 @@
# armorTankingGang
#
# Used by:
# Skill: Armored Warfare
# Skill: Armored Command
type = "gang"
gangBoost = "armorHP"
gangBonus = "armorHpBonus"
def handler(fit, skill, context):
fit.ship.boostItemAttr(gangBoost, skill.getModifiedItemAttr(gangBonus) * skill.level)

View File

@@ -3,6 +3,8 @@
# Used by:
# Skill: Armor Layering
type = "passive"
def handler(fit, container, context):
level = container.level
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Armor Reinforcer",

View File

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

View File

@@ -6,6 +6,8 @@
# Skill: Astrogeology
# Skill: Mining
type = "passive"
def handler(fit, container, context):
level = container.level if "skill" in context else 1
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Mining"),

View File

@@ -3,7 +3,10 @@
# Used by:
# Variations of module: Scan Pinpointing Array I (2 of 2)
type = "passive"
def handler(fit, module, context):
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Astrometrics"),
"baseMaxScanDeviation", module.getModifiedItemAttr("maxScanDeviationModifierModule"),
"baseMaxScanDeviation",
module.getModifiedItemAttr("maxScanDeviationModifierModule"),
stackingPenalties=True)

View File

@@ -5,7 +5,10 @@
# Skill: Astrometric Pinpointing
# Skill: Astrometrics
type = "passive"
def handler(fit, container, context):
level = container.level if "skill" in context else 1
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Astrometrics"),
"baseMaxScanDeviation", container.getModifiedItemAttr("maxScanDeviationModifier") * level)
"baseMaxScanDeviation",
container.getModifiedItemAttr("maxScanDeviationModifier") * level)

View File

@@ -3,6 +3,8 @@
# Used by:
# Variations of module: Scan Rangefinding Array I (2 of 2)
type = "passive"
def handler(fit, module, context):
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Astrometrics"),
"baseSensorStrength", module.getModifiedItemAttr("scanStrengthBonusModule"),

View File

@@ -8,6 +8,8 @@
# Skill: Astrometric Rangefinding
# Skill: Astrometrics
type = "passive"
def handler(fit, container, context):
level = container.level if "skill" in context else 1
penalized = False if "skill" in context or "implant" in context else True

View File

@@ -4,6 +4,8 @@
# 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

@@ -3,6 +3,8 @@
# 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"))

View File

@@ -4,6 +4,8 @@
# 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"))

View File

@@ -4,6 +4,8 @@
# 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

@@ -3,6 +3,8 @@
# 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"))

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