Compare commits
795 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2a224e8882 | ||
|
|
0a00d86c6d | ||
|
|
c3d1eaef2a | ||
|
|
93f23b549b | ||
|
|
b3d0554df6 | ||
|
|
dba54e3ec8 | ||
|
|
09421db28e | ||
|
|
941edd6715 | ||
|
|
fdac5309ac | ||
|
|
449c7d6aa2 | ||
|
|
b60b190b81 | ||
|
|
3cb8313669 | ||
|
|
436113dedc | ||
|
|
194ebb96a7 | ||
|
|
fc04a32913 | ||
|
|
deee6fd6ab | ||
|
|
a4fae73a1e | ||
|
|
7bad3bc376 | ||
|
|
7dd1c63898 | ||
|
|
3ed949395e | ||
|
|
6ebc90b8aa | ||
|
|
cbd1a34c68 | ||
|
|
e0c389a643 | ||
|
|
591dcffa43 | ||
|
|
b0317ea560 | ||
|
|
fb5d62304c | ||
|
|
8baac1e207 | ||
|
|
dfc0a896c4 | ||
|
|
41b6000f6e | ||
|
|
193faaafe7 | ||
|
|
672fd77bec | ||
|
|
1fe35f5aab | ||
|
|
07b8f5b914 | ||
|
|
1f50e7cb51 | ||
|
|
572d337935 | ||
|
|
01f8c65304 | ||
|
|
a1ee8b49ef | ||
|
|
0745ed50e0 | ||
|
|
76e66a99ff | ||
|
|
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 | ||
|
|
3f0fc3c44b | ||
|
|
375e8de33f | ||
|
|
9d04f06f69 | ||
|
|
0297ec47f6 | ||
|
|
75e1e48ba8 | ||
|
|
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 | ||
|
|
46f5a592ce | ||
|
|
f854627888 | ||
|
|
5ec8468d3f | ||
|
|
0da4e4359b | ||
|
|
c5e8742838 | ||
|
|
f9f90852c5 | ||
|
|
6b5f2450ad | ||
|
|
4f2e962a46 | ||
|
|
05ce8fbf1c | ||
|
|
929b2dfb38 | ||
|
|
659e0e5ead | ||
|
|
7bb44f6473 | ||
|
|
60f024fdb7 | ||
|
|
da601c9a63 | ||
|
|
7464de06b1 | ||
|
|
20fbda9e7a | ||
|
|
15bbf69fcf | ||
|
|
677a9b33c5 | ||
|
|
e9efdcd4e8 | ||
|
|
c3b0b7d1e1 | ||
|
|
d46a2d61bb | ||
|
|
673a2e25e3 | ||
|
|
749adb9ec8 | ||
|
|
5cab8b1070 | ||
|
|
00637f84cb | ||
|
|
bc5a43bfb3 | ||
|
|
723ef5c48d | ||
|
|
53c1a77aeb | ||
|
|
e5389d44d9 | ||
|
|
54b2e5b5fb | ||
|
|
1276016a98 | ||
|
|
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 | ||
|
|
c1e239b9b3 | ||
|
|
26aaeabd7f | ||
|
|
0e0bc9dfd2 | ||
|
|
df24313bcf | ||
|
|
8990cbfd6a | ||
|
|
8f34c03289 | ||
|
|
c1322a3566 | ||
|
|
5101e2851a | ||
|
|
7b7f67ad2e | ||
|
|
dbdc566ae4 | ||
|
|
f4fd991907 | ||
|
|
42ad74158b | ||
|
|
c99afa79e1 | ||
|
|
789c3b869a | ||
|
|
7d8d87662b | ||
|
|
645a5ced14 | ||
|
|
56a3911b96 | ||
|
|
5ed98e8fed | ||
|
|
a1c894bb22 | ||
|
|
32c6dcdb79 | ||
|
|
842be9535b | ||
|
|
7b6cb25ac4 | ||
|
|
f12370389c | ||
|
|
fc35d7bb26 | ||
|
|
94e1515b43 | ||
|
|
95c1f7bde0 | ||
|
|
dba86edff2 | ||
|
|
e2d8a3a4e8 | ||
|
|
090065ddd4 | ||
|
|
acade56769 | ||
|
|
d52c249921 | ||
|
|
0b9a50cd8d | ||
|
|
25bbfec318 | ||
|
|
1192c26b8f | ||
|
|
4a3201ffd4 | ||
|
|
406a22100d | ||
|
|
2547cf70c2 | ||
|
|
1fc4eab1ce | ||
|
|
e1e4efde7a | ||
|
|
cf5769e0f8 | ||
|
|
a8b1f38e84 | ||
|
|
e83fa4d40b | ||
|
|
c552cb5e40 | ||
|
|
49b1e2ee36 | ||
|
|
aec9202be1 | ||
|
|
363904411d | ||
|
|
49bc9f50bc | ||
|
|
30501feb99 | ||
|
|
efc07e1553 | ||
|
|
9bbeec523e | ||
|
|
943ee517f4 | ||
|
|
18bb3bf246 | ||
|
|
117d51caab | ||
|
|
a3e411f225 | ||
|
|
083af3ebc7 | ||
|
|
3fd4d106d9 | ||
|
|
7c376c93a2 | ||
|
|
4ef7b645a8 | ||
|
|
cccc7ff2d0 | ||
|
|
b7c45f4c6e | ||
|
|
3964658d9a | ||
|
|
03212be54a | ||
|
|
46098f2127 | ||
|
|
2005d0b0b9 | ||
|
|
3293380515 | ||
|
|
68e5b22fe2 | ||
|
|
0f7dd7cc0c | ||
|
|
0713251685 | ||
|
|
3fda62e320 | ||
|
|
5f1c2d6676 | ||
|
|
c0ba559ca6 | ||
|
|
164720db3d | ||
|
|
bd90ec4bf0 | ||
|
|
d7e24dfa8f | ||
|
|
2f1ad21392 | ||
|
|
687d539534 | ||
|
|
bd6793bc19 | ||
|
|
6dd6452c11 | ||
|
|
e59a1cd27b | ||
|
|
24d14d5e19 | ||
|
|
e0584367c5 | ||
|
|
a2f48e8944 | ||
|
|
95ba18f8a9 | ||
|
|
122d8ef367 | ||
|
|
281d2ed1f4 | ||
|
|
48924774f9 | ||
|
|
ee00914a2b | ||
|
|
ed3083aa77 | ||
|
|
48d90c1eca | ||
|
|
415b3db809 | ||
|
|
53451dfaf6 | ||
|
|
49181dce2b | ||
|
|
199763bcca | ||
|
|
033647da61 | ||
|
|
00e8e9d84a | ||
|
|
96b701687b | ||
|
|
e1e90cc23e | ||
|
|
f41ecae8c8 | ||
|
|
65ec8cf4ee | ||
|
|
4fc93f7089 | ||
|
|
3ec01a20c2 | ||
|
|
8a10f0a766 | ||
|
|
0db125177f | ||
|
|
a3f532f62f | ||
|
|
234f36c8c0 | ||
|
|
2c3957b2db | ||
|
|
79deca41c1 | ||
|
|
570df7f645 | ||
|
|
8153b80d05 | ||
|
|
b74654a5b3 | ||
|
|
4c6f68b07e | ||
|
|
9839efc2dc | ||
|
|
9d379d966c | ||
|
|
61086989dc | ||
|
|
023ea43611 | ||
|
|
044e032ab3 | ||
|
|
da7b95041d | ||
|
|
f52f39984f | ||
|
|
1513b07071 | ||
|
|
be19b7414a | ||
|
|
75f9a0252a | ||
|
|
5169c35d5c | ||
|
|
bbdf1ee6cc | ||
|
|
6c6e8a9972 | ||
|
|
97742b08c8 | ||
|
|
8ef4c61fc3 | ||
|
|
ff607e4b03 | ||
|
|
4b2a58ca6f | ||
|
|
0de950862b | ||
|
|
30c1ab125c | ||
|
|
8276746dad | ||
|
|
5560ef4d34 | ||
|
|
fac31f7254 | ||
|
|
1efcc8d3ef | ||
|
|
03c2088e6b | ||
|
|
5c20ee7ade | ||
|
|
04c62aabea | ||
|
|
0994158abd | ||
|
|
77a66a66ea | ||
|
|
0b615b578a | ||
|
|
53f07db5fe | ||
|
|
4d4815d6af | ||
|
|
b296e0709c | ||
|
|
373e0a390b | ||
|
|
222037ff40 | ||
|
|
4fac10ccb7 | ||
|
|
fe1c4cc4d4 | ||
|
|
ed649dd4c7 | ||
|
|
33eccaa374 | ||
|
|
7b0f672f04 | ||
|
|
33bf5234d0 | ||
|
|
cb392e7e5f | ||
|
|
dfba033190 | ||
|
|
5fbe623ae6 | ||
|
|
e025bff99b | ||
|
|
e77dddc15b | ||
|
|
eea8019593 | ||
|
|
c7360c8cc3 | ||
|
|
2376148380 | ||
|
|
9e8166c13d |
143
.appveyor.yml
143
.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
|
||||||
|
|||||||
57
.travis.yml
57
.travis.yml
@@ -1,39 +1,28 @@
|
|||||||
|
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: hBxkenj8FCtM7O5qw/ikdp1rErJiqp/3A/fY8Y273TNVii+y+EEqcwERcUz3fOYj0CuxquU/1aeKMlTfypEPU6fGt0FMlgRDul61yZrs0Dnig4ZwjgQ0SAE6Y+RjztCLp3IzxZXXMxSfRpyKVsc3Nfv3K97ReNkzrj3cKtSpDF9xhW7MV7MOjK8vzol/aGDA2YmHPR7dFJotSebAXQWBrxAgWOWgmaZL0dFtLgrjVUOcM4o2XWNDmByJr9q86r9qIPkPp8M7dRCBzAYkWnAEqfj8h2W9Bp5p/HWhmznO5Ph5/wzEvPpG2YLofgoyRopdBX21eikfA9bI/fCH/ii+eyX8ainZWFfZiDPVH6IXCNfBd+ux6/a8Cq/rcaZ2a9/1MTTMtZqQ5PcMDaoaeghDjHx8H/QWguPTSZMxZ5FCeKpoYJad7/J3a/w4MVb6bdwB23pnXol//vlQd66FXy80SeP3tc0NIdpN3pS/UtDTn5cAqKn2XNWMkQfOZi8GC5tFnEkWRCob+OLN/sJOJxtPrqCEB29W/t/BfjhHyQznKQt3hWZYms1103naj4BBAFWi2rp83ZptkAxS6MlRPi7AkDjIisUlZfJ6ppsxB+fbayAJOxqPnbWgZ/xDRx6ihTRZZR1X9g9OMBtpRdV6yT+XQvE1eGSp4kjgvESiqT/EyHY=
|
||||||
|
file_glob: true
|
||||||
|
file: "dist/pyfa-*.zip"
|
||||||
|
skip_cleanup: true
|
||||||
|
draft: true
|
||||||
|
on:
|
||||||
|
tags: true
|
||||||
|
|||||||
@@ -15,12 +15,8 @@ The latest version along with release notes can always be found on the project's
|
|||||||
Windows and OS X users are supplied self-contained builds of pyfa on the [latest releases](https://github.com/pyfa-org/Pyfa/releases/latest) page. An `.exe` installer is also available for Windows builds. Linux users can run pyfa using their distribution's Python interpreter. There is no official self-contained package for Linux, however, there are a number of third-party packages available through distribution-specific repositories.
|
Windows and OS X users are supplied self-contained builds of pyfa on the [latest releases](https://github.com/pyfa-org/Pyfa/releases/latest) page. An `.exe` installer is also available for Windows builds. Linux users can run pyfa using their distribution's Python interpreter. There is no official self-contained package for Linux, however, there are a number of third-party packages available through distribution-specific repositories.
|
||||||
|
|
||||||
#### OS X
|
#### OS X
|
||||||
There are two different distributives for OS X: `-mac` and `-mac-deprecated`.
|
|
||||||
|
|
||||||
* `-mac`: based on wxPython 3.0.2.0 and has updated libraries. This is the recommended build.
|
Apart from the official release, there is also a [Homebrew](http://brew.sh) option for installing pyfa on OS X. Please note this is maintained by a third-party and is not tested by pyfa developers. Simply fire up in terminal:
|
||||||
* `-mac-deprecated`: utilizes older binaries running on wxPython 2.8; because of this, some features are not available (currently CREST support and Attribute Overrides). Additionally, as development happens primarily on wxPython 3.0, a few GUI bugs may pop up as `-mac-deprecated` is not actively tested. However, due to some general issues with wxPython 3.0, especially on some newer OS X versions, `-mac-deprecated` is still offered for those that need it.
|
|
||||||
|
|
||||||
There is also a [Homebrew](http://brew.sh) option for installing pyfa on OS X. Please note this is maintained by a third-party and is not tested by pyfa developers. Simply fire up in terminal:
|
|
||||||
```
|
```
|
||||||
$ brew install Caskroom/cask/pyfa
|
$ brew install Caskroom/cask/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,
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
62
config.py
62
config.py
@@ -1,8 +1,12 @@
|
|||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
import yaml
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
|
from cryptography.fernet import Fernet
|
||||||
|
|
||||||
pyfalog = Logger(__name__)
|
pyfalog = Logger(__name__)
|
||||||
|
|
||||||
@@ -19,14 +23,10 @@ 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.0b4"
|
|
||||||
tag = "git"
|
|
||||||
expansionName = "YC120.2"
|
|
||||||
expansionVersion = "1.2"
|
|
||||||
evemonMinVersion = "4081"
|
evemonMinVersion = "4081"
|
||||||
|
|
||||||
|
minItemSearchLength = 3
|
||||||
|
|
||||||
pyfaPath = None
|
pyfaPath = None
|
||||||
savePath = None
|
savePath = None
|
||||||
saveDB = None
|
saveDB = None
|
||||||
@@ -34,6 +34,10 @@ gameDB = None
|
|||||||
logPath = None
|
logPath = None
|
||||||
loggingLevel = None
|
loggingLevel = None
|
||||||
logging_setup = None
|
logging_setup = None
|
||||||
|
cipher = None
|
||||||
|
clientHash = None
|
||||||
|
|
||||||
|
ESI_CACHE = 'esi_cache'
|
||||||
|
|
||||||
LOGLEVEL_MAP = {
|
LOGLEVEL_MAP = {
|
||||||
"critical": CRITICAL,
|
"critical": CRITICAL,
|
||||||
@@ -44,6 +48,10 @@ LOGLEVEL_MAP = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def getClientSecret():
|
||||||
|
return clientHash
|
||||||
|
|
||||||
|
|
||||||
def isFrozen():
|
def isFrozen():
|
||||||
if hasattr(sys, 'frozen'):
|
if hasattr(sys, 'frozen'):
|
||||||
return True
|
return True
|
||||||
@@ -66,12 +74,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():
|
||||||
@@ -86,6 +89,9 @@ def defPaths(customSavePath=None):
|
|||||||
global gameDB
|
global gameDB
|
||||||
global saveInRoot
|
global saveInRoot
|
||||||
global logPath
|
global logPath
|
||||||
|
global cipher
|
||||||
|
global clientHash
|
||||||
|
global version
|
||||||
|
|
||||||
pyfalog.debug("Configuring Pyfa")
|
pyfalog.debug("Configuring Pyfa")
|
||||||
|
|
||||||
@@ -95,6 +101,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)
|
||||||
|
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)
|
||||||
@@ -110,12 +122,22 @@ def defPaths(customSavePath=None):
|
|||||||
|
|
||||||
__createDirs(savePath)
|
__createDirs(savePath)
|
||||||
|
|
||||||
|
secret_file = os.path.join(savePath, ".secret")
|
||||||
|
if not os.path.exists(secret_file):
|
||||||
|
with open(secret_file, "wb") as _file:
|
||||||
|
_file.write(Fernet.generate_key())
|
||||||
|
|
||||||
|
with open(secret_file, 'rb') as fp:
|
||||||
|
key = fp.read()
|
||||||
|
clientHash = hashlib.sha3_256(key).hexdigest()
|
||||||
|
cipher = Fernet(key)
|
||||||
|
|
||||||
# if isFrozen():
|
# if isFrozen():
|
||||||
# os.environ["REQUESTS_CA_BUNDLE"] = os.path.join(pyfaPath, "cacert.pem")
|
# os.environ["REQUESTS_CA_BUNDLE"] = os.path.join(pyfaPath, "cacert.pem")
|
||||||
# os.environ["SSL_CERT_FILE"] = os.path.join(pyfaPath, "cacert.pem")
|
# os.environ["SSL_CERT_FILE"] = os.path.join(pyfaPath, "cacert.pem")
|
||||||
|
|
||||||
# The database where we store all the fits etc
|
# The database where we store all the fits etc
|
||||||
saveDB = os.path.join(savePath, "saveddata-py3-dev.db")
|
saveDB = os.path.join(savePath, "saveddata.db")
|
||||||
|
|
||||||
# The database where the static EVE data from the datadump is kept.
|
# The database where the static EVE data from the datadump is kept.
|
||||||
# This is not the standard sqlite datadump but a modified version created by eos
|
# This is not the standard sqlite datadump but a modified version created by eos
|
||||||
@@ -204,20 +226,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):
|
||||||
|
|||||||
@@ -19,15 +19,20 @@ added_files = [
|
|||||||
('../../imgs/icons/*.png', 'imgs/icons'),
|
('../../imgs/icons/*.png', 'imgs/icons'),
|
||||||
('../../imgs/renders/*.png', 'imgs/renders'),
|
('../../imgs/renders/*.png', 'imgs/renders'),
|
||||||
('../../dist_assets/win/pyfa.ico', '.'),
|
('../../dist_assets/win/pyfa.ico', '.'),
|
||||||
|
('../../service/jargon/*.yaml', 'service/jargon'),
|
||||||
(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
|
||||||
|
]
|
||||||
|
|
||||||
|
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/effects', 'eos/db/migrations', 'service/conversions')
|
||||||
@@ -51,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,
|
||||||
@@ -64,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(
|
||||||
|
exe,
|
||||||
name='pyfa.app',
|
name='pyfa.app',
|
||||||
icon=None,
|
icon=icon,
|
||||||
bundle_identifier=None)
|
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)
|
||||||
|
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,15 +17,20 @@ 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'),
|
||||||
('../../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/effects', 'eos/db/migrations', 'service/conversions')
|
||||||
@@ -79,3 +83,4 @@ coll = COLLECT(
|
|||||||
name='pyfa',
|
name='pyfa',
|
||||||
icon='dist_assets/win/pyfa.ico',
|
icon='dist_assets/win/pyfa.ico',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ class CapSimulator(object):
|
|||||||
disable_period = False
|
disable_period = False
|
||||||
|
|
||||||
# Loop over modules, clearing clipSize if applicable, and group modules based on attributes
|
# Loop over modules, clearing clipSize if applicable, and group modules based on attributes
|
||||||
for (duration, capNeed, clipSize, disableStagger) in self.modules:
|
for (duration, capNeed, clipSize, disableStagger, reloadTime) in self.modules:
|
||||||
if self.scale:
|
if self.scale:
|
||||||
duration, capNeed = self.scale_activation(duration, capNeed)
|
duration, capNeed = self.scale_activation(duration, capNeed)
|
||||||
|
|
||||||
@@ -80,24 +80,25 @@ class CapSimulator(object):
|
|||||||
# a cap booster module.
|
# a cap booster module.
|
||||||
if not self.reload and capNeed > 0:
|
if not self.reload and capNeed > 0:
|
||||||
clipSize = 0
|
clipSize = 0
|
||||||
|
reloadTime = 0
|
||||||
|
|
||||||
# Group modules based on their properties
|
# Group modules based on their properties
|
||||||
if (duration, capNeed, clipSize, disableStagger) in mods:
|
if (duration, capNeed, clipSize, disableStagger, reloadTime) in mods:
|
||||||
mods[(duration, capNeed, clipSize, disableStagger)] += 1
|
mods[(duration, capNeed, clipSize, disableStagger, reloadTime)] += 1
|
||||||
else:
|
else:
|
||||||
mods[(duration, capNeed, clipSize, disableStagger)] = 1
|
mods[(duration, capNeed, clipSize, disableStagger, reloadTime)] = 1
|
||||||
|
|
||||||
# Loop over grouped modules, configure staggering and push to the simulation state
|
# Loop over grouped modules, configure staggering and push to the simulation state
|
||||||
for (duration, capNeed, clipSize, disableStagger), amount in mods.items():
|
for (duration, capNeed, clipSize, disableStagger, reloadTime), amount in mods.items():
|
||||||
if self.stagger and not disableStagger:
|
if self.stagger and not disableStagger:
|
||||||
if clipSize == 0:
|
if clipSize == 0:
|
||||||
duration = int(duration / amount)
|
duration = int(duration / amount)
|
||||||
else:
|
else:
|
||||||
stagger_amount = (duration * clipSize + 10000) / (amount * clipSize)
|
stagger_amount = (duration * clipSize + reloadTime) / (amount * clipSize)
|
||||||
for i in range(1, amount):
|
for i in range(1, amount):
|
||||||
heapq.heappush(self.state,
|
heapq.heappush(self.state,
|
||||||
[i * stagger_amount, duration,
|
[i * stagger_amount, duration,
|
||||||
capNeed, 0, clipSize])
|
capNeed, 0, clipSize, reloadTime])
|
||||||
else:
|
else:
|
||||||
capNeed *= amount
|
capNeed *= amount
|
||||||
|
|
||||||
@@ -107,7 +108,7 @@ class CapSimulator(object):
|
|||||||
if clipSize:
|
if clipSize:
|
||||||
disable_period = True
|
disable_period = True
|
||||||
|
|
||||||
heapq.heappush(self.state, [0, duration, capNeed, 0, clipSize])
|
heapq.heappush(self.state, [0, duration, capNeed, 0, clipSize, reloadTime])
|
||||||
|
|
||||||
if disable_period:
|
if disable_period:
|
||||||
self.period = self.t_max
|
self.period = self.t_max
|
||||||
@@ -144,7 +145,7 @@ class CapSimulator(object):
|
|||||||
|
|
||||||
while 1:
|
while 1:
|
||||||
activation = pop(state)
|
activation = pop(state)
|
||||||
t_now, duration, capNeed, shot, clipSize = activation
|
t_now, duration, capNeed, shot, clipSize, reloadTime = activation
|
||||||
if t_now >= t_max:
|
if t_now >= t_max:
|
||||||
break
|
break
|
||||||
|
|
||||||
@@ -180,7 +181,7 @@ class CapSimulator(object):
|
|||||||
if clipSize:
|
if clipSize:
|
||||||
if shot % clipSize == 0:
|
if shot % clipSize == 0:
|
||||||
shot = 0
|
shot = 0
|
||||||
t_now += 10000 # include reload time
|
t_now += reloadTime # include reload time
|
||||||
activation[0] = t_now
|
activation[0] = t_now
|
||||||
activation[3] = shot
|
activation[3] = shot
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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, crest, damagePattern, databaseRepair, drone, fighter, fit, implant, implantSet, loadDefaultDatabaseValues, \
|
from eos.db.saveddata import booster, cargo, character, damagePattern, databaseRepair, drone, fighter, fit, implant, implantSet, loadDefaultDatabaseValues, \
|
||||||
miscData, module, override, price, queries, skill, targetResists, user
|
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,7 @@ 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("unitID", Integer, ForeignKey("dgmunits.unitID")))
|
Column("unitID", Integer, ForeignKey("dgmunits.unitID")))
|
||||||
|
|
||||||
mapper(Attribute, typeattributes_table,
|
mapper(Attribute, typeattributes_table,
|
||||||
@@ -46,7 +46,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,18 @@ 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("replaceSame", String),
|
||||||
|
Column("replaceBetter", 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 +60,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",
|
||||||
@@ -12,7 +13,6 @@ __all__ = [
|
|||||||
"miscData",
|
"miscData",
|
||||||
"targetResists",
|
"targetResists",
|
||||||
"override",
|
"override",
|
||||||
"crest",
|
|
||||||
"implantSet",
|
"implantSet",
|
||||||
"loadDefaultDatabaseValues"
|
"loadDefaultDatabaseValues"
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -17,24 +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 Table, Column, Integer, ForeignKey, String, DateTime, Float
|
from sqlalchemy import Table, Column, Integer, ForeignKey, String, DateTime, Float, UniqueConstraint
|
||||||
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.db.saveddata.implant import charImplants_table
|
from eos.db.saveddata.implant import charImplants_table
|
||||||
from eos.effectHandlerHelpers import HandledImplantBoosterList
|
from eos.effectHandlerHelpers import HandledImplantBoosterList, HandledSsoCharacterList
|
||||||
from eos.saveddata.implant import Implant
|
from eos.saveddata.implant import Implant
|
||||||
from eos.saveddata.user import User
|
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
|
||||||
|
|
||||||
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),
|
||||||
Column("apiID", Integer),
|
|
||||||
Column("apiKey", String),
|
|
||||||
Column("defaultChar", Integer),
|
|
||||||
Column("chars", String, nullable=True),
|
|
||||||
Column("defaultLevel", Integer, nullable=True),
|
Column("defaultLevel", Integer, nullable=True),
|
||||||
Column("alphaCloneID", Integer, nullable=True),
|
Column("alphaCloneID", Integer, nullable=True),
|
||||||
Column("ownerID", ForeignKey("users.ID"), nullable=True),
|
Column("ownerID", ForeignKey("users.ID"), nullable=True),
|
||||||
@@ -42,6 +39,28 @@ characters_table = Table("characters", saveddata_meta,
|
|||||||
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))
|
||||||
|
|
||||||
|
sso_table = Table("ssoCharacter", saveddata_meta,
|
||||||
|
Column("ID", Integer, primary_key=True),
|
||||||
|
Column("client", String, nullable=False),
|
||||||
|
Column("characterID", Integer, nullable=False),
|
||||||
|
Column("characterName", String, nullable=False),
|
||||||
|
Column("refreshToken", String, nullable=False),
|
||||||
|
Column("accessToken", String, nullable=False),
|
||||||
|
Column("accessTokenExpires", DateTime, nullable=False),
|
||||||
|
Column("created", DateTime, nullable=True, default=datetime.datetime.now),
|
||||||
|
Column("modified", DateTime, nullable=True, onupdate=datetime.datetime.now),
|
||||||
|
UniqueConstraint('client', 'characterID', name='uix_client_characterID'),
|
||||||
|
UniqueConstraint('client', 'characterName', name='uix_client_characterName')
|
||||||
|
)
|
||||||
|
|
||||||
|
sso_character_map_table = Table("ssoCharacterMap", saveddata_meta,
|
||||||
|
Column("characterID", ForeignKey("characters.ID"), primary_key=True),
|
||||||
|
Column("ssoCharacterID", ForeignKey("ssoCharacter.ID"), primary_key=True),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
mapper(SsoCharacter, sso_table)
|
||||||
|
|
||||||
mapper(Character, characters_table,
|
mapper(Character, characters_table,
|
||||||
properties={
|
properties={
|
||||||
"_Character__alphaCloneID": characters_table.c.alphaCloneID,
|
"_Character__alphaCloneID": characters_table.c.alphaCloneID,
|
||||||
@@ -63,5 +82,10 @@ mapper(Character, characters_table,
|
|||||||
primaryjoin=charImplants_table.c.charID == characters_table.c.ID,
|
primaryjoin=charImplants_table.c.charID == characters_table.c.ID,
|
||||||
secondaryjoin=charImplants_table.c.implantID == Implant.ID,
|
secondaryjoin=charImplants_table.c.implantID == Implant.ID,
|
||||||
secondary=charImplants_table),
|
secondary=charImplants_table),
|
||||||
|
"_Character__ssoCharacters" : relation(
|
||||||
|
SsoCharacter,
|
||||||
|
collection_class=HandledSsoCharacterList,
|
||||||
|
backref='characters',
|
||||||
|
secondary=sso_character_map_table)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,34 +0,0 @@
|
|||||||
# ===============================================================================
|
|
||||||
# Copyright (C) 2010 Diego Duclos
|
|
||||||
#
|
|
||||||
# This file is part of eos.
|
|
||||||
#
|
|
||||||
# eos is free software: you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU Lesser General Public License as published by
|
|
||||||
# the Free Software Foundation, either version 2 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
#
|
|
||||||
# eos is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU Lesser General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU Lesser General Public License
|
|
||||||
# along with eos. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
# ===============================================================================
|
|
||||||
|
|
||||||
from sqlalchemy import Table, Column, Integer, String, DateTime
|
|
||||||
from sqlalchemy.orm import mapper
|
|
||||||
import datetime
|
|
||||||
|
|
||||||
from eos.db import saveddata_meta
|
|
||||||
from eos.saveddata.crestchar import CrestChar
|
|
||||||
|
|
||||||
crest_table = Table("crest", saveddata_meta,
|
|
||||||
Column("ID", Integer, primary_key=True),
|
|
||||||
Column("name", String, nullable=False, unique=True),
|
|
||||||
Column("refresh_token", String, nullable=False),
|
|
||||||
# These records aren't updated. Instead, they are dropped and created, hence we don't have a modified field
|
|
||||||
Column("created", DateTime, nullable=True, default=datetime.datetime.now))
|
|
||||||
|
|
||||||
mapper(CrestChar, crest_table)
|
|
||||||
@@ -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,17 +17,20 @@
|
|||||||
# 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={
|
mapper(Price, prices_table, properties={
|
||||||
"_Price__price": prices_table.c.price,
|
"_Price__price": prices_table.c.price,
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ from eos.db.saveddata.fit import projectedFits_table
|
|||||||
from eos.db.util import processEager, processWhere
|
from eos.db.util import processEager, processWhere
|
||||||
from eos.saveddata.price import Price
|
from eos.saveddata.price import Price
|
||||||
from eos.saveddata.user import User
|
from eos.saveddata.user import User
|
||||||
from eos.saveddata.crestchar import CrestChar
|
from eos.saveddata.ssocharacter import SsoCharacter
|
||||||
from eos.saveddata.damagePattern import DamagePattern
|
from eos.saveddata.damagePattern import DamagePattern
|
||||||
from eos.saveddata.targetResists import TargetResists
|
from eos.saveddata.targetResists import TargetResists
|
||||||
from eos.saveddata.character import Character
|
from eos.saveddata.character import Character
|
||||||
@@ -467,29 +467,28 @@ def getProjectedFits(fitID):
|
|||||||
raise TypeError("Need integer as argument")
|
raise TypeError("Need integer as argument")
|
||||||
|
|
||||||
|
|
||||||
def getCrestCharacters(eager=None):
|
def getSsoCharacters(clientHash, eager=None):
|
||||||
eager = processEager(eager)
|
eager = processEager(eager)
|
||||||
with sd_lock:
|
with sd_lock:
|
||||||
characters = saveddata_session.query(CrestChar).options(*eager).all()
|
characters = saveddata_session.query(SsoCharacter).filter(SsoCharacter.client == clientHash).options(*eager).all()
|
||||||
return characters
|
return characters
|
||||||
|
|
||||||
|
|
||||||
@cachedQuery(CrestChar, 1, "lookfor")
|
@cachedQuery(SsoCharacter, 1, "lookfor", "clientHash")
|
||||||
def getCrestCharacter(lookfor, eager=None):
|
def getSsoCharacter(lookfor, clientHash, eager=None):
|
||||||
|
filter = SsoCharacter.client == clientHash
|
||||||
|
|
||||||
if isinstance(lookfor, int):
|
if isinstance(lookfor, int):
|
||||||
if eager is None:
|
filter = and_(filter, SsoCharacter.ID == lookfor)
|
||||||
with sd_lock:
|
|
||||||
character = saveddata_session.query(CrestChar).get(lookfor)
|
|
||||||
else:
|
|
||||||
eager = processEager(eager)
|
|
||||||
with sd_lock:
|
|
||||||
character = saveddata_session.query(CrestChar).options(*eager).filter(CrestChar.ID == lookfor).first()
|
|
||||||
elif isinstance(lookfor, str):
|
elif isinstance(lookfor, str):
|
||||||
eager = processEager(eager)
|
filter = and_(filter, SsoCharacter.characterName == lookfor)
|
||||||
with sd_lock:
|
|
||||||
character = saveddata_session.query(CrestChar).options(*eager).filter(CrestChar.name == lookfor).first()
|
|
||||||
else:
|
else:
|
||||||
raise TypeError("Need integer or string as argument")
|
raise TypeError("Need integer or string as argument")
|
||||||
|
|
||||||
|
eager = processEager(eager)
|
||||||
|
with sd_lock:
|
||||||
|
character = saveddata_session.query(SsoCharacter).options(*eager).filter(filter).first()
|
||||||
|
|
||||||
return character
|
return character
|
||||||
|
|
||||||
|
|
||||||
@@ -543,6 +542,15 @@ def commit():
|
|||||||
with sd_lock:
|
with sd_lock:
|
||||||
try:
|
try:
|
||||||
saveddata_session.commit()
|
saveddata_session.commit()
|
||||||
|
except Exception:
|
||||||
|
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()
|
saveddata_session.flush()
|
||||||
except Exception:
|
except Exception:
|
||||||
saveddata_session.rollback()
|
saveddata_session.rollback()
|
||||||
|
|||||||
@@ -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,30 @@ 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
|
||||||
|
return None
|
||||||
|
|
||||||
HandledList.append(self, thing)
|
|
||||||
|
class HandledSsoCharacterList(list):
|
||||||
|
def append(self, character):
|
||||||
|
old = next((x for x in self if x.client == character.client), None)
|
||||||
|
if old is not None:
|
||||||
|
pyfalog.warning("Removing SSO Character with same hash: {}".format(repr(old)))
|
||||||
|
list.remove(self, old)
|
||||||
|
|
||||||
|
list.append(self, character)
|
||||||
|
|
||||||
|
|
||||||
class HandledProjectedModList(HandledList):
|
class HandledProjectedModList(HandledList):
|
||||||
@@ -215,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):
|
||||||
|
|||||||
@@ -13,11 +13,14 @@ type = "active"
|
|||||||
|
|
||||||
def handler(fit, module, context):
|
def handler(fit, module, context):
|
||||||
damagePattern = fit.damagePattern
|
damagePattern = fit.damagePattern
|
||||||
|
# pyfalog.debug("==============================")
|
||||||
|
|
||||||
static_adaptive_behavior = eos.config.settings['useStaticAdaptiveArmorHardener']
|
static_adaptive_behavior = eos.config.settings['useStaticAdaptiveArmorHardener']
|
||||||
|
|
||||||
if (damagePattern.emAmount == damagePattern.thermalAmount == damagePattern.kineticAmount == damagePattern.explosiveAmount) and static_adaptive_behavior:
|
if (damagePattern.emAmount == damagePattern.thermalAmount == damagePattern.kineticAmount == damagePattern.explosiveAmount) and static_adaptive_behavior:
|
||||||
pyfalog.debug("Setting adaptivearmorhardener resists to uniform profile.")
|
# pyfalog.debug("Setting adaptivearmorhardener resists to uniform profile.")
|
||||||
|
for attr in ("armorEmDamageResonance", "armorThermalDamageResonance", "armorKineticDamageResonance", "armorExplosiveDamageResonance"):
|
||||||
|
fit.ship.multiplyItemAttr(attr, module.getModifiedItemAttr(attr), stackingPenalties=True, penaltyGroup="preMul")
|
||||||
return
|
return
|
||||||
|
|
||||||
# Skip if there is no damage pattern. Example: projected ships or fleet boosters
|
# Skip if there is no damage pattern. Example: projected ships or fleet boosters
|
||||||
@@ -30,7 +33,7 @@ def handler(fit, module, context):
|
|||||||
damagePattern.kineticAmount * fit.ship.getModifiedItemAttr('armorKineticDamageResonance'),
|
damagePattern.kineticAmount * fit.ship.getModifiedItemAttr('armorKineticDamageResonance'),
|
||||||
damagePattern.explosiveAmount * fit.ship.getModifiedItemAttr('armorExplosiveDamageResonance'),
|
damagePattern.explosiveAmount * fit.ship.getModifiedItemAttr('armorExplosiveDamageResonance'),
|
||||||
)
|
)
|
||||||
# pyfalog.debug("Damage Adjusted for Armor Resists: %f/%f/%f/%f", baseDamageTaken[0], baseDamageTaken[1], baseDamageTaken[2], baseDamageTaken[3])
|
# pyfalog.debug("Damage Adjusted for Armor Resists: %f/%f/%f/%f" % (baseDamageTaken[0], baseDamageTaken[1], baseDamageTaken[2], baseDamageTaken[3]))
|
||||||
|
|
||||||
resistanceShiftAmount = module.getModifiedItemAttr(
|
resistanceShiftAmount = module.getModifiedItemAttr(
|
||||||
'resistanceShiftAmount') / 100 # The attribute is in percent and we want a fraction
|
'resistanceShiftAmount') / 100 # The attribute is in percent and we want a fraction
|
||||||
@@ -46,7 +49,7 @@ def handler(fit, module, context):
|
|||||||
cycleList = []
|
cycleList = []
|
||||||
loopStart = -20
|
loopStart = -20
|
||||||
for num in range(50):
|
for num in range(50):
|
||||||
# pyfalog.debug("Starting cycle %d.", num)
|
# pyfalog.debug("Starting cycle %d." % num)
|
||||||
# The strange order is to emulate the ingame sorting when different types have taken the same amount of damage.
|
# 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.
|
# This doesn't take into account stacking penalties. In a few cases fitting a Damage Control causes an inaccurate result.
|
||||||
damagePattern_tuples = [
|
damagePattern_tuples = [
|
||||||
@@ -84,7 +87,7 @@ def handler(fit, module, context):
|
|||||||
RAHResistance[sortedDamagePattern_tuples[1][0]] = sortedDamagePattern_tuples[1][2] + change1
|
RAHResistance[sortedDamagePattern_tuples[1][0]] = sortedDamagePattern_tuples[1][2] + change1
|
||||||
RAHResistance[sortedDamagePattern_tuples[2][0]] = sortedDamagePattern_tuples[2][2] + change2
|
RAHResistance[sortedDamagePattern_tuples[2][0]] = sortedDamagePattern_tuples[2][2] + change2
|
||||||
RAHResistance[sortedDamagePattern_tuples[3][0]] = sortedDamagePattern_tuples[3][2] + change3
|
RAHResistance[sortedDamagePattern_tuples[3][0]] = sortedDamagePattern_tuples[3][2] + change3
|
||||||
# pyfalog.debug("Resistances shifted to %f/%f/%f/%f", RAHResistance[0], RAHResistance[1], RAHResistance[2], RAHResistance[3])
|
# pyfalog.debug("Resistances shifted to %f/%f/%f/%f" % ( RAHResistance[0], RAHResistance[1], RAHResistance[2], RAHResistance[3]))
|
||||||
|
|
||||||
# See if the current RAH profile has been encountered before, indicating a loop.
|
# See if the current RAH profile has been encountered before, indicating a loop.
|
||||||
for i, val in enumerate(cycleList):
|
for i, val in enumerate(cycleList):
|
||||||
@@ -94,16 +97,16 @@ def handler(fit, module, context):
|
|||||||
abs(RAHResistance[2] - val[2]) <= tolerance and \
|
abs(RAHResistance[2] - val[2]) <= tolerance and \
|
||||||
abs(RAHResistance[3] - val[3]) <= tolerance:
|
abs(RAHResistance[3] - val[3]) <= tolerance:
|
||||||
loopStart = i
|
loopStart = i
|
||||||
# pyfalog.debug("Loop found: %d-%d", loopStart, num)
|
# pyfalog.debug("Loop found: %d-%d" % (loopStart, num))
|
||||||
break
|
break
|
||||||
if loopStart >= 0:
|
if loopStart >= 0:
|
||||||
break
|
break
|
||||||
|
|
||||||
cycleList.append(list(RAHResistance))
|
cycleList.append(list(RAHResistance))
|
||||||
|
|
||||||
if loopStart < 0:
|
# if loopStart < 0:
|
||||||
pyfalog.error("Reactive Armor Hardener failed to find equilibrium. Damage profile after armor: {0}/{1}/{2}/{3}",
|
# pyfalog.error("Reactive Armor Hardener failed to find equilibrium. Damage profile after armor: {0}/{1}/{2}/{3}".format(
|
||||||
baseDamageTaken[0], baseDamageTaken[1], baseDamageTaken[2], baseDamageTaken[3])
|
# 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.
|
# Average the profiles in the RAH loop, or the last 20 if it didn't find a loop.
|
||||||
loopCycles = cycleList[loopStart:]
|
loopCycles = cycleList[loopStart:]
|
||||||
@@ -117,7 +120,7 @@ def handler(fit, module, context):
|
|||||||
average[i] = round(average[i] / numCycles, 3)
|
average[i] = round(average[i] / numCycles, 3)
|
||||||
|
|
||||||
# Set the new resistances
|
# Set the new resistances
|
||||||
# pyfalog.debug("Setting new resist profile: %f/%f/%f/%f", average[0], average[1], average[2],average[3])
|
# pyfalog.debug("Setting new resist profile: %f/%f/%f/%f" % ( average[0], average[1], average[2],average[3]))
|
||||||
for i, attr in enumerate((
|
for i, attr in enumerate((
|
||||||
'armorEmDamageResonance', 'armorThermalDamageResonance', 'armorKineticDamageResonance',
|
'armorEmDamageResonance', 'armorThermalDamageResonance', 'armorKineticDamageResonance',
|
||||||
'armorExplosiveDamageResonance')):
|
'armorExplosiveDamageResonance')):
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# Used by:
|
# Used by:
|
||||||
# Modules from group: Missile Launcher Bomb (2 of 2)
|
# Modules from group: Missile Launcher Bomb (2 of 2)
|
||||||
# Modules from group: Shield Extender (33 of 33)
|
# Modules from group: Shield Extender (36 of 36)
|
||||||
type = "passive"
|
type = "passive"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -6,4 +6,4 @@ type = "passive"
|
|||||||
|
|
||||||
|
|
||||||
def handler(fit, module, context):
|
def handler(fit, module, context):
|
||||||
fit.ship.boostItemAttr("agility", module.getModifiedItemAttr("agilityMultiplier"), stackingPenalties=True)
|
fit.ship.boostItemAttr("agility", module.getModifiedItemAttr("agilityBonus"), stackingPenalties=True)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# ammoInfluenceCapNeed
|
# ammoInfluenceCapNeed
|
||||||
#
|
#
|
||||||
# Used by:
|
# Used by:
|
||||||
# Items from category: Charge (478 of 925)
|
# Items from category: Charge (493 of 949)
|
||||||
type = "passive"
|
type = "passive"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# ammoInfluenceRange
|
# ammoInfluenceRange
|
||||||
#
|
#
|
||||||
# Used by:
|
# Used by:
|
||||||
# Items from category: Charge (572 of 925)
|
# Items from category: Charge (587 of 949)
|
||||||
type = "passive"
|
type = "passive"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
# ammoSpeedMultiplier
|
# ammoSpeedMultiplier
|
||||||
#
|
#
|
||||||
# Used by:
|
# Used by:
|
||||||
# Charges from group: Festival Charges (23 of 23)
|
# Charges from group: Festival Charges (26 of 26)
|
||||||
# Charges from group: Interdiction Probe (2 of 2)
|
# Charges from group: Interdiction Probe (2 of 2)
|
||||||
|
# Items from market group: Special Edition Assets > Special Edition Festival Assets (30 of 33)
|
||||||
type = "passive"
|
type = "passive"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,7 @@
|
|||||||
# ammoTrackingMultiplier
|
# ammoTrackingMultiplier
|
||||||
#
|
#
|
||||||
# Used by:
|
# Used by:
|
||||||
# Charges from group: Advanced Artillery Ammo (8 of 8)
|
# Items from category: Charge (182 of 949)
|
||||||
# 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)
|
# Charges from group: Projectile Ammo (128 of 128)
|
||||||
type = "passive"
|
type = "passive"
|
||||||
|
|
||||||
|
|||||||
16
eos/effects/aoebeaconbioluminescencecloud.py
Normal file
16
eos/effects/aoebeaconbioluminescencecloud.py
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# aoe_beacon_bioluminescence_cloud
|
||||||
|
#
|
||||||
|
# Used by:
|
||||||
|
# Celestials named like: Bioluminescence Cloud (3 of 3)
|
||||||
|
runTime = "early"
|
||||||
|
type = ("projected", "passive", "gang")
|
||||||
|
|
||||||
|
|
||||||
|
def handler(fit, beacon, context, **kwargs):
|
||||||
|
for x in range(1, 3):
|
||||||
|
if beacon.getModifiedItemAttr("warfareBuff{}ID".format(x)):
|
||||||
|
value = beacon.getModifiedItemAttr("warfareBuff{}Value".format(x))
|
||||||
|
id = beacon.getModifiedItemAttr("warfareBuff{}ID".format(x))
|
||||||
|
|
||||||
|
if id:
|
||||||
|
fit.addCommandBonus(id, value, beacon, kwargs['effect'], 'early')
|
||||||
16
eos/effects/aoebeaconcausticcloud.py
Normal file
16
eos/effects/aoebeaconcausticcloud.py
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# aoe_beacon_caustic_cloud
|
||||||
|
#
|
||||||
|
# Used by:
|
||||||
|
# Celestials named like: Caustic Cloud (3 of 3)
|
||||||
|
runTime = "early"
|
||||||
|
type = ("projected", "passive", "gang")
|
||||||
|
|
||||||
|
|
||||||
|
def handler(fit, beacon, context, **kwargs):
|
||||||
|
for x in range(1, 3):
|
||||||
|
if beacon.getModifiedItemAttr("warfareBuff{}ID".format(x)):
|
||||||
|
value = beacon.getModifiedItemAttr("warfareBuff{}Value".format(x))
|
||||||
|
id = beacon.getModifiedItemAttr("warfareBuff{}ID".format(x))
|
||||||
|
|
||||||
|
if id:
|
||||||
|
fit.addCommandBonus(id, value, beacon, kwargs['effect'], 'early')
|
||||||
16
eos/effects/aoebeaconfilamentcloud.py
Normal file
16
eos/effects/aoebeaconfilamentcloud.py
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# aoe_beacon_filament_cloud
|
||||||
|
#
|
||||||
|
# Used by:
|
||||||
|
# Celestials named like: Filament Cloud (3 of 3)
|
||||||
|
runTime = "early"
|
||||||
|
type = ("projected", "passive", "gang")
|
||||||
|
|
||||||
|
|
||||||
|
def handler(fit, beacon, context, **kwargs):
|
||||||
|
for x in range(1, 3):
|
||||||
|
if beacon.getModifiedItemAttr("warfareBuff{}ID".format(x)):
|
||||||
|
value = beacon.getModifiedItemAttr("warfareBuff{}Value".format(x))
|
||||||
|
id = beacon.getModifiedItemAttr("warfareBuff{}ID".format(x))
|
||||||
|
|
||||||
|
if id:
|
||||||
|
fit.addCommandBonus(id, value, beacon, kwargs['effect'], 'early')
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
# armorAllRepairSystemsAmountBonusPassive
|
# armorAllRepairSystemsAmountBonusPassive
|
||||||
#
|
#
|
||||||
# Used by:
|
# Used by:
|
||||||
|
# Implants named like: Agency 'Hardshell' TB Dose (4 of 4)
|
||||||
# Implants named like: Exile Booster (4 of 4)
|
# Implants named like: Exile Booster (4 of 4)
|
||||||
# Implant: Antipharmakon Kosybo
|
# Implant: Antipharmakon Kosybo
|
||||||
type = "passive"
|
type = "passive"
|
||||||
@@ -9,4 +10,4 @@ type = "passive"
|
|||||||
def handler(fit, booster, context):
|
def handler(fit, booster, context):
|
||||||
fit.modules.filteredItemBoost(
|
fit.modules.filteredItemBoost(
|
||||||
lambda mod: mod.item.requiresSkill("Repair Systems") or mod.item.requiresSkill("Capital Repair Systems"),
|
lambda mod: mod.item.requiresSkill("Repair Systems") or mod.item.requiresSkill("Capital Repair Systems"),
|
||||||
"armorDamageAmount", booster.getModifiedItemAttr("armorDamageAmountBonus"))
|
"armorDamageAmount", booster.getModifiedItemAttr("armorDamageAmountBonus") or 0)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# armorHPBonusAdd
|
# armorHPBonusAdd
|
||||||
#
|
#
|
||||||
# Used by:
|
# Used by:
|
||||||
# Modules from group: Armor Reinforcer (48 of 48)
|
# Modules from group: Armor Reinforcer (51 of 51)
|
||||||
type = "passive"
|
type = "passive"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# armorReinforcerMassAdd
|
# armorReinforcerMassAdd
|
||||||
#
|
#
|
||||||
# Used by:
|
# Used by:
|
||||||
# Modules from group: Armor Reinforcer (48 of 48)
|
# Modules from group: Armor Reinforcer (51 of 51)
|
||||||
type = "passive"
|
type = "passive"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# armorRepair
|
# armorRepair
|
||||||
#
|
#
|
||||||
# Used by:
|
# Used by:
|
||||||
# Modules from group: Armor Repair Unit (105 of 105)
|
# Modules from group: Armor Repair Unit (108 of 108)
|
||||||
runTime = "late"
|
runTime = "late"
|
||||||
type = "active"
|
type = "active"
|
||||||
|
|
||||||
@@ -9,4 +9,7 @@ type = "active"
|
|||||||
def handler(fit, module, context):
|
def handler(fit, module, context):
|
||||||
amount = module.getModifiedItemAttr("armorDamageAmount")
|
amount = module.getModifiedItemAttr("armorDamageAmount")
|
||||||
speed = module.getModifiedItemAttr("duration") / 1000.0
|
speed = module.getModifiedItemAttr("duration") / 1000.0
|
||||||
fit.extraAttributes.increase("armorRepair", amount / speed)
|
rps = amount / speed
|
||||||
|
fit.extraAttributes.increase("armorRepair", rps)
|
||||||
|
fit.extraAttributes.increase("armorRepairPreSpool", rps)
|
||||||
|
fit.extraAttributes.increase("armorRepairFullSpool", rps)
|
||||||
|
|||||||
@@ -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,7 +1,7 @@
|
|||||||
# boosterArmorHpPenalty
|
# boosterArmorHpPenalty
|
||||||
#
|
#
|
||||||
# Used by:
|
# Used by:
|
||||||
# Implants from group: Booster (12 of 54)
|
# Implants named like: Booster (12 of 35)
|
||||||
type = "boosterSideEffect"
|
type = "boosterSideEffect"
|
||||||
|
|
||||||
# User-friendly name for the side effect
|
# User-friendly name for the side effect
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
# boosterMaxVelocityPenalty
|
# boosterMaxVelocityPenalty
|
||||||
#
|
#
|
||||||
# Used by:
|
# Used by:
|
||||||
# Implants from group: Booster (12 of 54)
|
# Implants named like: Crash Booster (3 of 4)
|
||||||
|
# Items from market group: Implants & Boosters > Booster > Booster Slot 02 (9 of 13)
|
||||||
type = "boosterSideEffect"
|
type = "boosterSideEffect"
|
||||||
|
|
||||||
# User-friendly name for the side effect
|
# User-friendly name for the side effect
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
# Implants named like: Eifyr and Co. 'Alchemist' Neurotoxin Control NC (2 of 2)
|
# Implants named like: Eifyr and Co. 'Alchemist' Neurotoxin Control NC (2 of 2)
|
||||||
# Implants named like: grade Edge (10 of 12)
|
# Implants named like: grade Edge (10 of 12)
|
||||||
# Skill: Neurotoxin Control
|
# Skill: Neurotoxin Control
|
||||||
|
runTime = 'early'
|
||||||
type = "passive"
|
type = "passive"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# boosterShieldCapacityPenalty
|
# boosterShieldCapacityPenalty
|
||||||
#
|
#
|
||||||
# Used by:
|
# Used by:
|
||||||
# Implants from group: Booster (12 of 54)
|
# Implants from group: Booster (12 of 70)
|
||||||
type = "boosterSideEffect"
|
type = "boosterSideEffect"
|
||||||
|
|
||||||
# User-friendly name for the side effect
|
# User-friendly name for the side effect
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# capacitorCapacityBonus
|
# capacitorCapacityBonus
|
||||||
#
|
#
|
||||||
# Used by:
|
# Used by:
|
||||||
# Modules from group: Capacitor Battery (27 of 27)
|
# Modules from group: Capacitor Battery (30 of 30)
|
||||||
type = "passive"
|
type = "passive"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
# Modules from group: Capacitor Flux Coil (6 of 6)
|
# Modules from group: Capacitor Flux Coil (6 of 6)
|
||||||
# Modules from group: Capacitor Power Relay (20 of 20)
|
# Modules from group: Capacitor Power Relay (20 of 20)
|
||||||
# Modules from group: Power Diagnostic System (23 of 23)
|
# Modules from group: Power Diagnostic System (23 of 23)
|
||||||
# Modules from group: Propulsion Module (65 of 127)
|
# Modules from group: Propulsion Module (68 of 133)
|
||||||
# Modules from group: Reactor Control Unit (22 of 22)
|
# Modules from group: Reactor Control Unit (22 of 22)
|
||||||
type = "passive"
|
type = "passive"
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
# Not used by any item
|
# citadelRigBonus
|
||||||
|
#
|
||||||
|
# Used by:
|
||||||
|
# Structures from group: Citadel (9 of 9)
|
||||||
type = "passive"
|
type = "passive"
|
||||||
runTime = "early"
|
runTime = "early"
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# Used by:
|
# Used by:
|
||||||
# Ships from group: Carrier (4 of 4)
|
# Ships from group: Carrier (4 of 4)
|
||||||
# Ships from group: Combat Battlecruiser (13 of 13)
|
# Ships from group: Combat Battlecruiser (14 of 14)
|
||||||
# Ships from group: Command Ship (8 of 8)
|
# Ships from group: Command Ship (8 of 8)
|
||||||
# Ships from group: Force Auxiliary (6 of 6)
|
# Ships from group: Force Auxiliary (6 of 6)
|
||||||
# Ships from group: Supercarrier (6 of 6)
|
# Ships from group: Supercarrier (6 of 6)
|
||||||
|
|||||||
@@ -3,9 +3,9 @@
|
|||||||
# Used by:
|
# Used by:
|
||||||
# Ships from group: Black Ops (5 of 5)
|
# Ships from group: Black Ops (5 of 5)
|
||||||
# Ships from group: Blockade Runner (4 of 4)
|
# Ships from group: Blockade Runner (4 of 4)
|
||||||
# Ships from group: Covert Ops (7 of 7)
|
# Ships from group: Covert Ops (8 of 8)
|
||||||
# Ships from group: Expedition Frigate (2 of 2)
|
# Ships from group: Expedition Frigate (2 of 2)
|
||||||
# Ships from group: Force Recon Ship (8 of 8)
|
# Ships from group: Force Recon Ship (9 of 9)
|
||||||
# Ships from group: Stealth Bomber (5 of 5)
|
# Ships from group: Stealth Bomber (5 of 5)
|
||||||
# Ships named like: Stratios (2 of 2)
|
# Ships named like: Stratios (2 of 2)
|
||||||
# Subsystems named like: Defensive Covert Reconfiguration (4 of 4)
|
# Subsystems named like: Defensive Covert Reconfiguration (4 of 4)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# covertOpsCloakCpuPercentBonus1
|
# covertOpsCloakCpuPercentBonus1
|
||||||
#
|
#
|
||||||
# Used by:
|
# Used by:
|
||||||
# Ships from group: Covert Ops (5 of 7)
|
# Ships from group: Covert Ops (6 of 8)
|
||||||
type = "passive"
|
type = "passive"
|
||||||
runTime = "early"
|
runTime = "early"
|
||||||
|
|
||||||
|
|||||||
9
eos/effects/covertopswarpresistance.py
Normal file
9
eos/effects/covertopswarpresistance.py
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# covertOpsWarpResistance
|
||||||
|
#
|
||||||
|
# Used by:
|
||||||
|
# Ships from group: Covert Ops (5 of 8)
|
||||||
|
type = "passive"
|
||||||
|
|
||||||
|
|
||||||
|
def handler(fit, src, context):
|
||||||
|
fit.ship.increaseItemAttr("warpFactor", src.getModifiedItemAttr("eliteBonusCovertOps1"), skill="Covert Ops")
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
#
|
#
|
||||||
# Used by:
|
# Used by:
|
||||||
# Modules from group: CPU Enhancer (19 of 19)
|
# Modules from group: CPU Enhancer (19 of 19)
|
||||||
|
# Variations of structure module: Standup Co-Processor Array I (2 of 2)
|
||||||
type = "passive"
|
type = "passive"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
# Used by:
|
# Used by:
|
||||||
# Modules from group: Frequency Mining Laser (3 of 3)
|
# Modules from group: Frequency Mining Laser (3 of 3)
|
||||||
type = "passive"
|
type = "passive"
|
||||||
|
runTime = "late"
|
||||||
|
|
||||||
def handler(fit, module, context):
|
def handler(fit, module, context):
|
||||||
module.preAssignItemAttr("specialtyMiningAmount", module.getModifiedItemAttr("miningAmount"))
|
module.preAssignItemAttr("specialtyMiningAmount", module.getModifiedItemAttr("miningAmount"))
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
# cynosuralDurationBonus
|
# cynosuralDurationBonus
|
||||||
#
|
#
|
||||||
# Used by:
|
# Used by:
|
||||||
# Ships from group: Force Recon Ship (7 of 8)
|
# Ships from group: Force Recon Ship (8 of 9)
|
||||||
type = "passive"
|
type = "passive"
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, ship, context):
|
def handler(fit, ship, context):
|
||||||
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Cynosural Field",
|
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Cynosural Field Generator",
|
||||||
"duration", ship.getModifiedItemAttr("durationBonus"))
|
"duration", ship.getModifiedItemAttr("durationBonus"))
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# cynosuralGeneration
|
# cynosuralGeneration
|
||||||
#
|
#
|
||||||
# Used by:
|
# Used by:
|
||||||
# Modules from group: Cynosural Field (2 of 2)
|
# Modules from group: Cynosural Field Generator (2 of 2)
|
||||||
type = "active"
|
type = "active"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
# cynosuralTheoryConsumptionBonus
|
# cynosuralTheoryConsumptionBonus
|
||||||
#
|
#
|
||||||
# Used by:
|
# Used by:
|
||||||
# Ships from group: Force Recon Ship (7 of 8)
|
# Ships from group: Force Recon Ship (8 of 9)
|
||||||
# Skill: Cynosural Field Theory
|
# Skill: Cynosural Field Theory
|
||||||
type = "passive"
|
type = "passive"
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, container, context):
|
def handler(fit, container, context):
|
||||||
level = container.level if "skill" in context else 1
|
level = container.level if "skill" in context else 1
|
||||||
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Cynosural Field",
|
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Cynosural Field Generator",
|
||||||
"consumptionQuantity",
|
"consumptionQuantity",
|
||||||
container.getModifiedItemAttr("consumptionQuantityBonusPercentage") * level)
|
container.getModifiedItemAttr("consumptionQuantityBonusPercentage") * level)
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
# Not used by any item
|
|
||||||
type = "active", "projected"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, module, context):
|
|
||||||
if "projected" not in context:
|
|
||||||
return
|
|
||||||
fit.ship.boostItemAttr("maxVelocity", module.getModifiedItemAttr("speedFactor"),
|
|
||||||
stackingPenalties=True)
|
|
||||||
11
eos/effects/disintegratorweapondamagemultiply.py
Normal file
11
eos/effects/disintegratorweapondamagemultiply.py
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# disintegratorWeaponDamageMultiply
|
||||||
|
#
|
||||||
|
# Used by:
|
||||||
|
# Modules from group: Entropic Radiation Sink (4 of 4)
|
||||||
|
type = "passive"
|
||||||
|
|
||||||
|
|
||||||
|
def handler(fit, module, context):
|
||||||
|
fit.modules.filteredItemMultiply(lambda mod: mod.item.group.name == "Precursor Weapon",
|
||||||
|
"damageMultiplier", module.getModifiedItemAttr("damageMultiplier"),
|
||||||
|
stackingPenalties=True)
|
||||||
11
eos/effects/disintegratorweaponspeedmultiply.py
Normal file
11
eos/effects/disintegratorweaponspeedmultiply.py
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# disintegratorWeaponSpeedMultiply
|
||||||
|
#
|
||||||
|
# Used by:
|
||||||
|
# Modules from group: Entropic Radiation Sink (4 of 4)
|
||||||
|
type = "passive"
|
||||||
|
|
||||||
|
|
||||||
|
def handler(fit, module, context):
|
||||||
|
fit.modules.filteredItemMultiply(lambda mod: mod.item.group.name == "Precursor Weapon",
|
||||||
|
"speed", module.getModifiedItemAttr("speedMultiplier"),
|
||||||
|
stackingPenalties=True)
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
# doHacking
|
# doHacking
|
||||||
#
|
#
|
||||||
# Used by:
|
# Used by:
|
||||||
# Modules from group: Data Miners (9 of 9)
|
# Modules from group: Data Miners (10 of 10)
|
||||||
type = "active"
|
type = "active"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
10
eos/effects/doomsdayaoebubble.py
Normal file
10
eos/effects/doomsdayaoebubble.py
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# doomsdayAOEBubble
|
||||||
|
#
|
||||||
|
# Used by:
|
||||||
|
# Module: Warp Disruption Burst Projector
|
||||||
|
# Structure Module: Standup Warp Disruption Burst Projector
|
||||||
|
type = "projected", "active"
|
||||||
|
|
||||||
|
|
||||||
|
def handler(fit, module, context):
|
||||||
|
return
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
#
|
#
|
||||||
# Used by:
|
# Used by:
|
||||||
# Module: Sensor Dampening Burst Projector
|
# Module: Sensor Dampening Burst Projector
|
||||||
|
# Structure Module: Standup Sensor Dampening Burst Projector
|
||||||
type = "projected", "active"
|
type = "projected", "active"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
#
|
#
|
||||||
# Used by:
|
# Used by:
|
||||||
# Module: ECM Jammer Burst Projector
|
# Module: ECM Jammer Burst Projector
|
||||||
|
# Structure Module: Standup ECM Jammer Burst Projector
|
||||||
from eos.modifiedAttributeDict import ModifiedAttributeDict
|
from eos.modifiedAttributeDict import ModifiedAttributeDict
|
||||||
|
|
||||||
type = "projected", "active"
|
type = "projected", "active"
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
#
|
#
|
||||||
# Used by:
|
# Used by:
|
||||||
# Module: Energy Neutralization Burst Projector
|
# Module: Energy Neutralization Burst Projector
|
||||||
|
# Structure Module: Standup Energy Neutralization Burst Projector
|
||||||
from eos.saveddata.module import State
|
from eos.saveddata.module import State
|
||||||
from eos.modifiedAttributeDict import ModifiedAttributeDict
|
from eos.modifiedAttributeDict import ModifiedAttributeDict
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
#
|
#
|
||||||
# Used by:
|
# Used by:
|
||||||
# Module: Target Illumination Burst Projector
|
# Module: Target Illumination Burst Projector
|
||||||
|
# Structure Module: Standup Target Illumination Burst Projector
|
||||||
type = "projected", "active"
|
type = "projected", "active"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
#
|
#
|
||||||
# Used by:
|
# Used by:
|
||||||
# Module: Weapon Disruption Burst Projector
|
# Module: Weapon Disruption Burst Projector
|
||||||
|
# Structure Module: Standup Weapon Disruption Burst Projector
|
||||||
|
|
||||||
type = "active", "projected"
|
type = "active", "projected"
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
#
|
#
|
||||||
# Used by:
|
# Used by:
|
||||||
# Module: Stasis Webification Burst Projector
|
# Module: Stasis Webification Burst Projector
|
||||||
|
# Structure Module: Standup Stasis Webification Burst Projector
|
||||||
type = "active", "projected"
|
type = "active", "projected"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
9
eos/effects/doomsdaybeamdot.py
Normal file
9
eos/effects/doomsdaybeamdot.py
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# doomsdayBeamDOT
|
||||||
|
#
|
||||||
|
# Used by:
|
||||||
|
# Modules named like: Lance (4 of 4)
|
||||||
|
type = "active"
|
||||||
|
|
||||||
|
|
||||||
|
def handler(fit, src, context):
|
||||||
|
pass
|
||||||
9
eos/effects/doomsdayconedot.py
Normal file
9
eos/effects/doomsdayconedot.py
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# doomsdayConeDOT
|
||||||
|
#
|
||||||
|
# Used by:
|
||||||
|
# Module: Bosonic Field Generator
|
||||||
|
type = "active"
|
||||||
|
|
||||||
|
|
||||||
|
def handler(fit, src, context):
|
||||||
|
pass
|
||||||
9
eos/effects/doomsdayhog.py
Normal file
9
eos/effects/doomsdayhog.py
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# doomsdayHOG
|
||||||
|
#
|
||||||
|
# Used by:
|
||||||
|
# Module: Gravitational Transportation Field Oscillator
|
||||||
|
type = "active"
|
||||||
|
|
||||||
|
|
||||||
|
def handler(fit, src, context):
|
||||||
|
pass
|
||||||
9
eos/effects/doomsdayslash.py
Normal file
9
eos/effects/doomsdayslash.py
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# doomsdaySlash
|
||||||
|
#
|
||||||
|
# Used by:
|
||||||
|
# Modules named like: Reaper (4 of 4)
|
||||||
|
type = "active"
|
||||||
|
|
||||||
|
|
||||||
|
def handler(fit, src, context):
|
||||||
|
pass
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
# droneArmorDamageBonusEffect
|
# droneArmorDamageBonusEffect
|
||||||
#
|
#
|
||||||
# Used by:
|
# Used by:
|
||||||
# Ships from group: Logistics (5 of 6)
|
# Ships from group: Logistics (6 of 7)
|
||||||
# Ship: Exequror
|
# Ship: Exequror
|
||||||
# Ship: Scythe
|
# Ship: Scythe
|
||||||
type = "passive"
|
type = "passive"
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
# Not used by any item
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, skill, context):
|
|
||||||
fit.drones.filteredItemBoost(lambda drone: drone.item.requiresSkill("Drones"),
|
|
||||||
"damageMultiplier", skill.getModifiedItemAttr("damageMultiplierBonus") * skill.level)
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
# droneHullRepairBonusEffect
|
# droneHullRepairBonusEffect
|
||||||
#
|
#
|
||||||
# Used by:
|
# Used by:
|
||||||
# Ships from group: Logistics (5 of 6)
|
# Ships from group: Logistics (6 of 7)
|
||||||
# Ship: Exequror
|
# Ship: Exequror
|
||||||
# Ship: Scythe
|
# Ship: Scythe
|
||||||
type = "passive"
|
type = "passive"
|
||||||
|
|||||||
@@ -2,10 +2,12 @@
|
|||||||
#
|
#
|
||||||
# Used by:
|
# Used by:
|
||||||
# Modules named like: Drone Speed Augmentor (6 of 8)
|
# Modules named like: Drone Speed Augmentor (6 of 8)
|
||||||
|
# Implant: Overmind 'Goliath' Drone Tuner T25-10S
|
||||||
|
# Implant: Overmind 'Hawkmoth' Drone Tuner S10-25T
|
||||||
type = "passive"
|
type = "passive"
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, container, context):
|
def handler(fit, container, context):
|
||||||
level = container.level if "skill" in context else 1
|
level = container.level if "skill" in context else 1
|
||||||
fit.drones.filteredItemBoost(lambda drone: drone.item.requiresSkill("Drones"),
|
fit.drones.filteredItemBoost(lambda drone: drone.item.requiresSkill("Drones"),
|
||||||
"maxVelocity", container.getModifiedItemAttr("droneMaxVelocityBonus") * level)
|
"maxVelocity", container.getModifiedItemAttr("droneMaxVelocityBonus") * level, stackingPenalties=True)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# droneShieldBonusBonusEffect
|
# droneShieldBonusBonusEffect
|
||||||
#
|
#
|
||||||
# Used by:
|
# Used by:
|
||||||
# Ships from group: Logistics (5 of 6)
|
# Ships from group: Logistics (6 of 7)
|
||||||
# Ship: Exequror
|
# Ship: Exequror
|
||||||
# Ship: Scythe
|
# Ship: Scythe
|
||||||
type = "passive"
|
type = "passive"
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
# Not used by any item
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, src, context):
|
|
||||||
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Information Command Specialist"),
|
|
||||||
"commandBonusHidden",
|
|
||||||
src.getModifiedItemAttr("eliteBonusCommandDestroyer1"),
|
|
||||||
skill="Command Destroyers")
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
# Not used by any item
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, src, context):
|
|
||||||
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("High Speed Maneuvering"), "signatureRadiusBonus",
|
|
||||||
src.getModifiedItemAttr("eliteBonusCommandDestroyer3"), skill="Command Destroyers")
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
# Not used by any item
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, module, context):
|
|
||||||
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Information Command Specialist"),
|
|
||||||
"commandBonusHidden", module.getModifiedItemAttr("eliteBonusCommandShips3"), skill="Command Ships")
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
# eliteBonusCoverOpsScanProbeStrength2
|
# eliteBonusCoverOpsScanProbeStrength2
|
||||||
#
|
#
|
||||||
# Used by:
|
# Used by:
|
||||||
# Ships from group: Covert Ops (7 of 7)
|
# Ships from group: Covert Ops (8 of 8)
|
||||||
type = "passive"
|
type = "passive"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
10
eos/effects/elitebonuscovertops3pctdamagepercycle.py
Normal file
10
eos/effects/elitebonuscovertops3pctdamagepercycle.py
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# eliteBonusCovertOps3PCTdamagePerCycle
|
||||||
|
#
|
||||||
|
# Used by:
|
||||||
|
# Ship: Hydra
|
||||||
|
type = "passive"
|
||||||
|
|
||||||
|
|
||||||
|
def handler(fit, src, context):
|
||||||
|
fit.modules.filteredItemIncrease(lambda mod: mod.item.requiresSkill("Small Precursor Weapon"), "damageMultiplierBonusPerCycle",
|
||||||
|
src.getModifiedItemAttr("eliteBonusCovertOps3"), skill="Covert Ops")
|
||||||
20
eos/effects/elitebonusflagcruiserallresistances1.py
Normal file
20
eos/effects/elitebonusflagcruiserallresistances1.py
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
# eliteBonusFlagCruiserAllResistances1
|
||||||
|
#
|
||||||
|
# Used by:
|
||||||
|
# Ship: Monitor
|
||||||
|
type = "passive"
|
||||||
|
|
||||||
|
|
||||||
|
def handler(fit, src, context):
|
||||||
|
fit.ship.boostItemAttr("explosiveDamageResonance", src.getModifiedItemAttr("eliteBonusFlagCruisers1"), skill="Flag Cruisers")
|
||||||
|
fit.ship.boostItemAttr("shieldKineticDamageResonance", src.getModifiedItemAttr("eliteBonusFlagCruisers1"), skill="Flag Cruisers")
|
||||||
|
fit.ship.boostItemAttr("shieldExplosiveDamageResonance", src.getModifiedItemAttr("eliteBonusFlagCruisers1"), skill="Flag Cruisers")
|
||||||
|
fit.ship.boostItemAttr("armorThermalDamageResonance", src.getModifiedItemAttr("eliteBonusFlagCruisers1"), skill="Flag Cruisers")
|
||||||
|
fit.ship.boostItemAttr("thermalDamageResonance", src.getModifiedItemAttr("eliteBonusFlagCruisers1"), skill="Flag Cruisers")
|
||||||
|
fit.ship.boostItemAttr("shieldEmDamageResonance", src.getModifiedItemAttr("eliteBonusFlagCruisers1"), skill="Flag Cruisers")
|
||||||
|
fit.ship.boostItemAttr("armorExplosiveDamageResonance", src.getModifiedItemAttr("eliteBonusFlagCruisers1"), skill="Flag Cruisers")
|
||||||
|
fit.ship.boostItemAttr("armorEmDamageResonance", src.getModifiedItemAttr("eliteBonusFlagCruisers1"), skill="Flag Cruisers")
|
||||||
|
fit.ship.boostItemAttr("shieldThermalDamageResonance", src.getModifiedItemAttr("eliteBonusFlagCruisers1"), skill="Flag Cruisers")
|
||||||
|
fit.ship.boostItemAttr("kineticDamageResonance", src.getModifiedItemAttr("eliteBonusFlagCruisers1"), skill="Flag Cruisers")
|
||||||
|
fit.ship.boostItemAttr("armorKineticDamageResonance", src.getModifiedItemAttr("eliteBonusFlagCruisers1"), skill="Flag Cruisers")
|
||||||
|
fit.ship.boostItemAttr("emDamageResonance", src.getModifiedItemAttr("eliteBonusFlagCruisers1"), skill="Flag Cruisers")
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
# Not used by any item
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, ship, context):
|
|
||||||
fit.ship.increaseItemAttr("droneCapacity", ship.getModifiedItemAttr("eliteBonusGunship2"), skill="Assault Frigates")
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
# Not used by any item
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, src, context):
|
|
||||||
fit.drones.filteredItemBoost(lambda mod: mod.item.requiresSkill("Drones"), "trackingSpeed",
|
|
||||||
src.getModifiedItemAttr("eliteBonusGunship2"), stackingPenalties=True, skill="Assault Frigates")
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
# Not used by any item
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, ship, context):
|
|
||||||
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Small Projectile Turret"),
|
|
||||||
"damageMultiplier", ship.getModifiedItemAttr("eliteBonusGunship2"),
|
|
||||||
skill="Assault Frigates")
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
# Not used by any item
|
|
||||||
type = "passive"
|
|
||||||
|
|
||||||
|
|
||||||
def handler(fit, ship, context):
|
|
||||||
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Small Projectile Turret"),
|
|
||||||
"maxRange", ship.getModifiedItemAttr("eliteBonusGunship1"), skill="Assault Frigates")
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user