Compare commits
1686 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cb3bbd169f | ||
|
|
ab107bfc0d | ||
|
|
d0b5b49bf8 | ||
|
|
1b4b1d5c9f | ||
|
|
aee800ab7a | ||
|
|
895b46307a | ||
|
|
d300d45f22 | ||
|
|
1897008c72 | ||
|
|
3942c6cd55 | ||
|
|
f0f7b5aaf7 | ||
|
|
80bdaa1edc | ||
|
|
39acb224d1 | ||
|
|
f51d565db8 | ||
|
|
d608cf6536 | ||
|
|
0b49bd1985 | ||
|
|
fce69005a9 | ||
|
|
b73420b156 | ||
|
|
fb863cb39b | ||
|
|
8247ff15ed | ||
|
|
af8db9062c | ||
|
|
88d5e1cca8 | ||
|
|
57544e615f | ||
|
|
61a92d55ae | ||
|
|
940965f03d | ||
|
|
30a254e9be | ||
|
|
581782af28 | ||
|
|
72cad1409f | ||
|
|
e7e4985761 | ||
|
|
a3454e50d7 | ||
|
|
75b8f5e543 | ||
|
|
1a0b22ef15 | ||
|
|
bc78d1a561 | ||
|
|
00b953a04e | ||
|
|
aa0ef529f5 | ||
|
|
bd134bf9c9 | ||
|
|
752267c521 | ||
|
|
34635e3460 | ||
|
|
ba0b4513f1 | ||
|
|
4764808450 | ||
|
|
c66fd67510 | ||
|
|
3997ca6454 | ||
|
|
4242100c53 | ||
|
|
32adcc3676 | ||
|
|
80c26606f0 | ||
|
|
a7852098f1 | ||
|
|
bdb7f522fb | ||
|
|
2461331e32 | ||
|
|
3464f40da3 | ||
|
|
3b2b79d539 | ||
|
|
8616fc6b05 | ||
|
|
9e9c001422 | ||
|
|
93bbd34055 | ||
|
|
cac953e812 | ||
|
|
aeb3662414 | ||
|
|
2888e87bb8 | ||
|
|
094ebb8020 | ||
|
|
54ad52edc2 | ||
|
|
0e869f3cb5 | ||
|
|
4d40af6ac0 | ||
|
|
79a2f31056 | ||
|
|
b2341bf75c | ||
|
|
c4c4b473e5 | ||
|
|
6e26ccf25d | ||
|
|
83bfad3546 | ||
|
|
90f6fff1ae | ||
|
|
52f2b52990 | ||
|
|
48ed4b0e49 | ||
|
|
c3c609e7b9 | ||
|
|
6cd8fa6b0c | ||
|
|
ffb6d398d7 | ||
|
|
52674b4668 | ||
|
|
4ae2370137 | ||
|
|
e5d19a9819 | ||
|
|
dd75d88d2f | ||
|
|
65ea01218a | ||
|
|
7a2234cd25 | ||
|
|
11ede2756e | ||
|
|
3e51fab387 | ||
|
|
962f413421 | ||
|
|
ae6c938abb | ||
|
|
68faae69c5 | ||
|
|
d6be07f1b8 | ||
|
|
064a012b25 | ||
|
|
d26f533111 | ||
|
|
69575dbab3 | ||
|
|
9f4a430412 | ||
|
|
23843be981 | ||
|
|
486e3ffc0a | ||
|
|
8127e5a66f | ||
|
|
53167a3b52 | ||
|
|
1b77247c40 | ||
|
|
24374cf7e3 | ||
|
|
88de54ec90 | ||
|
|
3035d569cc | ||
|
|
51f9ad5a2c | ||
|
|
20fbe2fbbe | ||
|
|
bf073a84c8 | ||
|
|
35b158dba7 | ||
|
|
eb4f6f2e9f | ||
|
|
0ff56e3a68 | ||
|
|
4ddc59589c | ||
|
|
1e15d7a33e | ||
|
|
af67690e75 | ||
|
|
13969bdd29 | ||
|
|
a3f5583326 | ||
|
|
f137c11c6c | ||
|
|
8d6afbd80d | ||
|
|
c46fa206f6 | ||
|
|
e8da206389 | ||
|
|
b2b8cf2357 | ||
|
|
a4fd88a440 | ||
|
|
a1624f61ae | ||
|
|
5ee26fc3f4 | ||
|
|
93ffb66e59 | ||
|
|
4b9bcfb014 | ||
|
|
a161c09441 | ||
|
|
0c396f76b2 | ||
|
|
b2408b1a7c | ||
|
|
eaa2ad4f05 | ||
|
|
88ce7837a6 | ||
|
|
4054c7d12d | ||
|
|
2d3fd513d8 | ||
|
|
404b593ab8 | ||
|
|
b9f1dea914 | ||
|
|
f3385e6453 | ||
|
|
a2e55f7861 | ||
|
|
761e0114a5 | ||
|
|
dcae128d06 | ||
|
|
a891a8badc | ||
|
|
f3ec5b533e | ||
|
|
d50397edf1 | ||
|
|
49986f22c8 | ||
|
|
70f279d978 | ||
|
|
84c5a75b6c | ||
|
|
97663e87a6 | ||
|
|
5956edcb8e | ||
|
|
7e975f2134 | ||
|
|
40de13f9c7 | ||
|
|
70946539e3 | ||
|
|
996c594dfc | ||
|
|
d8eeb79b63 | ||
|
|
cf61dd0704 | ||
|
|
6fd5f1563a | ||
|
|
3c643c917a | ||
|
|
378be0ef86 | ||
|
|
29e90969eb | ||
|
|
fb724514f3 | ||
|
|
1f11da75d2 | ||
|
|
fcc433fe17 | ||
|
|
617bdf9910 | ||
|
|
3b2aa92eb7 | ||
|
|
4c17b56e28 | ||
|
|
ad13c83f93 | ||
|
|
768d67a8ae | ||
|
|
d827cda395 | ||
|
|
106e6c98a3 | ||
|
|
e7ad797d4e | ||
|
|
6e1fb71194 | ||
|
|
9f5dc7f091 | ||
|
|
57b273639c | ||
|
|
278d690a6b | ||
|
|
c91c0f7b47 | ||
|
|
6a406f4d45 | ||
|
|
eecaa850e0 | ||
|
|
f332332eaa | ||
|
|
79b0e76be0 | ||
|
|
30650efd98 | ||
|
|
b7759c8151 | ||
|
|
0382c35ac0 | ||
|
|
819262c93f | ||
|
|
db60f4bb1c | ||
|
|
7785ca55c2 | ||
|
|
75dcceff43 | ||
|
|
af91979d4c | ||
|
|
52cd4a77dd | ||
|
|
8a1da3c0ed | ||
|
|
9d67c36c32 | ||
|
|
f283709e62 | ||
|
|
5035559b08 | ||
|
|
01e1438382 | ||
|
|
4eee472043 | ||
|
|
5f89a1b9ca | ||
|
|
b9db5ad662 | ||
|
|
5b8084e1fa | ||
|
|
ab67b67e4c | ||
|
|
f825931f92 | ||
|
|
6113edf2ce | ||
|
|
8413443c26 | ||
|
|
f67fb31bc5 | ||
|
|
d321ec5ed1 | ||
|
|
084ae184f9 | ||
|
|
d1ec652f7b | ||
|
|
7a2a6586be | ||
|
|
392dcf3092 | ||
|
|
8a983c784d | ||
|
|
a443263439 | ||
|
|
3e766b9f54 | ||
|
|
89b9501f35 | ||
|
|
816ae84005 | ||
|
|
c0e425cf46 | ||
|
|
9ebb4c7d12 | ||
|
|
46c3b35028 | ||
|
|
ef2b8be726 | ||
|
|
df51078858 | ||
|
|
5783b61631 | ||
|
|
98a53381fb | ||
|
|
daccfa5fe3 | ||
|
|
d82c24616f | ||
|
|
905ca3dcfc | ||
|
|
b4fb687c4f | ||
|
|
39fb2ae5ab | ||
|
|
b40beb0d1d | ||
|
|
4a96b9bb00 | ||
|
|
f83a178982 | ||
|
|
986b4276e1 | ||
|
|
6f6f418ec9 | ||
|
|
1463571cd7 | ||
|
|
7dfb0a81e3 | ||
|
|
9699d9467a | ||
|
|
08a2872527 | ||
|
|
7c81a807ea | ||
|
|
3bf7031e6a | ||
|
|
503fc980f4 | ||
|
|
efed11eb97 | ||
|
|
330820062f | ||
|
|
45d157fe3f | ||
|
|
812dea385c | ||
|
|
c582bdea46 | ||
|
|
e6c6a9381b | ||
|
|
4b4c0755c6 | ||
|
|
aeb0539c91 | ||
|
|
9feafa45f5 | ||
|
|
927df391f3 | ||
|
|
cbef6adeb1 | ||
|
|
2dee221861 | ||
|
|
0b175cb25d | ||
|
|
0820338b55 | ||
|
|
a2b46eee6f | ||
|
|
09a435320a | ||
|
|
bf56200c06 | ||
|
|
2d18df2011 | ||
|
|
bab87c0da8 | ||
|
|
148f272500 | ||
|
|
6de4af727b | ||
|
|
75946b9d14 | ||
|
|
1c63ee6743 | ||
|
|
efdaf0d986 | ||
|
|
3f6aeac33d | ||
|
|
d9692004cc | ||
|
|
67a12eecad | ||
|
|
37999e0870 | ||
|
|
66dc1e94f5 | ||
|
|
ebcce194a0 | ||
|
|
95eab94c80 | ||
|
|
41a6dbe06c | ||
|
|
fa22b0ec12 | ||
|
|
be60a367e8 | ||
|
|
608de34205 | ||
|
|
0a8f2edb05 | ||
|
|
41b08f38c5 | ||
|
|
a83c0b2e9a | ||
|
|
8f853c8f18 | ||
|
|
b4071f6dcb | ||
|
|
6b70418861 | ||
|
|
de0235ad94 | ||
|
|
c278c632b3 | ||
|
|
6392330e70 | ||
|
|
160ae4e244 | ||
|
|
a6c9bd3182 | ||
|
|
801eadd8a8 | ||
|
|
211dab1297 | ||
|
|
0c3b39ffdc | ||
|
|
c31f88a318 | ||
|
|
e9eb981782 | ||
|
|
83bde8a781 | ||
|
|
52f352bf94 | ||
|
|
b419a96d69 | ||
|
|
eb3d5b62f5 | ||
|
|
1c5f578d88 | ||
|
|
db3aae1388 | ||
|
|
0b08eb72a6 | ||
|
|
cbc81376be | ||
|
|
27e9901d05 | ||
|
|
532c36677c | ||
|
|
0c20c6ecb7 | ||
|
|
fbb3240ebb | ||
|
|
bffae90022 | ||
|
|
61f6368591 | ||
|
|
1027ca2a85 | ||
|
|
5acc42f739 | ||
|
|
1edeaeb94e | ||
|
|
879acc6077 | ||
|
|
4e5d87104c | ||
|
|
e6a24b8ba1 | ||
|
|
fd190c7770 | ||
|
|
d56869aefa | ||
|
|
c8a15bb7e4 | ||
|
|
07c28c3f6d | ||
|
|
855957b099 | ||
|
|
50959317e9 | ||
|
|
20a681a71f | ||
|
|
4e2d558b36 | ||
|
|
0430b908f4 | ||
|
|
a84e9f2aaa | ||
|
|
7ce571e59c | ||
|
|
545a64f7dc | ||
|
|
10c999a4a2 | ||
|
|
d0e026d597 | ||
|
|
0b1e2bf19b | ||
|
|
71c2c7ad05 | ||
|
|
97f5bf3cc4 | ||
|
|
bb9573b85a | ||
|
|
e1f53dfc67 | ||
|
|
87481e0a4d | ||
|
|
f7aa58e385 | ||
|
|
ea5c78f814 | ||
|
|
c93c016e9c | ||
|
|
4bb6664c7e | ||
|
|
9578068a02 | ||
|
|
30e5f2b17d | ||
|
|
f959760c07 | ||
|
|
e7db2350bc | ||
|
|
0585dabf7a | ||
|
|
a3c6e3f1df | ||
|
|
9f57278644 | ||
|
|
afc35cf623 | ||
|
|
6d8523054b | ||
|
|
fdecd55278 | ||
|
|
7e7f95916b | ||
|
|
ab52c65dcf | ||
|
|
ed4d0eb5d0 | ||
|
|
4bc9143306 | ||
|
|
a4f558c77a | ||
|
|
e4f226a9c5 | ||
|
|
c7d34049fa | ||
|
|
ee06e620c6 | ||
|
|
b48110db3b | ||
|
|
8413046dd8 | ||
|
|
83a5a82e18 | ||
|
|
771c5fbe3d | ||
|
|
74f16d0137 | ||
|
|
5d5d354f7d | ||
|
|
8f5f27755d | ||
|
|
4cb92cdb06 | ||
|
|
9e067ebdd6 | ||
|
|
fd5fcc9928 | ||
|
|
c0b2abb5fd | ||
|
|
2c8620a75c | ||
|
|
62f6ed0878 | ||
|
|
886b62bbad | ||
|
|
4bd58589fc | ||
|
|
0ce4144767 | ||
|
|
cde945f40e | ||
|
|
e2126a2693 | ||
|
|
c9f6d92bef | ||
|
|
fbf4c411c1 | ||
|
|
ce5218db58 | ||
|
|
e2ea7f9b87 | ||
|
|
94d9f04814 | ||
|
|
c86dbac04a | ||
|
|
f36eed32b9 | ||
|
|
cd752209ad | ||
|
|
fe37d619b9 | ||
|
|
043f4688ef | ||
|
|
949f171579 | ||
|
|
87d586a30e | ||
|
|
783f453da3 | ||
|
|
6dcf889ffe | ||
|
|
8d44879cc6 | ||
|
|
e7b813962d | ||
|
|
22fadab3b3 | ||
|
|
91741ec29c | ||
|
|
8269d842ce | ||
|
|
d038bdb6ce | ||
|
|
6cef301b94 | ||
|
|
e7ffbd817c | ||
|
|
97067a6ee2 | ||
|
|
7d1a8f5404 | ||
|
|
43bcf0cf3b | ||
|
|
71751ee18d | ||
|
|
ed105b102d | ||
|
|
f2662045ed | ||
|
|
ecb77b0283 | ||
|
|
4d4869842e | ||
|
|
47300b42b0 | ||
|
|
609565af5f | ||
|
|
0c75f920de | ||
|
|
e7b51f313b | ||
|
|
e8204fc983 | ||
|
|
aa69af64fb | ||
|
|
41f734b04d | ||
|
|
8ad6f3abcc | ||
|
|
e4875903f1 | ||
|
|
0a04de04f1 | ||
|
|
20427fdffa | ||
|
|
0fd0abc6c0 | ||
|
|
70f7fc29d4 | ||
|
|
b0c1aff783 | ||
|
|
4909c28ed9 | ||
|
|
9e6745f691 | ||
|
|
6c3ccb259f | ||
|
|
6c8d80777c | ||
|
|
2db61f93ac | ||
|
|
ad059cbc38 | ||
|
|
87e7e04c5e | ||
|
|
c083d059c9 | ||
|
|
ebd44d3b60 | ||
|
|
51f5d04889 | ||
|
|
0f4d574115 | ||
|
|
1feb4a5e6d | ||
|
|
f861b75c7d | ||
|
|
3530ca8989 | ||
|
|
6b074ed4b2 | ||
|
|
671823b4fa | ||
|
|
8ceebf1546 | ||
|
|
376495836a | ||
|
|
98212df076 | ||
|
|
1316c9235a | ||
|
|
a0905d5695 | ||
|
|
2a35e22dd2 | ||
|
|
f86a07daee | ||
|
|
997628622a | ||
|
|
563e015c92 | ||
|
|
64533de597 | ||
|
|
3776b99c39 | ||
|
|
a5d1350815 | ||
|
|
82e44397ff | ||
|
|
335c880af2 | ||
|
|
966efa0669 | ||
|
|
526a61381d | ||
|
|
d01f68f731 | ||
|
|
1235b41172 | ||
|
|
21f3a053ed | ||
|
|
9e960d461b | ||
|
|
02fad0a9cc | ||
|
|
627b78043b | ||
|
|
89b439c3c8 | ||
|
|
4a4a9f267b | ||
|
|
f605aabaa9 | ||
|
|
d82d0ae923 | ||
|
|
1e111d29d9 | ||
|
|
110def97d9 | ||
|
|
5bacdfa951 | ||
|
|
914f1b38f8 | ||
|
|
2aff73a958 | ||
|
|
13c2eae1f4 | ||
|
|
8f4258b119 | ||
|
|
4eba89603e | ||
|
|
61f75d7331 | ||
|
|
cd387c5c3a | ||
|
|
2fa32e5099 | ||
|
|
f12da57720 | ||
|
|
964d1a0d87 | ||
|
|
0cb14461ba | ||
|
|
d05f9c5540 | ||
|
|
690580c57d | ||
|
|
5039763a52 | ||
|
|
2cc54ffa5b | ||
|
|
0a9b78f013 | ||
|
|
e42fa7ad20 | ||
|
|
9c179e559b | ||
|
|
6dd10b74d5 | ||
|
|
a073b0ab18 | ||
|
|
4f253999ac | ||
|
|
9108a7bae6 | ||
|
|
6ba88323fe | ||
|
|
e112e3f949 | ||
|
|
1ed4e9f5bb | ||
|
|
b6c5f202e4 | ||
|
|
976b39414f | ||
|
|
d74887eaa1 | ||
|
|
7fb72bf0e2 | ||
|
|
b0126206e1 | ||
|
|
9c240850b8 | ||
|
|
5b7b50f555 | ||
|
|
f591403b7d | ||
|
|
4b028b3435 | ||
|
|
cbcf237d80 | ||
|
|
a815c564fb | ||
|
|
cb12501d5b | ||
|
|
86aeabc911 | ||
|
|
5e2a455045 | ||
|
|
86dddd0253 | ||
|
|
4677de80c1 | ||
|
|
fbcbca6f24 | ||
|
|
7024273a02 | ||
|
|
070bb4d2d1 | ||
|
|
f33e924cdf | ||
|
|
18fcc6e596 | ||
|
|
59e909ae3a | ||
|
|
66766b43c7 | ||
|
|
8c6c4c2630 | ||
|
|
ea2ed7d776 | ||
|
|
a708c8b7ea | ||
|
|
12ca4cda91 | ||
|
|
85f73fee02 | ||
|
|
1b5b6d424b | ||
|
|
126a764918 | ||
|
|
f796a24956 | ||
|
|
e815cff291 | ||
|
|
0ad89ebc04 | ||
|
|
a4b9579d25 | ||
|
|
e65b6670ec | ||
|
|
1665e75068 | ||
|
|
6d01d893f7 | ||
|
|
cb9616a381 | ||
|
|
d218fb926a | ||
|
|
39276b4b03 | ||
|
|
51ba999ee1 | ||
|
|
52593252c5 | ||
|
|
718f56172e | ||
|
|
34b7961814 | ||
|
|
897b90f044 | ||
|
|
a9778e6e68 | ||
|
|
ccaf888e8b | ||
|
|
29821003fe | ||
|
|
3f7ba23dff | ||
|
|
6fd243522d | ||
|
|
368bf2258f | ||
|
|
533ddb874e | ||
|
|
baaf126c15 | ||
|
|
5b2bfe10bc | ||
|
|
17b24c3389 | ||
|
|
55b3e8639f | ||
|
|
22dad88ff7 | ||
|
|
ce3b0f2d8f | ||
|
|
a87e2a56d2 | ||
|
|
bb0ee26e4f | ||
|
|
adf5189541 | ||
|
|
82077936bb | ||
|
|
5094a6fc49 | ||
|
|
274ef166ef | ||
|
|
66c27fab13 | ||
|
|
56bcabedf7 | ||
|
|
79a9541394 | ||
|
|
7e35de3c33 | ||
|
|
7b90044544 | ||
|
|
5a7e5450dc | ||
|
|
ec2ec59be0 | ||
|
|
beb25bd595 | ||
|
|
c2919f7e7a | ||
|
|
cee9d86835 | ||
|
|
9dbedc6e5d | ||
|
|
53310ed80a | ||
|
|
9251c55be2 | ||
|
|
25658f2a0a | ||
|
|
4f9e64588f | ||
|
|
afeb4d033b | ||
|
|
2569b2139d | ||
|
|
d88923bb71 | ||
|
|
d0c6d9a489 | ||
|
|
1bdea1b8d8 | ||
|
|
6ea90ea828 | ||
|
|
6217ae78e3 | ||
|
|
20529d3ebc | ||
|
|
c8fa116a24 | ||
|
|
2904bc69d9 | ||
|
|
38b3ad07b7 | ||
|
|
fe765e5a5b | ||
|
|
6e7514491c | ||
|
|
eb5b50b3e9 | ||
|
|
82b908f0ab | ||
|
|
336256fc71 | ||
|
|
49a7da6393 | ||
|
|
a8c645f00d | ||
|
|
62d8cb0b25 | ||
|
|
f5028a4937 | ||
|
|
203612853b | ||
|
|
8e8e95cd2d | ||
|
|
696e6cb84b | ||
|
|
67940476af | ||
|
|
0dd9d2b460 | ||
|
|
6b2f2d0664 | ||
|
|
636bfdb530 | ||
|
|
c0d6618808 | ||
|
|
e21a3347ac | ||
|
|
59a68ee981 | ||
|
|
7a072746d9 | ||
|
|
a6799dd29b | ||
|
|
163ecb160a | ||
|
|
f00d1f9505 | ||
|
|
87b489a541 | ||
|
|
f670ade2ee | ||
|
|
b5508c1152 | ||
|
|
564c258c86 | ||
|
|
745ff1a270 | ||
|
|
e727ee6d4a | ||
|
|
e6a39a8255 | ||
|
|
43bff5c34d | ||
|
|
c046a1b474 | ||
|
|
209e3f03c1 | ||
|
|
dbf05a1419 | ||
|
|
5af35b6771 | ||
|
|
00abba11ae | ||
|
|
d268d94f76 | ||
|
|
76af3e3077 | ||
|
|
54bade668e | ||
|
|
5a3ec8f407 | ||
|
|
c043664ad6 | ||
|
|
7e9ca6fbb6 | ||
|
|
e9a82652a0 | ||
|
|
db2e6b6973 | ||
|
|
da9278ad8d | ||
|
|
5a9307e9a7 | ||
|
|
f31fd622dd | ||
|
|
6723157ca5 | ||
|
|
956448a1a5 | ||
|
|
4be675f977 | ||
|
|
7924051c0d | ||
|
|
83b5f6ef2d | ||
|
|
0f26d62a0a | ||
|
|
a9f11256cd | ||
|
|
ead0547d59 | ||
|
|
89e29bce62 | ||
|
|
058db5d5d0 | ||
|
|
76aa409f89 | ||
|
|
923d0497e6 | ||
|
|
dd4f4b83fc | ||
|
|
c2bed82db5 | ||
|
|
9a444da343 | ||
|
|
9dd6a77c76 | ||
|
|
895725df64 | ||
|
|
6f07576748 | ||
|
|
550a11962e | ||
|
|
c3883cdad0 | ||
|
|
e9e2cd614d | ||
|
|
55e1759b47 | ||
|
|
33f5215e6d | ||
|
|
5459a646b3 | ||
|
|
6229f99a2e | ||
|
|
0e5b95e3aa | ||
|
|
72d7c1ba54 | ||
|
|
ee9a2ee03d | ||
|
|
6bfbcc4aa9 | ||
|
|
a9d7ed50b7 | ||
|
|
bc77ebc10c | ||
|
|
cbdce79d7d | ||
|
|
46dfa064d0 | ||
|
|
0478af2564 | ||
|
|
750388a425 | ||
|
|
ea9155b903 | ||
|
|
d34f228d2f | ||
|
|
093043750b | ||
|
|
4fb0c246db | ||
|
|
5e951f27c9 | ||
|
|
49253964d8 | ||
|
|
4ff1d0c2e1 | ||
|
|
2385011f96 | ||
|
|
7527f9326c | ||
|
|
9c7b80f066 | ||
|
|
48facc0978 | ||
|
|
22a6c4e8af | ||
|
|
bd6cfa6461 | ||
|
|
c63dca1c0d | ||
|
|
c6af151bf3 | ||
|
|
ccc20a9716 | ||
|
|
47605583d1 | ||
|
|
58e83c11f0 | ||
|
|
836a4eb892 | ||
|
|
6d50a747e3 | ||
|
|
4344af1f02 | ||
|
|
6510d83524 | ||
|
|
6d01193e1e | ||
|
|
8c3d6d05ab | ||
|
|
733a064c79 | ||
|
|
8715f6a301 | ||
|
|
b51725633e | ||
|
|
5ec11c61bd | ||
|
|
ab038a4d46 | ||
|
|
a976a7affb | ||
|
|
2f76684113 | ||
|
|
1ad7f12e2d | ||
|
|
017b83d375 | ||
|
|
650b443fd0 | ||
|
|
8aa1509f47 | ||
|
|
b21bf2d544 | ||
|
|
777bd60f88 | ||
|
|
7889db43a8 | ||
|
|
ae3aa20508 | ||
|
|
84e754dd10 | ||
|
|
b9618d66f2 | ||
|
|
daa7b20e4a | ||
|
|
48a7254aa3 | ||
|
|
2bc63b37e4 | ||
|
|
33afab7294 | ||
|
|
8010a82776 | ||
|
|
048b7bd32f | ||
|
|
28fa0b070d | ||
|
|
dc0be93b25 | ||
|
|
5e49d2d8d6 | ||
|
|
1d8efe5f9d | ||
|
|
8b791b68d3 | ||
|
|
521174f911 | ||
|
|
a6f7bd9099 | ||
|
|
fed964e0f7 | ||
|
|
77b4f3e930 | ||
|
|
351b8c2469 | ||
|
|
ee9f65d4a3 | ||
|
|
a1a69f62e1 | ||
|
|
ff52fec663 | ||
|
|
5743d30851 | ||
|
|
de02061b5e | ||
|
|
b64c38809e | ||
|
|
a163db485b | ||
|
|
47f7507af3 | ||
|
|
568e55e373 | ||
|
|
79e722b5ff | ||
|
|
415252a5b2 | ||
|
|
307bb7aeec | ||
|
|
397da91ab4 | ||
|
|
fdd0c25a25 | ||
|
|
d691e9f39d | ||
|
|
a5cbe19d23 | ||
|
|
5661124d86 | ||
|
|
1346e163e9 | ||
|
|
d5626bfe52 | ||
|
|
0900c13fa1 | ||
|
|
5019f200b7 | ||
|
|
3b41ded045 | ||
|
|
9f84b84819 | ||
|
|
f61f3af687 | ||
|
|
0a6f7ac817 | ||
|
|
153e6c5f1b | ||
|
|
e24d96da6f | ||
|
|
59e5099ed6 | ||
|
|
b8e6e5df61 | ||
|
|
16851a457e | ||
|
|
1c5bb605c3 | ||
|
|
dc12d58054 | ||
|
|
120e0f6971 | ||
|
|
b9136e4e98 | ||
|
|
197b97d0db | ||
|
|
912136d174 | ||
|
|
653c85c58d | ||
|
|
638c99981d | ||
|
|
71e61abcd6 | ||
|
|
fa1d440bb0 | ||
|
|
f0064e35bc | ||
|
|
88d208268a | ||
|
|
6aa90a44f7 | ||
|
|
3c9322ee08 | ||
|
|
b2f47e6b70 | ||
|
|
c905a870e0 | ||
|
|
b2360e42c6 | ||
|
|
0da621745a | ||
|
|
d8fc3851a7 | ||
|
|
edd3fb3440 | ||
|
|
a105c017d5 | ||
|
|
dd1034e37b | ||
|
|
41f16a54de | ||
|
|
b91510efb3 | ||
|
|
745d8122f5 | ||
|
|
98e4f7409b | ||
|
|
cdb3971b8d | ||
|
|
d01b8c7ad1 | ||
|
|
7c35b6e95a | ||
|
|
86b35fc43d | ||
|
|
5b2c8ac337 | ||
|
|
734d4a912b | ||
|
|
4386d3169a | ||
|
|
35348f1150 | ||
|
|
36b27458b6 | ||
|
|
bbb2153112 | ||
|
|
9ec1d8f16b | ||
|
|
e1858df645 | ||
|
|
3b1066e16f | ||
|
|
75709a7812 | ||
|
|
81c68e90cb | ||
|
|
bc9110b344 | ||
|
|
89d5618232 | ||
|
|
1e8b844eac | ||
|
|
3fc278c7b7 | ||
|
|
db546412f1 | ||
|
|
3b42b604e1 | ||
|
|
f22caed088 | ||
|
|
1f4e611629 | ||
|
|
8879593381 | ||
|
|
22b7086bea | ||
|
|
c097841d78 | ||
|
|
44e4ffbe62 | ||
|
|
84f60f63b8 | ||
|
|
572f358bda | ||
|
|
46df7726c3 | ||
|
|
3abfaf1bca | ||
|
|
f119afe436 | ||
|
|
94908bc599 | ||
|
|
cabcfc7136 | ||
|
|
d2c6305548 | ||
|
|
414af6a5d5 | ||
|
|
ecab13af57 | ||
|
|
47f9aece38 | ||
|
|
6dc64cf2f6 | ||
|
|
832582caa9 | ||
|
|
828661e9de | ||
|
|
52f78ee4ed | ||
|
|
6029b6d67f | ||
|
|
9d744580a1 | ||
|
|
b295f51c29 | ||
|
|
5c6aea0d50 | ||
|
|
99bf50ee52 | ||
|
|
f48a19a3bc | ||
|
|
fed11db92e | ||
|
|
23fb15fe78 | ||
|
|
7a533f6053 | ||
|
|
a292ff4287 | ||
|
|
29329383e4 | ||
|
|
fefdad5335 | ||
|
|
982f9ce8fb | ||
|
|
5c6d4b9ac2 | ||
|
|
49954f5c07 | ||
|
|
0b837925a2 | ||
|
|
54dd67a435 | ||
|
|
18ddc040d1 | ||
|
|
aeb28f67e4 | ||
|
|
54b892cd29 | ||
|
|
2e28525c4b | ||
|
|
8aa8de570f | ||
|
|
6723479c32 | ||
|
|
e318b6a113 | ||
|
|
df44f82198 | ||
|
|
97d54868e9 | ||
|
|
65e65ba308 | ||
|
|
2056d5e350 | ||
|
|
8b3b72243f | ||
|
|
814146f227 | ||
|
|
511983e1ea | ||
|
|
13e5df62c9 | ||
|
|
8debf8caf8 | ||
|
|
eab90cac05 | ||
|
|
ce401b01b6 | ||
|
|
271dcd46bc | ||
|
|
c1a7b452e0 | ||
|
|
e50ff6b0a5 | ||
|
|
34ddb92e4d | ||
|
|
35b16c7292 | ||
|
|
931fc93b4b | ||
|
|
aacd9dc62c | ||
|
|
061c55614b | ||
|
|
41c6887f33 | ||
|
|
b427185fac | ||
|
|
6fa14accfe | ||
|
|
1b8933cd84 | ||
|
|
e6261a6bf8 | ||
|
|
0a76647175 | ||
|
|
787706b1f7 | ||
|
|
94665e8055 | ||
|
|
b24770629e | ||
|
|
a09bd09a0e | ||
|
|
988df8742c | ||
|
|
10c41bf443 | ||
|
|
bb30876557 | ||
|
|
81c24b3de1 | ||
|
|
4e1f734af7 | ||
|
|
2f726cf7f2 | ||
|
|
e726d16094 | ||
|
|
5bda5124e6 | ||
|
|
1a66b7c4c3 | ||
|
|
da86dee981 | ||
|
|
6caf0fc1cc | ||
|
|
8d28976b0d | ||
|
|
26e972314e | ||
|
|
8a582f8872 | ||
|
|
ca04504573 | ||
|
|
80360214df | ||
|
|
c69eae486e | ||
|
|
57bebd3fb6 | ||
|
|
329dac77ee | ||
|
|
e5dabc63c2 | ||
|
|
f652135e19 | ||
|
|
6bf7d8b111 | ||
|
|
004ad0eb8c | ||
|
|
989034c799 | ||
|
|
c2334ce80a | ||
|
|
6d59fe3080 | ||
|
|
9c01256029 | ||
|
|
e33c863162 | ||
|
|
787a9c0083 | ||
|
|
c75c22955c | ||
|
|
5afb5d24d8 | ||
|
|
134cc34d74 | ||
|
|
3397d6c907 | ||
|
|
f8cf185db9 | ||
|
|
735935c0c4 | ||
|
|
fd3beaf2b9 | ||
|
|
034fab480d | ||
|
|
17432d1f94 | ||
|
|
62c6d8e42d | ||
|
|
14e057cf05 | ||
|
|
982c9bf964 | ||
|
|
b4aba3d263 | ||
|
|
9f9d57b9a9 | ||
|
|
236e3c7e61 | ||
|
|
2160844ad0 | ||
|
|
51475d600c | ||
|
|
149f7a1d9d | ||
|
|
56ef7ae60c | ||
|
|
7ec6586c4a | ||
|
|
074a6bfa87 | ||
|
|
965fec5927 | ||
|
|
58b87aa999 | ||
|
|
b0b16b52ee | ||
|
|
9ab3f7e5aa | ||
|
|
61210955bd | ||
|
|
28f73d0a76 | ||
|
|
99fb1a4c5f | ||
|
|
42cf80106f | ||
|
|
bcb9cfd2fe | ||
|
|
1d57568322 | ||
|
|
d56c041c4a | ||
|
|
be48ed5589 | ||
|
|
897c296fbe | ||
|
|
d25fe028b8 | ||
|
|
d9ade96fad | ||
|
|
7fd05b7ca6 | ||
|
|
0eec5383ed | ||
|
|
f474d2c834 | ||
|
|
e40e5e6a99 | ||
|
|
82d20efa8d | ||
|
|
8c7716428d | ||
|
|
9ac8a4211e | ||
|
|
23750bab55 | ||
|
|
22aeddc655 | ||
|
|
ab69cd8027 | ||
|
|
f3d35e9537 | ||
|
|
4cb72c1998 | ||
|
|
12ccc10e83 | ||
|
|
ec631f3499 | ||
|
|
75d2ea1519 | ||
|
|
14e9a94061 | ||
|
|
d3284ab9f6 | ||
|
|
775df43470 | ||
|
|
e2e6024e8f | ||
|
|
d89b51f17d | ||
|
|
aa626947ed | ||
|
|
630693d64e | ||
|
|
f2be23274e | ||
|
|
2972780bed | ||
|
|
cf3d2c3def | ||
|
|
1f8751054c | ||
|
|
cc90e6d479 | ||
|
|
76dd3c86f2 | ||
|
|
91468fa2f9 | ||
|
|
739219c57b | ||
|
|
f56e1933a6 | ||
|
|
8e4aec9c4d | ||
|
|
e6e29aaf1e | ||
|
|
1ac5f54e9e | ||
|
|
bf983658c8 | ||
|
|
e17286eb9f | ||
|
|
19c17e96de | ||
|
|
b45368342d | ||
|
|
11e071289b | ||
|
|
dcea8ae64f | ||
|
|
c9480ef17d | ||
|
|
a9517096f9 | ||
|
|
fc3f03425e | ||
|
|
8d43046f13 | ||
|
|
cd6880aff4 | ||
|
|
ccefa45fb0 | ||
|
|
b721d7a10f | ||
|
|
ef85d1d83e | ||
|
|
d03ceb2a23 | ||
|
|
90198be1cb | ||
|
|
f640494c1f | ||
|
|
77b9feb765 | ||
|
|
99139dfcca | ||
|
|
a241f63ddc | ||
|
|
70507258ae | ||
|
|
51a8144f49 | ||
|
|
54ad9ba243 | ||
|
|
a7f7a09418 | ||
|
|
44897fb371 | ||
|
|
bb6a748167 | ||
|
|
21f61d46da | ||
|
|
6ac8a9d440 | ||
|
|
c321402414 | ||
|
|
ec80fc9f3f | ||
|
|
6bfd57097f | ||
|
|
6f5df6a671 | ||
|
|
1baf3190cd | ||
|
|
66c29c49e5 | ||
|
|
e5d6740555 | ||
|
|
30b5dd63e4 | ||
|
|
f0aa8d73ea | ||
|
|
8a0761cad8 | ||
|
|
322d76b713 | ||
|
|
4f56bf3c3e | ||
|
|
942eed402a | ||
|
|
24c72650fb | ||
|
|
f5959c8829 | ||
|
|
4a8299d9dc | ||
|
|
560d388df4 | ||
|
|
7621ebed42 | ||
|
|
5447c71790 | ||
|
|
c5241eaaf6 | ||
|
|
9266b55ddf | ||
|
|
1bc1f66613 | ||
|
|
7795a690ed | ||
|
|
d498ac89f2 | ||
|
|
7683e86d8b | ||
|
|
ebb763db03 | ||
|
|
920491ddb2 | ||
|
|
761728ac43 | ||
|
|
d8ddb9dc82 | ||
|
|
405f153439 | ||
|
|
f789a35901 | ||
|
|
2842018c2f | ||
|
|
51641cc704 | ||
|
|
729f5ed5e4 | ||
|
|
46c6b2168c | ||
|
|
1f955904a4 | ||
|
|
03ff33acaf | ||
|
|
46035e76cc | ||
|
|
7c073f76ae | ||
|
|
558c89cc30 | ||
|
|
222d41c84a | ||
|
|
12a62f4607 | ||
|
|
f561768c67 | ||
|
|
5ced5ce253 | ||
|
|
55781e911e | ||
|
|
ee3c4a4124 | ||
|
|
6815e56e57 | ||
|
|
6c744443fb | ||
|
|
3c37047afb | ||
|
|
f31f09d77a | ||
|
|
c1bb05c0a4 | ||
|
|
f5b8d8a60c | ||
|
|
8218cfc72c | ||
|
|
de508ee68f | ||
|
|
a932111040 | ||
|
|
8c437eb815 | ||
|
|
1ad4815983 | ||
|
|
00706daae5 | ||
|
|
c75cdc6d28 | ||
|
|
b9fae7fb7d | ||
|
|
e74a3da5cd | ||
|
|
08cf986cae | ||
|
|
ba01ed0153 | ||
|
|
19ac8bd9b2 | ||
|
|
ab79ccb02b | ||
|
|
6ba8a6a600 | ||
|
|
377fb2329c | ||
|
|
285ee665ee | ||
|
|
d862498516 | ||
|
|
b09b03a427 | ||
|
|
4ef2ede4cf | ||
|
|
0efaa11553 | ||
|
|
ea87b958ef | ||
|
|
ff62f075d0 | ||
|
|
348744086d | ||
|
|
d1d4f79973 | ||
|
|
2a3f7f8cb3 | ||
|
|
7eaef11a84 | ||
|
|
efe93d0117 | ||
|
|
7d12e18b98 | ||
|
|
de6bca424f | ||
|
|
03268a5575 | ||
|
|
1251680a1c | ||
|
|
f8d55ba837 | ||
|
|
cd0e49914b | ||
|
|
700e845727 | ||
|
|
bab8120814 | ||
|
|
c6f1f19866 | ||
|
|
745592f507 | ||
|
|
afec65eb56 | ||
|
|
d6661da0a7 | ||
|
|
dcc4732748 | ||
|
|
6a5bf08d55 | ||
|
|
d52f5e6e03 | ||
|
|
eb62356313 | ||
|
|
919dc248e3 | ||
|
|
ca5db2bff8 | ||
|
|
658698ed2f | ||
|
|
7f391dacbd | ||
|
|
90e0bf95d1 | ||
|
|
930bfb26f4 | ||
|
|
7e788f212a | ||
|
|
8f99530795 | ||
|
|
434af4b998 | ||
|
|
a011728cc9 | ||
|
|
e584139b6d | ||
|
|
a7c8526f3e | ||
|
|
459256e83a | ||
|
|
21f3f52c7b | ||
|
|
568e43cf3d | ||
|
|
e004e540d7 | ||
|
|
cac6172344 | ||
|
|
8dbfb87246 | ||
|
|
d8cbc7ddd8 | ||
|
|
bdf3a2dfe8 | ||
|
|
693b82e47d | ||
|
|
888be0fd5e | ||
|
|
9f97ed331b | ||
|
|
e8ea2af298 | ||
|
|
785c2e36c6 | ||
|
|
ee043e67a4 | ||
|
|
d824b41bbb | ||
|
|
a9df64f861 | ||
|
|
6c3b449f74 | ||
|
|
536c6a7b2c | ||
|
|
e90e0fc615 | ||
|
|
b704121dcb | ||
|
|
5e0886d744 | ||
|
|
f819e4829b | ||
|
|
8873948e9e | ||
|
|
a25ea14436 | ||
|
|
1a922f05c1 | ||
|
|
e8268b1dab | ||
|
|
4cb78f55d1 | ||
|
|
7a516930b1 | ||
|
|
8091bec6bf | ||
|
|
7baf42b138 | ||
|
|
ab9835b896 | ||
|
|
9d142c5607 | ||
|
|
92b68bdb8f | ||
|
|
a86bb9f6e6 | ||
|
|
09db6dc424 | ||
|
|
3b62526267 | ||
|
|
5d80031a40 | ||
|
|
c9777af91c | ||
|
|
656e4d529c | ||
|
|
a894873d6b | ||
|
|
2d1a97e042 | ||
|
|
ece3f96867 | ||
|
|
65a48b324d | ||
|
|
53bf622065 | ||
|
|
075be18123 | ||
|
|
044390b4b4 | ||
|
|
37d03aaebe | ||
|
|
51a51833d4 | ||
|
|
a8cfc1ef7a | ||
|
|
1d238c8315 | ||
|
|
4f96744ff2 | ||
|
|
e9783ecccc | ||
|
|
6342cc41ac | ||
|
|
c554390de5 | ||
|
|
4d8bbe3023 | ||
|
|
969076f1ef | ||
|
|
20032def7e | ||
|
|
94706460c0 | ||
|
|
b7506229f8 | ||
|
|
58c6df3537 | ||
|
|
235a1f36ec | ||
|
|
b53821976e | ||
|
|
4355881fb2 | ||
|
|
cf50d558ba | ||
|
|
7488dc3ebb | ||
|
|
b449847ad1 | ||
|
|
9785745384 | ||
|
|
56ffa7905e | ||
|
|
216433aa2d | ||
|
|
122fbbed22 | ||
|
|
042c671bd4 | ||
|
|
38fdc11917 | ||
|
|
2f4730a9c6 | ||
|
|
3759d32c89 | ||
|
|
93c2ca8df1 | ||
|
|
832aac0e6e | ||
|
|
6967d4e762 | ||
|
|
3c70681537 | ||
|
|
0ce08319e7 | ||
|
|
17e0489164 | ||
|
|
7953cc416b | ||
|
|
a670ac0aea | ||
|
|
ef30018008 | ||
|
|
66810c8b75 | ||
|
|
2bba55ebd5 | ||
|
|
b977ae4d3b | ||
|
|
d4f5e854c5 | ||
|
|
837f621633 | ||
|
|
a781b4a387 | ||
|
|
a73a75a7f8 | ||
|
|
17d1db913f | ||
|
|
a924509e92 | ||
|
|
04b4321ea1 | ||
|
|
1f9ebc7295 | ||
|
|
6d88111dfc | ||
|
|
184e52b4ec | ||
|
|
2a3cc3d88c | ||
|
|
ffa1aae27c | ||
|
|
7cd842df19 | ||
|
|
e399e4960c | ||
|
|
5c193a47eb | ||
|
|
b63c02cb10 | ||
|
|
09418f1a5d | ||
|
|
fa4491340a | ||
|
|
192814650d | ||
|
|
5f1addc54d | ||
|
|
9ffc8c6800 | ||
|
|
64cd8084ea | ||
|
|
2e6c9d408c | ||
|
|
f3bea49f61 | ||
|
|
48fdae754e | ||
|
|
64f2ee67b2 | ||
|
|
19d34779a0 | ||
|
|
76a6a0cf75 | ||
|
|
da47d97cd0 | ||
|
|
f59441005e | ||
|
|
e30347a11f | ||
|
|
8ac079fb72 | ||
|
|
4295f08a84 | ||
|
|
bd8eb97d46 | ||
|
|
329f656c40 | ||
|
|
f2c7a26ce0 | ||
|
|
930e25e64a | ||
|
|
963269a685 | ||
|
|
de23ef5d35 | ||
|
|
208ae6183c | ||
|
|
761ae4b816 | ||
|
|
ff308641e1 | ||
|
|
a2094ddf75 | ||
|
|
0391ed3e63 | ||
|
|
b6b3997498 | ||
|
|
9f77c0c9b7 | ||
|
|
dc4812a86e | ||
|
|
fc83b0d95b | ||
|
|
8e70568e32 | ||
|
|
f0e3a3a30c | ||
|
|
cf44efa02e | ||
|
|
ddc59dfb97 | ||
|
|
ef0a3396d7 | ||
|
|
8bf68aa020 | ||
|
|
02a90856ff | ||
|
|
8716695d4e | ||
|
|
9a1bb69cd8 | ||
|
|
6caad0daf6 | ||
|
|
6508f1541b | ||
|
|
6809b38821 | ||
|
|
7f9a3efa24 | ||
|
|
8ecea9792b | ||
|
|
7c85a03b42 | ||
|
|
d4d71b90eb | ||
|
|
fbf614a8df | ||
|
|
c02329e4b1 | ||
|
|
5aba065413 | ||
|
|
6e65096bb4 | ||
|
|
b39f25ed51 | ||
|
|
3925d5ec27 | ||
|
|
381b59acd4 | ||
|
|
5b01d923d3 | ||
|
|
108e5a2f5e | ||
|
|
e21d17a482 | ||
|
|
d4ea8c56c3 | ||
|
|
783ad64353 | ||
|
|
ac918c1a81 | ||
|
|
0f00074f77 | ||
|
|
eb20ec1556 | ||
|
|
32f9da0724 | ||
|
|
968be8eb8f | ||
|
|
d7e05cde42 | ||
|
|
557b86a7a9 | ||
|
|
f144dda8b5 | ||
|
|
80aed31135 | ||
|
|
2a21e7c2cb | ||
|
|
d281277797 | ||
|
|
fb807bcde4 | ||
|
|
ebf6f6782f | ||
|
|
008df649f0 | ||
|
|
a810e704ad | ||
|
|
d0b3167956 | ||
|
|
a726ecbdd8 | ||
|
|
da6a8f806d | ||
|
|
b47f44cacd | ||
|
|
0cc59adad7 | ||
|
|
6c076863db | ||
|
|
ddb6e74955 | ||
|
|
2094bc3d80 | ||
|
|
c922007d21 | ||
|
|
b1435c1264 | ||
|
|
be5e1648e0 | ||
|
|
a270feb1eb | ||
|
|
103b8cd13a | ||
|
|
e6dd36283d | ||
|
|
aae2d0a5dc | ||
|
|
fda1d4cc2b | ||
|
|
5be92460c1 | ||
|
|
15ce31ea3a | ||
|
|
35e5a669a0 | ||
|
|
8b8c74cf93 | ||
|
|
cc43524b4c | ||
|
|
f87d297155 | ||
|
|
605d50166a | ||
|
|
de6681d00a | ||
|
|
7632e33975 | ||
|
|
5993a596e8 | ||
|
|
2294b6babb | ||
|
|
c38f866363 | ||
|
|
511b112ac7 | ||
|
|
8cd0618e85 | ||
|
|
b4b589bfc2 | ||
|
|
cb69eb7c0f | ||
|
|
7d83cd89f2 | ||
|
|
b2dca0a34f | ||
|
|
3bd73961d7 | ||
|
|
67f574b5d8 | ||
|
|
f9b70a37aa | ||
|
|
d4047e1413 | ||
|
|
80f5b4c3b7 | ||
|
|
4668a6d8c0 | ||
|
|
e6f076306f | ||
|
|
b73dc127a3 | ||
|
|
8c8a2311d6 | ||
|
|
0555fb22ca | ||
|
|
85cde62039 | ||
|
|
46a2648d15 | ||
|
|
e55f6ecd6b | ||
|
|
c71fee3fed | ||
|
|
4d6c25c9d3 | ||
|
|
6ed4e2d946 | ||
|
|
6b4242478f | ||
|
|
ef5478279b | ||
|
|
62bb8bce1c | ||
|
|
83a5c3af8a | ||
|
|
f78abd61d4 | ||
|
|
209c6fa1c1 | ||
|
|
6e3c600a49 | ||
|
|
b1cda57174 | ||
|
|
412d92e782 | ||
|
|
c0703a6a5e | ||
|
|
64bd306c6d | ||
|
|
6be49f898c | ||
|
|
59bc73656f | ||
|
|
bed22f51b4 | ||
|
|
c1362a02f3 | ||
|
|
859a3cbe6e | ||
|
|
a6d82f44b3 | ||
|
|
e66e17a41a | ||
|
|
cfa6d7080c | ||
|
|
01ceedccd5 | ||
|
|
ed28af7c73 | ||
|
|
74cf91f99e | ||
|
|
44479930df | ||
|
|
cb1f54aac4 | ||
|
|
d68d2e9f30 | ||
|
|
948c48ea23 | ||
|
|
a9ccf6ca42 | ||
|
|
fd7b829e70 | ||
|
|
87a7cc6289 | ||
|
|
2f8b5e53bb | ||
|
|
8b7fa3b646 | ||
|
|
dd2c71fe61 | ||
|
|
3b58d57e5c | ||
|
|
cecf32e52e | ||
|
|
91a2dfab36 | ||
|
|
5e5838a8c1 | ||
|
|
0fffbc06dd | ||
|
|
4d360bfb73 | ||
|
|
e3001b614e | ||
|
|
6ecdef02ab | ||
|
|
36903eb749 | ||
|
|
f530c9514f | ||
|
|
fdffa77bc5 | ||
|
|
245dd39a60 | ||
|
|
4614aacc02 | ||
|
|
64ccdab90c | ||
|
|
02286b0c4e | ||
|
|
8e952a550b | ||
|
|
a29f95194d | ||
|
|
0e5db49b93 | ||
|
|
a2c29c0937 | ||
|
|
c318f05cfd | ||
|
|
789d200c24 | ||
|
|
2dc4a9e044 | ||
|
|
82577b91d5 | ||
|
|
8fd08a1574 | ||
|
|
7a41fc8ec8 | ||
|
|
798ca929d6 | ||
|
|
7e4e58fb78 | ||
|
|
28b9975c75 | ||
|
|
5536ade389 | ||
|
|
21bc195213 | ||
|
|
b6beacf053 | ||
|
|
94b6c133f4 | ||
|
|
949d7bed89 | ||
|
|
81ce12a38c | ||
|
|
eba65b2934 | ||
|
|
c7f5b7fca1 | ||
|
|
f670d522bf | ||
|
|
a02f7f46c3 | ||
|
|
4b7f254e17 | ||
|
|
9b42be560d | ||
|
|
31b39231a2 | ||
|
|
4eb2c1f646 | ||
|
|
5f89d8588d | ||
|
|
404cbf9b4a | ||
|
|
0aabc09b82 | ||
|
|
a5ebeadd95 | ||
|
|
9e188aaf03 | ||
|
|
870f5caca9 | ||
|
|
28b4ddfc72 | ||
|
|
13a4a26e97 | ||
|
|
81c7e63994 | ||
|
|
7f234ab5bc | ||
|
|
f8d0682810 | ||
|
|
175d6b1fc5 | ||
|
|
1cd8e8a097 | ||
|
|
ed95e38257 | ||
|
|
cab585225d | ||
|
|
3688dde5e5 | ||
|
|
ae6a5b2512 | ||
|
|
6f87611d67 | ||
|
|
6a5e31c908 | ||
|
|
8bda5e16cd | ||
|
|
d70d3d95f0 | ||
|
|
554b7d2ec4 | ||
|
|
ebc4031922 | ||
|
|
c526997aba | ||
|
|
c0e3a1f3ef | ||
|
|
7dc0a7a5c3 | ||
|
|
2943b6ed04 | ||
|
|
5feb212df7 | ||
|
|
327edcd347 | ||
|
|
94cbf4cddf | ||
|
|
08cc87affb | ||
|
|
18020d64cc | ||
|
|
48b7ceac06 | ||
|
|
dbcce9663c | ||
|
|
6ee7dd56fe | ||
|
|
22328772ca | ||
|
|
99418e6b88 | ||
|
|
52bd079c0a | ||
|
|
67db5e9dfc | ||
|
|
5f1bc6c6c2 | ||
|
|
05201d7012 | ||
|
|
6b4983537e | ||
|
|
87c8293c78 | ||
|
|
54488564f3 | ||
|
|
f2ac9ed385 | ||
|
|
38f2f1e30a | ||
|
|
02004011ec | ||
|
|
60bb982450 | ||
|
|
67389c0bac | ||
|
|
faa1fee1c0 | ||
|
|
0bae421fbc | ||
|
|
b29d81bf0f | ||
|
|
4792828da1 | ||
|
|
6171e887a8 | ||
|
|
f28fa93f40 | ||
|
|
940ad84493 | ||
|
|
0b168376ed | ||
|
|
f7bd376499 | ||
|
|
9566155bdb | ||
|
|
9994ddb31b | ||
|
|
fadfdaa673 | ||
|
|
4ca546f44a | ||
|
|
8af30c9256 | ||
|
|
42adc38720 | ||
|
|
c1d9dee46c | ||
|
|
69a7104286 | ||
|
|
aba5afe32c | ||
|
|
c1ccf4fceb | ||
|
|
916a4cfc73 | ||
|
|
fd107ab5b8 | ||
|
|
5fa6fccf7b | ||
|
|
0ce226d0c9 | ||
|
|
14e0b471d3 | ||
|
|
ed0df64cf9 | ||
|
|
35bc2c9803 | ||
|
|
a771dc8787 | ||
|
|
244eb91dfb | ||
|
|
7488a6d42b | ||
|
|
696a59f1b9 | ||
|
|
ee5a3269f2 | ||
|
|
f89bf027f7 | ||
|
|
4db432b0a9 | ||
|
|
c82fd9ead5 | ||
|
|
34715b1e06 | ||
|
|
f0870b3236 | ||
|
|
9a286800d6 | ||
|
|
59832b1777 | ||
|
|
561f566506 | ||
|
|
f0cacf6bd5 | ||
|
|
ce4031af74 | ||
|
|
dd7f91b8c2 | ||
|
|
8523e5bf6b | ||
|
|
860727d27a | ||
|
|
f175bf2c82 | ||
|
|
40008f44ac | ||
|
|
3f93b5c63b | ||
|
|
d2ce051c4a | ||
|
|
d5d90bde9a | ||
|
|
fc8d9febf6 | ||
|
|
b43c542213 | ||
|
|
e7533232c0 | ||
|
|
5e1aaf11a7 | ||
|
|
d062dffc13 | ||
|
|
4810bbbbd9 | ||
|
|
967998273f | ||
|
|
24decf8abc | ||
|
|
3bc605894e | ||
|
|
b74ae302ec | ||
|
|
db3dac261a | ||
|
|
87b47b3042 | ||
|
|
720e1a038e | ||
|
|
1753c54e88 | ||
|
|
2d42de83de | ||
|
|
c4e6af455d | ||
|
|
51d619449b | ||
|
|
1160a14f56 | ||
|
|
57fce0ddbc | ||
|
|
b9eb8a750b | ||
|
|
3ce16e0ed1 | ||
|
|
554d9b4047 | ||
|
|
02d565ce58 | ||
|
|
795bc1276b | ||
|
|
499b7b2e67 | ||
|
|
b6c0fe8bf7 | ||
|
|
d5bb1b72b9 | ||
|
|
af86564adc | ||
|
|
5354e02b6f | ||
|
|
4ee17a656f | ||
|
|
32c59b66f6 | ||
|
|
20732f04ff | ||
|
|
06763b34c3 | ||
|
|
6bab6c57f2 | ||
|
|
4eab89d73e | ||
|
|
8d20c46228 | ||
|
|
f5c4586bb7 | ||
|
|
bc6bbdbbe0 | ||
|
|
b77caed0ba | ||
|
|
df976f1212 | ||
|
|
999dd5eb6f | ||
|
|
a1a6a3ab81 | ||
|
|
d067bbfa65 | ||
|
|
3bd40eeb27 | ||
|
|
b124d54055 | ||
|
|
90691de457 | ||
|
|
bee83a3a3e | ||
|
|
fd8f2438fa | ||
|
|
7937d99a73 | ||
|
|
569afb5535 | ||
|
|
fc5a45e113 | ||
|
|
950f4a9f1a | ||
|
|
6a6e80b6d8 | ||
|
|
083c9792a6 | ||
|
|
893bfce767 | ||
|
|
f61f3df732 | ||
|
|
a3be5e332e | ||
|
|
33d65a8593 | ||
|
|
ebbf01c6e5 | ||
|
|
acb8496352 | ||
|
|
ecad5772d2 | ||
|
|
6e6f5714dd | ||
|
|
50ae15aa4f | ||
|
|
4e2c3049a0 | ||
|
|
3a785c166e | ||
|
|
5248a4eb9c | ||
|
|
c9a53aed7b | ||
|
|
bafe5dc784 | ||
|
|
5325488099 | ||
|
|
737ad5c8b7 | ||
|
|
17cea4e274 | ||
|
|
af5b579a2f | ||
|
|
c87eaaa928 | ||
|
|
33418397f8 | ||
|
|
8c7258e839 | ||
|
|
98fff9b81d | ||
|
|
0c63b27eea | ||
|
|
0968981aef | ||
|
|
8db4abdf43 | ||
|
|
9aa4219bf0 | ||
|
|
6c32ab4711 | ||
|
|
a80c5a1efa | ||
|
|
4ba46bff69 | ||
|
|
6a7c97277f | ||
|
|
cc70ff9732 | ||
|
|
2d25948c57 | ||
|
|
8946af4831 | ||
|
|
5e7ca0374c | ||
|
|
21f8e89ba4 | ||
|
|
f0aca90de2 | ||
|
|
097228066a | ||
|
|
7d8782f3dc | ||
|
|
e4ea9d561e | ||
|
|
e284d9de8e | ||
|
|
df6382a1ca | ||
|
|
c1c1a3318c | ||
|
|
796df1cec5 | ||
|
|
28980293c5 | ||
|
|
d878ad2e7e | ||
|
|
1290d1e9d4 | ||
|
|
f229f1e9fe | ||
|
|
0776951018 | ||
|
|
6d47b449b9 | ||
|
|
594c975c70 | ||
|
|
bf57318307 | ||
|
|
abd87793e4 | ||
|
|
7b4e6128ce | ||
|
|
2ae65acc28 | ||
|
|
2ee87ad078 | ||
|
|
d65beea179 | ||
|
|
b19f3ff8cf | ||
|
|
75fae9454d | ||
|
|
5d309c39cf | ||
|
|
649fc5a0e6 | ||
|
|
67cfa5d42f | ||
|
|
5dcacdeea1 | ||
|
|
2f7073bbe4 | ||
|
|
e8df6ed3be | ||
|
|
d9eb4c1296 | ||
|
|
4af0fbf553 | ||
|
|
2da0862cb2 | ||
|
|
66fcf84688 | ||
|
|
5740d40d57 | ||
|
|
6ef2256bf2 | ||
|
|
65f911909b | ||
|
|
2cb6e454c8 | ||
|
|
abfaa47db2 | ||
|
|
e06970eebb | ||
|
|
dadc83800b | ||
|
|
62f2c67321 | ||
|
|
1651844b4f | ||
|
|
fb9f42ff93 | ||
|
|
9c29b982dd | ||
|
|
f52c4964b3 | ||
|
|
46a8edb781 | ||
|
|
8dbdbe6d6c | ||
|
|
778069c15d | ||
|
|
e98457c540 | ||
|
|
7a3a76065c | ||
|
|
c73c97dc7b | ||
|
|
1b0dd279ae | ||
|
|
7dd487ccc5 | ||
|
|
d046591512 | ||
|
|
e4ce115abf | ||
|
|
aedcac5820 | ||
|
|
9f4430ad92 | ||
|
|
2ad8f1c112 | ||
|
|
f0d884e114 | ||
|
|
b618f5be80 | ||
|
|
7b63eac3eb | ||
|
|
df3f2ea9c1 | ||
|
|
30c6280ed1 | ||
|
|
1960b59629 | ||
|
|
6e6edf8322 | ||
|
|
f47fb01614 | ||
|
|
ae30bdd599 | ||
|
|
2c8962cf5f | ||
|
|
eb3e507a11 | ||
|
|
be3147465d | ||
|
|
484721fece | ||
|
|
9c36026991 | ||
|
|
bf5055f944 | ||
|
|
389034bf1a | ||
|
|
3f07102f2a | ||
|
|
d4ccfa31b5 | ||
|
|
5814b2a4b8 | ||
|
|
d3f61af493 | ||
|
|
233ea7bb4a | ||
|
|
6893a30ffb | ||
|
|
ae6d2fb363 | ||
|
|
baa7cb3a10 | ||
|
|
7b90544d91 | ||
|
|
9a5495d8b2 | ||
|
|
1fa769b3e7 | ||
|
|
96766ece4e | ||
|
|
add525396f | ||
|
|
26ae4edd63 | ||
|
|
063893adee | ||
|
|
ff37e99d71 | ||
|
|
3d0b02ee23 | ||
|
|
d7cfbfe6c8 | ||
|
|
dc00e22f13 | ||
|
|
bcde481304 | ||
|
|
5b1341e488 | ||
|
|
6ad70ceee3 | ||
|
|
9c4d2f5490 | ||
|
|
6c5eff1143 | ||
|
|
a893767d0f | ||
|
|
a4f240edc8 | ||
|
|
e0a94f694b | ||
|
|
8654f25a4f | ||
|
|
e877310d85 | ||
|
|
bb59f45ba6 | ||
|
|
3d4c2a2c20 | ||
|
|
e36667cd08 | ||
|
|
cebaa6949e | ||
|
|
019e22aff2 | ||
|
|
5129e2ea73 | ||
|
|
3b63f60462 | ||
|
|
5e29115c2e | ||
|
|
0b4b30286d | ||
|
|
a01f64080d | ||
|
|
d031351bc8 | ||
|
|
1d21d36253 | ||
|
|
8d4cd72b41 |
17
.gitignore
vendored
@@ -1,5 +1,4 @@
|
|||||||
##Packr, build stuff
|
logs/
|
||||||
|
|
||||||
/core/assets/mindustry-saves/
|
/core/assets/mindustry-saves/
|
||||||
/core/assets/mindustry-maps/
|
/core/assets/mindustry-maps/
|
||||||
/core/assets/bundles/output/
|
/core/assets/bundles/output/
|
||||||
@@ -12,17 +11,25 @@
|
|||||||
/desktop/gifexport/
|
/desktop/gifexport/
|
||||||
/core/lib/
|
/core/lib/
|
||||||
/core/assets-raw/sprites/generated/
|
/core/assets-raw/sprites/generated/
|
||||||
|
/core/assets-raw/sprites_out/
|
||||||
/annotations/build/
|
/annotations/build/
|
||||||
/kryonet/build/
|
/annotations/out/
|
||||||
/packer/build/
|
/net/build/
|
||||||
|
/tools/build/
|
||||||
|
/tests/build/
|
||||||
/server/build/
|
/server/build/
|
||||||
|
/test_files/
|
||||||
/annotations/build/
|
/annotations/build/
|
||||||
/android/assets/mindustry-maps/
|
/android/assets/mindustry-maps/
|
||||||
/android/assets/mindustry-saves/
|
/android/assets/mindustry-saves/
|
||||||
/core/assets/gifexport/
|
/core/assets/gifexport/
|
||||||
/core/assets/version.properties
|
/core/assets/version.properties
|
||||||
/core/assets/locales.json
|
/core/assets/locales
|
||||||
/ios/src/io/anuke/mindustry/gen/
|
/ios/src/io/anuke/mindustry/gen/
|
||||||
|
/core/src/io/anuke/mindustry/gen/
|
||||||
|
ios/robovm.properties
|
||||||
|
packr-out/
|
||||||
|
config/
|
||||||
*.gif
|
*.gif
|
||||||
|
|
||||||
version.properties
|
version.properties
|
||||||
|
|||||||
36
.travis.yml
@@ -1,24 +1,20 @@
|
|||||||
language: android
|
|
||||||
|
|
||||||
jdk:
|
jdk:
|
||||||
- openjdk8
|
- openjdk8
|
||||||
|
|
||||||
android:
|
|
||||||
components:
|
|
||||||
- android-27
|
|
||||||
|
|
||||||
# Additional components
|
|
||||||
- extra-google-google_play_services
|
|
||||||
- extra-google-m2repository
|
|
||||||
- extra-android-m2repository
|
|
||||||
- addon-google_apis-google-27
|
|
||||||
- build-tools-27.0.3
|
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- ./gradlew desktop:dist
|
- "git clone --depth=1 --branch=master https://github.com/Anuken/Arc ../Arc"
|
||||||
|
- "./gradlew test"
|
||||||
after_success:
|
- "./gradlew desktop:dist -Pbuildversion=${TRAVIS_TAG:1}"
|
||||||
- chmod +x upload-build.sh
|
- "./gradlew server:dist -Pbuildversion=${TRAVIS_TAG:1}"
|
||||||
- chmod +x cleanup_builds.sh
|
|
||||||
- ./upload-build.sh
|
|
||||||
|
|
||||||
|
deploy:
|
||||||
|
provider: releases
|
||||||
|
skip_cleanup: true
|
||||||
|
draft: false
|
||||||
|
api_key:
|
||||||
|
secure: Cv5wFtWt62/A24EvSEQvMow7gKPbZ3oATEFPuSghhB2TQz1dA40Zee3Qvk4LFlpLrhYo4K0ZSczCZRGpR+hCd8+Dpww52bheYEvWuh3ZQfvu/fXtEx2j5PwP1qMpmIgSxETV/gkD7l9FImdh0VzktYiAvQfmi0bEocG9/D4QwjFpNat7iwBdcMiw1MvAygpdIWRsjiw0RKlB2mWarmoHhQ7Gu7qlU3j50uaEvcrtmU0pBUPggNQwQRv32i9NPvNFxrqqlUjDLIS8JFea99zCkp8BwYqbEvBIMzd+Qip1/stLJJA3+cDUClbsDtg8rAVetzpOrdLEEBmqShFe5MDl2yEHcsgpN9CFsyTaUfvB3P3rVjizvycMm42IsUkXQiarm5xTQ/TIA8Rd8AHiSKuweNCg1Fd5SFaRtKy8JVLXuxyfUccmyje6hhz2L4lS2Wfj3mAG7sqZUCXhWP79EKdGkiPOjKv4CwXEKmuH3BMVqPlNUZJr9Eg3sV1FG0h2l+MVOOnR635qdUbb49sYojYxVruMLX0BH1c4ZCu230m8CUoWA1Em1QNI75ya7+9Y5T6AsgWDVpBvdUo9fWNbdp+VQ0GskFQsJD5wtnxbcbHeFiERAgGBm7z6qt9u9LrQpBH+dsW52ADvYsu3L4nQEa+sdMHwTTwmGY+iUvsxu0DqxGg=
|
||||||
|
file:
|
||||||
|
- "desktop/build/libs/desktop-release.jar"
|
||||||
|
- "server/build/libs/server-release.jar"
|
||||||
|
on:
|
||||||
|
repo: Anuken/Mindustry
|
||||||
|
tags: true
|
||||||
|
|||||||
30
README.md
@@ -1,36 +1,42 @@
|
|||||||

