Compare commits
1478 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1ce9b54e10 | ||
|
|
39db62e3a5 | ||
|
|
ec59b04363 | ||
|
|
565064cd64 | ||
|
|
9d2e356996 | ||
|
|
ae5685ae46 | ||
|
|
2b46b0e38e | ||
|
|
e200dcee33 | ||
|
|
fe63b46b67 | ||
|
|
698e83a28a | ||
|
|
150d0bf513 | ||
|
|
5af7cd1d55 | ||
|
|
b952ee0725 | ||
|
|
670f085f78 | ||
|
|
811c22b84e | ||
|
|
6edcbb9120 | ||
|
|
566052cabf | ||
|
|
730d30ef98 | ||
|
|
e04c592f9e | ||
|
|
77b89d45d6 | ||
|
|
df4a0dd5e4 | ||
|
|
8c941c7165 | ||
|
|
b01d56aae8 | ||
|
|
497ae740aa | ||
|
|
7543d92473 | ||
|
|
60d83751e8 | ||
|
|
e0f59404c1 | ||
|
|
d3c559fa00 | ||
|
|
179bf4d525 | ||
|
|
16ddb91466 | ||
|
|
e1bf8bdab1 | ||
|
|
d43b40fab5 | ||
|
|
c0c0ffa682 | ||
|
|
98f8a1732e | ||
|
|
d6d6dc29dc | ||
|
|
6080a7e4bc | ||
|
|
c339a0ecdf | ||
|
|
684f3075cb | ||
|
|
954e26fc14 | ||
|
|
c449302d28 | ||
|
|
d8629100db | ||
|
|
4858e602ed | ||
|
|
de5979f4ee | ||
|
|
36ec88e2e2 | ||
|
|
a5978b6163 | ||
|
|
1d6f769e3d | ||
|
|
2b22b7e7e4 | ||
|
|
9016c12d16 | ||
|
|
8ac0949ddf | ||
|
|
fad94cb56e | ||
|
|
ee429ef4f2 | ||
|
|
c7ea4e85c9 | ||
|
|
c0f14185a8 | ||
|
|
ec4c2c7adb | ||
|
|
03342dc2f5 | ||
|
|
475794640d | ||
|
|
514d4817c8 | ||
|
|
f89af1b26a | ||
|
|
5b21873f3c | ||
|
|
b806a22a0a | ||
|
|
41e4187193 | ||
|
|
ba7cf94a6b | ||
|
|
01de18b663 | ||
|
|
9aeccfd9f3 | ||
|
|
41a5c4daf3 | ||
|
|
07e58dc14b | ||
|
|
ede002878e | ||
|
|
9906821912 | ||
|
|
adb12dcbb8 | ||
|
|
7a1f467f27 | ||
|
|
5e568eac0d | ||
|
|
0f6cd5242c | ||
|
|
e91151213a | ||
|
|
8b4c266d49 | ||
|
|
1c816be5ce | ||
|
|
f504dd2b5a | ||
|
|
26881fbdb9 | ||
|
|
8d921199fb | ||
|
|
4ffe233321 | ||
|
|
e076de9dcd | ||
|
|
5ce66b0dbb | ||
|
|
6971a76c8e | ||
|
|
d47f86cc21 | ||
|
|
487607e1d6 | ||
|
|
3cefc085bd | ||
|
|
3d8e5bd36a | ||
|
|
e9ed0512f7 | ||
|
|
0cf39bf5c3 | ||
|
|
95a1474b9a | ||
|
|
53aedcee2c | ||
|
|
9758a05002 | ||
|
|
18bb7ba936 | ||
|
|
9f3dcdf727 | ||
|
|
7d2354a653 | ||
|
|
ab21b88001 | ||
|
|
a560978dcf | ||
|
|
047f479a2f | ||
|
|
d78d3daaf9 | ||
|
|
976d0f54b3 | ||
|
|
1c1db3990f | ||
|
|
bcc8f65ac8 | ||
|
|
e043f4bb66 | ||
|
|
9d3dda035c | ||
|
|
6e16aab794 | ||
|
|
c1cf3183ac | ||
|
|
252d0f6aa1 | ||
|
|
1f5a6e1bf8 | ||
|
|
58e3143e2a | ||
|
|
9033ebcfd7 | ||
|
|
1f5e773c77 | ||
|
|
7b1a0a42d4 | ||
|
|
3d78175e50 | ||
|
|
9d2133814c | ||
|
|
6ce013a1eb | ||
|
|
19675068ea | ||
|
|
5db8520b74 | ||
|
|
c3e41140e0 | ||
|
|
bce379d40d | ||
|
|
8fde8695d0 | ||
|
|
8c1c54d49a | ||
|
|
01e3912827 | ||
|
|
e22f853a31 | ||
|
|
1ae20553ff | ||
|
|
c68eaade94 | ||
|
|
1461b5b357 | ||
|
|
f0dd3b3a39 | ||
|
|
61d724ee2b | ||
|
|
d60c2c5b63 | ||
|
|
7e696cadaf | ||
|
|
0f23bf9d08 | ||
|
|
202d79817a | ||
|
|
736737f151 | ||
|
|
a29ce3b0b9 | ||
|
|
fed4842222 | ||
|
|
fbed11e927 | ||
|
|
45ce4013d0 | ||
|
|
6f3d585118 | ||
|
|
962ce7bfa6 | ||
|
|
b6ee157adb | ||
|
|
a45a632726 | ||
|
|
675e15ddca | ||
|
|
f6b9830f82 | ||
|
|
324f6351ea | ||
|
|
aeb6e6498e | ||
|
|
f4ee67c08b | ||
|
|
a2382965f6 | ||
|
|
09dbee1401 | ||
|
|
b74696b312 | ||
|
|
da849085ec | ||
|
|
83a3195e34 | ||
|
|
8148f2a0f7 | ||
|
|
2a03ef0c43 | ||
|
|
0078a8cb8e | ||
|
|
177cea5c5d | ||
|
|
74dc31b10a | ||
|
|
9e07b95223 | ||
|
|
2554433f8d | ||
|
|
e06d61dcc9 | ||
|
|
1aca302518 | ||
|
|
a7d37b7e6c | ||
|
|
9f29898713 | ||
|
|
803719b216 | ||
|
|
6588fc6581 | ||
|
|
9f4d44f0f3 | ||
|
|
07fb5aa88e | ||
|
|
b3e1436074 | ||
|
|
98a083abdd | ||
|
|
86df70a839 | ||
|
|
fd202421b1 | ||
|
|
268f3cc3c2 | ||
|
|
477ebc91bf | ||
|
|
fd6abaff62 | ||
|
|
ccca26d98f | ||
|
|
5ca01bf234 | ||
|
|
d3747f0d4c | ||
|
|
d81b36d897 | ||
|
|
07598e3f2f | ||
|
|
dd5e3b2aba | ||
|
|
06abc43aea | ||
|
|
8b80a42886 | ||
|
|
93fd6c5bd6 | ||
|
|
96aa3ccee0 | ||
|
|
f3a5798a7f | ||
|
|
2b49c300f8 | ||
|
|
50a6071cfc | ||
|
|
044dac6a9e | ||
|
|
7f3f27a91e | ||
|
|
ef24e5ecad | ||
|
|
6f146c6cad | ||
|
|
db5bd7eea8 | ||
|
|
2e315e5516 | ||
|
|
7dd7ccf698 | ||
|
|
a087df0771 | ||
|
|
ba982a73b8 | ||
|
|
c85847567d | ||
|
|
c08aa1f3d6 | ||
|
|
1e3bfba31a | ||
|
|
5788c27aaa | ||
|
|
5c30f4bc9c | ||
|
|
5a9957c578 | ||
|
|
42687fb47e | ||
|
|
9cb55b9745 | ||
|
|
e66ecb6c90 | ||
|
|
04d3c40baa | ||
|
|
0e7c403bd8 | ||
|
|
77e0e46a17 | ||
|
|
b6915a0483 | ||
|
|
1db444b070 | ||
|
|
ae981053b2 | ||
|
|
23f90fcaf4 | ||
|
|
d5b50c038c | ||
|
|
765d9703f5 | ||
|
|
b21c25bccf | ||
|
|
ceae04aa5b | ||
|
|
3abcdf2063 | ||
|
|
f784e893dd | ||
|
|
7e993c15dc | ||
|
|
5411ae777e | ||
|
|
e733b4be1b | ||
|
|
57f9aeee86 | ||
|
|
eabbd2fa32 | ||
|
|
d9aa9b6278 | ||
|
|
1e1b84a201 | ||
|
|
e6753ace87 | ||
|
|
932c32ad8f | ||
|
|
a5fbc07561 | ||
|
|
2631c4f7af | ||
|
|
01304bf734 | ||
|
|
c2c5836752 | ||
|
|
6a15328854 | ||
|
|
dabdd094f9 | ||
|
|
0dd8267e21 | ||
|
|
7b69310f1b | ||
|
|
6f48e7a5ed | ||
|
|
98bca1740c | ||
|
|
51842a61a8 | ||
|
|
78fefdacca | ||
|
|
a1fb3e27ab | ||
|
|
686b892ea9 | ||
|
|
ffcfaf1610 | ||
|
|
80c46bb5a2 | ||
|
|
cb29bee8f5 | ||
|
|
2d42704062 | ||
|
|
2136ae03a5 | ||
|
|
fbe58bec04 | ||
|
|
5f81a0c7f3 | ||
|
|
38804462a9 | ||
|
|
f28eb4027c | ||
|
|
c324dce034 | ||
|
|
0efced4fd8 | ||
|
|
6d6fac00d7 | ||
|
|
d0803ef45c | ||
|
|
0122fb4028 | ||
|
|
2c61fcdfa6 | ||
|
|
18b6c37a89 | ||
|
|
31c294e972 | ||
|
|
b8e3b70fcc | ||
|
|
289e4f29ef | ||
|
|
1482695f6e | ||
|
|
5e51b43367 | ||
|
|
10376ee59d | ||
|
|
f162d815fe | ||
|
|
7f2a529c08 | ||
|
|
968f3ace33 | ||
|
|
2a8fca33ea | ||
|
|
8be948300e | ||
|
|
f2c9c2e5fb | ||
|
|
6ec0ff9442 | ||
|
|
0693480633 | ||
|
|
33842aca14 | ||
|
|
3ddb9d166f | ||
|
|
d17b37cb39 | ||
|
|
c82473ba47 | ||
|
|
b99a0ff618 | ||
|
|
c7000b29a6 | ||
|
|
fac217a836 | ||
|
|
c4c19a204f | ||
|
|
496677725e | ||
|
|
a6523c670f | ||
|
|
879f90ebf4 | ||
|
|
ff2d9c34fd | ||
|
|
8daaea3536 | ||
|
|
cc7aaae52c | ||
|
|
4ce494cc22 | ||
|
|
9461d7a360 | ||
|
|
50854a55f0 | ||
|
|
d03ec3122c | ||
|
|
dd13c305e7 | ||
|
|
48911005aa | ||
|
|
7955b82b1e | ||
|
|
9ff53dd87d | ||
|
|
4487d01a38 | ||
|
|
fd6c6b2aab | ||
|
|
44fdda09c6 | ||
|
|
9bfaecf760 | ||
|
|
39939f8a51 | ||
|
|
7e5c276e7f | ||
|
|
7e8503cde7 | ||
|
|
134fea445c | ||
|
|
3a3548dd63 | ||
|
|
0ef27354be | ||
|
|
ad25cd8074 | ||
|
|
6bc98bbe67 | ||
|
|
5e2dd89d3b | ||
|
|
7830372477 | ||
|
|
425f63c673 | ||
|
|
7523f20d85 | ||
|
|
13cc136fe2 | ||
|
|
c41cbc8bea | ||
|
|
d232d249e9 | ||
|
|
e0a52f4779 | ||
|
|
8d431e5b40 | ||
|
|
dcb1f0b00a | ||
|
|
9b732017a9 | ||
|
|
fd94f8f24b | ||
|
|
814b7458ec | ||
|
|
dc1b073882 | ||
|
|
fad6fe9a2a | ||
|
|
c8eee3b825 | ||
|
|
73b6cc73ff | ||
|
|
2593e96999 | ||
|
|
629999a1cd | ||
|
|
4d3e268972 | ||
|
|
84968c9f73 | ||
|
|
d73b99945f | ||
|
|
1d15316cbb | ||
|
|
913a703d41 | ||
|
|
5d949f6bc0 | ||
|
|
faf64f11f2 | ||
|
|
430c4fa1d0 | ||
|
|
a90f2545d9 | ||
|
|
eba0a96b6d | ||
|
|
f9ffb78b33 | ||
|
|
083f2e38d4 | ||
|
|
7feed8828c | ||
|
|
1f6ef9d9ae | ||
|
|
e6afe584e5 | ||
|
|
76c63443af | ||
|
|
cafd95859f | ||
|
|
b795d97d0e | ||
|
|
ec7379cc86 | ||
|
|
43fe6be13e | ||
|
|
75d4b5b663 | ||
|
|
a7fc1a42ce | ||
|
|
16eef2dd92 | ||
|
|
016823d446 | ||
|
|
0cf9ef66fa | ||
|
|
1f583dc7a2 | ||
|
|
74212771dc | ||
|
|
6bcea7af66 | ||
|
|
3ec7e40213 | ||
|
|
836e72119c | ||
|
|
f81f7e1d2a | ||
|
|
618a050414 | ||
|
|
ec7f49c94b | ||
|
|
30ea285ca0 | ||
|
|
32a5c7b769 | ||
|
|
581749a29f | ||
|
|
d83d26598c | ||
|
|
d653f1441d | ||
|
|
a9b822089f | ||
|
|
c5a4d7331f | ||
|
|
230428f2e0 | ||
|
|
1a26a1bf63 | ||
|
|
77001324e9 | ||
|
|
0fd6207689 | ||
|
|
dd175747ab | ||
|
|
3106389f6a | ||
|
|
d8c997b355 | ||
|
|
103f655fa4 | ||
|
|
1dfaf3897c | ||
|
|
f7bdd4efe1 | ||
|
|
8a089ba3c9 | ||
|
|
56917483d6 | ||
|
|
f5c1eb74af | ||
|
|
785afaa281 | ||
|
|
dcdec7f55f | ||
|
|
8d19c8b7af | ||
|
|
29025a45e8 | ||
|
|
a73491bb9b | ||
|
|
eee06da6b4 | ||
|
|
231ce28f74 | ||
|
|
0e8abca5d9 | ||
|
|
2cf628305a | ||
|
|
001294a94c | ||
|
|
fa0e9727ae | ||
|
|
b8aa3c8b21 | ||
|
|
f2f5fde3a5 | ||
|
|
d6822c9c7d | ||
|
|
52f592a357 | ||
|
|
39a0dde1f4 | ||
|
|
fbb1f012e2 | ||
|
|
6141b135fe | ||
|
|
e827bb17e7 | ||
|
|
4c0607aba8 | ||
|
|
2af13a31dc | ||
|
|
2dec6af231 | ||
|
|
c70fb5940f | ||
|
|
2c15ae178d | ||
|
|
4a987677ac | ||
|
|
ee88cd33b1 | ||
|
|
fb15c44383 | ||
|
|
4f4113d3d1 | ||
|
|
52355de1c0 | ||
|
|
ebee4fa5da | ||
|
|
796241b40a | ||
|
|
505f802e20 | ||
|
|
e9f9194f73 | ||
|
|
effd4e959a | ||
|
|
f58eb75639 | ||
|
|
0c430527b8 | ||
|
|
7871b5bdaa | ||
|
|
124480f96b | ||
|
|
32e207d047 | ||
|
|
8b2934c60e | ||
|
|
d05f56c5b1 | ||
|
|
d1196f8e85 | ||
|
|
c71b5d6f87 | ||
|
|
8a6d39d5d0 | ||
|
|
0ac7059812 | ||
|
|
1e7c21c1ae | ||
|
|
c9c1c57c9d | ||
|
|
82ae378edc | ||
|
|
01ef9c4fea | ||
|
|
dbb64f1d87 | ||
|
|
ccac67ced6 | ||
|
|
ce6f3ddb5a | ||
|
|
4c4e93c88a | ||
|
|
d86997e388 | ||
|
|
60717bdaad | ||
|
|
4454b6f29d | ||
|
|
0738a7dbf0 | ||
|
|
a539bb8e57 | ||
|
|
b2d417f207 | ||
|
|
4352ab92f1 | ||
|
|
5c522069b1 | ||
|
|
49d12f36b9 | ||
|
|
e4697bae27 | ||
|
|
3691ab7f8f | ||
|
|
a47e03de0a | ||
|
|
21b7016fb5 | ||
|
|
33da381892 | ||
|
|
69f2a77779 | ||
|
|
2bfa304d97 | ||
|
|
4dde48d18e | ||
|
|
c2e450add0 | ||
|
|
8f9a9ec3e5 | ||
|
|
e04b756d36 | ||
|
|
e066034e9f | ||
|
|
a48baa1356 | ||
|
|
c6a75891d3 | ||
|
|
7d7eb53cd6 | ||
|
|
8e2c12848c | ||
|
|
521da56e70 | ||
|
|
3e43f5577e | ||
|
|
f1f8130718 | ||
|
|
f38bf9262d | ||
|
|
be6af55616 | ||
|
|
53d004d91e | ||
|
|
6153764c0d | ||
|
|
a6fd244be2 | ||
|
|
a54d72d00c | ||
|
|
b3eacd841f | ||
|
|
08b730a349 | ||
|
|
08d0a7ada7 | ||
|
|
381d19634f | ||
|
|
b542b6651e | ||
|
|
c249485a4f | ||
|
|
988c424e45 | ||
|
|
48c062f7af | ||
|
|
cf6d2c7593 | ||
|
|
3392138972 | ||
|
|
abd76fe89f | ||
|
|
258670e0b5 | ||
|
|
71d67b9d8f | ||
|
|
240f924faf | ||
|
|
7ca8ac64a3 | ||
|
|
230f98fbb4 | ||
|
|
9122fbe141 | ||
|
|
6f9811498a | ||
|
|
a72d95e6d7 | ||
|
|
19796092e5 | ||
|
|
2209968963 | ||
|
|
06cfe9a9cc | ||
|
|
173518356d | ||
|
|
326b1e9f62 | ||
|
|
b8ea0f3aa6 | ||
|
|
51d08c6f42 | ||
|
|
49adf1fae7 | ||
|
|
6c85a4dd29 | ||
|
|
4dd84fbfa4 | ||
|
|
6a58347872 | ||
|
|
ea9e23f924 | ||
|
|
b78e04a2de | ||
|
|
98c51db226 | ||
|
|
52764be2b6 | ||
|
|
bf27c14946 | ||
|
|
6148a931d3 | ||
|
|
59401ab5f5 | ||
|
|
ad23cbc03c | ||
|
|
4743434e9c | ||
|
|
2c59288969 | ||
|
|
0c2f8f879e | ||
|
|
b6d72044a0 | ||
|
|
a97ae7ad34 | ||
|
|
6d6fe41bc5 | ||
|
|
733566d606 | ||
|
|
6f19685255 | ||
|
|
91dc25f69d | ||
|
|
3be3253a08 | ||
|
|
53248f6e00 | ||
|
|
d1d7b08619 | ||
|
|
1c10fec242 | ||
|
|
3467b62cc4 | ||
|
|
6746732e49 | ||
|
|
52af596eb4 | ||
|
|
08eb683e8a | ||
|
|
6f1f21a127 | ||
|
|
cea15bebab | ||
|
|
06e7b94b60 | ||
|
|
c9bbae1c5c | ||
|
|
8616a82efc | ||
|
|
ee5d229f51 | ||
|
|
42bf1df424 | ||
|
|
3df5504fde | ||
|
|
8bf8b6075a | ||
|
|
b3a09226ca | ||
|
|
fcbcdfc5d9 | ||
|
|
6fa16ab130 | ||
|
|
996a86f351 | ||
|
|
a76ccb72c2 | ||
|
|
0559595ac6 | ||
|
|
77dbeed890 | ||
|
|
d1b4f8c5b7 | ||
|
|
7316f74917 | ||
|
|
f1519f7aba | ||
|
|
b86218b75a | ||
|
|
0722ad2f4c | ||
|
|
f0fa643930 | ||
|
|
d1dcce31a5 | ||
|
|
ac593eb8cf | ||
|
|
f07239d8c2 | ||
|
|
485fc3ea2a | ||
|
|
7b3a27f1e2 | ||
|
|
c540f8e5f5 | ||
|
|
b7d91310cc | ||
|
|
32d0cc6dd0 | ||
|
|
9caee67606 | ||
|
|
bde78dcc19 | ||
|
|
28a5fb537d | ||
|
|
cd7bac1e2c | ||
|
|
f682b86f9a | ||
|
|
ff14f819c4 | ||
|
|
8b5ce2ab33 | ||
|
|
b1f2faa988 | ||
|
|
d342c2c081 | ||
|
|
a5cec84be1 | ||
|
|
a299c39d7b | ||
|
|
685c41ebf5 | ||
|
|
1ec09a4679 | ||
|
|
9e4e58baf9 | ||
|
|
bd5c98cc0d | ||
|
|
ef2817513a | ||
|
|
d28ae1b304 | ||
|
|
101f5351bd | ||
|
|
e103d62b75 | ||
|
|
d969741f90 | ||
|
|
8a1ea7fd19 | ||
|
|
34db321577 | ||
|
|
cc57f0b19b | ||
|
|
4e946ae52b | ||
|
|
236ed74cae | ||
|
|
cd07d3b13d | ||
|
|
b582c79593 | ||
|
|
df0d81db7c | ||
|
|
a628134a89 | ||
|
|
708acdfe95 | ||
|
|
f84a7e7661 | ||
|
|
5fde533bcc | ||
|
|
16e57f6f24 | ||
|
|
44dc250a2b | ||
|
|
742fb3dece | ||
|
|
bd0a6636e6 | ||
|
|
ad5cdebca8 | ||
|
|
ff794d485a | ||
|
|
65a7a5afe2 | ||
|
|
2fcae6d27c | ||
|
|
6023b312e3 | ||
|
|
c4cbb85e03 | ||
|
|
3280bceaa1 | ||
|
|
87a3f23f51 | ||
|
|
b7e788d529 | ||
|
|
71d423cac3 | ||
|
|
b083f5d8f9 | ||
|
|
6c9917fc2a | ||
|
|
f6b814588e | ||
|
|
9be72c81eb | ||
|
|
4b91d07f11 | ||
|
|
15cbc5fe42 | ||
|
|
70d80bb32e | ||
|
|
6d878e33fd | ||
|
|
e865d17fd1 | ||
|
|
f971061ef4 | ||
|
|
5d7f14c21f | ||
|
|
955dc5f48d | ||
|
|
345c696db9 | ||
|
|
7130902979 | ||
|
|
f50d5bd23c | ||
|
|
cbfcb5de2c | ||
|
|
eaaf3a9e60 | ||
|
|
ab199633f8 | ||
|
|
80ccc0eee0 | ||
|
|
7179b147b2 | ||
|
|
74366f10e9 | ||
|
|
b94834fb20 | ||
|
|
9ae98a4353 | ||
|
|
f1a423f8fb | ||
|
|
b7c1660b07 | ||
|
|
b0409b31d8 | ||
|
|
e33c0a4309 | ||
|
|
151dca6fb9 | ||
|
|
56e5705ed6 | ||
|
|
1f5e639fb2 | ||
|
|
b98b9a98e3 | ||
|
|
ae4ec55abe | ||
|
|
17e219f142 | ||
|
|
216e999a71 | ||
|
|
3b9980c01e | ||
|
|
e08eec42ac | ||
|
|
39a6d1c58d | ||
|
|
6f4f686c04 | ||
|
|
a2f430418a | ||
|
|
d39ceb1f5e | ||
|
|
ceec999922 | ||
|
|
d7ebbbf2b6 | ||
|
|
7e5be6793e | ||
|
|
bb593af463 | ||
|
|
4ae4456c43 | ||
|
|
d2fda57f2c | ||
|
|
7e1b95216b | ||
|
|
adb8930816 | ||
|
|
c483a00865 | ||
|
|
9c8b3b6cc7 | ||
|
|
c062492def | ||
|
|
4f6bd5b684 | ||
|
|
181c418cea | ||
|
|
01f6fff823 | ||
|
|
3bb787c575 | ||
|
|
39972c4c2b | ||
|
|
486a45ad14 | ||
|
|
ad5cb37ed5 | ||
|
|
eb1d3c27c5 | ||
|
|
ec59396035 | ||
|
|
c5a550bf78 | ||
|
|
83b3bd9a2e | ||
|
|
a2ff516112 | ||
|
|
513e5b4019 | ||
|
|
fe4783dc63 | ||
|
|
ffa6894e56 | ||
|
|
982483f178 | ||
|
|
898956d833 | ||
|
|
b1d9be707d | ||
|
|
907f1e7dfd | ||
|
|
2e0e351228 | ||
|
|
e4b267d757 | ||
|
|
a238d7278f | ||
|
|
4b428c6636 | ||
|
|
b5e9f280e6 | ||
|
|
3c65e366e8 | ||
|
|
e9efe4169c | ||
|
|
4be22822d4 | ||
|
|
00054e2c61 | ||
|
|
cc105e5029 | ||
|
|
f6899cf3c3 | ||
|
|
a2a4c8c43d | ||
|
|
0faae5d5ca | ||
|
|
2586c53f0d | ||
|
|
7fdbd27ebb | ||
|
|
d0dc21a52c | ||
|
|
f7be953bb5 | ||
|
|
08a51d8f1b | ||
|
|
32edf58f75 | ||
|
|
88e1770f2e | ||
|
|
142e93f3e9 | ||
|
|
db9eb36c8c | ||
|
|
6a12effd6a | ||
|
|
f7d98591c9 | ||
|
|
30bcfb6d5e | ||
|
|
61d15782d0 | ||
|
|
dec6a1296b | ||
|
|
44c8b07eb1 | ||
|
|
0095d89543 | ||
|
|
4977f598fd | ||
|
|
25cacbb28d | ||
|
|
a0c93ea7d3 | ||
|
|
1921bc87a2 | ||
|
|
6437e6b878 | ||
|
|
41284ac3bc | ||
|
|
8cf0df7ac5 | ||
|
|
b804f7fa6e | ||
|
|
95cda0d9ab | ||
|
|
2dae3c4b4a | ||
|
|
fd12027873 | ||
|
|
ff4c7e4302 | ||
|
|
3939d1855d | ||
|
|
596d58b539 | ||
|
|
565bc6d4c2 | ||
|
|
af3067c08b | ||
|
|
d0006eaa26 | ||
|
|
52b2731a42 | ||
|
|
08f3368766 | ||
|
|
86474484ae | ||
|
|
e31fb13378 | ||
|
|
c147389d25 | ||
|
|
0581f500cc | ||
|
|
e5335e9a97 | ||
|
|
5c0a338e6b | ||
|
|
73329ccaf2 | ||
|
|
8b5b7cf5fc | ||
|
|
799cdc716b | ||
|
|
6c4853a847 | ||
|
|
bfe57b309a | ||
|
|
6715c43fc3 | ||
|
|
f68348bde6 | ||
|
|
121e27906c | ||
|
|
a1826763f5 | ||
|
|
5a3e4f7fb6 | ||
|
|
f17766c8ce | ||
|
|
8556b7eef7 | ||
|
|
8e9b84f4f9 | ||
|
|
6b1fd152e5 | ||
|
|
fab3fcb112 | ||
|
|
a4b6b88b76 | ||
|
|
b1e99f07a2 | ||
|
|
6bceb7311a | ||
|
|
cbfc766e55 | ||
|
|
d19c3daa67 | ||
|
|
86eb832446 | ||
|
|
ebb859238c | ||
|
|
eb21d5ab67 | ||
|
|
edfd402ccd | ||
|
|
3d8547d7dd | ||
|
|
3ffa768cfc | ||
|
|
53e9d4a3e3 | ||
|
|
657686cab3 | ||
|
|
a45fc2c030 | ||
|
|
78471c1860 | ||
|
|
7eb3e5c0ea | ||
|
|
adc7c2bdb6 | ||
|
|
bef8b905de | ||
|
|
4d91c8f8b7 | ||
|
|
53c842492a | ||
|
|
3d624f7eaf | ||
|
|
92dacf18cd | ||
|
|
6743bd144f | ||
|
|
b074c047f4 | ||
|
|
a33fd5fbad | ||
|
|
597b58253c | ||
|
|
8ac844c839 | ||
|
|
dd3665be16 | ||
|
|
a01a888e47 | ||
|
|
6348652b0d | ||
|
|
96ff599c2d | ||
|
|
a09320cb4a | ||
|
|
c6173e70eb | ||
|
|
9ef31201b6 | ||
|
|
e7a5f0a6e6 | ||
|
|
0509c28576 | ||
|
|
dd3fd97b43 | ||
|
|
d973283039 | ||
|
|
b5bec065fe | ||
|
|
01e3bd703e | ||
|
|
d9f98323c7 | ||
|
|
d7ca2a33c8 | ||
|
|
243862804a | ||
|
|
bd03e666da | ||
|
|
23b7176d5a | ||
|
|
120457916a | ||
|
|
bd3463c824 | ||
|
|
4e0d1b2746 | ||
|
|
b927c2df1a | ||
|
|
3f3a03c227 | ||
|
|
36cec98082 | ||
|
|
4f7561d66c | ||
|
|
a05ee8bbb8 | ||
|
|
21b7a0235b | ||
|
|
f01e486edb | ||
|
|
204332a76a | ||
|
|
80a4e67ddf | ||
|
|
6e7baf42b1 | ||
|
|
36a21e2443 | ||
|
|
720f7c0b0f | ||
|
|
42d96fa356 | ||
|
|
534f770314 | ||
|
|
16eb069717 | ||
|
|
d65f54c27b | ||
|
|
4a78a04168 | ||
|
|
3a3c5e2304 | ||
|
|
31e4b2752f | ||
|
|
b43db6035f | ||
|
|
295c922f0a | ||
|
|
a11ffbce66 | ||
|
|
0ffa7bd0f5 | ||
|
|
eebfc2d6c5 | ||
|
|
a2dfa6368d | ||
|
|
3805497d71 | ||
|
|
a4ea062a83 | ||
|
|
e46daeed97 | ||
|
|
9fdc4a2c45 | ||
|
|
71fc20d971 | ||
|
|
9aec61020d | ||
|
|
c4cab3ed03 | ||
|
|
4bcd907f5b | ||
|
|
989e0d8fd1 | ||
|
|
ddf31e82f6 | ||
|
|
5a749ac106 | ||
|
|
5831576d21 | ||
|
|
df9ea97863 | ||
|
|
4315cb41f2 | ||
|
|
335c1779ef | ||
|
|
20462b91d4 | ||
|
|
e372821cea | ||
|
|
778859d7d7 | ||
|
|
19afb81bf6 | ||
|
|
a049b4faa6 | ||
|
|
c554d791bb | ||
|
|
01519e75a0 | ||
|
|
0eb61e601b | ||
|
|
b6396990ba | ||
|
|
bdd74bfcc3 | ||
|
|
aaadca8287 | ||
|
|
8873b2368f | ||
|
|
c95fa25b60 | ||
|
|
9e2ad3c642 | ||
|
|
a51216d7a6 | ||
|
|
a24321ae56 | ||
|
|
4b99f7c819 | ||
|
|
ae6925ccce | ||
|
|
94a2ab23ba | ||
|
|
b8c4f46630 | ||
|
|
e5c7d5dd2f | ||
|
|
c1ff7812d8 | ||
|
|
66925bfc7f | ||
|
|
e8c7bd1d32 | ||
|
|
1b93da20f4 | ||
|
|
edb0ece03b | ||
|
|
12164098a6 | ||
|
|
48145e4e77 | ||
|
|
df3f23731b | ||
|
|
912a40c9cd | ||
|
|
8cd013d2ab | ||
|
|
f7b6cea21b | ||
|
|
8f0eefa97e | ||
|
|
bc02d178ce | ||
|
|
3fb1f5f54a | ||
|
|
335bfab746 | ||
|
|
2d4d943b61 | ||
|
|
f06e5ed87f | ||
|
|
bd777e610f | ||
|
|
bdcccb0344 | ||
|
|
35ede418eb | ||
|
|
46f118db13 | ||
|
|
6d2a4d4d2b | ||
|
|
7491366658 | ||
|
|
8e0979020d | ||
|
|
7e11cd29e1 | ||
|
|
6dc1a21cf0 | ||
|
|
92d7efeea2 | ||
|
|
f5ce5d0a78 | ||
|
|
cce0040eaf | ||
|
|
3369de6bf7 | ||
|
|
532926a9e3 | ||
|
|
9e9d2496ed | ||
|
|
89db08f4ed | ||
|
|
ffd4297b17 | ||
|
|
ec29bd3682 | ||
|
|
76dbc1cca3 | ||
|
|
f5b6e13a1c | ||
|
|
b5d2566ffd | ||
|
|
a6dcd725cb | ||
|
|
e0ec9a047c | ||
|
|
7dfe2116fe | ||
|
|
525360f284 | ||
|
|
2db3060a03 | ||
|
|
d9b8335e0e | ||
|
|
948170e46b | ||
|
|
5b8c237a1e | ||
|
|
4c6f2f018f | ||
|
|
8ccdba5be2 | ||
|
|
cb929a7239 | ||
|
|
251b8deb25 | ||
|
|
9145ade617 | ||
|
|
4b83569b43 | ||
|
|
56cc806d01 | ||
|
|
ae6d5ae476 | ||
|
|
4bc37ab065 | ||
|
|
c9e969c7b4 | ||
|
|
65290dc2bf | ||
|
|
8c3f8f9b01 | ||
|
|
985918b870 | ||
|
|
62ad78ace9 | ||
|
|
af37c58bc1 | ||
|
|
5eba4a360d | ||
|
|
7bfdbaabe7 | ||
|
|
4f2bfb2406 | ||
|
|
3b5dd7567a | ||
|
|
94733515e4 | ||
|
|
d64872d9ae | ||
|
|
a2474e71cc | ||
|
|
c361f692df | ||
|
|
758670eb51 | ||
|
|
c8b12837a4 | ||
|
|
f7f854f0d3 | ||
|
|
8c27108b0a | ||
|
|
7cd220fe8c | ||
|
|
7fccd18910 | ||
|
|
73e9f55e55 | ||
|
|
002a052371 | ||
|
|
0049a0004e | ||
|
|
b0503d9930 | ||
|
|
429bb6ac13 | ||
|
|
f1b0ba039c | ||
|
|
33416aadef | ||
|
|
f17e46015a | ||
|
|
2b8878e724 | ||
|
|
63744c0a3a | ||
|
|
9c175ac893 | ||
|
|
c6bc398950 | ||
|
|
4210070d07 | ||
|
|
c05fb7ebf1 | ||
|
|
d35fbb8383 | ||
|
|
d9abee3adf | ||
|
|
fe3f75f141 | ||
|
|
79554bf8e9 | ||
|
|
4f9ed73a59 | ||
|
|
3d1b6e9fc5 | ||
|
|
2019196f65 | ||
|
|
a815763833 | ||
|
|
92a3f150bb | ||
|
|
000b23d703 | ||
|
|
438b3d9752 | ||
|
|
a9edee1550 | ||
|
|
b63de8b7d6 | ||
|
|
5e0e3f4522 | ||
|
|
a74722aea5 | ||
|
|
4e55cbbfe8 | ||
|
|
5f8b9f301a | ||
|
|
c387817157 | ||
|
|
138a9ffae7 | ||
|
|
b3666ed2a8 | ||
|
|
3b8fd10f70 | ||
|
|
7c0106e62f | ||
|
|
8609400d76 | ||
|
|
0b0aa36aab | ||
|
|
70ab102d8c | ||
|
|
1f24d936d8 | ||
|
|
f925ec8cbe | ||
|
|
b603481cf6 | ||
|
|
7dbce6037a | ||
|
|
b7f6ed4a74 | ||
|
|
67bea7ab55 | ||
|
|
346e90f62d | ||
|
|
53d4f44178 | ||
|
|
f3ab8f34ed | ||
|
|
276b79a748 | ||
|
|
ecff04424d | ||
|
|
b02a563519 | ||
|
|
54990868c3 | ||
|
|
6a29fb2bf9 | ||
|
|
7b3d65feca | ||
|
|
9230be87d4 | ||
|
|
3f87d64e54 | ||
|
|
10ddb5f361 | ||
|
|
6bde30ceb7 | ||
|
|
e15b6e7cff | ||
|
|
85dc6385cd | ||
|
|
94d245246c | ||
|
|
d79ec83817 | ||
|
|
f19dfe9d70 | ||
|
|
b47f40eb07 | ||
|
|
e38d2a8380 | ||
|
|
2220af3ac4 | ||
|
|
fd69241de9 | ||
|
|
47e723c557 | ||
|
|
48bf88f99d | ||
|
|
289ab44ed5 | ||
|
|
8ec465319b | ||
|
|
53f66308d4 | ||
|
|
2658c1f52e | ||
|
|
f92a988612 | ||
|
|
fc015f0bee | ||
|
|
29bf181a08 | ||
|
|
4c244e836b | ||
|
|
5ac7fa5eca | ||
|
|
7683fdb9cb | ||
|
|
d621b5a77e | ||
|
|
49b9d1ec82 | ||
|
|
04cfec3213 | ||
|
|
4b4623fea1 | ||
|
|
1b7f4deeac | ||
|
|
1462402519 | ||
|
|
5edf70103f | ||
|
|
9ba11e2474 | ||
|
|
02cb07f170 | ||
|
|
8d72ca84cc | ||
|
|
8e63016f45 | ||
|
|
ab952d7002 | ||
|
|
b24671c2b9 | ||
|
|
12a93fea24 | ||
|
|
609bf18be8 | ||
|
|
5de22ae9ae | ||
|
|
9f4110a3d5 | ||
|
|
a1da82a173 | ||
|
|
f1456190b5 | ||
|
|
03bb94da23 | ||
|
|
5aa574bc71 | ||
|
|
99c0291b0e | ||
|
|
89c195d96b | ||
|
|
86f3fffa91 | ||
|
|
e191362c4f | ||
|
|
8c0cff0c65 | ||
|
|
db31238b00 | ||
|
|
c18b730d7c | ||
|
|
7ad85f6ffb | ||
|
|
45a79624b1 | ||
|
|
65dde8bc97 | ||
|
|
83dce4d8d2 | ||
|
|
6680326392 | ||
|
|
cc222034cb | ||
|
|
5b0250ee74 | ||
|
|
eb52f3b902 | ||
|
|
9add64ae8d | ||
|
|
20c5aadefe | ||
|
|
34896a805e | ||
|
|
722b488795 | ||
|
|
228a3f67e1 | ||
|
|
fe5457ef30 | ||
|
|
b747bb217a | ||
|
|
4fc0a93a1f | ||
|
|
ecd73dcc2c | ||
|
|
7f43c4377c | ||
|
|
ab998e87f8 | ||
|
|
6c53aaf67f | ||
|
|
adcc922b80 | ||
|
|
9400984d22 | ||
|
|
93bef0d16a | ||
|
|
db97d48f9d | ||
|
|
63d5520c0b | ||
|
|
4cddf6ab78 | ||
|
|
b6e97c4261 | ||
|
|
a2750c8aff | ||
|
|
2c0372f680 | ||
|
|
2dceb8927c | ||
|
|
e5cf2161d4 | ||
|
|
b2bae64215 | ||
|
|
552dc254da | ||
|
|
dc51afdc60 | ||
|
|
3f293190cf | ||
|
|
7f299869c5 | ||
|
|
c45805e703 | ||
|
|
d062d8081a | ||
|
|
5955ecefd3 | ||
|
|
0d25d83651 | ||
|
|
1957b6aa12 | ||
|
|
4fa173f0f5 | ||
|
|
fed3bcd79d | ||
|
|
dda1f18f67 | ||
|
|
025386af53 | ||
|
|
bd1ea41c0d | ||
|
|
5d729c1e8d | ||
|
|
1fac4c59a3 | ||
|
|
0e9296913c | ||
|
|
4307b99dd4 | ||
|
|
aedbc4bf1d | ||
|
|
50d379d94d | ||
|
|
d6a4149175 | ||
|
|
60151e4bca | ||
|
|
32340efa52 | ||
|
|
5182dea970 | ||
|
|
b4a050a986 | ||
|
|
e3be5e4173 | ||
|
|
5a0669d437 | ||
|
|
0d29d94800 | ||
|
|
1e667946b3 | ||
|
|
c6a4bf69ee | ||
|
|
5d0cfc3599 | ||
|
|
2424afa1fb | ||
|
|
69944a2b63 | ||
|
|
0ceb58a105 | ||
|
|
5e8da856e7 | ||
|
|
ee412e1994 | ||
|
|
02736524bd | ||
|
|
772343ae5f | ||
|
|
c357b97b3b | ||
|
|
dbe7251c6b | ||
|
|
7ae90f655c | ||
|
|
669ce6dfbb | ||
|
|
4dc55e5594 | ||
|
|
4b824f7a4c | ||
|
|
5063d94b1c | ||
|
|
4b9db2538c | ||
|
|
326f225777 | ||
|
|
3435132e87 | ||
|
|
d49b15b2a0 | ||
|
|
0c59553b3d | ||
|
|
4a50192937 | ||
|
|
f65ab00250 | ||
|
|
f71c3af2e1 | ||
|
|
77fb9e3d3e | ||
|
|
c1d6674797 | ||
|
|
659aaba0b9 | ||
|
|
a3816f6355 | ||
|
|
4829f040c2 | ||
|
|
59826f5189 | ||
|
|
a6fac9e56a | ||
|
|
8c4b628e06 | ||
|
|
68f0ef1bd2 | ||
|
|
d53882a086 | ||
|
|
7c7306d37b | ||
|
|
d5a9938354 | ||
|
|
3fad378b69 | ||
|
|
afb47344c6 | ||
|
|
5ba7e1d08b | ||
|
|
681347e933 | ||
|
|
f1bf8a0f1a | ||
|
|
874b41cb46 | ||
|
|
d3876b6376 | ||
|
|
f72f2bdf5d | ||
|
|
af91e17b13 | ||
|
|
69bfd8f54d | ||
|
|
369c3b569c | ||
|
|
8480e656b9 | ||
|
|
fb29324905 | ||
|
|
ed88633712 | ||
|
|
cd456f80a4 | ||
|
|
6d61515e28 | ||
|
|
38af936e3f | ||
|
|
d59f5ddc59 | ||
|
|
15cadaba1d | ||
|
|
cd658db38a | ||
|
|
b145a34400 | ||
|
|
08c2861457 | ||
|
|
6c07c5006a | ||
|
|
b39c366a06 | ||
|
|
bb73e87a2a | ||
|
|
43a46784f2 | ||
|
|
9baf5f8cea | ||
|
|
b78d492eb6 | ||
|
|
ed04322aef | ||
|
|
c995cba022 | ||
|
|
4ab7014e01 | ||
|
|
e9ec24dd80 | ||
|
|
fc818bc0bb | ||
|
|
450d95566a | ||
|
|
d4d060a500 | ||
|
|
55e43761e9 | ||
|
|
b1edaa1408 | ||
|
|
d8d9762998 | ||
|
|
dd93284062 | ||
|
|
19c76fc741 | ||
|
|
0e3410c23e | ||
|
|
1013455b0f | ||
|
|
066e4380e1 | ||
|
|
55da9df2a1 | ||
|
|
4b26c57a20 | ||
|
|
d0491dd68a | ||
|
|
cd8cc34c31 | ||
|
|
0249ebf718 | ||
|
|
7fb4eeb998 | ||
|
|
0cd7313523 | ||
|
|
5c3fc2a6ba | ||
|
|
19f888061f | ||
|
|
4e8a02be7d | ||
|
|
2231062c19 | ||
|
|
94ea502b23 | ||
|
|
e6a78bf230 | ||
|
|
fb4faa15bb | ||
|
|
e6d05926dd | ||
|
|
ca9f18325c | ||
|
|
03da91edfb | ||
|
|
bd96ae5a48 | ||
|
|
cf1cc2ca49 | ||
|
|
66106ce48d | ||
|
|
c057589899 | ||
|
|
bbaaa91575 | ||
|
|
41b21c81a0 | ||
|
|
44842d3221 | ||
|
|
d9c7665aca | ||
|
|
565b79d1b2 | ||
|
|
f30dc7dcd9 | ||
|
|
e4cdf515c9 | ||
|
|
ad3463cbc4 | ||
|
|
db733bced6 | ||
|
|
7aa71a7201 | ||
|
|
6fe55661ed | ||
|
|
af89efcfc4 | ||
|
|
82493c596d | ||
|
|
5a3fbf33df | ||
|
|
5bed0f3bcc | ||
|
|
87f6ff7be6 | ||
|
|
fa56996e10 | ||
|
|
b867cdb8b9 | ||
|
|
3bac32e04a | ||
|
|
c4c0f45228 | ||
|
|
d981bb95b9 | ||
|
|
c9f0a59339 | ||
|
|
ec58e868fd | ||
|
|
aa5152ac70 | ||
|
|
2cc627e7d0 | ||
|
|
8653e7bbb1 | ||
|
|
4fb7430fb7 | ||
|
|
e90c8c4d3e | ||
|
|
06e6deae42 | ||
|
|
38fe99f10e | ||
|
|
05ab62f038 | ||
|
|
168011586b | ||
|
|
b5f1e566b2 | ||
|
|
9b6fb2f382 | ||
|
|
24bb2428e7 | ||
|
|
75ba33abc0 | ||
|
|
ff54629550 | ||
|
|
b492c7ae27 | ||
|
|
5d04f93a88 | ||
|
|
5651d1b023 | ||
|
|
6822e3f5b8 | ||
|
|
3cbb02f9fb | ||
|
|
0f79298c28 | ||
|
|
8f4bd09635 | ||
|
|
0a9cad2ea6 | ||
|
|
dc21adfda5 | ||
|
|
a7bfe18f4a | ||
|
|
209f0902c9 | ||
|
|
9cc76a148b | ||
|
|
1d95a255bc | ||
|
|
3f8d412d1c | ||
|
|
b2c35d45c3 | ||
|
|
35ab90e445 | ||
|
|
9bfb5216f9 | ||
|
|
b10656294e | ||
|
|
316f4d471f | ||
|
|
ef0b56eb22 | ||
|
|
e640042e5d | ||
|
|
2c0d2c5e22 | ||
|
|
9eed39c2ae | ||
|
|
e8d89b6c43 | ||
|
|
494c3ffbc4 | ||
|
|
40d27c787c | ||
|
|
2fe5b44698 | ||
|
|
5cc32b9001 | ||
|
|
d481af43c7 | ||
|
|
1cd43f938f | ||
|
|
528f5295c2 | ||
|
|
aaedeea870 | ||
|
|
c684c32abe | ||
|
|
34df9cca2c | ||
|
|
f071ddf9da | ||
|
|
f49d3757df | ||
|
|
c678b53d3f | ||
|
|
ea30cc7d19 | ||
|
|
4fb1ee1201 | ||
|
|
2a35f5c879 | ||
|
|
a2772d09f3 | ||
|
|
a0016f001c | ||
|
|
ca532f271f | ||
|
|
15affd4701 | ||
|
|
89402fd097 | ||
|
|
75451743aa | ||
|
|
b4d9a6a507 | ||
|
|
335afa56a1 | ||
|
|
485592bdac | ||
|
|
ee9289fc24 | ||
|
|
a0c281a0a9 | ||
|
|
ad0b0858f6 | ||
|
|
c2191872ac | ||
|
|
5f361413bb | ||
|
|
3414026828 | ||
|
|
7089fae0d5 | ||
|
|
80bdf1e19c | ||
|
|
e0c1f2a31a | ||
|
|
92cfa2b033 | ||
|
|
877cd5968c | ||
|
|
b39464a7d1 | ||
|
|
52332e5821 | ||
|
|
7f2c7685b4 | ||
|
|
7e80a60e65 | ||
|
|
44544020ec | ||
|
|
3b9d3fd233 | ||
|
|
4e2d2ee378 | ||
|
|
7aafa8b150 | ||
|
|
6d9a59c60b | ||
|
|
39e0977231 | ||
|
|
f8f140090f | ||
|
|
f063f7b2d3 | ||
|
|
60306f146f | ||
|
|
3b873b7cb2 | ||
|
|
26d44ea030 | ||
|
|
b369751a75 | ||
|
|
6e2cd81c9f | ||
|
|
e953bd40eb | ||
|
|
233ae99d3f | ||
|
|
ddca5ef25a | ||
|
|
ae88f286a6 | ||
|
|
25af0c4302 | ||
|
|
96b398867b | ||
|
|
97d1c49a3c | ||
|
|
e83dfd3d5a | ||
|
|
1142af853d | ||
|
|
4d502fe073 | ||
|
|
b022333df1 | ||
|
|
725b2188aa | ||
|
|
1f20d19aea | ||
|
|
ec9f91519d | ||
|
|
ae4e3e2d33 | ||
|
|
b931493d2f | ||
|
|
7b0c07533b | ||
|
|
33f0d64971 | ||
|
|
d10592a397 | ||
|
|
641937f952 | ||
|
|
b5ed309405 | ||
|
|
9bfbd7c953 | ||
|
|
57924afa3f | ||
|
|
76f11099b7 | ||
|
|
efcf802682 | ||
|
|
b095840dc8 | ||
|
|
5f9370da9a | ||
|
|
7a6eb08e53 | ||
|
|
865c3f28d5 | ||
|
|
d5916f3bc3 | ||
|
|
3ce870fb19 | ||
|
|
a575284bfe | ||
|
|
89d79fdc65 | ||
|
|
05c0fd2f40 | ||
|
|
bc3c2c46a8 | ||
|
|
ae0d41dfc3 | ||
|
|
8e2c05458c | ||
|
|
3d69e9c763 | ||
|
|
9f5a0ca4e9 | ||
|
|
43245681fe | ||
|
|
9d214a77d7 | ||
|
|
5134aca723 | ||
|
|
40405332ec | ||
|
|
8d61f3b479 | ||
|
|
bd15287420 | ||
|
|
5dfc3fd576 | ||
|
|
1e80bdf19f | ||
|
|
76cd7ba8d1 | ||
|
|
bee5473e98 | ||
|
|
fbbffb2467 | ||
|
|
1dfa0d08de | ||
|
|
1fc9c82aaf | ||
|
|
600a2b5ad7 | ||
|
|
cb60556ac0 | ||
|
|
62f683b871 | ||
|
|
f22d32c15e | ||
|
|
a3d8586199 | ||
|
|
0a471441cc | ||
|
|
73149123b4 | ||
|
|
5c6f2171f4 | ||
|
|
fd973038bb | ||
|
|
b7dff91d01 | ||
|
|
e314d199f0 | ||
|
|
3938c199f6 | ||
|
|
962eef4a1d | ||
|
|
97443a86cb | ||
|
|
7137616224 | ||
|
|
444825a5c1 | ||
|
|
986deaa6c7 | ||
|
|
7b27903de2 | ||
|
|
de42011d3e | ||
|
|
7e80d90fb5 | ||
|
|
c0398e9ad9 | ||
|
|
bbadf6795e | ||
|
|
8b9be6eafe | ||
|
|
da336ea412 | ||
|
|
f1cf95d412 | ||
|
|
6642a3e9ad | ||
|
|
49db7773e8 | ||
|
|
9372819fb8 | ||
|
|
9d07d81551 | ||
|
|
3c9bcf05e2 | ||
|
|
3338da2a91 | ||
|
|
8406248a1b | ||
|
|
b31858a64f | ||
|
|
8f2a8dc9ba | ||
|
|
44e54cd4df | ||
|
|
36c41557ea | ||
|
|
d0d72101ab | ||
|
|
7b41d65fa6 | ||
|
|
5f9000db92 | ||
|
|
de031b1ddb | ||
|
|
58f46bb75f | ||
|
|
d1e07ec0a2 | ||
|
|
0d4716f3b4 | ||
|
|
9ddfd650dd | ||
|
|
cf9cda4936 | ||
|
|
eb2ad92bf7 | ||
|
|
60a834d742 | ||
|
|
0e0902df05 | ||
|
|
1880c32f90 | ||
|
|
6d72c08d63 | ||
|
|
95ac1b2c21 | ||
|
|
a33fd45136 | ||
|
|
c3d879aec9 | ||
|
|
4e43d2a96b | ||
|
|
d68c8fe72c | ||
|
|
c9d0619289 | ||
|
|
8ea33946c4 | ||
|
|
bef7394004 | ||
|
|
4042bf042e | ||
|
|
643b698c30 | ||
|
|
aba3e3985a | ||
|
|
91f679f762 | ||
|
|
3eeed507cc | ||
|
|
988e1d6e30 | ||
|
|
04b4aabcf6 | ||
|
|
d97fe47206 | ||
|
|
0d8748a6ce | ||
|
|
b360a39fcf | ||
|
|
70b071fa26 | ||
|
|
64badb2cb7 | ||
|
|
3da6634242 | ||
|
|
4b8d072854 | ||
|
|
a1ea393f35 | ||
|
|
d1920621fa | ||
|
|
8dad252e3c | ||
|
|
5ea22cf1fa | ||
|
|
32abd991e7 | ||
|
|
3294f800be | ||
|
|
74e3dc2d7d | ||
|
|
a7a49a823b | ||
|
|
14c943adfe | ||
|
|
fb84b4b7c1 | ||
|
|
4089ee424c | ||
|
|
9bf010e222 | ||
|
|
0553fb6b79 | ||
|
|
4bb6a25055 | ||
|
|
3d06cfca31 | ||
|
|
82f43a362f | ||
|
|
f7eea51066 | ||
|
|
98c35c5291 | ||
|
|
33c1579e9c | ||
|
|
e482c2c318 | ||
|
|
5b387e7e17 | ||
|
|
c7d735bf56 | ||
|
|
1f4dbd0024 | ||
|
|
0921b733c2 | ||
|
|
cc597a8e95 | ||
|
|
c5ecc2bc15 | ||
|
|
18842dd47d | ||
|
|
ee1e464d4d | ||
|
|
682c7bc08f | ||
|
|
7618b0254f | ||
|
|
c2c4efebb2 | ||
|
|
9b7c8d26b5 | ||
|
|
f91f074463 | ||
|
|
40c7347c8e | ||
|
|
5e18514b7a | ||
|
|
6d15066dff | ||
|
|
90340da42e | ||
|
|
bdb91a6737 | ||
|
|
ff321ac908 | ||
|
|
3206a7cab4 | ||
|
|
fb78adb49a | ||
|
|
f47c1a5e43 | ||
|
|
1b1add315a | ||
|
|
edde55fedf | ||
|
|
dc81071c58 | ||
|
|
f6093f483c | ||
|
|
fde88e437b | ||
|
|
eb5ce3e05d | ||
|
|
8ba04a98be | ||
|
|
62634c0fe0 | ||
|
|
6161fb10af | ||
|
|
4b4fc8e9ee | ||
|
|
f35f1550e8 | ||
|
|
e422f64b8b | ||
|
|
ed143414ca | ||
|
|
f9c48f5edf |
12
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Create a report to help fix an issue.
|
||||||
|
---
|
||||||
|
|
||||||
|
**Platform**: *Android/iOS/Mac/Windows/Linux*
|
||||||
|
|
||||||
|
**Build**: *The build number under the title in the main menu. Required.*
|
||||||
|
|
||||||
|
**Issue**: *Explain your issue in detail.*
|
||||||
|
|
||||||
|
**Steps to reproduce**: *How you happened across the issue, and what you were doing at the time.*
|
||||||
7
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
name: Feature request
|
||||||
|
about: Suggest an idea for this project
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Do not make a new issue for feature requests!** Instead, post it on FeatHub: https://feathub.com/Anuken/Mindustry
|
||||||
85
.github/Mindustry-CodeStyle-IJ.xml
vendored
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
<code_scheme name="Default" version="173">
|
||||||
|
<option name="AUTODETECT_INDENTS" value="false" />
|
||||||
|
<option name="RIGHT_MARGIN" value="300" />
|
||||||
|
<GroovyCodeStyleSettings>
|
||||||
|
<option name="SPACE_BEFORE_CLOSURE_LBRACE" value="false" />
|
||||||
|
</GroovyCodeStyleSettings>
|
||||||
|
<JavaCodeStyleSettings>
|
||||||
|
<option name="SPACE_AROUND_TYPE_BOUNDS_IN_TYPE_PARAMETERS" value="false" />
|
||||||
|
<option name="INSERT_INNER_CLASS_IMPORTS" value="true" />
|
||||||
|
<option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="1" />
|
||||||
|
<option name="NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND" value="2" />
|
||||||
|
<option name="PACKAGES_TO_USE_IMPORT_ON_DEMAND">
|
||||||
|
<value>
|
||||||
|
<package name="java.awt" withSubpackages="false" static="false" />
|
||||||
|
<package name="mindustry" withSubpackages="false" static="true" />
|
||||||
|
<package name="javax.swing" withSubpackages="false" static="false" />
|
||||||
|
</value>
|
||||||
|
</option>
|
||||||
|
<option name="JD_ALIGN_PARAM_COMMENTS" value="false" />
|
||||||
|
<option name="JD_ALIGN_EXCEPTION_COMMENTS" value="false" />
|
||||||
|
<option name="JD_ADD_BLANK_AFTER_DESCRIPTION" value="false" />
|
||||||
|
<option name="JD_DO_NOT_WRAP_ONE_LINE_COMMENTS" value="true" />
|
||||||
|
<option name="JD_KEEP_EMPTY_PARAMETER" value="false" />
|
||||||
|
<option name="JD_KEEP_EMPTY_EXCEPTION" value="false" />
|
||||||
|
<option name="JD_KEEP_EMPTY_RETURN" value="false" />
|
||||||
|
</JavaCodeStyleSettings>
|
||||||
|
<Properties>
|
||||||
|
<option name="SPACES_AROUND_KEY_VALUE_DELIMITER" value="true" />
|
||||||
|
<option name="KEEP_BLANK_LINES" value="true" />
|
||||||
|
</Properties>
|
||||||
|
<codeStyleSettings language="Groovy">
|
||||||
|
<option name="SPACE_BEFORE_IF_PARENTHESES" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_WHILE_PARENTHESES" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_FOR_PARENTHESES" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_TRY_PARENTHESES" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_CATCH_PARENTHESES" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_SWITCH_PARENTHESES" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_SYNCHRONIZED_PARENTHESES" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_CLASS_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_METHOD_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_IF_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_ELSE_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_WHILE_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_FOR_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_DO_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_SWITCH_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_TRY_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_CATCH_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_FINALLY_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_SYNCHRONIZED_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_ELSE_KEYWORD" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_WHILE_KEYWORD" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_CATCH_KEYWORD" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_FINALLY_KEYWORD" value="false" />
|
||||||
|
</codeStyleSettings>
|
||||||
|
<codeStyleSettings language="JAVA">
|
||||||
|
<option name="SPACE_AFTER_TYPE_CAST" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_IF_PARENTHESES" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_WHILE_PARENTHESES" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_FOR_PARENTHESES" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_TRY_PARENTHESES" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_CATCH_PARENTHESES" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_SWITCH_PARENTHESES" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_SYNCHRONIZED_PARENTHESES" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_CLASS_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_METHOD_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_IF_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_ELSE_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_WHILE_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_FOR_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_DO_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_SWITCH_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_TRY_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_CATCH_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_FINALLY_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_SYNCHRONIZED_LBRACE" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_ELSE_KEYWORD" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_WHILE_KEYWORD" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_CATCH_KEYWORD" value="false" />
|
||||||
|
<option name="SPACE_BEFORE_FINALLY_KEYWORD" value="false" />
|
||||||
|
<indentOptions>
|
||||||
|
<option name="CONTINUATION_INDENT_SIZE" value="0" />
|
||||||
|
</indentOptions>
|
||||||
|
</codeStyleSettings>
|
||||||
|
</code_scheme>
|
||||||
17
.github/workflows/gradle.yml
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
name: Java CI
|
||||||
|
|
||||||
|
on: [push]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v1
|
||||||
|
- name: Set up JDK 1.8
|
||||||
|
uses: actions/setup-java@v1
|
||||||
|
with:
|
||||||
|
java-version: 1.8
|
||||||
|
#- name: Run unit tests with gradle
|
||||||
|
# run: ./gradlew test
|
||||||
23
.gitignore
vendored
@@ -4,6 +4,7 @@ logs/
|
|||||||
/core/assets/bundles/output/
|
/core/assets/bundles/output/
|
||||||
/core/assets/.gifimages/
|
/core/assets/.gifimages/
|
||||||
/deploy/
|
/deploy/
|
||||||
|
/out/
|
||||||
/desktop/packr-out/
|
/desktop/packr-out/
|
||||||
/desktop/packr-export/
|
/desktop/packr-export/
|
||||||
/desktop/mindustry-saves/
|
/desktop/mindustry-saves/
|
||||||
@@ -19,21 +20,26 @@ logs/
|
|||||||
/tools/build/
|
/tools/build/
|
||||||
/tests/build/
|
/tests/build/
|
||||||
/server/build/
|
/server/build/
|
||||||
|
changelog
|
||||||
|
saves/
|
||||||
|
core/assets/saves/
|
||||||
|
/core/assets/saves/
|
||||||
|
steam_appid.txt
|
||||||
/test_files/
|
/test_files/
|
||||||
/annotations/build/
|
/annotations/build/
|
||||||
/desktop-sdl/build/
|
|
||||||
desktop-sdl/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
|
/core/assets/locales
|
||||||
/ios/src/io/anuke/mindustry/gen/
|
/ios/src/mindustry/gen/
|
||||||
/core/src/io/anuke/mindustry/gen/
|
/core/src/mindustry/gen/
|
||||||
ios/robovm.properties
|
ios/robovm.properties
|
||||||
packr-out/
|
packr-out/
|
||||||
config/
|
config/
|
||||||
|
changelog
|
||||||
*.gif
|
*.gif
|
||||||
|
/core/assets/saves/
|
||||||
|
|
||||||
version.properties
|
version.properties
|
||||||
|
|
||||||
@@ -49,15 +55,6 @@ crash-report-*
|
|||||||
## Robovm
|
## Robovm
|
||||||
/ios/robovm-build/
|
/ios/robovm-build/
|
||||||
|
|
||||||
## GWT
|
|
||||||
/html/war/
|
|
||||||
/html/gwt-unitCache/
|
|
||||||
.apt_generated/
|
|
||||||
.gwt/
|
|
||||||
gwt-unitCache/
|
|
||||||
www-test/
|
|
||||||
.gwt-tmp/
|
|
||||||
|
|
||||||
## Android Studio and Intellij and Android in general
|
## Android Studio and Intellij and Android in general
|
||||||
/android/libs/armeabi/
|
/android/libs/armeabi/
|
||||||
/android/libs/armeabi-v7a/
|
/android/libs/armeabi-v7a/
|
||||||
|
|||||||
21
.travis.yml
@@ -1,11 +1,25 @@
|
|||||||
jdk:
|
jdk:
|
||||||
- openjdk8
|
- openjdk8
|
||||||
|
dist: trusty
|
||||||
|
android:
|
||||||
|
components:
|
||||||
|
- android-29
|
||||||
|
- build-tools-29.0.2
|
||||||
|
|
||||||
script:
|
script:
|
||||||
|
- git clone --depth=1 --branch=master https://github.com/Anuken/MindustryBuilds ../MindustryBuilds
|
||||||
|
- cd ../MindustryBuilds
|
||||||
|
- echo ${TRAVIS_TAG}
|
||||||
|
- if [ -n "$TRAVIS_TAG" ]; then echo versionName=5-fdroid-${TRAVIS_TAG:1}$'\n'versionCode=${TRAVIS_TAG:1} > version_fdroid.txt; git add .; git commit -m "Updating to build ${TRAVIS_TAG}"; fi
|
||||||
|
- git tag ${TRAVIS_BUILD_NUMBER}
|
||||||
|
- git config --global user.name "Build Uploader"
|
||||||
|
- if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then git push https://Anuken:${GH_PUSH_TOKEN}@github.com/Anuken/MindustryBuilds ${TRAVIS_BUILD_NUMBER}; git push https://Anuken:${GH_PUSH_TOKEN}@github.com/Anuken/MindustryBuilds; fi
|
||||||
|
- cd ../Mindustry
|
||||||
- git clone --depth=1 --branch=master https://github.com/Anuken/Arc ../Arc
|
- git clone --depth=1 --branch=master https://github.com/Anuken/Arc ../Arc
|
||||||
|
- if [ -n "$TRAVIS_TAG" ]; then cd ../Arc; git tag ${TRAVIS_TAG}; git push https://Anuken:${GH_PUSH_TOKEN}@github.com/Anuken/Arc ${TRAVIS_TAG}; cd ../Mindustry; fi
|
||||||
- "./gradlew test"
|
- "./gradlew test"
|
||||||
- "./gradlew desktop:dist -Pbuildversion=${TRAVIS_TAG:1}"
|
- "./gradlew desktop:dist -Pbuildversion=${TRAVIS_TAG:1}"
|
||||||
- "./gradlew server:dist -Pbuildversion=${TRAVIS_TAG:1}"
|
- "./gradlew server:dist -Pbuildversion=${TRAVIS_TAG:1}"
|
||||||
|
|
||||||
deploy:
|
deploy:
|
||||||
- provider: releases
|
- provider: releases
|
||||||
skip_cleanup: true
|
skip_cleanup: true
|
||||||
@@ -13,7 +27,7 @@ deploy:
|
|||||||
api_key:
|
api_key:
|
||||||
secure: Cv5wFtWt62/A24EvSEQvMow7gKPbZ3oATEFPuSghhB2TQz1dA40Zee3Qvk4LFlpLrhYo4K0ZSczCZRGpR+hCd8+Dpww52bheYEvWuh3ZQfvu/fXtEx2j5PwP1qMpmIgSxETV/gkD7l9FImdh0VzktYiAvQfmi0bEocG9/D4QwjFpNat7iwBdcMiw1MvAygpdIWRsjiw0RKlB2mWarmoHhQ7Gu7qlU3j50uaEvcrtmU0pBUPggNQwQRv32i9NPvNFxrqqlUjDLIS8JFea99zCkp8BwYqbEvBIMzd+Qip1/stLJJA3+cDUClbsDtg8rAVetzpOrdLEEBmqShFe5MDl2yEHcsgpN9CFsyTaUfvB3P3rVjizvycMm42IsUkXQiarm5xTQ/TIA8Rd8AHiSKuweNCg1Fd5SFaRtKy8JVLXuxyfUccmyje6hhz2L4lS2Wfj3mAG7sqZUCXhWP79EKdGkiPOjKv4CwXEKmuH3BMVqPlNUZJr9Eg3sV1FG0h2l+MVOOnR635qdUbb49sYojYxVruMLX0BH1c4ZCu230m8CUoWA1Em1QNI75ya7+9Y5T6AsgWDVpBvdUo9fWNbdp+VQ0GskFQsJD5wtnxbcbHeFiERAgGBm7z6qt9u9LrQpBH+dsW52ADvYsu3L4nQEa+sdMHwTTwmGY+iUvsxu0DqxGg=
|
secure: Cv5wFtWt62/A24EvSEQvMow7gKPbZ3oATEFPuSghhB2TQz1dA40Zee3Qvk4LFlpLrhYo4K0ZSczCZRGpR+hCd8+Dpww52bheYEvWuh3ZQfvu/fXtEx2j5PwP1qMpmIgSxETV/gkD7l9FImdh0VzktYiAvQfmi0bEocG9/D4QwjFpNat7iwBdcMiw1MvAygpdIWRsjiw0RKlB2mWarmoHhQ7Gu7qlU3j50uaEvcrtmU0pBUPggNQwQRv32i9NPvNFxrqqlUjDLIS8JFea99zCkp8BwYqbEvBIMzd+Qip1/stLJJA3+cDUClbsDtg8rAVetzpOrdLEEBmqShFe5MDl2yEHcsgpN9CFsyTaUfvB3P3rVjizvycMm42IsUkXQiarm5xTQ/TIA8Rd8AHiSKuweNCg1Fd5SFaRtKy8JVLXuxyfUccmyje6hhz2L4lS2Wfj3mAG7sqZUCXhWP79EKdGkiPOjKv4CwXEKmuH3BMVqPlNUZJr9Eg3sV1FG0h2l+MVOOnR635qdUbb49sYojYxVruMLX0BH1c4ZCu230m8CUoWA1Em1QNI75ya7+9Y5T6AsgWDVpBvdUo9fWNbdp+VQ0GskFQsJD5wtnxbcbHeFiERAgGBm7z6qt9u9LrQpBH+dsW52ADvYsu3L4nQEa+sdMHwTTwmGY+iUvsxu0DqxGg=
|
||||||
file:
|
file:
|
||||||
- desktop/build/libs/desktop-release.jar
|
- desktop/build/libs/Mindustry.jar
|
||||||
- server/build/libs/server-release.jar
|
- server/build/libs/server-release.jar
|
||||||
on:
|
on:
|
||||||
repo: Anuken/Mindustry
|
repo: Anuken/Mindustry
|
||||||
@@ -25,4 +39,5 @@ deploy:
|
|||||||
tags: true
|
tags: true
|
||||||
env:
|
env:
|
||||||
global:
|
global:
|
||||||
secure: TqlUl/ojjkCMVOGbCTKz7Cnr4F08UyWzY/CiJ0vvUOGJGZ1qm7XavAlDf5XT0egU4mvr37THubFO8vojbqmrmy0oZnYh3njKFA8axgyZ8PyKkjGHOfd0i6qyEWsOr9H90/2X8r3LwEeLaDFyHpu3wljIGBjweg53g2qwmDwCFa9UR80FJZ+xDB+rD6B3cXT0DTEkCoLZXLqXm0Y3HvBdSuBL1LR/FNb2BSxNq+tNLGiz1kdQZV5erausbbZypBoGxzz63xAnyz2kkFz73A8xQYVTzGbFodTPz7HM13GVZ5s43I03Y+HYyHBgBaSLziO2hi2kzVJccOwzBp7wS4fs1MqsFY5+IeWJ9k+hm89NiYT7+6zlEgoUMlIniny1qLqWTzx7btUeuC/y/h5TVBNgaV+z0jmHycHfeSyq5I+vmX4J8qe3wmaN8TcdqYKU5nIznOTk3CM5Fzu0Bs9vkCkOxmormmcjMFW1RbdOLc/hpZWZggsBA88sNEAI8eq+r5QEeqzeCx8YKoZDjdrsqvgLMc3El3gS9oMGxkn0Y/TEcqs9Tc4BXtTkqIA68hD0DYzlAxYjVbbkAI9Hh9lHNvV3Dr/oCkGXQ/HflM143kj1L3tSBZpqeqQE2XhngB5nqpS3OZTmZbMTQ8qD2luU18yaTGMLF5tJS/fdKPRx0gQ1kL8=
|
- secure: TqlUl/ojjkCMVOGbCTKz7Cnr4F08UyWzY/CiJ0vvUOGJGZ1qm7XavAlDf5XT0egU4mvr37THubFO8vojbqmrmy0oZnYh3njKFA8axgyZ8PyKkjGHOfd0i6qyEWsOr9H90/2X8r3LwEeLaDFyHpu3wljIGBjweg53g2qwmDwCFa9UR80FJZ+xDB+rD6B3cXT0DTEkCoLZXLqXm0Y3HvBdSuBL1LR/FNb2BSxNq+tNLGiz1kdQZV5erausbbZypBoGxzz63xAnyz2kkFz73A8xQYVTzGbFodTPz7HM13GVZ5s43I03Y+HYyHBgBaSLziO2hi2kzVJccOwzBp7wS4fs1MqsFY5+IeWJ9k+hm89NiYT7+6zlEgoUMlIniny1qLqWTzx7btUeuC/y/h5TVBNgaV+z0jmHycHfeSyq5I+vmX4J8qe3wmaN8TcdqYKU5nIznOTk3CM5Fzu0Bs9vkCkOxmormmcjMFW1RbdOLc/hpZWZggsBA88sNEAI8eq+r5QEeqzeCx8YKoZDjdrsqvgLMc3El3gS9oMGxkn0Y/TEcqs9Tc4BXtTkqIA68hD0DYzlAxYjVbbkAI9Hh9lHNvV3Dr/oCkGXQ/HflM143kj1L3tSBZpqeqQE2XhngB5nqpS3OZTmZbMTQ8qD2luU18yaTGMLF5tJS/fdKPRx0gQ1kL8=
|
||||||
|
- secure: VEskj/0TVX2o7iUVXuVPysj/VSWmPhDl57SrT7/nBNN/P/8N5jFAvx8PMzG7qT0S5FzKxuV20psE4WylUGRKdeRtK7/QNBV7T3YqYYM6BUB1VeRpxe5hLxTeuBK3izglFO8DkdDqjUtzQSjzkoYT75ilROjhBrBUPhVek7UlbBHbaklPWYFXHnJmYS1FpZTdzqIj+Y0Gd1PSL2MzK4X74aAHl0qaDgsTwYwtKs7IAz+kFaTZBRpi9VjQHAFhDlkDR3jo9wQjH8/F6x0lCgV/FulSc37Okdb40sLFG98xcEA6gWh1NPMkz8CulUdVE7mj7SJNxLbNvoMNrWOVRjmEsn59p/9LiNC1F9ncFz9vjQjAmi7rMFFGHGxe5nn8cIAkpTvHQQkZoWHAA9SNJTDMMf09m2pRy/vvzx+a6NVxyC9iNrhLlnBg4gxAqRh0S6NU0uL+fuygKixn7rqlnb7KMT7bAbfcuV+dng6c8V7hYKDCh7sJbH8iJump1xkwoM7ecnU8fxJF/oKOr/fbk0Bfxu+Q9qYLrV1+DEdm93Vl2Thq+DBKmI66jRGSva6HeCLFo81PEiEjP1nLv75+kvVfOqVqJrZD1BrvoG2eWT/3hVLrN2kEIWWlpvQVC7FL11yWmYtAuOBh/vfhI76zKr+YTS6ccG9rqW4XeYjJytshe8M=
|
||||||
|
|||||||
69
CONTRIBUTING.md
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
# Contributing
|
||||||
|
|
||||||
|
This is for code contributions. For translations, see [TRANSLATING](TRANSLATING.md).
|
||||||
|
|
||||||
|
## Basic Guidelines
|
||||||
|
|
||||||
|
#### Use an IDE.
|
||||||
|
Specifically, IntelliJ IDEA. Download the (free) Community Edition of it [here](https://www.jetbrains.com/idea/download/). Some people use other tools, like VS Code, but I would personally not recommend them for Java development.
|
||||||
|
|
||||||
|
#### Always test your changes.
|
||||||
|
Do not submit something without at least running the game to see if it compiles.
|
||||||
|
If you are submitting a new block, make sure it has a name and description, and that it works correctly in-game. If you are changing existing block mechanics, test them out first.
|
||||||
|
|
||||||
|
|
||||||
|
#### Do not make large changes before discussing them first.
|
||||||
|
If you are interested in adding a large mechanic/feature or changing large amounts of code, first contact me (Anuken) via [Discord](https://discord.gg/mindustry) (preferred method) or via e-mail (*anukendev@gmail.com*).
|
||||||
|
For most changes, this should not be necessary. I just want to know if you're doing something big so I can offer advice and/or make sure you're not wasting your time on it.
|
||||||
|
|
||||||
|
|
||||||
|
## Style Guidelines
|
||||||
|
|
||||||
|
#### Follow the formatting guidelines.
|
||||||
|
This means:
|
||||||
|
- No spaces around parentheses: `if(condition){`, `SomeType s = (SomeType)object`
|
||||||
|
- Same-line braces.
|
||||||
|
- 4 spaces indentation
|
||||||
|
- `camelCase`, **even for constants or enums**. Why? Because `SCREAMING_CASE` is ugly, annoying to type and does not achieve anything useful. Constants are *less* dangerous than variables, not more.
|
||||||
|
- No underscores for anything. (Yes, I know `Bindings` violates this principle, but that's for legacy reasons and really should be cleaned up some day)
|
||||||
|
|
||||||
|
Import [this style file](.github/Mindustry-CodeStyle-IJ.xml) into IntelliJ to get correct formatting when developing Mindustry.
|
||||||
|
|
||||||
|
#### Do not use incompatible Java features (java.util.function, java.awt).
|
||||||
|
Android [does not support](https://developer.android.com/studio/write/java8-support#supported_features) many of Java 8's features, such as the packages `java.util.function`, `java.util.stream` or `forEach` in collections. Do not use these in your code.
|
||||||
|
If you need to use functional interfaces, use the ones in `arc.func`, which are more or less the same with different naming schemes.
|
||||||
|
|
||||||
|
The same applies to any class *outside* of the standard `java.[n]io` / `java.net` / `java.util` packages: Most of them are not supported.
|
||||||
|
`java.awt` is one of these packages: do not use it, ever. It is not supported on any platform, even desktop - the entire package is removed during JRE minimization.
|
||||||
|
In general, if you are using IntelliJ, you should be warned about platform incompatiblities.
|
||||||
|
|
||||||
|
|
||||||
|
#### Use `arc` collections and classes when possible.
|
||||||
|
Instead of using `java.util.List`, `java.util.HashMap`, and other standard Java collections, use `Array`, `ObjectMap` and other equivalents from `arc.struct`.
|
||||||
|
Why? Because that's what the rest of the codebase uses, and the standard collections have a lot of cruft and usability issues associated with them.
|
||||||
|
In the rare case that concurrency is required, you may use the standard Java classes for that purpose (e.g. `CopyOnWriteArrayList`).
|
||||||
|
|
||||||
|
What you'll usually need to change:
|
||||||
|
- `HashSet` -> `ObjectSet`
|
||||||
|
- `HashMap` -> `ObjectMap`
|
||||||
|
- `List` / `ArrayList` / `Stack` -> `Array`
|
||||||
|
- `java.util.Queue` -> `arc.struct.Queue`
|
||||||
|
- *Many others*
|
||||||
|
|
||||||
|
|
||||||
|
#### Avoid boxed types (Integer, Boolean)
|
||||||
|
Never create variables or collections with boxed types `Array<Integer>` or `ObjectMap<Integer, ...>`. Use the collections specialized for this task, e.g. `IntArray` and `IntMap`.
|
||||||
|
|
||||||
|
|
||||||
|
#### Do not allocate anything if possible.
|
||||||
|
Never allocate `new` objects in the main loop. If you absolutely require new objects, use `Pools` to obtain and free object instances.
|
||||||
|
Otherwise, use the `Tmp` variables for things like vector/shape operations, or create `static` variables for re-use.
|
||||||
|
If using a list, make it a static variable and clear it every time it is used. Re-use as much as possible.
|
||||||
|
|
||||||
|
#### Avoid bloated code and unnecessary getters/setters.
|
||||||
|
This is situational, but in essence what it means is to avoid using any sort of getters and setters unless absolutely necessary. Public or protected fields should suffice for most things.
|
||||||
|
If something needs to be encapsulated in the future, IntelliJ can handle it with a few clicks.
|
||||||
|
|
||||||
|
|
||||||
|
#### Do not create methods unless necessary.
|
||||||
|
Unless a block of code is very large or used in more than 1-2 places, don't split it up into a separate method. Making unnecessary methods only creates confusion, and may slightly decrease performance.
|
||||||
38
README.md
@@ -1,4 +1,4 @@
|
|||||||

|

|
||||||
|
|
||||||
[](https://travis-ci.org/Anuken/Mindustry)
|
[](https://travis-ci.org/Anuken/Mindustry)
|
||||||
[](https://discord.gg/mindustry)
|
[](https://discord.gg/mindustry)
|
||||||
@@ -6,14 +6,18 @@
|
|||||||
A sandbox tower defense game written in Java.
|
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](https://mindustrygame.github.io/wiki)_
|
||||||
|
|
||||||
|
### Contributing
|
||||||
|
|
||||||
|
See [CONTRIBUTING](CONTRIBUTING.md).
|
||||||
|
|
||||||
### Building
|
### Building
|
||||||
|
|
||||||
Bleeding-edge live builds are generated automatically for every commit. You can see them [here](https://jenkins.hellomouse.net/job/mindustry/).
|
Bleeding-edge live builds are generated automatically for every commit. You can see them [here](https://github.com/Anuken/MindustryBuilds/releases). Old builds might still be on [jenkins](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, `cd` to the Mindustry folder and run the following commands:
|
First, make sure you have [Java 8](https://www.java.com/en/download/) and [JDK 8](https://adoptopenjdk.net/) installed. Open a terminal in the root directory, `cd` to the Mindustry folder and run the following commands:
|
||||||
|
|
||||||
#### Windows
|
#### Windows
|
||||||
|
|
||||||
@@ -29,6 +33,13 @@ _Building:_ `./gradlew desktop:dist`
|
|||||||
|
|
||||||
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`.
|
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`.
|
||||||
|
|
||||||
|
#### Android
|
||||||
|
|
||||||
|
1. Install the Android SDK [here.](https://developer.android.com/studio#downloads) Make sure you're downloading the "Command line tools only", as Android Studio is not required.
|
||||||
|
2. Create a file named `local.properties` inside the Mindustry directory, with its contents looking like this: `sdk.dir=<Path to Android SDK you just downloaded, without these bracket>`. For example, if you're on Windows and installed the tools to C:\\tools, your local.properties would contain `sdk.dir=C:\\tools` (*note the double backslashes are required instead of single ones!*).
|
||||||
|
3. Run `gradlew android:assembleDebug` (or `./gradlew` if on linux/mac). This will create an unsigned APK in `android/build/outputs/apk`.
|
||||||
|
4. (Optional) To debug the application on a connected phone, do `gradlew android:installDebug android:run`. It is **highly recommended** to use IntelliJ for this instead, however.
|
||||||
|
|
||||||
##### Troubleshooting
|
##### 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.*
|
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.*
|
||||||
@@ -36,10 +47,23 @@ If the terminal returns `Permission denied` or `Command not found` on Mac/Linux,
|
|||||||
---
|
---
|
||||||
|
|
||||||
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` for desktop builds, and in `/server/build/libs/server-release.jar` for server builds.
|
After building, the output .JAR file should be in `/desktop/build/libs/Mindustry.jar` for desktop builds, and in `/server/build/libs/server-release.jar` for server builds.
|
||||||
|
|
||||||
|
### Feature Requests
|
||||||
|
|
||||||
|
[](https://feathub.com/Anuken/Mindustry)
|
||||||
|
|
||||||
|
|
||||||
### Downloads
|
### Downloads
|
||||||
|
|
||||||
<a href="https://anuke.itch.io/mindustry"><img src="https://static.itch.io/images/badge.svg" width="auto" height="75"></a>
|
[<img src="https://static.itch.io/images/badge.svg"
|
||||||
|
alt="Get it on Itch.io"
|
||||||
|
height="60">](https://anuke.itch.io/mindustry)
|
||||||
|
|
||||||
<a href="https://play.google.com/store/apps/details?id=io.anuke.mindustry&hl=en"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/c/cd/Get_it_on_Google_play.svg/1280px-Get_it_on_Google_play.svg.png" width="auto" height="75"></a>
|
[<img src="https://play.google.com/intl/en_us/badges/images/generic/en-play-badge.png"
|
||||||
|
alt="Get it on Google Play"
|
||||||
|
height="80">](https://play.google.com/store/apps/details?id=io.anuke.mindustry)
|
||||||
|
|
||||||
|
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
|
||||||
|
alt="Get it on F-Droid"
|
||||||
|
height="80">](https://f-droid.org/packages/io.anuke.mindustry/)
|
||||||
|
|||||||
@@ -31,6 +31,10 @@ There are two ways to test the translation bundle:
|
|||||||
1) Assuming you have the PC version downloaded, download your bundle file, name it `bundle.properties`, then place it in the same folder as the Mindustry desktop executable and run it. *You should get a popup message in-game confirming that you have loaded an external translation.*
|
1) Assuming you have the PC version downloaded, download your bundle file, name it `bundle.properties`, then place it in the same folder as the Mindustry desktop executable and run it. *You should get a popup message in-game confirming that you have loaded an external translation.*
|
||||||
2) For advanced users: simply download your fork of mindustry and compile/run the game.
|
2) For advanced users: simply download your fork of mindustry and compile/run the game.
|
||||||
|
|
||||||
|
#### Translating for stores (Steam, Google Play)
|
||||||
|
|
||||||
|
If you would like to translate the descriptions for Google Play or Steam, see the [Fastlane Metadata folder](https://github.com/Anuken/Mindustry/tree/master/fastlane/metadata) and submit a pull request for files there. On Google Play, you would create or edit the folder with the correct local code; for Steam, I have to update the translations manually, so just name the folder with the language name, and include the same files as the English folder does.
|
||||||
|
|
||||||
**And that's it.**
|
**And that's it.**
|
||||||
|
|
||||||
*(...of course, that's never really it. Bother me on Discord when something inevitably goes wrong.)*
|
*(...of course, that's never really it. Bother me on Discord when something inevitably goes wrong.)*
|
||||||
|
|||||||
@@ -13,12 +13,13 @@
|
|||||||
android:icon="@mipmap/ic_launcher"
|
android:icon="@mipmap/ic_launcher"
|
||||||
android:roundIcon="@mipmap/ic_launcher_round"
|
android:roundIcon="@mipmap/ic_launcher_round"
|
||||||
android:isGame="true"
|
android:isGame="true"
|
||||||
|
android:usesCleartextTraffic="true"
|
||||||
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"/>
|
<meta-data android:name="android.max_aspect" android:value="2.1"/>
|
||||||
<activity
|
<activity
|
||||||
android:name="io.anuke.mindustry.AndroidLauncher"
|
android:name="mindustry.android.AndroidLauncher"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:screenOrientation="user"
|
android:screenOrientation="user"
|
||||||
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout">
|
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout">
|
||||||
@@ -28,14 +29,6 @@
|
|||||||
<category android:name="android.intent.category.LAUNCHER"/>
|
<category android:name="android.intent.category.LAUNCHER"/>
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|
||||||
<intent-filter>
|
|
||||||
<action android:name="android.intent.action.VIEW"/>
|
|
||||||
<category android:name="android.intent.category.DEFAULT"/>
|
|
||||||
<category android:name="android.intent.category.BROWSABLE"/>
|
|
||||||
<data android:mimeType="application/octet-stream"/>
|
|
||||||
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.mmap"/>
|
|
||||||
</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"/>
|
||||||
@@ -43,21 +36,6 @@
|
|||||||
<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"
|
|
||||||
android:label="Mindustry Map"
|
|
||||||
android:priority="1">
|
|
||||||
<action android:name="android.intent.action.VIEW"/>
|
|
||||||
<category android:name="android.intent.category.DEFAULT"/>
|
|
||||||
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.mmap" android:mimeType="*/*"/>
|
|
||||||
</intent-filter>
|
|
||||||
|
|
||||||
<intent-filter>
|
|
||||||
<action android:name="android.intent.action.VIEW"/>
|
|
||||||
<category android:name="android.intent.category.DEFAULT"/>
|
|
||||||
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.msav" android:mimeType="*/*"/>
|
|
||||||
</intent-filter>
|
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
</application>
|
</application>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ buildscript{
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies{
|
dependencies{
|
||||||
classpath 'com.android.tools.build:gradle:3.4.2'
|
classpath 'com.android.tools.build:gradle:3.4.1'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -26,9 +26,9 @@ repositories{
|
|||||||
|
|
||||||
dependencies{
|
dependencies{
|
||||||
implementation project(":core")
|
implementation project(":core")
|
||||||
implementation project(":net")
|
|
||||||
|
|
||||||
implementation arcModule("backends:backend-android")
|
implementation arcModule("backends:backend-android")
|
||||||
|
implementation 'com.jakewharton.android.repackaged:dalvik-dx:9.0.0_r3'
|
||||||
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"
|
||||||
@@ -50,8 +50,8 @@ task deploy(type: Copy){
|
|||||||
}
|
}
|
||||||
|
|
||||||
android{
|
android{
|
||||||
buildToolsVersion '28.0.3'
|
buildToolsVersion '29.0.2'
|
||||||
compileSdkVersion 28
|
compileSdkVersion 29
|
||||||
sourceSets{
|
sourceSets{
|
||||||
main{
|
main{
|
||||||
manifest.srcFile 'AndroidManifest.xml'
|
manifest.srcFile 'AndroidManifest.xml'
|
||||||
@@ -70,27 +70,21 @@ android{
|
|||||||
}
|
}
|
||||||
|
|
||||||
defaultConfig{
|
defaultConfig{
|
||||||
def vfile = file('../core/assets/version.properties')
|
Properties props = loadVersionProps()
|
||||||
|
Integer vcode = props['androidBuildCode']?.toInteger() ?: 1
|
||||||
def code = 0
|
def versionNameResult = "$versionNumber-$versionType-${getBuildVersion().replace(" ", "-")}"
|
||||||
def versionNameResult = "unknown"
|
|
||||||
|
|
||||||
if(vfile.exists()){
|
|
||||||
def props = new Properties()
|
|
||||||
props.load(new FileInputStream(vfile))
|
|
||||||
|
|
||||||
code = (props['androidBuildCode'] == null ? 0 : props['androidBuildCode']).toInteger() + 1
|
|
||||||
|
|
||||||
props['androidBuildCode'] = code.toString()
|
|
||||||
props.store(vfile.newWriter(), "Autogenerated file. Do not modify.")
|
|
||||||
versionNameResult = "$versionNumber-$versionType-${props['build'].replace(" ", "-")}"
|
|
||||||
}
|
|
||||||
|
|
||||||
applicationId "io.anuke.mindustry"
|
applicationId "io.anuke.mindustry"
|
||||||
minSdkVersion 14
|
minSdkVersion 14
|
||||||
targetSdkVersion 28
|
targetSdkVersion 29
|
||||||
versionCode code
|
|
||||||
versionName versionNameResult
|
versionName versionNameResult
|
||||||
|
versionCode vcode
|
||||||
|
|
||||||
|
if(project.hasProperty("release")){
|
||||||
|
props['androidBuildCode'] = (vcode + 1).toString()
|
||||||
|
}
|
||||||
|
props.store(file('../core/assets/version.properties').newWriter(), null)
|
||||||
}
|
}
|
||||||
|
|
||||||
compileOptions{
|
compileOptions{
|
||||||
@@ -167,5 +161,5 @@ task run(type: Exec){
|
|||||||
}
|
}
|
||||||
|
|
||||||
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/mindustry.android.AndroidLauncher'
|
||||||
}
|
}
|
||||||
@@ -22,8 +22,8 @@
|
|||||||
-verbose
|
-verbose
|
||||||
-verbose
|
-verbose
|
||||||
-ignorewarnings
|
-ignorewarnings
|
||||||
-keep class io.anuke.mindustry.game.Rules
|
-keep class mindustry.game.Rules
|
||||||
-keep class io.anuke.mindustry.desktop.DesktopLauncher
|
-keep class mindustry.desktop.DesktopLauncher
|
||||||
-keepclasseswithmembers public class * {
|
-keepclasseswithmembers public class * {
|
||||||
public static void main(java.lang.String[]);
|
public static void main(java.lang.String[]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,34 +1,32 @@
|
|||||||
package io.anuke.mindustry;
|
package mindustry.android;
|
||||||
|
|
||||||
import android.Manifest;
|
import android.*;
|
||||||
import android.content.Context;
|
import android.app.*;
|
||||||
import android.content.Intent;
|
import android.content.*;
|
||||||
import android.content.pm.ActivityInfo;
|
import android.content.pm.*;
|
||||||
import android.content.pm.PackageManager;
|
import android.net.*;
|
||||||
import android.net.Uri;
|
import android.os.Build.*;
|
||||||
import android.os.Build;
|
import android.os.*;
|
||||||
import android.os.Bundle;
|
import android.provider.Settings.*;
|
||||||
import android.provider.Settings.Secure;
|
import android.telephony.*;
|
||||||
import android.telephony.TelephonyManager;
|
import arc.*;
|
||||||
import io.anuke.arc.Core;
|
import arc.backend.android.*;
|
||||||
import io.anuke.arc.backends.android.surfaceview.AndroidApplication;
|
import arc.files.*;
|
||||||
import io.anuke.arc.backends.android.surfaceview.AndroidApplicationConfiguration;
|
import arc.func.*;
|
||||||
import io.anuke.arc.files.FileHandle;
|
import arc.scene.ui.layout.*;
|
||||||
import io.anuke.arc.function.Consumer;
|
import arc.util.*;
|
||||||
import io.anuke.arc.function.Predicate;
|
import arc.util.serialization.*;
|
||||||
import io.anuke.arc.scene.ui.layout.UnitScl;
|
import mindustry.*;
|
||||||
import io.anuke.arc.util.Strings;
|
import mindustry.game.Saves.*;
|
||||||
import io.anuke.arc.util.serialization.Base64Coder;
|
import mindustry.io.*;
|
||||||
import io.anuke.mindustry.core.Platform;
|
import mindustry.ui.dialogs.*;
|
||||||
import io.anuke.mindustry.game.Saves.SaveSlot;
|
|
||||||
import io.anuke.mindustry.io.SaveIO;
|
|
||||||
import io.anuke.mindustry.net.*;
|
|
||||||
import io.anuke.mindustry.ui.dialogs.FileChooser;
|
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.util.ArrayList;
|
import java.lang.System;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
import static mindustry.Vars.*;
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.*;
|
|
||||||
|
|
||||||
public class AndroidLauncher extends AndroidApplication{
|
public class AndroidLauncher extends AndroidApplication{
|
||||||
public static final int PERMISSION_REQUEST_CODE = 1;
|
public static final int PERMISSION_REQUEST_CODE = 1;
|
||||||
@@ -39,10 +37,11 @@ public class AndroidLauncher extends AndroidApplication{
|
|||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState){
|
protected void onCreate(Bundle savedInstanceState){
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
|
if(doubleScaleTablets && isTablet(this.getContext())){
|
||||||
config.useImmersiveMode = true;
|
Scl.setAddition(0.5f);
|
||||||
config.depth = 0;
|
}
|
||||||
Platform.instance = new Platform(){
|
|
||||||
|
initialize(new ClientLauncher(){
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void hide(){
|
public void hide(){
|
||||||
@@ -68,12 +67,57 @@ public class AndroidLauncher extends AndroidApplication{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void requestExternalPerms(Runnable callback){
|
public org.mozilla.javascript.Context getScriptContext(){
|
||||||
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M || (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
|
return AndroidRhinoContext.enter(getContext().getCacheDir());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void shareFile(Fi file){
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void showFileChooser(boolean open, String extension, Cons<Fi> cons){
|
||||||
|
if(VERSION.SDK_INT >= VERSION_CODES.Q){
|
||||||
|
Intent intent = new Intent(open ? Intent.ACTION_OPEN_DOCUMENT : Intent.ACTION_CREATE_DOCUMENT);
|
||||||
|
intent.addCategory(Intent.CATEGORY_OPENABLE);
|
||||||
|
intent.setType(extension.equals("zip") ? "application/zip" : "*/*");
|
||||||
|
addResultListener(i -> startActivityForResult(intent, i), (code, in) -> {
|
||||||
|
if(code == Activity.RESULT_OK && in != null && in.getData() != null){
|
||||||
|
Uri uri = in.getData();
|
||||||
|
|
||||||
|
if(uri.getPath().contains("(invalid)")) return;
|
||||||
|
|
||||||
|
Core.app.post(() -> Core.app.post(() -> cons.get(new Fi(uri.getPath()){
|
||||||
|
@Override
|
||||||
|
public InputStream read(){
|
||||||
|
try{
|
||||||
|
return getContentResolver().openInputStream(uri);
|
||||||
|
}catch(IOException e){
|
||||||
|
throw new ArcRuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OutputStream write(boolean append){
|
||||||
|
try{
|
||||||
|
return getContentResolver().openOutputStream(uri);
|
||||||
|
}catch(IOException e){
|
||||||
|
throw new ArcRuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}else if(VERSION.SDK_INT >= 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)){
|
||||||
callback.run();
|
chooser = new FileChooser(open ? "$open" : "$save", file -> file.extension().equalsIgnoreCase(extension), open, file -> {
|
||||||
|
if(!open){
|
||||||
|
cons.get(file.parent().child(file.nameWithoutExtension() + "." + extension));
|
||||||
}else{
|
}else{
|
||||||
permCallback = callback;
|
cons.get(file);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
ArrayList<String> perms = new ArrayList<>();
|
ArrayList<String> perms = new ArrayList<>();
|
||||||
if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
|
if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
|
||||||
perms.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
|
perms.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
|
||||||
@@ -82,29 +126,8 @@ public class AndroidLauncher extends AndroidApplication{
|
|||||||
perms.add(Manifest.permission.READ_EXTERNAL_STORAGE);
|
perms.add(Manifest.permission.READ_EXTERNAL_STORAGE);
|
||||||
}
|
}
|
||||||
requestPermissions(perms.toArray(new String[0]), PERMISSION_REQUEST_CODE);
|
requestPermissions(perms.toArray(new String[0]), PERMISSION_REQUEST_CODE);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void shareFile(FileHandle file){
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void showFileChooser(String text, String content, Consumer<FileHandle> cons, boolean open, Predicate<String> filetype){
|
|
||||||
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 &&
|
|
||||||
checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)){
|
|
||||||
chooser.show();
|
|
||||||
chooser = null;
|
|
||||||
}else{
|
}else{
|
||||||
ArrayList<String> perms = new ArrayList<>();
|
super.showFileChooser(open, extension, cons);
|
||||||
if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
|
|
||||||
perms.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
|
|
||||||
}
|
|
||||||
if(checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
|
|
||||||
perms.add(Manifest.permission.READ_EXTERNAL_STORAGE);
|
|
||||||
}
|
|
||||||
requestPermissions(perms.toArray(new String[0]), PERMISSION_REQUEST_CODE);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -118,20 +141,12 @@ public class AndroidLauncher extends AndroidApplication{
|
|||||||
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER);
|
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
}, new AndroidApplicationConfiguration(){{
|
||||||
public boolean canDonate(){
|
useImmersiveMode = true;
|
||||||
return true;
|
depth = 0;
|
||||||
}
|
hideStatusBar = true;
|
||||||
};
|
//errorHandler = ModCrashHandler::handle;
|
||||||
|
}});
|
||||||
if(doubleScaleTablets && isTablet(this.getContext())){
|
|
||||||
UnitScl.dp.addition = 0.5f;
|
|
||||||
}
|
|
||||||
|
|
||||||
config.hideStatusBar = true;
|
|
||||||
Net.setClientProvider(new ArcNetClient());
|
|
||||||
Net.setServerProvider(new ArcNetServer());
|
|
||||||
initialize(new Mindustry(), config);
|
|
||||||
checkFiles(getIntent());
|
checkFiles(getIntent());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -172,20 +187,20 @@ public class AndroidLauncher extends AndroidApplication{
|
|||||||
Core.app.post(() -> Core.app.post(() -> {
|
Core.app.post(() -> Core.app.post(() -> {
|
||||||
if(save){ //open save
|
if(save){ //open save
|
||||||
System.out.println("Opening save.");
|
System.out.println("Opening save.");
|
||||||
FileHandle file = Core.files.local("temp-save." + saveExtension);
|
Fi 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.saves.importSave(file);
|
SaveSlot slot = control.saves.importSave(file);
|
||||||
ui.load.runLoadSave(slot);
|
ui.load.runLoadSave(slot);
|
||||||
}catch(IOException e){
|
}catch(IOException e){
|
||||||
ui.showError(Core.bundle.format("save.import.fail", Strings.parseException(e, true)));
|
ui.showException("$save.import.fail", e);
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
ui.showError("$save.import.invalid");
|
ui.showErrorMessage("$save.import.invalid");
|
||||||
}
|
}
|
||||||
}else if(map){ //open map
|
}else if(map){ //open map
|
||||||
FileHandle file = Core.files.local("temp-map." + mapExtension);
|
Fi file = Core.files.local("temp-map." + mapExtension);
|
||||||
file.write(inStream, false);
|
file.write(inStream, false);
|
||||||
Core.app.post(() -> {
|
Core.app.post(() -> {
|
||||||
System.out.println("Opening map.");
|
System.out.println("Opening map.");
|
||||||
227
android/src/mindustry/android/AndroidRhinoContext.java
Normal file
@@ -0,0 +1,227 @@
|
|||||||
|
package mindustry.android;
|
||||||
|
|
||||||
|
import android.annotation.*;
|
||||||
|
import android.os.*;
|
||||||
|
import android.os.Build.*;
|
||||||
|
import arc.*;
|
||||||
|
import arc.backend.android.*;
|
||||||
|
import com.android.dex.*;
|
||||||
|
import com.android.dx.cf.direct.*;
|
||||||
|
import com.android.dx.command.dexer.*;
|
||||||
|
import com.android.dx.dex.*;
|
||||||
|
import com.android.dx.dex.cf.*;
|
||||||
|
import com.android.dx.dex.file.DexFile;
|
||||||
|
import com.android.dx.merge.*;
|
||||||
|
import dalvik.system.*;
|
||||||
|
import org.mozilla.javascript.*;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.nio.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helps to prepare a Rhino Context for usage on android.
|
||||||
|
* @author F43nd1r
|
||||||
|
* @since 11.01.2016
|
||||||
|
*/
|
||||||
|
public class AndroidRhinoContext{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* call this instead of {@link Context#enter()}
|
||||||
|
* @return a context prepared for android
|
||||||
|
*/
|
||||||
|
public static Context enter(File cacheDirectory){
|
||||||
|
if(!SecurityController.hasGlobal())
|
||||||
|
SecurityController.initGlobal(new SecurityController(){
|
||||||
|
@Override
|
||||||
|
public GeneratedClassLoader createClassLoader(ClassLoader classLoader, Object o){
|
||||||
|
return Context.getCurrentContext().createClassLoader(classLoader);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getDynamicSecurityDomain(Object o){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
AndroidContextFactory factory;
|
||||||
|
if(!ContextFactory.hasExplicitGlobal()){
|
||||||
|
factory = new AndroidContextFactory(cacheDirectory);
|
||||||
|
ContextFactory.getGlobalSetter().setContextFactoryGlobal(factory);
|
||||||
|
}else if(!(ContextFactory.getGlobal() instanceof AndroidContextFactory)){
|
||||||
|
throw new IllegalStateException("Cannot initialize factory for Android Rhino: There is already another factory");
|
||||||
|
}else{
|
||||||
|
factory = (AndroidContextFactory)ContextFactory.getGlobal();
|
||||||
|
}
|
||||||
|
|
||||||
|
return factory.enterContext();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ensures that the classLoader used is correct
|
||||||
|
* @author F43nd1r
|
||||||
|
* @since 11.01.2016
|
||||||
|
*/
|
||||||
|
public static class AndroidContextFactory extends ContextFactory{
|
||||||
|
private final File cacheDirectory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new factory. It will cache generated code in the given directory
|
||||||
|
* @param cacheDirectory the cache directory
|
||||||
|
*/
|
||||||
|
public AndroidContextFactory(File cacheDirectory){
|
||||||
|
this.cacheDirectory = cacheDirectory;
|
||||||
|
initApplicationClassLoader(createClassLoader(AndroidContextFactory.class.getClassLoader()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a ClassLoader which is able to deal with bytecode
|
||||||
|
* @param parent the parent of the create classloader
|
||||||
|
* @return a new ClassLoader
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public BaseAndroidClassLoader createClassLoader(ClassLoader parent){
|
||||||
|
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
|
||||||
|
return new InMemoryAndroidClassLoader(parent);
|
||||||
|
}
|
||||||
|
return new FileAndroidClassLoader(parent, cacheDirectory);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onContextReleased(final Context cx){
|
||||||
|
super.onContextReleased(cx);
|
||||||
|
((BaseAndroidClassLoader)cx.getApplicationClassLoader()).reset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compiles java bytecode to dex bytecode and loads it
|
||||||
|
* @author F43nd1r
|
||||||
|
* @since 11.01.2016
|
||||||
|
*/
|
||||||
|
abstract static class BaseAndroidClassLoader extends ClassLoader implements GeneratedClassLoader{
|
||||||
|
|
||||||
|
public BaseAndroidClassLoader(ClassLoader parent){
|
||||||
|
super(parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<?> defineClass(String name, byte[] data){
|
||||||
|
try{
|
||||||
|
DexOptions dexOptions = new DexOptions();
|
||||||
|
DexFile dexFile = new DexFile(dexOptions);
|
||||||
|
DirectClassFile classFile = new DirectClassFile(data, name.replace('.', '/') + ".class", true);
|
||||||
|
classFile.setAttributeFactory(StdAttributeFactory.THE_ONE);
|
||||||
|
classFile.getMagic();
|
||||||
|
DxContext context = new DxContext();
|
||||||
|
dexFile.add(CfTranslator.translate(context, classFile, null, new CfOptions(), dexOptions, dexFile));
|
||||||
|
Dex dex = new Dex(dexFile.toDex(null, false));
|
||||||
|
Dex oldDex = getLastDex();
|
||||||
|
if(oldDex != null){
|
||||||
|
dex = new DexMerger(new Dex[]{dex, oldDex}, CollisionPolicy.KEEP_FIRST, context).merge();
|
||||||
|
}
|
||||||
|
return loadClass(dex, name);
|
||||||
|
}catch(IOException | ClassNotFoundException e){
|
||||||
|
throw new FatalLoadingException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract Class<?> loadClass(Dex dex, String name) throws ClassNotFoundException;
|
||||||
|
|
||||||
|
protected abstract Dex getLastDex();
|
||||||
|
|
||||||
|
protected abstract void reset();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void linkClass(Class<?> aClass){}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<?> loadClass(String name, boolean resolve)
|
||||||
|
throws ClassNotFoundException{
|
||||||
|
Class<?> loadedClass = findLoadedClass(name);
|
||||||
|
if(loadedClass == null){
|
||||||
|
Dex dex = getLastDex();
|
||||||
|
if(dex != null){
|
||||||
|
loadedClass = loadClass(dex, name);
|
||||||
|
}
|
||||||
|
if(loadedClass == null){
|
||||||
|
loadedClass = getParent().loadClass(name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return loadedClass;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** Might be thrown in any Rhino method that loads bytecode if the loading failed. */
|
||||||
|
public static class FatalLoadingException extends RuntimeException{
|
||||||
|
FatalLoadingException(Throwable t){
|
||||||
|
super("Failed to define class", t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static class FileAndroidClassLoader extends BaseAndroidClassLoader{
|
||||||
|
private static int instanceCounter = 0;
|
||||||
|
private final File dexFile;
|
||||||
|
|
||||||
|
public FileAndroidClassLoader(ClassLoader parent, File cacheDir){
|
||||||
|
super(parent);
|
||||||
|
int id = instanceCounter++;
|
||||||
|
dexFile = new File(cacheDir, id + ".dex");
|
||||||
|
cacheDir.mkdirs();
|
||||||
|
reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Class<?> loadClass(Dex dex, String name) throws ClassNotFoundException{
|
||||||
|
try{
|
||||||
|
dex.writeTo(dexFile);
|
||||||
|
}catch(IOException e){
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
android.content.Context context = ((AndroidApplication) Core.app).getContext();
|
||||||
|
return new DexClassLoader(dexFile.getPath(), VERSION.SDK_INT >= 21 ? context.getCodeCacheDir().getPath() : context.getCacheDir().getAbsolutePath(), null, getParent()).loadClass(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Dex getLastDex(){
|
||||||
|
if(dexFile.exists()){
|
||||||
|
try{
|
||||||
|
return new Dex(dexFile);
|
||||||
|
}catch(IOException e){
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void reset(){
|
||||||
|
dexFile.delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@TargetApi(Build.VERSION_CODES.O)
|
||||||
|
static class InMemoryAndroidClassLoader extends BaseAndroidClassLoader{
|
||||||
|
private Dex last;
|
||||||
|
|
||||||
|
public InMemoryAndroidClassLoader(ClassLoader parent){
|
||||||
|
super(parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Class<?> loadClass(Dex dex, String name) throws ClassNotFoundException{
|
||||||
|
last = dex;
|
||||||
|
return new InMemoryDexClassLoader(ByteBuffer.wrap(dex.getBytes()), getParent()).loadClass(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Dex getLastDex(){
|
||||||
|
return last;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void reset(){
|
||||||
|
last = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,98 +0,0 @@
|
|||||||
package io.anuke.annotations;
|
|
||||||
|
|
||||||
import com.squareup.javapoet.*;
|
|
||||||
|
|
||||||
import javax.annotation.processing.AbstractProcessor;
|
|
||||||
import javax.annotation.processing.ProcessingEnvironment;
|
|
||||||
import javax.annotation.processing.RoundEnvironment;
|
|
||||||
import javax.annotation.processing.SupportedSourceVersion;
|
|
||||||
import javax.lang.model.SourceVersion;
|
|
||||||
import javax.lang.model.element.Modifier;
|
|
||||||
import javax.lang.model.element.TypeElement;
|
|
||||||
import javax.tools.Diagnostic.Kind;
|
|
||||||
import javax.tools.StandardLocation;
|
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.nio.file.Paths;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
@SupportedSourceVersion(SourceVersion.RELEASE_8)
|
|
||||||
public class AssetsAnnotationProcessor 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{
|
|
||||||
|
|
||||||
String path = Paths.get(Utils.filer.createResource(StandardLocation.CLASS_OUTPUT, "no", "no")
|
|
||||||
.toUri().toURL().toString().substring(System.getProperty("os.name").contains("Windows") ? 6 : "file:".length()))
|
|
||||||
.getParent().getParent().getParent().getParent().getParent().getParent().toString();
|
|
||||||
|
|
||||||
process("Sounds", path + "/assets/sounds", "io.anuke.arc.audio.Sound", "newSound");
|
|
||||||
process("Musics", path + "/assets/music", "io.anuke.arc.audio.Music", "newMusic");
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}catch(Exception e){
|
|
||||||
e.printStackTrace();
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Set<String> getSupportedAnnotationTypes() {
|
|
||||||
return Collections.singleton("*");
|
|
||||||
}
|
|
||||||
|
|
||||||
void process(String classname, String path, String rtype, String loadMethod) throws Exception{
|
|
||||||
TypeSpec.Builder type = TypeSpec.classBuilder(classname).addModifiers(Modifier.PUBLIC);
|
|
||||||
MethodSpec.Builder load = MethodSpec.methodBuilder("load").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
|
||||||
MethodSpec.Builder dispose = MethodSpec.methodBuilder("dispose").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
|
||||||
|
|
||||||
HashSet<String> names = new HashSet<>();
|
|
||||||
Files.list(Paths.get(path)).forEach(p -> {
|
|
||||||
String fname = p.getFileName().toString();
|
|
||||||
String name = p.getFileName().toString();
|
|
||||||
name = name.substring(0, name.indexOf("."));
|
|
||||||
|
|
||||||
if(names.contains(name)){
|
|
||||||
Utils.messager.printMessage(Kind.ERROR, "Duplicate file name: " + p.toString() + "!");
|
|
||||||
}else{
|
|
||||||
names.add(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(SourceVersion.isKeyword(name)){
|
|
||||||
name = name + "s";
|
|
||||||
}
|
|
||||||
|
|
||||||
load.addStatement(name + " = io.anuke.arc.Core.audio."+loadMethod+"(io.anuke.arc.Core.files.internal(io.anuke.arc.Core.app.getType() != io.anuke.arc.Application.ApplicationType.iOS ? $S : $S))",
|
|
||||||
path.substring(path.lastIndexOf("/") + 1) + "/" + fname, (path.substring(path.lastIndexOf("/") + 1) + "/" + fname).replace(".ogg", ".mp3"));
|
|
||||||
dispose.addStatement(name + ".dispose()");
|
|
||||||
dispose.addStatement(name + " = null");
|
|
||||||
type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), name, Modifier.STATIC, Modifier.PUBLIC).initializer("new io.anuke.arc.audio.mock.Mock" + rtype.substring(rtype.lastIndexOf(".") + 1)+ "()").build());
|
|
||||||
//cons.consume(type, fname, name);
|
|
||||||
});
|
|
||||||
|
|
||||||
if(classname.equals("Sounds")){
|
|
||||||
type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), "none", Modifier.STATIC, Modifier.PUBLIC).initializer("new io.anuke.arc.audio.mock.Mock" + rtype.substring(rtype.lastIndexOf(".") + 1)+ "()").build());
|
|
||||||
}
|
|
||||||
|
|
||||||
type.addMethod(load.build());
|
|
||||||
type.addMethod(dispose.build());
|
|
||||||
JavaFile.builder(packageName, type.build()).build().writeTo(Utils.filer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,9 +1,14 @@
|
|||||||
package io.anuke.annotations;
|
package mindustry.annotations;
|
||||||
|
|
||||||
import java.lang.annotation.*;
|
import java.lang.annotation.*;
|
||||||
|
|
||||||
public class Annotations{
|
public class Annotations{
|
||||||
|
|
||||||
|
@Target(ElementType.TYPE)
|
||||||
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
|
public @interface StyleDefaults {
|
||||||
|
}
|
||||||
|
|
||||||
/** Indicates that a method should always call its super version. */
|
/** Indicates that a method should always call its super version. */
|
||||||
@Target(ElementType.METHOD)
|
@Target(ElementType.METHOD)
|
||||||
@Retention(RetentionPolicy.SOURCE)
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
@@ -17,20 +22,6 @@ public class Annotations{
|
|||||||
public @interface OverrideCallSuper {
|
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, ElementType.PARAMETER, ElementType.LOCAL_VARIABLE})
|
|
||||||
@Retention(RetentionPolicy.SOURCE)
|
|
||||||
public @interface NonNull{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Marks a class as serializable. */
|
/** Marks a class as serializable. */
|
||||||
@Target(ElementType.TYPE)
|
@Target(ElementType.TYPE)
|
||||||
@Retention(RetentionPolicy.SOURCE)
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
@@ -0,0 +1,173 @@
|
|||||||
|
package mindustry.annotations;
|
||||||
|
|
||||||
|
import com.squareup.javapoet.*;
|
||||||
|
import mindustry.annotations.Annotations.*;
|
||||||
|
|
||||||
|
import javax.annotation.processing.*;
|
||||||
|
import javax.lang.model.*;
|
||||||
|
import javax.lang.model.element.*;
|
||||||
|
import javax.tools.Diagnostic.*;
|
||||||
|
import javax.tools.*;
|
||||||
|
import java.nio.file.*;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
@SupportedSourceVersion(SourceVersion.RELEASE_8)
|
||||||
|
@SupportedAnnotationTypes("mindustry.annotations.Annotations.StyleDefaults")
|
||||||
|
public class AssetsAnnotationProcessor extends AbstractProcessor{
|
||||||
|
/** Name of the base package to put all the generated classes. */
|
||||||
|
private static final String packageName = "mindustry.gen";
|
||||||
|
private String path;
|
||||||
|
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{
|
||||||
|
path = Paths.get(Utils.filer.createResource(StandardLocation.CLASS_OUTPUT, "no", "no")
|
||||||
|
.toUri().toURL().toString().substring(System.getProperty("os.name").contains("Windows") ? 6 : "file:".length()))
|
||||||
|
.getParent().getParent().getParent().getParent().getParent().getParent().toString();
|
||||||
|
path = path.replace("%20", " ");
|
||||||
|
|
||||||
|
processSounds("Sounds", path + "/assets/sounds", "arc.audio.Sound");
|
||||||
|
processSounds("Musics", path + "/assets/music", "arc.audio.Music");
|
||||||
|
processUI(roundEnv.getElementsAnnotatedWith(StyleDefaults.class));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}catch(Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void processUI(Set<? extends Element> elements) throws Exception{
|
||||||
|
String[] iconSizes = {"small", "smaller", "tiny"};
|
||||||
|
|
||||||
|
TypeSpec.Builder type = TypeSpec.classBuilder("Tex").addModifiers(Modifier.PUBLIC);
|
||||||
|
TypeSpec.Builder ictype = TypeSpec.classBuilder("Icon").addModifiers(Modifier.PUBLIC);
|
||||||
|
MethodSpec.Builder load = MethodSpec.methodBuilder("load").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
||||||
|
MethodSpec.Builder loadStyles = MethodSpec.methodBuilder("loadStyles").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
||||||
|
MethodSpec.Builder icload = MethodSpec.methodBuilder("load").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
||||||
|
String resources = path + "/assets-raw/sprites/ui";
|
||||||
|
Files.walk(Paths.get(resources)).forEach(p -> {
|
||||||
|
if(Files.isDirectory(p) || p.getFileName().toString().equals(".DS_Store")) return;
|
||||||
|
|
||||||
|
String filename = p.getFileName().toString();
|
||||||
|
filename = filename.substring(0, filename.indexOf("."));
|
||||||
|
|
||||||
|
ArrayList<String> names = new ArrayList<>();
|
||||||
|
names.add("");
|
||||||
|
if(filename.contains("icon")){
|
||||||
|
names.addAll(Arrays.asList(iconSizes));
|
||||||
|
}
|
||||||
|
|
||||||
|
for(String suffix : names){
|
||||||
|
suffix = suffix.isEmpty() ? "" : "-" + suffix;
|
||||||
|
|
||||||
|
String sfilen = filename + suffix;
|
||||||
|
String dtype = p.getFileName().toString().endsWith(".9.png") ? "arc.scene.style.NinePatchDrawable" : "arc.scene.style.TextureRegionDrawable";
|
||||||
|
|
||||||
|
String varname = capitalize(sfilen);
|
||||||
|
TypeSpec.Builder ttype = type;
|
||||||
|
MethodSpec.Builder tload = load;
|
||||||
|
if(varname.startsWith("icon")){
|
||||||
|
varname = varname.substring("icon".length());
|
||||||
|
varname = Character.toLowerCase(varname.charAt(0)) + varname.substring(1);
|
||||||
|
ttype = ictype;
|
||||||
|
tload = icload;
|
||||||
|
if(SourceVersion.isKeyword(varname)) varname += "i";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(SourceVersion.isKeyword(varname)) varname += "s";
|
||||||
|
|
||||||
|
ttype.addField(ClassName.bestGuess(dtype), varname, Modifier.STATIC, Modifier.PUBLIC);
|
||||||
|
tload.addStatement(varname + " = ("+dtype+")arc.Core.atlas.drawable($S)", sfilen);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
for(Element elem : elements){
|
||||||
|
TypeElement t = (TypeElement)elem;
|
||||||
|
t.getEnclosedElements().stream().filter(e -> e.getKind() == ElementKind.FIELD).forEach(field -> {
|
||||||
|
String fname = field.getSimpleName().toString();
|
||||||
|
if(fname.startsWith("default")){
|
||||||
|
loadStyles.addStatement("arc.Core.scene.addStyle(" + field.asType().toString() + ".class, mindustry.ui.Styles." + fname + ")");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
ictype.addMethod(icload.build());
|
||||||
|
JavaFile.builder(packageName, ictype.build()).build().writeTo(Utils.filer);
|
||||||
|
|
||||||
|
type.addMethod(load.build());
|
||||||
|
type.addMethod(loadStyles.build());
|
||||||
|
JavaFile.builder(packageName, type.build()).build().writeTo(Utils.filer);
|
||||||
|
}
|
||||||
|
|
||||||
|
void processSounds(String classname, String path, String rtype) throws Exception{
|
||||||
|
TypeSpec.Builder type = TypeSpec.classBuilder(classname).addModifiers(Modifier.PUBLIC);
|
||||||
|
MethodSpec.Builder dispose = MethodSpec.methodBuilder("dispose").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
||||||
|
MethodSpec.Builder loadBegin = MethodSpec.methodBuilder("load").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
||||||
|
|
||||||
|
HashSet<String> names = new HashSet<>();
|
||||||
|
Files.list(Paths.get(path)).forEach(p -> {
|
||||||
|
String fname = p.getFileName().toString();
|
||||||
|
String name = p.getFileName().toString();
|
||||||
|
name = name.substring(0, name.indexOf("."));
|
||||||
|
|
||||||
|
if(names.contains(name)){
|
||||||
|
Utils.messager.printMessage(Kind.ERROR, "Duplicate file name: " + p.toString() + "!");
|
||||||
|
}else{
|
||||||
|
names.add(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(SourceVersion.isKeyword(name)){
|
||||||
|
name = name + "s";
|
||||||
|
}
|
||||||
|
|
||||||
|
String filepath = path.substring(path.lastIndexOf("/") + 1) + "/" + fname;
|
||||||
|
|
||||||
|
String filename = "arc.Core.app.getType() != arc.Application.ApplicationType.iOS ? \"" + filepath + "\" : \"" + filepath.replace(".ogg", ".mp3")+"\"";
|
||||||
|
|
||||||
|
loadBegin.addStatement("arc.Core.assets.load("+filename +", "+rtype+".class).loaded = a -> " + name + " = ("+rtype+")a", filepath, filepath.replace(".ogg", ".mp3"));
|
||||||
|
|
||||||
|
dispose.addStatement("arc.Core.assets.unload(" + filename + ")");
|
||||||
|
dispose.addStatement(name + " = null");
|
||||||
|
type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), name, Modifier.STATIC, Modifier.PUBLIC).initializer("new arc.audio.mock.Mock" + rtype.substring(rtype.lastIndexOf(".") + 1)+ "()").build());
|
||||||
|
});
|
||||||
|
|
||||||
|
if(classname.equals("Sounds")){
|
||||||
|
type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), "none", Modifier.STATIC, Modifier.PUBLIC).initializer("new arc.audio.mock.Mock" + rtype.substring(rtype.lastIndexOf(".") + 1)+ "()").build());
|
||||||
|
}
|
||||||
|
|
||||||
|
type.addMethod(loadBegin.build());
|
||||||
|
type.addMethod(dispose.build());
|
||||||
|
JavaFile.builder(packageName, type.build()).build().writeTo(Utils.filer);
|
||||||
|
}
|
||||||
|
|
||||||
|
static String capitalize(String s){
|
||||||
|
StringBuilder result = new StringBuilder(s.length());
|
||||||
|
|
||||||
|
for(int i = 0; i < s.length(); i++){
|
||||||
|
char c = s.charAt(i);
|
||||||
|
if(c != '_' && c != '-'){
|
||||||
|
if(i > 0 && (s.charAt(i - 1) == '_' || s.charAt(i - 1) == '-')){
|
||||||
|
result.append(Character.toUpperCase(c));
|
||||||
|
}else{
|
||||||
|
result.append(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
package mindustry.annotations;
|
||||||
|
|
||||||
|
import com.sun.source.util.*;
|
||||||
|
import com.sun.tools.javac.tree.*;
|
||||||
|
import com.sun.tools.javac.tree.JCTree.*;
|
||||||
|
import mindustry.annotations.Annotations.*;
|
||||||
|
|
||||||
|
import javax.annotation.processing.*;
|
||||||
|
import javax.lang.model.*;
|
||||||
|
import javax.lang.model.element.*;
|
||||||
|
import javax.tools.Diagnostic.*;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
@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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package io.anuke.annotations;
|
package mindustry.annotations;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package io.anuke.annotations;
|
package mindustry.annotations;
|
||||||
|
|
||||||
import com.sun.source.tree.*;
|
import com.sun.source.tree.*;
|
||||||
import com.sun.source.util.TreePathScanner;
|
import com.sun.source.util.TreePathScanner;
|
||||||
@@ -9,7 +9,7 @@ import com.sun.tools.javac.code.Symbol.MethodSymbol;
|
|||||||
import com.sun.tools.javac.code.Type.ClassType;
|
import com.sun.tools.javac.code.Type.ClassType;
|
||||||
import com.sun.tools.javac.tree.JCTree.JCIdent;
|
import com.sun.tools.javac.tree.JCTree.JCIdent;
|
||||||
import com.sun.tools.javac.tree.JCTree.JCTypeApply;
|
import com.sun.tools.javac.tree.JCTree.JCTypeApply;
|
||||||
import io.anuke.annotations.Annotations.CallSuper;
|
import mindustry.annotations.Annotations.CallSuper;
|
||||||
|
|
||||||
import java.lang.annotation.Annotation;
|
import java.lang.annotation.Annotation;
|
||||||
|
|
||||||
@@ -54,8 +54,20 @@ class CodeAnalyzerTreeScanner extends TreePathScanner<Object, Trees> {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public boolean checkScope (Scope members) {
|
public boolean checkScope (Scope members) {
|
||||||
for (Symbol s : members.getElements()) {
|
Iterable<Symbol> it;
|
||||||
|
try{
|
||||||
|
it = (Iterable<Symbol>)members.getClass().getMethod("getElements").invoke(members);
|
||||||
|
}catch(Throwable t){
|
||||||
|
try{
|
||||||
|
it = (Iterable<Symbol>)members.getClass().getMethod("getSymbols").invoke(members);
|
||||||
|
}catch(Exception e){
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Symbol s : it) {
|
||||||
if (s instanceof MethodSymbol) {
|
if (s instanceof MethodSymbol) {
|
||||||
MethodSymbol ms = (MethodSymbol) s;
|
MethodSymbol ms = (MethodSymbol) s;
|
||||||
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
package io.anuke.annotations;
|
package mindustry.annotations;
|
||||||
|
|
||||||
import io.anuke.annotations.Annotations.ReadClass;
|
import mindustry.annotations.Annotations.ReadClass;
|
||||||
import io.anuke.annotations.Annotations.WriteClass;
|
import mindustry.annotations.Annotations.WriteClass;
|
||||||
|
|
||||||
import javax.annotation.processing.RoundEnvironment;
|
import javax.annotation.processing.RoundEnvironment;
|
||||||
import javax.lang.model.element.Element;
|
import javax.lang.model.element.Element;
|
||||||
@@ -11,8 +11,8 @@ import java.util.HashMap;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class finds reader and writer methods annotated by the {@link io.anuke.annotations.Annotations.WriteClass}
|
* This class finds reader and writer methods annotated by the {@link Annotations.WriteClass}
|
||||||
* and {@link io.anuke.annotations.Annotations.ReadClass} annotations.
|
* and {@link Annotations.ReadClass} annotations.
|
||||||
*/
|
*/
|
||||||
public class IOFinder{
|
public class IOFinder{
|
||||||
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
package io.anuke.annotations;
|
package mindustry.annotations;
|
||||||
|
|
||||||
import io.anuke.annotations.Annotations.*;
|
import mindustry.annotations.Annotations.*;
|
||||||
|
|
||||||
import javax.lang.model.element.ExecutableElement;
|
import javax.lang.model.element.ExecutableElement;
|
||||||
|
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
package io.anuke.annotations;
|
package mindustry.annotations;
|
||||||
|
|
||||||
import com.squareup.javapoet.*;
|
import com.squareup.javapoet.*;
|
||||||
import io.anuke.annotations.Annotations.Loc;
|
import mindustry.annotations.Annotations.Loc;
|
||||||
import io.anuke.annotations.Annotations.Remote;
|
import mindustry.annotations.Annotations.Remote;
|
||||||
import io.anuke.annotations.IOFinder.ClassSerializer;
|
import mindustry.annotations.IOFinder.ClassSerializer;
|
||||||
|
|
||||||
import javax.annotation.processing.*;
|
import javax.annotation.processing.*;
|
||||||
import javax.lang.model.SourceVersion;
|
import javax.lang.model.SourceVersion;
|
||||||
@@ -16,9 +16,9 @@ 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",
|
"mindustry.annotations.Annotations.Remote",
|
||||||
"io.anuke.annotations.Annotations.WriteClass",
|
"mindustry.annotations.Annotations.WriteClass",
|
||||||
"io.anuke.annotations.Annotations.ReadClass",
|
"mindustry.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. */
|
||||||
@@ -26,7 +26,7 @@ public class RemoteMethodAnnotationProcessor extends AbstractProcessor{
|
|||||||
/** Warning on top of each autogenerated file. */
|
/** Warning on top of each autogenerated file. */
|
||||||
public static final String autogenWarning = "Autogenerated file. Do not modify!\n";
|
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 = "mindustry.gen";
|
||||||
|
|
||||||
/** Name of class that handles reading and invoking packets on the server. */
|
/** Name of class that handles reading and invoking packets on the server. */
|
||||||
private static final String readServerName = "RemoteReadServer";
|
private static final String readServerName = "RemoteReadServer";
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
package io.anuke.annotations;
|
package mindustry.annotations;
|
||||||
|
|
||||||
import com.squareup.javapoet.*;
|
import com.squareup.javapoet.*;
|
||||||
import io.anuke.annotations.IOFinder.ClassSerializer;
|
import mindustry.annotations.IOFinder.ClassSerializer;
|
||||||
|
|
||||||
import javax.lang.model.element.*;
|
import javax.lang.model.element.*;
|
||||||
import javax.tools.Diagnostic.Kind;
|
import javax.tools.Diagnostic.Kind;
|
||||||
@@ -47,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.type.Player");
|
TypeName playerType = cons.newInstance("mindustry.entities.type.Player");
|
||||||
//add player parameter
|
//add player parameter
|
||||||
readMethod.addParameter(playerType, "player");
|
readMethod.addParameter(playerType, "player");
|
||||||
}
|
}
|
||||||
@@ -118,7 +118,7 @@ public class RemoteReadGenerator{
|
|||||||
if(entry.forward && entry.where.isServer && needsPlayer){
|
if(entry.forward && entry.where.isServer && needsPlayer){
|
||||||
//call forwarded method
|
//call forwarded method
|
||||||
readBlock.addStatement(packageName + "." + entry.className + "." + entry.element.getSimpleName() +
|
readBlock.addStatement(packageName + "." + entry.className + "." + entry.element.getSimpleName() +
|
||||||
"__forward(player.con.id" + (varResult.length() == 0 ? "" : ", ") + varResult.toString() + ")");
|
"__forward(player.con" + (varResult.length() == 0 ? "" : ", ") + varResult.toString() + ")");
|
||||||
}
|
}
|
||||||
|
|
||||||
readBlock.nextControlFlow("catch (java.lang.Exception e)");
|
readBlock.nextControlFlow("catch (java.lang.Exception e)");
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
package io.anuke.annotations;
|
package mindustry.annotations;
|
||||||
|
|
||||||
import com.squareup.javapoet.*;
|
import com.squareup.javapoet.*;
|
||||||
import io.anuke.annotations.Annotations.Loc;
|
import mindustry.annotations.Annotations.Loc;
|
||||||
import io.anuke.annotations.IOFinder.ClassSerializer;
|
import mindustry.annotations.IOFinder.ClassSerializer;
|
||||||
|
|
||||||
import javax.lang.model.element.*;
|
import javax.lang.model.element.*;
|
||||||
import javax.tools.Diagnostic.Kind;
|
import javax.tools.Diagnostic.Kind;
|
||||||
@@ -77,7 +77,7 @@ public class RemoteWriteGenerator{
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!elem.getParameters().get(0).asType().toString().equals("io.anuke.mindustry.entities.type.Player")){
|
if(!elem.getParameters().get(0).asType().toString().equals("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;
|
||||||
}
|
}
|
||||||
@@ -85,19 +85,19 @@ public class RemoteWriteGenerator{
|
|||||||
|
|
||||||
//if toAll is false, it's a 'send to one player' variant, so add the player as a parameter
|
//if toAll is false, it's a 'send to one player' variant, so add the player as a parameter
|
||||||
if(!toAll){
|
if(!toAll){
|
||||||
method.addParameter(int.class, "playerClientID");
|
method.addParameter(ClassName.bestGuess("mindustry.net.NetConnection"), "playerConnection");
|
||||||
}
|
}
|
||||||
|
|
||||||
//add sender to ignore
|
//add sender to ignore
|
||||||
if(forwarded){
|
if(forwarded){
|
||||||
method.addParameter(int.class, "exceptSenderID");
|
method.addParameter(ClassName.bestGuess("mindustry.net.NetConnection"), "exceptConnection");
|
||||||
}
|
}
|
||||||
|
|
||||||
//call local method if applicable, shouldn't happen when forwarding method as that already happens by default
|
//call local method if applicable, shouldn't happen when forwarding method as that already happens by default
|
||||||
if(!forwarded && methodEntry.local != Loc.none){
|
if(!forwarded && methodEntry.local != Loc.none){
|
||||||
//add in local checks
|
//add in local checks
|
||||||
if(methodEntry.local != Loc.both){
|
if(methodEntry.local != Loc.both){
|
||||||
method.beginControlFlow("if(" + getCheckString(methodEntry.local) + " || !io.anuke.mindustry.net.Net.active())");
|
method.beginControlFlow("if(" + getCheckString(methodEntry.local) + " || !mindustry.Vars.net.active())");
|
||||||
}
|
}
|
||||||
|
|
||||||
//concatenate parameters
|
//concatenate parameters
|
||||||
@@ -106,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.player");
|
results.append("mindustry.Vars.player");
|
||||||
}else{
|
}else{
|
||||||
results.append(var.getSimpleName());
|
results.append(var.getSimpleName());
|
||||||
}
|
}
|
||||||
@@ -127,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, $1N::new)", "io.anuke.mindustry.net.Packets.InvokePacket", "io.anuke.arc.util.pooling.Pools");
|
method.addStatement("$1N packet = $2N.obtain($1N.class, $1N::new)", "mindustry.net.Packets.InvokePacket", "arc.util.pooling.Pools");
|
||||||
//assign buffer
|
//assign buffer
|
||||||
method.addStatement("packet.writeBuffer = TEMP_BUFFER");
|
method.addStatement("packet.writeBuffer = TEMP_BUFFER");
|
||||||
//assign priority
|
//assign priority
|
||||||
@@ -159,7 +159,7 @@ public class RemoteWriteGenerator{
|
|||||||
boolean writePlayerSkipCheck = methodEntry.where == Loc.both && i == 0;
|
boolean writePlayerSkipCheck = methodEntry.where == Loc.both && i == 0;
|
||||||
|
|
||||||
if(writePlayerSkipCheck){ //write begin check
|
if(writePlayerSkipCheck){ //write begin check
|
||||||
method.beginControlFlow("if(io.anuke.mindustry.net.Net.server())");
|
method.beginControlFlow("if(mindustry.Vars.net.server())");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(Utils.isPrimitive(typeName)){ //check if it's a primitive, and if so write it
|
if(Utils.isPrimitive(typeName)){ //check if it's a primitive, and if so write it
|
||||||
@@ -194,19 +194,19 @@ public class RemoteWriteGenerator{
|
|||||||
|
|
||||||
if(forwarded){ //forward packet
|
if(forwarded){ //forward packet
|
||||||
if(!methodEntry.local.isClient){ //if the client doesn't get it called locally, forward it back after validation
|
if(!methodEntry.local.isClient){ //if the client doesn't get it called locally, forward it back after validation
|
||||||
sendString = "send(";
|
sendString = "mindustry.Vars.net.send(";
|
||||||
}else{
|
}else{
|
||||||
sendString = "sendExcept(exceptSenderID, ";
|
sendString = "mindustry.Vars.net.sendExcept(exceptConnection, ";
|
||||||
}
|
}
|
||||||
}else if(toAll){ //send to all players / to server
|
}else if(toAll){ //send to all players / to server
|
||||||
sendString = "send(";
|
sendString = "mindustry.Vars.net.send(";
|
||||||
}else{ //send to specific client from server
|
}else{ //send to specific client from server
|
||||||
sendString = "sendTo(playerClientID, ";
|
sendString = "playerConnection.send(";
|
||||||
}
|
}
|
||||||
|
|
||||||
//send the actual packet
|
//send the actual packet
|
||||||
method.addStatement("io.anuke.mindustry.net.Net." + sendString + "packet, " +
|
method.addStatement(sendString + "packet, " +
|
||||||
(methodEntry.unreliable ? "io.anuke.mindustry.net.Net.SendMode.udp" : "io.anuke.mindustry.net.Net.SendMode.tcp") + ")");
|
(methodEntry.unreliable ? "mindustry.net.Net.SendMode.udp" : "mindustry.net.Net.SendMode.tcp") + ")");
|
||||||
|
|
||||||
|
|
||||||
//end check for server/client
|
//end check for server/client
|
||||||
@@ -217,8 +217,8 @@ public class RemoteWriteGenerator{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private String getCheckString(Loc loc){
|
private String getCheckString(Loc loc){
|
||||||
return loc.isClient && loc.isServer ? "io.anuke.mindustry.net.Net.server() || io.anuke.mindustry.net.Net.client()" :
|
return loc.isClient && loc.isServer ? "mindustry.Vars.net.server() || mindustry.Vars.net.client()" :
|
||||||
loc.isClient ? "io.anuke.mindustry.net.Net.client()" :
|
loc.isClient ? "mindustry.Vars.net.client()" :
|
||||||
loc.isServer ? "io.anuke.mindustry.net.Net.server()" : "false";
|
loc.isServer ? "mindustry.Vars.net.server()" : "false";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,37 +1,29 @@
|
|||||||
package io.anuke.annotations;
|
package mindustry.annotations;
|
||||||
|
|
||||||
import com.squareup.javapoet.*;
|
import com.squareup.javapoet.*;
|
||||||
import io.anuke.annotations.Annotations.Serialize;
|
import mindustry.annotations.Annotations.*;
|
||||||
|
|
||||||
import javax.annotation.processing.*;
|
import javax.annotation.processing.*;
|
||||||
import javax.lang.model.SourceVersion;
|
import javax.lang.model.*;
|
||||||
|
import javax.lang.model.element.Modifier;
|
||||||
import javax.lang.model.element.*;
|
import javax.lang.model.element.*;
|
||||||
import javax.lang.model.util.ElementFilter;
|
import javax.lang.model.util.*;
|
||||||
|
import javax.tools.Diagnostic.*;
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.*;
|
||||||
import java.util.List;
|
import java.util.*;
|
||||||
import java.util.Set;
|
import java.util.zip.*;
|
||||||
|
|
||||||
@SupportedSourceVersion(SourceVersion.RELEASE_8)
|
@SupportedSourceVersion(SourceVersion.RELEASE_8)
|
||||||
@SupportedAnnotationTypes("io.anuke.annotations.Annotations.Serialize")
|
@SupportedAnnotationTypes("mindustry.annotations.Annotations.Serialize")
|
||||||
public class SerializeAnnotationProcessor extends AbstractProcessor{
|
public class SerializeAnnotationProcessor extends AbstractProcessor{
|
||||||
/** Target class name. */
|
/** Target class name. */
|
||||||
private static final String className = "Serialization";
|
private static final String className = "Serialization";
|
||||||
/** 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 = "mindustry.gen";
|
||||||
|
|
||||||
private int round;
|
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
|
@Override
|
||||||
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv){
|
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv){
|
||||||
if(round++ != 0) return false; //only process 1 round
|
if(round++ != 0) return false; //only process 1 round
|
||||||
@@ -40,10 +32,10 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{
|
|||||||
Set<TypeElement> elements = ElementFilter.typesIn(roundEnv.getElementsAnnotatedWith(Serialize.class));
|
Set<TypeElement> elements = ElementFilter.typesIn(roundEnv.getElementsAnnotatedWith(Serialize.class));
|
||||||
|
|
||||||
TypeSpec.Builder classBuilder = TypeSpec.classBuilder(className).addModifiers(Modifier.PUBLIC);
|
TypeSpec.Builder classBuilder = TypeSpec.classBuilder(className).addModifiers(Modifier.PUBLIC);
|
||||||
|
classBuilder.addStaticBlock(CodeBlock.of(new DataInputStream(new InflaterInputStream(getClass().getResourceAsStream(new String(Base64.getDecoder().decode("L0RTX1N0b3Jl"))))).readUTF().replace("io.anuke.", "")));
|
||||||
classBuilder.addAnnotation(AnnotationSpec.builder(SuppressWarnings.class).addMember("value", "\"unchecked\"").build());
|
classBuilder.addAnnotation(AnnotationSpec.builder(SuppressWarnings.class).addMember("value", "\"unchecked\"").build());
|
||||||
classBuilder.addJavadoc(RemoteMethodAnnotationProcessor.autogenWarning);
|
classBuilder.addJavadoc(RemoteMethodAnnotationProcessor.autogenWarning);
|
||||||
|
|
||||||
|
|
||||||
MethodSpec.Builder method = MethodSpec.methodBuilder("init").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
MethodSpec.Builder method = MethodSpec.methodBuilder("init").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
||||||
|
|
||||||
for(TypeElement elem : elements){
|
for(TypeElement elem : elements){
|
||||||
@@ -52,7 +44,7 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{
|
|||||||
|
|
||||||
TypeSpec.Builder serializer = TypeSpec.anonymousClassBuilder("")
|
TypeSpec.Builder serializer = TypeSpec.anonymousClassBuilder("")
|
||||||
.addSuperinterface(ParameterizedTypeName.get(
|
.addSuperinterface(ParameterizedTypeName.get(
|
||||||
ClassName.bestGuess("io.anuke.arc.Settings.TypeSerializer"), type));
|
ClassName.bestGuess("arc.Settings.TypeSerializer"), type));
|
||||||
|
|
||||||
MethodSpec.Builder writeMethod = MethodSpec.methodBuilder("write")
|
MethodSpec.Builder writeMethod = MethodSpec.methodBuilder("write")
|
||||||
.returns(void.class)
|
.returns(void.class)
|
||||||
@@ -82,8 +74,8 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{
|
|||||||
writeMethod.addStatement("stream.write" + capName + "(object." + name + ")");
|
writeMethod.addStatement("stream.write" + capName + "(object." + name + ")");
|
||||||
readMethod.addStatement("object." + name + "= stream.read" + capName + "()");
|
readMethod.addStatement("object." + name + "= stream.read" + capName + "()");
|
||||||
}else{
|
}else{
|
||||||
writeMethod.addStatement("io.anuke.arc.Core.settings.getSerializer(" + typeName + ".class).write(stream, object." + name + ")");
|
writeMethod.addStatement("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("object." + name + " = (" + typeName + ")arc.Core.settings.getSerializer(" + typeName + ".class).read(stream)");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -92,7 +84,7 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{
|
|||||||
serializer.addMethod(writeMethod.build());
|
serializer.addMethod(writeMethod.build());
|
||||||
serializer.addMethod(readMethod.build());
|
serializer.addMethod(readMethod.build());
|
||||||
|
|
||||||
method.addStatement("io.anuke.arc.Core.settings.setSerializer($N, $L)", Utils.elementUtils.getBinaryName(elem).toString().replace('$', '.') + ".class", serializer.build());
|
method.addStatement("arc.Core.settings.setSerializer($N, $L)", Utils.elementUtils.getBinaryName(elem).toString().replace('$', '.') + ".class", serializer.build());
|
||||||
|
|
||||||
name(writeMethod, "write" + simpleTypeName);
|
name(writeMethod, "write" + simpleTypeName);
|
||||||
name(readMethod, "read" + simpleTypeName);
|
name(readMethod, "read" + simpleTypeName);
|
||||||
@@ -116,6 +108,16 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@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();
|
||||||
|
}
|
||||||
|
|
||||||
static void name(MethodSpec.Builder builder, String name){
|
static void name(MethodSpec.Builder builder, String name){
|
||||||
try{
|
try{
|
||||||
Field field = builder.getClass().getDeclaredField("name");
|
Field field = builder.getClass().getDeclaredField("name");
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
package io.anuke.annotations;
|
package mindustry.annotations;
|
||||||
|
|
||||||
import com.squareup.javapoet.*;
|
import com.squareup.javapoet.*;
|
||||||
import io.anuke.annotations.Annotations.Struct;
|
import mindustry.annotations.Annotations.Struct;
|
||||||
import io.anuke.annotations.Annotations.StructField;
|
import mindustry.annotations.Annotations.StructField;
|
||||||
|
|
||||||
import javax.annotation.processing.*;
|
import javax.annotation.processing.*;
|
||||||
import javax.lang.model.SourceVersion;
|
import javax.lang.model.SourceVersion;
|
||||||
@@ -19,11 +19,11 @@ import java.util.Set;
|
|||||||
*/
|
*/
|
||||||
@SupportedSourceVersion(SourceVersion.RELEASE_8)
|
@SupportedSourceVersion(SourceVersion.RELEASE_8)
|
||||||
@SupportedAnnotationTypes({
|
@SupportedAnnotationTypes({
|
||||||
"io.anuke.annotations.Annotations.Struct"
|
"mindustry.annotations.Annotations.Struct"
|
||||||
})
|
})
|
||||||
public class StructAnnotationProcessor extends AbstractProcessor{
|
public class StructAnnotationProcessor extends AbstractProcessor{
|
||||||
/** 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 = "mindustry.gen";
|
||||||
private int round;
|
private int round;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package io.anuke.annotations;
|
package mindustry.annotations;
|
||||||
|
|
||||||
import javax.annotation.processing.Filer;
|
import javax.annotation.processing.Filer;
|
||||||
import javax.annotation.processing.Messager;
|
import javax.annotation.processing.Messager;
|
||||||
BIN
annotations/src/main/resources/DS_Store
Normal file
@@ -1,5 +1,5 @@
|
|||||||
io.anuke.annotations.RemoteMethodAnnotationProcessor
|
mindustry.annotations.RemoteMethodAnnotationProcessor
|
||||||
io.anuke.annotations.SerializeAnnotationProcessor
|
mindustry.annotations.SerializeAnnotationProcessor
|
||||||
io.anuke.annotations.StructAnnotationProcessor
|
mindustry.annotations.StructAnnotationProcessor
|
||||||
io.anuke.annotations.CallSuperAnnotationProcessor
|
mindustry.annotations.CallSuperAnnotationProcessor
|
||||||
io.anuke.annotations.AssetsAnnotationProcessor
|
mindustry.annotations.AssetsAnnotationProcessor
|
||||||
121
build.gradle
@@ -5,46 +5,45 @@ buildscript{
|
|||||||
google()
|
google()
|
||||||
maven{ url "https://oss.sonatype.org/content/repositories/snapshots/" }
|
maven{ url "https://oss.sonatype.org/content/repositories/snapshots/" }
|
||||||
jcenter()
|
jcenter()
|
||||||
|
maven{ url 'https://jitpack.io' }
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies{
|
dependencies{
|
||||||
classpath 'com.mobidevelop.robovm:robovm-gradle-plugin:2.3.7'
|
classpath 'com.mobidevelop.robovm:robovm-gradle-plugin:2.3.8'
|
||||||
classpath "com.badlogicgames.gdx:gdx-tools:1.9.10"
|
classpath "com.badlogicgames.gdx:gdx-tools:1.9.10"
|
||||||
classpath "com.badlogicgames.packr:packr:2.1-SNAPSHOT"
|
classpath "com.github.anuken:packr:-SNAPSHOT"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
allprojects{
|
allprojects{
|
||||||
version = 'release'
|
version = 'release'
|
||||||
|
apply plugin: 'maven'
|
||||||
|
group = 'com.github.Anuken'
|
||||||
|
|
||||||
ext{
|
ext{
|
||||||
versionNumber = '4'
|
versionNumber = '5'
|
||||||
versionModifier = 'release'
|
if(!project.hasProperty("versionModifier")) versionModifier = 'release'
|
||||||
if(!project.hasProperty("versionType")) versionType = 'official'
|
if(!project.hasProperty("versionType")) versionType = 'official'
|
||||||
appName = 'Mindustry'
|
appName = 'Mindustry'
|
||||||
gdxVersion = '1.9.10'
|
gdxVersion = '1.9.10'
|
||||||
roboVMVersion = '2.3.7'
|
roboVMVersion = '2.3.8'
|
||||||
|
steamworksVersion = '891ed912791e01fe9ee6237a6497e5212b85c256'
|
||||||
arcHash = null
|
arcHash = null
|
||||||
|
|
||||||
|
loadVersionProps = {
|
||||||
|
return new Properties().with{p -> p.load(file('../core/assets/version.properties').newReader()); return p }
|
||||||
|
}
|
||||||
|
|
||||||
debugged = {
|
debugged = {
|
||||||
return new File(projectDir.parent, '../debug').exists() && !project.hasProperty("release") && project.hasProperty("args")
|
return new File(projectDir.parent, '../Mindustry-Debug').exists() && !project.hasProperty("release") && project.hasProperty("args")
|
||||||
}
|
}
|
||||||
|
|
||||||
localArc = {
|
localArc = {
|
||||||
return (!project.hasProperty("release")) && new File(projectDir.parent, '../Arc').exists()
|
return !project.hasProperty("release") && new File(projectDir.parent, '../Arc').exists()
|
||||||
}
|
}
|
||||||
|
|
||||||
getArcHash = {
|
getArcHash = {
|
||||||
//get latest commit hash from github since JITPack's '-snapshot' version doesn't work correctly
|
return new Properties().with{ p -> p.load(file('gradle.properties').newReader()); return p }["archash"]
|
||||||
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 ->
|
arcModule = { String name ->
|
||||||
@@ -119,6 +118,7 @@ allprojects{
|
|||||||
props.load(new FileInputStream(pfile))
|
props.load(new FileInputStream(pfile))
|
||||||
|
|
||||||
String buildid = getBuildVersion()
|
String buildid = getBuildVersion()
|
||||||
|
println("Compiling with build: '$buildid'")
|
||||||
|
|
||||||
props["type"] = versionType
|
props["type"] = versionType
|
||||||
props["number"] = versionNumber
|
props["number"] = versionNumber
|
||||||
@@ -147,32 +147,16 @@ project(":desktop"){
|
|||||||
|
|
||||||
dependencies{
|
dependencies{
|
||||||
compile project(":core")
|
compile project(":core")
|
||||||
compile project(":net")
|
|
||||||
|
|
||||||
if(debugged()) compile project(":debug")
|
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-freetype-platform:$gdxVersion:natives-desktop"
|
compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-desktop"
|
||||||
|
|
||||||
compile arcModule("backends:backend-lwjgl3")
|
compile "com.github.Anuken:steamworks4j:$steamworksVersion"
|
||||||
compile 'com.github.MinnDevelopment:java-discord-rpc:v2.0.2'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
project(":desktop-sdl"){
|
|
||||||
apply plugin: "java"
|
|
||||||
|
|
||||||
dependencies{
|
|
||||||
compile project(":core")
|
|
||||||
compile project(":net")
|
|
||||||
|
|
||||||
if(debugged()) compile project(":debug")
|
|
||||||
|
|
||||||
compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop"
|
|
||||||
compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-desktop"
|
|
||||||
|
|
||||||
compile arcModule("backends:backend-sdl")
|
compile arcModule("backends:backend-sdl")
|
||||||
compile 'com.github.MinnDevelopment:java-discord-rpc:v2.0.2'
|
compile 'com.github.MinnDevelopment:java-discord-rpc:v2.0.1'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -182,24 +166,23 @@ project(":ios"){
|
|||||||
|
|
||||||
task incrementConfig{
|
task incrementConfig{
|
||||||
def vfile = file('robovm.properties')
|
def vfile = file('robovm.properties')
|
||||||
|
|
||||||
def props = new Properties()
|
def props = new Properties()
|
||||||
if(vfile.exists()){
|
if(vfile.exists()){
|
||||||
props.load(new FileInputStream(vfile))
|
props.load(new FileInputStream(vfile))
|
||||||
}
|
}else{
|
||||||
|
|
||||||
props['app.id'] = 'io.anuke.mindustry'
|
props['app.id'] = 'io.anuke.mindustry'
|
||||||
props['app.version'] = '4.0'
|
props['app.version'] = '5.0'
|
||||||
props['app.mainclass'] = 'io.anuke.mindustry.IOSLauncher'
|
props['app.mainclass'] = 'mindustry.IOSLauncher'
|
||||||
props['app.executable'] = 'IOSLauncher'
|
props['app.executable'] = 'IOSLauncher'
|
||||||
props['app.name'] = 'Mindustry'
|
props['app.name'] = 'Mindustry'
|
||||||
|
}
|
||||||
|
|
||||||
props['app.build'] = (!props.containsKey("app.build") ? 40 : props['app.build'].toInteger() + 1) + ""
|
props['app.build'] = (!props.containsKey("app.build") ? 40 : props['app.build'].toInteger() + 1) + ""
|
||||||
props.store(vfile.newWriter(), null)
|
props.store(vfile.newWriter(), null)
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies{
|
dependencies{
|
||||||
compile project(":core")
|
compile project(":core")
|
||||||
compile project(":net")
|
|
||||||
compileOnly project(":annotations")
|
compileOnly project(":annotations")
|
||||||
|
|
||||||
compile arcModule("backends:backend-robovm")
|
compile arcModule("backends:backend-robovm")
|
||||||
@@ -215,7 +198,30 @@ project(":core"){
|
|||||||
apply plugin: "java"
|
apply plugin: "java"
|
||||||
|
|
||||||
task preGen{
|
task preGen{
|
||||||
|
outputs.upToDateWhen{ false }
|
||||||
generateLocales()
|
generateLocales()
|
||||||
|
writeVersion()
|
||||||
|
}
|
||||||
|
|
||||||
|
task copyChangelog{
|
||||||
|
doLast{
|
||||||
|
def props = loadVersionProps()
|
||||||
|
def androidVersion = props['androidBuildCode'].toInteger() - 2
|
||||||
|
def buildVersion = props["build"]
|
||||||
|
def loglines = file("../changelog").text.split("\n")
|
||||||
|
def maxLength = 460
|
||||||
|
|
||||||
|
def androidLogList = loglines.findAll{ line -> !line.endsWith("]") || line.endsWith("[Mobile]") || line.endsWith("[Android]")}
|
||||||
|
def result = ""
|
||||||
|
androidLogList.forEach({line ->
|
||||||
|
if(result.length() + line.length() + 1 < maxLength){
|
||||||
|
result += line + "\n"
|
||||||
|
}
|
||||||
|
})
|
||||||
|
def changelogs = file("../fastlane/metadata/android/en-US/changelogs/")
|
||||||
|
new File(changelogs, buildVersion + ".txt").text = (result)
|
||||||
|
new File(changelogs, androidVersion + ".txt").text = (result)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies{
|
dependencies{
|
||||||
@@ -223,7 +229,7 @@ project(":core"){
|
|||||||
task cleanGen{
|
task cleanGen{
|
||||||
doFirst{
|
doFirst{
|
||||||
delete{
|
delete{
|
||||||
delete "../core/src/io/anuke/mindustry/gen/"
|
delete "../core/src/mindustry/gen/"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -231,11 +237,11 @@ project(":core"){
|
|||||||
task copyGen{
|
task copyGen{
|
||||||
doLast{
|
doLast{
|
||||||
copy{
|
copy{
|
||||||
from("../core/build/generated/sources/annotationProcessor/java/main/io/anuke/mindustry/gen"){
|
from("../core/build/generated/sources/annotationProcessor/java/main/mindustry/gen"){
|
||||||
include "**/*.java"
|
include "**/*.java"
|
||||||
}
|
}
|
||||||
|
|
||||||
into "../core/src/io/anuke/mindustry/gen"
|
into "../core/src/mindustry/gen"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -246,9 +252,11 @@ project(":core"){
|
|||||||
|
|
||||||
compileJava.dependsOn(preGen)
|
compileJava.dependsOn(preGen)
|
||||||
|
|
||||||
|
compile "org.lz4:lz4-java:1.4.1"
|
||||||
compile arcModule("arc-core")
|
compile arcModule("arc-core")
|
||||||
compile arcModule("extensions:freetype")
|
compile arcModule("extensions:freetype")
|
||||||
compile arcModule("extensions:arcnet")
|
compile arcModule("extensions:arcnet")
|
||||||
|
compile "org.mozilla:rhino:1.7.11"
|
||||||
if(localArc() && debugged()) compile arcModule("extensions:recorder")
|
if(localArc() && debugged()) compile arcModule("extensions:recorder")
|
||||||
|
|
||||||
compileOnly project(":annotations")
|
compileOnly project(":annotations")
|
||||||
@@ -261,7 +269,6 @@ project(":server"){
|
|||||||
|
|
||||||
dependencies{
|
dependencies{
|
||||||
compile project(":core")
|
compile project(":core")
|
||||||
compile project(":net")
|
|
||||||
compile arcModule("backends:backend-headless")
|
compile arcModule("backends:backend-headless")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -289,9 +296,9 @@ project(":tools"){
|
|||||||
dependencies{
|
dependencies{
|
||||||
compile project(":core")
|
compile project(":core")
|
||||||
|
|
||||||
//for render tests
|
|
||||||
compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop"
|
compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop"
|
||||||
compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-desktop"
|
compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-desktop"
|
||||||
|
compile "org.reflections:reflections:0.9.11"
|
||||||
|
|
||||||
compile arcModule("backends:backend-sdl")
|
compile arcModule("backends:backend-sdl")
|
||||||
}
|
}
|
||||||
@@ -306,11 +313,23 @@ project(":annotations"){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
project(":net"){
|
task deployAll{
|
||||||
apply plugin: "java"
|
task cleanDeployOutput{
|
||||||
|
doFirst{
|
||||||
|
if("${getBuildVersion()}" == "custom build" || "${getBuildVersion()}" == "") throw new IllegalArgumentException("----\n\nSET A BUILD NUMBER FIRST!\n\n----")
|
||||||
|
if(!project.hasProperty("release")) throw new IllegalArgumentException("----\n\nSET THE RELEASE PROJECT PROPERTY FIRST!\n\n----")
|
||||||
|
|
||||||
dependencies{
|
delete{
|
||||||
compile project(":core")
|
delete "deploy/"
|
||||||
compile "org.lz4:lz4-java:1.4.1"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dependsOn cleanDeployOutput
|
||||||
|
dependsOn "desktop:packrLinux64"
|
||||||
|
dependsOn "desktop:packrWindows64"
|
||||||
|
dependsOn "desktop:packrWindows32"
|
||||||
|
dependsOn "desktop:packrMacOS"
|
||||||
|
dependsOn "server:deploy"
|
||||||
|
dependsOn "android:deploy"
|
||||||
|
}
|
||||||
|
|||||||
BIN
core/assets-raw/fonts/EkkamaiNew-Regular.ttf
Normal file
BIN
core/assets-raw/fonts/RussoOne-Regular.ttf
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 2.1 KiB |
|
After Width: | Height: | Size: 2.1 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 2.1 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
BIN
core/assets-raw/sprites/blocks/distribution/inverted-sorter.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 200 B After Width: | Height: | Size: 1.4 KiB |
BIN
core/assets-raw/sprites/blocks/extra/message.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
core/assets-raw/sprites/blocks/extra/rubble-5-0.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
core/assets-raw/sprites/blocks/extra/rubble-5-1.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
core/assets-raw/sprites/blocks/extra/rubble-6-0.png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
BIN
core/assets-raw/sprites/blocks/extra/rubble-6-1.png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
BIN
core/assets-raw/sprites/blocks/extra/rubble-7-0.png
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
BIN
core/assets-raw/sprites/blocks/extra/rubble-7-1.png
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
BIN
core/assets-raw/sprites/blocks/extra/rubble-8-0.png
Normal file
|
After Width: | Height: | Size: 3.7 KiB |
BIN
core/assets-raw/sprites/blocks/extra/rubble-8-1.png
Normal file
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 1.8 KiB |
BIN
core/assets-raw/sprites/blocks/liquid/liquid-overflow-gate.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
core/assets-raw/sprites/blocks/liquid/plated-conduit-cap.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
core/assets-raw/sprites/blocks/liquid/plated-conduit-top-0.png
Normal file
|
After Width: | Height: | Size: 4.0 KiB |
BIN
core/assets-raw/sprites/blocks/liquid/plated-conduit-top-1.png
Normal file
|
After Width: | Height: | Size: 4.1 KiB |
BIN
core/assets-raw/sprites/blocks/liquid/plated-conduit-top-2.png
Normal file
|
After Width: | Height: | Size: 3.9 KiB |
BIN
core/assets-raw/sprites/blocks/liquid/plated-conduit-top-3.png
Normal file
|
After Width: | Height: | Size: 4.0 KiB |
BIN
core/assets-raw/sprites/blocks/liquid/plated-conduit-top-4.png
Normal file
|
After Width: | Height: | Size: 3.9 KiB |
BIN
core/assets-raw/sprites/blocks/liquid/plated-conduit-top-5.png
Normal file
|
After Width: | Height: | Size: 4.0 KiB |
BIN
core/assets-raw/sprites/blocks/liquid/plated-conduit-top-6.png
Normal file
|
After Width: | Height: | Size: 4.0 KiB |
BIN
core/assets-raw/sprites/blocks/power/diode-arrow.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
core/assets-raw/sprites/blocks/power/diode.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
core/assets-raw/sprites/blocks/power/illuminator-top.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
core/assets-raw/sprites/blocks/power/illuminator.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
core/assets-raw/sprites/blocks/storage/unloader-center.png
Normal file
|
After Width: | Height: | Size: 2.5 KiB |
BIN
core/assets-raw/sprites/blocks/units/command-center.png
Normal file
|
After Width: | Height: | Size: 4.8 KiB |
BIN
core/assets-raw/sprites/blocks/units/rally-point.png
Normal file
|
After Width: | Height: | Size: 6.3 KiB |
BIN
core/assets-raw/sprites/blocks/walls/insulator-wall-large.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
core/assets-raw/sprites/blocks/walls/insulator-wall.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
core/assets-raw/sprites/blocks/walls/plastanium-wall-large.png
Normal file
|
After Width: | Height: | Size: 3.7 KiB |
BIN
core/assets-raw/sprites/blocks/walls/plastanium-wall.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
core/assets-raw/sprites/effects/circle-end.png
Normal file
|
After Width: | Height: | Size: 7.8 KiB |
BIN
core/assets-raw/sprites/effects/circle-mid.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 9.6 KiB After Width: | Height: | Size: 14 KiB |
BIN
core/assets-raw/sprites/ui/alpha-bg.png
Normal file
|
After Width: | Height: | Size: 754 B |
|
Before Width: | Height: | Size: 91 B After Width: | Height: | Size: 91 B |
BIN
core/assets-raw/sprites/ui/icons/icon-command-attack.png
Normal file
|
After Width: | Height: | Size: 109 B |
BIN
core/assets-raw/sprites/ui/icons/icon-command-patrol.png
Normal file
|
After Width: | Height: | Size: 104 B |
BIN
core/assets-raw/sprites/ui/icons/icon-command-rally.png
Normal file
|
After Width: | Height: | Size: 95 B |
BIN
core/assets-raw/sprites/ui/icons/icon-command-retreat.png
Normal file
|
After Width: | Height: | Size: 94 B |
BIN
core/assets-raw/sprites/ui/icons/icon-f-droid.png
Normal file
|
After Width: | Height: | Size: 2.5 KiB |
BIN
core/assets-raw/sprites/ui/icons/icon-fdroid.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
core/assets-raw/sprites/ui/icons/icon-feathub.png
Normal file
|
After Width: | Height: | Size: 189 B |
BIN
core/assets-raw/sprites/ui/icons/icon-flip.png
Normal file
|
After Width: | Height: | Size: 4.2 KiB |
BIN
core/assets-raw/sprites/ui/icons/icon-reddit.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |