Compare commits
1520 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 | ||
|
|
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 | ||
|
|
a45fc2c030 | ||
|
|
78471c1860 | ||
|
|
7eb3e5c0ea | ||
|
|
adc7c2bdb6 | ||
|
|
bef8b905de | ||
|
|
4d91c8f8b7 | ||
|
|
53c842492a | ||
|
|
3d624f7eaf | ||
|
|
92dacf18cd | ||
|
|
6743bd144f | ||
|
|
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 | ||
|
|
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 | ||
|
|
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 | ||
|
|
2019196f65 | ||
|
|
a815763833 | ||
|
|
92a3f150bb | ||
|
|
000b23d703 | ||
|
|
438b3d9752 | ||
|
|
a9edee1550 | ||
|
|
b63de8b7d6 | ||
|
|
5e0e3f4522 | ||
|
|
a74722aea5 | ||
|
|
4e55cbbfe8 | ||
|
|
5f8b9f301a | ||
|
|
c387817157 | ||
|
|
b3666ed2a8 | ||
|
|
3b8fd10f70 | ||
|
|
7c0106e62f | ||
|
|
8609400d76 | ||
|
|
0b0aa36aab | ||
|
|
70ab102d8c | ||
|
|
1f24d936d8 | ||
|
|
f925ec8cbe | ||
|
|
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 | ||
|
|
a1da82a173 | ||
|
|
f1456190b5 | ||
|
|
03bb94da23 | ||
|
|
5aa574bc71 | ||
|
|
99c0291b0e | ||
|
|
89c195d96b | ||
|
|
86f3fffa91 | ||
|
|
e191362c4f | ||
|
|
8c0cff0c65 | ||
|
|
db31238b00 | ||
|
|
c18b730d7c | ||
|
|
7ad85f6ffb | ||
|
|
45a79624b1 | ||
|
|
65dde8bc97 | ||
|
|
83dce4d8d2 | ||
|
|
6680326392 | ||
|
|
cc222034cb | ||
|
|
5b0250ee74 | ||
|
|
eb52f3b902 | ||
|
|
9add64ae8d | ||
|
|
20c5aadefe | ||
|
|
34896a805e | ||
|
|
722b488795 | ||
|
|
228a3f67e1 | ||
|
|
4fc0a93a1f | ||
|
|
ecd73dcc2c | ||
|
|
7f43c4377c | ||
|
|
ab998e87f8 | ||
|
|
6c53aaf67f | ||
|
|
b6e97c4261 | ||
|
|
a2750c8aff | ||
|
|
2c0372f680 | ||
|
|
2dceb8927c | ||
|
|
e5cf2161d4 | ||
|
|
b2bae64215 | ||
|
|
552dc254da | ||
|
|
dc51afdc60 | ||
|
|
3f293190cf | ||
|
|
7f299869c5 | ||
|
|
c45805e703 | ||
|
|
d062d8081a | ||
|
|
5955ecefd3 | ||
|
|
0d25d83651 | ||
|
|
1957b6aa12 | ||
|
|
4fa173f0f5 | ||
|
|
fed3bcd79d | ||
|
|
dda1f18f67 | ||
|
|
025386af53 | ||
|
|
bd1ea41c0d | ||
|
|
5d729c1e8d | ||
|
|
1fac4c59a3 | ||
|
|
0e9296913c | ||
|
|
50d379d94d | ||
|
|
d6a4149175 | ||
|
|
5a0669d437 | ||
|
|
0d29d94800 | ||
|
|
1e667946b3 | ||
|
|
c6a4bf69ee | ||
|
|
5d0cfc3599 | ||
|
|
2424afa1fb | ||
|
|
69944a2b63 | ||
|
|
0ceb58a105 | ||
|
|
5e8da856e7 | ||
|
|
ee412e1994 | ||
|
|
02736524bd | ||
|
|
c357b97b3b | ||
|
|
dbe7251c6b | ||
|
|
7ae90f655c | ||
|
|
669ce6dfbb | ||
|
|
4dc55e5594 | ||
|
|
4b824f7a4c | ||
|
|
3435132e87 | ||
|
|
d49b15b2a0 | ||
|
|
0c59553b3d | ||
|
|
4a50192937 | ||
|
|
f65ab00250 | ||
|
|
f71c3af2e1 | ||
|
|
77fb9e3d3e | ||
|
|
c1d6674797 | ||
|
|
659aaba0b9 | ||
|
|
a3816f6355 | ||
|
|
4829f040c2 | ||
|
|
59826f5189 | ||
|
|
a6fac9e56a | ||
|
|
68f0ef1bd2 | ||
|
|
d53882a086 | ||
|
|
7c7306d37b | ||
|
|
d5a9938354 | ||
|
|
3fad378b69 | ||
|
|
afb47344c6 | ||
|
|
5ba7e1d08b | ||
|
|
681347e933 | ||
|
|
f1bf8a0f1a | ||
|
|
874b41cb46 | ||
|
|
d3876b6376 | ||
|
|
f72f2bdf5d | ||
|
|
af91e17b13 | ||
|
|
69bfd8f54d | ||
|
|
369c3b569c | ||
|
|
8480e656b9 | ||
|
|
fb29324905 | ||
|
|
ed88633712 | ||
|
|
cd456f80a4 | ||
|
|
6d61515e28 | ||
|
|
38af936e3f | ||
|
|
d59f5ddc59 | ||
|
|
6c07c5006a | ||
|
|
d4d060a500 | ||
|
|
55e43761e9 | ||
|
|
b1edaa1408 | ||
|
|
d8d9762998 | ||
|
|
dd93284062 | ||
|
|
19c76fc741 | ||
|
|
1013455b0f | ||
|
|
066e4380e1 | ||
|
|
55da9df2a1 | ||
|
|
4b26c57a20 | ||
|
|
d0491dd68a | ||
|
|
cd8cc34c31 | ||
|
|
0249ebf718 | ||
|
|
7fb4eeb998 | ||
|
|
0cd7313523 | ||
|
|
5c3fc2a6ba | ||
|
|
19f888061f | ||
|
|
4e8a02be7d | ||
|
|
2231062c19 | ||
|
|
fb4faa15bb | ||
|
|
e6d05926dd | ||
|
|
ca9f18325c | ||
|
|
bd96ae5a48 | ||
|
|
cf1cc2ca49 | ||
|
|
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 | ||
|
|
c678b53d3f | ||
|
|
ea30cc7d19 | ||
|
|
a2772d09f3 | ||
|
|
a0016f001c | ||
|
|
ca532f271f | ||
|
|
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 | ||
|
|
3d69e9c763 | ||
|
|
9f5a0ca4e9 | ||
|
|
43245681fe | ||
|
|
9d214a77d7 | ||
|
|
5134aca723 | ||
|
|
40405332ec | ||
|
|
8d61f3b479 | ||
|
|
bd15287420 | ||
|
|
5dfc3fd576 | ||
|
|
1e80bdf19f | ||
|
|
76cd7ba8d1 | ||
|
|
1dfa0d08de | ||
|
|
1fc9c82aaf | ||
|
|
600a2b5ad7 | ||
|
|
cb60556ac0 | ||
|
|
62f683b871 | ||
|
|
f22d32c15e | ||
|
|
a3d8586199 | ||
|
|
0a471441cc | ||
|
|
73149123b4 | ||
|
|
5c6f2171f4 | ||
|
|
fd973038bb | ||
|
|
b7dff91d01 | ||
|
|
e314d199f0 | ||
|
|
3938c199f6 | ||
|
|
962eef4a1d | ||
|
|
97443a86cb | ||
|
|
7137616224 | ||
|
|
444825a5c1 | ||
|
|
986deaa6c7 | ||
|
|
7b27903de2 | ||
|
|
bbadf6795e | ||
|
|
8b9be6eafe | ||
|
|
da336ea412 | ||
|
|
f1cf95d412 | ||
|
|
6642a3e9ad | ||
|
|
49db7773e8 | ||
|
|
9372819fb8 | ||
|
|
9d07d81551 | ||
|
|
3c9bcf05e2 | ||
|
|
3338da2a91 | ||
|
|
b31858a64f | ||
|
|
8f2a8dc9ba | ||
|
|
44e54cd4df | ||
|
|
36c41557ea | ||
|
|
d0d72101ab | ||
|
|
7b41d65fa6 | ||
|
|
5f9000db92 | ||
|
|
de031b1ddb | ||
|
|
58f46bb75f | ||
|
|
d1e07ec0a2 | ||
|
|
0d4716f3b4 | ||
|
|
9ddfd650dd | ||
|
|
cf9cda4936 | ||
|
|
1880c32f90 | ||
|
|
6d72c08d63 | ||
|
|
95ac1b2c21 | ||
|
|
a33fd45136 | ||
|
|
4e43d2a96b | ||
|
|
d68c8fe72c | ||
|
|
c9d0619289 | ||
|
|
8ea33946c4 | ||
|
|
bef7394004 | ||
|
|
4042bf042e | ||
|
|
643b698c30 | ||
|
|
aba3e3985a | ||
|
|
91f679f762 | ||
|
|
3eeed507cc | ||
|
|
988e1d6e30 | ||
|
|
04b4aabcf6 | ||
|
|
d97fe47206 | ||
|
|
0d8748a6ce | ||
|
|
b360a39fcf | ||
|
|
70b071fa26 | ||
|
|
64badb2cb7 | ||
|
|
3da6634242 | ||
|
|
4b8d072854 | ||
|
|
a1ea393f35 | ||
|
|
32abd991e7 | ||
|
|
3294f800be | ||
|
|
74e3dc2d7d | ||
|
|
a7a49a823b | ||
|
|
14c943adfe | ||
|
|
fb84b4b7c1 | ||
|
|
4089ee424c | ||
|
|
9bf010e222 | ||
|
|
0553fb6b79 | ||
|
|
4bb6a25055 | ||
|
|
66ff7b1592 | ||
|
|
be32810608 | ||
|
|
88f48599a0 | ||
|
|
014e2ac8b8 | ||
|
|
bae88ec416 | ||
|
|
46230ad307 | ||
|
|
963a207194 | ||
|
|
59419e13d9 | ||
|
|
82f43a362f | ||
|
|
b370e04035 | ||
|
|
dfd6e7a07b | ||
|
|
a873560d4e | ||
|
|
f7eea51066 | ||
|
|
c6777bd219 | ||
|
|
8eb4d25638 | ||
|
|
98c35c5291 | ||
|
|
191c6e9016 | ||
|
|
33c1579e9c | ||
|
|
52af0b1db9 | ||
|
|
492cb49805 | ||
|
|
e482c2c318 | ||
|
|
5b387e7e17 | ||
|
|
b2e70a44be | ||
|
|
452a8aaa0c | ||
|
|
c3f392a01c | ||
|
|
7d9b6a41fc | ||
|
|
f4f4cf3947 | ||
|
|
28e930eb4b | ||
|
|
301387fb32 | ||
|
|
5955387bdd | ||
|
|
150491ff2c | ||
|
|
c7d735bf56 | ||
|
|
1f4dbd0024 | ||
|
|
ddef78c7d8 | ||
|
|
dc435d88f4 | ||
|
|
84aff0112d | ||
|
|
a13f8ed05f | ||
|
|
0429abbb28 | ||
|
|
562d3e6528 | ||
|
|
ac27b484fa | ||
|
|
3c57c3e492 | ||
|
|
83f9f5d34a | ||
|
|
c659e4f0aa | ||
|
|
723ee3c647 | ||
|
|
32baa279e2 | ||
|
|
17b17979ab | ||
|
|
c94ab5b05a | ||
|
|
625a0125cb | ||
|
|
9f8c1b3d20 | ||
|
|
cc6ed88878 | ||
|
|
73523a96fa | ||
|
|
62e3bc86eb | ||
|
|
a12af852ab | ||
|
|
6f2fc00045 | ||
|
|
9e0de644c4 | ||
|
|
393bdfccaf | ||
|
|
56c39799c8 | ||
|
|
7f2a1374e4 | ||
|
|
6fa0ac56ac | ||
|
|
89ee04c942 | ||
|
|
c058163ab4 | ||
|
|
2832dc69ef | ||
|
|
cb2e2ab9b2 | ||
|
|
f342c38c62 | ||
|
|
811e456f8f | ||
|
|
000503d674 | ||
|
|
d0bd29cfa0 | ||
|
|
d56565990e | ||
|
|
b68734d679 | ||
|
|
bf21c94bd7 | ||
|
|
b6b9685d57 | ||
|
|
f8adbda9c5 | ||
|
|
c9178c3f2f | ||
|
|
84786c12d8 | ||
|
|
335b6ae0cc | ||
|
|
9bde68a86f | ||
|
|
c3201178ae | ||
|
|
366636ef7d | ||
|
|
47112e233e | ||
|
|
88f005be0c | ||
|
|
f454cd3291 | ||
|
|
23038dc6f7 | ||
|
|
58b4f64125 | ||
|
|
974ab59fd2 | ||
|
|
f2f6dc89a2 | ||
|
|
bff9d89232 | ||
|
|
a818da5eb7 | ||
|
|
a1269c05c5 | ||
|
|
d0ff0307f5 | ||
|
|
c4aa0b2863 | ||
|
|
85fd2ad804 | ||
|
|
0770574f17 | ||
|
|
6314bf51df | ||
|
|
4c08c98f8c | ||
|
|
2341da995e | ||
|
|
4ef60af4a8 | ||
|
|
16f6b51857 | ||
|
|
59e53eb672 | ||
|
|
c7724e9122 | ||
|
|
2c4379acd1 | ||
|
|
69e7b442e2 | ||
|
|
70a4c2f3ed | ||
|
|
83c86b3883 | ||
|
|
9924796ad9 | ||
|
|
b587b6bb4d | ||
|
|
4811578c95 | ||
|
|
0a07c62b63 | ||
|
|
c1ff370923 | ||
|
|
e55575f093 | ||
|
|
703f034054 | ||
|
|
2d504521b1 | ||
|
|
8359789d4f | ||
|
|
8162e13f04 | ||
|
|
282aab5939 | ||
|
|
5c6bcbf9cd | ||
|
|
8ef1d54a16 | ||
|
|
e8bbc2bf4c | ||
|
|
b02053a70c | ||
|
|
99f2b8f536 | ||
|
|
8346d5fc13 | ||
|
|
3a841c6c0f | ||
|
|
ecd30094b1 | ||
|
|
81909bd1a9 | ||
|
|
1cb01af77b | ||
|
|
a65592d511 | ||
|
|
4ee6f60531 | ||
|
|
319d65f9a3 | ||
|
|
bc8c99df15 | ||
|
|
aef3a719fe | ||
|
|
2726ebe191 | ||
|
|
85767d4946 | ||
|
|
86a78b206a | ||
|
|
4e308d6600 | ||
|
|
7f2cc59b3c | ||
|
|
878901d05d | ||
|
|
d1304abb9e | ||
|
|
4ae39e851d | ||
|
|
06c5c92d2c | ||
|
|
fc6e529049 | ||
|
|
438f128e2e | ||
|
|
878af1ea28 | ||
|
|
8e84e7284e | ||
|
|
77d4b0972d | ||
|
|
2a518fa7c9 | ||
|
|
04c8ecf4af | ||
|
|
67743dded5 | ||
|
|
5acda423d8 | ||
|
|
8b3995686f | ||
|
|
f388ca298e | ||
|
|
636b92205b | ||
|
|
26d26b5e7a | ||
|
|
01efb59d25 | ||
|
|
b1980a17ac | ||
|
|
69ee5257f2 | ||
|
|
5573031d07 | ||
|
|
b812fcddf8 | ||
|
|
8393639735 | ||
|
|
dafbba0907 | ||
|
|
28ab2b3917 | ||
|
|
2be3cc2f1e | ||
|
|
d8085d88a8 | ||
|
|
d6b023709d | ||
|
|
2459fb23ae | ||
|
|
4bd3f415a9 | ||
|
|
4414ee6d38 | ||
|
|
fdd84066f5 | ||
|
|
4ebf39449e | ||
|
|
d4f26e0340 | ||
|
|
a00a208ff8 | ||
|
|
bc77fd619d | ||
|
|
5eadd6608d | ||
|
|
1340b8d4d8 | ||
|
|
9db86f212f | ||
|
|
697894274f | ||
|
|
7292479d9c | ||
|
|
301c11c208 | ||
|
|
71b218ad62 | ||
|
|
ec2f21b944 | ||
|
|
c65b3f3aca | ||
|
|
43280ee077 | ||
|
|
c7e4fb8021 | ||
|
|
132d058098 | ||
|
|
c678a5502d | ||
|
|
0ee35721b0 | ||
|
|
1932f9a9c3 | ||
|
|
8e85b71669 | ||
|
|
f439afae9e | ||
|
|
fdd749be18 | ||
|
|
666e3e51a3 | ||
|
|
b930d5a1f9 | ||
|
|
5c10a2662d | ||
|
|
214f451cc1 | ||
|
|
67b4fa6f68 | ||
|
|
aa3e7a8ef5 | ||
|
|
7bf6099528 | ||
|
|
e90a4eb71d | ||
|
|
7b83406ee4 | ||
|
|
c4157d2ec8 | ||
|
|
2bdfaef2d9 | ||
|
|
2b0fbd9904 | ||
|
|
0ffa0351b5 | ||
|
|
951cbf3d16 | ||
|
|
69454048ad | ||
|
|
c4ceb89240 | ||
|
|
4a638cba79 | ||
|
|
c209528271 | ||
|
|
0d1f590937 | ||
|
|
b59b839029 | ||
|
|
513243ba0f | ||
|
|
795e774119 | ||
|
|
d02d419729 | ||
|
|
518bffe644 | ||
|
|
88d1b31aff | ||
|
|
4db2dbff44 | ||
|
|
32ad577f6d | ||
|
|
3310f49f68 | ||
|
|
bf7803d554 | ||
|
|
c9bd253960 | ||
|
|
859591cea5 | ||
|
|
b99b13a6e4 | ||
|
|
c80be4940f | ||
|
|
52374ce06d | ||
|
|
5a594f7d9a | ||
|
|
aff87a26ce | ||
|
|
18aae0cfa5 | ||
|
|
6f0bc2ecf8 | ||
|
|
8d2a637bd8 | ||
|
|
54180c4768 | ||
|
|
4e22384ed1 | ||
|
|
029f801159 | ||
|
|
fd53671430 | ||
|
|
7b09548261 | ||
|
|
63e1311656 | ||
|
|
36a303a86f | ||
|
|
61f903dcf1 | ||
|
|
2a10562e9e | ||
|
|
d64796f32a | ||
|
|
f2d67d0a5d | ||
|
|
ad39a51fe8 | ||
|
|
14d0927fb6 | ||
|
|
1697465d0d | ||
|
|
e52965d039 | ||
|
|
a8d957bf7d | ||
|
|
b6b5343e04 | ||
|
|
d4c318438d | ||
|
|
d8d04f2ac3 | ||
|
|
1c38e73290 | ||
|
|
7fc6b9b940 | ||
|
|
ed50ed8550 | ||
|
|
fb4c65dae0 | ||
|
|
fc9543baa7 | ||
|
|
b0eaca091a | ||
|
|
aab13a5582 | ||
|
|
f852ba02d8 | ||
|
|
4aa074b9fc | ||
|
|
2f7503c752 | ||
|
|
d754593c2b | ||
|
|
07ea938885 | ||
|
|
ac87930672 | ||
|
|
3dfef06bba | ||
|
|
120faf3806 | ||
|
|
f51f04d170 | ||
|
|
ec7bb78ee4 | ||
|
|
5ae1e59b5c | ||
|
|
e3956ebcf2 | ||
|
|
bb75e8f2e0 | ||
|
|
a77b1416e5 | ||
|
|
121e0a433b | ||
|
|
988aee3078 | ||
|
|
2bb99bb100 | ||
|
|
4e7ddc7e71 | ||
|
|
174caef7ca | ||
|
|
d2bb3800e3 | ||
|
|
f0959ab356 | ||
|
|
2c5546c6fb | ||
|
|
a7a565b93e | ||
|
|
ed074bd08b | ||
|
|
d938b22729 | ||
|
|
bd88a2378f | ||
|
|
0371126ccf | ||
|
|
ab36b6a2e1 | ||
|
|
d43d4a1773 | ||
|
|
0837c476a1 | ||
|
|
77a41b1783 | ||
|
|
0d39400f8b | ||
|
|
d3c8678f80 | ||
|
|
b7008072f8 | ||
|
|
15737810f0 | ||
|
|
5036c57372 | ||
|
|
5799e6f567 | ||
|
|
310e8afc25 | ||
|
|
78215363dc | ||
|
|
4e873f8bf3 | ||
|
|
79dc116e6a | ||
|
|
a7480ae656 | ||
|
|
62e310a776 | ||
|
|
bb398a2f1e | ||
|
|
79ab2d122d | ||
|
|
3a2f73a176 | ||
|
|
217237b57e | ||
|
|
cb7b6eb3f8 | ||
|
|
6e21d7f560 | ||
|
|
09d905b96f | ||
|
|
8f29d4871d | ||
|
|
94f175e2cd | ||
|
|
5e15c5574a | ||
|
|
1c530a6c7a | ||
|
|
8fc0872b90 | ||
|
|
3021cc29da | ||
|
|
c77f51b7ae | ||
|
|
aa39d36663 | ||
|
|
40907db32d | ||
|
|
12bff75586 | ||
|
|
8bc59fb67c | ||
|
|
ab5319f3d1 | ||
|
|
6128df0062 | ||
|
|
142938cdca | ||
|
|
b32efe129e | ||
|
|
2b20272a61 | ||
|
|
d9ef79a7b5 | ||
|
|
576f0be4ab | ||
|
|
89a4e6506f | ||
|
|
47099a8a9b | ||
|
|
04dfda0c55 | ||
|
|
22656a40b2 | ||
|
|
b6df916700 | ||
|
|
6fa9abd896 | ||
|
|
e239406199 | ||
|
|
b7a0ebad17 | ||
|
|
266744b1dd | ||
|
|
f8526e1ac7 | ||
|
|
ab716e96e2 | ||
|
|
649d527dcf | ||
|
|
c5e7ddaf7a | ||
|
|
b2a4cb42cf | ||
|
|
3fc5941f54 | ||
|
|
741360022b | ||
|
|
86e2f62aed | ||
|
|
e552915637 | ||
|
|
98a51c1f61 | ||
|
|
aa84eefa8f | ||
|
|
22e12ce3e5 | ||
|
|
f4a82b5c01 | ||
|
|
60520ea855 | ||
|
|
b70a0869cd | ||
|
|
7bdd21bb75 | ||
|
|
0dd3736f2a | ||
|
|
deb2d30706 | ||
|
|
c416e1546d | ||
|
|
6d3a67ae59 | ||
|
|
6b60147152 | ||
|
|
8c91aca838 | ||
|
|
b47e282747 | ||
|
|
134d0e7e4a | ||
|
|
26b596760b | ||
|
|
8a5e15e82d | ||
|
|
ffb5eee62a | ||
|
|
387d9b39da | ||
|
|
43b5cb62bb | ||
|
|
580923a646 | ||
|
|
06444f497b | ||
|
|
1676ad5f1b | ||
|
|
478d86677d | ||
|
|
c5e0db8de9 | ||
|
|
228690b400 | ||
|
|
1fe30bc466 | ||
|
|
8e95be0ac2 | ||
|
|
47b1e700ea | ||
|
|
3ad1949727 | ||
|
|
441680861e | ||
|
|
5e848ecbb3 | ||
|
|
c9520e607f | ||
|
|
40a8c52ba1 | ||
|
|
cb6ffd7810 | ||
|
|
185a7bb7d8 | ||
|
|
bc3405d11d | ||
|
|
2804361436 | ||
|
|
4f40f3c4b2 | ||
|
|
897c55c410 | ||
|
|
9e97b5851e | ||
|
|
625fbdb2d7 | ||
|
|
0f32d3f619 | ||
|
|
273c74b275 | ||
|
|
2500d0a930 | ||
|
|
25bf3be009 | ||
|
|
910dab1896 | ||
|
|
6198ad557a | ||
|
|
89b3d3b670 | ||
|
|
122f43ddb9 | ||
|
|
50104d2532 | ||
|
|
f5f30d6026 | ||
|
|
114cd48521 | ||
|
|
548da3ea5f | ||
|
|
2a8b8d040b | ||
|
|
0dc2d4445b | ||
|
|
8ac497354a | ||
|
|
0cbbcc00a5 | ||
|
|
5cfab33ada | ||
|
|
18328320c1 | ||
|
|
73c48afc99 | ||
|
|
62bd0442df | ||
|
|
0aee75c1c1 | ||
|
|
dc3c27297f | ||
|
|
9363946874 | ||
|
|
df78412896 | ||
|
|
16190aa878 | ||
|
|
e6e5b95adc | ||
|
|
990adcd3b3 | ||
|
|
75a5bbdbb1 | ||
|
|
af1746932f | ||
|
|
56ff5689f4 | ||
|
|
0dd15f3141 | ||
|
|
72fb7b9df7 | ||
|
|
d7e1297cce | ||
|
|
3c9d4ee38f | ||
|
|
828e6bb1b7 | ||
|
|
6e42d59716 | ||
|
|
6f589b5c84 | ||
|
|
6d1b8b81fa | ||
|
|
cddd7e0e94 | ||
|
|
340bc5f2f7 | ||
|
|
ecd117cd58 | ||
|
|
ea0788f56c | ||
|
|
4199702b9b | ||
|
|
5946aaa31f | ||
|
|
444b5dbd97 | ||
|
|
695ccfcc4d | ||
|
|
a6d5bdd001 | ||
|
|
bd4d8efd78 | ||
|
|
53baad766f | ||
|
|
8ac746188b | ||
|
|
62dbce089f | ||
|
|
fd5d0b2cbb | ||
|
|
6226e0c5a3 | ||
|
|
01a9be835f | ||
|
|
97eb66b0a5 | ||
|
|
048c5e68f1 | ||
|
|
8f39def993 | ||
|
|
0be674d7af | ||
|
|
e6499f7e5a | ||
|
|
10bd1d1969 | ||
|
|
ec94267b8e | ||
|
|
d3ad113bf5 | ||
|
|
8d7242a1ef | ||
|
|
13879dd374 | ||
|
|
0f519fd358 | ||
|
|
e7fb128499 | ||
|
|
c2d619cb7f | ||
|
|
78176cca90 | ||
|
|
dbc49649c0 | ||
|
|
49ee821029 | ||
|
|
e1499330bc | ||
|
|
222175e005 | ||
|
|
388927715e | ||
|
|
ac9e1febfb | ||
|
|
e47836cc64 | ||
|
|
f8f48f1c88 | ||
|
|
95e8a603a5 | ||
|
|
c400fd88f3 | ||
|
|
095d90fd22 | ||
|
|
797be92ddd | ||
|
|
7f23bd694c | ||
|
|
1cbf8b960a | ||
|
|
c8ce195522 | ||
|
|
4458ae042e | ||
|
|
1c3d7c1c73 | ||
|
|
cb3bbd169f | ||
|
|
ab107bfc0d | ||
|
|
d0b5b49bf8 | ||
|
|
1b4b1d5c9f | ||
|
|
aee800ab7a | ||
|
|
895b46307a | ||
|
|
d300d45f22 | ||
|
|
dd05f5278c | ||
|
|
1897008c72 | ||
|
|
328cdac60f | ||
|
|
3942c6cd55 | ||
|
|
f0f7b5aaf7 | ||
|
|
3ad9e44891 | ||
|
|
80bdaa1edc | ||
|
|
39acb224d1 | ||
|
|
f51d565db8 | ||
|
|
d608cf6536 | ||
|
|
0b49bd1985 | ||
|
|
fce69005a9 | ||
|
|
b73420b156 | ||
|
|
fb863cb39b | ||
|
|
8247ff15ed | ||
|
|
af8db9062c | ||
|
|
9039d52817 | ||
|
|
88d5e1cca8 | ||
|
|
57544e615f | ||
|
|
61a92d55ae | ||
|
|
940965f03d | ||
|
|
30a254e9be | ||
|
|
581782af28 | ||
|
|
72cad1409f | ||
|
|
e7e4985761 | ||
|
|
cdb3d29767 | ||
|
|
90fe5329e3 | ||
|
|
22e20cb2da | ||
|
|
a3454e50d7 | ||
|
|
75b8f5e543 | ||
|
|
1a0b22ef15 | ||
|
|
bc78d1a561 | ||
|
|
00b953a04e | ||
|
|
aa0ef529f5 | ||
|
|
bd134bf9c9 | ||
|
|
752267c521 | ||
|
|
34635e3460 | ||
|
|
ba0b4513f1 | ||
|
|
4764808450 | ||
|
|
c66fd67510 | ||
|
|
3997ca6454 | ||
|
|
4242100c53 | ||
|
|
32adcc3676 | ||
|
|
80c26606f0 | ||
|
|
a7852098f1 | ||
|
|
72638fc215 | ||
|
|
65418529cd | ||
|
|
ceea0d1730 | ||
|
|
764ea699b1 | ||
|
|
bdb7f522fb | ||
|
|
2461331e32 | ||
|
|
3464f40da3 | ||
|
|
3b2b79d539 | ||
|
|
8616fc6b05 | ||
|
|
9e9c001422 | ||
|
|
93bbd34055 | ||
|
|
cac953e812 | ||
|
|
aeb3662414 | ||
|
|
1687ce3182 | ||
|
|
2888e87bb8 | ||
|
|
094ebb8020 | ||
|
|
54ad52edc2 | ||
|
|
0e869f3cb5 | ||
|
|
4d40af6ac0 | ||
|
|
79a2f31056 | ||
|
|
b2341bf75c | ||
|
|
c4c4b473e5 | ||
|
|
6e26ccf25d | ||
|
|
83bfad3546 | ||
|
|
90f6fff1ae | ||
|
|
52f2b52990 | ||
|
|
48ed4b0e49 | ||
|
|
c3c609e7b9 | ||
|
|
6cd8fa6b0c | ||
|
|
ffb6d398d7 | ||
|
|
52674b4668 | ||
|
|
4ae2370137 | ||
|
|
cee55afa5c | ||
|
|
f998bbbe4c | ||
|
|
e5d19a9819 | ||
|
|
dd75d88d2f | ||
|
|
65ea01218a | ||
|
|
7a2234cd25 | ||
|
|
11ede2756e | ||
|
|
3e51fab387 | ||
|
|
962f413421 | ||
|
|
ae6c938abb | ||
|
|
68faae69c5 | ||
|
|
08edce7906 | ||
|
|
55eb493d1f | ||
|
|
d6be07f1b8 | ||
|
|
064a012b25 | ||
|
|
df26148e7c | ||
|
|
d26f533111 | ||
|
|
69575dbab3 | ||
|
|
9f4a430412 | ||
|
|
23843be981 | ||
|
|
486e3ffc0a | ||
|
|
8127e5a66f | ||
|
|
53167a3b52 | ||
|
|
1b77247c40 | ||
|
|
24374cf7e3 | ||
|
|
88de54ec90 | ||
|
|
3035d569cc | ||
|
|
51f9ad5a2c | ||
|
|
bb322f1bff | ||
|
|
72843e9c92 | ||
|
|
20fbe2fbbe | ||
|
|
bf073a84c8 | ||
|
|
35b158dba7 | ||
|
|
465c0e7dc3 | ||
|
|
eb4f6f2e9f | ||
|
|
0ff56e3a68 | ||
|
|
4ddc59589c | ||
|
|
1e15d7a33e | ||
|
|
e4e2b6ab00 | ||
|
|
af67690e75 | ||
|
|
b37ae484c0 | ||
|
|
13969bdd29 | ||
|
|
a3f5583326 | ||
|
|
f137c11c6c | ||
|
|
8d6afbd80d | ||
|
|
c46fa206f6 | ||
|
|
e8da206389 | ||
|
|
18f1b5f9d2 | ||
|
|
b2b8cf2357 | ||
|
|
a4fd88a440 | ||
|
|
96a92fd85f | ||
|
|
e5175d6309 | ||
|
|
b5ceee3336 | ||
|
|
a1624f61ae | ||
|
|
5ee26fc3f4 | ||
|
|
93ffb66e59 | ||
|
|
4b9bcfb014 | ||
|
|
a161c09441 | ||
|
|
0c396f76b2 | ||
|
|
b2408b1a7c | ||
|
|
c97826ed29 | ||
|
|
9c653a46bc | ||
|
|
eaa2ad4f05 | ||
|
|
88ce7837a6 | ||
|
|
9f5a183793 | ||
|
|
c2a6690d24 | ||
|
|
5e5b719704 | ||
|
|
4054c7d12d | ||
|
|
bb5e454b91 | ||
|
|
ffb12f9c0b | ||
|
|
a89786d079 | ||
|
|
2d3fd513d8 | ||
|
|
271d01dc9d | ||
|
|
d3ffaea042 | ||
|
|
404b593ab8 | ||
|
|
b9f1dea914 | ||
|
|
f3385e6453 | ||
|
|
a2e55f7861 | ||
|
|
761e0114a5 | ||
|
|
dcae128d06 | ||
|
|
a891a8badc | ||
|
|
f3ec5b533e | ||
|
|
d50397edf1 | ||
|
|
49986f22c8 | ||
|
|
70f279d978 | ||
|
|
84c5a75b6c | ||
|
|
97663e87a6 | ||
|
|
5956edcb8e | ||
|
|
7e975f2134 | ||
|
|
40de13f9c7 | ||
|
|
70946539e3 | ||
|
|
996c594dfc | ||
|
|
d8eeb79b63 | ||
|
|
cf61dd0704 | ||
|
|
6fd5f1563a | ||
|
|
3c643c917a | ||
|
|
378be0ef86 | ||
|
|
29e90969eb | ||
|
|
fb724514f3 | ||
|
|
1f11da75d2 | ||
|
|
a2fa65330d | ||
|
|
d3af66b7ed | ||
|
|
fcc433fe17 | ||
|
|
617bdf9910 | ||
|
|
3b2aa92eb7 | ||
|
|
4c17b56e28 | ||
|
|
ad13c83f93 | ||
|
|
768d67a8ae | ||
|
|
d827cda395 | ||
|
|
106e6c98a3 | ||
|
|
e7ad797d4e | ||
|
|
6e1fb71194 | ||
|
|
9f5dc7f091 | ||
|
|
57b273639c | ||
|
|
278d690a6b | ||
|
|
c91c0f7b47 | ||
|
|
6a406f4d45 | ||
|
|
eecaa850e0 | ||
|
|
f332332eaa | ||
|
|
79b0e76be0 | ||
|
|
30650efd98 | ||
|
|
b7759c8151 | ||
|
|
0382c35ac0 | ||
|
|
819262c93f | ||
|
|
db60f4bb1c | ||
|
|
7785ca55c2 | ||
|
|
75dcceff43 | ||
|
|
af91979d4c | ||
|
|
52cd4a77dd | ||
|
|
8a1da3c0ed | ||
|
|
9d67c36c32 | ||
|
|
f283709e62 | ||
|
|
5035559b08 | ||
|
|
01e1438382 | ||
|
|
4eee472043 | ||
|
|
5f89a1b9ca | ||
|
|
b9db5ad662 | ||
|
|
4a7960d64b | ||
|
|
5b8084e1fa | ||
|
|
ab67b67e4c | ||
|
|
f825931f92 | ||
|
|
6113edf2ce | ||
|
|
8413443c26 | ||
|
|
f67fb31bc5 | ||
|
|
d321ec5ed1 | ||
|
|
084ae184f9 | ||
|
|
d1ec652f7b | ||
|
|
7a2a6586be | ||
|
|
392dcf3092 | ||
|
|
8a983c784d | ||
|
|
a443263439 | ||
|
|
3e766b9f54 | ||
|
|
89b9501f35 | ||
|
|
816ae84005 | ||
|
|
c0e425cf46 | ||
|
|
9ebb4c7d12 | ||
|
|
46c3b35028 | ||
|
|
ef2b8be726 | ||
|
|
df51078858 | ||
|
|
5783b61631 | ||
|
|
98a53381fb | ||
|
|
daccfa5fe3 | ||
|
|
d82c24616f | ||
|
|
905ca3dcfc | ||
|
|
b4fb687c4f | ||
|
|
39fb2ae5ab | ||
|
|
b40beb0d1d | ||
|
|
4a96b9bb00 | ||
|
|
f83a178982 | ||
|
|
986b4276e1 | ||
|
|
6f6f418ec9 | ||
|
|
1463571cd7 | ||
|
|
7dfb0a81e3 | ||
|
|
9699d9467a | ||
|
|
08a2872527 | ||
|
|
7c81a807ea | ||
|
|
3bf7031e6a | ||
|
|
503fc980f4 | ||
|
|
efed11eb97 | ||
|
|
330820062f | ||
|
|
45d157fe3f | ||
|
|
812dea385c | ||
|
|
c582bdea46 | ||
|
|
e6c6a9381b | ||
|
|
4b4c0755c6 | ||
|
|
aeb0539c91 | ||
|
|
9feafa45f5 | ||
|
|
927df391f3 | ||
|
|
cbef6adeb1 | ||
|
|
2dee221861 | ||
|
|
c5226c9e59 | ||
|
|
3bad95b389 | ||
|
|
54ef7760b9 | ||
|
|
2ed5d34192 | ||
|
|
9336a2b4c5 | ||
|
|
eb92ca8cd7 | ||
|
|
d3922905c9 | ||
|
|
f5866d7f72 | ||
|
|
dbbc72d00f | ||
|
|
2b4bcf0b0a | ||
|
|
0851f2d0e2 | ||
|
|
ea9ed841ee | ||
|
|
567f3fd3cd | ||
|
|
9dcd8dc419 | ||
|
|
e19bd9d434 | ||
|
|
35ecd26634 | ||
|
|
ac3bb37c36 | ||
|
|
17b8b285a3 | ||
|
|
788bf383aa | ||
|
|
8d0b889f3c | ||
|
|
d250fb655d | ||
|
|
74eb79de17 | ||
|
|
e2eabfc141 | ||
|
|
a3ee43b31c | ||
|
|
12dd16d4bf | ||
|
|
a5b9e57576 | ||
|
|
6c194d257c | ||
|
|
09598e0ced | ||
|
|
6af2696f6a | ||
|
|
69dac77932 | ||
|
|
2764e0e5fa | ||
|
|
fa5cdc3afa | ||
|
|
8dae5ec47a |
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 in #545.
|
||||||
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
|
||||||
9
.gitignore
vendored
@@ -4,12 +4,14 @@ 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/
|
||||||
/desktop/mindustry-maps/
|
/desktop/mindustry-maps/
|
||||||
/desktop/gifexport/
|
/desktop/gifexport/
|
||||||
/core/lib/
|
/core/lib/
|
||||||
|
/ios/assets/
|
||||||
/core/assets-raw/sprites/generated/
|
/core/assets-raw/sprites/generated/
|
||||||
/core/assets-raw/sprites_out/
|
/core/assets-raw/sprites_out/
|
||||||
/annotations/build/
|
/annotations/build/
|
||||||
@@ -18,6 +20,11 @@ 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/
|
||||||
/android/assets/mindustry-maps/
|
/android/assets/mindustry-maps/
|
||||||
@@ -30,7 +37,9 @@ logs/
|
|||||||
ios/robovm.properties
|
ios/robovm.properties
|
||||||
packr-out/
|
packr-out/
|
||||||
config/
|
config/
|
||||||
|
changelog
|
||||||
*.gif
|
*.gif
|
||||||
|
/core/assets/saves/
|
||||||
|
|
||||||
version.properties
|
version.properties
|
||||||
|
|
||||||
|
|||||||
34
.travis.yml
@@ -1,21 +1,43 @@
|
|||||||
|
|
||||||
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/Arc ../Arc"
|
- git clone --depth=1 --branch=master https://github.com/Anuken/MindustryBuilds ../MindustryBuilds
|
||||||
|
- cd ../MindustryBuilds
|
||||||
|
- echo ${TRAVIS_TAG}
|
||||||
|
- if [ -n "$TRAVIS_TAG" ]; then echo versionName=4-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
|
||||||
|
- 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
|
||||||
draft: false
|
draft: false
|
||||||
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
|
||||||
tags: true
|
tags: true
|
||||||
|
- provider: script
|
||||||
|
script: bash update_wiki.sh
|
||||||
|
on:
|
||||||
|
repo: Anuken/Mindustry
|
||||||
|
tags: true
|
||||||
|
env:
|
||||||
|
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: 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=
|
||||||
|
|||||||
29
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,14 @@
|
|||||||
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)_
|
||||||
|
|
||||||
### 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 +29,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 +43,18 @@ 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.
|
||||||
|
|
||||||
### Downloads
|
### Downloads
|
||||||
|
|
||||||
<a href="https://anuke.itch.io/mindustry"><img src="https://i.imgur.com/sk26hTV.png" 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://i.imgur.com/8dF6l81.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/)
|
||||||
|
|||||||
@@ -1,8 +1,5 @@
|
|||||||
## Translating for Mindustry
|
## Translating for Mindustry
|
||||||
|
|
||||||
**DISCLAIMER:** *Currently, 4.0 is far from done, which means that things such as block names, descriptions, and core text will be changing often. If you begin translating now, you might have to re-do large chunks of the bundle before final release.*
|
|
||||||
|
|
||||||
|
|
||||||
To begin, log in to your GitHub account, or if you don't have one yet, create it [here](https://github.com/).
|
To begin, log in to your GitHub account, or if you don't have one yet, create it [here](https://github.com/).
|
||||||
|
|
||||||
Consult [this list](https://www.science.co.il/language/Locale-codes.php) to find the locale code for your language. Once you've found it,
|
Consult [this list](https://www.science.co.il/language/Locale-codes.php) to find the locale code for your language. Once you've found it,
|
||||||
@@ -34,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.)*
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="io.anuke.mindustry">
|
package="io.anuke.mindustry">
|
||||||
|
|
||||||
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
|
<uses-feature android:glEsVersion="0x00020000" android:required="true"/>
|
||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
||||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET"/>
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:resizeableActivity="false"
|
android:resizeableActivity="false"
|
||||||
@@ -16,54 +16,27 @@
|
|||||||
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="io.anuke.mindustry.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">
|
||||||
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN"/>
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER"/>
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<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"/>
|
||||||
<category android:name="android.intent.category.BROWSABLE"/>
|
<category android:name="android.intent.category.BROWSABLE"/>
|
||||||
<data android:mimeType="application/octet-stream"/>
|
<data android:mimeType="application/octet-stream" />
|
||||||
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.mmap" />
|
<data android:scheme="file" android:host="*" android:pathPattern=".*\\.msav"/>
|
||||||
</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=".*\\.msav" />
|
|
||||||
</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>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
|
|
||||||
<activity android:name=".DonationsActivity"
|
|
||||||
android:theme="@style/GdxTheme" />
|
|
||||||
|
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
||||||
|
|||||||
@@ -1,32 +1,31 @@
|
|||||||
buildscript {
|
buildscript{
|
||||||
repositories {
|
repositories{
|
||||||
mavenLocal()
|
mavenLocal()
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
google()
|
google()
|
||||||
maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
|
maven{ url "https://oss.sonatype.org/content/repositories/snapshots/" }
|
||||||
jcenter()
|
jcenter()
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies{
|
||||||
classpath 'com.android.tools.build:gradle:3.3.2'
|
classpath 'com.android.tools.build:gradle:3.4.1'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
apply plugin: "com.android.application"
|
apply plugin: "com.android.application"
|
||||||
|
|
||||||
configurations { natives }
|
configurations{ natives }
|
||||||
|
|
||||||
repositories {
|
repositories{
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
jcenter()
|
jcenter()
|
||||||
maven {
|
maven{
|
||||||
url "https://maven.google.com"
|
url "https://maven.google.com"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies{
|
||||||
implementation project(":core")
|
implementation project(":core")
|
||||||
implementation project(":net")
|
|
||||||
|
|
||||||
implementation arcModule("backends:backend-android")
|
implementation arcModule("backends:backend-android")
|
||||||
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi"
|
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi"
|
||||||
@@ -46,14 +45,14 @@ task deploy(type: Copy){
|
|||||||
|
|
||||||
from "build/outputs/apk/release/android-release.apk"
|
from "build/outputs/apk/release/android-release.apk"
|
||||||
into "../deploy/"
|
into "../deploy/"
|
||||||
rename ("android-google-release.apk", appName + "-android-" + getVersionString() + ".apk")
|
rename("android-release.apk", "${generateDeployName('android')}.apk")
|
||||||
}
|
}
|
||||||
|
|
||||||
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'
|
||||||
java.srcDirs = ['src']
|
java.srcDirs = ['src']
|
||||||
aidl.srcDirs = ['src']
|
aidl.srcDirs = ['src']
|
||||||
@@ -65,44 +64,38 @@ android {
|
|||||||
|
|
||||||
androidTest.setRoot('tests')
|
androidTest.setRoot('tests')
|
||||||
}
|
}
|
||||||
packagingOptions {
|
packagingOptions{
|
||||||
exclude 'META-INF/robovm/ios/robovm.xml'
|
exclude 'META-INF/robovm/ios/robovm.xml'
|
||||||
}
|
}
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig{
|
||||||
def vfile = file('../core/assets/version.properties')
|
Properties props = new Properties().with{p -> p.load(file('../core/assets/version.properties').newReader()); return p }
|
||||||
|
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{
|
||||||
sourceCompatibility JavaVersion.VERSION_1_8
|
sourceCompatibility JavaVersion.VERSION_1_8
|
||||||
targetCompatibility JavaVersion.VERSION_1_8
|
targetCompatibility JavaVersion.VERSION_1_8
|
||||||
}
|
}
|
||||||
|
|
||||||
flavorDimensions "google"
|
flavorDimensions "google"
|
||||||
|
|
||||||
signingConfigs {
|
signingConfigs{
|
||||||
release {
|
release{
|
||||||
if(project.hasProperty("RELEASE_STORE_FILE")) {
|
if(project.hasProperty("RELEASE_STORE_FILE")){
|
||||||
storeFile file(RELEASE_STORE_FILE)
|
storeFile file(RELEASE_STORE_FILE)
|
||||||
storePassword RELEASE_STORE_PASSWORD
|
storePassword RELEASE_STORE_PASSWORD
|
||||||
keyAlias RELEASE_KEY_ALIAS
|
keyAlias RELEASE_KEY_ALIAS
|
||||||
@@ -113,31 +106,33 @@ android {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
buildTypes {
|
if(project.hasProperty("RELEASE_STORE_FILE")) {
|
||||||
release {
|
buildTypes {
|
||||||
signingConfig signingConfigs.release
|
release {
|
||||||
|
signingConfig signingConfigs.release
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// called every time gradle gets executed, takes the native dependencies of
|
// called every time gradle gets executed, takes the native dependencies of
|
||||||
// the natives configuration, and extracts them to the proper libs/ folders
|
// the natives configuration, and extracts them to the proper libs/ folders
|
||||||
// so they get packed with the APK.
|
// so they get packed with the APK.
|
||||||
task copyAndroidNatives() {
|
task copyAndroidNatives(){
|
||||||
file("libs/armeabi/").mkdirs()
|
file("libs/armeabi/").mkdirs()
|
||||||
file("libs/armeabi-v7a/").mkdirs()
|
file("libs/armeabi-v7a/").mkdirs()
|
||||||
file("libs/arm64-v8a/").mkdirs()
|
file("libs/arm64-v8a/").mkdirs()
|
||||||
file("libs/x86_64/").mkdirs()
|
file("libs/x86_64/").mkdirs()
|
||||||
file("libs/x86/").mkdirs()
|
file("libs/x86/").mkdirs()
|
||||||
|
|
||||||
configurations.natives.files.each { jar ->
|
configurations.natives.files.each{ jar ->
|
||||||
def outputDir = null
|
def outputDir = null
|
||||||
if (jar.name.endsWith("natives-arm64-v8a.jar")) outputDir = file("libs/arm64-v8a")
|
if(jar.name.endsWith("natives-arm64-v8a.jar")) outputDir = file("libs/arm64-v8a")
|
||||||
if (jar.name.endsWith("natives-armeabi-v7a.jar")) outputDir = file("libs/armeabi-v7a")
|
if(jar.name.endsWith("natives-armeabi-v7a.jar")) outputDir = file("libs/armeabi-v7a")
|
||||||
if (jar.name.endsWith("natives-armeabi.jar")) outputDir = file("libs/armeabi")
|
if(jar.name.endsWith("natives-armeabi.jar")) outputDir = file("libs/armeabi")
|
||||||
if (jar.name.endsWith("natives-x86_64.jar")) outputDir = file("libs/x86_64")
|
if(jar.name.endsWith("natives-x86_64.jar")) outputDir = file("libs/x86_64")
|
||||||
if (jar.name.endsWith("natives-x86.jar")) outputDir = file("libs/x86")
|
if(jar.name.endsWith("natives-x86.jar")) outputDir = file("libs/x86")
|
||||||
if (outputDir != null) {
|
if(outputDir != null){
|
||||||
copy {
|
copy{
|
||||||
from zipTree(jar)
|
from zipTree(jar)
|
||||||
into outputDir
|
into outputDir
|
||||||
include "*.so"
|
include "*.so"
|
||||||
@@ -146,47 +141,24 @@ task copyAndroidNatives() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
task run(type: Exec) {
|
task run(type: Exec){
|
||||||
def path
|
def path
|
||||||
def localProperties = project.file("../local.properties")
|
def localProperties = project.file("../local.properties")
|
||||||
if (localProperties.exists()) {
|
if(localProperties.exists()){
|
||||||
Properties properties = new Properties()
|
Properties properties = new Properties()
|
||||||
localProperties.withInputStream { instr ->
|
localProperties.withInputStream{ instr ->
|
||||||
properties.load(instr)
|
properties.load(instr)
|
||||||
}
|
}
|
||||||
def sdkDir = properties.getProperty('sdk.dir')
|
def sdkDir = properties.getProperty('sdk.dir')
|
||||||
if (sdkDir) {
|
if(sdkDir){
|
||||||
path = sdkDir
|
path = sdkDir
|
||||||
} else {
|
}else{
|
||||||
path = "$System.env.ANDROID_HOME"
|
path = "$System.env.ANDROID_HOME"
|
||||||
}
|
}
|
||||||
} else {
|
}else{
|
||||||
path = "$System.env.ANDROID_HOME"
|
path = "$System.env.ANDROID_HOME"
|
||||||
}
|
}
|
||||||
|
|
||||||
def adb = path + "/platform-tools/adb"
|
def adb = path + "/platform-tools/adb"
|
||||||
commandLine "$adb", 'shell', 'am', 'start', '-n', 'io.anuke.mindustry/io.anuke.mindustry.AndroidLauncher'
|
commandLine "$adb", 'shell', 'am', 'start', '-n', 'io.anuke.mindustry/io.anuke.mindustry.AndroidLauncher'
|
||||||
}
|
}
|
||||||
|
|
||||||
// sets up the Android Idea project, using the old Ant based build.
|
|
||||||
idea {
|
|
||||||
module {
|
|
||||||
sourceDirs += file("src")
|
|
||||||
scopes = [COMPILE: [plus: [project.configurations.compile]]]
|
|
||||||
|
|
||||||
iml {
|
|
||||||
withXml {
|
|
||||||
def node = it.asNode()
|
|
||||||
def builder = NodeBuilder.newInstance()
|
|
||||||
builder.current = node
|
|
||||||
builder.component(name: "FacetManager") {
|
|
||||||
facet(type: "android", name: "Android") {
|
|
||||||
configuration {
|
|
||||||
option(name: "UPDATE_PROPERTY_FILES", value: "true")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 87 KiB |
@@ -9,6 +9,5 @@
|
|||||||
#
|
#
|
||||||
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
|
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
|
||||||
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
|
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
|
||||||
|
|
||||||
# Project target.
|
# Project target.
|
||||||
target=android-19
|
target=android-19
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 6.1 KiB |
|
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 8.4 KiB After Width: | Height: | Size: 8.3 KiB |
|
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 7.6 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 5.1 KiB |
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 9.8 KiB After Width: | Height: | Size: 9.5 KiB |
|
Before Width: | Height: | Size: 9.8 KiB After Width: | Height: | Size: 7.4 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 29 KiB |
@@ -1,36 +1,29 @@
|
|||||||
package io.anuke.mindustry;
|
package io.anuke.mindustry;
|
||||||
|
|
||||||
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 io.anuke.arc.*;
|
||||||
import io.anuke.arc.Core;
|
import io.anuke.arc.backends.android.surfaceview.*;
|
||||||
import io.anuke.arc.backends.android.surfaceview.AndroidApplication;
|
import io.anuke.arc.files.*;
|
||||||
import io.anuke.arc.backends.android.surfaceview.AndroidApplicationConfiguration;
|
import io.anuke.arc.function.*;
|
||||||
import io.anuke.arc.files.FileHandle;
|
import io.anuke.arc.scene.ui.layout.*;
|
||||||
import io.anuke.arc.function.Consumer;
|
import io.anuke.arc.util.*;
|
||||||
import io.anuke.arc.scene.ui.layout.Unit;
|
import io.anuke.arc.util.serialization.*;
|
||||||
import io.anuke.arc.util.Strings;
|
import io.anuke.mindustry.game.Saves.*;
|
||||||
import io.anuke.arc.util.serialization.Base64Coder;
|
import io.anuke.mindustry.io.*;
|
||||||
import io.anuke.net.KryoClient;
|
import io.anuke.mindustry.mod.*;
|
||||||
import io.anuke.net.KryoServer;
|
import io.anuke.mindustry.ui.dialogs.*;
|
||||||
import io.anuke.mindustry.core.Platform;
|
|
||||||
import io.anuke.mindustry.game.Saves.SaveSlot;
|
|
||||||
import io.anuke.mindustry.io.SaveIO;
|
|
||||||
import io.anuke.mindustry.net.Net;
|
|
||||||
import io.anuke.mindustry.ui.dialogs.FileChooser;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.*;
|
||||||
import java.io.FileInputStream;
|
import java.lang.System;
|
||||||
import java.io.IOException;
|
import java.util.*;
|
||||||
import java.io.InputStream;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.*;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
|
|
||||||
@@ -38,14 +31,16 @@ public class AndroidLauncher extends AndroidApplication{
|
|||||||
public static final int PERMISSION_REQUEST_CODE = 1;
|
public static final int PERMISSION_REQUEST_CODE = 1;
|
||||||
boolean doubleScaleTablets = true;
|
boolean doubleScaleTablets = true;
|
||||||
FileChooser chooser;
|
FileChooser chooser;
|
||||||
|
Runnable permCallback;
|
||||||
|
|
||||||
@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(){
|
||||||
@@ -59,7 +54,7 @@ public class AndroidLauncher extends AndroidApplication{
|
|||||||
int len = s.length();
|
int len = s.length();
|
||||||
byte[] data = new byte[len / 2];
|
byte[] data = new byte[len / 2];
|
||||||
for(int i = 0; i < len; i += 2){
|
for(int i = 0; i < len; i += 2){
|
||||||
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
|
data[i / 2] = (byte)((Character.digit(s.charAt(i), 16) << 4)
|
||||||
+ Character.digit(s.charAt(i + 1), 16));
|
+ Character.digit(s.charAt(i + 1), 16));
|
||||||
}
|
}
|
||||||
String result = new String(Base64Coder.encode(data));
|
String result = new String(Base64Coder.encode(data));
|
||||||
@@ -75,13 +70,48 @@ public class AndroidLauncher extends AndroidApplication{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void showFileChooser(String text, String content, Consumer<FileHandle> cons, boolean open, String filetype){
|
public void showFileChooser(boolean open, String extension, Consumer<FileHandle> cons){
|
||||||
chooser = new FileChooser(text, file -> file.extension().equalsIgnoreCase(filetype), open, cons);
|
if(VERSION.SDK_INT >= VERSION_CODES.Q){
|
||||||
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M || (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
|
Intent intent = new Intent(open ? Intent.ACTION_OPEN_DOCUMENT : Intent.ACTION_CREATE_DOCUMENT);
|
||||||
checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)){
|
intent.addCategory(Intent.CATEGORY_OPENABLE);
|
||||||
chooser.show();
|
intent.setType(extension.equals("zip") ? "application/zip" : "*/*");
|
||||||
chooser = null;
|
addResultListener(i -> startActivityForResult(intent, i), (code, in) -> {
|
||||||
}else{
|
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.accept(new FileHandle(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)){
|
||||||
|
chooser = new FileChooser(open ? "$open" : "$save", file -> file.extension().equalsIgnoreCase(extension), open, file -> {
|
||||||
|
if(!open){
|
||||||
|
cons.accept(file.parent().child(file.nameWithoutExtension() + "." + extension));
|
||||||
|
}else{
|
||||||
|
cons.accept(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);
|
||||||
@@ -90,6 +120,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);
|
||||||
|
}else{
|
||||||
|
super.showFileChooser(open, extension, cons);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,23 +132,15 @@ public class AndroidLauncher extends AndroidApplication{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void endForceLandscape(){
|
public void endForceLandscape(){
|
||||||
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
|
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())){
|
|
||||||
Unit.dp.addition = 0.5f;
|
|
||||||
}
|
|
||||||
|
|
||||||
config.hideStatusBar = true;
|
|
||||||
Net.setClientProvider(new KryoClient());
|
|
||||||
Net.setServerProvider(new KryoServer());
|
|
||||||
initialize(new Mindustry(), config);
|
|
||||||
checkFiles(getIntent());
|
checkFiles(getIntent());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -127,7 +151,11 @@ public class AndroidLauncher extends AndroidApplication{
|
|||||||
if(i != PackageManager.PERMISSION_GRANTED) return;
|
if(i != PackageManager.PERMISSION_GRANTED) return;
|
||||||
}
|
}
|
||||||
if(chooser != null){
|
if(chooser != null){
|
||||||
chooser.show();
|
Core.app.post(chooser::show);
|
||||||
|
}
|
||||||
|
if(permCallback != null){
|
||||||
|
Core.app.post(permCallback);
|
||||||
|
permCallback = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -150,7 +178,7 @@ public class AndroidLauncher extends AndroidApplication{
|
|||||||
InputStream inStream;
|
InputStream inStream;
|
||||||
if(myFile != null) inStream = new FileInputStream(myFile);
|
if(myFile != null) inStream = new FileInputStream(myFile);
|
||||||
else inStream = getContentResolver().openInputStream(uri);
|
else inStream = getContentResolver().openInputStream(uri);
|
||||||
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);
|
FileHandle file = Core.files.local("temp-save." + saveExtension);
|
||||||
@@ -160,10 +188,10 @@ public class AndroidLauncher extends AndroidApplication{
|
|||||||
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, false)));
|
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);
|
FileHandle file = Core.files.local("temp-map." + mapExtension);
|
||||||
@@ -176,7 +204,7 @@ public class AndroidLauncher extends AndroidApplication{
|
|||||||
ui.editor.beginEditMap(file);
|
ui.editor.beginEditMap(file);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
}));
|
||||||
}
|
}
|
||||||
}catch(IOException e){
|
}catch(IOException e){
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@@ -184,7 +212,7 @@ public class AndroidLauncher extends AndroidApplication{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean isTablet(Context context){
|
private boolean isTablet(Context context){
|
||||||
TelephonyManager manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
|
TelephonyManager manager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
|
||||||
return manager != null && manager.getPhoneType() == TelephonyManager.PHONE_TYPE_NONE;
|
return manager != null && manager.getPhoneType() == TelephonyManager.PHONE_TYPE_NONE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
apply plugin: "java"
|
apply plugin: "java"
|
||||||
|
|
||||||
sourceCompatibility = 1.8
|
sourceCompatibility = 1.8
|
||||||
sourceSets.main.java.srcDirs = [ "src/main/java/" ]
|
sourceSets.main.java.srcDirs = ["src/main/java/"]
|
||||||
sourceSets.main.resources.srcDirs = [ "src/main/resources/" ]
|
sourceSets.main.resources.srcDirs = ["src/main/resources/"]
|
||||||
|
|
||||||
|
|||||||
@@ -1,43 +1,46 @@
|
|||||||
package io.anuke.annotations;
|
package io.anuke.annotations;
|
||||||
|
|
||||||
import java.lang.annotation.ElementType;
|
import java.lang.annotation.*;
|
||||||
import java.lang.annotation.Retention;
|
|
||||||
import java.lang.annotation.RetentionPolicy;
|
|
||||||
import java.lang.annotation.Target;
|
|
||||||
|
|
||||||
public class Annotations{
|
public class Annotations{
|
||||||
|
|
||||||
@Target({ElementType.METHOD, ElementType.FIELD})
|
@Target(ElementType.TYPE)
|
||||||
@Retention(RetentionPolicy.SOURCE)
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
public @interface Nullable{
|
public @interface StyleDefaults {
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Indicates that a method should always call its super version. */
|
||||||
|
@Target(ElementType.METHOD)
|
||||||
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
|
public @interface CallSuper{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Target({ElementType.METHOD, ElementType.FIELD})
|
/** Annotation that allows overriding CallSuper annotation. To be used on method that overrides method with CallSuper annotation from parent class.*/
|
||||||
|
@Target(ElementType.METHOD)
|
||||||
@Retention(RetentionPolicy.SOURCE)
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
public @interface NonNull{
|
public @interface OverrideCallSuper {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Marks a class as serializable.*/
|
/** Marks a class as serializable. */
|
||||||
@Target(ElementType.TYPE)
|
@Target(ElementType.TYPE)
|
||||||
@Retention(RetentionPolicy.SOURCE)
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
public @interface Serialize{
|
public @interface Serialize{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Marks a class as a special value type struct. Class name must end in 'Struct'.*/
|
/** Marks a class as a special value type struct. Class name must end in 'Struct'. */
|
||||||
@Target(ElementType.TYPE)
|
@Target(ElementType.TYPE)
|
||||||
@Retention(RetentionPolicy.SOURCE)
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
public @interface Struct{
|
public @interface Struct{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**Marks a field of a struct. Optional.*/
|
/** Marks a field of a struct. Optional. */
|
||||||
@Target(ElementType.FIELD)
|
@Target(ElementType.FIELD)
|
||||||
@Retention(RetentionPolicy.SOURCE)
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
public @interface StructField{
|
public @interface StructField{
|
||||||
/**Size of a struct field in bits. Not valid on booleans or floating point numbers.*/
|
/** Size of a struct field in bits. Not valid on booleans or floating point numbers. */
|
||||||
int value();
|
int value();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,173 @@
|
|||||||
|
package io.anuke.annotations;
|
||||||
|
|
||||||
|
import com.squareup.javapoet.*;
|
||||||
|
import io.anuke.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("io.anuke.annotations.Annotations.StyleDefaults")
|
||||||
|
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 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", "io.anuke.arc.audio.Sound");
|
||||||
|
processSounds("Musics", path + "/assets/music", "io.anuke.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") ? "io.anuke.arc.scene.style.NinePatchDrawable" : "io.anuke.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+")io.anuke.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("io.anuke.arc.Core.scene.addStyle(" + field.asType().toString() + ".class, io.anuke.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 = "io.anuke.arc.Core.app.getType() != io.anuke.arc.Application.ApplicationType.iOS ? \"" + filepath + "\" : \"" + filepath.replace(".ogg", ".mp3")+"\"";
|
||||||
|
|
||||||
|
loadBegin.addStatement("io.anuke.arc.Core.assets.load("+filename +", "+rtype+".class).loaded = a -> " + name + " = ("+rtype+")a", filepath, filepath.replace(".ogg", ".mp3"));
|
||||||
|
|
||||||
|
dispose.addStatement("io.anuke.arc.Core.assets.unload(" + filename + ")");
|
||||||
|
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());
|
||||||
|
});
|
||||||
|
|
||||||
|
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(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 io.anuke.annotations;
|
||||||
|
|
||||||
|
import com.sun.source.util.*;
|
||||||
|
import com.sun.tools.javac.tree.*;
|
||||||
|
import com.sun.tools.javac.tree.JCTree.*;
|
||||||
|
import io.anuke.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,7 +1,5 @@
|
|||||||
package io.anuke.annotations;
|
package io.anuke.annotations;
|
||||||
|
|
||||||
import io.anuke.annotations.MethodEntry;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
/** Represents a class witha list method entries to include in it. */
|
/** Represents a class witha list method entries to include in it. */
|
||||||
|
|||||||
@@ -0,0 +1,110 @@
|
|||||||
|
package io.anuke.annotations;
|
||||||
|
|
||||||
|
import com.sun.source.tree.*;
|
||||||
|
import com.sun.source.util.TreePathScanner;
|
||||||
|
import com.sun.source.util.Trees;
|
||||||
|
import com.sun.tools.javac.code.Scope;
|
||||||
|
import com.sun.tools.javac.code.Symbol;
|
||||||
|
import com.sun.tools.javac.code.Symbol.MethodSymbol;
|
||||||
|
import com.sun.tools.javac.code.Type.ClassType;
|
||||||
|
import com.sun.tools.javac.tree.JCTree.JCIdent;
|
||||||
|
import com.sun.tools.javac.tree.JCTree.JCTypeApply;
|
||||||
|
import io.anuke.annotations.Annotations.CallSuper;
|
||||||
|
|
||||||
|
import java.lang.annotation.Annotation;
|
||||||
|
|
||||||
|
class CodeAnalyzerTreeScanner extends TreePathScanner<Object, Trees> {
|
||||||
|
private String methodName;
|
||||||
|
private MethodTree method;
|
||||||
|
private boolean callSuperUsed;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object visitClass (ClassTree classTree, Trees trees) {
|
||||||
|
Tree extendTree = classTree.getExtendsClause();
|
||||||
|
|
||||||
|
if (extendTree instanceof JCTypeApply) { //generic classes case
|
||||||
|
JCTypeApply generic = (JCTypeApply) extendTree;
|
||||||
|
extendTree = generic.clazz;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (extendTree instanceof JCIdent) {
|
||||||
|
JCIdent tree = (JCIdent) extendTree;
|
||||||
|
Scope members = tree.sym.members();
|
||||||
|
|
||||||
|
if (checkScope(members))
|
||||||
|
return super.visitClass(classTree, trees);
|
||||||
|
|
||||||
|
if (checkSuperTypes((ClassType) tree.type))
|
||||||
|
return super.visitClass(classTree, trees);
|
||||||
|
|
||||||
|
}
|
||||||
|
callSuperUsed = false;
|
||||||
|
|
||||||
|
return super.visitClass(classTree, trees);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean checkSuperTypes (ClassType type) {
|
||||||
|
if (type.supertype_field != null && type.supertype_field.tsym != null) {
|
||||||
|
if (checkScope(type.supertype_field.tsym.members()))
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return checkSuperTypes((ClassType) type.supertype_field);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public boolean checkScope (Scope members) {
|
||||||
|
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) {
|
||||||
|
MethodSymbol ms = (MethodSymbol) s;
|
||||||
|
|
||||||
|
if (ms.getSimpleName().toString().equals(methodName)) {
|
||||||
|
Annotation annotation = ms.getAnnotation(CallSuper.class);
|
||||||
|
if (annotation != null) {
|
||||||
|
callSuperUsed = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object visitMethod (MethodTree methodTree, Trees trees) {
|
||||||
|
if (methodTree.getName().toString().equals(methodName))
|
||||||
|
method = methodTree;
|
||||||
|
|
||||||
|
return super.visitMethod(methodTree, trees);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMethodName (String methodName) {
|
||||||
|
this.methodName = methodName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMethodName () {
|
||||||
|
return methodName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MethodTree getMethod () {
|
||||||
|
return method;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isCallSuperUsed () {
|
||||||
|
return callSuperUsed;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,8 +1,6 @@
|
|||||||
package io.anuke.annotations;
|
package io.anuke.annotations;
|
||||||
|
|
||||||
import io.anuke.annotations.Annotations.Loc;
|
import io.anuke.annotations.Annotations.*;
|
||||||
import io.anuke.annotations.Annotations.PacketPriority;
|
|
||||||
import io.anuke.annotations.Annotations.Variant;
|
|
||||||
|
|
||||||
import javax.lang.model.element.ExecutableElement;
|
import javax.lang.model.element.ExecutableElement;
|
||||||
|
|
||||||
|
|||||||
@@ -1,18 +1,13 @@
|
|||||||
package io.anuke.annotations;
|
package io.anuke.annotations;
|
||||||
|
|
||||||
import com.squareup.javapoet.FieldSpec;
|
import com.squareup.javapoet.*;
|
||||||
import com.squareup.javapoet.JavaFile;
|
|
||||||
import com.squareup.javapoet.TypeSpec;
|
|
||||||
import io.anuke.annotations.Annotations.Loc;
|
import io.anuke.annotations.Annotations.Loc;
|
||||||
import io.anuke.annotations.Annotations.Remote;
|
import io.anuke.annotations.Annotations.Remote;
|
||||||
import io.anuke.annotations.IOFinder.ClassSerializer;
|
import io.anuke.annotations.IOFinder.ClassSerializer;
|
||||||
|
|
||||||
import javax.annotation.processing.*;
|
import javax.annotation.processing.*;
|
||||||
import javax.lang.model.SourceVersion;
|
import javax.lang.model.SourceVersion;
|
||||||
import javax.lang.model.element.Element;
|
import javax.lang.model.element.*;
|
||||||
import javax.lang.model.element.ExecutableElement;
|
|
||||||
import javax.lang.model.element.Modifier;
|
|
||||||
import javax.lang.model.element.TypeElement;
|
|
||||||
import javax.tools.Diagnostic.Kind;
|
import javax.tools.Diagnostic.Kind;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@@ -21,14 +16,14 @@ import java.util.stream.Collectors;
|
|||||||
/** The annotation processor for generating remote method call code. */
|
/** The annotation processor for generating remote method call code. */
|
||||||
@SupportedSourceVersion(SourceVersion.RELEASE_8)
|
@SupportedSourceVersion(SourceVersion.RELEASE_8)
|
||||||
@SupportedAnnotationTypes({
|
@SupportedAnnotationTypes({
|
||||||
"io.anuke.annotations.Annotations.Remote",
|
"io.anuke.annotations.Annotations.Remote",
|
||||||
"io.anuke.annotations.Annotations.WriteClass",
|
"io.anuke.annotations.Annotations.WriteClass",
|
||||||
"io.anuke.annotations.Annotations.ReadClass",
|
"io.anuke.annotations.Annotations.ReadClass",
|
||||||
})
|
})
|
||||||
public class RemoteMethodAnnotationProcessor extends AbstractProcessor{
|
public class RemoteMethodAnnotationProcessor extends AbstractProcessor{
|
||||||
/** Maximum size of each event packet. */
|
/** Maximum size of each event packet. */
|
||||||
public static final int maxPacketSize = 4096;
|
public static final int maxPacketSize = 4096;
|
||||||
/** Warning on top of each autogenerated file.*/
|
/** 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 = "io.anuke.mindustry.gen";
|
||||||
@@ -37,7 +32,7 @@ public class RemoteMethodAnnotationProcessor extends AbstractProcessor{
|
|||||||
private static final String readServerName = "RemoteReadServer";
|
private static final String readServerName = "RemoteReadServer";
|
||||||
/** Name of class that handles reading and invoking packets on the client. */
|
/** Name of class that handles reading and invoking packets on the client. */
|
||||||
private static final String readClientName = "RemoteReadClient";
|
private static final String readClientName = "RemoteReadClient";
|
||||||
/**Simple class name of generated class name.*/
|
/** Simple class name of generated class name. */
|
||||||
private static final String callLocation = "Call";
|
private static final String callLocation = "Call";
|
||||||
|
|
||||||
/** Processing round number. */
|
/** Processing round number. */
|
||||||
@@ -115,7 +110,7 @@ public class RemoteMethodAnnotationProcessor extends AbstractProcessor{
|
|||||||
|
|
||||||
//create and add entry
|
//create and add entry
|
||||||
MethodEntry method = new MethodEntry(entry.name, Utils.getMethodName(element), annotation.targets(), annotation.variants(),
|
MethodEntry method = new MethodEntry(entry.name, Utils.getMethodName(element), annotation.targets(), annotation.variants(),
|
||||||
annotation.called(), annotation.unreliable(), annotation.forward(), lastMethodID++, (ExecutableElement) element, annotation.priority());
|
annotation.called(), annotation.unreliable(), annotation.forward(), lastMethodID++, (ExecutableElement)element, annotation.priority());
|
||||||
|
|
||||||
entry.methods.add(method);
|
entry.methods.add(method);
|
||||||
methods.add(method);
|
methods.add(method);
|
||||||
@@ -140,7 +135,7 @@ public class RemoteMethodAnnotationProcessor extends AbstractProcessor{
|
|||||||
TypeSpec.Builder hashBuilder = TypeSpec.classBuilder("MethodHash").addModifiers(Modifier.PUBLIC);
|
TypeSpec.Builder hashBuilder = TypeSpec.classBuilder("MethodHash").addModifiers(Modifier.PUBLIC);
|
||||||
hashBuilder.addJavadoc(autogenWarning);
|
hashBuilder.addJavadoc(autogenWarning);
|
||||||
hashBuilder.addField(FieldSpec.builder(int.class, "HASH", Modifier.STATIC, Modifier.PUBLIC, Modifier.FINAL)
|
hashBuilder.addField(FieldSpec.builder(int.class, "HASH", Modifier.STATIC, Modifier.PUBLIC, Modifier.FINAL)
|
||||||
.initializer("$1L", Objects.hash(methods)).build());
|
.initializer("$1L", Objects.hash(methods)).build());
|
||||||
|
|
||||||
//build and write resulting hash class
|
//build and write resulting hash class
|
||||||
TypeSpec spec = hashBuilder.build();
|
TypeSpec spec = hashBuilder.build();
|
||||||
|
|||||||
@@ -3,9 +3,7 @@ package io.anuke.annotations;
|
|||||||
import com.squareup.javapoet.*;
|
import com.squareup.javapoet.*;
|
||||||
import io.anuke.annotations.IOFinder.ClassSerializer;
|
import io.anuke.annotations.IOFinder.ClassSerializer;
|
||||||
|
|
||||||
import javax.lang.model.element.Modifier;
|
import javax.lang.model.element.*;
|
||||||
import javax.lang.model.element.TypeElement;
|
|
||||||
import javax.lang.model.element.VariableElement;
|
|
||||||
import javax.tools.Diagnostic.Kind;
|
import javax.tools.Diagnostic.Kind;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.lang.reflect.Constructor;
|
import java.lang.reflect.Constructor;
|
||||||
@@ -25,24 +23,23 @@ public class RemoteReadGenerator{
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates a class for reading remote invoke packets.
|
* Generates a class for reading remote invoke packets.
|
||||||
*
|
|
||||||
* @param entries List of methods to use.
|
* @param entries List of methods to use.
|
||||||
* @param className Simple target class name.
|
* @param className Simple target class name.
|
||||||
* @param packageName Full target package name.
|
* @param packageName Full target package name.
|
||||||
* @param needsPlayer Whether this read method requires a reference to the player sender.
|
* @param needsPlayer Whether this read method requires a reference to the player sender.
|
||||||
*/
|
*/
|
||||||
public void generateFor(List<MethodEntry> entries, String className, String packageName, boolean needsPlayer)
|
public void generateFor(List<MethodEntry> entries, String className, String packageName, boolean needsPlayer)
|
||||||
throws IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException, IOException{
|
throws IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException, IOException{
|
||||||
|
|
||||||
TypeSpec.Builder classBuilder = TypeSpec.classBuilder(className).addModifiers(Modifier.PUBLIC);
|
TypeSpec.Builder classBuilder = TypeSpec.classBuilder(className).addModifiers(Modifier.PUBLIC);
|
||||||
classBuilder.addJavadoc(RemoteMethodAnnotationProcessor.autogenWarning);
|
classBuilder.addJavadoc(RemoteMethodAnnotationProcessor.autogenWarning);
|
||||||
|
|
||||||
//create main method builder
|
//create main method builder
|
||||||
MethodSpec.Builder readMethod = MethodSpec.methodBuilder("readPacket")
|
MethodSpec.Builder readMethod = MethodSpec.methodBuilder("readPacket")
|
||||||
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
|
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
|
||||||
.addParameter(ByteBuffer.class, "buffer") //buffer to read form
|
.addParameter(ByteBuffer.class, "buffer") //buffer to read form
|
||||||
.addParameter(int.class, "id") //ID of method type to read
|
.addParameter(int.class, "id") //ID of method type to read
|
||||||
.returns(void.class);
|
.returns(void.class);
|
||||||
|
|
||||||
if(needsPlayer){
|
if(needsPlayer){
|
||||||
//since the player type isn't loaded yet, creating a type def is necessary
|
//since the player type isn't loaded yet, creating a type def is necessary
|
||||||
@@ -115,13 +112,13 @@ public class RemoteReadGenerator{
|
|||||||
|
|
||||||
//execute the relevant method before the forward
|
//execute the relevant method before the forward
|
||||||
//if it throws a ValidateException, the method won't be forwarded
|
//if it throws a ValidateException, the method won't be forwarded
|
||||||
readBlock.addStatement("$N." + entry.element.getSimpleName() + "(" + varResult.toString() + ")", ((TypeElement) entry.element.getEnclosingElement()).getQualifiedName().toString());
|
readBlock.addStatement("$N." + entry.element.getSimpleName() + "(" + varResult.toString() + ")", ((TypeElement)entry.element.getEnclosingElement()).getQualifiedName().toString());
|
||||||
|
|
||||||
//call forwarded method, don't forward on the client reader
|
//call forwarded method, don't forward on the client reader
|
||||||
if(entry.forward && entry.where.isServer && needsPlayer){
|
if(entry.forward && entry.where.isServer && needsPlayer){
|
||||||
//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)");
|
||||||
|
|||||||
@@ -4,10 +4,7 @@ import com.squareup.javapoet.*;
|
|||||||
import io.anuke.annotations.Annotations.Loc;
|
import io.anuke.annotations.Annotations.Loc;
|
||||||
import io.anuke.annotations.IOFinder.ClassSerializer;
|
import io.anuke.annotations.IOFinder.ClassSerializer;
|
||||||
|
|
||||||
import javax.lang.model.element.ExecutableElement;
|
import javax.lang.model.element.*;
|
||||||
import javax.lang.model.element.Modifier;
|
|
||||||
import javax.lang.model.element.TypeElement;
|
|
||||||
import javax.lang.model.element.VariableElement;
|
|
||||||
import javax.tools.Diagnostic.Kind;
|
import javax.tools.Diagnostic.Kind;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
@@ -33,7 +30,7 @@ public class RemoteWriteGenerator{
|
|||||||
|
|
||||||
//add temporary write buffer
|
//add temporary write buffer
|
||||||
classBuilder.addField(FieldSpec.builder(ByteBuffer.class, "TEMP_BUFFER", Modifier.STATIC, Modifier.PRIVATE, Modifier.FINAL)
|
classBuilder.addField(FieldSpec.builder(ByteBuffer.class, "TEMP_BUFFER", Modifier.STATIC, Modifier.PRIVATE, Modifier.FINAL)
|
||||||
.initializer("ByteBuffer.allocate($1L)", RemoteMethodAnnotationProcessor.maxPacketSize).build());
|
.initializer("ByteBuffer.allocate($1L)", RemoteMethodAnnotationProcessor.maxPacketSize).build());
|
||||||
|
|
||||||
//go through each method entry in this class
|
//go through each method entry in this class
|
||||||
for(MethodEntry methodEntry : entry.methods){
|
for(MethodEntry methodEntry : entry.methods){
|
||||||
@@ -65,8 +62,8 @@ public class RemoteWriteGenerator{
|
|||||||
|
|
||||||
//create builder
|
//create builder
|
||||||
MethodSpec.Builder method = MethodSpec.methodBuilder(elem.getSimpleName().toString() + (forwarded ? "__forward" : "")) //add except suffix when forwarding
|
MethodSpec.Builder method = MethodSpec.methodBuilder(elem.getSimpleName().toString() + (forwarded ? "__forward" : "")) //add except suffix when forwarding
|
||||||
.addModifiers(Modifier.STATIC, Modifier.SYNCHRONIZED)
|
.addModifiers(Modifier.STATIC, Modifier.SYNCHRONIZED)
|
||||||
.returns(void.class);
|
.returns(void.class);
|
||||||
|
|
||||||
//forwarded methods aren't intended for use, and are not public
|
//forwarded methods aren't intended for use, and are not public
|
||||||
if(!forwarded){
|
if(!forwarded){
|
||||||
@@ -88,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("io.anuke.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("io.anuke.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) + " || !io.anuke.mindustry.Vars.net.active())");
|
||||||
}
|
}
|
||||||
|
|
||||||
//concatenate parameters
|
//concatenate parameters
|
||||||
@@ -119,7 +116,7 @@ public class RemoteWriteGenerator{
|
|||||||
|
|
||||||
//add the statement to call it
|
//add the statement to call it
|
||||||
method.addStatement("$N." + elem.getSimpleName() + "(" + results.toString() + ")",
|
method.addStatement("$N." + elem.getSimpleName() + "(" + results.toString() + ")",
|
||||||
((TypeElement) elem.getEnclosingElement()).getQualifiedName().toString());
|
((TypeElement)elem.getEnclosingElement()).getQualifiedName().toString());
|
||||||
|
|
||||||
if(methodEntry.local != Loc.both){
|
if(methodEntry.local != Loc.both){
|
||||||
method.endControlFlow();
|
method.endControlFlow();
|
||||||
@@ -162,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(io.anuke.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
|
||||||
@@ -170,7 +167,7 @@ public class RemoteWriteGenerator{
|
|||||||
method.addStatement("TEMP_BUFFER.put(" + varName + " ? (byte)1 : 0)");
|
method.addStatement("TEMP_BUFFER.put(" + varName + " ? (byte)1 : 0)");
|
||||||
}else{
|
}else{
|
||||||
method.addStatement("TEMP_BUFFER.put" +
|
method.addStatement("TEMP_BUFFER.put" +
|
||||||
capName + "(" + varName + ")");
|
capName + "(" + varName + ")");
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
//else, try and find a serializer
|
//else, try and find a serializer
|
||||||
@@ -197,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 = "io.anuke.mindustry.Vars.net.send(";
|
||||||
}else{
|
}else{
|
||||||
sendString = "sendExcept(exceptSenderID, ";
|
sendString = "io.anuke.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 = "io.anuke.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 ? "io.anuke.mindustry.net.Net.SendMode.udp" : "io.anuke.mindustry.net.Net.SendMode.tcp") + ")");
|
||||||
|
|
||||||
|
|
||||||
//end check for server/client
|
//end check for server/client
|
||||||
@@ -220,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 ? "io.anuke.mindustry.Vars.net.server() || io.anuke.mindustry.Vars.net.client()" :
|
||||||
loc.isClient ? "io.anuke.mindustry.net.Net.client()" :
|
loc.isClient ? "io.anuke.mindustry.Vars.net.client()" :
|
||||||
loc.isServer ? "io.anuke.mindustry.net.Net.server()" : "false";
|
loc.isServer ? "io.anuke.mindustry.Vars.net.server()" : "false";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,23 +5,17 @@ import io.anuke.annotations.Annotations.Serialize;
|
|||||||
|
|
||||||
import javax.annotation.processing.*;
|
import javax.annotation.processing.*;
|
||||||
import javax.lang.model.SourceVersion;
|
import javax.lang.model.SourceVersion;
|
||||||
import javax.lang.model.element.Modifier;
|
import javax.lang.model.element.*;
|
||||||
import javax.lang.model.element.TypeElement;
|
|
||||||
import javax.lang.model.element.VariableElement;
|
|
||||||
import javax.lang.model.util.ElementFilter;
|
import javax.lang.model.util.ElementFilter;
|
||||||
import java.io.DataInput;
|
import java.io.*;
|
||||||
import java.io.DataOutput;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
@SupportedSourceVersion(SourceVersion.RELEASE_8)
|
@SupportedSourceVersion(SourceVersion.RELEASE_8)
|
||||||
@SupportedAnnotationTypes({
|
@SupportedAnnotationTypes("io.anuke.annotations.Annotations.Serialize")
|
||||||
"io.anuke.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 = "io.anuke.mindustry.gen";
|
||||||
@@ -48,20 +42,10 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{
|
|||||||
TypeSpec.Builder classBuilder = TypeSpec.classBuilder(className).addModifiers(Modifier.PUBLIC);
|
TypeSpec.Builder classBuilder = TypeSpec.classBuilder(className).addModifiers(Modifier.PUBLIC);
|
||||||
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);
|
||||||
|
|
||||||
TypeName jsonType = ClassName.bestGuess("io.anuke.arc.util.serialization.Json");
|
|
||||||
TypeName jsonValueType = ClassName.bestGuess("io.anuke.arc.util.serialization.JsonValue");
|
|
||||||
TypeName ubJsonWriterType = ClassName.bestGuess("io.anuke.arc.util.serialization.UBJsonWriter");
|
|
||||||
TypeName ubJsonReaderType = ClassName.bestGuess("io.anuke.arc.util.serialization.UBJsonReader");
|
|
||||||
|
|
||||||
classBuilder.addField(jsonType, "bjson", Modifier.STATIC, Modifier.PRIVATE);
|
|
||||||
classBuilder.addField(ubJsonReaderType, "bjsonReader", Modifier.STATIC, Modifier.PRIVATE);
|
|
||||||
classBuilder.addStaticBlock(CodeBlock.builder()
|
|
||||||
.addStatement("bjson = new " + jsonType + "()")
|
|
||||||
.addStatement("bjsonReader = new " + ubJsonReaderType + "()")
|
|
||||||
.build());
|
|
||||||
|
|
||||||
for(TypeElement elem : elements){
|
for(TypeElement elem : elements){
|
||||||
TypeName type = TypeName.get(elem.asType());
|
TypeName type = TypeName.get(elem.asType());
|
||||||
String simpleTypeName = type.toString().substring(type.toString().lastIndexOf('.') + 1);
|
String simpleTypeName = type.toString().substring(type.toString().lastIndexOf('.') + 1);
|
||||||
@@ -83,23 +67,12 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{
|
|||||||
.addException(IOException.class)
|
.addException(IOException.class)
|
||||||
.addModifiers(Modifier.PUBLIC);
|
.addModifiers(Modifier.PUBLIC);
|
||||||
|
|
||||||
MethodSpec.Builder jsonWriteMethod = MethodSpec.methodBuilder("write" + simpleTypeName + "Json")
|
|
||||||
.returns(void.class)
|
|
||||||
.addParameter(jsonType, "json")
|
|
||||||
.addParameter(type, "object")
|
|
||||||
.addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
|
||||||
|
|
||||||
MethodSpec.Builder jsonReadMethod = MethodSpec.methodBuilder("read" + simpleTypeName + "Json")
|
|
||||||
.returns(type)
|
|
||||||
.addParameter(jsonValueType, "value")
|
|
||||||
.addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
|
||||||
|
|
||||||
readMethod.addStatement("$L object = new $L()", type, type);
|
readMethod.addStatement("$L object = new $L()", type, type);
|
||||||
jsonReadMethod.addStatement("$L object = new $L()", type, type);
|
|
||||||
|
|
||||||
List<VariableElement> fields = ElementFilter.fieldsIn(Utils.elementUtils.getAllMembers(elem));
|
List<VariableElement> fields = ElementFilter.fieldsIn(Utils.elementUtils.getAllMembers(elem));
|
||||||
for(VariableElement field : fields){
|
for(VariableElement field : fields){
|
||||||
if(field.getModifiers().contains(Modifier.STATIC) || field.getModifiers().contains(Modifier.TRANSIENT) || field.getModifiers().contains(Modifier.PRIVATE)) continue;
|
if(field.getModifiers().contains(Modifier.STATIC) || field.getModifiers().contains(Modifier.TRANSIENT) || field.getModifiers().contains(Modifier.PRIVATE))
|
||||||
|
continue;
|
||||||
|
|
||||||
String name = field.getSimpleName().toString();
|
String name = field.getSimpleName().toString();
|
||||||
String typeName = Utils.typeUtils.erasure(field.asType()).toString().replace('$', '.');
|
String typeName = Utils.typeUtils.erasure(field.asType()).toString().replace('$', '.');
|
||||||
@@ -108,22 +81,18 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{
|
|||||||
if(field.asType().getKind().isPrimitive()){
|
if(field.asType().getKind().isPrimitive()){
|
||||||
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 + "()");
|
||||||
|
|
||||||
jsonWriteMethod.addStatement("json.writeValue(\"" + name + "\", object." + name +")");
|
|
||||||
jsonReadMethod.addStatement("if(value.has(\"" + name + "\")) object." + name + "= value.get" + capName + "(\"" + name + "\")");
|
|
||||||
}else{
|
}else{
|
||||||
writeMethod.addStatement("io.anuke.arc.Core.settings.getSerializer(" + typeName+ ".class).write(stream, object." + name + ")");
|
writeMethod.addStatement("io.anuke.arc.Core.settings.getSerializer(" + typeName + ".class).write(stream, object." + name + ")");
|
||||||
readMethod.addStatement("object." + name + " = (" +typeName+")io.anuke.arc.Core.settings.getSerializer(" + typeName+ ".class).read(stream)");
|
readMethod.addStatement("object." + name + " = (" + typeName + ")io.anuke.arc.Core.settings.getSerializer(" + typeName + ".class).read(stream)");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
readMethod.addStatement("return object");
|
readMethod.addStatement("return object");
|
||||||
jsonReadMethod.addStatement("return object");
|
|
||||||
|
|
||||||
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("io.anuke.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);
|
||||||
@@ -133,32 +102,6 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{
|
|||||||
|
|
||||||
classBuilder.addMethod(writeMethod.build());
|
classBuilder.addMethod(writeMethod.build());
|
||||||
classBuilder.addMethod(readMethod.build());
|
classBuilder.addMethod(readMethod.build());
|
||||||
|
|
||||||
classBuilder.addMethod(jsonWriteMethod.build());
|
|
||||||
classBuilder.addMethod(jsonReadMethod.build());
|
|
||||||
|
|
||||||
MethodSpec.Builder binaryJsonWriteMethod = MethodSpec.methodBuilder("write" + simpleTypeName + "StreamJson")
|
|
||||||
.returns(void.class)
|
|
||||||
.addParameter(DataOutput.class, "stream")
|
|
||||||
.addParameter(type, "object")
|
|
||||||
.addException(IOException.class)
|
|
||||||
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
|
|
||||||
.addStatement("java.io.StringWriter output = new java.io.StringWriter()")
|
|
||||||
.addStatement("bjson.setWriter(output)")
|
|
||||||
.addStatement("bjson.writeObjectStart(" + type + ".class, " + type + ".class)")
|
|
||||||
.addStatement("write" + simpleTypeName + "Json(bjson, object)")
|
|
||||||
.addStatement("bjson.writeObjectEnd()")
|
|
||||||
.addStatement("stream.writeUTF(output.toString())");
|
|
||||||
|
|
||||||
MethodSpec.Builder binaryJsonReadMethod = MethodSpec.methodBuilder("read" + simpleTypeName + "StreamJson")
|
|
||||||
.returns(type)
|
|
||||||
.addParameter(DataInput.class, "stream")
|
|
||||||
.addException(IOException.class)
|
|
||||||
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
|
|
||||||
.addStatement("return read" + simpleTypeName + "Json(bjson.fromJson(null, stream.readUTF()))");
|
|
||||||
|
|
||||||
classBuilder.addMethod(binaryJsonWriteMethod.build());
|
|
||||||
classBuilder.addMethod(binaryJsonReadMethod.build());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
classBuilder.addMethod(method.build());
|
classBuilder.addMethod(method.build());
|
||||||
|
|||||||
@@ -1,28 +1,25 @@
|
|||||||
package io.anuke.annotations;
|
package io.anuke.annotations;
|
||||||
|
|
||||||
import com.squareup.javapoet.JavaFile;
|
import com.squareup.javapoet.*;
|
||||||
import com.squareup.javapoet.MethodSpec;
|
|
||||||
import com.squareup.javapoet.TypeName;
|
|
||||||
import com.squareup.javapoet.TypeSpec;
|
|
||||||
import io.anuke.annotations.Annotations.Struct;
|
import io.anuke.annotations.Annotations.Struct;
|
||||||
import io.anuke.annotations.Annotations.StructField;
|
import io.anuke.annotations.Annotations.StructField;
|
||||||
|
|
||||||
import javax.annotation.processing.*;
|
import javax.annotation.processing.*;
|
||||||
import javax.lang.model.SourceVersion;
|
import javax.lang.model.SourceVersion;
|
||||||
import javax.lang.model.element.Modifier;
|
import javax.lang.model.element.*;
|
||||||
import javax.lang.model.element.TypeElement;
|
|
||||||
import javax.lang.model.element.VariableElement;
|
|
||||||
import javax.lang.model.type.TypeKind;
|
import javax.lang.model.type.TypeKind;
|
||||||
import javax.lang.model.util.ElementFilter;
|
import javax.lang.model.util.ElementFilter;
|
||||||
import javax.tools.Diagnostic.Kind;
|
import javax.tools.Diagnostic.Kind;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
/**Generates ""value types"" classes that are packed into integer primitives of the most aproppriate size.
|
/**
|
||||||
* It would be nice if Java didn't make crazy hacks like this necessary.*/
|
* Generates ""value types"" classes that are packed into integer primitives of the most aproppriate size.
|
||||||
|
* It would be nice if Java didn't make crazy hacks like this necessary.
|
||||||
|
*/
|
||||||
@SupportedSourceVersion(SourceVersion.RELEASE_8)
|
@SupportedSourceVersion(SourceVersion.RELEASE_8)
|
||||||
@SupportedAnnotationTypes({
|
@SupportedAnnotationTypes({
|
||||||
"io.anuke.annotations.Annotations.Struct"
|
"io.anuke.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. */
|
||||||
@@ -57,7 +54,7 @@ public class StructAnnotationProcessor extends AbstractProcessor{
|
|||||||
String structParam = structName.toLowerCase();
|
String structParam = structName.toLowerCase();
|
||||||
|
|
||||||
TypeSpec.Builder classBuilder = TypeSpec.classBuilder(structName)
|
TypeSpec.Builder classBuilder = TypeSpec.classBuilder(structName)
|
||||||
.addModifiers(Modifier.FINAL, Modifier.PUBLIC);
|
.addModifiers(Modifier.FINAL, Modifier.PUBLIC);
|
||||||
|
|
||||||
try{
|
try{
|
||||||
List<VariableElement> variables = ElementFilter.fieldsIn(elem.getEnclosedElements());
|
List<VariableElement> variables = ElementFilter.fieldsIn(elem.getEnclosedElements());
|
||||||
@@ -92,14 +89,14 @@ public class StructAnnotationProcessor extends AbstractProcessor{
|
|||||||
|
|
||||||
//[get] field(structType) : fieldType
|
//[get] field(structType) : fieldType
|
||||||
MethodSpec.Builder getter = MethodSpec.methodBuilder(var.getSimpleName().toString())
|
MethodSpec.Builder getter = MethodSpec.methodBuilder(var.getSimpleName().toString())
|
||||||
.addModifiers(Modifier.STATIC, Modifier.PUBLIC)
|
.addModifiers(Modifier.STATIC, Modifier.PUBLIC)
|
||||||
.returns(varType)
|
.returns(varType)
|
||||||
.addParameter(structType, structParam);
|
.addParameter(structType, structParam);
|
||||||
//[set] field(structType, fieldType) : structType
|
//[set] field(structType, fieldType) : structType
|
||||||
MethodSpec.Builder setter = MethodSpec.methodBuilder(var.getSimpleName().toString())
|
MethodSpec.Builder setter = MethodSpec.methodBuilder(var.getSimpleName().toString())
|
||||||
.addModifiers(Modifier.STATIC, Modifier.PUBLIC)
|
.addModifiers(Modifier.STATIC, Modifier.PUBLIC)
|
||||||
.returns(structType)
|
.returns(structType)
|
||||||
.addParameter(structType, structParam).addParameter(varType, "value");
|
.addParameter(structType, structParam).addParameter(varType, "value");
|
||||||
|
|
||||||
//[getter]
|
//[getter]
|
||||||
if(varType == TypeName.BOOLEAN){
|
if(varType == TypeName.BOOLEAN){
|
||||||
@@ -209,7 +206,7 @@ public class StructAnnotationProcessor extends AbstractProcessor{
|
|||||||
throw new IllegalArgumentException("Too many fields, must fit in 64 bits. Curent size: " + size);
|
throw new IllegalArgumentException("Too many fields, must fit in 64 bits. Curent size: " + size);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**returns a type's element size in bits.*/
|
/** returns a type's element size in bits. */
|
||||||
static int typeSize(TypeKind kind) throws IllegalArgumentException{
|
static int typeSize(TypeKind kind) throws IllegalArgumentException{
|
||||||
switch(kind){
|
switch(kind){
|
||||||
case BOOLEAN:
|
case BOOLEAN:
|
||||||
|
|||||||
@@ -14,11 +14,11 @@ public class Utils{
|
|||||||
public static Messager messager;
|
public static Messager messager;
|
||||||
|
|
||||||
public static String getMethodName(Element element){
|
public static String getMethodName(Element element){
|
||||||
return ((TypeElement) element.getEnclosingElement()).getQualifiedName().toString() + "." + element.getSimpleName();
|
return ((TypeElement)element.getEnclosingElement()).getQualifiedName().toString() + "." + element.getSimpleName();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isPrimitive(String type){
|
public static boolean isPrimitive(String type){
|
||||||
return type.equals("boolean") || type.equals("byte") || type.equals("short") || type.equals("int")
|
return type.equals("boolean") || type.equals("byte") || type.equals("short") || type.equals("int")
|
||||||
|| type.equals("long") || type.equals("float") || type.equals("double") || type.equals("char");
|
|| type.equals("long") || type.equals("float") || type.equals("double") || type.equals("char");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
io.anuke.annotations.RemoteMethodAnnotationProcessor
|
io.anuke.annotations.RemoteMethodAnnotationProcessor
|
||||||
io.anuke.annotations.SerializeAnnotationProcessor
|
io.anuke.annotations.SerializeAnnotationProcessor
|
||||||
io.anuke.annotations.StructAnnotationProcessor
|
io.anuke.annotations.StructAnnotationProcessor
|
||||||
|
io.anuke.annotations.CallSuperAnnotationProcessor
|
||||||
|
io.anuke.annotations.AssetsAnnotationProcessor
|
||||||
172
build.gradle
@@ -5,48 +5,41 @@ 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.6'
|
classpath 'com.mobidevelop.robovm:robovm-gradle-plugin:2.3.8-SNAPSHOT'
|
||||||
classpath "com.badlogicgames.gdx:gdx-tools:1.9.9"
|
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{
|
||||||
apply plugin: "idea"
|
|
||||||
|
|
||||||
version = 'release'
|
version = 'release'
|
||||||
|
apply plugin: 'maven'
|
||||||
|
group = 'com.github.Anuken'
|
||||||
|
|
||||||
ext{
|
ext{
|
||||||
versionNumber = '4'
|
versionNumber = '5'
|
||||||
versionModifier = 'beta'
|
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.9'
|
gdxVersion = '1.9.10'
|
||||||
roboVMVersion = '2.3.6'
|
roboVMVersion = '2.3.8-SNAPSHOT'
|
||||||
|
steamworksVersion = '1.8.0'
|
||||||
arcHash = null
|
arcHash = null
|
||||||
|
|
||||||
debugged = {
|
debugged = {
|
||||||
return new File(projectDir.parent, '../debug').exists() && !project.hasProperty("release")
|
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 gtihub 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 ->
|
||||||
@@ -59,11 +52,36 @@ allprojects{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
generateDeployName = { String platform ->
|
||||||
|
if(platform == "windows"){
|
||||||
|
platform += "64"
|
||||||
|
}
|
||||||
|
platform = platform.capitalize()
|
||||||
|
|
||||||
|
if(platform.endsWith("64") || platform.endsWith("32")){
|
||||||
|
platform = "${platform.substring(0, platform.length() - 2)}-${platform.substring(platform.length() - 2)}bit"
|
||||||
|
}
|
||||||
|
|
||||||
|
return "[${platform}]${getModifierString()}[${getNeatVersionString()}]${appName}"
|
||||||
|
}
|
||||||
|
|
||||||
getVersionString = {
|
getVersionString = {
|
||||||
String buildVersion = getBuildVersion()
|
String buildVersion = getBuildVersion()
|
||||||
return "$versionNumber-$versionModifier-$buildVersion"
|
return "$versionNumber-$versionModifier-$buildVersion"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getNeatVersionString = {
|
||||||
|
String buildVersion = getBuildVersion()
|
||||||
|
return "v$buildVersion"
|
||||||
|
}
|
||||||
|
|
||||||
|
getModifierString = {
|
||||||
|
if(versionModifier != "release"){
|
||||||
|
return "[${versionModifier.toUpperCase()}]"
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
getBuildVersion = {
|
getBuildVersion = {
|
||||||
if(!project.hasProperty("buildversion")) return "custom build"
|
if(!project.hasProperty("buildversion")) return "custom build"
|
||||||
return project.getProperties()["buildversion"]
|
return project.getProperties()["buildversion"]
|
||||||
@@ -89,12 +107,14 @@ allprojects{
|
|||||||
|
|
||||||
try{
|
try{
|
||||||
pfile.createNewFile()
|
pfile.createNewFile()
|
||||||
}catch(Exception ignored){}
|
}catch(Exception ignored){
|
||||||
|
}
|
||||||
|
|
||||||
if(pfile.exists()){
|
if(pfile.exists()){
|
||||||
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
|
||||||
@@ -112,7 +132,10 @@ allprojects{
|
|||||||
maven{ url "https://oss.sonatype.org/content/repositories/snapshots/" }
|
maven{ url "https://oss.sonatype.org/content/repositories/snapshots/" }
|
||||||
maven{ url "https://oss.sonatype.org/content/repositories/releases/" }
|
maven{ url "https://oss.sonatype.org/content/repositories/releases/" }
|
||||||
maven{ url 'https://jitpack.io' }
|
maven{ url 'https://jitpack.io' }
|
||||||
|
jcenter()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tasks.withType(Javadoc).all{ enabled = false }
|
||||||
}
|
}
|
||||||
|
|
||||||
project(":desktop"){
|
project(":desktop"){
|
||||||
@@ -120,15 +143,17 @@ 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.code-disaster.steamworks4j:steamworks4j:$steamworksVersion"
|
||||||
compile 'com.github.MinnDevelopment:java-discord-rpc:v2.0.0'
|
compile "com.code-disaster.steamworks4j:steamworks4j-server:$steamworksVersion"
|
||||||
|
|
||||||
|
compile arcModule("backends:backend-sdl")
|
||||||
|
compile 'com.github.MinnDevelopment:java-discord-rpc:v2.0.1'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -142,20 +167,20 @@ project(":ios"){
|
|||||||
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.version'] = '5.0'
|
||||||
|
props['app.mainclass'] = 'io.anuke.mindustry.IOSLauncher'
|
||||||
|
props['app.executable'] = 'IOSLauncher'
|
||||||
|
props['app.name'] = 'Mindustry'
|
||||||
}
|
}
|
||||||
|
|
||||||
props['app.id'] = 'io.anuke.mindustry'
|
|
||||||
props['app.version'] = '4.0'
|
|
||||||
props['app.mainclass'] = 'io.anuke.mindustry.IOSLauncher'
|
|
||||||
props['app.executable'] = 'IOSLauncher'
|
|
||||||
props['app.name'] = 'Mindustry'
|
|
||||||
props['app.build'] = (!props.containsKey("app.build") ? 40 : props['app.build'].toInteger() + 1) + ""
|
props['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")
|
||||||
@@ -170,36 +195,44 @@ project(":ios"){
|
|||||||
project(":core"){
|
project(":core"){
|
||||||
apply plugin: "java"
|
apply plugin: "java"
|
||||||
|
|
||||||
task finish{
|
task preGen{
|
||||||
|
outputs.upToDateWhen{ false }
|
||||||
generateLocales()
|
generateLocales()
|
||||||
}
|
writeVersion()
|
||||||
|
|
||||||
task cleanGen{
|
|
||||||
doFirst{
|
|
||||||
delete{
|
|
||||||
delete "../core/src/io/anuke/mindustry/gen/"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
task copyGen{
|
|
||||||
doLast{
|
|
||||||
copy{
|
|
||||||
from("../core/build/classes/java/main/io/anuke/mindustry/gen/"){
|
|
||||||
include "**/*.java"
|
|
||||||
}
|
|
||||||
|
|
||||||
into "../core/src/io/anuke/mindustry/gen"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies{
|
dependencies{
|
||||||
compileJava.dependsOn(cleanGen)
|
if(System.properties["user.name"] == "anuke"){
|
||||||
compileJava.finalizedBy(copyGen)
|
task cleanGen{
|
||||||
|
doFirst{
|
||||||
|
delete{
|
||||||
|
delete "../core/src/io/anuke/mindustry/gen/"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
task copyGen{
|
||||||
|
doLast{
|
||||||
|
copy{
|
||||||
|
from("../core/build/generated/sources/annotationProcessor/java/main/io/anuke/mindustry/gen"){
|
||||||
|
include "**/*.java"
|
||||||
|
}
|
||||||
|
|
||||||
|
into "../core/src/io/anuke/mindustry/gen"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
compileJava.dependsOn(cleanGen)
|
||||||
|
compileJava.finalizedBy(copyGen)
|
||||||
|
}
|
||||||
|
|
||||||
|
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")
|
||||||
if(localArc() && debugged()) compile arcModule("extensions:recorder")
|
if(localArc() && debugged()) compile arcModule("extensions:recorder")
|
||||||
|
|
||||||
compileOnly project(":annotations")
|
compileOnly project(":annotations")
|
||||||
@@ -212,7 +245,6 @@ project(":server"){
|
|||||||
|
|
||||||
dependencies{
|
dependencies{
|
||||||
compile project(":core")
|
compile project(":core")
|
||||||
compile project(":net")
|
|
||||||
compile arcModule("backends:backend-headless")
|
compile arcModule("backends:backend-headless")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -239,6 +271,11 @@ project(":tools"){
|
|||||||
|
|
||||||
dependencies{
|
dependencies{
|
||||||
compile project(":core")
|
compile project(":core")
|
||||||
|
|
||||||
|
compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop"
|
||||||
|
compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-desktop"
|
||||||
|
|
||||||
|
compile arcModule("backends:backend-sdl")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -247,16 +284,27 @@ project(":annotations"){
|
|||||||
|
|
||||||
dependencies{
|
dependencies{
|
||||||
compile 'com.squareup:javapoet:1.11.0'
|
compile 'com.squareup:javapoet:1.11.0'
|
||||||
|
compile files("${System.getProperty('java.home')}/../lib/tools.jar")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
project(":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"
|
}
|
||||||
compile 'com.github.Anuken:kryonet:a64d2280880e80566ca1bdaffa55de43e51cad38'
|
}
|
||||||
compile 'com.github.Anuken:WaifUPnP:05eb46bc577fd7674596946ba288c96c0cedd893'
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dependsOn cleanDeployOutput
|
||||||
|
dependsOn "desktop:packrLinux64"
|
||||||
|
dependsOn "desktop:packrWindows64"
|
||||||
|
dependsOn "desktop:packrWindows32"
|
||||||
|
dependsOn "desktop:packrMacOS"
|
||||||
|
dependsOn "server:deploy"
|
||||||
|
dependsOn "android:deploy"
|
||||||
}
|
}
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 121 B After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 312 B After Width: | Height: | Size: 8.0 KiB |
|
Before Width: | Height: | Size: 111 B After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 217 B After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 1018 B After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 111 B After Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 215 B After Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 123 B After Width: | Height: | Size: 1.8 KiB |
BIN
core/assets-raw/sprites/blocks/distribution/bridge-arrow.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 83 B After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 93 B After Width: | Height: | Size: 123 B |
|
Before Width: | Height: | Size: 95 B After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 119 B After Width: | Height: | Size: 1.7 KiB |
BIN
core/assets-raw/sprites/blocks/distribution/center.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
|
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 |
|
Before Width: | Height: | Size: 98 B After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 98 B After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 98 B After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 97 B After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 116 B After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 117 B After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 119 B After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 117 B After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 113 B After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 108 B After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 104 B After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 106 B After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 109 B After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 107 B After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 110 B After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 110 B After Width: | Height: | Size: 1.5 KiB |