|

|
||||||
|
|
||||||
[](https://travis-ci.org/Anuken/Mindustry)
|
[](https://travis-ci.org/Anuken/Mindustry)
|
||||||
\
|
[](https://discord.gg/mindustry)
|
||||||
A pixelated sandbox tower defense game made using [LibGDX](https://libgdx.badlogicgames.com/). Winner of the [GDL Metal Monstrosity Jam](https://itch.io/jam/gdl---metal-monstrosity-jam).
|
|
||||||
|
A sandbox tower defense game written in Java.
|
||||||
|
|
||||||
_[Trello Board](https://trello.com/b/aE2tcUwF/mindustry-40-plans)_
|
_[Trello Board](https://trello.com/b/aE2tcUwF/mindustry-40-plans)_
|
||||||
_[Wiki](http://mindustry.wikia.com/wiki/Mindustry_Wiki)_
|
_[Wiki](http://mindustry.wikia.com/wiki/Mindustry_Wiki)_
|
||||||
_[Discord](https://discord.gg/r8BkXNd)_
|
|
||||||
|
|
||||||
### Building
|
### Building
|
||||||
|
|
||||||
Bleeding-edge live builds are generated automatically for every commit. You can see them [here](https://github.com/Anuken/Mindustry/wiki).
|
Bleeding-edge live builds are generated automatically for every commit. You can see them [here](https://jenkins.hellomouse.net/job/mindustry/).
|
||||||
|
|
||||||
If you'd rather compile on your own, follow these instructions.
|
If you'd rather compile on your own, follow these instructions.
|
||||||
First, make sure you have Java 8 and JDK 8 installed. Open a terminal in the root directory, and run the following commands:
|
First, make sure you have Java 8 and JDK 8 installed. Open a terminal in the root directory, `cd` to the Mindustry folder and run the following commands:
|
||||||
|
|
||||||
|
#### Windows
|
||||||
|
|
||||||
**_Windows_**
|
_Running:_ `gradlew desktop:run`
|
||||||
|
_Building:_ `gradlew desktop:dist`
|
||||||
|
|
||||||
_Running:_ `gradlew.bat desktop:run`
|
#### Linux/Mac OS
|
||||||
_Building:_ `gradlew.bat desktop:dist`
|
|
||||||
|
|
||||||
|
|
||||||
**_Linux_**
|
|
||||||
|
|
||||||
_Running:_ `./gradlew desktop:run`
|
_Running:_ `./gradlew desktop:run`
|
||||||
_Building:_ `./gradlew desktop:dist`
|
_Building:_ `./gradlew desktop:dist`
|
||||||
|
|
||||||
|
#### Server
|
||||||
|
|
||||||
|
Server builds are bundled with each released build (in Releases). If you'd rather compile on your own, replace 'desktop' with 'server', e.g. `gradlew server:dist`.
|
||||||
|
|
||||||
|
##### Troubleshooting
|
||||||
|
|
||||||
|
If the terminal returns `Permission denied` or `Command not found` on Mac/Linux, run `chmod +x ./gradlew` before running `./gradlew`. *This is a one-time procedure.*
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
Gradle may take up to several minutes to download files. Be patient. <br>
|
Gradle may take up to several minutes to download files. Be patient. <br>
|
||||||
After building, the output .JAR file should be in `/desktop/build/libs/desktop-release.jar.`
|
After building, the output .JAR file should be in `/desktop/build/libs/desktop-release.jar` for desktop builds, and in `/server/build/libs/server-release.jar` for server builds.
|
||||||
|
|
||||||
### Downloads
|
### Downloads
|
||||||
|
|
||||||
|
|||||||
@@ -2,11 +2,10 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="io.anuke.mindustry">
|
package="io.anuke.mindustry">
|
||||||
|
|
||||||
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
|
<uses-feature android:glEsVersion="0x00020000" android:required="true"/>
|
||||||
<uses-permission android:name="com.android.vending.BILLING" />
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
||||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.INTERNET"/>
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:resizeableActivity="false"
|
android:resizeableActivity="false"
|
||||||
@@ -17,6 +16,7 @@
|
|||||||
android:appCategory="game"
|
android:appCategory="game"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:theme="@style/GdxTheme" android:fullBackupContent="@xml/backup_rules">
|
android:theme="@style/GdxTheme" android:fullBackupContent="@xml/backup_rules">
|
||||||
|
<meta-data android:name="android.max_aspect" android:value="2.1"/>
|
||||||
<activity
|
<activity
|
||||||
android:name="io.anuke.mindustry.AndroidLauncher"
|
android:name="io.anuke.mindustry.AndroidLauncher"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
@@ -24,8 +24,8 @@
|
|||||||
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout">
|
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout">
|
||||||
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN"/>
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER"/>
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
<category android:name="android.intent.category.DEFAULT"/>
|
<category android:name="android.intent.category.DEFAULT"/>
|
||||||
<category android:name="android.intent.category.BROWSABLE"/>
|
<category android:name="android.intent.category.BROWSABLE"/>
|
||||||
<data android:mimeType="application/octet-stream"/>
|
<data android:mimeType="application/octet-stream"/>
|
||||||
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.mmap" />
|
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.mmap"/>
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
@@ -41,29 +41,25 @@
|
|||||||
<category android:name="android.intent.category.DEFAULT"/>
|
<category android:name="android.intent.category.DEFAULT"/>
|
||||||
<category android:name="android.intent.category.BROWSABLE"/>
|
<category android:name="android.intent.category.BROWSABLE"/>
|
||||||
<data android:mimeType="application/octet-stream"/>
|
<data android:mimeType="application/octet-stream"/>
|
||||||
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.msav" />
|
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.msav"/>
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|
||||||
|
|
||||||
<intent-filter android:icon="@mipmap/ic_launcher"
|
<intent-filter android:icon="@mipmap/ic_launcher"
|
||||||
android:label="Mindustry Map"
|
android:label="Mindustry Map"
|
||||||
android:priority="1">
|
android:priority="1">
|
||||||
<action android:name="android.intent.action.VIEW" />
|
<action android:name="android.intent.action.VIEW"/>
|
||||||
<category android:name="android.intent.category.DEFAULT" />
|
<category android:name="android.intent.category.DEFAULT"/>
|
||||||
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.mmap" android:mimeType="*/*" />
|
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.mmap" android:mimeType="*/*"/>
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.VIEW" />
|
<action android:name="android.intent.action.VIEW"/>
|
||||||
<category android:name="android.intent.category.DEFAULT" />
|
<category android:name="android.intent.category.DEFAULT"/>
|
||||||
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.msav" android:mimeType="*/*" />
|
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.msav" android:mimeType="*/*"/>
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
|
|
||||||
<activity android:name=".DonationsActivity"
|
|
||||||
android:theme="@style/GdxTheme" />
|
|
||||||
|
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
||||||
|
|||||||
@@ -1,45 +1,59 @@
|
|||||||
|
buildscript{
|
||||||
|
repositories{
|
||||||
|
mavenLocal()
|
||||||
|
mavenCentral()
|
||||||
|
google()
|
||||||
|
maven{ url "https://oss.sonatype.org/content/repositories/snapshots/" }
|
||||||
|
jcenter()
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies{
|
||||||
|
classpath 'com.android.tools.build:gradle:3.4.1'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
apply plugin: "com.android.application"
|
apply plugin: "com.android.application"
|
||||||
|
|
||||||
configurations { natives }
|
configurations{ natives }
|
||||||
|
|
||||||
repositories {
|
repositories{
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
jcenter()
|
jcenter()
|
||||||
maven {
|
maven{
|
||||||
url "https://maven.google.com"
|
url "https://maven.google.com"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies{
|
||||||
implementation project(":core")
|
implementation project(":core")
|
||||||
implementation project(":kryonet")
|
implementation project(":net")
|
||||||
implementation 'com.android.support:support-v4:25.3.1'
|
|
||||||
implementation 'org.sufficientlysecure:donations:2.5'
|
|
||||||
implementation 'com.google.android.gms:play-services-auth:11.8.0'
|
|
||||||
|
|
||||||
implementation "com.badlogicgames.gdx:gdx-backend-android:$gdxVersion"
|
implementation arcModule("backends:backend-android")
|
||||||
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi"
|
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi"
|
||||||
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a"
|
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a"
|
||||||
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-arm64-v8a"
|
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-arm64-v8a"
|
||||||
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86"
|
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86"
|
||||||
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86_64"
|
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86_64"
|
||||||
implementation "com.badlogicgames.gdx:gdx-controllers-android:$gdxVersion"
|
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi"
|
||||||
|
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi-v7a"
|
||||||
|
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-arm64-v8a"
|
||||||
|
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-x86"
|
||||||
|
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-x86_64"
|
||||||
}
|
}
|
||||||
|
|
||||||
task deploy(type: Copy){
|
task deploy(type: Copy){
|
||||||
dependsOn "assembleRelease"
|
dependsOn "assembleRelease"
|
||||||
|
|
||||||
from "build/outputs/apk/google/release/android-google-release.apk"
|
from "build/outputs/apk/release/android-release.apk"
|
||||||
into "../deploy/";
|
into "../deploy/"
|
||||||
rename ("android-google-release.apk", appName + "-android-" + getVersionString() + ".apk");
|
rename("android-release.apk", appName + "-android-" + getVersionString() + ".apk")
|
||||||
}
|
}
|
||||||
|
|
||||||
android {
|
android{
|
||||||
buildToolsVersion '27.0.3'
|
buildToolsVersion '28.0.3'
|
||||||
compileSdkVersion 27
|
compileSdkVersion 28
|
||||||
sourceSets {
|
sourceSets{
|
||||||
main {
|
main{
|
||||||
manifest.srcFile 'AndroidManifest.xml'
|
manifest.srcFile 'AndroidManifest.xml'
|
||||||
java.srcDirs = ['src']
|
java.srcDirs = ['src']
|
||||||
aidl.srcDirs = ['src']
|
aidl.srcDirs = ['src']
|
||||||
@@ -51,11 +65,11 @@ android {
|
|||||||
|
|
||||||
androidTest.setRoot('tests')
|
androidTest.setRoot('tests')
|
||||||
}
|
}
|
||||||
packagingOptions {
|
packagingOptions{
|
||||||
exclude 'META-INF/robovm/ios/robovm.xml'
|
exclude 'META-INF/robovm/ios/robovm.xml'
|
||||||
}
|
}
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig{
|
||||||
def vfile = file('../core/assets/version.properties')
|
def vfile = file('../core/assets/version.properties')
|
||||||
|
|
||||||
def code = 0
|
def code = 0
|
||||||
@@ -74,39 +88,33 @@ android {
|
|||||||
|
|
||||||
applicationId "io.anuke.mindustry"
|
applicationId "io.anuke.mindustry"
|
||||||
minSdkVersion 14
|
minSdkVersion 14
|
||||||
targetSdkVersion 27
|
targetSdkVersion 28
|
||||||
versionCode code
|
versionCode code
|
||||||
versionName versionNameResult
|
versionName versionNameResult
|
||||||
}
|
}
|
||||||
|
|
||||||
compileOptions {
|
compileOptions{
|
||||||
sourceCompatibility JavaVersion.VERSION_1_8
|
sourceCompatibility JavaVersion.VERSION_1_8
|
||||||
targetCompatibility JavaVersion.VERSION_1_8
|
targetCompatibility JavaVersion.VERSION_1_8
|
||||||
}
|
}
|
||||||
|
|
||||||
flavorDimensions "google"
|
flavorDimensions "google"
|
||||||
|
|
||||||
productFlavors {
|
signingConfigs{
|
||||||
google {
|
release{
|
||||||
buildConfigField "boolean", "DONATIONS_GOOGLE", "true"
|
if(project.hasProperty("RELEASE_STORE_FILE")){
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
signingConfigs {
|
|
||||||
release {
|
|
||||||
if(project.hasProperty("RELEASE_STORE_FILE")) {
|
|
||||||
storeFile file(RELEASE_STORE_FILE)
|
storeFile file(RELEASE_STORE_FILE)
|
||||||
storePassword RELEASE_STORE_PASSWORD
|
storePassword RELEASE_STORE_PASSWORD
|
||||||
keyAlias RELEASE_KEY_ALIAS
|
keyAlias RELEASE_KEY_ALIAS
|
||||||
keyPassword RELEASE_KEY_PASSWORD
|
keyPassword RELEASE_KEY_PASSWORD
|
||||||
}else{
|
}else{
|
||||||
println("No keystore info property found!");
|
println("No keystore info property found!")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
buildTypes {
|
buildTypes{
|
||||||
release {
|
release{
|
||||||
signingConfig signingConfigs.release
|
signingConfig signingConfigs.release
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -114,22 +122,22 @@ android {
|
|||||||
// called every time gradle gets executed, takes the native dependencies of
|
// called every time gradle gets executed, takes the native dependencies of
|
||||||
// the natives configuration, and extracts them to the proper libs/ folders
|
// the natives configuration, and extracts them to the proper libs/ folders
|
||||||
// so they get packed with the APK.
|
// so they get packed with the APK.
|
||||||
task copyAndroidNatives() {
|
task copyAndroidNatives(){
|
||||||
file("libs/armeabi/").mkdirs();
|
file("libs/armeabi/").mkdirs()
|
||||||
file("libs/armeabi-v7a/").mkdirs();
|
file("libs/armeabi-v7a/").mkdirs()
|
||||||
file("libs/arm64-v8a/").mkdirs();
|
file("libs/arm64-v8a/").mkdirs()
|
||||||
file("libs/x86_64/").mkdirs();
|
file("libs/x86_64/").mkdirs()
|
||||||
file("libs/x86/").mkdirs();
|
file("libs/x86/").mkdirs()
|
||||||
|
|
||||||
configurations.natives.files.each { jar ->
|
configurations.natives.files.each{ jar ->
|
||||||
def outputDir = null
|
def outputDir = null
|
||||||
if (jar.name.endsWith("natives-arm64-v8a.jar")) outputDir = file("libs/arm64-v8a")
|
if(jar.name.endsWith("natives-arm64-v8a.jar")) outputDir = file("libs/arm64-v8a")
|
||||||
if (jar.name.endsWith("natives-armeabi-v7a.jar")) outputDir = file("libs/armeabi-v7a")
|
if(jar.name.endsWith("natives-armeabi-v7a.jar")) outputDir = file("libs/armeabi-v7a")
|
||||||
if (jar.name.endsWith("natives-armeabi.jar")) outputDir = file("libs/armeabi")
|
if(jar.name.endsWith("natives-armeabi.jar")) outputDir = file("libs/armeabi")
|
||||||
if (jar.name.endsWith("natives-x86_64.jar")) outputDir = file("libs/x86_64")
|
if(jar.name.endsWith("natives-x86_64.jar")) outputDir = file("libs/x86_64")
|
||||||
if (jar.name.endsWith("natives-x86.jar")) outputDir = file("libs/x86")
|
if(jar.name.endsWith("natives-x86.jar")) outputDir = file("libs/x86")
|
||||||
if (outputDir != null) {
|
if(outputDir != null){
|
||||||
copy {
|
copy{
|
||||||
from zipTree(jar)
|
from zipTree(jar)
|
||||||
into outputDir
|
into outputDir
|
||||||
include "*.so"
|
include "*.so"
|
||||||
@@ -137,76 +145,25 @@ task copyAndroidNatives() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
task run(type: Exec) {
|
|
||||||
|
task run(type: Exec){
|
||||||
def path
|
def path
|
||||||
def localProperties = project.file("../local.properties")
|
def localProperties = project.file("../local.properties")
|
||||||
if (localProperties.exists()) {
|
if(localProperties.exists()){
|
||||||
Properties properties = new Properties()
|
Properties properties = new Properties()
|
||||||
localProperties.withInputStream { instr ->
|
localProperties.withInputStream{ instr ->
|
||||||
properties.load(instr)
|
properties.load(instr)
|
||||||
}
|
}
|
||||||
def sdkDir = properties.getProperty('sdk.dir')
|
def sdkDir = properties.getProperty('sdk.dir')
|
||||||
if (sdkDir) {
|
if(sdkDir){
|
||||||
path = sdkDir
|
path = sdkDir
|
||||||
} else {
|
}else{
|
||||||
path = "$System.env.ANDROID_HOME"
|
path = "$System.env.ANDROID_HOME"
|
||||||
}
|
}
|
||||||
} else {
|
}else{
|
||||||
path = "$System.env.ANDROID_HOME"
|
path = "$System.env.ANDROID_HOME"
|
||||||
}
|
}
|
||||||
|
|
||||||
def adb = path + "/platform-tools/adb"
|
def adb = path + "/platform-tools/adb"
|
||||||
commandLine "$adb", 'shell', 'am', 'start', '-n', 'io.anuke.mindustry/io.anuke.mindustry.AndroidLauncher'
|
commandLine "$adb", 'shell', 'am', 'start', '-n', 'io.anuke.mindustry/io.anuke.mindustry.AndroidLauncher'
|
||||||
}
|
}
|
||||||
// sets up the Android Eclipse project, using the old Ant based build.
|
|
||||||
eclipse {
|
|
||||||
// need to specify Java source sets explicitly, SpringSource Gradle Eclipse plugin
|
|
||||||
// ignores any nodes added in classpath.file.withXml
|
|
||||||
sourceSets {
|
|
||||||
main {
|
|
||||||
java.srcDirs "src", 'gen'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
jdt {
|
|
||||||
sourceCompatibility = 1.7
|
|
||||||
targetCompatibility = 1.7
|
|
||||||
}
|
|
||||||
|
|
||||||
classpath {
|
|
||||||
plusConfigurations += [project.configurations.compile]
|
|
||||||
containers 'com.android.ide.eclipse.adt.ANDROID_FRAMEWORK', 'com.android.ide.eclipse.adt.LIBRARIES'
|
|
||||||
}
|
|
||||||
|
|
||||||
project {
|
|
||||||
name = appName + "-android"
|
|
||||||
natures 'com.android.ide.eclipse.adt.AndroidNature'
|
|
||||||
buildCommands.clear();
|
|
||||||
buildCommand "com.android.ide.eclipse.adt.ResourceManagerBuilder"
|
|
||||||
buildCommand "com.android.ide.eclipse.adt.PreCompilerBuilder"
|
|
||||||
buildCommand "org.eclipse.jdt.core.javabuilder"
|
|
||||||
buildCommand "com.android.ide.eclipse.adt.ApkBuilder"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// sets up the Android Idea project, using the old Ant based build.
|
|
||||||
idea {
|
|
||||||
module {
|
|
||||||
sourceDirs += file("src");
|
|
||||||
scopes = [COMPILE: [plus: [project.configurations.compile]]]
|
|
||||||
|
|
||||||
iml {
|
|
||||||
withXml {
|
|
||||||
def node = it.asNode()
|
|
||||||
def builder = NodeBuilder.newInstance();
|
|
||||||
builder.current = node;
|
|
||||||
builder.component(name: "FacetManager") {
|
|
||||||
facet(type: "android", name: "Android") {
|
|
||||||
configuration {
|
|
||||||
option(name: "UPDATE_PROPERTY_FILES", value: "true")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 76 KiB |
@@ -20,26 +20,10 @@
|
|||||||
#}
|
#}
|
||||||
|
|
||||||
-verbose
|
-verbose
|
||||||
|
-verbose
|
||||||
-dontwarn android.support.**
|
-ignorewarnings
|
||||||
-dontwarn com.badlogic.gdx.backends.android.AndroidFragmentApplication
|
-keep class io.anuke.mindustry.game.Rules
|
||||||
-dontwarn com.badlogic.gdx.utils.GdxBuild
|
-keep class io.anuke.mindustry.desktop.DesktopLauncher
|
||||||
-dontwarn com.badlogic.gdx.physics.box2d.utils.Box2DBuild
|
-keepclasseswithmembers public class * {
|
||||||
-dontwarn com.badlogic.gdx.jnigen.BuildTarget*
|
public static void main(java.lang.String[]);
|
||||||
-dontwarn com.badlogic.gdx.graphics.g2d.freetype.FreetypeBuild
|
|
||||||
|
|
||||||
-keep class com.badlogic.gdx.controllers.android.AndroidControllers
|
|
||||||
|
|
||||||
-keepclassmembers class com.badlogic.gdx.backends.android.AndroidInput* {
|
|
||||||
<init>(com.badlogic.gdx.Application, android.content.Context, java.lang.Object, com.badlogic.gdx.backends.android.AndroidApplicationConfiguration);
|
|
||||||
}
|
|
||||||
|
|
||||||
-keepclassmembers class com.badlogic.gdx.physics.box2d.World {
|
|
||||||
boolean contactFilter(long, long);
|
|
||||||
void beginContact(long);
|
|
||||||
void endContact(long);
|
|
||||||
void preSolve(long, long);
|
|
||||||
void postSolve(long, long);
|
|
||||||
boolean reportFixture(long);
|
|
||||||
float reportRayFixture(long, float, float, float, float, float);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,5 @@
|
|||||||
#
|
#
|
||||||
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
|
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
|
||||||
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
|
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
|
||||||
|
|
||||||
# Project target.
|
# Project target.
|
||||||
target=android-19
|
target=android-19
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 911 B After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 23 KiB |
@@ -1,32 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
|
||||||
android:layout_width="fill_parent"
|
|
||||||
android:layout_height="fill_parent"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:background="#000">
|
|
||||||
|
|
||||||
<RelativeLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent">
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:layout_gravity="top"
|
|
||||||
android:adjustViewBounds="false"
|
|
||||||
android:contentDescription="background"
|
|
||||||
android:cropToPadding="false"
|
|
||||||
android:scaleType="centerCrop"
|
|
||||||
android:src="@drawable/background" />
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/donations_activity_container"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
</RelativeLayout>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:id="@+id/layout_root"
|
|
||||||
android:layout_width="fill_parent"
|
|
||||||
android:layout_height="fill_parent"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:padding="10dp" >
|
|
||||||
|
|
||||||
<EditText
|
|
||||||
android:id="@+id/gdxDialogsEditTextInput"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:inputType="text"
|
|
||||||
android:maxLines="1"
|
|
||||||
android:maxLength="15"
|
|
||||||
>
|
|
||||||
|
|
||||||
<requestFocus />
|
|
||||||
|
|
||||||
</EditText>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 6.5 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 7.1 KiB |
|
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 8.4 KiB |
|
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 7.6 KiB |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 553 B After Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 5.2 KiB |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 9.8 KiB |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 9.8 KiB |
|
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 8.1 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 9.0 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 5.1 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 28 KiB |
@@ -2,14 +2,5 @@
|
|||||||
<resources>
|
<resources>
|
||||||
|
|
||||||
<string name="app_name">Mindustry</string>
|
<string name="app_name">Mindustry</string>
|
||||||
<string-array name="donation_google_catalog_values">
|
|
||||||
<item>1 Dollar</item>
|
|
||||||
<item>2 Dollars</item>
|
|
||||||
<item>5 Dollars</item>
|
|
||||||
<item>10 Dollars</item>
|
|
||||||
<item>15 Dollars</item>
|
|
||||||
<item>25 Dollars</item>
|
|
||||||
<item>50 Dollars</item>
|
|
||||||
</string-array>
|
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
@@ -10,44 +10,27 @@ import android.os.Build;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.provider.Settings.Secure;
|
import android.provider.Settings.Secure;
|
||||||
import android.telephony.TelephonyManager;
|
import android.telephony.TelephonyManager;
|
||||||
import android.util.Log;
|
import io.anuke.arc.Core;
|
||||||
import com.badlogic.gdx.Gdx;
|
import io.anuke.arc.backends.android.surfaceview.AndroidApplication;
|
||||||
import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration;
|
import io.anuke.arc.backends.android.surfaceview.AndroidApplicationConfiguration;
|
||||||
import com.badlogic.gdx.files.FileHandle;
|
import io.anuke.arc.files.FileHandle;
|
||||||
import com.badlogic.gdx.utils.Base64Coder;
|
import io.anuke.arc.function.Consumer;
|
||||||
import com.google.android.gms.common.GoogleApiAvailability;
|
import io.anuke.arc.function.Predicate;
|
||||||
import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
|
import io.anuke.arc.scene.ui.layout.Unit;
|
||||||
import com.google.android.gms.common.GooglePlayServicesRepairableException;
|
import io.anuke.arc.util.Strings;
|
||||||
import com.google.android.gms.security.ProviderInstaller;
|
import io.anuke.arc.util.serialization.Base64Coder;
|
||||||
import io.anuke.kryonet.DefaultThreadImpl;
|
|
||||||
import io.anuke.kryonet.KryoClient;
|
|
||||||
import io.anuke.kryonet.KryoServer;
|
|
||||||
import io.anuke.mindustry.core.Platform;
|
import io.anuke.mindustry.core.Platform;
|
||||||
import io.anuke.mindustry.core.ThreadHandler.ThreadProvider;
|
|
||||||
import io.anuke.mindustry.game.Saves.SaveSlot;
|
import io.anuke.mindustry.game.Saves.SaveSlot;
|
||||||
import io.anuke.mindustry.io.SaveIO;
|
import io.anuke.mindustry.io.SaveIO;
|
||||||
import io.anuke.mindustry.net.Net;
|
import io.anuke.mindustry.net.*;
|
||||||
import io.anuke.mindustry.ui.dialogs.FileChooser;
|
import io.anuke.mindustry.ui.dialogs.FileChooser;
|
||||||
import io.anuke.ucore.function.Consumer;
|
|
||||||
import io.anuke.ucore.scene.ui.TextField;
|
|
||||||
import io.anuke.ucore.scene.ui.layout.Unit;
|
|
||||||
import io.anuke.ucore.util.Bundles;
|
|
||||||
import io.anuke.ucore.util.Strings;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.*;
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.text.DateFormat;
|
|
||||||
import java.text.NumberFormat;
|
|
||||||
import java.text.SimpleDateFormat;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
|
||||||
import java.util.Locale;
|
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.*;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
|
|
||||||
public class AndroidLauncher extends PatchedAndroidApplication{
|
public class AndroidLauncher extends AndroidApplication{
|
||||||
public static final int PERMISSION_REQUEST_CODE = 1;
|
public static final int PERMISSION_REQUEST_CODE = 1;
|
||||||
boolean doubleScaleTablets = true;
|
boolean doubleScaleTablets = true;
|
||||||
FileChooser chooser;
|
FileChooser chooser;
|
||||||
@@ -57,53 +40,22 @@ public class AndroidLauncher extends PatchedAndroidApplication{
|
|||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
|
AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
|
||||||
config.useImmersiveMode = true;
|
config.useImmersiveMode = true;
|
||||||
|
config.depth = 0;
|
||||||
Platform.instance = new Platform(){
|
Platform.instance = new Platform(){
|
||||||
DateFormat format = SimpleDateFormat.getDateTimeInstance();
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String format(Date date){
|
public void hide(){
|
||||||
return format.format(date);
|
moveTaskToBack(true);
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String format(int number){
|
|
||||||
return NumberFormat.getIntegerInstance().format(number);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void addDialog(TextField field, int length){
|
|
||||||
TextFieldDialogListener.add(field, 0, length);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getLocaleName(Locale locale){
|
|
||||||
return locale.getDisplayName(locale);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void openDonations(){
|
|
||||||
showDonations();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ThreadProvider getThreadProvider(){
|
|
||||||
return new DefaultThreadImpl();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isDebug(){
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getUUID(){
|
public String getUUID(){
|
||||||
try{
|
try{
|
||||||
String s = Secure.getString(getContext().getContentResolver(),
|
String s = Secure.getString(getContext().getContentResolver(), Secure.ANDROID_ID);
|
||||||
Secure.ANDROID_ID);
|
|
||||||
int len = s.length();
|
int len = s.length();
|
||||||
byte[] data = new byte[len / 2];
|
byte[] data = new byte[len / 2];
|
||||||
for(int i = 0; i < len; i += 2){
|
for(int i = 0; i < len; i += 2){
|
||||||
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
|
data[i / 2] = (byte)((Character.digit(s.charAt(i), 16) << 4)
|
||||||
+ Character.digit(s.charAt(i + 1), 16));
|
+ Character.digit(s.charAt(i + 1), 16));
|
||||||
}
|
}
|
||||||
String result = new String(Base64Coder.encode(data));
|
String result = new String(Base64Coder.encode(data));
|
||||||
@@ -119,8 +71,8 @@ public class AndroidLauncher extends PatchedAndroidApplication{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void showFileChooser(String text, String content, Consumer<FileHandle> cons, boolean open, String filetype){
|
public void showFileChooser(String text, String content, Consumer<FileHandle> cons, boolean open, Predicate<String> filetype){
|
||||||
chooser = new FileChooser(text, file -> file.extension().equalsIgnoreCase(filetype), open, cons);
|
chooser = new FileChooser(text, file -> filetype.test(file.extension().toLowerCase()), open, cons);
|
||||||
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M || (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
|
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M || (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
|
||||||
checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)){
|
checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)){
|
||||||
chooser.show();
|
chooser.show();
|
||||||
@@ -133,13 +85,13 @@ public class AndroidLauncher extends PatchedAndroidApplication{
|
|||||||
if(checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
|
if(checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
|
||||||
perms.add(Manifest.permission.READ_EXTERNAL_STORAGE);
|
perms.add(Manifest.permission.READ_EXTERNAL_STORAGE);
|
||||||
}
|
}
|
||||||
requestPermissions(perms.toArray(new String[perms.size()]), PERMISSION_REQUEST_CODE);
|
requestPermissions(perms.toArray(new String[0]), PERMISSION_REQUEST_CODE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void beginForceLandscape(){
|
public void beginForceLandscape(){
|
||||||
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
|
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -152,26 +104,20 @@ public class AndroidLauncher extends PatchedAndroidApplication{
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
try{
|
|
||||||
ProviderInstaller.installIfNeeded(this);
|
|
||||||
}catch(GooglePlayServicesRepairableException e){
|
|
||||||
GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance();
|
|
||||||
apiAvailability.getErrorDialog(this, e.getConnectionStatusCode(), 0).show();
|
|
||||||
}catch(GooglePlayServicesNotAvailableException e){
|
|
||||||
Log.e("SecurityException", "Google Play Services not available.");
|
|
||||||
}
|
|
||||||
if(doubleScaleTablets && isTablet(this.getContext())){
|
if(doubleScaleTablets && isTablet(this.getContext())){
|
||||||
Unit.dp.addition = 0.5f;
|
Unit.dp.addition = 0.5f;
|
||||||
}
|
}
|
||||||
|
|
||||||
config.hideStatusBar = true;
|
config.hideStatusBar = true;
|
||||||
Net.setClientProvider(new KryoClient());
|
Net.setClientProvider(new ArcNetClient());
|
||||||
Net.setServerProvider(new KryoServer());
|
Net.setServerProvider(new ArcNetServer());
|
||||||
initialize(new Mindustry(), config);
|
initialize(new Mindustry(), config);
|
||||||
checkFiles(getIntent());
|
checkFiles(getIntent());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults){
|
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults){
|
||||||
if(requestCode == PERMISSION_REQUEST_CODE){
|
if(requestCode == PERMISSION_REQUEST_CODE){
|
||||||
for(int i : grantResults){
|
for(int i : grantResults){
|
||||||
if(i != PackageManager.PERMISSION_GRANTED) return;
|
if(i != PackageManager.PERMISSION_GRANTED) return;
|
||||||
@@ -200,28 +146,30 @@ public class AndroidLauncher extends PatchedAndroidApplication{
|
|||||||
InputStream inStream;
|
InputStream inStream;
|
||||||
if(myFile != null) inStream = new FileInputStream(myFile);
|
if(myFile != null) inStream = new FileInputStream(myFile);
|
||||||
else inStream = getContentResolver().openInputStream(uri);
|
else inStream = getContentResolver().openInputStream(uri);
|
||||||
Gdx.app.postRunnable(() -> {
|
Core.app.post(() -> {
|
||||||
if(save){ //open save
|
if(save){ //open save
|
||||||
System.out.println("Opening save.");
|
System.out.println("Opening save.");
|
||||||
FileHandle file = Gdx.files.local("temp-save." + saveExtension);
|
FileHandle file = Core.files.local("temp-save." + saveExtension);
|
||||||
file.write(inStream, false);
|
file.write(inStream, false);
|
||||||
if(SaveIO.isSaveValid(file)){
|
if(SaveIO.isSaveValid(file)){
|
||||||
try{
|
try{
|
||||||
SaveSlot slot = control.getSaves().importSave(file);
|
SaveSlot slot = control.saves.importSave(file);
|
||||||
ui.load.runLoadSave(slot);
|
ui.load.runLoadSave(slot);
|
||||||
}catch(IOException e){
|
}catch(IOException e){
|
||||||
ui.showError(Bundles.format("text.save.import.fail", Strings.parseException(e, false)));
|
ui.showError(Core.bundle.format("save.import.fail", Strings.parseException(e, true)));
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
ui.showError("$text.save.import.invalid");
|
ui.showError("$save.import.invalid");
|
||||||
}
|
}
|
||||||
}else if(map){ //open map
|
}else if(map){ //open map
|
||||||
Gdx.app.postRunnable(() -> {
|
FileHandle file = Core.files.local("temp-map." + mapExtension);
|
||||||
|
file.write(inStream, false);
|
||||||
|
Core.app.post(() -> {
|
||||||
System.out.println("Opening map.");
|
System.out.println("Opening map.");
|
||||||
if(!ui.editor.isShown()){
|
if(!ui.editor.isShown()){
|
||||||
ui.editor.show();
|
ui.editor.show();
|
||||||
}
|
}
|
||||||
ui.editor.beginEditMap(inStream);
|
ui.editor.beginEditMap(file);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -231,22 +179,8 @@ public class AndroidLauncher extends PatchedAndroidApplication{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isPackageInstalled(String packagename){
|
|
||||||
try{
|
|
||||||
getPackageManager().getPackageInfo(packagename, 0);
|
|
||||||
return true;
|
|
||||||
}catch(Exception e){
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isTablet(Context context){
|
private boolean isTablet(Context context){
|
||||||
TelephonyManager manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
|
TelephonyManager manager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
|
||||||
return manager.getPhoneType() == TelephonyManager.PHONE_TYPE_NONE;
|
return manager != null && manager.getPhoneType() == TelephonyManager.PHONE_TYPE_NONE;
|
||||||
}
|
|
||||||
|
|
||||||
private void showDonations(){
|
|
||||||
Intent intent = new Intent(this, DonationsActivity.class);
|
|
||||||
startActivity(intent);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,119 +0,0 @@
|
|||||||
package io.anuke.mindustry;
|
|
||||||
|
|
||||||
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.app.AlertDialog;
|
|
||||||
import android.text.InputFilter;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.WindowManager.LayoutParams;
|
|
||||||
import android.widget.EditText;
|
|
||||||
import com.badlogic.gdx.Gdx;
|
|
||||||
|
|
||||||
public class AndroidTextFieldDialog{
|
|
||||||
private Activity activity;
|
|
||||||
private EditText userInput;
|
|
||||||
private AlertDialog.Builder builder;
|
|
||||||
private TextPromptListener listener;
|
|
||||||
private boolean isBuild;
|
|
||||||
|
|
||||||
public AndroidTextFieldDialog(){
|
|
||||||
this.activity = (Activity) Gdx.app;
|
|
||||||
load();
|
|
||||||
}
|
|
||||||
|
|
||||||
public AndroidTextFieldDialog show(){
|
|
||||||
|
|
||||||
activity.runOnUiThread(() -> {
|
|
||||||
AlertDialog dialog = builder.create();
|
|
||||||
|
|
||||||
dialog.getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE);
|
|
||||||
|
|
||||||
dialog.show();
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
private AndroidTextFieldDialog load(){
|
|
||||||
|
|
||||||
activity.runOnUiThread(() -> {
|
|
||||||
|
|
||||||
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(activity);
|
|
||||||
LayoutInflater li = LayoutInflater.from(activity);
|
|
||||||
|
|
||||||
View promptsView = li.inflate(getResourceId("gdxdialogs_inputtext", "layout"), null);
|
|
||||||
|
|
||||||
alertDialogBuilder.setView(promptsView);
|
|
||||||
|
|
||||||
userInput = promptsView.findViewById(getResourceId("gdxDialogsEditTextInput", "id"));
|
|
||||||
|
|
||||||
alertDialogBuilder.setCancelable(false);
|
|
||||||
builder = alertDialogBuilder;
|
|
||||||
|
|
||||||
isBuild = true;
|
|
||||||
});
|
|
||||||
|
|
||||||
// Wait till TextPrompt is built.
|
|
||||||
while(!isBuild){
|
|
||||||
try{
|
|
||||||
Thread.sleep(10);
|
|
||||||
}catch(InterruptedException e){
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getResourceId(String pVariableName, String pVariableType){
|
|
||||||
try{
|
|
||||||
return activity.getResources().getIdentifier(pVariableName, pVariableType, activity.getPackageName());
|
|
||||||
}catch(Exception e){
|
|
||||||
Gdx.app.error("Android Dialogs", "Cannot find resouce with name: " + pVariableName
|
|
||||||
+ " Did you copy the layouts to /res/layouts and /res/layouts_v14 ?");
|
|
||||||
e.printStackTrace();
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public AndroidTextFieldDialog setText(CharSequence value){
|
|
||||||
userInput.append(value);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public AndroidTextFieldDialog setCancelButtonLabel(CharSequence label){
|
|
||||||
builder.setNegativeButton(label, (dialog, id) -> dialog.cancel());
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public AndroidTextFieldDialog setConfirmButtonLabel(CharSequence label){
|
|
||||||
builder.setPositiveButton(label, (dialog, id) -> {
|
|
||||||
if(listener != null && !userInput.getText().toString().isEmpty()){
|
|
||||||
listener.confirm(userInput.getText().toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public AndroidTextFieldDialog setTextPromptListener(TextPromptListener listener){
|
|
||||||
this.listener = listener;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public AndroidTextFieldDialog setInputType(int type){
|
|
||||||
userInput.setInputType(type);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public AndroidTextFieldDialog setMaxLength(int length){
|
|
||||||
userInput.setFilters(new InputFilter[]{new InputFilter.LengthFilter(length)});
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface TextPromptListener{
|
|
||||||
void confirm(String text);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
package io.anuke.mindustry;
|
|
||||||
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.support.v4.app.Fragment;
|
|
||||||
import android.support.v4.app.FragmentActivity;
|
|
||||||
import android.support.v4.app.FragmentManager;
|
|
||||||
import android.support.v4.app.FragmentTransaction;
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.Button;
|
|
||||||
import org.sufficientlysecure.donations.DonationsFragment;
|
|
||||||
|
|
||||||
public class DonationsActivity extends FragmentActivity{
|
|
||||||
/**
|
|
||||||
* Google
|
|
||||||
*/
|
|
||||||
private static final String GOOGLE_PUBKEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzG93KhpfBPKTo2jF0yxbWkkmMKwsPNM4SsMj1aDq7vv6n3R+mqJVfprOJxFfJh7JchXTflLIgiaKXFAiU70gJbMTniEWnEaFSxAeF09a7U0RjOwN+7rFwjCG91c2CpYxPanBTQP4zasc1ODPVzq4q6/4ByjhenN71V4WmR08NFIAodcfFPrOkDPil7i8y7cgcd1Ky53U0TS+LLYJttAK3XdTK4s7VE3I5IKoeNa4uwCmIM59R67q2k3cXjLk/nP6MP+y++EzHN/PTiR1sVg4dMP8K31RPw/1QNLPQwJz6Wc872oWwb7xo5gkoXbDc5WPPydsi8F3SyKNaYwzN6CDFQIDAQAB";
|
|
||||||
private static final String[] GOOGLE_CATALOG = new String[]{
|
|
||||||
"mindustry.donation.1", "mindustry.donation.2", "mindustry.donation.5",
|
|
||||||
"mindustry.donation.10", "mindustry.donation.15",
|
|
||||||
"mindustry.donation.25", "mindustry.donation.50"};
|
|
||||||
DonationsFragment donationsFragment;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called when the activity is first created.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void onCreate(Bundle savedInstanceState){
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
|
|
||||||
setTheme(R.style.GdxTheme);
|
|
||||||
|
|
||||||
setContentView(R.layout.donations_activity);
|
|
||||||
|
|
||||||
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
|
|
||||||
if(BuildConfig.DONATIONS_GOOGLE){
|
|
||||||
donationsFragment = DonationsFragment.newInstance(BuildConfig.DEBUG, true, GOOGLE_PUBKEY, GOOGLE_CATALOG,
|
|
||||||
getResources().getStringArray(R.array.donation_google_catalog_values), false, null, null,
|
|
||||||
null, false, null, null, false, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ft.replace(R.id.donations_activity_container, donationsFragment, "donationsFragment");
|
|
||||||
ft.commit();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onStart(){
|
|
||||||
super.onStart();
|
|
||||||
Button b = ((Button) findViewById(org.sufficientlysecure.donations.R.id.donations__google_android_market_donate_button));
|
|
||||||
b.setOnClickListener(new View.OnClickListener(){
|
|
||||||
@Override
|
|
||||||
public void onClick(View view){
|
|
||||||
donationsFragment.donateGoogleOnClick(donationsFragment.getView());
|
|
||||||
b.setEnabled(false);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Needed for Google Play In-app Billing. It uses startIntentSenderForResult(). The result is not propagated to
|
|
||||||
* the Fragment like in startActivityForResult(). Thus we need to propagate manually to our Fragment.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
protected void onActivityResult(int requestCode, int resultCode, Intent data){
|
|
||||||
super.onActivityResult(requestCode, resultCode, data);
|
|
||||||
Button b = ((Button) findViewById(org.sufficientlysecure.donations.R.id.donations__google_android_market_donate_button));
|
|
||||||
b.setEnabled(true);
|
|
||||||
|
|
||||||
FragmentManager fragmentManager = getSupportFragmentManager();
|
|
||||||
Fragment fragment = fragmentManager.findFragmentByTag("donationsFragment");
|
|
||||||
if(fragment != null){
|
|
||||||
fragment.onActivityResult(requestCode, resultCode, data);
|
|
||||||
//TODO donation event, set settings?
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
package io.anuke.mindustry;
|
|
||||||
|
|
||||||
import com.badlogic.gdx.backends.android.AndroidApplication;
|
|
||||||
import java.util.concurrent.ExecutorService;
|
|
||||||
import java.util.concurrent.Executors;
|
|
||||||
|
|
||||||
public class PatchedAndroidApplication extends AndroidApplication {
|
|
||||||
private final ExecutorService exec = Executors.newSingleThreadExecutor();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onPause () {
|
|
||||||
if(useImmersiveMode) {
|
|
||||||
exec.submit(() -> {
|
|
||||||
try {Thread.sleep(100);} catch (InterruptedException ignored) {}
|
|
||||||
graphics.onDrawFrame(null);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
super.onPause();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
package io.anuke.mindustry;
|
|
||||||
|
|
||||||
|
|
||||||
import android.text.InputType;
|
|
||||||
import com.badlogic.gdx.Application.ApplicationType;
|
|
||||||
import com.badlogic.gdx.Gdx;
|
|
||||||
import io.anuke.ucore.scene.event.ChangeListener;
|
|
||||||
import io.anuke.ucore.scene.event.ClickListener;
|
|
||||||
import io.anuke.ucore.scene.event.InputEvent;
|
|
||||||
import io.anuke.ucore.scene.event.InputListener;
|
|
||||||
import io.anuke.ucore.scene.ui.TextField;
|
|
||||||
|
|
||||||
public class TextFieldDialogListener extends ClickListener{
|
|
||||||
private TextField field;
|
|
||||||
private int type;
|
|
||||||
private int max;
|
|
||||||
|
|
||||||
//type - 0 is text, 1 is numbers, 2 is decimals
|
|
||||||
public TextFieldDialogListener(TextField field, int type, int max){
|
|
||||||
this.field = field;
|
|
||||||
this.type = type;
|
|
||||||
this.max = max;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void add(TextField field, int type, int max){
|
|
||||||
field.addListener(new TextFieldDialogListener(field, type, max));
|
|
||||||
field.addListener(new InputListener(){
|
|
||||||
public boolean touchDown(InputEvent event, float x, float y, int pointer, int button){
|
|
||||||
Gdx.input.setOnscreenKeyboardVisible(false);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void add(TextField field){
|
|
||||||
add(field, 0, 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void clicked(final InputEvent event, float x, float y){
|
|
||||||
|
|
||||||
if(Gdx.app.getType() == ApplicationType.Desktop) return;
|
|
||||||
|
|
||||||
AndroidTextFieldDialog dialog = new AndroidTextFieldDialog();
|
|
||||||
|
|
||||||
dialog.setTextPromptListener(text -> {
|
|
||||||
field.clearText();
|
|
||||||
field.appendText(text);
|
|
||||||
field.fire(new ChangeListener.ChangeEvent());
|
|
||||||
Gdx.graphics.requestRendering();
|
|
||||||
});
|
|
||||||
|
|
||||||
if(type == 0){
|
|
||||||
dialog.setInputType(InputType.TYPE_CLASS_TEXT);
|
|
||||||
}else if(type == 1){
|
|
||||||
dialog.setInputType(InputType.TYPE_CLASS_NUMBER);
|
|
||||||
}else if(type == 2){
|
|
||||||
dialog.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
dialog.setConfirmButtonLabel("OK").setText(field.getText());
|
|
||||||
dialog.setCancelButtonLabel("Cancel");
|
|
||||||
dialog.setMaxLength(max);
|
|
||||||
dialog.show();
|
|
||||||
event.cancel();
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,6 @@
|
|||||||
apply plugin: "java"
|
apply plugin: "java"
|
||||||
|
|
||||||
sourceCompatibility = 1.8
|
sourceCompatibility = 1.8
|
||||||
sourceSets.main.java.srcDirs = [ "src/" ]
|
sourceSets.main.java.srcDirs = ["src/main/java/"]
|
||||||
|
sourceSets.main.resources.srcDirs = ["src/main/resources/"]
|
||||||
|
|
||||||
|
|||||||
@@ -1,16 +1,58 @@
|
|||||||
package io.anuke.annotations;
|
package io.anuke.annotations;
|
||||||
|
|
||||||
import java.lang.annotation.ElementType;
|
import java.lang.annotation.*;
|
||||||
import java.lang.annotation.Retention;
|
|
||||||
import java.lang.annotation.RetentionPolicy;
|
|
||||||
import java.lang.annotation.Target;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Goal: To create a system to send events to the server from the client and vice versa, without creating a new packet type each time.<br>
|
|
||||||
* These events may optionally also trigger on the caller client/server as well.<br>
|
|
||||||
*/
|
|
||||||
public class Annotations{
|
public class Annotations{
|
||||||
|
|
||||||
|
/** Indicates that a method should always call its super version. */
|
||||||
|
@Target(ElementType.METHOD)
|
||||||
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
|
public @interface CallSuper{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Annotation that allows overriding CallSuper annotation. To be used on method that overrides method with CallSuper annotation from parent class.*/
|
||||||
|
@Target(ElementType.METHOD)
|
||||||
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
|
public @interface OverrideCallSuper {
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Indicates that a method return or field can be null.*/
|
||||||
|
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.LOCAL_VARIABLE})
|
||||||
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
|
public @interface Nullable{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Indicates that a method return or field cannot be null.*/
|
||||||
|
@Target({ElementType.METHOD, ElementType.FIELD})
|
||||||
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
|
public @interface NonNull{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Marks a class as serializable. */
|
||||||
|
@Target(ElementType.TYPE)
|
||||||
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
|
public @interface Serialize{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Marks a class as a special value type struct. Class name must end in 'Struct'. */
|
||||||
|
@Target(ElementType.TYPE)
|
||||||
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
|
public @interface Struct{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Marks a field of a struct. Optional. */
|
||||||
|
@Target(ElementType.FIELD)
|
||||||
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
|
public @interface StructField{
|
||||||
|
/** Size of a struct field in bits. Not valid on booleans or floating point numbers. */
|
||||||
|
int value();
|
||||||
|
}
|
||||||
|
|
||||||
public enum PacketPriority{
|
public enum PacketPriority{
|
||||||
/** Gets put in a queue and processed if not connected. */
|
/** Gets put in a queue and processed if not connected. */
|
||||||
normal,
|
normal,
|
||||||
@@ -60,7 +102,7 @@ public class Annotations{
|
|||||||
|
|
||||||
/** Marks a method as invokable remotely across a server/client connection. */
|
/** Marks a method as invokable remotely across a server/client connection. */
|
||||||
@Target(ElementType.METHOD)
|
@Target(ElementType.METHOD)
|
||||||
@Retention(RetentionPolicy.CLASS)
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
public @interface Remote{
|
public @interface Remote{
|
||||||
/** Specifies the locations from which this method can be invoked. */
|
/** Specifies the locations from which this method can be invoked. */
|
||||||
Loc targets() default Loc.server;
|
Loc targets() default Loc.server;
|
||||||
@@ -90,7 +132,7 @@ public class Annotations{
|
|||||||
* being the type returned by {@link #value()}.
|
* being the type returned by {@link #value()}.
|
||||||
*/
|
*/
|
||||||
@Target(ElementType.METHOD)
|
@Target(ElementType.METHOD)
|
||||||
@Retention(RetentionPolicy.CLASS)
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
public @interface WriteClass{
|
public @interface WriteClass{
|
||||||
Class<?> value();
|
Class<?> value();
|
||||||
}
|
}
|
||||||
@@ -101,7 +143,7 @@ public class Annotations{
|
|||||||
* and have one parameter, being of type {@link java.nio.ByteBuffer}.
|
* and have one parameter, being of type {@link java.nio.ByteBuffer}.
|
||||||
*/
|
*/
|
||||||
@Target(ElementType.METHOD)
|
@Target(ElementType.METHOD)
|
||||||
@Retention(RetentionPolicy.CLASS)
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
public @interface ReadClass{
|
public @interface ReadClass{
|
||||||
Class<?> value();
|
Class<?> value();
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
package io.anuke.annotations;
|
||||||
|
|
||||||
|
import com.sun.source.util.TreePath;
|
||||||
|
import com.sun.source.util.Trees;
|
||||||
|
import com.sun.tools.javac.tree.JCTree;
|
||||||
|
import com.sun.tools.javac.tree.JCTree.JCExpressionStatement;
|
||||||
|
import io.anuke.annotations.Annotations.OverrideCallSuper;
|
||||||
|
|
||||||
|
import javax.annotation.processing.*;
|
||||||
|
import javax.lang.model.SourceVersion;
|
||||||
|
import javax.lang.model.element.Element;
|
||||||
|
import javax.lang.model.element.TypeElement;
|
||||||
|
import javax.tools.Diagnostic.Kind;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
@SupportedAnnotationTypes("java.lang.Override")
|
||||||
|
public class CallSuperAnnotationProcessor extends AbstractProcessor{
|
||||||
|
private Trees trees;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void init (ProcessingEnvironment pe) {
|
||||||
|
super.init(pe);
|
||||||
|
trees = Trees.instance(pe);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean process (Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
|
||||||
|
for (Element e : roundEnv.getElementsAnnotatedWith(Override.class)) {
|
||||||
|
if (e.getAnnotation(OverrideCallSuper.class) != null) return false;
|
||||||
|
|
||||||
|
CodeAnalyzerTreeScanner codeScanner = new CodeAnalyzerTreeScanner();
|
||||||
|
codeScanner.setMethodName(e.getSimpleName().toString());
|
||||||
|
|
||||||
|
TreePath tp = trees.getPath(e.getEnclosingElement());
|
||||||
|
codeScanner.scan(tp, trees);
|
||||||
|
|
||||||
|
if (codeScanner.isCallSuperUsed()) {
|
||||||
|
List list = codeScanner.getMethod().getBody().getStatements();
|
||||||
|
|
||||||
|
if (!doesCallSuper(list, codeScanner.getMethodName())) {
|
||||||
|
processingEnv.getMessager().printMessage(Kind.ERROR, "Overriding method '" + codeScanner.getMethodName() + "' must explicitly call super method from its parent class.", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean doesCallSuper (List list, String methodName) {
|
||||||
|
for (Object object : list) {
|
||||||
|
if (object instanceof JCTree.JCExpressionStatement) {
|
||||||
|
JCTree.JCExpressionStatement expr = (JCExpressionStatement) object;
|
||||||
|
String exprString = expr.toString();
|
||||||
|
if (exprString.startsWith("super." + methodName) && exprString.endsWith(");")) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SourceVersion getSupportedSourceVersion () {
|
||||||
|
return SourceVersion.RELEASE_8;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,98 @@
|
|||||||
|
package io.anuke.annotations;
|
||||||
|
|
||||||
|
import com.sun.source.tree.*;
|
||||||
|
import com.sun.source.util.TreePathScanner;
|
||||||
|
import com.sun.source.util.Trees;
|
||||||
|
import com.sun.tools.javac.code.Scope;
|
||||||
|
import com.sun.tools.javac.code.Symbol;
|
||||||
|
import com.sun.tools.javac.code.Symbol.MethodSymbol;
|
||||||
|
import com.sun.tools.javac.code.Type.ClassType;
|
||||||
|
import com.sun.tools.javac.tree.JCTree.JCIdent;
|
||||||
|
import com.sun.tools.javac.tree.JCTree.JCTypeApply;
|
||||||
|
import io.anuke.annotations.Annotations.CallSuper;
|
||||||
|
|
||||||
|
import java.lang.annotation.Annotation;
|
||||||
|
|
||||||
|
class CodeAnalyzerTreeScanner extends TreePathScanner<Object, Trees> {
|
||||||
|
private String methodName;
|
||||||
|
private MethodTree method;
|
||||||
|
private boolean callSuperUsed;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object visitClass (ClassTree classTree, Trees trees) {
|
||||||
|
Tree extendTree = classTree.getExtendsClause();
|
||||||
|
|
||||||
|
if (extendTree instanceof JCTypeApply) { //generic classes case
|
||||||
|
JCTypeApply generic = (JCTypeApply) extendTree;
|
||||||
|
extendTree = generic.clazz;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (extendTree instanceof JCIdent) {
|
||||||
|
JCIdent tree = (JCIdent) extendTree;
|
||||||
|
Scope members = tree.sym.members();
|
||||||
|
|
||||||
|
if (checkScope(members))
|
||||||
|
return super.visitClass(classTree, trees);
|
||||||
|
|
||||||
|
if (checkSuperTypes((ClassType) tree.type))
|
||||||
|
return super.visitClass(classTree, trees);
|
||||||
|
|
||||||
|
}
|
||||||
|
callSuperUsed = false;
|
||||||
|
|
||||||
|
return super.visitClass(classTree, trees);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean checkSuperTypes (ClassType type) {
|
||||||
|
if (type.supertype_field != null && type.supertype_field.tsym != null) {
|
||||||
|
if (checkScope(type.supertype_field.tsym.members()))
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return checkSuperTypes((ClassType) type.supertype_field);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean checkScope (Scope members) {
|
||||||
|
for (Symbol s : members.getElements()) {
|
||||||
|
if (s instanceof MethodSymbol) {
|
||||||
|
MethodSymbol ms = (MethodSymbol) s;
|
||||||
|
|
||||||
|
if (ms.getSimpleName().toString().equals(methodName)) {
|
||||||
|
Annotation annotation = ms.getAnnotation(CallSuper.class);
|
||||||
|
if (annotation != null) {
|
||||||
|
callSuperUsed = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object visitMethod (MethodTree methodTree, Trees trees) {
|
||||||
|
if (methodTree.getName().toString().equals(methodName))
|
||||||
|
method = methodTree;
|
||||||
|
|
||||||
|
return super.visitMethod(methodTree, trees);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMethodName (String methodName) {
|
||||||
|
this.methodName = methodName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMethodName () {
|
||||||
|
return methodName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MethodTree getMethod () {
|
||||||
|
return method;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isCallSuperUsed () {
|
||||||
|
return callSuperUsed;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,8 +1,6 @@
|
|||||||
package io.anuke.annotations;
|
package io.anuke.annotations;
|
||||||
|
|
||||||
import io.anuke.annotations.Annotations.Loc;
|
import io.anuke.annotations.Annotations.*;
|
||||||
import io.anuke.annotations.Annotations.PacketPriority;
|
|
||||||
import io.anuke.annotations.Annotations.Variant;
|
|
||||||
|
|
||||||
import javax.lang.model.element.ExecutableElement;
|
import javax.lang.model.element.ExecutableElement;
|
||||||
|
|
||||||
@@ -1,18 +1,13 @@
|
|||||||
package io.anuke.annotations;
|
package io.anuke.annotations;
|
||||||
|
|
||||||
import com.squareup.javapoet.FieldSpec;
|
import com.squareup.javapoet.*;
|
||||||
import com.squareup.javapoet.JavaFile;
|
|
||||||
import com.squareup.javapoet.TypeSpec;
|
|
||||||
import io.anuke.annotations.Annotations.Loc;
|
import io.anuke.annotations.Annotations.Loc;
|
||||||
import io.anuke.annotations.Annotations.Remote;
|
import io.anuke.annotations.Annotations.Remote;
|
||||||
import io.anuke.annotations.IOFinder.ClassSerializer;
|
import io.anuke.annotations.IOFinder.ClassSerializer;
|
||||||
|
|
||||||
import javax.annotation.processing.*;
|
import javax.annotation.processing.*;
|
||||||
import javax.lang.model.SourceVersion;
|
import javax.lang.model.SourceVersion;
|
||||||
import javax.lang.model.element.Element;
|
import javax.lang.model.element.*;
|
||||||
import javax.lang.model.element.ExecutableElement;
|
|
||||||
import javax.lang.model.element.Modifier;
|
|
||||||
import javax.lang.model.element.TypeElement;
|
|
||||||
import javax.tools.Diagnostic.Kind;
|
import javax.tools.Diagnostic.Kind;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@@ -21,13 +16,15 @@ import java.util.stream.Collectors;
|
|||||||
/** The annotation processor for generating remote method call code. */
|
/** The annotation processor for generating remote method call code. */
|
||||||
@SupportedSourceVersion(SourceVersion.RELEASE_8)
|
@SupportedSourceVersion(SourceVersion.RELEASE_8)
|
||||||
@SupportedAnnotationTypes({
|
@SupportedAnnotationTypes({
|
||||||
"io.anuke.annotations.Annotations.Remote",
|
"io.anuke.annotations.Annotations.Remote",
|
||||||
"io.anuke.annotations.Annotations.WriteClass",
|
"io.anuke.annotations.Annotations.WriteClass",
|
||||||
"io.anuke.annotations.Annotations.ReadClass",
|
"io.anuke.annotations.Annotations.ReadClass",
|
||||||
})
|
})
|
||||||
public class RemoteMethodAnnotationProcessor extends AbstractProcessor{
|
public class RemoteMethodAnnotationProcessor extends AbstractProcessor{
|
||||||
/** Maximum size of each event packet. */
|
/** Maximum size of each event packet. */
|
||||||
public static final int maxPacketSize = 4096;
|
public static final int maxPacketSize = 4096;
|
||||||
|
/** Warning on top of each autogenerated file. */
|
||||||
|
public static final String autogenWarning = "Autogenerated file. Do not modify!\n";
|
||||||
/** Name of the base package to put all the generated classes. */
|
/** Name of the base package to put all the generated classes. */
|
||||||
private static final String packageName = "io.anuke.mindustry.gen";
|
private static final String packageName = "io.anuke.mindustry.gen";
|
||||||
|
|
||||||
@@ -35,7 +32,7 @@ public class RemoteMethodAnnotationProcessor extends AbstractProcessor{
|
|||||||
private static final String readServerName = "RemoteReadServer";
|
private static final String readServerName = "RemoteReadServer";
|
||||||
/** Name of class that handles reading and invoking packets on the client. */
|
/** Name of class that handles reading and invoking packets on the client. */
|
||||||
private static final String readClientName = "RemoteReadClient";
|
private static final String readClientName = "RemoteReadClient";
|
||||||
/**Simple class name of generated class name.*/
|
/** Simple class name of generated class name. */
|
||||||
private static final String callLocation = "Call";
|
private static final String callLocation = "Call";
|
||||||
|
|
||||||
/** Processing round number. */
|
/** Processing round number. */
|
||||||
@@ -74,7 +71,6 @@ public class RemoteMethodAnnotationProcessor extends AbstractProcessor{
|
|||||||
if(round == 1){
|
if(round == 1){
|
||||||
//get serializers
|
//get serializers
|
||||||
serializers = new IOFinder().findSerializers(roundEnv);
|
serializers = new IOFinder().findSerializers(roundEnv);
|
||||||
|
|
||||||
//last method ID used
|
//last method ID used
|
||||||
int lastMethodID = 0;
|
int lastMethodID = 0;
|
||||||
//find all elements with the Remote annotation
|
//find all elements with the Remote annotation
|
||||||
@@ -108,15 +104,13 @@ public class RemoteMethodAnnotationProcessor extends AbstractProcessor{
|
|||||||
ClassEntry clas = new ClassEntry(callLocation);
|
ClassEntry clas = new ClassEntry(callLocation);
|
||||||
classMap.put(callLocation, clas);
|
classMap.put(callLocation, clas);
|
||||||
classes.add(clas);
|
classes.add(clas);
|
||||||
|
|
||||||
Utils.messager.printMessage(Kind.NOTE, "Generating class '" + clas.name + "'.");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ClassEntry entry = classMap.get(callLocation);
|
ClassEntry entry = classMap.get(callLocation);
|
||||||
|
|
||||||
//create and add entry
|
//create and add entry
|
||||||
MethodEntry method = new MethodEntry(entry.name, Utils.getMethodName(element), annotation.targets(), annotation.variants(),
|
MethodEntry method = new MethodEntry(entry.name, Utils.getMethodName(element), annotation.targets(), annotation.variants(),
|
||||||
annotation.called(), annotation.unreliable(), annotation.forward(), lastMethodID++, (ExecutableElement) element, annotation.priority());
|
annotation.called(), annotation.unreliable(), annotation.forward(), lastMethodID++, (ExecutableElement)element, annotation.priority());
|
||||||
|
|
||||||
entry.methods.add(method);
|
entry.methods.add(method);
|
||||||
methods.add(method);
|
methods.add(method);
|
||||||
@@ -139,6 +133,7 @@ public class RemoteMethodAnnotationProcessor extends AbstractProcessor{
|
|||||||
|
|
||||||
//create class for storing unique method hash
|
//create class for storing unique method hash
|
||||||
TypeSpec.Builder hashBuilder = TypeSpec.classBuilder("MethodHash").addModifiers(Modifier.PUBLIC);
|
TypeSpec.Builder hashBuilder = TypeSpec.classBuilder("MethodHash").addModifiers(Modifier.PUBLIC);
|
||||||
|
hashBuilder.addJavadoc(autogenWarning);
|
||||||
hashBuilder.addField(FieldSpec.builder(int.class, "HASH", Modifier.STATIC, Modifier.PUBLIC, Modifier.FINAL)
|
hashBuilder.addField(FieldSpec.builder(int.class, "HASH", Modifier.STATIC, Modifier.PUBLIC, Modifier.FINAL)
|
||||||
.initializer("$1L", Objects.hash(methods)).build());
|
.initializer("$1L", Objects.hash(methods)).build());
|
||||||
|
|
||||||
@@ -3,9 +3,7 @@ package io.anuke.annotations;
|
|||||||
import com.squareup.javapoet.*;
|
import com.squareup.javapoet.*;
|
||||||
import io.anuke.annotations.IOFinder.ClassSerializer;
|
import io.anuke.annotations.IOFinder.ClassSerializer;
|
||||||
|
|
||||||
import javax.lang.model.element.Modifier;
|
import javax.lang.model.element.*;
|
||||||
import javax.lang.model.element.TypeElement;
|
|
||||||
import javax.lang.model.element.VariableElement;
|
|
||||||
import javax.tools.Diagnostic.Kind;
|
import javax.tools.Diagnostic.Kind;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.lang.reflect.Constructor;
|
import java.lang.reflect.Constructor;
|
||||||
@@ -25,8 +23,7 @@ public class RemoteReadGenerator{
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates a class for reading remote invoke packets.
|
* Generates a class for reading remote invoke packets.
|
||||||
*
|
* @param entries List of methods to use.
|
||||||
* @param entries List of methods to use/
|
|
||||||
* @param className Simple target class name.
|
* @param className Simple target class name.
|
||||||
* @param packageName Full target package name.
|
* @param packageName Full target package name.
|
||||||
* @param needsPlayer Whether this read method requires a reference to the player sender.
|
* @param needsPlayer Whether this read method requires a reference to the player sender.
|
||||||
@@ -35,6 +32,7 @@ public class RemoteReadGenerator{
|
|||||||
throws IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException, IOException{
|
throws IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException, IOException{
|
||||||
|
|
||||||
TypeSpec.Builder classBuilder = TypeSpec.classBuilder(className).addModifiers(Modifier.PUBLIC);
|
TypeSpec.Builder classBuilder = TypeSpec.classBuilder(className).addModifiers(Modifier.PUBLIC);
|
||||||
|
classBuilder.addJavadoc(RemoteMethodAnnotationProcessor.autogenWarning);
|
||||||
|
|
||||||
//create main method builder
|
//create main method builder
|
||||||
MethodSpec.Builder readMethod = MethodSpec.methodBuilder("readPacket")
|
MethodSpec.Builder readMethod = MethodSpec.methodBuilder("readPacket")
|
||||||
@@ -49,7 +47,7 @@ public class RemoteReadGenerator{
|
|||||||
Constructor<TypeName> cons = TypeName.class.getDeclaredConstructor(String.class);
|
Constructor<TypeName> cons = TypeName.class.getDeclaredConstructor(String.class);
|
||||||
cons.setAccessible(true);
|
cons.setAccessible(true);
|
||||||
|
|
||||||
TypeName playerType = cons.newInstance("io.anuke.mindustry.entities.Player");
|
TypeName playerType = cons.newInstance("io.anuke.mindustry.entities.type.Player");
|
||||||
//add player parameter
|
//add player parameter
|
||||||
readMethod.addParameter(playerType, "player");
|
readMethod.addParameter(playerType, "player");
|
||||||
}
|
}
|
||||||
@@ -114,7 +112,7 @@ public class RemoteReadGenerator{
|
|||||||
|
|
||||||
//execute the relevant method before the forward
|
//execute the relevant method before the forward
|
||||||
//if it throws a ValidateException, the method won't be forwarded
|
//if it throws a ValidateException, the method won't be forwarded
|
||||||
readBlock.addStatement("$N." + entry.element.getSimpleName() + "(" + varResult.toString() + ")", ((TypeElement) entry.element.getEnclosingElement()).getQualifiedName().toString());
|
readBlock.addStatement("$N." + entry.element.getSimpleName() + "(" + varResult.toString() + ")", ((TypeElement)entry.element.getEnclosingElement()).getQualifiedName().toString());
|
||||||
|
|
||||||
//call forwarded method, don't forward on the client reader
|
//call forwarded method, don't forward on the client reader
|
||||||
if(entry.forward && entry.where.isServer && needsPlayer){
|
if(entry.forward && entry.where.isServer && needsPlayer){
|
||||||
@@ -4,10 +4,7 @@ import com.squareup.javapoet.*;
|
|||||||
import io.anuke.annotations.Annotations.Loc;
|
import io.anuke.annotations.Annotations.Loc;
|
||||||
import io.anuke.annotations.IOFinder.ClassSerializer;
|
import io.anuke.annotations.IOFinder.ClassSerializer;
|
||||||
|
|
||||||
import javax.lang.model.element.ExecutableElement;
|
import javax.lang.model.element.*;
|
||||||
import javax.lang.model.element.Modifier;
|
|
||||||
import javax.lang.model.element.TypeElement;
|
|
||||||
import javax.lang.model.element.VariableElement;
|
|
||||||
import javax.tools.Diagnostic.Kind;
|
import javax.tools.Diagnostic.Kind;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
@@ -29,6 +26,7 @@ public class RemoteWriteGenerator{
|
|||||||
for(ClassEntry entry : entries){
|
for(ClassEntry entry : entries){
|
||||||
//create builder
|
//create builder
|
||||||
TypeSpec.Builder classBuilder = TypeSpec.classBuilder(entry.name).addModifiers(Modifier.PUBLIC);
|
TypeSpec.Builder classBuilder = TypeSpec.classBuilder(entry.name).addModifiers(Modifier.PUBLIC);
|
||||||
|
classBuilder.addJavadoc(RemoteMethodAnnotationProcessor.autogenWarning);
|
||||||
|
|
||||||
//add temporary write buffer
|
//add temporary write buffer
|
||||||
classBuilder.addField(FieldSpec.builder(ByteBuffer.class, "TEMP_BUFFER", Modifier.STATIC, Modifier.PRIVATE, Modifier.FINAL)
|
classBuilder.addField(FieldSpec.builder(ByteBuffer.class, "TEMP_BUFFER", Modifier.STATIC, Modifier.PRIVATE, Modifier.FINAL)
|
||||||
@@ -79,7 +77,7 @@ public class RemoteWriteGenerator{
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!elem.getParameters().get(0).asType().toString().equals("io.anuke.mindustry.entities.Player")){
|
if(!elem.getParameters().get(0).asType().toString().equals("io.anuke.mindustry.entities.type.Player")){
|
||||||
Utils.messager.printMessage(Kind.ERROR, "Client invoke methods should have a first parameter of type Player.", elem);
|
Utils.messager.printMessage(Kind.ERROR, "Client invoke methods should have a first parameter of type Player.", elem);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -108,7 +106,7 @@ public class RemoteWriteGenerator{
|
|||||||
for(VariableElement var : elem.getParameters()){
|
for(VariableElement var : elem.getParameters()){
|
||||||
//special case: calling local-only methods uses the local player
|
//special case: calling local-only methods uses the local player
|
||||||
if(index == 0 && methodEntry.where == Loc.client){
|
if(index == 0 && methodEntry.where == Loc.client){
|
||||||
results.append("io.anuke.mindustry.Vars.players[0]");
|
results.append("io.anuke.mindustry.Vars.player");
|
||||||
}else{
|
}else{
|
||||||
results.append(var.getSimpleName());
|
results.append(var.getSimpleName());
|
||||||
}
|
}
|
||||||
@@ -118,7 +116,7 @@ public class RemoteWriteGenerator{
|
|||||||
|
|
||||||
//add the statement to call it
|
//add the statement to call it
|
||||||
method.addStatement("$N." + elem.getSimpleName() + "(" + results.toString() + ")",
|
method.addStatement("$N." + elem.getSimpleName() + "(" + results.toString() + ")",
|
||||||
((TypeElement) elem.getEnclosingElement()).getQualifiedName().toString());
|
((TypeElement)elem.getEnclosingElement()).getQualifiedName().toString());
|
||||||
|
|
||||||
if(methodEntry.local != Loc.both){
|
if(methodEntry.local != Loc.both){
|
||||||
method.endControlFlow();
|
method.endControlFlow();
|
||||||
@@ -129,7 +127,7 @@ public class RemoteWriteGenerator{
|
|||||||
method.beginControlFlow("if(" + getCheckString(methodEntry.where) + ")");
|
method.beginControlFlow("if(" + getCheckString(methodEntry.where) + ")");
|
||||||
|
|
||||||
//add statement to create packet from pool
|
//add statement to create packet from pool
|
||||||
method.addStatement("$1N packet = $2N.obtain($1N.class)", "io.anuke.mindustry.net.Packets.InvokePacket", "io.anuke.ucore.util.Pooling");
|
method.addStatement("$1N packet = $2N.obtain($1N.class, $1N::new)", "io.anuke.mindustry.net.Packets.InvokePacket", "io.anuke.arc.util.pooling.Pools");
|
||||||
//assign buffer
|
//assign buffer
|
||||||
method.addStatement("packet.writeBuffer = TEMP_BUFFER");
|
method.addStatement("packet.writeBuffer = TEMP_BUFFER");
|
||||||
//assign priority
|
//assign priority
|
||||||
@@ -0,0 +1,128 @@
|
|||||||
|
package io.anuke.annotations;
|
||||||
|
|
||||||
|
import com.squareup.javapoet.*;
|
||||||
|
import io.anuke.annotations.Annotations.Serialize;
|
||||||
|
|
||||||
|
import javax.annotation.processing.*;
|
||||||
|
import javax.lang.model.SourceVersion;
|
||||||
|
import javax.lang.model.element.*;
|
||||||
|
import javax.lang.model.util.ElementFilter;
|
||||||
|
import java.io.*;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
@SupportedSourceVersion(SourceVersion.RELEASE_8)
|
||||||
|
@SupportedAnnotationTypes("io.anuke.annotations.Annotations.Serialize")
|
||||||
|
public class SerializeAnnotationProcessor extends AbstractProcessor{
|
||||||
|
/** Target class name. */
|
||||||
|
private static final String className = "Serialization";
|
||||||
|
/** Name of the base package to put all the generated classes. */
|
||||||
|
private static final String packageName = "io.anuke.mindustry.gen";
|
||||||
|
|
||||||
|
private int round;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized void init(ProcessingEnvironment processingEnv){
|
||||||
|
super.init(processingEnv);
|
||||||
|
//put all relevant utils into utils class
|
||||||
|
Utils.typeUtils = processingEnv.getTypeUtils();
|
||||||
|
Utils.elementUtils = processingEnv.getElementUtils();
|
||||||
|
Utils.filer = processingEnv.getFiler();
|
||||||
|
Utils.messager = processingEnv.getMessager();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv){
|
||||||
|
if(round++ != 0) return false; //only process 1 round
|
||||||
|
|
||||||
|
try{
|
||||||
|
Set<TypeElement> elements = ElementFilter.typesIn(roundEnv.getElementsAnnotatedWith(Serialize.class));
|
||||||
|
|
||||||
|
TypeSpec.Builder classBuilder = TypeSpec.classBuilder(className).addModifiers(Modifier.PUBLIC);
|
||||||
|
classBuilder.addAnnotation(AnnotationSpec.builder(SuppressWarnings.class).addMember("value", "\"unchecked\"").build());
|
||||||
|
classBuilder.addJavadoc(RemoteMethodAnnotationProcessor.autogenWarning);
|
||||||
|
|
||||||
|
|
||||||
|
MethodSpec.Builder method = MethodSpec.methodBuilder("init").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
||||||
|
|
||||||
|
for(TypeElement elem : elements){
|
||||||
|
TypeName type = TypeName.get(elem.asType());
|
||||||
|
String simpleTypeName = type.toString().substring(type.toString().lastIndexOf('.') + 1);
|
||||||
|
|
||||||
|
TypeSpec.Builder serializer = TypeSpec.anonymousClassBuilder("")
|
||||||
|
.addSuperinterface(ParameterizedTypeName.get(
|
||||||
|
ClassName.bestGuess("io.anuke.arc.Settings.TypeSerializer"), type));
|
||||||
|
|
||||||
|
MethodSpec.Builder writeMethod = MethodSpec.methodBuilder("write")
|
||||||
|
.returns(void.class)
|
||||||
|
.addParameter(DataOutput.class, "stream")
|
||||||
|
.addParameter(type, "object")
|
||||||
|
.addException(IOException.class)
|
||||||
|
.addModifiers(Modifier.PUBLIC);
|
||||||
|
|
||||||
|
MethodSpec.Builder readMethod = MethodSpec.methodBuilder("read")
|
||||||
|
.returns(type)
|
||||||
|
.addParameter(DataInput.class, "stream")
|
||||||
|
.addException(IOException.class)
|
||||||
|
.addModifiers(Modifier.PUBLIC);
|
||||||
|
|
||||||
|
readMethod.addStatement("$L object = new $L()", type, type);
|
||||||
|
|
||||||
|
List<VariableElement> fields = ElementFilter.fieldsIn(Utils.elementUtils.getAllMembers(elem));
|
||||||
|
for(VariableElement field : fields){
|
||||||
|
if(field.getModifiers().contains(Modifier.STATIC) || field.getModifiers().contains(Modifier.TRANSIENT) || field.getModifiers().contains(Modifier.PRIVATE))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
String name = field.getSimpleName().toString();
|
||||||
|
String typeName = Utils.typeUtils.erasure(field.asType()).toString().replace('$', '.');
|
||||||
|
String capName = Character.toUpperCase(typeName.charAt(0)) + typeName.substring(1);
|
||||||
|
|
||||||
|
if(field.asType().getKind().isPrimitive()){
|
||||||
|
writeMethod.addStatement("stream.write" + capName + "(object." + name + ")");
|
||||||
|
readMethod.addStatement("object." + name + "= stream.read" + capName + "()");
|
||||||
|
}else{
|
||||||
|
writeMethod.addStatement("io.anuke.arc.Core.settings.getSerializer(" + typeName + ".class).write(stream, object." + name + ")");
|
||||||
|
readMethod.addStatement("object." + name + " = (" + typeName + ")io.anuke.arc.Core.settings.getSerializer(" + typeName + ".class).read(stream)");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
readMethod.addStatement("return object");
|
||||||
|
|
||||||
|
serializer.addMethod(writeMethod.build());
|
||||||
|
serializer.addMethod(readMethod.build());
|
||||||
|
|
||||||
|
method.addStatement("io.anuke.arc.Core.settings.setSerializer($N, $L)", Utils.elementUtils.getBinaryName(elem).toString().replace('$', '.') + ".class", serializer.build());
|
||||||
|
|
||||||
|
name(writeMethod, "write" + simpleTypeName);
|
||||||
|
name(readMethod, "read" + simpleTypeName);
|
||||||
|
|
||||||
|
writeMethod.addModifiers(Modifier.STATIC);
|
||||||
|
readMethod.addModifiers(Modifier.STATIC);
|
||||||
|
|
||||||
|
classBuilder.addMethod(writeMethod.build());
|
||||||
|
classBuilder.addMethod(readMethod.build());
|
||||||
|
}
|
||||||
|
|
||||||
|
classBuilder.addMethod(method.build());
|
||||||
|
|
||||||
|
//write result
|
||||||
|
JavaFile.builder(packageName, classBuilder.build()).build().writeTo(Utils.filer);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}catch(Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void name(MethodSpec.Builder builder, String name){
|
||||||
|
try{
|
||||||
|
Field field = builder.getClass().getDeclaredField("name");
|
||||||
|
field.setAccessible(true);
|
||||||
|
field.set(builder, name);
|
||||||
|
}catch(Exception e){
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,226 @@
|
|||||||
|
package io.anuke.annotations;
|
||||||
|
|
||||||
|
import com.squareup.javapoet.*;
|
||||||
|
import io.anuke.annotations.Annotations.Struct;
|
||||||
|
import io.anuke.annotations.Annotations.StructField;
|
||||||
|
|
||||||
|
import javax.annotation.processing.*;
|
||||||
|
import javax.lang.model.SourceVersion;
|
||||||
|
import javax.lang.model.element.*;
|
||||||
|
import javax.lang.model.type.TypeKind;
|
||||||
|
import javax.lang.model.util.ElementFilter;
|
||||||
|
import javax.tools.Diagnostic.Kind;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates ""value types"" classes that are packed into integer primitives of the most aproppriate size.
|
||||||
|
* It would be nice if Java didn't make crazy hacks like this necessary.
|
||||||
|
*/
|
||||||
|
@SupportedSourceVersion(SourceVersion.RELEASE_8)
|
||||||
|
@SupportedAnnotationTypes({
|
||||||
|
"io.anuke.annotations.Annotations.Struct"
|
||||||
|
})
|
||||||
|
public class StructAnnotationProcessor extends AbstractProcessor{
|
||||||
|
/** Name of the base package to put all the generated classes. */
|
||||||
|
private static final String packageName = "io.anuke.mindustry.gen";
|
||||||
|
private int round;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized void init(ProcessingEnvironment processingEnv){
|
||||||
|
super.init(processingEnv);
|
||||||
|
//put all relevant utils into utils class
|
||||||
|
Utils.typeUtils = processingEnv.getTypeUtils();
|
||||||
|
Utils.elementUtils = processingEnv.getElementUtils();
|
||||||
|
Utils.filer = processingEnv.getFiler();
|
||||||
|
Utils.messager = processingEnv.getMessager();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv){
|
||||||
|
if(round++ != 0) return false; //only process 1 round
|
||||||
|
|
||||||
|
try{
|
||||||
|
Set<TypeElement> elements = ElementFilter.typesIn(roundEnv.getElementsAnnotatedWith(Struct.class));
|
||||||
|
|
||||||
|
for(TypeElement elem : elements){
|
||||||
|
|
||||||
|
if(!elem.getSimpleName().toString().endsWith("Struct")){
|
||||||
|
Utils.messager.printMessage(Kind.ERROR, "All classes annotated with @Struct must have their class names end in 'Struct'.", elem);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
String structName = elem.getSimpleName().toString().substring(0, elem.getSimpleName().toString().length() - "Struct".length());
|
||||||
|
String structParam = structName.toLowerCase();
|
||||||
|
|
||||||
|
TypeSpec.Builder classBuilder = TypeSpec.classBuilder(structName)
|
||||||
|
.addModifiers(Modifier.FINAL, Modifier.PUBLIC);
|
||||||
|
|
||||||
|
try{
|
||||||
|
List<VariableElement> variables = ElementFilter.fieldsIn(elem.getEnclosedElements());
|
||||||
|
int structSize = variables.stream().mapToInt(StructAnnotationProcessor::varSize).sum();
|
||||||
|
int structTotalSize = (structSize <= 8 ? 8 : structSize <= 16 ? 16 : structSize <= 32 ? 32 : 64);
|
||||||
|
|
||||||
|
if(variables.size() == 0){
|
||||||
|
Utils.messager.printMessage(Kind.ERROR, "making a struct with no fields is utterly pointles.", elem);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//obtain type which will be stored
|
||||||
|
Class<?> structType = typeForSize(structSize);
|
||||||
|
|
||||||
|
//[constructor] get(fields...) : structType
|
||||||
|
MethodSpec.Builder constructor = MethodSpec.methodBuilder("get")
|
||||||
|
.addModifiers(Modifier.STATIC, Modifier.PUBLIC)
|
||||||
|
.returns(structType);
|
||||||
|
|
||||||
|
StringBuilder cons = new StringBuilder();
|
||||||
|
StringBuilder doc = new StringBuilder();
|
||||||
|
doc.append("Bits used: ").append(structSize).append(" / ").append(structTotalSize).append("\n");
|
||||||
|
|
||||||
|
int offset = 0;
|
||||||
|
for(VariableElement var : variables){
|
||||||
|
int size = varSize(var);
|
||||||
|
TypeName varType = TypeName.get(var.asType());
|
||||||
|
String varName = var.getSimpleName().toString();
|
||||||
|
|
||||||
|
//add val param to constructor
|
||||||
|
constructor.addParameter(varType, varName);
|
||||||
|
|
||||||
|
//[get] field(structType) : fieldType
|
||||||
|
MethodSpec.Builder getter = MethodSpec.methodBuilder(var.getSimpleName().toString())
|
||||||
|
.addModifiers(Modifier.STATIC, Modifier.PUBLIC)
|
||||||
|
.returns(varType)
|
||||||
|
.addParameter(structType, structParam);
|
||||||
|
//[set] field(structType, fieldType) : structType
|
||||||
|
MethodSpec.Builder setter = MethodSpec.methodBuilder(var.getSimpleName().toString())
|
||||||
|
.addModifiers(Modifier.STATIC, Modifier.PUBLIC)
|
||||||
|
.returns(structType)
|
||||||
|
.addParameter(structType, structParam).addParameter(varType, "value");
|
||||||
|
|
||||||
|
//[getter]
|
||||||
|
if(varType == TypeName.BOOLEAN){
|
||||||
|
//bools: single bit, is simplified
|
||||||
|
getter.addStatement("return ($L & (1L << $L)) != 0", structParam, offset);
|
||||||
|
}else if(varType == TypeName.FLOAT){
|
||||||
|
//floats: need conversion
|
||||||
|
getter.addStatement("return Float.intBitsToFloat((int)(($L >>> $L) & $L))", structParam, offset, bitString(size, structTotalSize));
|
||||||
|
}else{
|
||||||
|
//bytes, shorts, chars, ints
|
||||||
|
getter.addStatement("return ($T)(($L >>> $L) & $L)", varType, structParam, offset, bitString(size, structTotalSize));
|
||||||
|
}
|
||||||
|
|
||||||
|
//[setter] + [constructor building]
|
||||||
|
if(varType == TypeName.BOOLEAN){
|
||||||
|
cons.append(" | (").append(varName).append(" ? ").append("1L << ").append(offset).append("L : 0)");
|
||||||
|
|
||||||
|
//bools: single bit, needs special case to clear things
|
||||||
|
setter.beginControlFlow("if(value)");
|
||||||
|
setter.addStatement("return ($T)(($L & ~(1L << $LL)))", structType, structParam, offset);
|
||||||
|
setter.nextControlFlow("else");
|
||||||
|
setter.addStatement("return ($T)(($L & ~(1L << $LL)) | (1L << $LL))", structType, structParam, offset, offset);
|
||||||
|
setter.endControlFlow();
|
||||||
|
}else if(varType == TypeName.FLOAT){
|
||||||
|
cons.append(" | (").append("(").append(structType).append(")").append("Float.floatToIntBits(").append(varName).append(") << ").append(offset).append("L)");
|
||||||
|
|
||||||
|
//floats: need conversion
|
||||||
|
setter.addStatement("return ($T)(($L & $L) | (($T)Float.floatToIntBits(value) << $LL))", structType, structParam, bitString(offset, size, structTotalSize), structType, offset);
|
||||||
|
}else{
|
||||||
|
cons.append(" | (((").append(structType).append(")").append(varName).append(" << ").append(offset).append("L)").append(" & ").append(bitString(offset, size, structTotalSize)).append(")");
|
||||||
|
|
||||||
|
//bytes, shorts, chars, ints
|
||||||
|
setter.addStatement("return ($T)(($L & $L) | (($T)value << $LL))", structType, structParam, bitString(offset, size, structTotalSize), structType, offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
doc.append("<br> ").append(varName).append(" [").append(offset).append("..").append(size + offset).append("]\n");
|
||||||
|
|
||||||
|
//add finished methods
|
||||||
|
classBuilder.addMethod(getter.build());
|
||||||
|
classBuilder.addMethod(setter.build());
|
||||||
|
|
||||||
|
offset += size;
|
||||||
|
}
|
||||||
|
|
||||||
|
classBuilder.addJavadoc(doc.toString());
|
||||||
|
|
||||||
|
//add constructor final statement + add to class and build
|
||||||
|
constructor.addStatement("return ($T)($L)", structType, cons.toString().substring(3));
|
||||||
|
classBuilder.addMethod(constructor.build());
|
||||||
|
|
||||||
|
JavaFile.builder(packageName, classBuilder.build()).build().writeTo(Utils.filer);
|
||||||
|
}catch(IllegalArgumentException e){
|
||||||
|
e.printStackTrace();
|
||||||
|
Utils.messager.printMessage(Kind.ERROR, e.getMessage(), elem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}catch(Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static String bitString(int offset, int size, int totalSize){
|
||||||
|
StringBuilder builder = new StringBuilder();
|
||||||
|
for(int i = 0; i < offset; i++) builder.append('0');
|
||||||
|
for(int i = 0; i < size; i++) builder.append('1');
|
||||||
|
for(int i = 0; i < totalSize - size - offset; i++) builder.append('0');
|
||||||
|
return "0b" + builder.reverse().toString() + "L";
|
||||||
|
}
|
||||||
|
|
||||||
|
static String bitString(int size, int totalSize){
|
||||||
|
StringBuilder builder = new StringBuilder();
|
||||||
|
for(int i = 0; i < size; i++) builder.append('1');
|
||||||
|
for(int i = 0; i < totalSize - size; i++) builder.append('0');
|
||||||
|
return "0b" + builder.reverse().toString() + "L";
|
||||||
|
}
|
||||||
|
|
||||||
|
static int varSize(VariableElement var) throws IllegalArgumentException{
|
||||||
|
if(!var.asType().getKind().isPrimitive()){
|
||||||
|
throw new IllegalArgumentException("All struct fields must be primitives: " + var);
|
||||||
|
}
|
||||||
|
|
||||||
|
StructField an = var.getAnnotation(StructField.class);
|
||||||
|
if(var.asType().getKind() == TypeKind.BOOLEAN && an != null && an.value() != 1){
|
||||||
|
throw new IllegalArgumentException("Booleans can only be one bit long... why would you do this?");
|
||||||
|
}
|
||||||
|
|
||||||
|
if(var.asType().getKind() == TypeKind.FLOAT && an != null && an.value() != 32){
|
||||||
|
throw new IllegalArgumentException("Float size can't be changed. Very sad.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return an == null ? typeSize(var.asType().getKind()) : an.value();
|
||||||
|
}
|
||||||
|
|
||||||
|
static Class<?> typeForSize(int size) throws IllegalArgumentException{
|
||||||
|
if(size <= 8){
|
||||||
|
return byte.class;
|
||||||
|
}else if(size <= 16){
|
||||||
|
return short.class;
|
||||||
|
}else if(size <= 32){
|
||||||
|
return int.class;
|
||||||
|
}else if(size <= 64){
|
||||||
|
return long.class;
|
||||||
|
}
|
||||||
|
throw new IllegalArgumentException("Too many fields, must fit in 64 bits. Curent size: " + size);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** returns a type's element size in bits. */
|
||||||
|
static int typeSize(TypeKind kind) throws IllegalArgumentException{
|
||||||
|
switch(kind){
|
||||||
|
case BOOLEAN:
|
||||||
|
return 1;
|
||||||
|
case BYTE:
|
||||||
|
return 8;
|
||||||
|
case SHORT:
|
||||||
|
return 16;
|
||||||
|
case FLOAT:
|
||||||
|
case CHAR:
|
||||||
|
case INT:
|
||||||
|
return 32;
|
||||||
|
default:
|
||||||
|
throw new IllegalArgumentException("Invalid type kind: " + kind + ". Note that doubles and longs are not supported.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -14,7 +14,7 @@ public class Utils{
|
|||||||
public static Messager messager;
|
public static Messager messager;
|
||||||
|
|
||||||
public static String getMethodName(Element element){
|
public static String getMethodName(Element element){
|
||||||
return ((TypeElement) element.getEnclosingElement()).getQualifiedName().toString() + "." + element.getSimpleName();
|
return ((TypeElement)element.getEnclosingElement()).getQualifiedName().toString() + "." + element.getSimpleName();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isPrimitive(String type){
|
public static boolean isPrimitive(String type){
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
io.anuke.annotations.RemoteMethodAnnotationProcessor
|
||||||
|
io.anuke.annotations.SerializeAnnotationProcessor
|
||||||
|
io.anuke.annotations.StructAnnotationProcessor
|
||||||
|
io.anuke.annotations.CallSuperAnnotationProcessor
|
||||||
295
build.gradle
@@ -1,36 +1,65 @@
|
|||||||
buildscript {
|
buildscript{
|
||||||
repositories {
|
repositories{
|
||||||
mavenLocal()
|
mavenLocal()
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
google()
|
google()
|
||||||
maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
|
maven{ url "https://oss.sonatype.org/content/repositories/snapshots/" }
|
||||||
jcenter()
|
jcenter()
|
||||||
}
|
}
|
||||||
dependencies {
|
|
||||||
classpath 'com.mobidevelop.robovm:robovm-gradle-plugin:2.3.0'
|
dependencies{
|
||||||
classpath 'de.richsource.gradle.plugins:gwt-gradle-plugin:0.6'
|
classpath 'com.mobidevelop.robovm:robovm-gradle-plugin:2.3.6'
|
||||||
classpath 'com.android.tools.build:gradle:3.1.3'
|
classpath "com.badlogicgames.gdx:gdx-tools:1.9.9"
|
||||||
classpath "com.badlogicgames.gdx:gdx-tools:1.9.8"
|
classpath "com.badlogicgames.packr:packr:2.1-SNAPSHOT"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
allprojects {
|
allprojects{
|
||||||
apply plugin: "eclipse"
|
|
||||||
apply plugin: "idea"
|
|
||||||
|
|
||||||
version = 'release'
|
version = 'release'
|
||||||
|
|
||||||
ext {
|
ext{
|
||||||
versionNumber = '4.0'
|
versionNumber = '4'
|
||||||
versionType = 'alpha'
|
versionModifier = 'beta'
|
||||||
|
if(!project.hasProperty("versionType")) versionType = 'official'
|
||||||
appName = 'Mindustry'
|
appName = 'Mindustry'
|
||||||
gdxVersion = '1.9.8'
|
gdxVersion = '1.9.9'
|
||||||
roboVMVersion = '2.3.0'
|
roboVMVersion = '2.3.6'
|
||||||
uCoreVersion = '06b465e3385ded22d84f42cb09554352a1d3ad6c'
|
arcHash = null
|
||||||
|
|
||||||
|
debugged = {
|
||||||
|
return new File(projectDir.parent, '../debug').exists() && !project.hasProperty("release") && project.hasProperty("args")
|
||||||
|
}
|
||||||
|
|
||||||
|
localArc = {
|
||||||
|
return (!project.hasProperty("release")) && new File(projectDir.parent, '../Arc').exists()
|
||||||
|
}
|
||||||
|
|
||||||
|
getArcHash = {
|
||||||
|
//get latest commit hash from gtihub since JITPack's '-snapshot' version doesn't work correctly
|
||||||
|
if(arcHash == null){
|
||||||
|
try{
|
||||||
|
arcHash = 'git ls-remote https://github.com/Anuken/Arc.git'.execute().text.split("\t")[0]
|
||||||
|
}catch(e){
|
||||||
|
e.printStackTrace()
|
||||||
|
arcHash = "-SNAPSHOT"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return arcHash
|
||||||
|
}
|
||||||
|
|
||||||
|
arcModule = { String name ->
|
||||||
|
if(localArc()){
|
||||||
|
return project(":Arc:$name")
|
||||||
|
}else{
|
||||||
|
//skip to last submodule
|
||||||
|
if(name.contains(':')) name = name.split(':').last()
|
||||||
|
return "com.github.Anuken.Arc:$name:${getArcHash()}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
getVersionString = {
|
getVersionString = {
|
||||||
String buildVersion = getBuildVersion()
|
String buildVersion = getBuildVersion()
|
||||||
return "$versionNumber-$versionType-$buildVersion"
|
return "$versionNumber-$versionModifier-$buildVersion"
|
||||||
}
|
}
|
||||||
|
|
||||||
getBuildVersion = {
|
getBuildVersion = {
|
||||||
@@ -43,14 +72,13 @@ allprojects {
|
|||||||
}
|
}
|
||||||
|
|
||||||
generateLocales = {
|
generateLocales = {
|
||||||
def output = '["en",'
|
def output = 'en\n'
|
||||||
def bundles = new File(project(':core').projectDir, 'assets/bundles/')
|
def bundles = new File(project(':core').projectDir, 'assets/bundles/')
|
||||||
bundles.listFiles().each { other ->
|
bundles.listFiles().each{ other ->
|
||||||
if(other.name == "bundle.properties") return;
|
if(other.name == "bundle.properties") return
|
||||||
output += '"' + other.name.substring("bundle".length() + 1, other.name.lastIndexOf('.')) + '",'
|
output += other.name.substring("bundle".length() + 1, other.name.lastIndexOf('.')) + "\n"
|
||||||
}
|
}
|
||||||
output = (output.substring(0, output.size() - 1) + "]")
|
new File(project(':core').projectDir, 'assets/locales').text = output
|
||||||
new File(project(':core').projectDir, 'assets/locales.json').text = output;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
writeVersion = {
|
writeVersion = {
|
||||||
@@ -59,184 +87,179 @@ allprojects {
|
|||||||
|
|
||||||
try{
|
try{
|
||||||
pfile.createNewFile()
|
pfile.createNewFile()
|
||||||
}catch (Exception e){}
|
}catch(Exception ignored){
|
||||||
|
}
|
||||||
if(pfile.exists()) {
|
|
||||||
|
|
||||||
|
if(pfile.exists()){
|
||||||
props.load(new FileInputStream(pfile))
|
props.load(new FileInputStream(pfile))
|
||||||
|
|
||||||
String code = getBuildVersion()
|
String buildid = getBuildVersion()
|
||||||
|
|
||||||
props["name"] = appName
|
props["type"] = versionType
|
||||||
props["version"] = versionType
|
props["number"] = versionNumber
|
||||||
props["code"] = versionNumber
|
props["modifier"] = versionModifier
|
||||||
props["build"] = code
|
props["build"] = buildid
|
||||||
|
|
||||||
props.store(pfile.newWriter(), "Autogenerated file. Do not modify.")
|
props.store(pfile.newWriter(), "Autogenerated file. Do not modify.")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
repositories {
|
repositories{
|
||||||
mavenLocal()
|
mavenLocal()
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
|
maven{ url "https://oss.sonatype.org/content/repositories/snapshots/" }
|
||||||
maven { url "https://oss.sonatype.org/content/repositories/releases/" }
|
maven{ url "https://oss.sonatype.org/content/repositories/releases/" }
|
||||||
maven { url 'https://jitpack.io' }
|
maven{ url 'https://jitpack.io' }
|
||||||
|
jcenter()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
project(":desktop") {
|
project(":desktop"){
|
||||||
apply plugin: "java"
|
apply plugin: "java"
|
||||||
|
|
||||||
dependencies {
|
dependencies{
|
||||||
compile project(":core")
|
compile project(":core")
|
||||||
compile project(":kryonet")
|
compile project(":net")
|
||||||
compile "com.badlogicgames.gdx:gdx-backend-lwjgl3:$gdxVersion"
|
|
||||||
|
if(debugged()) compile project(":debug")
|
||||||
|
|
||||||
compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop"
|
compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop"
|
||||||
compile "com.badlogicgames.gdx:gdx-controllers-lwjgl3:$gdxVersion"
|
compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-desktop"
|
||||||
compile 'com.github.MinnDevelopment:java-discord-rpc:v2.0.0'
|
|
||||||
|
compile arcModule("backends:backend-lwjgl3")
|
||||||
|
compile 'com.github.MinnDevelopment:java-discord-rpc:v2.0.2'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
project(":html") {
|
project(":ios"){
|
||||||
apply plugin: "gwt"
|
|
||||||
apply plugin: "war"
|
|
||||||
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
compile project(":core")
|
|
||||||
compileOnly project(":annotations")
|
|
||||||
|
|
||||||
compile "com.badlogicgames.gdx:gdx-backend-gwt:$gdxVersion"
|
|
||||||
compile "com.badlogicgames.gdx:gdx:$gdxVersion:sources"
|
|
||||||
compile "com.badlogicgames.gdx:gdx-backend-gwt:$gdxVersion:sources"
|
|
||||||
|
|
||||||
compile "com.badlogicgames.gdx:gdx-controllers:$gdxVersion:sources"
|
|
||||||
compile "com.badlogicgames.gdx:gdx-controllers-gwt:$gdxVersion"
|
|
||||||
compile "com.badlogicgames.gdx:gdx-controllers-gwt:$gdxVersion:sources"
|
|
||||||
}
|
|
||||||
|
|
||||||
compileJava.options.compilerArgs = [
|
|
||||||
"-processor", "io.anuke.annotations.RemoteMethodAnnotationProcessor"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
project(":ios") {
|
|
||||||
apply plugin: "java"
|
apply plugin: "java"
|
||||||
apply plugin: "robovm"
|
apply plugin: "robovm"
|
||||||
|
|
||||||
task copyGen{
|
task incrementConfig{
|
||||||
copy{
|
def vfile = file('robovm.properties')
|
||||||
from ("core/build/classes/java/main/io/anuke/mindustry/gen/"){
|
|
||||||
include "**/*.java"
|
def props = new Properties()
|
||||||
|
if(vfile.exists()){
|
||||||
|
props.load(new FileInputStream(vfile))
|
||||||
}
|
}
|
||||||
|
|
||||||
into "ios/src/io/anuke/mindustry/gen"
|
props['app.id'] = 'io.anuke.mindustry'
|
||||||
|
props['app.version'] = '4.0'
|
||||||
|
props['app.mainclass'] = 'io.anuke.mindustry.IOSLauncher'
|
||||||
|
props['app.executable'] = 'IOSLauncher'
|
||||||
|
props['app.name'] = 'Mindustry'
|
||||||
|
props['app.build'] = (!props.containsKey("app.build") ? 40 : props['app.build'].toInteger() + 1) + ""
|
||||||
|
props.store(vfile.newWriter(), null)
|
||||||
}
|
}
|
||||||
|
|
||||||
doFirst{
|
dependencies{
|
||||||
delete{
|
|
||||||
delete "ios/src/io/anuke/mindustry/gen/"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
build.dependsOn(copyGen)
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
compile project(":core")
|
compile project(":core")
|
||||||
implementation project(":kryonet")
|
compile project(":net")
|
||||||
|
compileOnly project(":annotations")
|
||||||
|
|
||||||
|
compile arcModule("backends:backend-robovm")
|
||||||
|
|
||||||
compile "com.mobidevelop.robovm:robovm-rt:$roboVMVersion"
|
compile "com.mobidevelop.robovm:robovm-rt:$roboVMVersion"
|
||||||
compile "com.mobidevelop.robovm:robovm-cocoatouch:$roboVMVersion"
|
compile "com.mobidevelop.robovm:robovm-cocoatouch:$roboVMVersion"
|
||||||
compile "com.badlogicgames.gdx:gdx-backend-robovm:$gdxVersion"
|
|
||||||
compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-ios"
|
compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-ios"
|
||||||
|
compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-ios"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
project(":core") {
|
project(":core"){
|
||||||
apply plugin: "java"
|
apply plugin: "java"
|
||||||
|
|
||||||
task finish {
|
task finish{
|
||||||
generateLocales()
|
generateLocales()
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies{
|
||||||
|
if(System.properties["user.name"] == "anuke"){
|
||||||
|
task cleanGen{
|
||||||
|
doFirst{
|
||||||
|
delete{
|
||||||
|
delete "../core/src/io/anuke/mindustry/gen/"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
task copyGen{
|
||||||
|
doLast{
|
||||||
|
copy{
|
||||||
|
from("../core/build/generated/sources/annotationProcessor/java/main/io/anuke/mindustry/gen"){
|
||||||
|
include "**/*.java"
|
||||||
|
}
|
||||||
|
|
||||||
|
into "../core/src/io/anuke/mindustry/gen"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
compileJava.dependsOn(cleanGen)
|
||||||
|
compileJava.finalizedBy(copyGen)
|
||||||
|
}
|
||||||
|
|
||||||
|
compile arcModule("arc-core")
|
||||||
|
compile arcModule("extensions:freetype")
|
||||||
|
compile arcModule("extensions:arcnet")
|
||||||
|
if(localArc() && debugged()) compile arcModule("extensions:recorder")
|
||||||
|
|
||||||
compileOnly project(":annotations")
|
compileOnly project(":annotations")
|
||||||
build.finalizedBy(finish)
|
annotationProcessor project(":annotations")
|
||||||
|
|
||||||
def comp = System.properties["release"] == null || System.properties["release"] == "false"
|
|
||||||
if(!comp) println("Note: Compiling release build.")
|
|
||||||
|
|
||||||
if(new File(projectDir.parent, '../uCore').exists() && comp){
|
|
||||||
compile project(":uCore")
|
|
||||||
}else{
|
|
||||||
compile "com.github.anuken:ucore:$uCoreVersion"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(new File(projectDir.parent, '../GDXGifRecorder').exists() && comp) {
|
|
||||||
compile project(":GDXGifRecorder")
|
|
||||||
}
|
|
||||||
|
|
||||||
compile "com.badlogicgames.gdx:gdx:$gdxVersion"
|
|
||||||
compile "com.badlogicgames.gdx:gdx-controllers:$gdxVersion"
|
|
||||||
}
|
|
||||||
|
|
||||||
compileJava.options.compilerArgs = [
|
|
||||||
"-processor", "io.anuke.annotations.RemoteMethodAnnotationProcessor"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
project(":server") {
|
project(":server"){
|
||||||
apply plugin: "java"
|
apply plugin: "java"
|
||||||
|
|
||||||
configurations {
|
dependencies{
|
||||||
if(findProject(":android") != null){
|
|
||||||
compile.exclude module: android
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
compileOnly project(":annotations")
|
|
||||||
|
|
||||||
compile project(":core")
|
compile project(":core")
|
||||||
compile project(":kryonet")
|
compile project(":net")
|
||||||
compile "com.badlogicgames.gdx:gdx-backend-headless:$gdxVersion"
|
compile arcModule("backends:backend-headless")
|
||||||
compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
project(":packer") {
|
project(":tests"){
|
||||||
apply plugin: "java"
|
apply plugin: "java"
|
||||||
|
|
||||||
dependencies {
|
dependencies{
|
||||||
|
testImplementation project(":core")
|
||||||
|
testImplementation "org.junit.jupiter:junit-jupiter-params:5.3.1"
|
||||||
|
testImplementation "org.junit.jupiter:junit-jupiter-api:5.3.1"
|
||||||
|
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.3.1"
|
||||||
|
compile arcModule("backends:backend-headless")
|
||||||
|
}
|
||||||
|
|
||||||
|
test{
|
||||||
|
useJUnitPlatform()
|
||||||
|
workingDir = new File("../core/assets")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
project(":tools"){
|
||||||
|
apply plugin: "java"
|
||||||
|
|
||||||
|
dependencies{
|
||||||
compile project(":core")
|
compile project(":core")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
project(":annotations") {
|
project(":annotations"){
|
||||||
apply plugin: "java"
|
apply plugin: "java"
|
||||||
|
|
||||||
dependencies {
|
dependencies{
|
||||||
compile 'com.squareup:javapoet:1.11.0'
|
compile 'com.squareup:javapoet:1.11.0'
|
||||||
|
compile files("${System.getProperty('java.home')}/../lib/tools.jar")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
project(":kryonet") {
|
project(":net"){
|
||||||
apply plugin: "java"
|
apply plugin: "java"
|
||||||
|
|
||||||
dependencies {
|
dependencies{
|
||||||
compile project(":core")
|
compile project(":core")
|
||||||
compile 'com.github.crykn:kryonet:2.22.1'
|
compile "org.lz4:lz4-java:1.4.1"
|
||||||
compile 'com.github.Anuken:WaifUPnP:05eb46bc577fd7674596946ba288c96c0cedd893'
|
compile 'com.github.Anuken:WaifUPnP:05eb46bc577fd7674596946ba288c96c0cedd893'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
project(":reporter"){
|
|
||||||
apply plugin: "java"
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.eclipse.doLast {
|
|
||||||
delete ".project"
|
|
||||||
}
|
|
||||||
|
|||||||
BIN
core/assets-raw/fonts/Exo2-Regular.ttf
Normal file
BIN
core/assets-raw/fonts/NanumBarunGothic.ttf
Normal file
BIN
core/assets-raw/fonts/OpenSansEmoji.ttf
Normal file
BIN
core/assets-raw/fonts/font_latin.ttf
Normal file
BIN
core/assets-raw/sprites/blocks/defense/force-projector-top.png
Normal file
|
After Width: | Height: | Size: 3.0 KiB |
BIN
core/assets-raw/sprites/blocks/defense/force-projector.png
Normal file
|
After Width: | Height: | Size: 8.0 KiB |
|
Before Width: | Height: | Size: 111 B After Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 217 B After Width: | Height: | Size: 5.4 KiB |
BIN
core/assets-raw/sprites/blocks/defense/mender-top.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
core/assets-raw/sprites/blocks/defense/mender.png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
|
After Width: | Height: | Size: 3.6 KiB |
BIN
core/assets-raw/sprites/blocks/defense/overdrive-projector.png
Normal file
|
After Width: | Height: | Size: 5.3 KiB |
BIN
core/assets-raw/sprites/blocks/defense/shock-mine.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 83 B After Width: | Height: | Size: 125 B |
|
Before Width: | Height: | Size: 93 B After Width: | Height: | Size: 123 B |
|
Before Width: | Height: | Size: 95 B After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 119 B After Width: | Height: | Size: 401 B |
BIN
core/assets-raw/sprites/blocks/distribution/center.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 98 B After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 98 B After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 98 B After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 97 B After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 116 B After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 117 B After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 119 B After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 117 B After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 113 B After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 108 B After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 104 B After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 106 B After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 109 B After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 107 B After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 110 B After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 110 B After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 109 B After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 108 B After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 105 B After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 109 B After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 105 B After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 105 B After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 105 B After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 103 B After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 127 B After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 127 B After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 133 B After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 129 B After Width: | Height: | Size: 1.9 KiB |