Compare commits
874 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
be579cfaeb | ||
|
|
d40a7c2efa | ||
|
|
8ba05409e0 | ||
|
|
2b817c5d22 | ||
|
|
ba445e7d4f | ||
|
|
b836ceb216 | ||
|
|
dfa0373497 | ||
|
|
caefd4fbbb | ||
|
|
b7528d11b2 | ||
|
|
07d333d3d5 | ||
|
|
48ac6cb2af | ||
|
|
87a246204b | ||
|
|
3ef056225b | ||
|
|
4fa63aa2bd | ||
|
|
1edaf021da | ||
|
|
37b44befac | ||
|
|
efd58a80a4 | ||
|
|
e43cce20a6 | ||
|
|
0c7601b6d3 | ||
|
|
4cfcfedc14 | ||
|
|
0024bc5514 | ||
|
|
aacb95df7c | ||
|
|
854d60792e | ||
|
|
d922bf8913 | ||
|
|
703dc93dee | ||
|
|
7fd545aad4 | ||
|
|
a69730085f | ||
|
|
1603201166 | ||
|
|
8380f516e8 | ||
|
|
1b7c23b1d3 | ||
|
|
6291fe1626 | ||
|
|
cdaf5cc168 | ||
|
|
5940625e24 | ||
|
|
549353dba1 | ||
|
|
4dc281b37e | ||
|
|
0242cc845c | ||
|
|
e9c6d98db8 | ||
|
|
86459faf76 | ||
|
|
e8af636831 | ||
|
|
eea7220e3d | ||
|
|
cc56611783 | ||
|
|
0b511af48a | ||
|
|
25bbf3dc03 | ||
|
|
72a602b5b0 | ||
|
|
d107156341 | ||
|
|
8063647bba | ||
|
|
573d8e068c | ||
|
|
f6c6f9a0c9 | ||
|
|
d9c5c9cc0e | ||
|
|
bb7fb022ef | ||
|
|
52c9f4076b | ||
|
|
894231b009 | ||
|
|
34fe530ac7 | ||
|
|
33b91a79ab | ||
|
|
51180a9375 | ||
|
|
6e44963d57 | ||
|
|
8114765236 | ||
|
|
7ddd3a35d1 | ||
|
|
52a68adb11 | ||
|
|
566e7fd046 | ||
|
|
a74cdc59bd | ||
|
|
3c98aad4ba | ||
|
|
0063840cfa | ||
|
|
96077ed115 | ||
|
|
19f02ef914 | ||
|
|
de9ce47bed | ||
|
|
ccd3665115 | ||
|
|
1a992a90ad | ||
|
|
fff07078dc | ||
|
|
81d040fba6 | ||
|
|
a35f04cd9a | ||
|
|
c6c364c451 | ||
|
|
8dcc3f2b51 | ||
|
|
42383cef03 | ||
|
|
579081393b | ||
|
|
2290281024 | ||
|
|
712c49d129 | ||
|
|
ac16b19d93 | ||
|
|
51b3cff4a9 | ||
|
|
768b0b3a3a | ||
|
|
538271d737 | ||
|
|
61da8be732 | ||
|
|
90e275e386 | ||
|
|
8e98af8517 | ||
|
|
9a16c579eb | ||
|
|
8b864692fb | ||
|
|
eaddc942a0 | ||
|
|
82c5ae1fe9 | ||
|
|
5c2df66335 | ||
|
|
afa8c3c53a | ||
|
|
bd33efa875 | ||
|
|
f53c8e9efc | ||
|
|
d2b306d030 | ||
|
|
f58c8ec4f9 | ||
|
|
dd9390384e | ||
|
|
22fc6cb13c | ||
|
|
aaec82e493 | ||
|
|
6333a0c74b | ||
|
|
41711706c0 | ||
|
|
e6309bb8bb | ||
|
|
909c9f7b71 | ||
|
|
becf7c3ff2 | ||
|
|
257df58c3a | ||
|
|
23d945c7f2 | ||
|
|
e3971c995e | ||
|
|
8641c41da6 | ||
|
|
b7f53e8402 | ||
|
|
1ef517d87e | ||
|
|
c3e03f2136 | ||
|
|
4d31c2a2a3 | ||
|
|
b03860e765 | ||
|
|
2e49aa1419 | ||
|
|
647c093451 | ||
|
|
d96146034a | ||
|
|
b944f27fc8 | ||
|
|
df80449b0b | ||
|
|
986ae16eaf | ||
|
|
f81cc4ad93 | ||
|
|
c9b0322c9f | ||
|
|
114d72e23f | ||
|
|
f8e6474b39 | ||
|
|
8d0c2c18d2 | ||
|
|
dddec72f13 | ||
|
|
9cfbaf3450 | ||
|
|
9fc16cb287 | ||
|
|
78836add28 | ||
|
|
f919e23360 | ||
|
|
ec3822a6da | ||
|
|
9bdb4ea967 | ||
|
|
af17a4f1c9 | ||
|
|
2ea3394845 | ||
|
|
65dff8dcf7 | ||
|
|
bfaad631bc | ||
|
|
96a5bf7ea9 | ||
|
|
e665161dc8 | ||
|
|
18e03e46c3 | ||
|
|
d9941945e0 | ||
|
|
75d5b48df8 | ||
|
|
8c8e7825e9 | ||
|
|
af3a7553ed | ||
|
|
f68ee81634 | ||
|
|
4385b3651f | ||
|
|
ed24e7a2a3 | ||
|
|
b9e68504ed | ||
|
|
1fcd95d36f | ||
|
|
4dc70dad3b | ||
|
|
e0a54c14e2 | ||
|
|
839d025885 | ||
|
|
8d183a859d | ||
|
|
09bc1eb9d2 | ||
|
|
c6f2072bb9 | ||
|
|
7d42f8dba6 | ||
|
|
8b86f14ee2 | ||
|
|
ef7195a7cc | ||
|
|
43e88fa78d | ||
|
|
5d0900337f | ||
|
|
a5a9dc0877 | ||
|
|
e36b9661f0 | ||
|
|
c66f80d6e5 | ||
|
|
0dfe6707a7 | ||
|
|
f9eef5ee07 | ||
|
|
dc3b5c916b | ||
|
|
0471cda64e | ||
|
|
b2bcdf0a46 | ||
|
|
cf9d2082ef | ||
|
|
032b1589ad | ||
|
|
410c87ed89 | ||
|
|
b377c1c25f | ||
|
|
fbce3536da | ||
|
|
7ac24ff7ee | ||
|
|
7aba11142f | ||
|
|
704042b4b7 | ||
|
|
21dd9bb6e4 | ||
|
|
509849fbf5 | ||
|
|
55f2ebf4a4 | ||
|
|
e96a836ad0 | ||
|
|
2a224e8882 | ||
|
|
0a00d86c6d | ||
|
|
c3d1eaef2a | ||
|
|
93f23b549b | ||
|
|
b3d0554df6 | ||
|
|
dba54e3ec8 | ||
|
|
2b16a8ed76 | ||
|
|
4cbafb5559 | ||
|
|
d02623e365 | ||
|
|
c8eef489da | ||
|
|
d507927ba3 | ||
|
|
09421db28e | ||
|
|
941edd6715 | ||
|
|
fdac5309ac | ||
|
|
449c7d6aa2 | ||
|
|
b60b190b81 | ||
|
|
3cb8313669 | ||
|
|
ba29376464 | ||
|
|
436113dedc | ||
|
|
9dc0ec67d4 | ||
|
|
194ebb96a7 | ||
|
|
fc04a32913 | ||
|
|
deee6fd6ab | ||
|
|
a4fae73a1e | ||
|
|
7bad3bc376 | ||
|
|
7dd1c63898 | ||
|
|
c8eea45454 | ||
|
|
3ed949395e | ||
|
|
6ebc90b8aa | ||
|
|
7769179104 | ||
|
|
cbd1a34c68 | ||
|
|
e0c389a643 | ||
|
|
6a27ae7525 | ||
|
|
591dcffa43 | ||
|
|
b0317ea560 | ||
|
|
9eea99f600 | ||
|
|
d55d6c3e5e | ||
|
|
eeef2104c2 | ||
|
|
2098ff6da1 | ||
|
|
fb5d62304c | ||
|
|
8baac1e207 | ||
|
|
4324b846e0 | ||
|
|
143606d8f8 | ||
|
|
dfc0a896c4 | ||
|
|
980c84b911 | ||
|
|
41b6000f6e | ||
|
|
28fc845250 | ||
|
|
193faaafe7 | ||
|
|
ce9db79552 | ||
|
|
672fd77bec | ||
|
|
89656b04ad | ||
|
|
0997a54324 | ||
|
|
59569d46ae | ||
|
|
3bc1ce195c | ||
|
|
98e6781077 | ||
|
|
f2deb0e6c7 | ||
|
|
a5efea56ab | ||
|
|
1fe35f5aab | ||
|
|
07b8f5b914 | ||
|
|
1f50e7cb51 | ||
|
|
572d337935 | ||
|
|
01f8c65304 | ||
|
|
a1ee8b49ef | ||
|
|
0745ed50e0 | ||
|
|
76e66a99ff | ||
|
|
3259cc3e50 | ||
|
|
5f237e578b | ||
|
|
c645c089dd | ||
|
|
436bee1e85 | ||
|
|
dc5bd7f627 | ||
|
|
d6825fb8b7 | ||
|
|
b9ec89e9c8 | ||
|
|
cc63e62154 | ||
|
|
cc134c36e2 | ||
|
|
17313bd67b | ||
|
|
b831dfbc7f | ||
|
|
b739b791d4 | ||
|
|
0480673460 | ||
|
|
7ffced2151 | ||
|
|
3297ef8975 | ||
|
|
acba971e70 | ||
|
|
dd8169adb4 | ||
|
|
857a625ae2 | ||
|
|
ac3a7386aa | ||
|
|
3eed5bfc64 | ||
|
|
d0992ed56f | ||
|
|
af37ec21e9 | ||
|
|
51ef3ec758 | ||
|
|
f66da9870e | ||
|
|
ca46984a6b | ||
|
|
fe063cf19a | ||
|
|
3bdb12cc5d | ||
|
|
6819dc87a6 | ||
|
|
2ba6c4bc08 | ||
|
|
bb548b796a | ||
|
|
6f8fca7525 | ||
|
|
ff8ea205db | ||
|
|
453536cf14 | ||
|
|
080d94e299 | ||
|
|
ae23fba6b7 | ||
|
|
b8f53f9bb3 | ||
|
|
e143a79b06 | ||
|
|
fa7c93d99a | ||
|
|
f48ce43c0c | ||
|
|
ba12d97c1d | ||
|
|
03e8b8522b | ||
|
|
7a8baac5bd | ||
|
|
58ceff6144 | ||
|
|
7bc82e229f | ||
|
|
74ebd3415c | ||
|
|
de752cbe0a | ||
|
|
25c5abffee | ||
|
|
ec1a2035cd | ||
|
|
b3fbc080db | ||
|
|
f289a72121 | ||
|
|
e6b2d15468 | ||
|
|
e76dc2e92b | ||
|
|
10572c7dbd | ||
|
|
e83e081548 | ||
|
|
85a834d1a3 | ||
|
|
46c95d722c | ||
|
|
70831bb5e4 | ||
|
|
12227cd016 | ||
|
|
2749426a7c | ||
|
|
0a23c3cabb | ||
|
|
5a0670838d | ||
|
|
2dfdead656 | ||
|
|
5fdae11bb1 | ||
|
|
c991562662 | ||
|
|
b4eb6e7fc3 | ||
|
|
d4e8ac761e | ||
|
|
30ff2e0dae | ||
|
|
4f0f8fcdfc | ||
|
|
a1c3d26b73 | ||
|
|
aa3043b0ca | ||
|
|
2d9dcc624c | ||
|
|
aa80a4812d | ||
|
|
5b03d01d32 | ||
|
|
3228c7f74d | ||
|
|
5b60abf4b6 | ||
|
|
47a97772cf | ||
|
|
f4123310ae | ||
|
|
f05439989d | ||
|
|
1df7c0aff8 | ||
|
|
29fde786fb | ||
|
|
4833fc68a0 | ||
|
|
3f0fc3c44b | ||
|
|
375e8de33f | ||
|
|
9d04f06f69 | ||
|
|
0297ec47f6 | ||
|
|
75e1e48ba8 | ||
|
|
89ff9a3d77 | ||
|
|
6fa1593ddc | ||
|
|
d404d10bfe | ||
|
|
194c159379 | ||
|
|
791b6e15d4 | ||
|
|
882e39417d | ||
|
|
8b6d32fe3b | ||
|
|
715f9427d5 | ||
|
|
78b281cf3a | ||
|
|
bbede00cc4 | ||
|
|
e6da57ab57 | ||
|
|
9e08783802 | ||
|
|
1dc98ce33d | ||
|
|
c97750a593 | ||
|
|
aa7e3bd69d | ||
|
|
5a6b9114e2 | ||
|
|
61abcf3018 | ||
|
|
4845b3b0ce | ||
|
|
8f0e8f72cd | ||
|
|
96269a7777 | ||
|
|
bdcc05b7b6 | ||
|
|
060b512bcf | ||
|
|
3907c8c29a | ||
|
|
c786012b28 | ||
|
|
37a084e1d1 | ||
|
|
b9c3675894 | ||
|
|
60ecc95049 | ||
|
|
59d9d47a56 | ||
|
|
c619efa68e | ||
|
|
05e895e7b7 | ||
|
|
58daf2a543 | ||
|
|
0294684bb8 | ||
|
|
fa9b3be41c | ||
|
|
74bf3fbc8b | ||
|
|
dc2a4d4446 | ||
|
|
b0895611d6 | ||
|
|
f664a1cad3 | ||
|
|
19de7e40dc | ||
|
|
de2ee1dce6 | ||
|
|
90698dde90 | ||
|
|
0ab6d6e845 | ||
|
|
74d87845cf | ||
|
|
9e2b15776f | ||
|
|
c8ade0741c | ||
|
|
af8b444ab5 | ||
|
|
2ba26f01b2 | ||
|
|
e77bb11d0a | ||
|
|
c14b56f37d | ||
|
|
e6fe8de5ed | ||
|
|
cf27c2be10 | ||
|
|
f39ba27a13 | ||
|
|
78ff74f0f7 | ||
|
|
29a2a08986 | ||
|
|
881b92a6ea | ||
|
|
50c22c836b | ||
|
|
63115a7c0f | ||
|
|
fd43f33871 | ||
|
|
36bf4ef9ca | ||
|
|
63f9847406 | ||
|
|
46f5a592ce | ||
|
|
f854627888 | ||
|
|
5ec8468d3f | ||
|
|
0da4e4359b | ||
|
|
c5e8742838 | ||
|
|
f9f90852c5 | ||
|
|
6b5f2450ad | ||
|
|
4f2e962a46 | ||
|
|
05ce8fbf1c | ||
|
|
929b2dfb38 | ||
|
|
659e0e5ead | ||
|
|
7bb44f6473 | ||
|
|
60f024fdb7 | ||
|
|
38f1314c05 | ||
|
|
46ece5da0c | ||
|
|
d21ccef269 | ||
|
|
da601c9a63 | ||
|
|
7464de06b1 | ||
|
|
d788abcab2 | ||
|
|
d2b601dd8f | ||
|
|
20fbda9e7a | ||
|
|
15bbf69fcf | ||
|
|
677a9b33c5 | ||
|
|
e9efdcd4e8 | ||
|
|
c3b0b7d1e1 | ||
|
|
d46a2d61bb | ||
|
|
673a2e25e3 | ||
|
|
749adb9ec8 | ||
|
|
5cab8b1070 | ||
|
|
00637f84cb | ||
|
|
bc5a43bfb3 | ||
|
|
723ef5c48d | ||
|
|
53c1a77aeb | ||
|
|
e5389d44d9 | ||
|
|
c27032ef64 | ||
|
|
54b2e5b5fb | ||
|
|
1276016a98 | ||
|
|
7374b00883 | ||
|
|
c54d0dc5ff | ||
|
|
fc0bfd83b2 | ||
|
|
42620c842e | ||
|
|
fd3b3f98bf | ||
|
|
fd7c5c1580 | ||
|
|
c0922adfb2 | ||
|
|
1454cd8a0d | ||
|
|
3e249ec155 | ||
|
|
edfbf71958 | ||
|
|
4876ff7035 | ||
|
|
d5034c9e0d | ||
|
|
9ec54c9004 | ||
|
|
0749e03211 | ||
|
|
e03adad23a | ||
|
|
9b3ba8c9aa | ||
|
|
85746cd681 | ||
|
|
2e64280403 | ||
|
|
d7b81ea87d | ||
|
|
f4404e2649 | ||
|
|
f598e8e3c2 | ||
|
|
27488a0260 | ||
|
|
c53e7964bf | ||
|
|
3516d6fdc5 | ||
|
|
69af1440ae | ||
|
|
31c3101d6d | ||
|
|
5850026aa9 | ||
|
|
b4b8a158f5 | ||
|
|
5c6303995d | ||
|
|
f0353a7dd7 | ||
|
|
1fb19e3b94 | ||
|
|
1788b32b83 | ||
|
|
621672bf34 | ||
|
|
b08406b7d6 | ||
|
|
6211d1de70 | ||
|
|
916b11deb8 | ||
|
|
8e41a90f57 | ||
|
|
9aa2b17ae6 | ||
|
|
7f02a078fd | ||
|
|
07b6c9c437 | ||
|
|
7c7650ac07 | ||
|
|
4e399f9bbb | ||
|
|
12b11d57ba | ||
|
|
bea7102a3f | ||
|
|
b77a577c06 | ||
|
|
c5aab07d65 | ||
|
|
362ae72183 | ||
|
|
6f5d0453a6 | ||
|
|
c552f6a1d4 | ||
|
|
99a8b03697 | ||
|
|
9d63946aa7 | ||
|
|
6eba2b1abd | ||
|
|
b05f1573c6 | ||
|
|
f4311d1cef | ||
|
|
8abad416bd | ||
|
|
52dbd8d9ef | ||
|
|
4e5a70993e | ||
|
|
dd0fbfddb9 | ||
|
|
02e35181d5 | ||
|
|
302cab54fd | ||
|
|
ba157af496 | ||
|
|
d1e6647d1f | ||
|
|
0a47fba107 | ||
|
|
3faa57f39a | ||
|
|
75333264a7 | ||
|
|
e7d846063d | ||
|
|
c2b7cc00dd | ||
|
|
a107171543 | ||
|
|
79be16114d | ||
|
|
c530660132 | ||
|
|
ebe0efac81 | ||
|
|
18ee37d8fd | ||
|
|
f2c2e2e65a | ||
|
|
93f1a18b37 | ||
|
|
44aed364b7 | ||
|
|
eb8fa2f259 | ||
|
|
a8c69abc72 | ||
|
|
2dd1ddddd5 | ||
|
|
4a27c60486 | ||
|
|
66d559306f | ||
|
|
83222489c4 | ||
|
|
0a2fa62e21 | ||
|
|
6240f23c02 | ||
|
|
13498e9b35 | ||
|
|
ca30025be0 | ||
|
|
97ef231711 | ||
|
|
82d8c95d2f | ||
|
|
dde5ee3701 | ||
|
|
44a3cb3b2e | ||
|
|
44c58abe81 | ||
|
|
7055690805 | ||
|
|
116dde3f3f | ||
|
|
daef1ebdfd | ||
|
|
5c38ab4228 | ||
|
|
299243c446 | ||
|
|
970c3a5473 | ||
|
|
bc63eaa876 | ||
|
|
78de723b81 | ||
|
|
dbb9823df5 | ||
|
|
95899548e5 | ||
|
|
2a076292da | ||
|
|
308fa3c46c | ||
|
|
ccd6d357ed | ||
|
|
21b6a2cdfd | ||
|
|
ccbd0a117b | ||
|
|
6caa79c951 | ||
|
|
4365da8292 | ||
|
|
ff222b8d62 | ||
|
|
180b766b59 | ||
|
|
b4e765abfa | ||
|
|
2f40365a03 | ||
|
|
2001a395e5 | ||
|
|
7e94914f65 | ||
|
|
b17314f3c6 | ||
|
|
fd83a4b709 | ||
|
|
a37fdf48c8 | ||
|
|
5ee8e203db | ||
|
|
083b34c780 | ||
|
|
6c12e1c5fc | ||
|
|
bcbed3df39 | ||
|
|
083b618b71 | ||
|
|
3d4b41d135 | ||
|
|
eeb2b019c0 | ||
|
|
71257b5265 | ||
|
|
a5a152d395 | ||
|
|
f0983c1468 | ||
|
|
513e9d14d8 | ||
|
|
efbf2e7432 | ||
|
|
646a903f18 | ||
|
|
d74f2b2e42 | ||
|
|
9977866eb0 | ||
|
|
008d73e605 | ||
|
|
2164588329 | ||
|
|
391c3a32a6 | ||
|
|
bd975becf1 | ||
|
|
d6b280d3cc | ||
|
|
56ebb2926d | ||
|
|
804d90c50c | ||
|
|
326e1e04c2 | ||
|
|
0f4f8c636d | ||
|
|
425c7f657c | ||
|
|
3c7f0258df | ||
|
|
7a1b4b4a1e | ||
|
|
fcc53d3f21 | ||
|
|
15ba5c8ace | ||
|
|
6057a1a7d9 | ||
|
|
e0add506c9 | ||
|
|
aa282990a5 | ||
|
|
1686220523 | ||
|
|
c84c79c917 | ||
|
|
36b158637c | ||
|
|
fc153915b6 | ||
|
|
098f0f92ee | ||
|
|
cfb7a70da5 | ||
|
|
984978a80d | ||
|
|
dd430bc9bb | ||
|
|
b724e5bec1 | ||
|
|
1f09494df5 | ||
|
|
d9827b445f | ||
|
|
46e58ecba7 | ||
|
|
c1405fa675 | ||
|
|
b7900b0b25 | ||
|
|
bef8fbbc3a | ||
|
|
4fc630d44e | ||
|
|
582a3893d1 | ||
|
|
03e325cdcb | ||
|
|
7f8ad3885d | ||
|
|
0d32b60f7e | ||
|
|
53f6d43109 | ||
|
|
dd6fe01df5 | ||
|
|
1f9024a740 | ||
|
|
65c568bd95 | ||
|
|
9ccdb51063 | ||
|
|
d5aeb0913d | ||
|
|
38726675e1 | ||
|
|
622a3004c5 | ||
|
|
2ccad2a358 | ||
|
|
a66eb059e2 | ||
|
|
5d0342ee2d | ||
|
|
ec3cd75f4c | ||
|
|
9309ddff07 | ||
|
|
0c3fa53bcf | ||
|
|
926e0a9035 | ||
|
|
fe0266e517 | ||
|
|
0a8bb79e47 | ||
|
|
e9cb7696dd | ||
|
|
c054a2d80d | ||
|
|
2f7a3e0287 | ||
|
|
6be77646fc | ||
|
|
a6a0831123 | ||
|
|
682607c31f | ||
|
|
c0096fc016 | ||
|
|
ebac100e38 | ||
|
|
fe43c2ee2e | ||
|
|
b1f1db1bee | ||
|
|
df75646766 | ||
|
|
6270d34dfd | ||
|
|
497fdd7a11 | ||
|
|
6583aa9b34 | ||
|
|
910fe99e44 | ||
|
|
4be78db738 | ||
|
|
897763e8d5 | ||
|
|
fc921d2c16 | ||
|
|
b57bede510 | ||
|
|
d4f719a428 | ||
|
|
6f8ff9255a | ||
|
|
79d4b458c8 | ||
|
|
c7d9c0e0e0 | ||
|
|
b7be0d0dfb | ||
|
|
475e8f1ff2 | ||
|
|
9298dcd454 | ||
|
|
3b13712db1 | ||
|
|
df92b857c9 | ||
|
|
d5aee34aa8 | ||
|
|
7a4c7a8f9f | ||
|
|
1699b8ceee | ||
|
|
f624528ce5 | ||
|
|
c0e9878982 | ||
|
|
7a078f433a | ||
|
|
89efa9cbf9 | ||
|
|
786864b146 | ||
|
|
8383a645da | ||
|
|
1c579c9134 | ||
|
|
b8c09429db | ||
|
|
090b61778f | ||
|
|
29541bc5d9 | ||
|
|
3fcad7ed3f | ||
|
|
fe951e2ca1 | ||
|
|
0603e0c89d | ||
|
|
da5893ac91 | ||
|
|
7af5c17015 | ||
|
|
9f580597fd | ||
|
|
819c0ba321 | ||
|
|
b68e7d9344 | ||
|
|
86333a05fb | ||
|
|
39f7ecdf5c | ||
|
|
6c184e9184 | ||
|
|
c587fa1e84 | ||
|
|
1b932fd885 | ||
|
|
99f14746e4 | ||
|
|
6c6423515c | ||
|
|
15216453c9 | ||
|
|
8f16fc5c1e | ||
|
|
444f42ceee | ||
|
|
8bf9a9881f | ||
|
|
8f5060cc3e | ||
|
|
b7458396ac | ||
|
|
d4dba99363 | ||
|
|
710739696a | ||
|
|
5c566bae73 | ||
|
|
4e8e5d86c4 | ||
|
|
7e6fc4e6c2 | ||
|
|
6bbfb18680 | ||
|
|
d61ab0ff5a | ||
|
|
47016c682e | ||
|
|
eece7de547 | ||
|
|
ed94294584 | ||
|
|
634bdab396 | ||
|
|
3462252ecc | ||
|
|
5a085b6e27 | ||
|
|
12c491a6b3 | ||
|
|
4d8240a588 | ||
|
|
154b07e0d6 | ||
|
|
59a5b68152 | ||
|
|
f0a6034cec | ||
|
|
6224286524 | ||
|
|
eefc84465f | ||
|
|
4fd54ca74a | ||
|
|
779b9f0821 | ||
|
|
3ae10fe483 | ||
|
|
88be999899 | ||
|
|
6fdcce12a3 | ||
|
|
e19d231eba | ||
|
|
d4d55c026a | ||
|
|
3ebfe045c5 | ||
|
|
75230a78a6 | ||
|
|
ab6200e2c1 | ||
|
|
8a18047957 | ||
|
|
fccd4b61f4 | ||
|
|
bceaa0d1d5 | ||
|
|
994521f654 | ||
|
|
b7b60e4ea6 | ||
|
|
6a03ff59af | ||
|
|
f8b5adb31d | ||
|
|
e8b56b076b | ||
|
|
fe47ebd1f5 | ||
|
|
3b310e9b61 | ||
|
|
07737a1f6d | ||
|
|
962789bf63 | ||
|
|
ab2d6dbf3a | ||
|
|
542f2b3061 | ||
|
|
abefe21796 | ||
|
|
cc529d3499 | ||
|
|
aee225d11a | ||
|
|
0b45438981 | ||
|
|
d48f9354ec | ||
|
|
58b422a6d9 | ||
|
|
b1dce3b7b6 | ||
|
|
460ba81d44 | ||
|
|
e01699f738 | ||
|
|
c9f555a860 | ||
|
|
b3acc8fd21 | ||
|
|
3670f3289c | ||
|
|
04171b243b | ||
|
|
20f57146c4 | ||
|
|
012c5f536b | ||
|
|
3fbd869821 | ||
|
|
19cf3c2036 | ||
|
|
18bbe49c49 | ||
|
|
e806471b47 | ||
|
|
59d56fc333 | ||
|
|
926299c20e | ||
|
|
e8d5e9f9f2 | ||
|
|
a5b5cec919 | ||
|
|
bb978c3dff | ||
|
|
cbb8545c30 | ||
|
|
87660246b6 | ||
|
|
cc586f6532 | ||
|
|
02103b6d2e | ||
|
|
94b1876cf1 | ||
|
|
8bb3cbb25e | ||
|
|
5388ba7a70 | ||
|
|
ff1d8109cd | ||
|
|
408e1246c7 | ||
|
|
051e601f14 | ||
|
|
fb5849e43e | ||
|
|
367b26816b | ||
|
|
e3bec84d31 | ||
|
|
d92ccffc8d | ||
|
|
e8efa22a95 | ||
|
|
861d034635 | ||
|
|
7a18224800 | ||
|
|
92a906611b | ||
|
|
6fc532a6a2 | ||
|
|
d0777602e7 | ||
|
|
618507f88c | ||
|
|
c5bc9e2534 | ||
|
|
b097818f1b | ||
|
|
ba2471e75c | ||
|
|
de7a5361fd | ||
|
|
0827e13b31 | ||
|
|
ec2bf8d4ed | ||
|
|
8ab709e590 | ||
|
|
efe974f8f9 | ||
|
|
da85c66089 | ||
|
|
a02f863bc8 | ||
|
|
553a181966 | ||
|
|
4a1e4853fb | ||
|
|
9f560584ce | ||
|
|
670f19ce95 | ||
|
|
3944545721 | ||
|
|
a706da8adc | ||
|
|
829fd12163 | ||
|
|
f8504cfa6e | ||
|
|
05e76a884a | ||
|
|
b5addc8a87 | ||
|
|
8cb592db6f | ||
|
|
be21fec2d2 | ||
|
|
154ac6b045 | ||
|
|
d3bd52fe07 | ||
|
|
d4beba8b7b | ||
|
|
4141a9df45 | ||
|
|
b6181f8ad6 | ||
|
|
fabf759aa7 | ||
|
|
c0f34f1117 | ||
|
|
5cf9e0c4ff | ||
|
|
33d4a8a691 | ||
|
|
9268dc36bf | ||
|
|
e95cbdd19b | ||
|
|
c4177f8911 | ||
|
|
eaae51f8d8 | ||
|
|
9f69c76380 | ||
|
|
2f9d2e2a60 | ||
|
|
f9e60a00f2 | ||
|
|
fde449c7d8 | ||
|
|
6b346c4b37 | ||
|
|
aeb1a80e73 | ||
|
|
1c359fb6ed | ||
|
|
a8c57bbdeb | ||
|
|
752c67bc0b | ||
|
|
e7c826b71c | ||
|
|
2cac214f46 | ||
|
|
c1f24a1979 | ||
|
|
63e5b6da68 | ||
|
|
23d9e7a91b | ||
|
|
7ac4b52d20 | ||
|
|
d110dd4c76 | ||
|
|
a5b959fbf8 | ||
|
|
90f1947ea7 | ||
|
|
afd16e1afd | ||
|
|
bc23417eae | ||
|
|
2a410a13a0 | ||
|
|
d84525876a | ||
|
|
d5afacef3f | ||
|
|
891c20eea7 | ||
|
|
020cc9e295 | ||
|
|
e423c9248a | ||
|
|
b138fea245 | ||
|
|
cb509a832e | ||
|
|
155a3a4e42 | ||
|
|
a59949a57a | ||
|
|
4ba33aa5b8 | ||
|
|
6dbb61dc12 | ||
|
|
f1d3b68308 | ||
|
|
cec61fc225 | ||
|
|
caf31517ca | ||
|
|
22edebbf9b | ||
|
|
806f17f6ea | ||
|
|
5aa14de0c4 | ||
|
|
77a5896997 | ||
|
|
cc754342c8 | ||
|
|
63074a2b85 | ||
|
|
bec746b76f | ||
|
|
eeb700c75d | ||
|
|
deecfb31dc | ||
|
|
9bb83d4574 | ||
|
|
8023b2ea29 | ||
|
|
3e1244a27a | ||
|
|
51e610830f | ||
|
|
f52d091f9a | ||
|
|
a2877f6b5f | ||
|
|
acf6b3dffd | ||
|
|
b6a1c4b308 | ||
|
|
e29ab817af | ||
|
|
86576581cd | ||
|
|
50bd46015b | ||
|
|
aa2ffaf1ea | ||
|
|
5cc6b6c69c | ||
|
|
0365f71c00 | ||
|
|
4d666907c9 | ||
|
|
0466678176 | ||
|
|
df24313bcf | ||
|
|
56a3911b96 | ||
|
|
a1c894bb22 | ||
|
|
32c6dcdb79 | ||
|
|
842be9535b | ||
|
|
7b6cb25ac4 | ||
|
|
94e1515b43 | ||
|
|
dba86edff2 | ||
|
|
e2d8a3a4e8 | ||
|
|
090065ddd4 | ||
|
|
acade56769 | ||
|
|
1fc4eab1ce | ||
|
|
e1e4efde7a | ||
|
|
cf5769e0f8 | ||
|
|
a8b1f38e84 | ||
|
|
49b1e2ee36 | ||
|
|
aec9202be1 | ||
|
|
ed3083aa77 | ||
|
|
4b2a58ca6f | ||
|
|
0de950862b |
145
.appveyor.yml
145
.appveyor.yml
@@ -1,5 +1,4 @@
|
|||||||
environment:
|
environment:
|
||||||
|
|
||||||
global:
|
global:
|
||||||
# SDK v7.0 MSVC Express 2008's SetEnv.cmd script will fail if the
|
# SDK v7.0 MSVC Express 2008's SetEnv.cmd script will fail if the
|
||||||
# /E:ON and /V:ON options are not enabled in the batch script intepreter
|
# /E:ON and /V:ON options are not enabled in the batch script intepreter
|
||||||
@@ -8,76 +7,11 @@ environment:
|
|||||||
|
|
||||||
matrix:
|
matrix:
|
||||||
|
|
||||||
# Python 2.7.10 is the latest version and is not pre-installed.
|
- PYTHON: "C:\\Python36"
|
||||||
|
PYTHON_VERSION: "3.6.x"
|
||||||
- PYTHON: "C:\\Python27.10"
|
|
||||||
PYTHON_VERSION: "2.7.10"
|
|
||||||
PYTHON_ARCH: "32"
|
PYTHON_ARCH: "32"
|
||||||
|
init:
|
||||||
#- PYTHON: "C:\\Python27.10-x64"
|
- ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
|
||||||
# PYTHON_VERSION: "2.7.10"
|
|
||||||
# PYTHON_ARCH: "64"
|
|
||||||
|
|
||||||
# Pre-installed Python versions, which Appveyor may upgrade to
|
|
||||||
# a later point release.
|
|
||||||
# See: http://www.appveyor.com/docs/installed-software#python
|
|
||||||
|
|
||||||
#- PYTHON: "C:\\Python27"
|
|
||||||
# PYTHON_VERSION: "2.7.x" # currently 2.7.9
|
|
||||||
# PYTHON_ARCH: "32"
|
|
||||||
|
|
||||||
#- PYTHON: "C:\\Python27-x64"
|
|
||||||
# PYTHON_VERSION: "2.7.x" # currently 2.7.9
|
|
||||||
# PYTHON_ARCH: "64"
|
|
||||||
|
|
||||||
#- PYTHON: "C:\\Python33"
|
|
||||||
# PYTHON_VERSION: "3.3.x" # currently 3.3.5
|
|
||||||
# PYTHON_ARCH: "32"
|
|
||||||
|
|
||||||
#- PYTHON: "C:\\Python33-x64"
|
|
||||||
# PYTHON_VERSION: "3.3.x" # currently 3.3.5
|
|
||||||
# PYTHON_ARCH: "64"
|
|
||||||
|
|
||||||
#- PYTHON: "C:\\Python34"
|
|
||||||
# PYTHON_VERSION: "3.4.x" # currently 3.4.3
|
|
||||||
# PYTHON_ARCH: "32"
|
|
||||||
|
|
||||||
#- PYTHON: "C:\\Python34-x64"
|
|
||||||
# PYTHON_VERSION: "3.4.x" # currently 3.4.3
|
|
||||||
# PYTHON_ARCH: "64"
|
|
||||||
|
|
||||||
# Python versions not pre-installed
|
|
||||||
|
|
||||||
# Python 2.6.6 is the latest Python 2.6 with a Windows installer
|
|
||||||
# See: https://github.com/ogrisel/python-appveyor-demo/issues/10
|
|
||||||
|
|
||||||
#- PYTHON: "C:\\Python266"
|
|
||||||
# PYTHON_VERSION: "2.6.6"
|
|
||||||
# PYTHON_ARCH: "32"
|
|
||||||
|
|
||||||
#- PYTHON: "C:\\Python266-x64"
|
|
||||||
# PYTHON_VERSION: "2.6.6"
|
|
||||||
# PYTHON_ARCH: "64"
|
|
||||||
|
|
||||||
#- PYTHON: "C:\\Python35"
|
|
||||||
# PYTHON_VERSION: "3.5.0"
|
|
||||||
# PYTHON_ARCH: "32"
|
|
||||||
|
|
||||||
#- PYTHON: "C:\\Python35-x64"
|
|
||||||
# PYTHON_VERSION: "3.5.0"
|
|
||||||
# PYTHON_ARCH: "64"
|
|
||||||
|
|
||||||
# Major and minor releases (i.e x.0.0 and x.y.0) prior to 3.3.0 use
|
|
||||||
# a different naming scheme.
|
|
||||||
|
|
||||||
#- PYTHON: "C:\\Python270"
|
|
||||||
# PYTHON_VERSION: "2.7.0"
|
|
||||||
# PYTHON_ARCH: "32"
|
|
||||||
|
|
||||||
#- PYTHON: "C:\\Python270-x64"
|
|
||||||
# PYTHON_VERSION: "2.7.0"
|
|
||||||
# PYTHON_ARCH: "64"
|
|
||||||
|
|
||||||
install:
|
install:
|
||||||
# If there is a newer build queued for the same PR, cancel this one.
|
# If there is a newer build queued for the same PR, cancel this one.
|
||||||
# The AppVeyor 'rollout builds' option is supposed to serve the same
|
# The AppVeyor 'rollout builds' option is supposed to serve the same
|
||||||
@@ -89,34 +23,23 @@ install:
|
|||||||
Where-Object pullRequestId -eq $env:APPVEYOR_PULL_REQUEST_NUMBER)[0].buildNumber) { `
|
Where-Object pullRequestId -eq $env:APPVEYOR_PULL_REQUEST_NUMBER)[0].buildNumber) { `
|
||||||
throw "There are newer queued builds for this pull request, failing early." }
|
throw "There are newer queued builds for this pull request, failing early." }
|
||||||
|
|
||||||
# Install wxPython
|
|
||||||
- 'ECHO Downloading wxPython.'
|
|
||||||
- "appveyor DownloadFile https://goo.gl/yvO8PB -FileName C:\\wxpython.exe"
|
|
||||||
#- "appveyor DownloadFile https://goo.gl/Uj0jV3 -FileName C:\\wxpython64.exe"
|
|
||||||
|
|
||||||
- 'ECHO Install wxPython'
|
|
||||||
- "C:\\wxpython.exe /SP- /VERYSILENT /NORESTART"
|
|
||||||
#- "C:\\wxpython64.exe /SP- /VERYSILENT /NORESTART"
|
|
||||||
|
|
||||||
- ECHO "Filesystem root:"
|
- ECHO "Filesystem root:"
|
||||||
- ps: "ls \"C:/\""
|
- ps: "ls \"C:/\""
|
||||||
|
|
||||||
|
- ECHO "Filesystem projects root:"
|
||||||
|
- ps: "ls \"C:\\projects\\\""
|
||||||
|
|
||||||
- ECHO "Filesystem pyfa root:"
|
- ECHO "Filesystem pyfa root:"
|
||||||
- ps: "ls \"C:\\projects\\pyfa\\\""
|
- ps: "ls \"C:\\projects\\$env:APPVEYOR_PROJECT_SLUG\""
|
||||||
|
|
||||||
- ECHO "Installed SDKs:"
|
- ECHO "Installed SDKs:"
|
||||||
- ps: "ls \"C:/Program Files/Microsoft SDKs/Windows\""
|
- ps: "ls \"C:/Program Files/Microsoft SDKs/Windows\""
|
||||||
|
|
||||||
# Install Python (from the official .msi of http://python.org) and pip when
|
|
||||||
# not already installed.
|
|
||||||
# - ps: if (-not(Test-Path($env:PYTHON))) { & appveyor\install.ps1 }
|
|
||||||
|
|
||||||
# Prepend newly installed Python to the PATH of this build (this cannot be
|
# Prepend newly installed Python to the PATH of this build (this cannot be
|
||||||
# done from inside the powershell script as it would require to restart
|
# done from inside the powershell script as it would require to restart
|
||||||
# the parent CMD process).
|
# the parent CMD process).
|
||||||
- "SET PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH%"
|
- "SET PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH%"
|
||||||
|
|
||||||
# Check that we have the expected version and architecture for Python
|
|
||||||
- "python --version"
|
- "python --version"
|
||||||
- "python -c \"import struct; print(struct.calcsize('P') * 8)\""
|
- "python -c \"import struct; print(struct.calcsize('P') * 8)\""
|
||||||
|
|
||||||
@@ -128,19 +51,36 @@ install:
|
|||||||
# compiled extensions and are not provided as pre-built wheel packages,
|
# compiled extensions and are not provided as pre-built wheel packages,
|
||||||
# pip will build them from source using the MSVC compiler matching the
|
# pip will build them from source using the MSVC compiler matching the
|
||||||
# target Python version and architecture
|
# target Python version and architecture
|
||||||
# C:\\projects\\eve-gnosis\\
|
|
||||||
- ECHO "Install pip requirements:"
|
- ECHO "Install pip requirements:"
|
||||||
- "pip install -r requirements.txt"
|
- "pip install -r requirements.txt"
|
||||||
- "pip install -r requirements_test.txt"
|
- "pip install PyInstaller"
|
||||||
- "pip install -r requirements_build_windows.txt"
|
|
||||||
|
before_build:
|
||||||
|
# directory that will contain the built files
|
||||||
|
- ps: $env:PYFA_DIST_DIR = "c:\projects\$env:APPVEYOR_PROJECT_SLUG\dist"
|
||||||
|
- ps: $env:PYFA_VERSION = (python ./scripts/dump_version.py)
|
||||||
|
- ps: echo("pyfa version ")
|
||||||
|
- ps: echo ($env:PYFA_VERSION)
|
||||||
|
|
||||||
build_script:
|
build_script:
|
||||||
# Build the compiled extension
|
|
||||||
# - "python setup.py build"
|
|
||||||
- ECHO "Build pyfa:"
|
- ECHO "Build pyfa:"
|
||||||
#- copy C:\projects\pyfa\dist_assets\win\pyfa.spec C:\projects\pyfa\pyfa.spec
|
|
||||||
- "python C:\\projects\\pyfa\\setup.py build"
|
|
||||||
|
|
||||||
|
##########
|
||||||
|
# PyInstaller - create binaries for pyfa
|
||||||
|
##########
|
||||||
|
# Build command for PyInstaller
|
||||||
|
- "python -m PyInstaller --noupx --clean --windowed --noconsole -y pyfa.spec"
|
||||||
|
# Copy over manifest (See pyfa-org/pyfa#1622)
|
||||||
|
- ps: xcopy /y dist_assets\win\pyfa.exe.manifest $env:PYFA_DIST_DIR\pyfa\
|
||||||
|
# Not really sure if this is needed, but why not
|
||||||
|
- ps: xcopy /y dist_assets\win\Microsoft.VC90.CRT.manifest $env:PYFA_DIST_DIR\pyfa\
|
||||||
|
|
||||||
|
##########
|
||||||
|
# InnoScript EXE building
|
||||||
|
# This is in a separate script because I don't feel like copying over the logic to AppVeyor script right now...
|
||||||
|
##########
|
||||||
|
- "python dist_assets/win/dist.py"
|
||||||
|
- ps: dir $env:PYFA_DIST_DIR/
|
||||||
#- ECHO "Build pyfa (Debug):"
|
#- ECHO "Build pyfa (Debug):"
|
||||||
#- copy C:\projects\pyfa\dist_assets\win\pyfa_debug.spec C:\projects\pyfa\pyfa_debug.spec
|
#- copy C:\projects\pyfa\dist_assets\win\pyfa_debug.spec C:\projects\pyfa\pyfa_debug.spec
|
||||||
#- "pyinstaller.exe --clean --noconfirm --windowed --upx-dir=C:\\projects\\pyfa\\scripts\\upx.exe C:\\projects\\pyfa\\pyfa_debug.spec"
|
#- "pyinstaller.exe --clean --noconfirm --windowed --upx-dir=C:\\projects\\pyfa\\scripts\\upx.exe C:\\projects\\pyfa\\pyfa_debug.spec"
|
||||||
@@ -150,12 +90,11 @@ build: on
|
|||||||
after_build:
|
after_build:
|
||||||
- ps: "ls \"./\""
|
- ps: "ls \"./\""
|
||||||
#- ps: "ls \"C:\\projects\\pyfa\\build\\pyfa\\\""
|
#- ps: "ls \"C:\\projects\\pyfa\\build\\pyfa\\\""
|
||||||
- ps: "ls \"C:\\projects\\pyfa\\build\\\""
|
# - ps: "ls \"C:\\projects\\$env:APPVEYOR_PROJECT_SLUG\\build\\exe.win32-2.7\\\""
|
||||||
- ps: "ls \"C:\\projects\\pyfa\\build\\exe.win32-2.7\\\""
|
|
||||||
# Zip
|
# Zip
|
||||||
# APPVEYOR_PULL_REQUEST_NUMBER -and $env:APPVEYOR_BUILD_NUMBER
|
# APPVEYOR_PULL_REQUEST_NUMBER -and $env:APPVEYOR_BUILD_NUMBER
|
||||||
#- 7z a build.zip -r C:\projects\pyfa\build\pyfa\*.*
|
#- 7z a build.zip -r C:\projects\pyfa\build\pyfa\*.*
|
||||||
- 7z a pyfa.zip -r C:\projects\pyfa\build\exe.win32-2.7\*.*
|
- ps: 7z a "pyfa-$env:PYFA_VERSION-win.zip" -r "$env:PYFA_DIST_DIR\pyfa\*.*"
|
||||||
#- 7z a pyfa_debug.zip -r C:\projects\pyfa\dist\pyfa_debug\*.*
|
#- 7z a pyfa_debug.zip -r C:\projects\pyfa\dist\pyfa_debug\*.*
|
||||||
|
|
||||||
on_success:
|
on_success:
|
||||||
@@ -176,11 +115,21 @@ after_test:
|
|||||||
|
|
||||||
artifacts:
|
artifacts:
|
||||||
# Archive the generated packages in the ci.appveyor.com build report.
|
# Archive the generated packages in the ci.appveyor.com build report.
|
||||||
- path: pyfa.zip
|
- path: pyfa*-win.zip
|
||||||
name: 'pyfa.zip'
|
- path: pyfa*-win.exe
|
||||||
#- path: pyfa_debug.zip
|
#- path: pyfa_debug.zip
|
||||||
# name: Pyfa_debug
|
# name: Pyfa_debug
|
||||||
|
|
||||||
|
deploy:
|
||||||
|
tag: $(pyfa_version)
|
||||||
|
release: pyfa $(pyfa_version)
|
||||||
|
description: 'Release description'
|
||||||
|
provider: GitHub
|
||||||
|
auth_token:
|
||||||
|
secure: BfNHO66ff5hVx2O2ORbl49X0U/5h2V2T0IuRZDwm7fd1HvsVluF0wRCbl29oRp1M
|
||||||
|
draft: true
|
||||||
|
on:
|
||||||
|
APPVEYOR_REPO_TAG: true # deploy on tag push only
|
||||||
#on_success:
|
#on_success:
|
||||||
# - TODO: upload the content of dist/*.whl to a public wheelhouse
|
# - TODO: upload the content of dist/*.whl to a public wheelhouse
|
||||||
#
|
#
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -122,3 +122,4 @@ gitversion
|
|||||||
/.version
|
/.version
|
||||||
*.swp
|
*.swp
|
||||||
|
|
||||||
|
*.fsdbinary
|
||||||
|
|||||||
58
.travis.yml
58
.travis.yml
@@ -1,39 +1,29 @@
|
|||||||
|
os: linux
|
||||||
language: python
|
language: python
|
||||||
cache: pip
|
|
||||||
python:
|
python:
|
||||||
- '2.7'
|
- 3.6
|
||||||
env:
|
matrix:
|
||||||
- TOXENV=pep8
|
include:
|
||||||
addons:
|
- os: osx
|
||||||
apt:
|
osx_image: xcode7.3
|
||||||
packages:
|
language: generic
|
||||||
|
env: PYTHON=3.6.1
|
||||||
before_install:
|
before_install:
|
||||||
- sudo apt-get update && sudo apt-get --reinstall install -qq language-pack-en language-pack-ru language-pack-he language-pack-zh-hans
|
- bash scripts/setup-osx.sh
|
||||||
- pip install tox
|
|
||||||
# We're not actually installing Tox, but have to run it before we install wxPython via Conda. This is fugly but vOv
|
|
||||||
- tox
|
|
||||||
# get Conda
|
|
||||||
- if [[ "$TRAVIS_PYTHON_VERSION" == "2.7" ]]; then
|
|
||||||
wget https://repo.continuum.io/miniconda/Miniconda-latest-Linux-x86_64.sh -O miniconda.sh;
|
|
||||||
else
|
|
||||||
wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh;
|
|
||||||
fi
|
|
||||||
- bash miniconda.sh -b -p $HOME/miniconda
|
|
||||||
- export PATH="$HOME/miniconda/bin:$PATH"
|
|
||||||
- hash -r
|
|
||||||
- conda config --set always_yes yes --set changeps1 no
|
|
||||||
- conda update -q conda
|
|
||||||
# Useful for debugging any issues with conda
|
|
||||||
- conda info -a
|
|
||||||
install:
|
install:
|
||||||
# install wxPython 3.0.0.0
|
- export PYFA_VERSION="$(python3 scripts/dump_version.py)"
|
||||||
- conda install -c https://conda.anaconda.org/travis wxpython
|
- bash scripts/package-osx.sh
|
||||||
before_script:
|
|
||||||
- pip install -r requirements.txt
|
|
||||||
- pip install -r requirements_test.txt
|
|
||||||
script:
|
|
||||||
- py.test --cov=./
|
|
||||||
after_success:
|
|
||||||
- bash <(curl -s https://codecov.io/bash)
|
|
||||||
before_deploy:
|
before_deploy:
|
||||||
- pip install -r requirements_build_linux.txt
|
- export RELEASE_PKG_FILE=$(ls *.deb)
|
||||||
|
- echo "deploying $RELEASE_PKG_FILE to GitHub releases"
|
||||||
|
deploy:
|
||||||
|
provider: releases
|
||||||
|
api_key:
|
||||||
|
secure: Xfu0xApoB0zUPLXl29aYUulVC3iA4/3bXQwwADKCfAKZwxgNon4dLbO7Rie5/7Ukf2POL0KwmRaQGN3kOr+XSoIVTE4M5sXxnhiaaLGKQ+48hDizLE6JuXcZGJvkxUaghaTzIdCwHsG7VGBsPfQgfGsjJcfBp8tFNLmRyM/Jpsr8T6BR2MxtBIEUVy8zrOWFNZqnmWrY2pWMsB9fYt3JFNdpqeIgRAYqbBsBcZQ1MngLTi3ztuYS5IaF+lk06RrnBlHmUsJu/5nCvIpvPvD0i2BLZ3Uu0+Fn+8QWUgjJEL9MNseXZMXynu05xd8YRk7Ajc9CUrzQIIbAktyteYp85kE3pUJHmrMLcXhh7nqkwttR5/47Zwa3OLJLJFKBxMx6wY5jFkJjkV08850B7aWrmTFl/Eqc3Q5nZMuiEt3wFRbjxHi9h1mTN/fkxfRRHg8u3ENGPR+ZPiFC3J18qtks/B/hsKjjHvZP1i79OYlET4V/zyLyyQkCbpDaARQANuotLYJyZ7tH+KWEyRsvTi0M9Yev9mNNw6aI4vzh4HfkEhvcvnWnYwckPj1dnjQ573Qpw0Z9wsconoWfHAn+hBDt3+YLMrrFZl++mCRskHH1mZChX3aGMDi49zD0kfxBUkYPOAhguc6PwudBxHUZP+O6T/SoHylff6EizCE/k5dGeAk=
|
||||||
|
file_glob: true
|
||||||
|
file: "dist/pyfa-*.zip"
|
||||||
|
skip_cleanup: true
|
||||||
|
draft: true
|
||||||
|
on:
|
||||||
|
tags: true
|
||||||
|
repo: pyfa-org/Pyfa
|
||||||
|
|||||||
@@ -100,8 +100,8 @@ def DBInMemory():
|
|||||||
import eos.db
|
import eos.db
|
||||||
|
|
||||||
# Output debug info to help us troubleshoot Travis
|
# Output debug info to help us troubleshoot Travis
|
||||||
print((eos.db.saveddata_engine))
|
print(eos.db.saveddata_engine)
|
||||||
print((eos.db.gamedata_engine))
|
print(eos.db.gamedata_engine)
|
||||||
|
|
||||||
helper = {
|
helper = {
|
||||||
'config': eos.config,
|
'config': eos.config,
|
||||||
@@ -129,7 +129,8 @@ def Saveddata():
|
|||||||
from eos.saveddata.ship import Ship
|
from eos.saveddata.ship import Ship
|
||||||
from eos.saveddata.fit import Fit
|
from eos.saveddata.fit import Fit
|
||||||
from eos.saveddata.character import Character
|
from eos.saveddata.character import Character
|
||||||
from eos.saveddata.module import Module, State
|
from eos.saveddata.module import Module
|
||||||
|
from eos.const import FittingModuleState
|
||||||
from eos.saveddata.citadel import Citadel
|
from eos.saveddata.citadel import Citadel
|
||||||
from eos.saveddata.booster import Booster
|
from eos.saveddata.booster import Booster
|
||||||
|
|
||||||
@@ -139,7 +140,7 @@ def Saveddata():
|
|||||||
'Fit' : Fit,
|
'Fit' : Fit,
|
||||||
'Character': Character,
|
'Character': Character,
|
||||||
'Module' : Module,
|
'Module' : Module,
|
||||||
'State' : State,
|
'State' : FittingModuleState,
|
||||||
'Booster' : Booster,
|
'Booster' : Booster,
|
||||||
}
|
}
|
||||||
return helper
|
return helper
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
# noinspection PyPackageRequirements
|
# noinspection PyPackageRequirements
|
||||||
from _development.helpers import DBInMemory as DB, Gamedata, Saveddata
|
|
||||||
|
|
||||||
|
|
||||||
# noinspection PyShadowingNames
|
# noinspection PyShadowingNames
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
# noinspection PyPackageRequirements
|
# noinspection PyPackageRequirements
|
||||||
from _development.helpers import DBInMemory as DB, Gamedata, Saveddata
|
|
||||||
|
|
||||||
|
|
||||||
# noinspection PyShadowingNames
|
# noinspection PyShadowingNames
|
||||||
|
|||||||
48
config.py
48
config.py
@@ -1,9 +1,12 @@
|
|||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
import yaml
|
||||||
|
import wx
|
||||||
|
|
||||||
from logbook import CRITICAL, DEBUG, ERROR, FingersCrossedHandler, INFO, Logger, NestedSetup, NullHandler, \
|
from logbook import CRITICAL, DEBUG, ERROR, FingersCrossedHandler, INFO, Logger, NestedSetup, NullHandler, \
|
||||||
StreamHandler, TimedRotatingFileHandler, WARNING
|
StreamHandler, TimedRotatingFileHandler, WARNING
|
||||||
import hashlib
|
import hashlib
|
||||||
|
from eos.const import FittingSlot
|
||||||
|
|
||||||
from cryptography.fernet import Fernet
|
from cryptography.fernet import Fernet
|
||||||
|
|
||||||
@@ -22,12 +25,6 @@ debug = False
|
|||||||
# Defines if our saveddata will be in pyfa root or not
|
# Defines if our saveddata will be in pyfa root or not
|
||||||
saveInRoot = False
|
saveInRoot = False
|
||||||
|
|
||||||
# Version data
|
|
||||||
|
|
||||||
version = "2.0.0"
|
|
||||||
tag = "Stable"
|
|
||||||
expansionName = "YC120.3"
|
|
||||||
expansionVersion = "1.8"
|
|
||||||
evemonMinVersion = "4081"
|
evemonMinVersion = "4081"
|
||||||
|
|
||||||
minItemSearchLength = 3
|
minItemSearchLength = 3
|
||||||
@@ -42,7 +39,6 @@ logging_setup = None
|
|||||||
cipher = None
|
cipher = None
|
||||||
clientHash = None
|
clientHash = None
|
||||||
|
|
||||||
ESI_AUTH_PROXY = "https://www.pyfa.io" # "http://localhost:5015"
|
|
||||||
ESI_CACHE = 'esi_cache'
|
ESI_CACHE = 'esi_cache'
|
||||||
|
|
||||||
LOGLEVEL_MAP = {
|
LOGLEVEL_MAP = {
|
||||||
@@ -53,6 +49,13 @@ LOGLEVEL_MAP = {
|
|||||||
"debug": DEBUG,
|
"debug": DEBUG,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
slotColourMap = {
|
||||||
|
FittingSlot.LOW: wx.Colour(250, 235, 204), # yellow = low slots
|
||||||
|
FittingSlot.MED: wx.Colour(188, 215, 241), # blue = mid slots
|
||||||
|
FittingSlot.HIGH: wx.Colour(235, 204, 209), # red = high slots
|
||||||
|
FittingSlot.RIG: '',
|
||||||
|
FittingSlot.SUBSYSTEM: ''
|
||||||
|
}
|
||||||
|
|
||||||
def getClientSecret():
|
def getClientSecret():
|
||||||
return clientHash
|
return clientHash
|
||||||
@@ -80,12 +83,7 @@ def getPyfaRoot():
|
|||||||
|
|
||||||
|
|
||||||
def getVersion():
|
def getVersion():
|
||||||
if os.path.isfile(os.path.join(pyfaPath, '.version')):
|
return version
|
||||||
with open(os.path.join(pyfaPath, '.version')) as f:
|
|
||||||
gitVersion = f.readline()
|
|
||||||
return gitVersion
|
|
||||||
# if no version file exists, then user is running from source or not an official build
|
|
||||||
return version + " (git)"
|
|
||||||
|
|
||||||
|
|
||||||
def getDefaultSave():
|
def getDefaultSave():
|
||||||
@@ -102,6 +100,7 @@ def defPaths(customSavePath=None):
|
|||||||
global logPath
|
global logPath
|
||||||
global cipher
|
global cipher
|
||||||
global clientHash
|
global clientHash
|
||||||
|
global version
|
||||||
|
|
||||||
pyfalog.debug("Configuring Pyfa")
|
pyfalog.debug("Configuring Pyfa")
|
||||||
|
|
||||||
@@ -111,6 +110,12 @@ def defPaths(customSavePath=None):
|
|||||||
if pyfaPath is None:
|
if pyfaPath is None:
|
||||||
pyfaPath = getPyfaRoot()
|
pyfaPath = getPyfaRoot()
|
||||||
|
|
||||||
|
# Version data
|
||||||
|
|
||||||
|
with open(os.path.join(pyfaPath, "version.yml"), 'r') as file:
|
||||||
|
data = yaml.load(file, Loader=yaml.FullLoader)
|
||||||
|
version = data['version']
|
||||||
|
|
||||||
# Where we store the saved fits etc, default is the current users home directory
|
# Where we store the saved fits etc, default is the current users home directory
|
||||||
if saveInRoot is True:
|
if saveInRoot is True:
|
||||||
savePath = getattr(configforced, "savePath", None)
|
savePath = getattr(configforced, "savePath", None)
|
||||||
@@ -166,9 +171,6 @@ def defPaths(customSavePath=None):
|
|||||||
eos.config.saveddata_connectionstring = "sqlite:///" + saveDB + "?check_same_thread=False"
|
eos.config.saveddata_connectionstring = "sqlite:///" + saveDB + "?check_same_thread=False"
|
||||||
eos.config.gamedata_connectionstring = "sqlite:///" + gameDB + "?check_same_thread=False"
|
eos.config.gamedata_connectionstring = "sqlite:///" + gameDB + "?check_same_thread=False"
|
||||||
|
|
||||||
print(eos.config.saveddata_connectionstring)
|
|
||||||
print(eos.config.gamedata_connectionstring)
|
|
||||||
|
|
||||||
# initialize the settings
|
# initialize the settings
|
||||||
from service.settings import EOSSettings
|
from service.settings import EOSSettings
|
||||||
eos.config.settings = EOSSettings.getInstance().EOSSettings # this is kind of confusing, but whatever
|
eos.config.settings = EOSSettings.getInstance().EOSSettings # this is kind of confusing, but whatever
|
||||||
@@ -230,20 +232,6 @@ def defLogging():
|
|||||||
)
|
)
|
||||||
])
|
])
|
||||||
|
|
||||||
with logging_setup.threadbound():
|
|
||||||
|
|
||||||
# Output all stdout (print) messages as warnings
|
|
||||||
try:
|
|
||||||
sys.stdout = LoggerWriter(pyfalog.warning)
|
|
||||||
except:
|
|
||||||
pyfalog.critical("Cannot redirect. Continuing without writing stdout to log.")
|
|
||||||
|
|
||||||
# Output all stderr (stacktrace) messages as critical
|
|
||||||
try:
|
|
||||||
sys.stderr = LoggerWriter(pyfalog.critical)
|
|
||||||
except:
|
|
||||||
pyfalog.critical("Cannot redirect. Continuing without writing stderr to log.")
|
|
||||||
|
|
||||||
|
|
||||||
class LoggerWriter(object):
|
class LoggerWriter(object):
|
||||||
def __init__(self, level):
|
def __init__(self, level):
|
||||||
|
|||||||
@@ -24,14 +24,18 @@ added_files = [
|
|||||||
('../../eve.db', '.'),
|
('../../eve.db', '.'),
|
||||||
('../../README.md', '.'),
|
('../../README.md', '.'),
|
||||||
('../../LICENSE', '.'),
|
('../../LICENSE', '.'),
|
||||||
('../../.version', '.'),
|
('../../version.yml', '.'),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
import_these = []
|
import_these = [
|
||||||
|
'numpy.core._dtype_ctypes' # https://github.com/pyinstaller/pyinstaller/issues/3982
|
||||||
|
]
|
||||||
|
|
||||||
|
icon = os.path.join(os.getcwd(), "dist_assets", "mac", "pyfa.icns")
|
||||||
|
|
||||||
# Walk directories that do dynamic importing
|
# Walk directories that do dynamic importing
|
||||||
paths = ('eos/effects', 'eos/db/migrations', 'service/conversions')
|
paths = ('eos/db/migrations', 'service/conversions')
|
||||||
for root, folders, files in chain.from_iterable(os.walk(path) for path in paths):
|
for root, folders, files in chain.from_iterable(os.walk(path) for path in paths):
|
||||||
for file_ in files:
|
for file_ in files:
|
||||||
if file_.endswith(".py") and not file_.startswith("_"):
|
if file_.endswith(".py") and not file_.startswith("_"):
|
||||||
@@ -52,8 +56,10 @@ a = Analysis([r'../../pyfa.py'],
|
|||||||
win_no_prefer_redirects=False,
|
win_no_prefer_redirects=False,
|
||||||
win_private_assemblies=False,
|
win_private_assemblies=False,
|
||||||
cipher=block_cipher)
|
cipher=block_cipher)
|
||||||
|
|
||||||
pyz = PYZ(a.pure, a.zipped_data,
|
pyz = PYZ(a.pure, a.zipped_data,
|
||||||
cipher=block_cipher)
|
cipher=block_cipher)
|
||||||
|
|
||||||
exe = EXE(pyz,
|
exe = EXE(pyz,
|
||||||
a.scripts,
|
a.scripts,
|
||||||
a.binaries,
|
a.binaries,
|
||||||
@@ -65,10 +71,19 @@ exe = EXE(pyz,
|
|||||||
upx=True,
|
upx=True,
|
||||||
runtime_tmpdir=None,
|
runtime_tmpdir=None,
|
||||||
console=False ,
|
console=False ,
|
||||||
icon='dist_assets/mac/pyfa.icns',
|
icon=icon,
|
||||||
)
|
)
|
||||||
|
|
||||||
app = BUNDLE(exe,
|
app = BUNDLE(
|
||||||
name='pyfa.app',
|
exe,
|
||||||
icon=None,
|
name='pyfa.app',
|
||||||
bundle_identifier=None)
|
icon=icon,
|
||||||
|
bundle_identifier=None,
|
||||||
|
info_plist={
|
||||||
|
'NSHighResolutionCapable': 'True',
|
||||||
|
'NSPrincipalClass': 'NSApplication',
|
||||||
|
'CFBundleName': 'pyfa',
|
||||||
|
'CFBundleDisplayName': 'pyfa',
|
||||||
|
'CFBundleIdentifier': 'org.pyfaorg.pyfa',
|
||||||
|
}
|
||||||
|
)
|
||||||
13
dist_assets/win/Microsoft.VC90.CRT.manifest
Normal file
13
dist_assets/win/Microsoft.VC90.CRT.manifest
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
|
||||||
|
<noInheritable/>
|
||||||
|
<assemblyIdentity
|
||||||
|
type="win32"
|
||||||
|
name="Microsoft.VC90.CRT"
|
||||||
|
version="9.0.21022.8"
|
||||||
|
processorArchitecture="x86"
|
||||||
|
publicKeyToken="1fc8b3b9a1e18e3b"/>
|
||||||
|
<file name="MSVCR90.DLL"/>
|
||||||
|
<file name="MSVCM90.DLL"/>
|
||||||
|
<file name="MSVCP90.DLL"/>
|
||||||
|
</assembly>
|
||||||
37
dist_assets/win/dist.py
Normal file
37
dist_assets/win/dist.py
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
# helper script to zip up pyinstaller distribution and create installer file
|
||||||
|
|
||||||
|
import os.path
|
||||||
|
from subprocess import call
|
||||||
|
import zipfile
|
||||||
|
from packaging.version import Version
|
||||||
|
import yaml
|
||||||
|
|
||||||
|
|
||||||
|
with open("version.yml", 'r') as file:
|
||||||
|
data = yaml.load(file, Loader=yaml.FullLoader)
|
||||||
|
version = data['version']
|
||||||
|
|
||||||
|
os.environ["PYFA_DIST_DIR"] = os.path.join(os.getcwd(), 'dist')
|
||||||
|
|
||||||
|
os.environ["PYFA_VERSION"] = version
|
||||||
|
iscc = "C:\Program Files (x86)\Inno Setup 5\ISCC.exe" # inno script location via wine
|
||||||
|
|
||||||
|
source = os.path.join(os.environ["PYFA_DIST_DIR"], "pyfa")
|
||||||
|
|
||||||
|
fileName = "pyfa-{}-win".format(os.environ["PYFA_VERSION"])
|
||||||
|
|
||||||
|
print("Compiling EXE")
|
||||||
|
|
||||||
|
v = Version(version)
|
||||||
|
|
||||||
|
print(v)
|
||||||
|
|
||||||
|
call([
|
||||||
|
iscc,
|
||||||
|
os.path.join(os.getcwd(), "dist_assets", "win", "pyfa-setup.iss"),
|
||||||
|
"/dMyAppVersion=%s" % v,
|
||||||
|
"/dMyAppDir=%s" % source,
|
||||||
|
"/dMyOutputDir=%s" % os.path.join(os.getcwd()),
|
||||||
|
"/dMyOutputFile=%s" % fileName]) # stdout=devnull, stderr=devnull
|
||||||
|
|
||||||
|
print("Done")
|
||||||
@@ -5,24 +5,22 @@
|
|||||||
; we do some #ifdef conditionals because automated compilation passes these as arguments
|
; we do some #ifdef conditionals because automated compilation passes these as arguments
|
||||||
|
|
||||||
#ifndef MyAppVersion
|
#ifndef MyAppVersion
|
||||||
#define MyAppVersion "1.15.0"
|
#define MyAppVersion "2.1.0"
|
||||||
#endif
|
|
||||||
#ifndef MyAppExpansion
|
|
||||||
#define MyAppExpansion "Vanguard 1.0"
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
; Other config
|
; Other config
|
||||||
|
|
||||||
#define MyAppName "pyfa"
|
#define MyAppName "pyfa"
|
||||||
#define MyAppPublisher "pyfa"
|
#define MyAppPublisher "pyfa"
|
||||||
#define MyAppURL "https://forums.eveonline.com/t/27156"
|
#define MyAppURL "https://github.com/pyfa-org/Pyfa/"
|
||||||
#define MyAppExeName "pyfa.exe"
|
#define MyAppExeName "pyfa.exe"
|
||||||
|
|
||||||
; What version starts with the new structure (1.x.0). This is used to determine if we run directory structure cleanup
|
; What version starts with the new structure (1.x.0). This is used to determine if we run directory structure cleanup
|
||||||
#define VersionFlag 16
|
#define MajorVersionFlag 2
|
||||||
|
#define MinorVersionFlag 0
|
||||||
|
|
||||||
#ifndef MyOutputFile
|
#ifndef MyOutputFile
|
||||||
#define MyOutputFile LowerCase(StringChange(MyAppName+'-'+MyAppVersion+'-'+MyAppExpansion+'-win-wx3', " ", "-"))
|
#define MyOutputFile LowerCase(StringChange(MyAppName+'-'+MyAppVersion+'-win', " ", "-"))
|
||||||
#endif
|
#endif
|
||||||
#ifndef MyAppDir
|
#ifndef MyAppDir
|
||||||
#define MyAppDir "pyfa"
|
#define MyAppDir "pyfa"
|
||||||
@@ -38,7 +36,7 @@
|
|||||||
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
|
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
|
||||||
AppId={{3DA39096-C08D-49CD-90E0-1D177F32C8AA}
|
AppId={{3DA39096-C08D-49CD-90E0-1D177F32C8AA}
|
||||||
AppName={#MyAppName}
|
AppName={#MyAppName}
|
||||||
AppVersion={#MyAppVersion} ({#MyAppExpansion})
|
AppVersion={#MyAppVersion}
|
||||||
AppPublisher={#MyAppPublisher}
|
AppPublisher={#MyAppPublisher}
|
||||||
AppPublisherURL={#MyAppURL}
|
AppPublisherURL={#MyAppURL}
|
||||||
AppSupportURL={#MyAppURL}
|
AppSupportURL={#MyAppURL}
|
||||||
@@ -50,10 +48,8 @@ LicenseFile={#MyAppDir}\LICENSE
|
|||||||
OutputDir={#MyOutputDir}
|
OutputDir={#MyOutputDir}
|
||||||
OutputBaseFilename={#MyOutputFile}
|
OutputBaseFilename={#MyOutputFile}
|
||||||
SetupIconFile={#MyAppDir}\pyfa.ico
|
SetupIconFile={#MyAppDir}\pyfa.ico
|
||||||
Compression=lzma
|
|
||||||
SolidCompression=yes
|
SolidCompression=yes
|
||||||
CloseApplications=yes
|
CloseApplications=yes
|
||||||
AppReadmeFile=https://github.com/pyfa-org/Pyfa/blob/v{#MyAppVersion}/readme.txt
|
|
||||||
|
|
||||||
[Languages]
|
[Languages]
|
||||||
Name: "english"; MessagesFile: "compiler:Default.isl"
|
Name: "english"; MessagesFile: "compiler:Default.isl"
|
||||||
@@ -63,7 +59,7 @@ Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{
|
|||||||
Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 0,6.1
|
Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 0,6.1
|
||||||
|
|
||||||
[Files]
|
[Files]
|
||||||
Source: "{#MyAppDir}\pyfa.exe"; DestDir: "{app}"; Flags: ignoreversion
|
Source: "{#MyAppDir}\pyfa.exe"; DestDir: "{app}"; Flags: ignoreversion; AfterInstall: RemoveFromVirtualStore
|
||||||
Source: "{#MyAppDir}\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
|
Source: "{#MyAppDir}\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
|
||||||
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
|
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
|
||||||
|
|
||||||
@@ -103,6 +99,22 @@ begin
|
|||||||
FSWbemLocator := Unassigned;
|
FSWbemLocator := Unassigned;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure RemoveFromVirtualStore;
|
||||||
|
var
|
||||||
|
VirtualStore,FileName,FilePath:String;
|
||||||
|
DriveChars:Integer;
|
||||||
|
begin
|
||||||
|
VirtualStore:=AddBackslash(ExpandConstant('{localappdata}'))+'VirtualStore';
|
||||||
|
FileName:=ExpandConstant(CurrentFileName);
|
||||||
|
DriveChars:=Length(ExtractFileDrive(FileName));
|
||||||
|
if DriveChars>0 then begin
|
||||||
|
Delete(FileName,1,DriveChars);
|
||||||
|
FileName:=VirtualStore+FileName;
|
||||||
|
FilePath:=ExtractFilePath(FileName);
|
||||||
|
DelTree(FilePath, True, True, True);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
function PrepareToInstall(var NeedsRestart: Boolean): String;
|
function PrepareToInstall(var NeedsRestart: Boolean): String;
|
||||||
begin
|
begin
|
||||||
if(IsAppRunning( 'pyfa.exe' )) then
|
if(IsAppRunning( 'pyfa.exe' )) then
|
||||||
@@ -138,15 +150,19 @@ var
|
|||||||
V: Integer;
|
V: Integer;
|
||||||
iResultCode: Integer;
|
iResultCode: Integer;
|
||||||
sUnInstallString: string;
|
sUnInstallString: string;
|
||||||
iOldVersion: Cardinal;
|
iOldVersionMajor: Cardinal;
|
||||||
|
iOldVersionMinor: Cardinal;
|
||||||
begin
|
begin
|
||||||
Result := True; // in case when no previous version is found
|
Result := True; // in case when no previous version is found
|
||||||
if RegValueExists(HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion\Uninstall\{3DA39096-C08D-49CD-90E0-1D177F32C8AA}_is1', 'UninstallString') then //Your App GUID/ID
|
if RegValueExists(HKEY_LOCAL_MACHINE,'Software\Microsoft\Windows\CurrentVersion\Uninstall\{3DA39096-C08D-49CD-90E0-1D177F32C8AA}_is1', 'UninstallString') then //Your App GUID/ID
|
||||||
begin
|
begin
|
||||||
RegQueryDWordValue(HKEY_LOCAL_MACHINE,
|
RegQueryDWordValue(HKEY_LOCAL_MACHINE,
|
||||||
'Software\Microsoft\Windows\CurrentVersion\Uninstall\{3DA39096-C08D-49CD-90E0-1D177F32C8AA}_is1',
|
'Software\Microsoft\Windows\CurrentVersion\Uninstall\{3DA39096-C08D-49CD-90E0-1D177F32C8AA}_is1',
|
||||||
'MinorVersion', iOldVersion);
|
'MajorVersion', iOldVersionMajor);
|
||||||
if iOldVersion < {#VersionFlag} then // If old version with old structure is installed.
|
RegQueryDWordValue(HKEY_LOCAL_MACHINE,
|
||||||
|
'Software\Microsoft\Windows\CurrentVersion\Uninstall\{3DA39096-C08D-49CD-90E0-1D177F32C8AA}_is1',
|
||||||
|
'MinorVersion', iOldVersionMinor);
|
||||||
|
if (iOldVersionMajor < {#MajorVersionFlag}) or ((iOldVersionMajor = {#MajorVersionFlag}) and (iOldVersionMinor < {#MinorVersionFlag})) then // If old version with old structure is installed.
|
||||||
begin
|
begin
|
||||||
V := MsgBox(ExpandConstant('An old version of pyfa was detected. Due to recent changes in the application structure, you must uninstall the previous version first. This will not affect your user data (saved fittings, characters, etc.). Do you want to uninstall now?'), mbInformation, MB_YESNO); //Custom Message if App installed
|
V := MsgBox(ExpandConstant('An old version of pyfa was detected. Due to recent changes in the application structure, you must uninstall the previous version first. This will not affect your user data (saved fittings, characters, etc.). Do you want to uninstall now?'), mbInformation, MB_YESNO); //Custom Message if App installed
|
||||||
if V = IDYES then
|
if V = IDYES then
|
||||||
25
dist_assets/win/pyfa.exe.manifest
Normal file
25
dist_assets/win/pyfa.exe.manifest
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
|
||||||
|
<assemblyIdentity name="pyfa" processorArchitecture="x86" type="win32" version="1.0.0.0"/>
|
||||||
|
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||||
|
<security>
|
||||||
|
<requestedPrivileges>
|
||||||
|
<requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
|
||||||
|
</requestedPrivileges>
|
||||||
|
</security>
|
||||||
|
</trustInfo>
|
||||||
|
<dependency>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
|
||||||
|
</dependentAssembly>
|
||||||
|
</dependency>
|
||||||
|
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
|
||||||
|
<application>
|
||||||
|
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
|
||||||
|
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
|
||||||
|
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
|
||||||
|
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
|
||||||
|
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
|
||||||
|
</application>
|
||||||
|
</compatibility>
|
||||||
|
</assembly>
|
||||||
@@ -5,8 +5,7 @@ from itertools import chain
|
|||||||
import subprocess
|
import subprocess
|
||||||
import requests.certs
|
import requests.certs
|
||||||
|
|
||||||
label = subprocess.check_output([
|
label = subprocess.check_output(["git", "describe", "--tags"]).strip()
|
||||||
"git", "describe", "--tags"]).strip()
|
|
||||||
|
|
||||||
with open('.version', 'w+') as f:
|
with open('.version', 'w+') as f:
|
||||||
f.write(label.decode())
|
f.write(label.decode())
|
||||||
@@ -18,19 +17,23 @@ added_files = [
|
|||||||
('../../imgs/gui/*.gif', 'imgs/gui'),
|
('../../imgs/gui/*.gif', 'imgs/gui'),
|
||||||
('../../imgs/icons/*.png', 'imgs/icons'),
|
('../../imgs/icons/*.png', 'imgs/icons'),
|
||||||
('../../imgs/renders/*.png', 'imgs/renders'),
|
('../../imgs/renders/*.png', 'imgs/renders'),
|
||||||
('../../service/jargon/*.yaml', 'service/jargon'),
|
('../../service/jargon/*.yaml', 'service/jargon'),
|
||||||
('../../dist_assets/win/pyfa.ico', '.'),
|
('../../dist_assets/win/pyfa.ico', '.'),
|
||||||
|
('../../dist_assets/win/pyfa.exe.manifest', '.'),
|
||||||
|
('../../dist_assets/win/Microsoft.VC90.CRT.manifest', '.'),
|
||||||
(requests.certs.where(), '.'), # is this needed anymore?
|
(requests.certs.where(), '.'), # is this needed anymore?
|
||||||
('../../eve.db', '.'),
|
('../../eve.db', '.'),
|
||||||
('../../README.md', '.'),
|
('../../README.md', '.'),
|
||||||
('../../LICENSE', '.'),
|
('../../LICENSE', '.'),
|
||||||
('../../.version', '.'),
|
('../../version.yml', '.'),
|
||||||
]
|
]
|
||||||
|
|
||||||
import_these = []
|
import_these = [
|
||||||
|
'numpy.core._dtype_ctypes' # https://github.com/pyinstaller/pyinstaller/issues/3982
|
||||||
|
]
|
||||||
|
|
||||||
# Walk directories that do dynamic importing
|
# Walk directories that do dynamic importing
|
||||||
paths = ('eos/effects', 'eos/db/migrations', 'service/conversions')
|
paths = ('eos/db/migrations', 'service/conversions')
|
||||||
for root, folders, files in chain.from_iterable(os.walk(path) for path in paths):
|
for root, folders, files in chain.from_iterable(os.walk(path) for path in paths):
|
||||||
for file_ in files:
|
for file_ in files:
|
||||||
if file_.endswith(".py") and not file_.startswith("_"):
|
if file_.endswith(".py") and not file_.startswith("_"):
|
||||||
@@ -79,4 +82,5 @@ coll = COLLECT(
|
|||||||
upx=True,
|
upx=True,
|
||||||
name='pyfa',
|
name='pyfa',
|
||||||
icon='dist_assets/win/pyfa.ico',
|
icon='dist_assets/win/pyfa.ico',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ debug = False
|
|||||||
gamedataCache = True
|
gamedataCache = True
|
||||||
saveddataCache = True
|
saveddataCache = True
|
||||||
gamedata_version = ""
|
gamedata_version = ""
|
||||||
|
gamedata_date = ""
|
||||||
gamedata_connectionstring = 'sqlite:///' + realpath(join(dirname(abspath(__file__)), "..", "eve.db"))
|
gamedata_connectionstring = 'sqlite:///' + realpath(join(dirname(abspath(__file__)), "..", "eve.db"))
|
||||||
pyfalog.debug("Gamedata connection string: {0}", gamedata_connectionstring)
|
pyfalog.debug("Gamedata connection string: {0}", gamedata_connectionstring)
|
||||||
|
|
||||||
@@ -18,13 +19,14 @@ if istravis is True or hasattr(sys, '_called_from_test'):
|
|||||||
# Running in Travis. Run saveddata database in memory.
|
# Running in Travis. Run saveddata database in memory.
|
||||||
saveddata_connectionstring = 'sqlite:///:memory:'
|
saveddata_connectionstring = 'sqlite:///:memory:'
|
||||||
else:
|
else:
|
||||||
saveddata_connectionstring = 'sqlite:///' + realpath(join(dirname(abspath(__file__)), "..", "saveddata", "saveddata-py3-db.db"))
|
saveddata_connectionstring = 'sqlite:///' + realpath(join(dirname(abspath(__file__)), "..", "saveddata", "saveddata.db"))
|
||||||
|
|
||||||
pyfalog.debug("Saveddata connection string: {0}", saveddata_connectionstring)
|
pyfalog.debug("Saveddata connection string: {0}", saveddata_connectionstring)
|
||||||
|
|
||||||
settings = {
|
settings = {
|
||||||
"useStaticAdaptiveArmorHardener": False,
|
"useStaticAdaptiveArmorHardener": False,
|
||||||
"strictSkillLevels": True,
|
"strictSkillLevels": True,
|
||||||
|
"globalDefaultSpoolupPercentage": 1.0
|
||||||
}
|
}
|
||||||
|
|
||||||
# Autodetect path, only change if the autodetection bugs out.
|
# Autodetect path, only change if the autodetection bugs out.
|
||||||
|
|||||||
95
eos/const.py
Normal file
95
eos/const.py
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
# =============================================================================
|
||||||
|
# Copyright (C) 2019 Ryan Holmes
|
||||||
|
#
|
||||||
|
# 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/>.
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
from enum import IntEnum,unique
|
||||||
|
|
||||||
|
|
||||||
|
@unique
|
||||||
|
class FittingSlot(IntEnum):
|
||||||
|
"""
|
||||||
|
Contains slots for ship fittings
|
||||||
|
"""
|
||||||
|
# These are self-explanatory
|
||||||
|
LOW = 1
|
||||||
|
MED = 2
|
||||||
|
HIGH = 3
|
||||||
|
RIG = 4
|
||||||
|
SUBSYSTEM = 5
|
||||||
|
# not a real slot, need for pyfa display rack separation
|
||||||
|
MODE = 6
|
||||||
|
# system effects. They are projected "modules" and pyfa assumes all modules
|
||||||
|
# have a slot. In this case, make one up.
|
||||||
|
SYSTEM = 7
|
||||||
|
# used for citadel services
|
||||||
|
SERVICE = 8
|
||||||
|
# fighter 'slots'. Just easier to put them here...
|
||||||
|
F_LIGHT = 10
|
||||||
|
F_SUPPORT = 11
|
||||||
|
F_HEAVY = 12
|
||||||
|
# fighter 'slots' (for structures)
|
||||||
|
FS_LIGHT = 13
|
||||||
|
FS_SUPPORT = 14
|
||||||
|
FS_HEAVY = 15
|
||||||
|
|
||||||
|
|
||||||
|
@unique
|
||||||
|
class ImplantLocation(IntEnum):
|
||||||
|
"""
|
||||||
|
Contains location of the implant
|
||||||
|
"""
|
||||||
|
FIT = 0
|
||||||
|
CHARACTER = 1
|
||||||
|
|
||||||
|
|
||||||
|
@unique
|
||||||
|
class CalcType(IntEnum):
|
||||||
|
"""
|
||||||
|
Contains location of the calculation
|
||||||
|
"""
|
||||||
|
LOCAL = 0
|
||||||
|
PROJECTED = 1
|
||||||
|
COMMAND = 2
|
||||||
|
|
||||||
|
|
||||||
|
@unique
|
||||||
|
class FittingModuleState(IntEnum):
|
||||||
|
"""
|
||||||
|
Contains the state of a fitting module
|
||||||
|
"""
|
||||||
|
OFFLINE = -1
|
||||||
|
ONLINE = 0
|
||||||
|
ACTIVE = 1
|
||||||
|
OVERHEATED = 2
|
||||||
|
|
||||||
|
|
||||||
|
@unique
|
||||||
|
class FittingHardpoint(IntEnum):
|
||||||
|
"""
|
||||||
|
Contains the types of a fitting hardpoint
|
||||||
|
"""
|
||||||
|
NONE = 0
|
||||||
|
MISSILE = 1
|
||||||
|
TURRET = 2
|
||||||
|
|
||||||
|
|
||||||
|
@unique
|
||||||
|
class SpoolType(IntEnum):
|
||||||
|
SCALE = 0 # [0..1]
|
||||||
|
TIME = 1 # Expressed via time in seconds since spool up started
|
||||||
|
CYCLES = 2 # Expressed in amount of cycles since spool up started
|
||||||
@@ -51,10 +51,14 @@ try:
|
|||||||
config.gamedata_version = gamedata_session.execute(
|
config.gamedata_version = gamedata_session.execute(
|
||||||
"SELECT `field_value` FROM `metadata` WHERE `field_name` LIKE 'client_build'"
|
"SELECT `field_value` FROM `metadata` WHERE `field_name` LIKE 'client_build'"
|
||||||
).fetchone()[0]
|
).fetchone()[0]
|
||||||
|
config.gamedata_date = gamedata_session.execute(
|
||||||
|
"SELECT `field_value` FROM `metadata` WHERE `field_name` LIKE 'dump_time'"
|
||||||
|
).fetchone()[0]
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
pyfalog.warning("Missing gamedata version.")
|
pyfalog.warning("Missing gamedata version.")
|
||||||
pyfalog.critical(e)
|
pyfalog.critical(e)
|
||||||
config.gamedata_version = None
|
config.gamedata_version = None
|
||||||
|
config.gamedata_date = None
|
||||||
|
|
||||||
saveddata_connectionstring = config.saveddata_connectionstring
|
saveddata_connectionstring = config.saveddata_connectionstring
|
||||||
if saveddata_connectionstring is not None:
|
if saveddata_connectionstring is not None:
|
||||||
@@ -74,10 +78,10 @@ sd_lock = threading.RLock()
|
|||||||
|
|
||||||
# Import all the definitions for all our database stuff
|
# Import all the definitions for all our database stuff
|
||||||
# noinspection PyPep8
|
# noinspection PyPep8
|
||||||
from eos.db.gamedata import alphaClones, attribute, category, effect, group, icon, item, marketGroup, metaData, metaGroup, queries, traits, unit
|
from eos.db.gamedata import alphaClones, attribute, category, effect, group, item, marketGroup, metaData, metaGroup, queries, traits, unit, dynamicAttributes
|
||||||
# noinspection PyPep8
|
# noinspection PyPep8
|
||||||
from eos.db.saveddata import booster, cargo, character, damagePattern, databaseRepair, drone, fighter, fit, implant, implantSet, loadDefaultDatabaseValues, \
|
from eos.db.saveddata import booster, cargo, character, damagePattern, databaseRepair, drone, fighter, fit, implant, implantSet, loadDefaultDatabaseValues, \
|
||||||
miscData, module, override, price, queries, skill, targetResists, user
|
miscData, mutator, module, override, price, queries, skill, targetResists, user
|
||||||
|
|
||||||
# Import queries
|
# Import queries
|
||||||
# noinspection PyPep8
|
# noinspection PyPep8
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
__all__ = ["attribute", "category", "effect", "group", "metaData",
|
__all__ = ["attribute", "category", "effect", "group", "metaData", "dynamicAttributes",
|
||||||
"icon", "item", "marketGroup", "metaGroup", "unit", "alphaClones"]
|
"item", "marketGroup", "metaGroup", "unit", "alphaClones"]
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ from sqlalchemy.ext.associationproxy import association_proxy
|
|||||||
from sqlalchemy.orm import relation, mapper, synonym, deferred
|
from sqlalchemy.orm import relation, mapper, synonym, deferred
|
||||||
|
|
||||||
from eos.db import gamedata_meta
|
from eos.db import gamedata_meta
|
||||||
from eos.gamedata import Attribute, AttributeInfo, Unit, Icon
|
from eos.gamedata import Attribute, AttributeInfo, Unit
|
||||||
|
|
||||||
typeattributes_table = Table("dgmtypeattribs", gamedata_meta,
|
typeattributes_table = Table("dgmtypeattribs", gamedata_meta,
|
||||||
Column("value", Float),
|
Column("value", Float),
|
||||||
@@ -38,7 +38,9 @@ attributes_table = Table("dgmattribs", gamedata_meta,
|
|||||||
Column("published", Boolean),
|
Column("published", Boolean),
|
||||||
Column("displayName", String),
|
Column("displayName", String),
|
||||||
Column("highIsGood", Boolean),
|
Column("highIsGood", Boolean),
|
||||||
Column("iconID", Integer, ForeignKey("icons.iconID")),
|
Column("iconID", Integer),
|
||||||
|
Column("attributeCategory", Integer),
|
||||||
|
Column("tooltipDescription", Integer),
|
||||||
Column("unitID", Integer, ForeignKey("dgmunits.unitID")))
|
Column("unitID", Integer, ForeignKey("dgmunits.unitID")))
|
||||||
|
|
||||||
mapper(Attribute, typeattributes_table,
|
mapper(Attribute, typeattributes_table,
|
||||||
@@ -46,7 +48,6 @@ mapper(Attribute, typeattributes_table,
|
|||||||
|
|
||||||
mapper(AttributeInfo, attributes_table,
|
mapper(AttributeInfo, attributes_table,
|
||||||
properties={
|
properties={
|
||||||
"icon" : relation(Icon),
|
|
||||||
"unit" : relation(Unit),
|
"unit" : relation(Unit),
|
||||||
"ID" : synonym("attributeID"),
|
"ID" : synonym("attributeID"),
|
||||||
"name" : synonym("attributeName"),
|
"name" : synonym("attributeName"),
|
||||||
|
|||||||
@@ -17,22 +17,21 @@
|
|||||||
# along with eos. If not, see <http://www.gnu.org/licenses/>.
|
# along with eos. If not, see <http://www.gnu.org/licenses/>.
|
||||||
# ===============================================================================
|
# ===============================================================================
|
||||||
|
|
||||||
from sqlalchemy import Column, String, Integer, ForeignKey, Boolean, Table
|
from sqlalchemy import Boolean, Column, Integer, String, Table
|
||||||
from sqlalchemy.orm import relation, mapper, synonym, deferred
|
from sqlalchemy.orm import deferred, mapper, synonym
|
||||||
|
|
||||||
from eos.db import gamedata_meta
|
from eos.db import gamedata_meta
|
||||||
from eos.gamedata import Category, Icon
|
from eos.gamedata import Category
|
||||||
|
|
||||||
categories_table = Table("invcategories", gamedata_meta,
|
categories_table = Table("invcategories", gamedata_meta,
|
||||||
Column("categoryID", Integer, primary_key=True),
|
Column("categoryID", Integer, primary_key=True),
|
||||||
Column("categoryName", String),
|
Column("categoryName", String),
|
||||||
Column("description", String),
|
Column("description", String),
|
||||||
Column("published", Boolean),
|
Column("published", Boolean),
|
||||||
Column("iconID", Integer, ForeignKey("icons.iconID")))
|
Column("iconID", Integer))
|
||||||
|
|
||||||
mapper(Category, categories_table,
|
mapper(Category, categories_table,
|
||||||
properties={
|
properties={
|
||||||
"icon" : relation(Icon),
|
|
||||||
"ID" : synonym("categoryID"),
|
"ID" : synonym("categoryID"),
|
||||||
"name" : synonym("categoryName"),
|
"name" : synonym("categoryName"),
|
||||||
"description": deferred(categories_table.c.description)
|
"description": deferred(categories_table.c.description)
|
||||||
|
|||||||
65
eos/db/gamedata/dynamicAttributes.py
Normal file
65
eos/db/gamedata/dynamicAttributes.py
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
# ===============================================================================
|
||||||
|
# Copyright (C) 2010 Diego Duclos
|
||||||
|
#
|
||||||
|
# This file is part of eos.
|
||||||
|
#
|
||||||
|
# eos is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# eos is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Lesser General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Lesser General Public License
|
||||||
|
# along with eos. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
# ===============================================================================
|
||||||
|
|
||||||
|
from sqlalchemy import Column, Float, Integer, Table, ForeignKey
|
||||||
|
from sqlalchemy.orm import mapper, relation, synonym
|
||||||
|
from sqlalchemy.ext.associationproxy import association_proxy
|
||||||
|
|
||||||
|
from eos.db import gamedata_meta
|
||||||
|
from eos.gamedata import DynamicItem, DynamicItemAttribute, DynamicItemItem, Item
|
||||||
|
|
||||||
|
from eos.gamedata import AttributeInfo
|
||||||
|
|
||||||
|
dynamic_table = Table("mutaplasmids", gamedata_meta,
|
||||||
|
Column("typeID", ForeignKey("invtypes.typeID"), primary_key=True, index=True),
|
||||||
|
Column("resultingTypeID", ForeignKey("invtypes.typeID"), primary_key=True))
|
||||||
|
|
||||||
|
dynamicAttributes_table = Table("mutaplasmidAttributes", gamedata_meta,
|
||||||
|
Column("typeID", Integer, ForeignKey("mutaplasmids.typeID"), primary_key=True),
|
||||||
|
Column("attributeID", ForeignKey("dgmattribs.attributeID"), primary_key=True),
|
||||||
|
Column("min", Float),
|
||||||
|
Column("max", Float))
|
||||||
|
|
||||||
|
dynamicApplicable_table = Table("mutaplasmidItems", gamedata_meta,
|
||||||
|
Column("typeID", ForeignKey("mutaplasmids.typeID"), primary_key=True),
|
||||||
|
Column("applicableTypeID", ForeignKey("invtypes.typeID"), primary_key=True),)
|
||||||
|
|
||||||
|
mapper(DynamicItem, dynamic_table, properties={
|
||||||
|
"attributes": relation(DynamicItemAttribute),
|
||||||
|
"item": relation(Item, foreign_keys=[dynamic_table.c.typeID]),
|
||||||
|
"resultingItem": relation(Item, foreign_keys=[dynamic_table.c.resultingTypeID]),
|
||||||
|
"ID": synonym("typeID"),
|
||||||
|
})
|
||||||
|
|
||||||
|
mapper(DynamicItemAttribute, dynamicAttributes_table,
|
||||||
|
properties={"info": relation(AttributeInfo, lazy=False)})
|
||||||
|
|
||||||
|
mapper(DynamicItemItem, dynamicApplicable_table, properties={
|
||||||
|
"mutaplasmid": relation(DynamicItem),
|
||||||
|
})
|
||||||
|
|
||||||
|
DynamicItemAttribute.ID = association_proxy("info", "attributeID")
|
||||||
|
DynamicItemAttribute.name = association_proxy("info", "attributeName")
|
||||||
|
DynamicItemAttribute.description = association_proxy("info", "description")
|
||||||
|
DynamicItemAttribute.published = association_proxy("info", "published")
|
||||||
|
DynamicItemAttribute.displayName = association_proxy("info", "displayName")
|
||||||
|
DynamicItemAttribute.highIsGood = association_proxy("info", "highIsGood")
|
||||||
|
DynamicItemAttribute.iconID = association_proxy("info", "iconID")
|
||||||
|
DynamicItemAttribute.icon = association_proxy("info", "icon")
|
||||||
|
DynamicItemAttribute.unit = association_proxy("info", "unit")
|
||||||
@@ -18,10 +18,10 @@
|
|||||||
# ===============================================================================
|
# ===============================================================================
|
||||||
|
|
||||||
from sqlalchemy import Column, String, Integer, Boolean, ForeignKey, Table
|
from sqlalchemy import Column, String, Integer, Boolean, ForeignKey, Table
|
||||||
from sqlalchemy.orm import relation, mapper, synonym, deferred
|
from sqlalchemy.orm import relation, mapper, synonym, deferred, backref
|
||||||
|
|
||||||
from eos.db import gamedata_meta
|
from eos.db import gamedata_meta
|
||||||
from eos.gamedata import Category, Group, Icon
|
from eos.gamedata import Category, Group
|
||||||
|
|
||||||
groups_table = Table("invgroups", gamedata_meta,
|
groups_table = Table("invgroups", gamedata_meta,
|
||||||
Column("groupID", Integer, primary_key=True),
|
Column("groupID", Integer, primary_key=True),
|
||||||
@@ -29,12 +29,11 @@ groups_table = Table("invgroups", gamedata_meta,
|
|||||||
Column("description", String),
|
Column("description", String),
|
||||||
Column("published", Boolean),
|
Column("published", Boolean),
|
||||||
Column("categoryID", Integer, ForeignKey("invcategories.categoryID")),
|
Column("categoryID", Integer, ForeignKey("invcategories.categoryID")),
|
||||||
Column("iconID", Integer, ForeignKey("icons.iconID")))
|
Column("iconID", Integer))
|
||||||
|
|
||||||
mapper(Group, groups_table,
|
mapper(Group, groups_table,
|
||||||
properties={
|
properties={
|
||||||
"category" : relation(Category, backref="groups"),
|
"category" : relation(Category, backref=backref("groups", cascade="all,delete")),
|
||||||
"icon" : relation(Icon),
|
|
||||||
"ID" : synonym("groupID"),
|
"ID" : synonym("groupID"),
|
||||||
"name" : synonym("groupName"),
|
"name" : synonym("groupName"),
|
||||||
"description": deferred(groups_table.c.description)
|
"description": deferred(groups_table.c.description)
|
||||||
|
|||||||
@@ -1,35 +0,0 @@
|
|||||||
# ===============================================================================
|
|
||||||
# Copyright (C) 2010 Diego Duclos
|
|
||||||
#
|
|
||||||
# This file is part of eos.
|
|
||||||
#
|
|
||||||
# eos is free software: you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU Lesser General Public License as published by
|
|
||||||
# the Free Software Foundation, either version 2 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
#
|
|
||||||
# eos is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU Lesser General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU Lesser General Public License
|
|
||||||
# along with eos. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
# ===============================================================================
|
|
||||||
|
|
||||||
from sqlalchemy import Column, String, Integer, Table
|
|
||||||
from sqlalchemy.orm import mapper, synonym, deferred
|
|
||||||
|
|
||||||
from eos.db import gamedata_meta
|
|
||||||
from eos.gamedata import Icon
|
|
||||||
|
|
||||||
icons_table = Table("icons", gamedata_meta,
|
|
||||||
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)
|
|
||||||
})
|
|
||||||
@@ -17,14 +17,15 @@
|
|||||||
# along with eos. If not, see <http://www.gnu.org/licenses/>.
|
# along with eos. If not, see <http://www.gnu.org/licenses/>.
|
||||||
# ===============================================================================
|
# ===============================================================================
|
||||||
|
|
||||||
from sqlalchemy import Column, String, Integer, Boolean, ForeignKey, Table, Float
|
from sqlalchemy import Boolean, Column, Float, ForeignKey, Integer, String, Table
|
||||||
from sqlalchemy.ext.associationproxy import association_proxy
|
from sqlalchemy.ext.associationproxy import association_proxy
|
||||||
from sqlalchemy.orm import relation, mapper, synonym, deferred
|
from sqlalchemy.orm import backref, deferred, mapper, relation, synonym
|
||||||
from sqlalchemy.orm.collections import attribute_mapped_collection
|
from sqlalchemy.orm.collections import attribute_mapped_collection
|
||||||
from eos.db.gamedata.effect import typeeffects_table
|
|
||||||
|
|
||||||
from eos.db import gamedata_meta
|
from eos.db import gamedata_meta
|
||||||
from eos.gamedata import Attribute, Effect, Group, Icon, Item, MetaType, Traits
|
from eos.db.gamedata.dynamicAttributes import dynamicApplicable_table
|
||||||
|
from eos.db.gamedata.effect import typeeffects_table
|
||||||
|
from eos.gamedata import Attribute, DynamicItem, Effect, Group, Item, MetaType, Traits
|
||||||
|
|
||||||
items_table = Table("invtypes", gamedata_meta,
|
items_table = Table("invtypes", gamedata_meta,
|
||||||
Column("typeID", Integer, primary_key=True),
|
Column("typeID", Integer, primary_key=True),
|
||||||
@@ -37,16 +38,17 @@ items_table = Table("invtypes", gamedata_meta,
|
|||||||
Column("capacity", Float),
|
Column("capacity", Float),
|
||||||
Column("published", Boolean),
|
Column("published", Boolean),
|
||||||
Column("marketGroupID", Integer, ForeignKey("invmarketgroups.marketGroupID")),
|
Column("marketGroupID", Integer, ForeignKey("invmarketgroups.marketGroupID")),
|
||||||
Column("iconID", Integer, ForeignKey("icons.iconID")),
|
Column("iconID", Integer),
|
||||||
Column("groupID", Integer, ForeignKey("invgroups.groupID"), index=True))
|
Column("graphicID", Integer),
|
||||||
|
Column("groupID", Integer, ForeignKey("invgroups.groupID"), index=True),
|
||||||
|
Column("replacements", String))
|
||||||
|
|
||||||
from .metaGroup import metatypes_table # noqa
|
from .metaGroup import metatypes_table # noqa
|
||||||
from .traits import traits_table # noqa
|
from .traits import traits_table # noqa
|
||||||
|
|
||||||
mapper(Item, items_table,
|
mapper(Item, items_table,
|
||||||
properties={
|
properties={
|
||||||
"group" : relation(Group, backref="items"),
|
"group" : relation(Group, backref=backref("items", cascade="all,delete")),
|
||||||
"icon" : relation(Icon),
|
|
||||||
"_Item__attributes": relation(Attribute, cascade='all, delete, delete-orphan', collection_class=attribute_mapped_collection('name')),
|
"_Item__attributes": relation(Attribute, cascade='all, delete, delete-orphan', collection_class=attribute_mapped_collection('name')),
|
||||||
"effects": relation(Effect, secondary=typeeffects_table, collection_class=attribute_mapped_collection('name')),
|
"effects": relation(Effect, secondary=typeeffects_table, collection_class=attribute_mapped_collection('name')),
|
||||||
"metaGroup" : relation(MetaType,
|
"metaGroup" : relation(MetaType,
|
||||||
@@ -57,7 +59,12 @@ mapper(Item, items_table,
|
|||||||
"description" : deferred(items_table.c.description),
|
"description" : deferred(items_table.c.description),
|
||||||
"traits" : relation(Traits,
|
"traits" : relation(Traits,
|
||||||
primaryjoin=traits_table.c.typeID == items_table.c.typeID,
|
primaryjoin=traits_table.c.typeID == items_table.c.typeID,
|
||||||
uselist=False)
|
uselist=False),
|
||||||
|
"mutaplasmids": relation(DynamicItem,
|
||||||
|
primaryjoin=dynamicApplicable_table.c.applicableTypeID == items_table.c.typeID,
|
||||||
|
secondaryjoin=dynamicApplicable_table.c.typeID == DynamicItem.typeID,
|
||||||
|
secondary=dynamicApplicable_table,
|
||||||
|
backref="applicableItems")
|
||||||
})
|
})
|
||||||
|
|
||||||
Item.category = association_proxy("group", "category")
|
Item.category = association_proxy("group", "category")
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ from sqlalchemy import Column, String, Integer, Boolean, ForeignKey, Table
|
|||||||
from sqlalchemy.orm import relation, mapper, synonym, deferred
|
from sqlalchemy.orm import relation, mapper, synonym, deferred
|
||||||
|
|
||||||
from eos.db import gamedata_meta
|
from eos.db import gamedata_meta
|
||||||
from eos.gamedata import Icon, Item, MarketGroup
|
from eos.gamedata import Item, MarketGroup
|
||||||
|
|
||||||
marketgroups_table = Table("invmarketgroups", gamedata_meta,
|
marketgroups_table = Table("invmarketgroups", gamedata_meta,
|
||||||
Column("marketGroupID", Integer, primary_key=True),
|
Column("marketGroupID", Integer, primary_key=True),
|
||||||
@@ -30,14 +30,13 @@ marketgroups_table = Table("invmarketgroups", gamedata_meta,
|
|||||||
Column("hasTypes", Boolean),
|
Column("hasTypes", Boolean),
|
||||||
Column("parentGroupID", Integer,
|
Column("parentGroupID", Integer,
|
||||||
ForeignKey("invmarketgroups.marketGroupID", initially="DEFERRED", deferrable=True)),
|
ForeignKey("invmarketgroups.marketGroupID", initially="DEFERRED", deferrable=True)),
|
||||||
Column("iconID", Integer, ForeignKey("icons.iconID")))
|
Column("iconID", Integer))
|
||||||
|
|
||||||
mapper(MarketGroup, marketgroups_table,
|
mapper(MarketGroup, marketgroups_table,
|
||||||
properties={
|
properties={
|
||||||
"items" : relation(Item, backref="marketGroup"),
|
"items" : relation(Item, backref="marketGroup"),
|
||||||
"parent" : relation(MarketGroup, backref="children",
|
"parent" : relation(MarketGroup, backref="children",
|
||||||
remote_side=[marketgroups_table.c.marketGroupID]),
|
remote_side=[marketgroups_table.c.marketGroupID]),
|
||||||
"icon" : relation(Icon),
|
|
||||||
"ID" : synonym("marketGroupID"),
|
"ID" : synonym("marketGroupID"),
|
||||||
"name" : synonym("marketGroupName"),
|
"name" : synonym("marketGroupName"),
|
||||||
"description": deferred(marketgroups_table.c.description)
|
"description": deferred(marketgroups_table.c.description)
|
||||||
|
|||||||
@@ -17,15 +17,16 @@
|
|||||||
# along with eos. If not, see <http://www.gnu.org/licenses/>.
|
# along with eos. If not, see <http://www.gnu.org/licenses/>.
|
||||||
# ===============================================================================
|
# ===============================================================================
|
||||||
|
|
||||||
from sqlalchemy.orm import join, exc, aliased
|
from sqlalchemy.inspection import inspect
|
||||||
|
from sqlalchemy.orm import aliased, exc, join
|
||||||
from sqlalchemy.sql import and_, or_, select
|
from sqlalchemy.sql import and_, or_, select
|
||||||
|
|
||||||
import eos.config
|
import eos.config
|
||||||
from eos.db import gamedata_session
|
from eos.db import gamedata_session
|
||||||
from eos.db.gamedata.metaGroup import metatypes_table, items_table
|
|
||||||
from eos.db.gamedata.group import groups_table
|
from eos.db.gamedata.group import groups_table
|
||||||
|
from eos.db.gamedata.metaGroup import items_table, metatypes_table
|
||||||
from eos.db.util import processEager, processWhere
|
from eos.db.util import processEager, processWhere
|
||||||
from eos.gamedata import AlphaClone, Attribute, Category, Group, Item, MarketGroup, MetaGroup, AttributeInfo, MetaData
|
from eos.gamedata import AlphaClone, Attribute, AttributeInfo, Category, DynamicItem, Group, Item, MarketGroup, MetaData, MetaGroup
|
||||||
|
|
||||||
cache = {}
|
cache = {}
|
||||||
configVal = getattr(eos.config, "gamedataCache", None)
|
configVal = getattr(eos.config, "gamedataCache", None)
|
||||||
@@ -97,6 +98,36 @@ def getItem(lookfor, eager=None):
|
|||||||
return item
|
return item
|
||||||
|
|
||||||
|
|
||||||
|
def getMutaplasmid(lookfor, eager=None):
|
||||||
|
if isinstance(lookfor, int):
|
||||||
|
item = gamedata_session.query(DynamicItem).filter(DynamicItem.ID == lookfor).first()
|
||||||
|
else:
|
||||||
|
raise TypeError("Need integer as argument")
|
||||||
|
return item
|
||||||
|
|
||||||
|
|
||||||
|
def getItemWithBaseItemAttribute(lookfor, baseItemID, eager=None):
|
||||||
|
# A lot of this is described in more detail in #1597
|
||||||
|
item = gamedata_session.query(Item).get(lookfor)
|
||||||
|
base = getItem(baseItemID)
|
||||||
|
|
||||||
|
# we have to load all attributes for this object, otherwise we'll lose access to them when we expunge.
|
||||||
|
# todo: figure out a way to eagerly load all these via the query...
|
||||||
|
for x in [*inspect(Item).relationships.keys(), 'description']:
|
||||||
|
getattr(item, x)
|
||||||
|
|
||||||
|
# Copy over the attributes from the base, but ise the items attributes when there's an overlap
|
||||||
|
# WARNING: the attribute object still has the old typeID. I don't believe we access this typeID anywhere in the code,
|
||||||
|
# but should keep this in mind for now.
|
||||||
|
item._Item__attributes = {**base.attributes, **item.attributes}
|
||||||
|
|
||||||
|
# Expunge the item form the session. This is required to have different Abyssal / Base combinations loaded in memory.
|
||||||
|
# Without expunging it, once one Abyssal Web is created, SQLAlchmey will use it for all others. We don't want this,
|
||||||
|
# we want to generate a completely new object to work with
|
||||||
|
gamedata_session.expunge(item)
|
||||||
|
return item
|
||||||
|
|
||||||
|
|
||||||
@cachedQuery(1, "lookfor")
|
@cachedQuery(1, "lookfor")
|
||||||
def getItems(lookfor, eager=None):
|
def getItems(lookfor, eager=None):
|
||||||
"""
|
"""
|
||||||
@@ -361,6 +392,25 @@ def directAttributeRequest(itemIDs, attrIDs):
|
|||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def getAbyssalTypes():
|
||||||
|
return set([r.resultingTypeID for r in gamedata_session.query(DynamicItem.resultingTypeID).distinct()])
|
||||||
|
|
||||||
|
|
||||||
|
@cachedQuery(1, "itemID")
|
||||||
|
def getDynamicItem(itemID, eager=None):
|
||||||
|
try:
|
||||||
|
if isinstance(itemID, int):
|
||||||
|
if eager is None:
|
||||||
|
result = gamedata_session.query(DynamicItem).filter(DynamicItem.ID == itemID).one()
|
||||||
|
else:
|
||||||
|
result = gamedata_session.query(DynamicItem).options(*processEager(eager)).filter(DynamicItem.ID == itemID).one()
|
||||||
|
else:
|
||||||
|
raise TypeError("Need integer as argument")
|
||||||
|
except exc.NoResultFound:
|
||||||
|
result = None
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
def getRequiredFor(itemID, attrMapping):
|
def getRequiredFor(itemID, attrMapping):
|
||||||
Attribute1 = aliased(Attribute)
|
Attribute1 = aliased(Attribute)
|
||||||
Attribute2 = aliased(Attribute)
|
Attribute2 = aliased(Attribute)
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ def upgrade(saveddata_engine):
|
|||||||
"boosters": 2,
|
"boosters": 2,
|
||||||
"cargo": 2,
|
"cargo": 2,
|
||||||
"characters": 2,
|
"characters": 2,
|
||||||
"crest": 1,
|
# "crest": 1,
|
||||||
"damagePatterns": 2,
|
"damagePatterns": 2,
|
||||||
"drones": 2,
|
"drones": 2,
|
||||||
"fighters": 2,
|
"fighters": 2,
|
||||||
|
|||||||
18
eos/db/migrations/upgrade28.py
Normal file
18
eos/db/migrations/upgrade28.py
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
"""
|
||||||
|
Migration 28
|
||||||
|
|
||||||
|
- adds baseItemID and mutaplasmidID to modules table
|
||||||
|
"""
|
||||||
|
import sqlalchemy
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade(saveddata_engine):
|
||||||
|
try:
|
||||||
|
saveddata_engine.execute("SELECT baseItemID FROM modules LIMIT 1")
|
||||||
|
except sqlalchemy.exc.DatabaseError:
|
||||||
|
saveddata_engine.execute("ALTER TABLE modules ADD COLUMN baseItemID INT;")
|
||||||
|
|
||||||
|
try:
|
||||||
|
saveddata_engine.execute("SELECT mutaplasmidID FROM modules LIMIT 1")
|
||||||
|
except sqlalchemy.exc.DatabaseError:
|
||||||
|
saveddata_engine.execute("ALTER TABLE modules ADD COLUMN mutaplasmidID INT;")
|
||||||
18
eos/db/migrations/upgrade29.py
Normal file
18
eos/db/migrations/upgrade29.py
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
"""
|
||||||
|
Migration 29
|
||||||
|
|
||||||
|
- adds spoolType and spoolAmount to modules table
|
||||||
|
"""
|
||||||
|
import sqlalchemy
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade(saveddata_engine):
|
||||||
|
try:
|
||||||
|
saveddata_engine.execute("SELECT spoolType FROM modules LIMIT 1")
|
||||||
|
except sqlalchemy.exc.DatabaseError:
|
||||||
|
saveddata_engine.execute("ALTER TABLE modules ADD COLUMN spoolType INT;")
|
||||||
|
|
||||||
|
try:
|
||||||
|
saveddata_engine.execute("SELECT spoolAmount FROM modules LIMIT 1")
|
||||||
|
except sqlalchemy.exc.DatabaseError:
|
||||||
|
saveddata_engine.execute("ALTER TABLE modules ADD COLUMN spoolAmount FLOAT;")
|
||||||
17
eos/db/migrations/upgrade30.py
Normal file
17
eos/db/migrations/upgrade30.py
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
"""
|
||||||
|
Migration 30
|
||||||
|
|
||||||
|
- changes to prices table
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
import sqlalchemy
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade(saveddata_engine):
|
||||||
|
try:
|
||||||
|
saveddata_engine.execute("SELECT status FROM prices LIMIT 1")
|
||||||
|
except sqlalchemy.exc.DatabaseError:
|
||||||
|
# Just drop table, table will be re-created by sqlalchemy and
|
||||||
|
# data will be re-fetched
|
||||||
|
saveddata_engine.execute("DROP TABLE prices;")
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
__all__ = [
|
__all__ = [
|
||||||
"character",
|
"character",
|
||||||
"fit",
|
"fit",
|
||||||
|
"mutator",
|
||||||
"module",
|
"module",
|
||||||
"user",
|
"user",
|
||||||
"skill",
|
"skill",
|
||||||
|
|||||||
@@ -29,9 +29,6 @@ from eos.saveddata.user import User
|
|||||||
from eos.saveddata.character import Character, Skill
|
from eos.saveddata.character import Character, Skill
|
||||||
from eos.saveddata.ssocharacter import SsoCharacter
|
from eos.saveddata.ssocharacter import SsoCharacter
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
characters_table = Table("characters", saveddata_meta,
|
characters_table = Table("characters", saveddata_meta,
|
||||||
Column("ID", Integer, primary_key=True),
|
Column("ID", Integer, primary_key=True),
|
||||||
Column("name", String, nullable=False),
|
Column("name", String, nullable=False),
|
||||||
|
|||||||
@@ -17,33 +17,32 @@
|
|||||||
# along with eos. If not, see <http://www.gnu.org/licenses/>.
|
# along with eos. If not, see <http://www.gnu.org/licenses/>.
|
||||||
# ===============================================================================
|
# ===============================================================================
|
||||||
|
|
||||||
from sqlalchemy.ext.associationproxy import association_proxy
|
|
||||||
from sqlalchemy.orm.collections import attribute_mapped_collection
|
|
||||||
from sqlalchemy.sql import and_
|
|
||||||
from sqlalchemy.orm import relation, reconstructor, mapper, relationship
|
|
||||||
from sqlalchemy import ForeignKey, Column, Integer, String, Table, Boolean, DateTime
|
|
||||||
import datetime
|
import datetime
|
||||||
|
|
||||||
from eos.db import saveddata_meta
|
from sqlalchemy import Boolean, Column, DateTime, ForeignKey, Integer, String, Table
|
||||||
from eos.db import saveddata_session
|
from sqlalchemy.ext.associationproxy import association_proxy
|
||||||
|
from sqlalchemy.orm import mapper, reconstructor, relation, relationship
|
||||||
|
from sqlalchemy.orm.collections import attribute_mapped_collection
|
||||||
|
from sqlalchemy.sql import and_
|
||||||
|
|
||||||
|
from eos.db import saveddata_meta, saveddata_session
|
||||||
from eos.db.saveddata.cargo import cargo_table
|
from eos.db.saveddata.cargo import cargo_table
|
||||||
from eos.db.saveddata.drone import drones_table
|
from eos.db.saveddata.drone import drones_table
|
||||||
from eos.db.saveddata.fighter import fighters_table
|
from eos.db.saveddata.fighter import fighters_table
|
||||||
from eos.db.saveddata.implant import fitImplants_table
|
from eos.db.saveddata.implant import fitImplants_table
|
||||||
from eos.db.saveddata.module import modules_table
|
from eos.db.saveddata.module import modules_table
|
||||||
from eos.effectHandlerHelpers import HandledModuleList, HandledImplantBoosterList, HandledProjectedModList, \
|
from eos.effectHandlerHelpers import HandledDroneCargoList, HandledImplantBoosterList, HandledModuleList, HandledProjectedDroneList, HandledProjectedModList
|
||||||
HandledDroneCargoList, HandledProjectedDroneList
|
|
||||||
from eos.saveddata.implant import Implant
|
|
||||||
from eos.saveddata.character import Character
|
|
||||||
from eos.saveddata.user import User
|
|
||||||
from eos.saveddata.fighter import Fighter
|
|
||||||
from eos.saveddata.fit import Fit as es_Fit, ImplantLocation
|
|
||||||
from eos.saveddata.drone import Drone
|
|
||||||
from eos.saveddata.booster import Booster
|
from eos.saveddata.booster import Booster
|
||||||
from eos.saveddata.module import Module
|
|
||||||
from eos.saveddata.cargo import Cargo
|
from eos.saveddata.cargo import Cargo
|
||||||
|
from eos.saveddata.character import Character
|
||||||
from eos.saveddata.damagePattern import DamagePattern
|
from eos.saveddata.damagePattern import DamagePattern
|
||||||
|
from eos.saveddata.drone import Drone
|
||||||
|
from eos.saveddata.fighter import Fighter
|
||||||
|
from eos.saveddata.fit import Fit as es_Fit
|
||||||
|
from eos.saveddata.implant import Implant
|
||||||
|
from eos.saveddata.module import Module
|
||||||
from eos.saveddata.targetResists import TargetResists
|
from eos.saveddata.targetResists import TargetResists
|
||||||
|
from eos.saveddata.user import User
|
||||||
|
|
||||||
fits_table = Table("fits", saveddata_meta,
|
fits_table = Table("fits", saveddata_meta,
|
||||||
Column("ID", Integer, primary_key=True),
|
Column("ID", Integer, primary_key=True),
|
||||||
@@ -56,7 +55,7 @@ fits_table = Table("fits", saveddata_meta,
|
|||||||
Column("booster", Boolean, nullable=False, index=True, default=0),
|
Column("booster", Boolean, nullable=False, index=True, default=0),
|
||||||
Column("targetResistsID", ForeignKey("targetResists.ID"), nullable=True),
|
Column("targetResistsID", ForeignKey("targetResists.ID"), nullable=True),
|
||||||
Column("modeID", Integer, nullable=True),
|
Column("modeID", Integer, nullable=True),
|
||||||
Column("implantLocation", Integer, nullable=False, default=ImplantLocation.FIT),
|
Column("implantLocation", Integer, nullable=False),
|
||||||
Column("notes", String, nullable=True),
|
Column("notes", String, nullable=True),
|
||||||
Column("ignoreRestrictions", Boolean, default=0),
|
Column("ignoreRestrictions", Boolean, default=0),
|
||||||
Column("created", DateTime, nullable=True, default=datetime.datetime.now),
|
Column("created", DateTime, nullable=True, default=datetime.datetime.now),
|
||||||
@@ -132,13 +131,13 @@ class CommandFit(object):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
es_Fit._Fit__projectedFits = association_proxy(
|
es_Fit.projectedFitDict = association_proxy(
|
||||||
"victimOf", # look at the victimOf association...
|
"victimOf", # look at the victimOf association...
|
||||||
"source_fit", # .. and return the source fits
|
"source_fit", # .. and return the source fits
|
||||||
creator=lambda sourceID, source_fit: ProjectedFit(sourceID, source_fit)
|
creator=lambda sourceID, source_fit: ProjectedFit(sourceID, source_fit)
|
||||||
)
|
)
|
||||||
|
|
||||||
es_Fit._Fit__commandFits = association_proxy(
|
es_Fit.commandFitDict = association_proxy(
|
||||||
"boostedOf", # look at the boostedOf association...
|
"boostedOf", # look at the boostedOf association...
|
||||||
"booster_fit", # .. and return the booster fit
|
"booster_fit", # .. and return the booster fit
|
||||||
creator=lambda boosterID, booster_fit: CommandFit(boosterID, booster_fit)
|
creator=lambda boosterID, booster_fit: CommandFit(boosterID, booster_fit)
|
||||||
|
|||||||
@@ -17,18 +17,22 @@
|
|||||||
# along with eos. If not, see <http://www.gnu.org/licenses/>.
|
# along with eos. If not, see <http://www.gnu.org/licenses/>.
|
||||||
# ===============================================================================
|
# ===============================================================================
|
||||||
|
|
||||||
from sqlalchemy import Table, Column, Integer, ForeignKey, CheckConstraint, Boolean, DateTime
|
from sqlalchemy import Table, Column, Integer, Float, ForeignKey, CheckConstraint, Boolean, DateTime
|
||||||
|
from sqlalchemy.orm.collections import attribute_mapped_collection
|
||||||
from sqlalchemy.orm import relation, mapper
|
from sqlalchemy.orm import relation, mapper
|
||||||
import datetime
|
import datetime
|
||||||
|
|
||||||
from eos.db import saveddata_meta
|
from eos.db import saveddata_meta
|
||||||
from eos.saveddata.module import Module
|
from eos.saveddata.module import Module
|
||||||
|
from eos.saveddata.mutator import Mutator
|
||||||
from eos.saveddata.fit import Fit
|
from eos.saveddata.fit import Fit
|
||||||
|
|
||||||
modules_table = Table("modules", saveddata_meta,
|
modules_table = Table("modules", saveddata_meta,
|
||||||
Column("ID", Integer, primary_key=True),
|
Column("ID", Integer, primary_key=True),
|
||||||
Column("fitID", Integer, ForeignKey("fits.ID"), nullable=False, index=True),
|
Column("fitID", Integer, ForeignKey("fits.ID"), nullable=False, index=True),
|
||||||
Column("itemID", Integer, nullable=True),
|
Column("itemID", Integer, nullable=True),
|
||||||
|
Column("baseItemID", Integer, nullable=True),
|
||||||
|
Column("mutaplasmidID", Integer, nullable=True),
|
||||||
Column("dummySlot", Integer, nullable=True, default=None),
|
Column("dummySlot", Integer, nullable=True, default=None),
|
||||||
Column("chargeID", Integer),
|
Column("chargeID", Integer),
|
||||||
Column("state", Integer, CheckConstraint("state >= -1"), CheckConstraint("state <= 2")),
|
Column("state", Integer, CheckConstraint("state >= -1"), CheckConstraint("state <= 2")),
|
||||||
@@ -36,7 +40,17 @@ modules_table = Table("modules", saveddata_meta,
|
|||||||
Column("position", Integer),
|
Column("position", Integer),
|
||||||
Column("created", DateTime, nullable=True, default=datetime.datetime.now),
|
Column("created", DateTime, nullable=True, default=datetime.datetime.now),
|
||||||
Column("modified", DateTime, nullable=True, onupdate=datetime.datetime.now),
|
Column("modified", DateTime, nullable=True, onupdate=datetime.datetime.now),
|
||||||
|
Column("spoolType", Integer, nullable=True),
|
||||||
|
Column("spoolAmount", Float, nullable=True),
|
||||||
CheckConstraint('("dummySlot" = NULL OR "itemID" = NULL) AND "dummySlot" != "itemID"'))
|
CheckConstraint('("dummySlot" = NULL OR "itemID" = NULL) AND "dummySlot" != "itemID"'))
|
||||||
|
|
||||||
mapper(Module, modules_table,
|
mapper(Module, modules_table,
|
||||||
properties={"owner": relation(Fit)})
|
properties={
|
||||||
|
"owner": relation(Fit),
|
||||||
|
"mutators": relation(
|
||||||
|
Mutator,
|
||||||
|
backref="module",
|
||||||
|
cascade="all,delete-orphan",
|
||||||
|
collection_class=attribute_mapped_collection('attrID')
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|||||||
35
eos/db/saveddata/mutator.py
Normal file
35
eos/db/saveddata/mutator.py
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
# ===============================================================================
|
||||||
|
# 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/>.
|
||||||
|
# ===============================================================================
|
||||||
|
|
||||||
|
import datetime
|
||||||
|
|
||||||
|
from sqlalchemy import Column, DateTime, Float, ForeignKey, Integer, Table
|
||||||
|
from sqlalchemy.orm import mapper
|
||||||
|
|
||||||
|
from eos.db import saveddata_meta
|
||||||
|
from eos.saveddata.mutator import Mutator
|
||||||
|
|
||||||
|
mutator_table = Table("mutators", saveddata_meta,
|
||||||
|
Column("moduleID", Integer, ForeignKey("modules.ID"), primary_key=True, index=True),
|
||||||
|
Column("attrID", Integer, primary_key=True, index=True),
|
||||||
|
Column("value", Float, nullable=False),
|
||||||
|
Column("created", DateTime, nullable=True, default=datetime.datetime.now),
|
||||||
|
Column("modified", DateTime, nullable=True, onupdate=datetime.datetime.now))
|
||||||
|
|
||||||
|
mapper(Mutator, mutator_table)
|
||||||
@@ -17,18 +17,19 @@
|
|||||||
# along with eos. If not, see <http://www.gnu.org/licenses/>.
|
# along with eos. If not, see <http://www.gnu.org/licenses/>.
|
||||||
# ===============================================================================
|
# ===============================================================================
|
||||||
|
|
||||||
|
|
||||||
from sqlalchemy import Table, Column, Float, Integer
|
from sqlalchemy import Table, Column, Float, Integer
|
||||||
from sqlalchemy.orm import mapper
|
from sqlalchemy.orm import mapper
|
||||||
|
|
||||||
from eos.db import saveddata_meta
|
from eos.db import saveddata_meta
|
||||||
from eos.saveddata.price import Price
|
from eos.saveddata.price import Price
|
||||||
|
|
||||||
|
|
||||||
prices_table = Table("prices", saveddata_meta,
|
prices_table = Table("prices", saveddata_meta,
|
||||||
Column("typeID", Integer, primary_key=True),
|
Column("typeID", Integer, primary_key=True),
|
||||||
Column("price", Float, default=0.0),
|
Column("price", Float, default=0.0),
|
||||||
Column("time", Integer, nullable=False),
|
Column("time", Integer, nullable=False),
|
||||||
Column("failed", Integer))
|
Column("status", Integer, nullable=False))
|
||||||
|
|
||||||
mapper(Price, prices_table, properties={
|
|
||||||
"_Price__price": prices_table.c.price,
|
mapper(Price, prices_table)
|
||||||
})
|
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import sys
|
|||||||
|
|
||||||
from sqlalchemy.sql import and_
|
from sqlalchemy.sql import and_
|
||||||
from sqlalchemy import desc, select
|
from sqlalchemy import desc, select
|
||||||
|
from sqlalchemy import func
|
||||||
|
|
||||||
from eos.db import saveddata_session, sd_lock
|
from eos.db import saveddata_session, sd_lock
|
||||||
from eos.db.saveddata.fit import projectedFits_table
|
from eos.db.saveddata.fit import projectedFits_table
|
||||||
@@ -283,6 +284,12 @@ def countAllFits():
|
|||||||
return count
|
return count
|
||||||
|
|
||||||
|
|
||||||
|
def countFitGroupedByShip():
|
||||||
|
with sd_lock:
|
||||||
|
count = eos.db.saveddata_session.query(Fit.shipID, func.count(Fit.shipID)).group_by(Fit.shipID).all()
|
||||||
|
return count
|
||||||
|
|
||||||
|
|
||||||
def countFitsWithShip(lookfor, ownerID=None, where=None, eager=None):
|
def countFitsWithShip(lookfor, ownerID=None, where=None, eager=None):
|
||||||
"""
|
"""
|
||||||
Get all the fits using a certain ship.
|
Get all the fits using a certain ship.
|
||||||
@@ -542,8 +549,17 @@ def commit():
|
|||||||
with sd_lock:
|
with sd_lock:
|
||||||
try:
|
try:
|
||||||
saveddata_session.commit()
|
saveddata_session.commit()
|
||||||
saveddata_session.flush()
|
except Exception:
|
||||||
except Exception as ex:
|
saveddata_session.rollback()
|
||||||
|
exc_info = sys.exc_info()
|
||||||
|
raise exc_info[0](exc_info[1]).with_traceback(exc_info[2])
|
||||||
|
|
||||||
|
|
||||||
|
def flush():
|
||||||
|
with sd_lock:
|
||||||
|
try:
|
||||||
|
saveddata_session.flush()
|
||||||
|
except Exception:
|
||||||
saveddata_session.rollback()
|
saveddata_session.rollback()
|
||||||
exc_info = sys.exc_info()
|
exc_info = sys.exc_info()
|
||||||
raise exc_info[0](exc_info[1]).with_traceback(exc_info[2])
|
raise exc_info[0](exc_info[1]).with_traceback(exc_info[2])
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
# ===============================================================================
|
# ===============================================================================
|
||||||
|
|
||||||
from logbook import Logger
|
from logbook import Logger
|
||||||
|
from utils.deprecated import deprecated
|
||||||
|
|
||||||
pyfalog = Logger(__name__)
|
pyfalog = Logger(__name__)
|
||||||
|
|
||||||
@@ -113,6 +114,7 @@ class HandledList(list):
|
|||||||
|
|
||||||
|
|
||||||
class HandledModuleList(HandledList):
|
class HandledModuleList(HandledList):
|
||||||
|
|
||||||
def append(self, mod):
|
def append(self, mod):
|
||||||
emptyPosition = float("Inf")
|
emptyPosition = float("Inf")
|
||||||
for i in range(len(self)):
|
for i in range(len(self)):
|
||||||
@@ -130,12 +132,32 @@ class HandledModuleList(HandledList):
|
|||||||
self.remove(mod)
|
self.remove(mod)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
self.appendIgnoreEmpty(mod)
|
||||||
|
|
||||||
|
def appendIgnoreEmpty(self, mod):
|
||||||
mod.position = len(self)
|
mod.position = len(self)
|
||||||
HandledList.append(self, mod)
|
HandledList.append(self, mod)
|
||||||
if mod.isInvalid:
|
if mod.isInvalid:
|
||||||
self.remove(mod)
|
self.remove(mod)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
def replaceRackPosition(self, rackPosition, mod):
|
||||||
|
listPositions = []
|
||||||
|
for currMod in self:
|
||||||
|
if currMod.slot == mod.slot:
|
||||||
|
listPositions.append(currMod.position)
|
||||||
|
listPositions.sort()
|
||||||
|
try:
|
||||||
|
modListPosition = listPositions[rackPosition]
|
||||||
|
except IndexError:
|
||||||
|
self.appendIgnoreEmpty(mod)
|
||||||
|
else:
|
||||||
|
self.toDummy(modListPosition)
|
||||||
|
if not mod.isEmpty:
|
||||||
|
self.toModule(modListPosition, mod)
|
||||||
|
if mod.isInvalid:
|
||||||
|
self.toDummy(modListPosition)
|
||||||
|
|
||||||
def insert(self, index, mod):
|
def insert(self, index, mod):
|
||||||
mod.position = index
|
mod.position = index
|
||||||
i = index
|
i = index
|
||||||
@@ -163,6 +185,7 @@ class HandledModuleList(HandledList):
|
|||||||
mod.position = index
|
mod.position = index
|
||||||
self[index] = mod
|
self[index] = mod
|
||||||
|
|
||||||
|
@deprecated
|
||||||
def freeSlot(self, slot):
|
def freeSlot(self, slot):
|
||||||
for i in range(len(self)):
|
for i in range(len(self)):
|
||||||
mod = self[i]
|
mod = self[i]
|
||||||
@@ -195,14 +218,20 @@ class HandledImplantBoosterList(HandledList):
|
|||||||
self.remove(thing)
|
self.remove(thing)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
self.makeRoom(thing)
|
||||||
|
HandledList.append(self, thing)
|
||||||
|
|
||||||
|
def makeRoom(self, thing):
|
||||||
# if needed, remove booster that was occupying slot
|
# if needed, remove booster that was occupying slot
|
||||||
oldObj = next((m for m in self if m.slot == thing.slot), None)
|
oldObj = next((m for m in self if m.slot == thing.slot), None)
|
||||||
if oldObj:
|
if oldObj:
|
||||||
pyfalog.info("Slot {0} occupied with {1}, replacing with {2}", thing.slot, oldObj.item.name, thing.item.name)
|
pyfalog.info("Slot {0} occupied with {1}, replacing with {2}", thing.slot, oldObj.item.name,
|
||||||
|
thing.item.name)
|
||||||
|
itemID = oldObj.itemID
|
||||||
oldObj.itemID = 0 # hack to remove from DB. See GH issue #324
|
oldObj.itemID = 0 # hack to remove from DB. See GH issue #324
|
||||||
self.remove(oldObj)
|
self.remove(oldObj)
|
||||||
|
return itemID
|
||||||
HandledList.append(self, thing)
|
return None
|
||||||
|
|
||||||
|
|
||||||
class HandledSsoCharacterList(list):
|
class HandledSsoCharacterList(list):
|
||||||
@@ -225,22 +254,30 @@ class HandledProjectedModList(HandledList):
|
|||||||
return
|
return
|
||||||
|
|
||||||
proj.projected = True
|
proj.projected = True
|
||||||
isSystemEffect = proj.item.group.name == "Effect Beacon"
|
|
||||||
|
|
||||||
if isSystemEffect:
|
if proj.isExclusiveSystemEffect:
|
||||||
# remove other system effects - only 1 per fit plz
|
self.makeRoom(proj)
|
||||||
oldEffect = next((m for m in self if m.item.group.name == "Effect Beacon"), None)
|
|
||||||
|
|
||||||
if oldEffect:
|
|
||||||
pyfalog.info("System effect occupied with {0}, replacing with {1}", oldEffect.item.name, proj.item.name)
|
|
||||||
self.remove(oldEffect)
|
|
||||||
|
|
||||||
HandledList.append(self, proj)
|
HandledList.append(self, proj)
|
||||||
|
|
||||||
# Remove non-projectable modules
|
# Remove non-projectable modules
|
||||||
if not proj.item.isType("projected") and not isSystemEffect:
|
if not proj.item.isType("projected") and not proj.isExclusiveSystemEffect:
|
||||||
self.remove(proj)
|
self.remove(proj)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def currentSystemEffect(self):
|
||||||
|
return next((m for m in self if m.isExclusiveSystemEffect), None)
|
||||||
|
|
||||||
|
def makeRoom(self, proj):
|
||||||
|
# remove other system effects - only 1 per fit plz
|
||||||
|
oldEffect = self.currentSystemEffect
|
||||||
|
|
||||||
|
if oldEffect:
|
||||||
|
pyfalog.info("System effect occupied with {0}, replacing with {1}", oldEffect.item.name, proj.item.name)
|
||||||
|
self.remove(oldEffect)
|
||||||
|
return oldEffect.itemID
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
class HandledProjectedDroneList(HandledDroneCargoList):
|
class HandledProjectedDroneList(HandledDroneCargoList):
|
||||||
def append(self, proj):
|
def append(self, proj):
|
||||||
|
|||||||
35599
eos/effects.py
Normal file
35599
eos/effects.py
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,19 +0,0 @@
|
|||||||
# ===============================================================================
|
|
||||||
# Copyright (C) 2010 Diego Duclos
|
|
||||||
# 2010 Anton Vorobyov
|
|
||||||
#
|
|
||||||
# This file, as well as all files in this folder, are 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/>.
|
|
||||||
# ===============================================================================
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
# accerationControlCapNeedBonusPostPercentCapacitorNeedLocationShipGroupAfterburner
|
|
||||||
#
|
|
||||||
# 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"))
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
# accerationControlSkillAb&MwdSpeedBoost
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# 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",
|
|
||||||
"speedFactor", container.getModifiedItemAttr("speedFBonus") * level)
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
# accerationControlSpeedFBonusPostPercentSpeedFactorLocationShipGroupAfterburner
|
|
||||||
#
|
|
||||||
# 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"))
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
# accessDifficultyBonusModifierRequiringArchaelogy
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Modules named like: Emission Scope Sharpener (8 of 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",
|
|
||||||
container.getModifiedItemAttr("accessDifficultyBonusModifier"), position="post")
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
# accessDifficultyBonusModifierRequiringHacking
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Modules named like: Memetic Algorithm Bank (8 of 8)
|
|
||||||
# Implant: Neural Lace 'Blackglass' Net Intrusion 920-40
|
|
||||||
# Implant: Poteque 'Prospector' Environmental Analysis EY-1005
|
|
||||||
# Implant: Poteque 'Prospector' Hacking HC-905
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, container, context):
|
|
||||||
fit.modules.filteredItemIncrease(lambda c: c.item.requiresSkill("Hacking"),
|
|
||||||
"accessDifficultyBonus",
|
|
||||||
container.getModifiedItemAttr("accessDifficultyBonusModifier"), position="post")
|
|
||||||
@@ -1,125 +0,0 @@
|
|||||||
# adaptiveArmorHardener
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Module: Reactive Armor Hardener
|
|
||||||
from logbook import Logger
|
|
||||||
import eos.config
|
|
||||||
|
|
||||||
pyfalog = Logger(__name__)
|
|
||||||
|
|
||||||
runTime = "late"
|
|
||||||
type = "active"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, module, context):
|
|
||||||
damagePattern = fit.damagePattern
|
|
||||||
|
|
||||||
static_adaptive_behavior = eos.config.settings['useStaticAdaptiveArmorHardener']
|
|
||||||
|
|
||||||
if (damagePattern.emAmount == damagePattern.thermalAmount == damagePattern.kineticAmount == damagePattern.explosiveAmount) and static_adaptive_behavior:
|
|
||||||
pyfalog.debug("Setting adaptivearmorhardener resists to uniform profile.")
|
|
||||||
return
|
|
||||||
|
|
||||||
# Skip if there is no damage pattern. Example: projected ships or fleet boosters
|
|
||||||
if damagePattern:
|
|
||||||
|
|
||||||
# Populate a tuple with the damage profile modified by current armor resists.
|
|
||||||
baseDamageTaken = (
|
|
||||||
damagePattern.emAmount * fit.ship.getModifiedItemAttr('armorEmDamageResonance'),
|
|
||||||
damagePattern.thermalAmount * fit.ship.getModifiedItemAttr('armorThermalDamageResonance'),
|
|
||||||
damagePattern.kineticAmount * fit.ship.getModifiedItemAttr('armorKineticDamageResonance'),
|
|
||||||
damagePattern.explosiveAmount * fit.ship.getModifiedItemAttr('armorExplosiveDamageResonance'),
|
|
||||||
)
|
|
||||||
# pyfalog.debug("Damage Adjusted for Armor Resists: %f/%f/%f/%f", baseDamageTaken[0], baseDamageTaken[1], baseDamageTaken[2], baseDamageTaken[3])
|
|
||||||
|
|
||||||
resistanceShiftAmount = module.getModifiedItemAttr(
|
|
||||||
'resistanceShiftAmount') / 100 # The attribute is in percent and we want a fraction
|
|
||||||
RAHResistance = [
|
|
||||||
module.getModifiedItemAttr('armorEmDamageResonance'),
|
|
||||||
module.getModifiedItemAttr('armorThermalDamageResonance'),
|
|
||||||
module.getModifiedItemAttr('armorKineticDamageResonance'),
|
|
||||||
module.getModifiedItemAttr('armorExplosiveDamageResonance'),
|
|
||||||
]
|
|
||||||
|
|
||||||
# Simulate RAH cycles until the RAH either stops changing or enters a loop.
|
|
||||||
# The number of iterations is limited to prevent an infinite loop if something goes wrong.
|
|
||||||
cycleList = []
|
|
||||||
loopStart = -20
|
|
||||||
for num in range(50):
|
|
||||||
# pyfalog.debug("Starting cycle %d.", num)
|
|
||||||
# The strange order is to emulate the ingame sorting when different types have taken the same amount of damage.
|
|
||||||
# This doesn't take into account stacking penalties. In a few cases fitting a Damage Control causes an inaccurate result.
|
|
||||||
damagePattern_tuples = [
|
|
||||||
(0, baseDamageTaken[0] * RAHResistance[0], RAHResistance[0]),
|
|
||||||
(3, baseDamageTaken[3] * RAHResistance[3], RAHResistance[3]),
|
|
||||||
(2, baseDamageTaken[2] * RAHResistance[2], RAHResistance[2]),
|
|
||||||
(1, baseDamageTaken[1] * RAHResistance[1], RAHResistance[1]),
|
|
||||||
]
|
|
||||||
|
|
||||||
# Sort the tuple to drop the highest damage value to the bottom
|
|
||||||
sortedDamagePattern_tuples = sorted(damagePattern_tuples, key=lambda damagePattern: damagePattern[1])
|
|
||||||
|
|
||||||
if sortedDamagePattern_tuples[2][1] == 0:
|
|
||||||
# One damage type: the top damage type takes from the other three
|
|
||||||
# Since the resistances not taking damage will end up going to the type taking damage we just do the whole thing at once.
|
|
||||||
change0 = 1 - sortedDamagePattern_tuples[0][2]
|
|
||||||
change1 = 1 - sortedDamagePattern_tuples[1][2]
|
|
||||||
change2 = 1 - sortedDamagePattern_tuples[2][2]
|
|
||||||
change3 = -(change0 + change1 + change2)
|
|
||||||
elif sortedDamagePattern_tuples[1][1] == 0:
|
|
||||||
# Two damage types: the top two damage types take from the other two
|
|
||||||
# Since the resistances not taking damage will end up going equally to the types taking damage we just do the whole thing at once.
|
|
||||||
change0 = 1 - sortedDamagePattern_tuples[0][2]
|
|
||||||
change1 = 1 - sortedDamagePattern_tuples[1][2]
|
|
||||||
change2 = -(change0 + change1) / 2
|
|
||||||
change3 = -(change0 + change1) / 2
|
|
||||||
else:
|
|
||||||
# Three or four damage types: the top two damage types take from the other two
|
|
||||||
change0 = min(resistanceShiftAmount, 1 - sortedDamagePattern_tuples[0][2])
|
|
||||||
change1 = min(resistanceShiftAmount, 1 - sortedDamagePattern_tuples[1][2])
|
|
||||||
change2 = -(change0 + change1) / 2
|
|
||||||
change3 = -(change0 + change1) / 2
|
|
||||||
|
|
||||||
RAHResistance[sortedDamagePattern_tuples[0][0]] = sortedDamagePattern_tuples[0][2] + change0
|
|
||||||
RAHResistance[sortedDamagePattern_tuples[1][0]] = sortedDamagePattern_tuples[1][2] + change1
|
|
||||||
RAHResistance[sortedDamagePattern_tuples[2][0]] = sortedDamagePattern_tuples[2][2] + change2
|
|
||||||
RAHResistance[sortedDamagePattern_tuples[3][0]] = sortedDamagePattern_tuples[3][2] + change3
|
|
||||||
# pyfalog.debug("Resistances shifted to %f/%f/%f/%f", RAHResistance[0], RAHResistance[1], RAHResistance[2], RAHResistance[3])
|
|
||||||
|
|
||||||
# See if the current RAH profile has been encountered before, indicating a loop.
|
|
||||||
for i, val in enumerate(cycleList):
|
|
||||||
tolerance = 1e-06
|
|
||||||
if abs(RAHResistance[0] - val[0]) <= tolerance and \
|
|
||||||
abs(RAHResistance[1] - val[1]) <= tolerance and \
|
|
||||||
abs(RAHResistance[2] - val[2]) <= tolerance and \
|
|
||||||
abs(RAHResistance[3] - val[3]) <= tolerance:
|
|
||||||
loopStart = i
|
|
||||||
# pyfalog.debug("Loop found: %d-%d", loopStart, num)
|
|
||||||
break
|
|
||||||
if loopStart >= 0:
|
|
||||||
break
|
|
||||||
|
|
||||||
cycleList.append(list(RAHResistance))
|
|
||||||
|
|
||||||
if loopStart < 0:
|
|
||||||
pyfalog.error("Reactive Armor Hardener failed to find equilibrium. Damage profile after armor: {0}/{1}/{2}/{3}",
|
|
||||||
baseDamageTaken[0], baseDamageTaken[1], baseDamageTaken[2], baseDamageTaken[3])
|
|
||||||
|
|
||||||
# Average the profiles in the RAH loop, or the last 20 if it didn't find a loop.
|
|
||||||
loopCycles = cycleList[loopStart:]
|
|
||||||
numCycles = len(loopCycles)
|
|
||||||
average = [0, 0, 0, 0]
|
|
||||||
for cycle in loopCycles:
|
|
||||||
for i in range(4):
|
|
||||||
average[i] += cycle[i]
|
|
||||||
|
|
||||||
for i in range(4):
|
|
||||||
average[i] = round(average[i] / numCycles, 3)
|
|
||||||
|
|
||||||
# Set the new resistances
|
|
||||||
# pyfalog.debug("Setting new resist profile: %f/%f/%f/%f", average[0], average[1], average[2],average[3])
|
|
||||||
for i, attr in enumerate((
|
|
||||||
'armorEmDamageResonance', 'armorThermalDamageResonance', 'armorKineticDamageResonance',
|
|
||||||
'armorExplosiveDamageResonance')):
|
|
||||||
module.increaseItemAttr(attr, average[i] - module.getModifiedItemAttr(attr))
|
|
||||||
fit.ship.multiplyItemAttr(attr, average[i], stackingPenalties=True, penaltyGroup="preMul")
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
# addToSignatureRadius2
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Modules from group: Missile Launcher Bomb (2 of 2)
|
|
||||||
# Modules from group: Shield Extender (33 of 33)
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, module, context):
|
|
||||||
fit.ship.increaseItemAttr("signatureRadius", module.getModifiedItemAttr("signatureRadiusAdd"))
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
# afterburnerDurationBonusPostPercentDurationLocationShipModulesRequiringAfterburner
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Implants named like: Eifyr and Co. 'Rogue' Afterburner AB (6 of 6)
|
|
||||||
# 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)
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
# agilityBonus
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Subsystems named like: Propulsion Interdiction Nullifier (4 of 4)
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, src, context):
|
|
||||||
fit.ship.increaseItemAttr("agility", src.getModifiedItemAttr("agilityBonusAdd"))
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
# agilityMultiplierEffect
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Modules from group: Inertial Stabilizer (7 of 7)
|
|
||||||
# Modules from group: Nanofiber Internal Structure (7 of 7)
|
|
||||||
# Modules from group: Reinforced Bulkhead (8 of 8)
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, module, context):
|
|
||||||
fit.ship.boostItemAttr("agility",
|
|
||||||
module.getModifiedItemAttr("agilityMultiplier"),
|
|
||||||
stackingPenalties=True)
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
# agilityMultiplierEffectPassive
|
|
||||||
#
|
|
||||||
# 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)
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
# ammoFallofMultiplier
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Charges from group: Advanced Artillery Ammo (8 of 8)
|
|
||||||
# Charges from group: Advanced Autocannon Ammo (8 of 8)
|
|
||||||
# Charges from group: Advanced Beam Laser Crystal (8 of 8)
|
|
||||||
# Charges from group: Advanced Blaster Charge (8 of 8)
|
|
||||||
# Charges from group: Advanced Pulse Laser Crystal (8 of 8)
|
|
||||||
# Charges from group: Advanced Railgun Charge (8 of 8)
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, module, context):
|
|
||||||
module.multiplyItemAttr("falloff", module.getModifiedChargeAttr("fallofMultiplier") or 1)
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
# ammoInfluenceCapNeed
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Items from category: Charge (478 of 928)
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, module, context):
|
|
||||||
# Dirty hack to work around cap charges setting cap booster
|
|
||||||
# injection amount to zero
|
|
||||||
rawAttr = module.item.getAttribute("capacitorNeed")
|
|
||||||
if rawAttr is not None and rawAttr >= 0:
|
|
||||||
module.boostItemAttr("capacitorNeed", module.getModifiedChargeAttr("capNeedBonus") or 0)
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
# ammoInfluenceRange
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Items from category: Charge (572 of 928)
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, module, context):
|
|
||||||
module.multiplyItemAttr("maxRange", module.getModifiedChargeAttr("weaponRangeMultiplier"))
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
# ammoSpeedMultiplier
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Charges from group: Festival Charges (23 of 23)
|
|
||||||
# Charges from group: Interdiction Probe (2 of 2)
|
|
||||||
# Charges from group: Structure Festival Charges (3 of 3)
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, module, context):
|
|
||||||
module.multiplyItemAttr("speed", module.getModifiedChargeAttr("speedMultiplier") or 1)
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
# ammoTrackingMultiplier
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Charges from group: Advanced Artillery Ammo (8 of 8)
|
|
||||||
# Charges from group: Advanced Autocannon Ammo (8 of 8)
|
|
||||||
# Charges from group: Advanced Beam Laser Crystal (8 of 8)
|
|
||||||
# Charges from group: Advanced Blaster Charge (8 of 8)
|
|
||||||
# Charges from group: Advanced Pulse Laser Crystal (8 of 8)
|
|
||||||
# Charges from group: Advanced Railgun Charge (8 of 8)
|
|
||||||
# Charges from group: Projectile Ammo (128 of 128)
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, module, context):
|
|
||||||
module.multiplyItemAttr("trackingSpeed", module.getModifiedChargeAttr("trackingSpeedMultiplier"))
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
# angelsetbonus
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Implants named like: grade Halo (18 of 18)
|
|
||||||
runTime = "early"
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, implant, context):
|
|
||||||
fit.appliedImplants.filteredItemMultiply(
|
|
||||||
lambda implant: "signatureRadiusBonus" in implant.itemModifiedAttributes and
|
|
||||||
"implantSetAngel" in implant.itemModifiedAttributes,
|
|
||||||
"signatureRadiusBonus",
|
|
||||||
implant.getModifiedItemAttr("implantSetAngel"))
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
# antiWarpScramblingPassive
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Modules from group: Warp Core Stabilizer (8 of 8)
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, module, context):
|
|
||||||
fit.ship.increaseItemAttr("warpScrambleStatus", module.getModifiedItemAttr("warpScrambleStrength"))
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
# archaeologySkillVirusBonus
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Modules named like: Emission Scope Sharpener (8 of 8)
|
|
||||||
# Implant: Poteque 'Prospector' Archaeology AC-905
|
|
||||||
# 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"),
|
|
||||||
"virusCoherence", container.getModifiedItemAttr("virusCoherenceBonus") * level)
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
# armorAllRepairSystemsAmountBonusPassive
|
|
||||||
#
|
|
||||||
# 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"))
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
# armorDamageAmountBonusCapitalArmorRepairers
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Modules named like: Auxiliary Nano Pump (8 of 8)
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, implant, context):
|
|
||||||
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Capital Repair Systems"),
|
|
||||||
"armorDamageAmount", implant.getModifiedItemAttr("repairBonus"),
|
|
||||||
stackingPenalties=True)
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
# 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)
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
# 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"))
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
# 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)
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
# armorHPBonusAdd
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Modules from group: Armor Reinforcer (48 of 48)
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, module, context):
|
|
||||||
fit.ship.increaseItemAttr("armorHP", module.getModifiedItemAttr("armorHPBonusAdd"))
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
# armorHPBonusAddPassive
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Subsystems from group: Defensive Systems (9 of 12)
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, module, context):
|
|
||||||
fit.ship.increaseItemAttr("armorHP", module.getModifiedItemAttr("armorHPBonusAdd") or 0)
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
# armorHPMultiply
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Modules from group: Armor Coating (202 of 202)
|
|
||||||
# Modules from group: Armor Plating Energized (187 of 187)
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, module, context):
|
|
||||||
fit.ship.multiplyItemAttr("armorHP", module.getModifiedItemAttr("armorHPMultiplier"))
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
# armorReinforcerMassAdd
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Modules from group: Armor Reinforcer (48 of 48)
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, module, context):
|
|
||||||
fit.ship.increaseItemAttr("mass", module.getModifiedItemAttr("massAddition"))
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
# armorRepair
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# 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)
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
# armorRepairAmountBonusSubcap
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Implants named like: grade Asklepian (15 of 18)
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, src, context):
|
|
||||||
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Repair Systems"),
|
|
||||||
"armorDamageAmount", src.getModifiedItemAttr("armorRepairBonus"))
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
# 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"))
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
# armorRepairProjectorMaxRangeBonus
|
|
||||||
#
|
|
||||||
# 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", "maxRange",
|
|
||||||
src.getModifiedItemAttr("maxRangeBonus"))
|
|
||||||
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Ancillary Remote Armor Repairer", "maxRange",
|
|
||||||
src.getModifiedItemAttr("maxRangeBonus"))
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
# armorUpgradesMassPenaltyReductionBonus
|
|
||||||
#
|
|
||||||
# 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",
|
|
||||||
"massAddition", container.getModifiedItemAttr("massPenaltyReduction") * level)
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
# Not used by any item
|
|
||||||
type = "gang", "active"
|
|
||||||
gangBonus = "armorHpBonus2"
|
|
||||||
gangBoost = "armorHP"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, module, context):
|
|
||||||
if "gang" not in context:
|
|
||||||
return
|
|
||||||
fit.ship.boostItemAttr("armorHP", module.getModifiedItemAttr("armorHpBonus2"))
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
# astrogeologyMiningAmountBonusPostPercentMiningAmountLocationShipModulesRequiringMining
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Implants named like: Inherent Implants 'Highwall' Mining MX (3 of 3)
|
|
||||||
# Implant: Michi's Excavation Augmentor
|
|
||||||
# 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"),
|
|
||||||
"miningAmount", container.getModifiedItemAttr("miningAmountBonus") * level)
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
# baseMaxScanDeviationModifierModuleOnline2None
|
|
||||||
#
|
|
||||||
# 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"),
|
|
||||||
stackingPenalties=True)
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
# baseMaxScanDeviationModifierRequiringAstrometrics
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Implants named like: Poteque 'Prospector' Astrometric Pinpointing AP (3 of 3)
|
|
||||||
# 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)
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
# baseSensorStrengthModifierModule
|
|
||||||
#
|
|
||||||
# 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"),
|
|
||||||
stackingPenalties=True)
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
# baseSensorStrengthModifierRequiringAstrometrics
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Modules from group: Scan Probe Launcher (4 of 7)
|
|
||||||
# Implants named like: Poteque 'Prospector' Astrometric Rangefinding AR (3 of 3)
|
|
||||||
# Implants named like: grade Virtue (10 of 12)
|
|
||||||
# Modules named like: Gravity Capacitor Upgrade (8 of 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
|
|
||||||
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Astrometrics"),
|
|
||||||
"baseSensorStrength", container.getModifiedItemAttr("scanStrengthBonus") * level,
|
|
||||||
stackingPenalties=penalized)
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
# battlecruiserDroneSpeed
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Ship: Myrmidon
|
|
||||||
# Ship: Prophecy
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, ship, context):
|
|
||||||
fit.drones.filteredItemBoost(lambda drone: drone.item.requiresSkill("Drones"),
|
|
||||||
"maxVelocity", ship.getModifiedItemAttr("roleBonusCBC"))
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
# battlecruiserMETRange
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Ships named like: Harbinger (2 of 2)
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, ship, context):
|
|
||||||
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Medium Energy Turret"),
|
|
||||||
"maxRange", ship.getModifiedItemAttr("roleBonusCBC"))
|
|
||||||
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Medium Energy Turret"),
|
|
||||||
"falloff", ship.getModifiedItemAttr("roleBonusCBC"))
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
# battlecruiserMHTRange
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Ships named like: Brutix (2 of 2)
|
|
||||||
# Ship: Ferox
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, ship, context):
|
|
||||||
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Medium Hybrid Turret"),
|
|
||||||
"maxRange", ship.getModifiedItemAttr("roleBonusCBC"))
|
|
||||||
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Medium Hybrid Turret"),
|
|
||||||
"falloff", ship.getModifiedItemAttr("roleBonusCBC"))
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
# battlecruiserMissileRange
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Ships named like: Drake (2 of 2)
|
|
||||||
# Ship: Cyclone
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, skill, context):
|
|
||||||
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Missile Launcher Operation"),
|
|
||||||
"maxVelocity", skill.getModifiedItemAttr("roleBonusCBC"))
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
# battlecruiserMPTRange
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Ships named like: Hurricane (2 of 2)
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, ship, context):
|
|
||||||
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Medium Projectile Turret"),
|
|
||||||
"maxRange", ship.getModifiedItemAttr("roleBonusCBC"))
|
|
||||||
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Medium Projectile Turret"),
|
|
||||||
"falloff", ship.getModifiedItemAttr("roleBonusCBC"))
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
# bcLargeEnergyTurretCapacitorNeedBonus
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Ship: Oracle
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, ship, context):
|
|
||||||
fit.modules.filteredItemMultiply(lambda mod: mod.item.requiresSkill("Large Energy Turret"),
|
|
||||||
"capacitorNeed", ship.getModifiedItemAttr("bcLargeTurretCap"))
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
# bcLargeEnergyTurretCPUNeedBonus
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Ship: Oracle
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, ship, context):
|
|
||||||
fit.modules.filteredItemMultiply(lambda mod: mod.item.requiresSkill("Large Energy Turret"),
|
|
||||||
"cpu", ship.getModifiedItemAttr("bcLargeTurretCPU"))
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
# bcLargeEnergyTurretPowerNeedBonus
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Ship: Oracle
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, ship, context):
|
|
||||||
fit.modules.filteredItemMultiply(lambda mod: mod.item.requiresSkill("Large Energy Turret"),
|
|
||||||
"power", ship.getModifiedItemAttr("bcLargeTurretPower"))
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
# bcLargeHybridTurretCapacitorNeedBonus
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Ship: Naga
|
|
||||||
# Ship: Talos
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, ship, context):
|
|
||||||
fit.modules.filteredItemMultiply(lambda mod: mod.item.requiresSkill("Large Hybrid Turret"),
|
|
||||||
"capacitorNeed", ship.getModifiedItemAttr("bcLargeTurretCap"))
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
# bcLargeHybridTurretCPUNeedBonus
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Ship: Naga
|
|
||||||
# Ship: Talos
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, ship, context):
|
|
||||||
fit.modules.filteredItemMultiply(lambda mod: mod.item.requiresSkill("Large Hybrid Turret"),
|
|
||||||
"cpu", ship.getModifiedItemAttr("bcLargeTurretCPU"))
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
# bcLargeHybridTurretPowerNeedBonus
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Ship: Naga
|
|
||||||
# Ship: Talos
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, ship, context):
|
|
||||||
fit.modules.filteredItemMultiply(lambda mod: mod.item.requiresSkill("Large Hybrid Turret"),
|
|
||||||
"power", ship.getModifiedItemAttr("bcLargeTurretPower"))
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
# bcLargeProjectileTurretCPUNeedBonus
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Ship: Tornado
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, ship, context):
|
|
||||||
fit.modules.filteredItemMultiply(lambda mod: mod.item.requiresSkill("Large Projectile Turret"),
|
|
||||||
"cpu", ship.getModifiedItemAttr("bcLargeTurretCPU"))
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
# bcLargeProjectileTurretPowerNeedBonus
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Ship: Tornado
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, ship, context):
|
|
||||||
fit.modules.filteredItemMultiply(lambda mod: mod.item.requiresSkill("Large Projectile Turret"),
|
|
||||||
"power", ship.getModifiedItemAttr("bcLargeTurretPower"))
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
# biologyTimeBonusFixed
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Implants named like: Eifyr and Co. 'Alchemist' Biology BY (2 of 2)
|
|
||||||
# Skill: Biology
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, container, context):
|
|
||||||
level = container.level if "skill" in context else 1
|
|
||||||
fit.boosters.filteredItemBoost(lambda bst: True, "boosterDuration",
|
|
||||||
container.getModifiedItemAttr("durationBonus") * level)
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
# blockadeRunnerCloakCpuPercentBonus
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Ships from group: Blockade Runner (4 of 4)
|
|
||||||
type = "passive"
|
|
||||||
runTime = "early"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, ship, context):
|
|
||||||
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Cloaking Device",
|
|
||||||
"cpu", ship.getModifiedItemAttr("eliteIndustrialCovertCloakBonus"),
|
|
||||||
skill="Transport Ships")
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
# boosterArmorHpPenalty
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Implants from group: Booster (12 of 62)
|
|
||||||
type = "boosterSideEffect"
|
|
||||||
|
|
||||||
# User-friendly name for the side effect
|
|
||||||
displayName = "Armor Capacity"
|
|
||||||
|
|
||||||
# Attribute that this effect targets
|
|
||||||
attr = "boosterArmorHPPenalty"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, booster, context):
|
|
||||||
fit.ship.boostItemAttr("armorHP", booster.getModifiedItemAttr(attr))
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
# boosterArmorRepairAmountPenalty
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Implants named like: Drop Booster (3 of 4)
|
|
||||||
# Implants named like: Mindflood Booster (3 of 4)
|
|
||||||
# Implants named like: Sooth Sayer Booster (3 of 4)
|
|
||||||
type = "boosterSideEffect"
|
|
||||||
|
|
||||||
# User-friendly name for the side effect
|
|
||||||
displayName = "Armor Repair Amount"
|
|
||||||
|
|
||||||
# Attribute that this effect targets
|
|
||||||
attr = "boosterArmorRepairAmountPenalty"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, booster, context):
|
|
||||||
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Armor Repair Unit",
|
|
||||||
"armorDamageAmount", booster.getModifiedItemAttr(attr))
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
# boosterCapacitorCapacityPenalty
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Implants named like: Blue Pill Booster (3 of 5)
|
|
||||||
# Implants named like: Exile Booster (3 of 4)
|
|
||||||
type = "boosterSideEffect"
|
|
||||||
|
|
||||||
# User-friendly name for the side effect
|
|
||||||
displayName = "Cap Capacity"
|
|
||||||
|
|
||||||
# Attribute that this effect targets
|
|
||||||
attr = "boosterCapacitorCapacityPenalty"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, booster, context):
|
|
||||||
fit.ship.boostItemAttr("capacitorCapacity", booster.getModifiedItemAttr(attr))
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
# boosterMaxVelocityPenalty
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Implants from group: Booster (12 of 62)
|
|
||||||
type = "boosterSideEffect"
|
|
||||||
|
|
||||||
# User-friendly name for the side effect
|
|
||||||
displayName = "Velocity"
|
|
||||||
|
|
||||||
# Attribute that this effect targets
|
|
||||||
attr = "boosterMaxVelocityPenalty"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, booster, context):
|
|
||||||
fit.ship.boostItemAttr("maxVelocity", booster.getModifiedItemAttr(attr))
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
# boosterMissileExplosionCloudPenaltyFixed
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Implants named like: Exile Booster (3 of 4)
|
|
||||||
# Implants named like: Mindflood Booster (3 of 4)
|
|
||||||
type = "boosterSideEffect"
|
|
||||||
|
|
||||||
# User-friendly name for the side effect
|
|
||||||
displayName = "Missile Explosion Radius"
|
|
||||||
|
|
||||||
# Attribute that this effect targets
|
|
||||||
attr = "boosterMissileAOECloudPenalty"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, booster, context):
|
|
||||||
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Missile Launcher Operation"),
|
|
||||||
"aoeCloudSize", booster.getModifiedItemAttr(attr))
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
# boosterMissileExplosionVelocityPenalty
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Implants named like: Blue Pill Booster (3 of 5)
|
|
||||||
type = "boosterSideEffect"
|
|
||||||
|
|
||||||
# User-friendly name for the side effect
|
|
||||||
displayName = "Missile Explosion Velocity"
|
|
||||||
|
|
||||||
# Attribute that this effect targets
|
|
||||||
attr = "boosterAOEVelocityPenalty"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, booster, context):
|
|
||||||
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Missile Launcher Operation"),
|
|
||||||
"aoeVelocity", booster.getModifiedItemAttr(attr))
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
# boosterMissileVelocityPenalty
|
|
||||||
#
|
|
||||||
# Used by:
|
|
||||||
# Implants named like: Crash Booster (3 of 4)
|
|
||||||
# Implants named like: X Instinct Booster (3 of 4)
|
|
||||||
type = "boosterSideEffect"
|
|
||||||
|
|
||||||
# User-friendly name for the side effect
|
|
||||||
displayName = "Missile Velocity"
|
|
||||||
|
|
||||||
# Attribute that this effect targets
|
|
||||||
attr = "boosterMissileVelocityPenalty"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, booster, context):
|
|
||||||
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Missile Launcher Operation"),
|
|
||||||
"maxVelocity", booster.getModifiedItemAttr(attr))
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user