Compare commits
1252 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d56c041c4a | ||
|
|
be48ed5589 | ||
|
|
897c296fbe | ||
|
|
d25fe028b8 | ||
|
|
7fd05b7ca6 | ||
|
|
0eec5383ed | ||
|
|
f474d2c834 | ||
|
|
e40e5e6a99 | ||
|
|
23750bab55 | ||
|
|
22aeddc655 | ||
|
|
f3d35e9537 | ||
|
|
75d2ea1519 | ||
|
|
14e9a94061 | ||
|
|
d3284ab9f6 | ||
|
|
775df43470 | ||
|
|
e2e6024e8f | ||
|
|
d89b51f17d | ||
|
|
aa626947ed | ||
|
|
f2be23274e | ||
|
|
cc90e6d479 | ||
|
|
76dd3c86f2 | ||
|
|
91468fa2f9 | ||
|
|
8e4aec9c4d | ||
|
|
e6e29aaf1e | ||
|
|
1ac5f54e9e | ||
|
|
bf983658c8 | ||
|
|
e17286eb9f | ||
|
|
19c17e96de | ||
|
|
b45368342d | ||
|
|
dcea8ae64f | ||
|
|
ef85d1d83e | ||
|
|
d03ceb2a23 | ||
|
|
90198be1cb | ||
|
|
a241f63ddc | ||
|
|
70507258ae | ||
|
|
51a8144f49 | ||
|
|
54ad9ba243 | ||
|
|
a7f7a09418 | ||
|
|
44897fb371 | ||
|
|
bb6a748167 | ||
|
|
c321402414 | ||
|
|
ec80fc9f3f | ||
|
|
6bfd57097f | ||
|
|
6f5df6a671 | ||
|
|
1baf3190cd | ||
|
|
66c29c49e5 | ||
|
|
e5d6740555 | ||
|
|
30b5dd63e4 | ||
|
|
f0aa8d73ea | ||
|
|
8a0761cad8 | ||
|
|
322d76b713 | ||
|
|
4f56bf3c3e | ||
|
|
942eed402a | ||
|
|
24c72650fb | ||
|
|
f5959c8829 | ||
|
|
7621ebed42 | ||
|
|
5447c71790 | ||
|
|
c5241eaaf6 | ||
|
|
9266b55ddf | ||
|
|
1bc1f66613 | ||
|
|
7795a690ed | ||
|
|
d498ac89f2 | ||
|
|
2842018c2f | ||
|
|
51641cc704 | ||
|
|
729f5ed5e4 | ||
|
|
03ff33acaf | ||
|
|
46035e76cc | ||
|
|
7c073f76ae | ||
|
|
5ced5ce253 | ||
|
|
55781e911e | ||
|
|
ee3c4a4124 | ||
|
|
6815e56e57 | ||
|
|
6c744443fb | ||
|
|
3c37047afb | ||
|
|
f31f09d77a | ||
|
|
de508ee68f | ||
|
|
a932111040 | ||
|
|
8c437eb815 | ||
|
|
1ad4815983 | ||
|
|
c75cdc6d28 | ||
|
|
b9fae7fb7d | ||
|
|
e74a3da5cd | ||
|
|
08cf986cae | ||
|
|
ba01ed0153 | ||
|
|
19ac8bd9b2 | ||
|
|
ab79ccb02b | ||
|
|
d862498516 | ||
|
|
b09b03a427 | ||
|
|
4ef2ede4cf | ||
|
|
0efaa11553 | ||
|
|
ea87b958ef | ||
|
|
ff62f075d0 | ||
|
|
348744086d | ||
|
|
d1d4f79973 | ||
|
|
2a3f7f8cb3 | ||
|
|
7eaef11a84 | ||
|
|
efe93d0117 | ||
|
|
7d12e18b98 | ||
|
|
de6bca424f | ||
|
|
03268a5575 | ||
|
|
1251680a1c | ||
|
|
cd0e49914b | ||
|
|
700e845727 | ||
|
|
bab8120814 | ||
|
|
afec65eb56 | ||
|
|
d6661da0a7 | ||
|
|
dcc4732748 | ||
|
|
6a5bf08d55 | ||
|
|
ca5db2bff8 | ||
|
|
658698ed2f | ||
|
|
7f391dacbd | ||
|
|
90e0bf95d1 | ||
|
|
930bfb26f4 | ||
|
|
7e788f212a | ||
|
|
8f99530795 | ||
|
|
434af4b998 | ||
|
|
a7c8526f3e | ||
|
|
459256e83a | ||
|
|
8dbfb87246 | ||
|
|
9f97ed331b | ||
|
|
ee043e67a4 | ||
|
|
6c3b449f74 | ||
|
|
536c6a7b2c | ||
|
|
e90e0fc615 | ||
|
|
b704121dcb | ||
|
|
5e0886d744 | ||
|
|
f819e4829b | ||
|
|
8873948e9e | ||
|
|
a25ea14436 | ||
|
|
1a922f05c1 | ||
|
|
e8268b1dab | ||
|
|
7a516930b1 | ||
|
|
92b68bdb8f | ||
|
|
a86bb9f6e6 | ||
|
|
c9777af91c | ||
|
|
2d1a97e042 | ||
|
|
ece3f96867 | ||
|
|
65a48b324d | ||
|
|
53bf622065 | ||
|
|
075be18123 | ||
|
|
044390b4b4 | ||
|
|
37d03aaebe | ||
|
|
51a51833d4 | ||
|
|
a8cfc1ef7a | ||
|
|
1d238c8315 | ||
|
|
4f96744ff2 | ||
|
|
e9783ecccc | ||
|
|
6342cc41ac | ||
|
|
c554390de5 | ||
|
|
4d8bbe3023 | ||
|
|
969076f1ef | ||
|
|
20032def7e | ||
|
|
94706460c0 | ||
|
|
b7506229f8 | ||
|
|
58c6df3537 | ||
|
|
235a1f36ec | ||
|
|
b53821976e | ||
|
|
4355881fb2 | ||
|
|
cf50d558ba | ||
|
|
7488dc3ebb | ||
|
|
b449847ad1 | ||
|
|
9785745384 | ||
|
|
56ffa7905e | ||
|
|
216433aa2d | ||
|
|
122fbbed22 | ||
|
|
042c671bd4 | ||
|
|
38fdc11917 | ||
|
|
2f4730a9c6 | ||
|
|
3759d32c89 | ||
|
|
93c2ca8df1 | ||
|
|
3c70681537 | ||
|
|
0ce08319e7 | ||
|
|
17e0489164 | ||
|
|
7953cc416b | ||
|
|
a670ac0aea | ||
|
|
ef30018008 | ||
|
|
66810c8b75 | ||
|
|
2bba55ebd5 | ||
|
|
b977ae4d3b | ||
|
|
d4f5e854c5 | ||
|
|
837f621633 | ||
|
|
a781b4a387 | ||
|
|
a73a75a7f8 | ||
|
|
17d1db913f | ||
|
|
a924509e92 | ||
|
|
04b4321ea1 | ||
|
|
1f9ebc7295 | ||
|
|
6d88111dfc | ||
|
|
184e52b4ec | ||
|
|
2a3cc3d88c | ||
|
|
ffa1aae27c | ||
|
|
7cd842df19 | ||
|
|
e399e4960c | ||
|
|
5c193a47eb | ||
|
|
b63c02cb10 | ||
|
|
09418f1a5d | ||
|
|
fa4491340a | ||
|
|
192814650d | ||
|
|
5f1addc54d | ||
|
|
9ffc8c6800 | ||
|
|
64cd8084ea | ||
|
|
2e6c9d408c | ||
|
|
f3bea49f61 | ||
|
|
48fdae754e | ||
|
|
64f2ee67b2 | ||
|
|
19d34779a0 | ||
|
|
76a6a0cf75 | ||
|
|
da47d97cd0 | ||
|
|
f59441005e | ||
|
|
e30347a11f | ||
|
|
8ac079fb72 | ||
|
|
4295f08a84 | ||
|
|
bd8eb97d46 | ||
|
|
329f656c40 | ||
|
|
f2c7a26ce0 | ||
|
|
930e25e64a | ||
|
|
963269a685 | ||
|
|
de23ef5d35 | ||
|
|
208ae6183c | ||
|
|
761ae4b816 | ||
|
|
ff308641e1 | ||
|
|
a2094ddf75 | ||
|
|
0391ed3e63 | ||
|
|
b6b3997498 | ||
|
|
9f77c0c9b7 | ||
|
|
dc4812a86e | ||
|
|
fc83b0d95b | ||
|
|
8e70568e32 | ||
|
|
f0e3a3a30c | ||
|
|
cf44efa02e | ||
|
|
ddc59dfb97 | ||
|
|
ef0a3396d7 | ||
|
|
8bf68aa020 | ||
|
|
02a90856ff | ||
|
|
8716695d4e | ||
|
|
9a1bb69cd8 | ||
|
|
6caad0daf6 | ||
|
|
6508f1541b | ||
|
|
6809b38821 | ||
|
|
7f9a3efa24 | ||
|
|
8ecea9792b | ||
|
|
7c85a03b42 | ||
|
|
d4d71b90eb | ||
|
|
fbf614a8df | ||
|
|
c02329e4b1 | ||
|
|
5aba065413 | ||
|
|
6e65096bb4 | ||
|
|
b39f25ed51 | ||
|
|
3925d5ec27 | ||
|
|
381b59acd4 | ||
|
|
5b01d923d3 | ||
|
|
108e5a2f5e | ||
|
|
e21d17a482 | ||
|
|
d4ea8c56c3 | ||
|
|
783ad64353 | ||
|
|
ac918c1a81 | ||
|
|
0f00074f77 | ||
|
|
eb20ec1556 | ||
|
|
32f9da0724 | ||
|
|
968be8eb8f | ||
|
|
d7e05cde42 | ||
|
|
557b86a7a9 | ||
|
|
f144dda8b5 | ||
|
|
80aed31135 | ||
|
|
2a21e7c2cb | ||
|
|
d281277797 | ||
|
|
fb807bcde4 | ||
|
|
ebf6f6782f | ||
|
|
008df649f0 | ||
|
|
a810e704ad | ||
|
|
d0b3167956 | ||
|
|
a726ecbdd8 | ||
|
|
da6a8f806d | ||
|
|
b47f44cacd | ||
|
|
0cc59adad7 | ||
|
|
6c076863db | ||
|
|
ddb6e74955 | ||
|
|
2094bc3d80 | ||
|
|
c922007d21 | ||
|
|
b1435c1264 | ||
|
|
be5e1648e0 | ||
|
|
a270feb1eb | ||
|
|
103b8cd13a | ||
|
|
e6dd36283d | ||
|
|
aae2d0a5dc | ||
|
|
fda1d4cc2b | ||
|
|
5be92460c1 | ||
|
|
15ce31ea3a | ||
|
|
35e5a669a0 | ||
|
|
8b8c74cf93 | ||
|
|
cc43524b4c | ||
|
|
f87d297155 | ||
|
|
605d50166a | ||
|
|
de6681d00a | ||
|
|
7632e33975 | ||
|
|
5993a596e8 | ||
|
|
2294b6babb | ||
|
|
c38f866363 | ||
|
|
511b112ac7 | ||
|
|
8cd0618e85 | ||
|
|
b4b589bfc2 | ||
|
|
cb69eb7c0f | ||
|
|
7d83cd89f2 | ||
|
|
b2dca0a34f | ||
|
|
3bd73961d7 | ||
|
|
67f574b5d8 | ||
|
|
f9b70a37aa | ||
|
|
d4047e1413 | ||
|
|
80f5b4c3b7 | ||
|
|
4668a6d8c0 | ||
|
|
e6f076306f | ||
|
|
b73dc127a3 | ||
|
|
8c8a2311d6 | ||
|
|
0555fb22ca | ||
|
|
85cde62039 | ||
|
|
46a2648d15 | ||
|
|
e55f6ecd6b | ||
|
|
c71fee3fed | ||
|
|
4d6c25c9d3 | ||
|
|
6ed4e2d946 | ||
|
|
6b4242478f | ||
|
|
ef5478279b | ||
|
|
62bb8bce1c | ||
|
|
83a5c3af8a | ||
|
|
f78abd61d4 | ||
|
|
209c6fa1c1 | ||
|
|
6e3c600a49 | ||
|
|
b1cda57174 | ||
|
|
412d92e782 | ||
|
|
c0703a6a5e | ||
|
|
64bd306c6d | ||
|
|
6be49f898c | ||
|
|
59bc73656f | ||
|
|
bed22f51b4 | ||
|
|
c1362a02f3 | ||
|
|
859a3cbe6e | ||
|
|
a6d82f44b3 | ||
|
|
e66e17a41a | ||
|
|
cfa6d7080c | ||
|
|
01ceedccd5 | ||
|
|
ed28af7c73 | ||
|
|
74cf91f99e | ||
|
|
44479930df | ||
|
|
cb1f54aac4 | ||
|
|
d68d2e9f30 | ||
|
|
948c48ea23 | ||
|
|
a9ccf6ca42 | ||
|
|
fd7b829e70 | ||
|
|
87a7cc6289 | ||
|
|
2f8b5e53bb | ||
|
|
8b7fa3b646 | ||
|
|
dd2c71fe61 | ||
|
|
3b58d57e5c | ||
|
|
cecf32e52e | ||
|
|
91a2dfab36 | ||
|
|
5e5838a8c1 | ||
|
|
0fffbc06dd | ||
|
|
4d360bfb73 | ||
|
|
e3001b614e | ||
|
|
6ecdef02ab | ||
|
|
36903eb749 | ||
|
|
f530c9514f | ||
|
|
fdffa77bc5 | ||
|
|
245dd39a60 | ||
|
|
4614aacc02 | ||
|
|
64ccdab90c | ||
|
|
02286b0c4e | ||
|
|
8e952a550b | ||
|
|
a29f95194d | ||
|
|
0e5db49b93 | ||
|
|
a2c29c0937 | ||
|
|
c318f05cfd | ||
|
|
789d200c24 | ||
|
|
2dc4a9e044 | ||
|
|
82577b91d5 | ||
|
|
8fd08a1574 | ||
|
|
7a41fc8ec8 | ||
|
|
798ca929d6 | ||
|
|
7e4e58fb78 | ||
|
|
28b9975c75 | ||
|
|
5536ade389 | ||
|
|
21bc195213 | ||
|
|
b6beacf053 | ||
|
|
94b6c133f4 | ||
|
|
949d7bed89 | ||
|
|
81ce12a38c | ||
|
|
eba65b2934 | ||
|
|
c7f5b7fca1 | ||
|
|
f670d522bf | ||
|
|
a02f7f46c3 | ||
|
|
4b7f254e17 | ||
|
|
9b42be560d | ||
|
|
31b39231a2 | ||
|
|
4eb2c1f646 | ||
|
|
5f89d8588d | ||
|
|
404cbf9b4a | ||
|
|
0aabc09b82 | ||
|
|
a5ebeadd95 | ||
|
|
9e188aaf03 | ||
|
|
870f5caca9 | ||
|
|
28b4ddfc72 | ||
|
|
13a4a26e97 | ||
|
|
81c7e63994 | ||
|
|
7f234ab5bc | ||
|
|
f8d0682810 | ||
|
|
175d6b1fc5 | ||
|
|
1cd8e8a097 | ||
|
|
ed95e38257 | ||
|
|
cab585225d | ||
|
|
3688dde5e5 | ||
|
|
ae6a5b2512 | ||
|
|
6f87611d67 | ||
|
|
6a5e31c908 | ||
|
|
8bda5e16cd | ||
|
|
d70d3d95f0 | ||
|
|
554b7d2ec4 | ||
|
|
ebc4031922 | ||
|
|
c526997aba | ||
|
|
c0e3a1f3ef | ||
|
|
7dc0a7a5c3 | ||
|
|
2943b6ed04 | ||
|
|
5feb212df7 | ||
|
|
327edcd347 | ||
|
|
94cbf4cddf | ||
|
|
08cc87affb | ||
|
|
18020d64cc | ||
|
|
48b7ceac06 | ||
|
|
dbcce9663c | ||
|
|
6ee7dd56fe | ||
|
|
22328772ca | ||
|
|
99418e6b88 | ||
|
|
52bd079c0a | ||
|
|
67db5e9dfc | ||
|
|
5f1bc6c6c2 | ||
|
|
05201d7012 | ||
|
|
6b4983537e | ||
|
|
87c8293c78 | ||
|
|
54488564f3 | ||
|
|
f2ac9ed385 | ||
|
|
38f2f1e30a | ||
|
|
02004011ec | ||
|
|
60bb982450 | ||
|
|
67389c0bac | ||
|
|
faa1fee1c0 | ||
|
|
0bae421fbc | ||
|
|
b29d81bf0f | ||
|
|
4792828da1 | ||
|
|
6171e887a8 | ||
|
|
f28fa93f40 | ||
|
|
940ad84493 | ||
|
|
0b168376ed | ||
|
|
f7bd376499 | ||
|
|
9566155bdb | ||
|
|
9994ddb31b | ||
|
|
fadfdaa673 | ||
|
|
4ca546f44a | ||
|
|
8af30c9256 | ||
|
|
42adc38720 | ||
|
|
c1d9dee46c | ||
|
|
69a7104286 | ||
|
|
aba5afe32c | ||
|
|
c1ccf4fceb | ||
|
|
916a4cfc73 | ||
|
|
fd107ab5b8 | ||
|
|
5fa6fccf7b | ||
|
|
0ce226d0c9 | ||
|
|
14e0b471d3 | ||
|
|
ed0df64cf9 | ||
|
|
35bc2c9803 | ||
|
|
a771dc8787 | ||
|
|
244eb91dfb | ||
|
|
7488a6d42b | ||
|
|
696a59f1b9 | ||
|
|
ee5a3269f2 | ||
|
|
f89bf027f7 | ||
|
|
4db432b0a9 | ||
|
|
c82fd9ead5 | ||
|
|
34715b1e06 | ||
|
|
f0870b3236 | ||
|
|
9a286800d6 | ||
|
|
59832b1777 | ||
|
|
561f566506 | ||
|
|
f0cacf6bd5 | ||
|
|
ce4031af74 | ||
|
|
dd7f91b8c2 | ||
|
|
8523e5bf6b | ||
|
|
860727d27a | ||
|
|
f175bf2c82 | ||
|
|
40008f44ac | ||
|
|
3f93b5c63b | ||
|
|
d2ce051c4a | ||
|
|
d5d90bde9a | ||
|
|
fc8d9febf6 | ||
|
|
b43c542213 | ||
|
|
e7533232c0 | ||
|
|
5e1aaf11a7 | ||
|
|
d062dffc13 | ||
|
|
4810bbbbd9 | ||
|
|
967998273f | ||
|
|
24decf8abc | ||
|
|
3bc605894e | ||
|
|
b74ae302ec | ||
|
|
db3dac261a | ||
|
|
87b47b3042 | ||
|
|
720e1a038e | ||
|
|
1753c54e88 | ||
|
|
2d42de83de | ||
|
|
c4e6af455d | ||
|
|
51d619449b | ||
|
|
1160a14f56 | ||
|
|
57fce0ddbc | ||
|
|
b9eb8a750b | ||
|
|
3ce16e0ed1 | ||
|
|
554d9b4047 | ||
|
|
02d565ce58 | ||
|
|
795bc1276b | ||
|
|
499b7b2e67 | ||
|
|
b6c0fe8bf7 | ||
|
|
d5bb1b72b9 | ||
|
|
af86564adc | ||
|
|
5354e02b6f | ||
|
|
4ee17a656f | ||
|
|
32c59b66f6 | ||
|
|
20732f04ff | ||
|
|
06763b34c3 | ||
|
|
6bab6c57f2 | ||
|
|
4eab89d73e | ||
|
|
8d20c46228 | ||
|
|
f5c4586bb7 | ||
|
|
bc6bbdbbe0 | ||
|
|
b77caed0ba | ||
|
|
df976f1212 | ||
|
|
999dd5eb6f | ||
|
|
a1a6a3ab81 | ||
|
|
d067bbfa65 | ||
|
|
3bd40eeb27 | ||
|
|
b124d54055 | ||
|
|
90691de457 | ||
|
|
bee83a3a3e | ||
|
|
fd8f2438fa | ||
|
|
7937d99a73 | ||
|
|
569afb5535 | ||
|
|
fc5a45e113 | ||
|
|
950f4a9f1a | ||
|
|
6a6e80b6d8 | ||
|
|
083c9792a6 | ||
|
|
893bfce767 | ||
|
|
f61f3df732 | ||
|
|
a3be5e332e | ||
|
|
33d65a8593 | ||
|
|
ebbf01c6e5 | ||
|
|
acb8496352 | ||
|
|
ecad5772d2 | ||
|
|
6e6f5714dd | ||
|
|
50ae15aa4f | ||
|
|
4e2c3049a0 | ||
|
|
3a785c166e | ||
|
|
5248a4eb9c | ||
|
|
c9a53aed7b | ||
|
|
bafe5dc784 | ||
|
|
5325488099 | ||
|
|
737ad5c8b7 | ||
|
|
17cea4e274 | ||
|
|
af5b579a2f | ||
|
|
c87eaaa928 | ||
|
|
33418397f8 | ||
|
|
8c7258e839 | ||
|
|
98fff9b81d | ||
|
|
0c63b27eea | ||
|
|
0968981aef | ||
|
|
8db4abdf43 | ||
|
|
9aa4219bf0 | ||
|
|
6c32ab4711 | ||
|
|
a80c5a1efa | ||
|
|
4ba46bff69 | ||
|
|
6a7c97277f | ||
|
|
cc70ff9732 | ||
|
|
2d25948c57 | ||
|
|
8946af4831 | ||
|
|
5e7ca0374c | ||
|
|
21f8e89ba4 | ||
|
|
f0aca90de2 | ||
|
|
097228066a | ||
|
|
7d8782f3dc | ||
|
|
e4ea9d561e | ||
|
|
e284d9de8e | ||
|
|
df6382a1ca | ||
|
|
c1c1a3318c | ||
|
|
796df1cec5 | ||
|
|
28980293c5 | ||
|
|
d878ad2e7e | ||
|
|
1290d1e9d4 | ||
|
|
f229f1e9fe | ||
|
|
0776951018 | ||
|
|
6d47b449b9 | ||
|
|
594c975c70 | ||
|
|
bf57318307 | ||
|
|
abd87793e4 | ||
|
|
7b4e6128ce | ||
|
|
2ae65acc28 | ||
|
|
2ee87ad078 | ||
|
|
d65beea179 | ||
|
|
b19f3ff8cf | ||
|
|
75fae9454d | ||
|
|
5d309c39cf | ||
|
|
649fc5a0e6 | ||
|
|
67cfa5d42f | ||
|
|
5dcacdeea1 | ||
|
|
2f7073bbe4 | ||
|
|
e8df6ed3be | ||
|
|
d9eb4c1296 | ||
|
|
4af0fbf553 | ||
|
|
2da0862cb2 | ||
|
|
66fcf84688 | ||
|
|
5740d40d57 | ||
|
|
6ef2256bf2 | ||
|
|
65f911909b | ||
|
|
2cb6e454c8 | ||
|
|
abfaa47db2 | ||
|
|
e06970eebb | ||
|
|
dadc83800b | ||
|
|
62f2c67321 | ||
|
|
1651844b4f | ||
|
|
fb9f42ff93 | ||
|
|
9c29b982dd | ||
|
|
f52c4964b3 | ||
|
|
46a8edb781 | ||
|
|
8dbdbe6d6c | ||
|
|
778069c15d | ||
|
|
e98457c540 | ||
|
|
7a3a76065c | ||
|
|
c73c97dc7b | ||
|
|
1b0dd279ae | ||
|
|
7dd487ccc5 | ||
|
|
d046591512 | ||
|
|
e4ce115abf | ||
|
|
aedcac5820 | ||
|
|
9f4430ad92 | ||
|
|
2ad8f1c112 | ||
|
|
f0d884e114 | ||
|
|
b618f5be80 | ||
|
|
7b63eac3eb | ||
|
|
df3f2ea9c1 | ||
|
|
30c6280ed1 | ||
|
|
1960b59629 | ||
|
|
6e6edf8322 | ||
|
|
f47fb01614 | ||
|
|
ae30bdd599 | ||
|
|
2c8962cf5f | ||
|
|
eb3e507a11 | ||
|
|
be3147465d | ||
|
|
484721fece | ||
|
|
9c36026991 | ||
|
|
bf5055f944 | ||
|
|
389034bf1a | ||
|
|
3f07102f2a | ||
|
|
d4ccfa31b5 | ||
|
|
5814b2a4b8 | ||
|
|
d3f61af493 | ||
|
|
233ea7bb4a | ||
|
|
6893a30ffb | ||
|
|
ae6d2fb363 | ||
|
|
baa7cb3a10 | ||
|
|
7b90544d91 | ||
|
|
9a5495d8b2 | ||
|
|
1fa769b3e7 | ||
|
|
96766ece4e | ||
|
|
add525396f | ||
|
|
26ae4edd63 | ||
|
|
063893adee | ||
|
|
ff37e99d71 | ||
|
|
3d0b02ee23 | ||
|
|
d7cfbfe6c8 | ||
|
|
dc00e22f13 | ||
|
|
bcde481304 | ||
|
|
5b1341e488 | ||
|
|
6ad70ceee3 | ||
|
|
9c4d2f5490 | ||
|
|
6c5eff1143 | ||
|
|
a893767d0f | ||
|
|
a4f240edc8 | ||
|
|
e0a94f694b | ||
|
|
8654f25a4f | ||
|
|
e877310d85 | ||
|
|
bb59f45ba6 | ||
|
|
3d4c2a2c20 | ||
|
|
e36667cd08 | ||
|
|
cebaa6949e | ||
|
|
019e22aff2 | ||
|
|
5129e2ea73 | ||
|
|
3b63f60462 | ||
|
|
5e29115c2e | ||
|
|
0b4b30286d | ||
|
|
a01f64080d | ||
|
|
d031351bc8 | ||
|
|
1d21d36253 | ||
|
|
8d4cd72b41 | ||
|
|
46ab6d3476 | ||
|
|
3fcf3cbf93 | ||
|
|
ada912c69b | ||
|
|
e204b89eaf | ||
|
|
e903798fc2 | ||
|
|
54497c43b6 | ||
|
|
99e54cc214 | ||
|
|
56ae47cd8d | ||
|
|
0fb336cf7b | ||
|
|
469b3c0a94 | ||
|
|
d90d88c68b | ||
|
|
dcc061af3e | ||
|
|
a2960f5c50 | ||
|
|
565f8a2b4d | ||
|
|
5cb50d57ec | ||
|
|
522e19d4bf | ||
|
|
0db7a78889 | ||
|
|
1ce3b40b4e | ||
|
|
e633528a7a | ||
|
|
6570b411d1 | ||
|
|
ac9e774795 | ||
|
|
8791747453 | ||
|
|
dda3afe9fa | ||
|
|
d4435f980c | ||
|
|
f29673a6e3 | ||
|
|
9816bab151 | ||
|
|
5884c0bcb3 | ||
|
|
96dc00beac | ||
|
|
febc1e53b6 | ||
|
|
3e18fb3ca0 | ||
|
|
28b9de2e7a | ||
|
|
9a41399178 | ||
|
|
db47b9a877 | ||
|
|
7cdd7a3487 | ||
|
|
833f646903 | ||
|
|
35a85860b1 | ||
|
|
00f24dfb79 | ||
|
|
8c6ae2576d | ||
|
|
5416ad33bd | ||
|
|
1e25ba2d8e | ||
|
|
8d08d25f5b | ||
|
|
802e7b12d0 | ||
|
|
9b57550f3d | ||
|
|
28c13c8e52 | ||
|
|
d8f9059989 | ||
|
|
ac9d37d038 | ||
|
|
6323c13704 | ||
|
|
2f7f16daff | ||
|
|
9059238aee | ||
|
|
2677c0e752 | ||
|
|
ba80770564 | ||
|
|
06ad35d934 | ||
|
|
864c4f6bc3 | ||
|
|
f5f0f02abe | ||
|
|
19979dec55 | ||
|
|
926e61b7cc | ||
|
|
15378d3267 | ||
|
|
33fcfda1a0 | ||
|
|
74d7b43d0f | ||
|
|
e392c8f0e6 | ||
|
|
f60ba8587f | ||
|
|
86a7f837cd | ||
|
|
9465497481 | ||
|
|
8c3f3ac304 | ||
|
|
88ba8f6f55 | ||
|
|
c64459dbf4 | ||
|
|
8b0bbffe27 | ||
|
|
94805259d7 | ||
|
|
e796d44f92 | ||
|
|
5e8686db77 | ||
|
|
ee835f6514 | ||
|
|
5de61aaed3 | ||
|
|
6613e4ec42 | ||
|
|
206314f4f4 | ||
|
|
8f12c3f1a8 | ||
|
|
4c224d0b9c | ||
|
|
30dd089c8b | ||
|
|
8d9ec206bf | ||
|
|
8319288776 | ||
|
|
60bf36613f | ||
|
|
a75994cbbf | ||
|
|
e1f7c7b03d | ||
|
|
bb7e2c7cee | ||
|
|
69eb6469f9 | ||
|
|
d2eb3be7f8 | ||
|
|
5aa76639d1 | ||
|
|
3bf72a1af6 | ||
|
|
b745d88299 | ||
|
|
3aedc07ad0 | ||
|
|
dbb164f4be | ||
|
|
b0103d1ce3 | ||
|
|
9c532047d3 | ||
|
|
0003a58210 | ||
|
|
34f2704dc7 | ||
|
|
0ddee379ca | ||
|
|
6dcbe4fabb | ||
|
|
5dbb9fdf3f | ||
|
|
914fa3079d | ||
|
|
2e958d8d8f | ||
|
|
7a5e61fd2e | ||
|
|
6a031d8f53 | ||
|
|
dc6f01c0d3 | ||
|
|
1cc8cbe8a8 | ||
|
|
01ae8bec85 | ||
|
|
258ab87f6b | ||
|
|
8ba2db6c58 | ||
|
|
a7599e85dc | ||
|
|
28389d698e | ||
|
|
c47a220721 | ||
|
|
69f7296baa | ||
|
|
855f56bb45 | ||
|
|
a79d072aaf | ||
|
|
467047a011 | ||
|
|
0288daa39d | ||
|
|
3f075068a9 | ||
|
|
278e7027f2 | ||
|
|
9d654c1f18 | ||
|
|
279187d13b | ||
|
|
360494f971 | ||
|
|
81931eb536 | ||
|
|
a2ef11eb0f | ||
|
|
b872252771 | ||
|
|
b2c388276f | ||
|
|
178928f866 | ||
|
|
7e548f9969 | ||
|
|
a60ce3c54c | ||
|
|
0f173bcc5a | ||
|
|
64dbe8312e | ||
|
|
7f443c71ae | ||
|
|
27276c025c | ||
|
|
e9d03c179c | ||
|
|
dec01c23a9 | ||
|
|
e0eb227ce5 | ||
|
|
20021c5b31 | ||
|
|
f8d6797fc2 | ||
|
|
25051980ce | ||
|
|
fb8becca99 | ||
|
|
25bd8a7eaa | ||
|
|
bbd2424a3f | ||
|
|
83eeeed319 | ||
|
|
c92e8161a1 | ||
|
|
258555c990 | ||
|
|
0f7799422e | ||
|
|
177b565d7c | ||
|
|
a62b336b6c | ||
|
|
3ea61c8b3a | ||
|
|
4c57f9f902 | ||
|
|
6d7941fba4 | ||
|
|
020c6388c2 | ||
|
|
53d35e8c77 | ||
|
|
01f205d352 | ||
|
|
a786167b04 | ||
|
|
1699ab48e8 | ||
|
|
b15c04a532 | ||
|
|
20d3740e75 | ||
|
|
80d57f8c0c | ||
|
|
1de367e89c | ||
|
|
8850a89e30 | ||
|
|
4f72011cf7 | ||
|
|
c569232e74 | ||
|
|
14c526d0c4 | ||
|
|
5c4ac6b702 | ||
|
|
d58cc18136 | ||
|
|
36c01fde94 | ||
|
|
d4d9d59fe4 | ||
|
|
8dbd0a6130 | ||
|
|
3746344cba | ||
|
|
d07fd1bbfe | ||
|
|
02f95c0ed4 | ||
|
|
c98fcbd795 | ||
|
|
d071877963 | ||
|
|
0267cb4006 | ||
|
|
bf571e595c | ||
|
|
c0cad70212 | ||
|
|
7bd6dbb4b4 | ||
|
|
6d932e3d04 | ||
|
|
e154b5179d | ||
|
|
52110d6008 | ||
|
|
103b08fd1d | ||
|
|
cb09d10e7f | ||
|
|
a041c1e60d | ||
|
|
586b4cf4bd | ||
|
|
d0ff149cca | ||
|
|
f8ddc8325c | ||
|
|
59ec09e82c | ||
|
|
2ae5c96690 | ||
|
|
fda9e6bb9c | ||
|
|
29bcb8e07c | ||
|
|
b70de81c2d | ||
|
|
5e89b2568f | ||
|
|
ac1d8215ff | ||
|
|
fefc734bfa | ||
|
|
7f8735842c | ||
|
|
a226983470 | ||
|
|
28526d0a12 | ||
|
|
913e005bae | ||
|
|
7bd9fd5bae | ||
|
|
8986b89d67 | ||
|
|
ef936214f0 | ||
|
|
18fce6b3e3 | ||
|
|
ecda4d74ab | ||
|
|
31124037b5 | ||
|
|
aaf95e0756 | ||
|
|
804e311875 | ||
|
|
61ad9bc47d | ||
|
|
2b23b7876a | ||
|
|
547d334f43 | ||
|
|
7432dc115e | ||
|
|
905defe8ce | ||
|
|
0a8ff0cde7 | ||
|
|
bd5f44030e | ||
|
|
79abb86262 | ||
|
|
fe6f98ec5a | ||
|
|
e39a856e54 | ||
|
|
64e5f8155d | ||
|
|
8328b11f6b | ||
|
|
15778b2ca5 | ||
|
|
b7842014c1 | ||
|
|
a804053904 | ||
|
|
2aee72b47b | ||
|
|
0cb8c600b7 | ||
|
|
aa5348f37e | ||
|
|
0736574a57 | ||
|
|
d56365ce63 | ||
|
|
c82d2f856a | ||
|
|
8432677826 | ||
|
|
0c0c6e5470 | ||
|
|
57019b6e20 | ||
|
|
12ab2249b4 | ||
|
|
22d0992d38 | ||
|
|
f8def04653 | ||
|
|
6349530fc5 | ||
|
|
ad83a7dcc3 | ||
|
|
cfc2239733 | ||
|
|
91552a3a2b | ||
|
|
4e3204bc6d | ||
|
|
a94998bd02 | ||
|
|
81c78eafa6 | ||
|
|
273523480f | ||
|
|
b27fefae88 | ||
|
|
aa00a1b8d1 | ||
|
|
ba62e0eefc | ||
|
|
cb16c75e11 | ||
|
|
3efed0ace3 | ||
|
|
879fb8194f | ||
|
|
049dd89470 | ||
|
|
1f59d4354a | ||
|
|
8dea45d9d5 | ||
|
|
21ba6e257c | ||
|
|
18ebda01a4 | ||
|
|
3acb843109 | ||
|
|
1768aea66f | ||
|
|
4b61f273d5 | ||
|
|
a1dbbbdafc | ||
|
|
dcb840f290 | ||
|
|
e6c4c66199 | ||
|
|
b76cd558aa | ||
|
|
85b077b5c5 | ||
|
|
c34d6e6606 | ||
|
|
a5fd0aebe6 | ||
|
|
aaec04d04a | ||
|
|
b4272e0387 | ||
|
|
77f9d6cb1d | ||
|
|
aaa82b34e4 | ||
|
|
7a6b1129d9 | ||
|
|
1f8918c773 | ||
|
|
e9fe724e59 | ||
|
|
80001246ef | ||
|
|
50461bb7c8 | ||
|
|
c7c7cfde74 | ||
|
|
dcc29c0c48 | ||
|
|
635e299464 | ||
|
|
502c4e51ae | ||
|
|
382fdcbb40 | ||
|
|
468e092422 | ||
|
|
6904d4693f | ||
|
|
3ef7ec3be5 | ||
|
|
70257cbbfa | ||
|
|
6ef31d0ec1 | ||
|
|
d3077bec58 | ||
|
|
a1095353fc | ||
|
|
66fab1b3df | ||
|
|
569d6d4272 | ||
|
|
07c19ce085 | ||
|
|
d86dd4f80b | ||
|
|
f0f89f0894 | ||
|
|
47af2e83f7 | ||
|
|
8ec87872c8 | ||
|
|
f30ea80b42 | ||
|
|
1dd6e66167 | ||
|
|
4e681b2dd1 | ||
|
|
58be00b3ce | ||
|
|
5604ac6b6a | ||
|
|
effdaefdf3 | ||
|
|
5775fad030 | ||
|
|
eabc6d79c3 | ||
|
|
5f4ca6e383 | ||
|
|
c05020e28e | ||
|
|
5206079e23 | ||
|
|
9b01140882 | ||
|
|
4dae27da98 | ||
|
|
f0cab65a6d | ||
|
|
699a47351b | ||
|
|
af004da699 | ||
|
|
b5ad885237 | ||
|
|
07bd0fec70 | ||
|
|
318e51d736 | ||
|
|
ae90db50fe | ||
|
|
64772c195e | ||
|
|
05ead63bdc | ||
|
|
6f5c64420d | ||
|
|
d9d9a00a24 | ||
|
|
c1de67032c | ||
|
|
890d49fdd7 | ||
|
|
ba96ea5a0c | ||
|
|
b481b784bb | ||
|
|
53b6e68a85 | ||
|
|
e3d16418a0 | ||
|
|
e41f560ecd | ||
|
|
d394d9a529 | ||
|
|
a73015fa6e | ||
|
|
87846864cc | ||
|
|
f3b976bdd1 | ||
|
|
3a06e319b0 | ||
|
|
fe31c404ff | ||
|
|
cc23378758 | ||
|
|
5cac949ea8 | ||
|
|
a35e897194 | ||
|
|
8e92edeae1 | ||
|
|
f289a0a9a8 | ||
|
|
65a7e89a8c | ||
|
|
43be3259c9 | ||
|
|
54a4c95a1b | ||
|
|
ddac5cbfbc | ||
|
|
22342d01a5 | ||
|
|
7cffaeb193 | ||
|
|
2534496543 | ||
|
|
fe9b11e771 | ||
|
|
032347840f | ||
|
|
2978bc6ac5 | ||
|
|
a3b0bb323f | ||
|
|
a6246d27d9 | ||
|
|
884b649b53 | ||
|
|
92a2f770b4 | ||
|
|
e88ce078df | ||
|
|
77f0dfb9b1 | ||
|
|
78d1accf07 | ||
|
|
2ec68a7f07 | ||
|
|
bbaa2a2c92 | ||
|
|
341bb67ef4 | ||
|
|
e377cb423b | ||
|
|
81e954c258 | ||
|
|
79d41ba7ac | ||
|
|
e740e4da87 | ||
|
|
b476c47194 | ||
|
|
b2d61a93d9 | ||
|
|
a045ec9d46 | ||
|
|
1daf8d2743 | ||
|
|
295824f440 | ||
|
|
22b59e0cf6 | ||
|
|
ecabdb82e6 | ||
|
|
924b1c1a67 | ||
|
|
0454c4c25a | ||
|
|
3a3b81941b | ||
|
|
0875c29da5 | ||
|
|
0d4cf9f6c4 | ||
|
|
6a525dcf59 | ||
|
|
01f6904f82 | ||
|
|
23bd9a989b | ||
|
|
acfa02475b | ||
|
|
9dba304011 | ||
|
|
69b0020d15 | ||
|
|
ce2896cb38 | ||
|
|
68fd09c222 | ||
|
|
c832a7b93f | ||
|
|
49e19ab34d | ||
|
|
c1c82b451d | ||
|
|
ea6f88b7f6 | ||
|
|
2a6ee6d65b | ||
|
|
583342b430 | ||
|
|
7289c1080c | ||
|
|
9ed4f2b7a3 | ||
|
|
7396f91a5e | ||
|
|
ccc926d812 | ||
|
|
bd39255ead | ||
|
|
add7b1a7d9 | ||
|
|
8e471f9939 | ||
|
|
c61568ef98 | ||
|
|
3260e45e71 | ||
|
|
ea61b560b8 | ||
|
|
f8ad7d485b | ||
|
|
229e624434 | ||
|
|
7a3fb9c759 | ||
|
|
9a7ea0d28c | ||
|
|
ee5e655668 | ||
|
|
58be055f57 | ||
|
|
38e1944503 | ||
|
|
992b402e9c | ||
|
|
81bf28e4ed | ||
|
|
f10734b083 | ||
|
|
bf8f565631 | ||
|
|
9bc1ff8fa2 | ||
|
|
56239b6bbf | ||
|
|
cedd2bfe57 | ||
|
|
7e187a57d8 | ||
|
|
572a30a2c5 | ||
|
|
f3235ef7e8 | ||
|
|
7448eb32cc | ||
|
|
33e8cc4711 | ||
|
|
6cdb016c2c | ||
|
|
ababb7f5ab | ||
|
|
9f2b66e09d | ||
|
|
8de267f6a9 | ||
|
|
ecf9a3cbc9 | ||
|
|
01300b97e2 | ||
|
|
787163fb06 | ||
|
|
3701a3c3d9 | ||
|
|
68c51bb1bc | ||
|
|
df147c700c | ||
|
|
f5fc4d99dd | ||
|
|
2a4aa9e550 | ||
|
|
0a489f1117 | ||
|
|
9cc7c061a3 | ||
|
|
a1e7274ec3 | ||
|
|
51d516a39e | ||
|
|
de7c38231c | ||
|
|
c352ef9382 | ||
|
|
e36b5551e9 | ||
|
|
57856c38d6 | ||
|
|
2a8e02339b | ||
|
|
57f94ca6a2 | ||
|
|
0eaca8b80a | ||
|
|
d2dbab57dc | ||
|
|
cb448a3494 | ||
|
|
3fa6eae05b | ||
|
|
52cc7d699a | ||
|
|
ec4eac3a7d | ||
|
|
fbcfb23676 | ||
|
|
dbb2371801 | ||
|
|
4d6dc9546f | ||
|
|
06b9d328f4 | ||
|
|
48c7daa4ab | ||
|
|
3c83b88127 | ||
|
|
3a63fa5475 | ||
|
|
882790d133 | ||
|
|
bcf72b894d | ||
|
|
9f723c39ef | ||
|
|
56fc40a64d | ||
|
|
091f591ffb | ||
|
|
4d88a8206a | ||
|
|
363bf7c552 | ||
|
|
7ff4e5879d | ||
|
|
0b7decbfdd | ||
|
|
be9ea33aa4 | ||
|
|
d4b2cad94e | ||
|
|
ac039ce7cd | ||
|
|
946e60937d | ||
|
|
6f6601d270 | ||
|
|
71016f0d7c | ||
|
|
c2c2551607 | ||
|
|
d7812ec030 | ||
|
|
f184b0700f | ||
|
|
07f0be8d8d | ||
|
|
dd45b43d7f | ||
|
|
9b505106e3 | ||
|
|
d552f37daf | ||
|
|
6a7ff13859 | ||
|
|
9e3af13efc | ||
|
|
92a968217c | ||
|
|
37b9df3202 | ||
|
|
7dc33111fc | ||
|
|
ab2f260a52 | ||
|
|
1aa4b8cb88 | ||
|
|
dfed36748c | ||
|
|
d35f736548 | ||
|
|
cfecdae970 | ||
|
|
59ade6cf09 | ||
|
|
642842888a | ||
|
|
3ae51edf3a | ||
|
|
d8ccb81015 | ||
|
|
0db6020231 | ||
|
|
738c0a5c9c | ||
|
|
a2f7d3e241 | ||
|
|
9b86ded164 | ||
|
|
6cbb645b10 | ||
|
|
066a1d7591 | ||
|
|
5f82d575ee | ||
|
|
302ae0a83c | ||
|
|
82c4c791cc | ||
|
|
3c0310120d | ||
|
|
21c106e9d5 | ||
|
|
2c8cd2f8dc | ||
|
|
380d9908b4 | ||
|
|
6abef7d645 | ||
|
|
98ac25ac29 | ||
|
|
93bec04c92 | ||
|
|
136559cddd | ||
|
|
3f63a6ed70 | ||
|
|
2fcb3c4420 | ||
|
|
baaeb229cf | ||
|
|
a3bda3a941 | ||
|
|
3d536aa28d | ||
|
|
454267455b | ||
|
|
8e9adeb4b4 | ||
|
|
1f18e7beed | ||
|
|
b5e8e54107 | ||
|
|
f41e426b69 | ||
|
|
6375862a71 | ||
|
|
be2a745d78 | ||
|
|
d89feb2c75 | ||
|
|
b4a20c8fcb | ||
|
|
73087a92f4 | ||
|
|
2b58bd5bd8 | ||
|
|
bce0101278 | ||
|
|
bba418c79d | ||
|
|
cb58eb82fc | ||
|
|
3aafffabc1 | ||
|
|
66b9cdf64c | ||
|
|
d31fbf3b6f | ||
|
|
dbee30a412 | ||
|
|
f3cc881930 | ||
|
|
3d9c9e639d | ||
|
|
d6969d2c74 | ||
|
|
b7e28a73ba | ||
|
|
1e8206757d | ||
|
|
a0e94577fc | ||
|
|
a2a0c2f791 | ||
|
|
63a0fde121 | ||
|
|
c06152de07 | ||
|
|
0b3ccbda20 | ||
|
|
97b7eb0768 | ||
|
|
b712301804 | ||
|
|
76ebe3ff41 | ||
|
|
d988bb1821 | ||
|
|
64f1fbe400 | ||
|
|
c2c837329c | ||
|
|
b6531efe08 | ||
|
|
2c97a4aefe | ||
|
|
f0ffebd58c | ||
|
|
05e407f064 | ||
|
|
6dd2eec1b6 | ||
|
|
df13436688 | ||
|
|
fa0d89b6df | ||
|
|
ab0f8defa4 | ||
|
|
6b3329845b | ||
|
|
14fe35bba0 | ||
|
|
cb9d3414f2 | ||
|
|
677526cb16 | ||
|
|
08690b9d9e | ||
|
|
d3eb9c9d99 | ||
|
|
a0ef3a0e44 | ||
|
|
87c5ad79f4 | ||
|
|
2e210e7adc | ||
|
|
c56f4783c0 | ||
|
|
a1d351aa37 |
11
.gitignore
vendored
@@ -1,7 +1,10 @@
|
|||||||
##Packr, build stuff
|
##Packr, build stuff
|
||||||
|
|
||||||
|
logs/
|
||||||
/core/assets/mindustry-saves/
|
/core/assets/mindustry-saves/
|
||||||
/core/assets/mindustry-maps/
|
/core/assets/mindustry-maps/
|
||||||
|
/core/assets/bundles/output/
|
||||||
|
/core/assets/.gifimages/
|
||||||
/deploy/
|
/deploy/
|
||||||
/desktop/packr-out/
|
/desktop/packr-out/
|
||||||
/desktop/packr-export/
|
/desktop/packr-export/
|
||||||
@@ -12,13 +15,19 @@
|
|||||||
/core/assets-raw/sprites/generated/
|
/core/assets-raw/sprites/generated/
|
||||||
/annotations/build/
|
/annotations/build/
|
||||||
/kryonet/build/
|
/kryonet/build/
|
||||||
/packer/build/
|
/tools/build/
|
||||||
|
/tests/build/
|
||||||
/server/build/
|
/server/build/
|
||||||
|
/test_files/
|
||||||
/annotations/build/
|
/annotations/build/
|
||||||
/android/assets/mindustry-maps/
|
/android/assets/mindustry-maps/
|
||||||
/android/assets/mindustry-saves/
|
/android/assets/mindustry-saves/
|
||||||
/core/assets/gifexport/
|
/core/assets/gifexport/
|
||||||
/core/assets/version.properties
|
/core/assets/version.properties
|
||||||
|
/core/assets/locales
|
||||||
|
/ios/src/io/anuke/mindustry/gen/
|
||||||
|
/core/src/io/anuke/mindustry/gen/
|
||||||
|
ios/robovm.properties
|
||||||
*.gif
|
*.gif
|
||||||
|
|
||||||
version.properties
|
version.properties
|
||||||
|
|||||||
33
.travis.yml
@@ -1,23 +1,20 @@
|
|||||||
language: android
|
|
||||||
|
|
||||||
jdk:
|
jdk:
|
||||||
- openjdk8
|
- openjdk8
|
||||||
|
|
||||||
android:
|
|
||||||
components:
|
|
||||||
- android-26
|
|
||||||
|
|
||||||
# Additional components
|
|
||||||
- extra-google-google_play_services
|
|
||||||
- extra-google-m2repository
|
|
||||||
- extra-android-m2repository
|
|
||||||
- addon-google_apis-google-26
|
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- ./gradlew desktop:dist
|
- "./gradlew test"
|
||||||
|
- "./gradlew desktop:dist -Pbuildversion=${TRAVIS_TAG:1}"
|
||||||
after_success:
|
- "./gradlew server:dist -Pbuildversion=${TRAVIS_TAG:1}"
|
||||||
- chmod +x upload-build.sh
|
|
||||||
- chmod +x cleanup_builds.sh
|
|
||||||
- ./upload-build.sh
|
|
||||||
|
|
||||||
|
deploy:
|
||||||
|
provider: releases
|
||||||
|
skip_cleanup: true
|
||||||
|
draft: false
|
||||||
|
api_key:
|
||||||
|
secure: Cv5wFtWt62/A24EvSEQvMow7gKPbZ3oATEFPuSghhB2TQz1dA40Zee3Qvk4LFlpLrhYo4K0ZSczCZRGpR+hCd8+Dpww52bheYEvWuh3ZQfvu/fXtEx2j5PwP1qMpmIgSxETV/gkD7l9FImdh0VzktYiAvQfmi0bEocG9/D4QwjFpNat7iwBdcMiw1MvAygpdIWRsjiw0RKlB2mWarmoHhQ7Gu7qlU3j50uaEvcrtmU0pBUPggNQwQRv32i9NPvNFxrqqlUjDLIS8JFea99zCkp8BwYqbEvBIMzd+Qip1/stLJJA3+cDUClbsDtg8rAVetzpOrdLEEBmqShFe5MDl2yEHcsgpN9CFsyTaUfvB3P3rVjizvycMm42IsUkXQiarm5xTQ/TIA8Rd8AHiSKuweNCg1Fd5SFaRtKy8JVLXuxyfUccmyje6hhz2L4lS2Wfj3mAG7sqZUCXhWP79EKdGkiPOjKv4CwXEKmuH3BMVqPlNUZJr9Eg3sV1FG0h2l+MVOOnR635qdUbb49sYojYxVruMLX0BH1c4ZCu230m8CUoWA1Em1QNI75ya7+9Y5T6AsgWDVpBvdUo9fWNbdp+VQ0GskFQsJD5wtnxbcbHeFiERAgGBm7z6qt9u9LrQpBH+dsW52ADvYsu3L4nQEa+sdMHwTTwmGY+iUvsxu0DqxGg=
|
||||||
|
file:
|
||||||
|
- "desktop/build/libs/desktop-release.jar"
|
||||||
|
- "server/build/libs/server-release.jar"
|
||||||
|
on:
|
||||||
|
repo: Anuken/Mindustry
|
||||||
|
tags: true
|
||||||
21
README.md
@@ -1,38 +1,39 @@
|
|||||||

|

|
||||||
|
|
||||||
[](https://travis-ci.org/Anuken/Mindustry)
|
[](https://travis-ci.org/Anuken/Mindustry)
|
||||||
[](https://waffle.io/Anuken/Mindustry)
|
[](https://discord.gg/mindustry)
|
||||||
|
|
||||||
A pixelated sandbox tower defense game made using [LibGDX](https://libgdx.badlogicgames.com/). Winner of the [GDL Metal Monstrosity Jam](https://itch.io/jam/gdl---metal-monstrosity-jam).
|
A pixelated sandbox tower defense game made using [LibGDX](https://libgdx.badlogicgames.com/). Winner of the [GDL Metal Monstrosity Jam](https://itch.io/jam/gdl---metal-monstrosity-jam).
|
||||||
|
|
||||||
_[Issue tracker](https://waffle.io/Anuken/Mindustry)_
|
|
||||||
_[Trello Board](https://trello.com/b/aE2tcUwF/mindustry-40-plans)_
|
_[Trello Board](https://trello.com/b/aE2tcUwF/mindustry-40-plans)_
|
||||||
_[Wiki](http://mindustry.wikia.com/wiki/Mindustry_Wiki)_
|
_[Wiki](http://mindustry.wikia.com/wiki/Mindustry_Wiki)_
|
||||||
_[Discord](https://discord.gg/r8BkXNd)_
|
_[Discord](https://discord.gg/r8BkXNd)_
|
||||||
|
|
||||||
### Building
|
### Building
|
||||||
|
|
||||||
Bleeding-edge live builds are generated automatically for every commit. You can see them [here](https://github.com/Anuken/Mindustry/wiki).
|
Bleeding-edge live builds are generated automatically for every commit. You can see them [here](https://jenkins.hellomouse.net/job/mindustry/).
|
||||||
|
|
||||||
If you'd rather compile on your own, follow these instructions.
|
If you'd rather compile on your own, follow these instructions.
|
||||||
First, make sure you have Java 8 and JDK 8 installed. Open a terminal in the root directory, and run the following commands:
|
First, make sure you have Java 8 and JDK 8 installed. Open a terminal in the root directory, and run the following commands:
|
||||||
|
|
||||||
|
#### Windows
|
||||||
|
|
||||||
**_Windows_**
|
_Running:_ `gradlew desktop:run`
|
||||||
|
_Building:_ `gradlew desktop:dist`
|
||||||
|
|
||||||
_Running:_ `gradlew.bat desktop:run`
|
#### Linux
|
||||||
_Building:_ `gradlew.bat desktop:dist`
|
|
||||||
|
|
||||||
|
|
||||||
**_Linux_**
|
|
||||||
|
|
||||||
_Running:_ `./gradlew desktop:run`
|
_Running:_ `./gradlew desktop:run`
|
||||||
_Building:_ `./gradlew desktop:dist`
|
_Building:_ `./gradlew desktop:dist`
|
||||||
|
|
||||||
|
#### For Server Builds...
|
||||||
|
|
||||||
|
Server builds are bundled with each released build (in Releases). If you'd rather compile on your own, replace 'desktop' with 'server' i.e. `gradlew server:dist`.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
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 the output JAR file should be in `/desktop/build/libs/desktop-release.jar.`
|
After building, the output .JAR file should be in `/desktop/build/libs/desktop-release.jar` for desktop builds, and in `/server/build/libs/server-release.jar` for server builds.
|
||||||
|
|
||||||
### Downloads
|
### Downloads
|
||||||
|
|
||||||
|
|||||||
39
TRANSLATING.md
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
## 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/).
|
||||||
|
|
||||||
|
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,
|
||||||
|
head over to the translation bundle folder and check the [list of bundles](https://github.com/Anuken/Mindustry/tree/master/core/assets/bundles) that have already been created.
|
||||||
|
You're looking for a file called "`bundle_`(insert locale code here)`.properties`". If you don't find one, create one manually (more info below).
|
||||||
|
|
||||||
|
#### Editing an existing translation
|
||||||
|
|
||||||
|
If a translation bundle already exists, that means someone has already started working on a translation. To edit it or translate text, simply click the file and press the edit (pencil) button in the top right. Once you're done editing, press the green "propose file change" button at the bottom, then "create pull request" (twice).
|
||||||
|
Once this is done, all you need to do is wait for me to approve your changes.
|
||||||
|
|
||||||
|
#### Creating a new translation bundle
|
||||||
|
|
||||||
|
If a translation bundle for your language *doesn't* exist, you need to create one yourself.
|
||||||
|
In the folder with all the bundles in it, click the *'create new file'* button, and name it `bundle_(locale code here).properties`.
|
||||||
|
Then, copy-paste the entire contents of the [English translation bundle](https://raw.githubusercontent.com/Anuken/Mindustry/master/core/assets/bundles/bundle.properties) into the file, and translate all the necessary text to your language.
|
||||||
|
Once you are done, press the *propose new file* button at the bottom, then 'create pull request' twice.
|
||||||
|
|
||||||
|
#### Useful Information
|
||||||
|
|
||||||
|
- When you see text surrounded by square brackets, such as `[RED]`, `[]` or `[accent]`, this indicates a color code. Don't translate it.
|
||||||
|
- `{0}` means an argument that will be replaced when the text is displayed. For example, `Wave: {0}` will replace the `{0}` with whatever wave you are in.
|
||||||
|
- Empty lines are fine, and it doesn't matter in what order you place the text.
|
||||||
|
- `\n` means "new line". If you want to split text into multiple lines, use `\n` to do it.
|
||||||
|
|
||||||
|
#### Testing your translation bundle
|
||||||
|
|
||||||
|
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.*
|
||||||
|
2) For advanced users: simply download your fork of mindustry and compile/run the game.
|
||||||
|
|
||||||
|
**And that's it.**
|
||||||
|
|
||||||
|
*(...of course, that's never really it. Bother me on Discord when something inevitably goes wrong.)*
|
||||||
@@ -20,8 +20,8 @@
|
|||||||
<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="sensor"
|
android:screenOrientation="user"
|
||||||
android:configChanges="keyboard|keyboardHidden|orientation|screenSize">
|
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" />
|
||||||
|
|||||||
@@ -1,3 +1,16 @@
|
|||||||
|
buildscript {
|
||||||
|
repositories {
|
||||||
|
mavenLocal()
|
||||||
|
mavenCentral()
|
||||||
|
google()
|
||||||
|
maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
|
||||||
|
jcenter()
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
classpath 'com.android.tools.build:gradle:3.2.1'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
apply plugin: "com.android.application"
|
apply plugin: "com.android.application"
|
||||||
|
|
||||||
@@ -14,9 +27,9 @@ repositories {
|
|||||||
dependencies {
|
dependencies {
|
||||||
implementation project(":core")
|
implementation project(":core")
|
||||||
implementation project(":kryonet")
|
implementation project(":kryonet")
|
||||||
implementation 'com.android.support:support-v4:25.3.1'
|
implementation 'com.android.support:support-v4:28.0.0'
|
||||||
implementation 'org.sufficientlysecure:donations:2.5'
|
implementation 'org.sufficientlysecure:donations:2.5'
|
||||||
implementation 'com.google.android.gms:play-services-auth:11.8.0'
|
implementation 'com.google.android.gms:play-services-auth:16.0.1'
|
||||||
|
|
||||||
implementation "com.badlogicgames.gdx:gdx-backend-android:$gdxVersion"
|
implementation "com.badlogicgames.gdx:gdx-backend-android:$gdxVersion"
|
||||||
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi"
|
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi"
|
||||||
@@ -24,7 +37,12 @@ dependencies {
|
|||||||
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-arm64-v8a"
|
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-arm64-v8a"
|
||||||
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86"
|
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86"
|
||||||
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86_64"
|
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86_64"
|
||||||
implementation "com.badlogicgames.gdx:gdx-ai:$aiVersion"
|
implementation "com.badlogicgames.gdx:gdx-freetype:$gdxVersion"
|
||||||
|
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi"
|
||||||
|
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-armeabi-v7a"
|
||||||
|
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-arm64-v8a"
|
||||||
|
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-x86"
|
||||||
|
natives "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-x86_64"
|
||||||
implementation "com.badlogicgames.gdx:gdx-controllers-android:$gdxVersion"
|
implementation "com.badlogicgames.gdx:gdx-controllers-android:$gdxVersion"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -32,13 +50,13 @@ task deploy(type: Copy){
|
|||||||
dependsOn "assembleRelease"
|
dependsOn "assembleRelease"
|
||||||
|
|
||||||
from "build/outputs/apk/google/release/android-google-release.apk"
|
from "build/outputs/apk/google/release/android-google-release.apk"
|
||||||
into "../deploy/";
|
into "../deploy/"
|
||||||
rename ("android-google-release.apk", appName + "-android-" + getVersionString() + ".apk");
|
rename ("android-google-release.apk", appName + "-android-" + getVersionString() + ".apk")
|
||||||
}
|
}
|
||||||
|
|
||||||
android {
|
android {
|
||||||
buildToolsVersion '27.0.3'
|
buildToolsVersion '28.0.3'
|
||||||
compileSdkVersion 27
|
compileSdkVersion 28
|
||||||
sourceSets {
|
sourceSets {
|
||||||
main {
|
main {
|
||||||
manifest.srcFile 'AndroidManifest.xml'
|
manifest.srcFile 'AndroidManifest.xml'
|
||||||
@@ -75,7 +93,7 @@ android {
|
|||||||
|
|
||||||
applicationId "io.anuke.mindustry"
|
applicationId "io.anuke.mindustry"
|
||||||
minSdkVersion 14
|
minSdkVersion 14
|
||||||
targetSdkVersion 27
|
targetSdkVersion 28
|
||||||
versionCode code
|
versionCode code
|
||||||
versionName versionNameResult
|
versionName versionNameResult
|
||||||
}
|
}
|
||||||
@@ -101,7 +119,7 @@ android {
|
|||||||
keyAlias RELEASE_KEY_ALIAS
|
keyAlias RELEASE_KEY_ALIAS
|
||||||
keyPassword RELEASE_KEY_PASSWORD
|
keyPassword RELEASE_KEY_PASSWORD
|
||||||
}else{
|
}else{
|
||||||
println("No keystore info property found!");
|
println("No keystore info property found!")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -116,11 +134,11 @@ android {
|
|||||||
// 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
|
||||||
@@ -138,6 +156,7 @@ 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")
|
||||||
@@ -159,47 +178,18 @@ task run(type: Exec) {
|
|||||||
def adb = path + "/platform-tools/adb"
|
def adb = path + "/platform-tools/adb"
|
||||||
commandLine "$adb", 'shell', 'am', 'start', '-n', 'io.anuke.mindustry/io.anuke.mindustry.AndroidLauncher'
|
commandLine "$adb", 'shell', 'am', 'start', '-n', 'io.anuke.mindustry/io.anuke.mindustry.AndroidLauncher'
|
||||||
}
|
}
|
||||||
// sets up the Android Eclipse project, using the old Ant based build.
|
|
||||||
eclipse {
|
|
||||||
// need to specify Java source sets explicitly, SpringSource Gradle Eclipse plugin
|
|
||||||
// ignores any nodes added in classpath.file.withXml
|
|
||||||
sourceSets {
|
|
||||||
main {
|
|
||||||
java.srcDirs "src", 'gen'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
jdt {
|
|
||||||
sourceCompatibility = 1.7
|
|
||||||
targetCompatibility = 1.7
|
|
||||||
}
|
|
||||||
|
|
||||||
classpath {
|
|
||||||
plusConfigurations += [project.configurations.compile]
|
|
||||||
containers 'com.android.ide.eclipse.adt.ANDROID_FRAMEWORK', 'com.android.ide.eclipse.adt.LIBRARIES'
|
|
||||||
}
|
|
||||||
|
|
||||||
project {
|
|
||||||
name = appName + "-android"
|
|
||||||
natures 'com.android.ide.eclipse.adt.AndroidNature'
|
|
||||||
buildCommands.clear();
|
|
||||||
buildCommand "com.android.ide.eclipse.adt.ResourceManagerBuilder"
|
|
||||||
buildCommand "com.android.ide.eclipse.adt.PreCompilerBuilder"
|
|
||||||
buildCommand "org.eclipse.jdt.core.javabuilder"
|
|
||||||
buildCommand "com.android.ide.eclipse.adt.ApkBuilder"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// sets up the Android Idea project, using the old Ant based build.
|
// sets up the Android Idea project, using the old Ant based build.
|
||||||
idea {
|
idea {
|
||||||
module {
|
module {
|
||||||
sourceDirs += file("src");
|
sourceDirs += file("src")
|
||||||
scopes = [COMPILE: [plus: [project.configurations.compile]]]
|
scopes = [COMPILE: [plus: [project.configurations.compile]]]
|
||||||
|
|
||||||
iml {
|
iml {
|
||||||
withXml {
|
withXml {
|
||||||
def node = it.asNode()
|
def node = it.asNode()
|
||||||
def builder = NodeBuilder.newInstance();
|
def builder = NodeBuilder.newInstance()
|
||||||
builder.current = node;
|
builder.current = node
|
||||||
builder.component(name: "FacetManager") {
|
builder.component(name: "FacetManager") {
|
||||||
facet(type: "android", name: "Android") {
|
facet(type: "android", name: "Android") {
|
||||||
configuration {
|
configuration {
|
||||||
|
|||||||
@@ -1,22 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:id="@+id/layout_root"
|
|
||||||
android:layout_width="fill_parent"
|
|
||||||
android:layout_height="fill_parent"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:padding="10dp" >
|
|
||||||
|
|
||||||
<EditText
|
|
||||||
android:id="@+id/gdxDialogsEditTextInput"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:inputType="text"
|
|
||||||
android:maxLines="1"
|
|
||||||
android:maxLength="15"
|
|
||||||
>
|
|
||||||
|
|
||||||
<requestFocus />
|
|
||||||
|
|
||||||
</EditText>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
15
android/res/values-ko/strings.xml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
|
||||||
|
<string name="app_name">Mindustry</string>
|
||||||
|
<string-array name="donation_google_catalog_values">
|
||||||
|
<item>1 달러</item>
|
||||||
|
<item>2 달러</item>
|
||||||
|
<item>5 달러</item>
|
||||||
|
<item>10 달러</item>
|
||||||
|
<item>15 달러</item>
|
||||||
|
<item>25 달러</item>
|
||||||
|
<item>50 달러</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
|
</resources>
|
||||||
15
android/res/values-ru/strings.xml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
|
||||||
|
<string name="app_name">Mindustry</string>
|
||||||
|
<string-array name="donation_google_catalog_values">
|
||||||
|
<item>1 Доллар</item>
|
||||||
|
<item>2 Доллара</item>
|
||||||
|
<item>5 Доллара</item>
|
||||||
|
<item>10 Долларов</item>
|
||||||
|
<item>15 Долларов</item>
|
||||||
|
<item>25 Долларов</item>
|
||||||
|
<item>50 Долларов</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
|
</resources>
|
||||||
@@ -12,7 +12,6 @@ import android.provider.Settings.Secure;
|
|||||||
import android.telephony.TelephonyManager;
|
import android.telephony.TelephonyManager;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import com.badlogic.gdx.Gdx;
|
import com.badlogic.gdx.Gdx;
|
||||||
import com.badlogic.gdx.backends.android.AndroidApplication;
|
|
||||||
import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration;
|
import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration;
|
||||||
import com.badlogic.gdx.files.FileHandle;
|
import com.badlogic.gdx.files.FileHandle;
|
||||||
import com.badlogic.gdx.utils.Base64Coder;
|
import com.badlogic.gdx.utils.Base64Coder;
|
||||||
@@ -20,17 +19,14 @@ import com.google.android.gms.common.GoogleApiAvailability;
|
|||||||
import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
|
import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
|
||||||
import com.google.android.gms.common.GooglePlayServicesRepairableException;
|
import com.google.android.gms.common.GooglePlayServicesRepairableException;
|
||||||
import com.google.android.gms.security.ProviderInstaller;
|
import com.google.android.gms.security.ProviderInstaller;
|
||||||
import io.anuke.kryonet.DefaultThreadImpl;
|
|
||||||
import io.anuke.kryonet.KryoClient;
|
import io.anuke.kryonet.KryoClient;
|
||||||
import io.anuke.kryonet.KryoServer;
|
import io.anuke.kryonet.KryoServer;
|
||||||
import io.anuke.mindustry.core.Platform;
|
import io.anuke.mindustry.core.Platform;
|
||||||
import io.anuke.mindustry.core.ThreadHandler.ThreadProvider;
|
import io.anuke.mindustry.game.Saves.SaveSlot;
|
||||||
import io.anuke.mindustry.io.SaveIO;
|
import io.anuke.mindustry.io.SaveIO;
|
||||||
import io.anuke.mindustry.io.Saves.SaveSlot;
|
|
||||||
import io.anuke.mindustry.net.Net;
|
import io.anuke.mindustry.net.Net;
|
||||||
import io.anuke.mindustry.ui.dialogs.FileChooser;
|
import io.anuke.mindustry.ui.dialogs.FileChooser;
|
||||||
import io.anuke.ucore.function.Consumer;
|
import io.anuke.ucore.function.Consumer;
|
||||||
import io.anuke.ucore.scene.ui.TextField;
|
|
||||||
import io.anuke.ucore.scene.ui.layout.Unit;
|
import io.anuke.ucore.scene.ui.layout.Unit;
|
||||||
import io.anuke.ucore.util.Bundles;
|
import io.anuke.ucore.util.Bundles;
|
||||||
import io.anuke.ucore.util.Strings;
|
import io.anuke.ucore.util.Strings;
|
||||||
@@ -39,88 +35,39 @@ import java.io.File;
|
|||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.text.DateFormat;
|
|
||||||
import java.text.NumberFormat;
|
|
||||||
import java.text.SimpleDateFormat;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
|
||||||
import java.util.Locale;
|
|
||||||
|
|
||||||
import static io.anuke.mindustry.Vars.*;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
|
|
||||||
public class AndroidLauncher extends AndroidApplication{
|
public class AndroidLauncher extends PatchedAndroidApplication{
|
||||||
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;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState){
|
protected void onCreate(Bundle savedInstanceState){
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
|
AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
|
||||||
config.useImmersiveMode = true;
|
config.useImmersiveMode = true;
|
||||||
|
|
||||||
Platform.instance = new Platform(){
|
Platform.instance = new Platform(){
|
||||||
DateFormat format = SimpleDateFormat.getDateTimeInstance();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean hasDiscord() {
|
|
||||||
return isPackageInstalled("com.discord");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String format(Date date){
|
|
||||||
return format.format(date);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String format(int number){
|
|
||||||
return NumberFormat.getIntegerInstance().format(number);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void addDialog(TextField field, int length){
|
|
||||||
TextFieldDialogListener.add(field, 0, length);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getLocaleName(Locale locale){
|
|
||||||
return locale.getDisplayName(locale);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void openDonations(){
|
public void openDonations(){
|
||||||
showDonations();
|
showDonations();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public ThreadProvider getThreadProvider() {
|
|
||||||
return new DefaultThreadImpl();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isDebug() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getUUID(){
|
public String getUUID(){
|
||||||
try{
|
try{
|
||||||
String s = Secure.getString(getContext().getContentResolver(),
|
String s = Secure.getString(getContext().getContentResolver(), Secure.ANDROID_ID);
|
||||||
Secure.ANDROID_ID);
|
|
||||||
|
|
||||||
int len = s.length();
|
int len = s.length();
|
||||||
byte[] data = new byte[len / 2];
|
byte[] data = new byte[len / 2];
|
||||||
for(int i = 0; i < len; i += 2){
|
for(int i = 0; i < len; i += 2){
|
||||||
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
|
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
|
||||||
+ Character.digit(s.charAt(i + 1), 16));
|
+ Character.digit(s.charAt(i + 1), 16));
|
||||||
}
|
}
|
||||||
|
|
||||||
String result = new String(Base64Coder.encode(data));
|
String result = new String(Base64Coder.encode(data));
|
||||||
|
|
||||||
if(result.equals("AAAAAAAAAOA=")) throw new RuntimeException("Bad UUID.");
|
if(result.equals("AAAAAAAAAOA=")) throw new RuntimeException("Bad UUID.");
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
return super.getUUID();
|
return super.getUUID();
|
||||||
@@ -129,28 +76,23 @@ public class AndroidLauncher extends AndroidApplication{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void shareFile(FileHandle file){
|
public void shareFile(FileHandle file){
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void showFileChooser(String text, String content, Consumer<FileHandle> cons, boolean open, String filetype){
|
public void showFileChooser(String text, String content, Consumer<FileHandle> cons, boolean open, String filetype){
|
||||||
chooser = new FileChooser(text, file -> file.extension().equalsIgnoreCase(filetype), open, cons);
|
chooser = new FileChooser(text, file -> file.extension().equalsIgnoreCase(filetype), open, cons);
|
||||||
|
|
||||||
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M || (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
|
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M || (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
|
||||||
checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)){
|
checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)){
|
||||||
chooser.show();
|
chooser.show();
|
||||||
chooser = null;
|
chooser = null;
|
||||||
}else{
|
}else{
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
|
if(checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
|
||||||
perms.add(Manifest.permission.READ_EXTERNAL_STORAGE);
|
perms.add(Manifest.permission.READ_EXTERNAL_STORAGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
requestPermissions(perms.toArray(new String[perms.size()]), PERMISSION_REQUEST_CODE);
|
requestPermissions(perms.toArray(new String[perms.size()]), PERMISSION_REQUEST_CODE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -179,18 +121,13 @@ public class AndroidLauncher extends AndroidApplication{
|
|||||||
}catch(GooglePlayServicesNotAvailableException e){
|
}catch(GooglePlayServicesNotAvailableException e){
|
||||||
Log.e("SecurityException", "Google Play Services not available.");
|
Log.e("SecurityException", "Google Play Services not available.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(doubleScaleTablets && isTablet(this.getContext())){
|
if(doubleScaleTablets && isTablet(this.getContext())){
|
||||||
Unit.dp.addition = 0.5f;
|
Unit.dp.addition = 0.5f;
|
||||||
}
|
}
|
||||||
|
|
||||||
config.hideStatusBar = true;
|
config.hideStatusBar = true;
|
||||||
|
|
||||||
Net.setClientProvider(new KryoClient());
|
Net.setClientProvider(new KryoClient());
|
||||||
Net.setServerProvider(new KryoServer());
|
Net.setServerProvider(new KryoServer());
|
||||||
|
|
||||||
initialize(new Mindustry(), config);
|
initialize(new Mindustry(), config);
|
||||||
|
|
||||||
checkFiles(getIntent());
|
checkFiles(getIntent());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -200,7 +137,6 @@ public class AndroidLauncher extends AndroidApplication{
|
|||||||
for(int i : grantResults){
|
for(int i : grantResults){
|
||||||
if(i != PackageManager.PERMISSION_GRANTED) return;
|
if(i != PackageManager.PERMISSION_GRANTED) return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(chooser != null){
|
if(chooser != null){
|
||||||
chooser.show();
|
chooser.show();
|
||||||
}
|
}
|
||||||
@@ -220,24 +156,19 @@ public class AndroidLauncher extends AndroidApplication{
|
|||||||
//error
|
//error
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean save = uri.getPath().endsWith(saveExtension);
|
boolean save = uri.getPath().endsWith(saveExtension);
|
||||||
boolean map = uri.getPath().endsWith(mapExtension);
|
boolean map = uri.getPath().endsWith(mapExtension);
|
||||||
|
|
||||||
InputStream inStream;
|
InputStream inStream;
|
||||||
if(myFile != null) inStream = new FileInputStream(myFile);
|
if(myFile != null) inStream = new FileInputStream(myFile);
|
||||||
else inStream = getContentResolver().openInputStream(uri);
|
else inStream = getContentResolver().openInputStream(uri);
|
||||||
|
|
||||||
Gdx.app.postRunnable(() -> {
|
Gdx.app.postRunnable(() -> {
|
||||||
|
|
||||||
if(save){ //open save
|
if(save){ //open save
|
||||||
System.out.println("Opening save.");
|
System.out.println("Opening save.");
|
||||||
FileHandle file = Gdx.files.local("temp-save." + saveExtension);
|
FileHandle file = Gdx.files.local("temp-save." + saveExtension);
|
||||||
file.write(inStream, false);
|
file.write(inStream, false);
|
||||||
|
|
||||||
if(SaveIO.isSaveValid(file)){
|
if(SaveIO.isSaveValid(file)){
|
||||||
try{
|
try{
|
||||||
SaveSlot slot = control.getSaves().importSave(file);
|
SaveSlot slot = control.saves.importSave(file);
|
||||||
ui.load.runLoadSave(slot);
|
ui.load.runLoadSave(slot);
|
||||||
}catch(IOException e){
|
}catch(IOException e){
|
||||||
ui.showError(Bundles.format("text.save.import.fail", Strings.parseException(e, false)));
|
ui.showError(Bundles.format("text.save.import.fail", Strings.parseException(e, false)));
|
||||||
@@ -245,20 +176,17 @@ public class AndroidLauncher extends AndroidApplication{
|
|||||||
}else{
|
}else{
|
||||||
ui.showError("$text.save.import.invalid");
|
ui.showError("$text.save.import.invalid");
|
||||||
}
|
}
|
||||||
|
|
||||||
}else if(map){ //open map
|
}else if(map){ //open map
|
||||||
Gdx.app.postRunnable(() -> {
|
Gdx.app.postRunnable(() -> {
|
||||||
System.out.println("Opening map.");
|
System.out.println("Opening map.");
|
||||||
if(!ui.editor.isShown()){
|
if(!ui.editor.isShown()){
|
||||||
ui.editor.show();
|
ui.editor.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
ui.editor.beginEditMap(inStream);
|
ui.editor.beginEditMap(inStream);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
}catch(IOException e){
|
}catch(IOException e){
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,118 +0,0 @@
|
|||||||
package io.anuke.mindustry;
|
|
||||||
|
|
||||||
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.app.AlertDialog;
|
|
||||||
import android.text.InputFilter;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.WindowManager.LayoutParams;
|
|
||||||
import android.widget.EditText;
|
|
||||||
import com.badlogic.gdx.Gdx;
|
|
||||||
|
|
||||||
public class AndroidTextFieldDialog{
|
|
||||||
private Activity activity;
|
|
||||||
private EditText userInput;
|
|
||||||
private AlertDialog.Builder builder;
|
|
||||||
private TextPromptListener listener;
|
|
||||||
private boolean isBuild;
|
|
||||||
|
|
||||||
public AndroidTextFieldDialog() {
|
|
||||||
this.activity = (Activity)Gdx.app;
|
|
||||||
load();
|
|
||||||
}
|
|
||||||
|
|
||||||
public AndroidTextFieldDialog show() {
|
|
||||||
|
|
||||||
activity.runOnUiThread(() -> {
|
|
||||||
AlertDialog dialog = builder.create();
|
|
||||||
|
|
||||||
dialog.getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE);
|
|
||||||
|
|
||||||
dialog.show();
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
private AndroidTextFieldDialog load() {
|
|
||||||
|
|
||||||
activity.runOnUiThread(() -> {
|
|
||||||
|
|
||||||
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(activity);
|
|
||||||
LayoutInflater li = LayoutInflater.from(activity);
|
|
||||||
|
|
||||||
View promptsView = li.inflate(getResourceId("gdxdialogs_inputtext", "layout"), null);
|
|
||||||
|
|
||||||
alertDialogBuilder.setView(promptsView);
|
|
||||||
|
|
||||||
userInput = promptsView.findViewById(getResourceId("gdxDialogsEditTextInput", "id"));
|
|
||||||
|
|
||||||
alertDialogBuilder.setCancelable(false);
|
|
||||||
builder = alertDialogBuilder;
|
|
||||||
|
|
||||||
isBuild = true;
|
|
||||||
});
|
|
||||||
|
|
||||||
// Wait till TextPrompt is built.
|
|
||||||
while (!isBuild) {
|
|
||||||
try {
|
|
||||||
Thread.sleep(10);
|
|
||||||
} catch (InterruptedException e) { }
|
|
||||||
}
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getResourceId(String pVariableName, String pVariableType) {
|
|
||||||
try {
|
|
||||||
return activity.getResources().getIdentifier(pVariableName, pVariableType, activity.getPackageName());
|
|
||||||
} catch (Exception e) {
|
|
||||||
Gdx.app.error("Android Dialogs", "Cannot find resouce with name: " + pVariableName
|
|
||||||
+ " Did you copy the layouts to /res/layouts and /res/layouts_v14 ?");
|
|
||||||
e.printStackTrace();
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public AndroidTextFieldDialog setText(CharSequence value) {
|
|
||||||
userInput.append(value);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public AndroidTextFieldDialog setCancelButtonLabel(CharSequence label) {
|
|
||||||
builder.setNegativeButton(label, (dialog, id) -> dialog.cancel());
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public AndroidTextFieldDialog setConfirmButtonLabel(CharSequence label) {
|
|
||||||
builder.setPositiveButton(label, (dialog, id) -> {
|
|
||||||
if (listener != null && !userInput.getText().toString().isEmpty()) {
|
|
||||||
listener.confirm(userInput.getText().toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public AndroidTextFieldDialog setTextPromptListener(TextPromptListener listener) {
|
|
||||||
this.listener = listener;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public AndroidTextFieldDialog setInputType(int type) {
|
|
||||||
userInput.setInputType(type);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public AndroidTextFieldDialog setMaxLength(int length) {
|
|
||||||
userInput.setFilters(new InputFilter[] { new InputFilter.LengthFilter(length) });
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface TextPromptListener{
|
|
||||||
void confirm(String text);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -8,12 +8,9 @@ import android.support.v4.app.FragmentManager;
|
|||||||
import android.support.v4.app.FragmentTransaction;
|
import android.support.v4.app.FragmentTransaction;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
|
|
||||||
import org.sufficientlysecure.donations.DonationsFragment;
|
import org.sufficientlysecure.donations.DonationsFragment;
|
||||||
|
|
||||||
public class DonationsActivity extends FragmentActivity{
|
public class DonationsActivity extends FragmentActivity{
|
||||||
DonationsFragment donationsFragment;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Google
|
* Google
|
||||||
*/
|
*/
|
||||||
@@ -22,6 +19,7 @@ public class DonationsActivity extends FragmentActivity {
|
|||||||
"mindustry.donation.1", "mindustry.donation.2", "mindustry.donation.5",
|
"mindustry.donation.1", "mindustry.donation.2", "mindustry.donation.5",
|
||||||
"mindustry.donation.10", "mindustry.donation.15",
|
"mindustry.donation.10", "mindustry.donation.15",
|
||||||
"mindustry.donation.25", "mindustry.donation.50"};
|
"mindustry.donation.25", "mindustry.donation.50"};
|
||||||
|
DonationsFragment donationsFragment;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when the activity is first created.
|
* Called when the activity is first created.
|
||||||
@@ -48,17 +46,14 @@ public class DonationsActivity extends FragmentActivity {
|
|||||||
|
|
||||||
public void onStart(){
|
public void onStart(){
|
||||||
super.onStart();
|
super.onStart();
|
||||||
Button b = ((Button)findViewById(org.sufficientlysecure.donations.R.id.donations__google_android_market_donate_button));
|
Button b = findViewById(org.sufficientlysecure.donations.R.id.donations__google_android_market_donate_button);
|
||||||
b.setOnClickListener(new View.OnClickListener() {
|
b.setOnClickListener(view -> {
|
||||||
@Override public void onClick(View view) {
|
|
||||||
donationsFragment.donateGoogleOnClick(donationsFragment.getView());
|
donationsFragment.donateGoogleOnClick(donationsFragment.getView());
|
||||||
b.setEnabled(false);
|
b.setEnabled(false);
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Needed for Google Play In-app Billing. It uses startIntentSenderForResult(). The result is not propagated to
|
* Needed for Google Play In-app Billing. It uses startIntentSenderForResult(). The result is not propagated to
|
||||||
* the Fragment like in startActivityForResult(). Thus we need to propagate manually to our Fragment.
|
* the Fragment like in startActivityForResult(). Thus we need to propagate manually to our Fragment.
|
||||||
@@ -66,14 +61,13 @@ public class DonationsActivity extends FragmentActivity {
|
|||||||
@Override
|
@Override
|
||||||
protected void onActivityResult(int requestCode, int resultCode, Intent data){
|
protected void onActivityResult(int requestCode, int resultCode, Intent data){
|
||||||
super.onActivityResult(requestCode, resultCode, data);
|
super.onActivityResult(requestCode, resultCode, data);
|
||||||
Button b = ((Button)findViewById(org.sufficientlysecure.donations.R.id.donations__google_android_market_donate_button));
|
Button b = findViewById(org.sufficientlysecure.donations.R.id.donations__google_android_market_donate_button);
|
||||||
b.setEnabled(true);
|
b.setEnabled(true);
|
||||||
|
|
||||||
FragmentManager fragmentManager = getSupportFragmentManager();
|
FragmentManager fragmentManager = getSupportFragmentManager();
|
||||||
Fragment fragment = fragmentManager.findFragmentByTag("donationsFragment");
|
Fragment fragment = fragmentManager.findFragmentByTag("donationsFragment");
|
||||||
if(fragment != null){
|
if(fragment != null){
|
||||||
fragment.onActivityResult(requestCode, resultCode, data);
|
fragment.onActivityResult(requestCode, resultCode, data);
|
||||||
//TODO donation event, set settings?
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
package io.anuke.mindustry;
|
||||||
|
|
||||||
|
import com.badlogic.gdx.backends.android.AndroidApplication;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
|
||||||
|
public class PatchedAndroidApplication extends AndroidApplication {
|
||||||
|
private final ExecutorService exec = Executors.newSingleThreadExecutor();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPause () {
|
||||||
|
if(useImmersiveMode) {
|
||||||
|
exec.submit(() -> {
|
||||||
|
try {Thread.sleep(100);} catch (InterruptedException ignored) {}
|
||||||
|
graphics.onDrawFrame(null);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
super.onPause();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
package io.anuke.mindustry;
|
|
||||||
|
|
||||||
|
|
||||||
import android.text.InputType;
|
|
||||||
import com.badlogic.gdx.Application.ApplicationType;
|
|
||||||
import com.badlogic.gdx.Gdx;
|
|
||||||
import io.anuke.ucore.scene.event.ChangeListener;
|
|
||||||
import io.anuke.ucore.scene.event.ClickListener;
|
|
||||||
import io.anuke.ucore.scene.event.InputEvent;
|
|
||||||
import io.anuke.ucore.scene.event.InputListener;
|
|
||||||
import io.anuke.ucore.scene.ui.TextField;
|
|
||||||
|
|
||||||
public class TextFieldDialogListener extends ClickListener{
|
|
||||||
private TextField field;
|
|
||||||
private int type;
|
|
||||||
private int max;
|
|
||||||
|
|
||||||
public static void add(TextField field, int type, int max){
|
|
||||||
field.addListener(new TextFieldDialogListener(field, type, max));
|
|
||||||
field.addListener(new InputListener(){
|
|
||||||
public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
|
|
||||||
Gdx.input.setOnscreenKeyboardVisible(false);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void add(TextField field){
|
|
||||||
add(field, 0, 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
//type - 0 is text, 1 is numbers, 2 is decimals
|
|
||||||
public TextFieldDialogListener(TextField field, int type, int max){
|
|
||||||
this.field = field;
|
|
||||||
this.type = type;
|
|
||||||
this.max = max;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void clicked(final InputEvent event, float x, float y){
|
|
||||||
|
|
||||||
if(Gdx.app.getType() == ApplicationType.Desktop) return;
|
|
||||||
|
|
||||||
AndroidTextFieldDialog dialog = new AndroidTextFieldDialog();
|
|
||||||
|
|
||||||
dialog.setTextPromptListener(text -> {
|
|
||||||
field.clearText();
|
|
||||||
field.appendText(text);
|
|
||||||
field.fire(new ChangeListener.ChangeEvent());
|
|
||||||
Gdx.graphics.requestRendering();
|
|
||||||
});
|
|
||||||
|
|
||||||
if(type == 0){
|
|
||||||
dialog.setInputType(InputType.TYPE_CLASS_TEXT);
|
|
||||||
}else if(type == 1){
|
|
||||||
dialog.setInputType(InputType.TYPE_CLASS_NUMBER);
|
|
||||||
}else if(type == 2){
|
|
||||||
dialog.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
dialog.setConfirmButtonLabel("OK").setText(field.getText());
|
|
||||||
dialog.setCancelButtonLabel("Cancel");
|
|
||||||
dialog.setMaxLength(max);
|
|
||||||
dialog.show();
|
|
||||||
event.cancel();
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,6 @@
|
|||||||
apply plugin: "java"
|
apply plugin: "java"
|
||||||
|
|
||||||
sourceCompatibility = 1.8
|
sourceCompatibility = 1.8
|
||||||
sourceSets.main.java.srcDirs = [ "src/" ]
|
sourceSets.main.java.srcDirs = [ "src/main/java/" ]
|
||||||
|
sourceSets.main.resources.srcDirs = [ "src/main/resources/" ]
|
||||||
|
|
||||||
|
|||||||
@@ -1,99 +0,0 @@
|
|||||||
package io.anuke.annotations;
|
|
||||||
|
|
||||||
import java.lang.annotation.ElementType;
|
|
||||||
import java.lang.annotation.Retention;
|
|
||||||
import java.lang.annotation.RetentionPolicy;
|
|
||||||
import java.lang.annotation.Target;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Goal: To create a system to send events to the server from the client and vice versa, without creating a new packet type each time.<br>
|
|
||||||
* These events may optionally also trigger on the caller client/server as well.<br>
|
|
||||||
*/
|
|
||||||
public class Annotations {
|
|
||||||
|
|
||||||
/**Marks a method as invokable remotely across a server/client connection.*/
|
|
||||||
@Target(ElementType.METHOD)
|
|
||||||
@Retention(RetentionPolicy.CLASS)
|
|
||||||
public @interface Remote {
|
|
||||||
/**Specifies the locations from which this method can be invoked.*/
|
|
||||||
Loc targets() default Loc.server;
|
|
||||||
/**Specifies which methods are generated. Only affects server-to-client methods.*/
|
|
||||||
Variant variants() default Variant.all;
|
|
||||||
/**The local locations where this method is called locally, when invoked.*/
|
|
||||||
Loc called() default Loc.none;
|
|
||||||
/**Whether to forward this packet to all other clients upon recieval. Server only.*/
|
|
||||||
boolean forward() default false;
|
|
||||||
/**Whether the packet for this method is sent with UDP instead of TCP.
|
|
||||||
* UDP is faster, but is prone to packet loss and duplication.*/
|
|
||||||
boolean unreliable() default false;
|
|
||||||
/**The simple class name where this method is placed.*/
|
|
||||||
String in() default "Call";
|
|
||||||
/**Priority of this event.*/
|
|
||||||
PacketPriority priority() default PacketPriority.normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**Specifies that this method will be used to write classes of the type returned by {@link #value()}.<br>
|
|
||||||
* This method must return void and have two parameters, the first being of type {@link java.nio.ByteBuffer} and the second
|
|
||||||
* being the type returned by {@link #value()}.*/
|
|
||||||
@Target(ElementType.METHOD)
|
|
||||||
@Retention(RetentionPolicy.CLASS)
|
|
||||||
public @interface WriteClass {
|
|
||||||
Class<?> value();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**Specifies that this method will be used to read classes of the type returned by {@link #value()}. <br>
|
|
||||||
* This method must return the type returned by {@link #value()},
|
|
||||||
* and have one parameter, being of type {@link java.nio.ByteBuffer}.*/
|
|
||||||
@Target(ElementType.METHOD)
|
|
||||||
@Retention(RetentionPolicy.CLASS)
|
|
||||||
public @interface ReadClass {
|
|
||||||
Class<?> value();
|
|
||||||
}
|
|
||||||
|
|
||||||
public enum PacketPriority {
|
|
||||||
/**Gets put in a queue and processed if not connected.*/
|
|
||||||
normal,
|
|
||||||
/**Gets handled immediately, regardless of connection status.*/
|
|
||||||
high,
|
|
||||||
/**Does not get handled unless client is connected.*/
|
|
||||||
low
|
|
||||||
}
|
|
||||||
|
|
||||||
/**A set of two booleans, one specifying server and one specifying client.*/
|
|
||||||
public enum Loc {
|
|
||||||
/**Method can only be invoked on the client from the server.*/
|
|
||||||
server(true, false),
|
|
||||||
/**Method can only be invoked on the server from the client.*/
|
|
||||||
client(false, true),
|
|
||||||
/**Method can be invoked from anywhere*/
|
|
||||||
both(true, true),
|
|
||||||
/**Neither server no client.*/
|
|
||||||
none(false, false);
|
|
||||||
|
|
||||||
/**If true, this method can be invoked ON clients FROM servers.*/
|
|
||||||
public final boolean isServer;
|
|
||||||
/**If true, this method can be invoked ON servers FROM clients.*/
|
|
||||||
public final boolean isClient;
|
|
||||||
|
|
||||||
Loc(boolean server, boolean client){
|
|
||||||
this.isServer = server;
|
|
||||||
this.isClient = client;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public enum Variant {
|
|
||||||
/**Method can only be invoked targeting one player.*/
|
|
||||||
one(true, false),
|
|
||||||
/**Method can only be invoked targeting all players.*/
|
|
||||||
all(false, true),
|
|
||||||
/**Method targets both one player and all players.*/
|
|
||||||
both(true, true);
|
|
||||||
|
|
||||||
public final boolean isOne, isAll;
|
|
||||||
|
|
||||||
Variant(boolean isOne, boolean isAll){
|
|
||||||
this.isOne = isOne;
|
|
||||||
this.isAll = isAll;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
package io.anuke.annotations;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
/**Represents a class witha list method entries to include in it.*/
|
|
||||||
public class ClassEntry {
|
|
||||||
/**All methods in this generated class.*/
|
|
||||||
public final ArrayList<MethodEntry> methods = new ArrayList<>();
|
|
||||||
/**Simple class name.*/
|
|
||||||
public final String name;
|
|
||||||
|
|
||||||
public ClassEntry(String name) {
|
|
||||||
this.name = name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
111
annotations/src/main/java/io/anuke/annotations/Annotations.java
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
package io.anuke.annotations;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
public class Annotations{
|
||||||
|
|
||||||
|
/** Marks a class as serializable.*/
|
||||||
|
@Target(ElementType.TYPE)
|
||||||
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
|
public @interface Serialize{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum PacketPriority{
|
||||||
|
/** Gets put in a queue and processed if not connected. */
|
||||||
|
normal,
|
||||||
|
/** Gets handled immediately, regardless of connection status. */
|
||||||
|
high,
|
||||||
|
/** Does not get handled unless client is connected. */
|
||||||
|
low
|
||||||
|
}
|
||||||
|
|
||||||
|
/** A set of two booleans, one specifying server and one specifying client. */
|
||||||
|
public enum Loc{
|
||||||
|
/** Method can only be invoked on the client from the server. */
|
||||||
|
server(true, false),
|
||||||
|
/** Method can only be invoked on the server from the client. */
|
||||||
|
client(false, true),
|
||||||
|
/** Method can be invoked from anywhere */
|
||||||
|
both(true, true),
|
||||||
|
/** Neither server nor client. */
|
||||||
|
none(false, false);
|
||||||
|
|
||||||
|
/** If true, this method can be invoked ON clients FROM servers. */
|
||||||
|
public final boolean isServer;
|
||||||
|
/** If true, this method can be invoked ON servers FROM clients. */
|
||||||
|
public final boolean isClient;
|
||||||
|
|
||||||
|
Loc(boolean server, boolean client){
|
||||||
|
this.isServer = server;
|
||||||
|
this.isClient = client;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum Variant{
|
||||||
|
/** Method can only be invoked targeting one player. */
|
||||||
|
one(true, false),
|
||||||
|
/** Method can only be invoked targeting all players. */
|
||||||
|
all(false, true),
|
||||||
|
/** Method targets both one player and all players. */
|
||||||
|
both(true, true);
|
||||||
|
|
||||||
|
public final boolean isOne, isAll;
|
||||||
|
|
||||||
|
Variant(boolean isOne, boolean isAll){
|
||||||
|
this.isOne = isOne;
|
||||||
|
this.isAll = isAll;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Marks a method as invokable remotely across a server/client connection. */
|
||||||
|
@Target(ElementType.METHOD)
|
||||||
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
|
public @interface Remote{
|
||||||
|
/** Specifies the locations from which this method can be invoked. */
|
||||||
|
Loc targets() default Loc.server;
|
||||||
|
|
||||||
|
/** Specifies which methods are generated. Only affects server-to-client methods. */
|
||||||
|
Variant variants() default Variant.all;
|
||||||
|
|
||||||
|
/** The local locations where this method is called locally, when invoked. */
|
||||||
|
Loc called() default Loc.none;
|
||||||
|
|
||||||
|
/** Whether to forward this packet to all other clients upon recieval. Client only. */
|
||||||
|
boolean forward() default false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether the packet for this method is sent with UDP instead of TCP.
|
||||||
|
* UDP is faster, but is prone to packet loss and duplication.
|
||||||
|
*/
|
||||||
|
boolean unreliable() default false;
|
||||||
|
|
||||||
|
/** Priority of this event. */
|
||||||
|
PacketPriority priority() default PacketPriority.normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specifies that this method will be used to write classes of the type returned by {@link #value()}.<br>
|
||||||
|
* This method must return void and have two parameters, the first being of type {@link java.nio.ByteBuffer} and the second
|
||||||
|
* being the type returned by {@link #value()}.
|
||||||
|
*/
|
||||||
|
@Target(ElementType.METHOD)
|
||||||
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
|
public @interface WriteClass{
|
||||||
|
Class<?> value();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specifies that this method will be used to read classes of the type returned by {@link #value()}. <br>
|
||||||
|
* This method must return the type returned by {@link #value()},
|
||||||
|
* and have one parameter, being of type {@link java.nio.ByteBuffer}.
|
||||||
|
*/
|
||||||
|
@Target(ElementType.METHOD)
|
||||||
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
|
public @interface ReadClass{
|
||||||
|
Class<?> value();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package io.anuke.annotations;
|
||||||
|
|
||||||
|
import io.anuke.annotations.MethodEntry;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
/** Represents a class witha list method entries to include in it. */
|
||||||
|
public class ClassEntry{
|
||||||
|
/** All methods in this generated class. */
|
||||||
|
public final ArrayList<MethodEntry> methods = new ArrayList<>();
|
||||||
|
/** Simple class name. */
|
||||||
|
public final String name;
|
||||||
|
|
||||||
|
public ClassEntry(String name){
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -10,12 +10,16 @@ import javax.tools.Diagnostic.Kind;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
/**This class finds reader and writer methods annotated by the {@link io.anuke.annotations.Annotations.WriteClass}
|
/**
|
||||||
* and {@link io.anuke.annotations.Annotations.ReadClass} annotations.*/
|
* This class finds reader and writer methods annotated by the {@link io.anuke.annotations.Annotations.WriteClass}
|
||||||
|
* and {@link io.anuke.annotations.Annotations.ReadClass} annotations.
|
||||||
|
*/
|
||||||
public class IOFinder{
|
public class IOFinder{
|
||||||
|
|
||||||
/**Finds all class serializers for all types and returns them. Logs errors when necessary.
|
/**
|
||||||
* Maps fully qualified class names to their serializers.*/
|
* Finds all class serializers for all types and returns them. Logs errors when necessary.
|
||||||
|
* Maps fully qualified class names to their serializers.
|
||||||
|
*/
|
||||||
public HashMap<String, ClassSerializer> findSerializers(RoundEnvironment env){
|
public HashMap<String, ClassSerializer> findSerializers(RoundEnvironment env){
|
||||||
HashMap<String, ClassSerializer> result = new HashMap<>();
|
HashMap<String, ClassSerializer> result = new HashMap<>();
|
||||||
|
|
||||||
@@ -14,8 +14,10 @@ public class MethodEntry {
|
|||||||
public final String targetMethod;
|
public final String targetMethod;
|
||||||
/** Whether this method can be called on a client/server. */
|
/** Whether this method can be called on a client/server. */
|
||||||
public final Loc where;
|
public final Loc where;
|
||||||
/**Whether an additional 'one' and 'all' method variant is generated. At least one of these must be true.
|
/**
|
||||||
* Only applicable to client (server-invoked) methods.*/
|
* Whether an additional 'one' and 'all' method variant is generated. At least one of these must be true.
|
||||||
|
* Only applicable to client (server-invoked) methods.
|
||||||
|
*/
|
||||||
public final Variant target;
|
public final Variant target;
|
||||||
/** Whether this method is called locally as well as remotely. */
|
/** Whether this method is called locally as well as remotely. */
|
||||||
public final Loc local;
|
public final Loc local;
|
||||||
@@ -35,6 +35,8 @@ 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.*/
|
||||||
|
private static final String callLocation = "Call";
|
||||||
|
|
||||||
/** Processing round number. */
|
/** Processing round number. */
|
||||||
private int round;
|
private int round;
|
||||||
@@ -72,7 +74,6 @@ public class RemoteMethodAnnotationProcessor extends AbstractProcessor {
|
|||||||
if(round == 1){
|
if(round == 1){
|
||||||
//get serializers
|
//get serializers
|
||||||
serializers = new IOFinder().findSerializers(roundEnv);
|
serializers = new IOFinder().findSerializers(roundEnv);
|
||||||
|
|
||||||
//last method ID used
|
//last method ID used
|
||||||
int lastMethodID = 0;
|
int lastMethodID = 0;
|
||||||
//find all elements with the Remote annotation
|
//find all elements with the Remote annotation
|
||||||
@@ -102,15 +103,15 @@ public class RemoteMethodAnnotationProcessor extends AbstractProcessor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//get and create class entry if needed
|
//get and create class entry if needed
|
||||||
if (!classMap.containsKey(annotation.in())) {
|
if(!classMap.containsKey(callLocation)){
|
||||||
ClassEntry clas = new ClassEntry(annotation.in());
|
ClassEntry clas = new ClassEntry(callLocation);
|
||||||
classMap.put(annotation.in(), clas);
|
classMap.put(callLocation, clas);
|
||||||
classes.add(clas);
|
classes.add(clas);
|
||||||
|
|
||||||
Utils.messager.printMessage(Kind.NOTE, "Generating class '" + clas.name + "'.");
|
Utils.messager.printMessage(Kind.NOTE, "Generating class '" + clas.name + "'.");
|
||||||
}
|
}
|
||||||
|
|
||||||
ClassEntry entry = classMap.get(annotation.in());
|
ClassEntry entry = classMap.get(callLocation);
|
||||||
|
|
||||||
//create and add entry
|
//create and add entry
|
||||||
MethodEntry method = new MethodEntry(entry.name, Utils.getMethodName(element), annotation.targets(), annotation.variants(),
|
MethodEntry method = new MethodEntry(entry.name, Utils.getMethodName(element), annotation.targets(), annotation.variants(),
|
||||||
@@ -2,6 +2,8 @@ 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 io.anuke.annotations.MethodEntry;
|
||||||
|
import io.anuke.annotations.Utils;
|
||||||
|
|
||||||
import javax.lang.model.element.Modifier;
|
import javax.lang.model.element.Modifier;
|
||||||
import javax.lang.model.element.TypeElement;
|
import javax.lang.model.element.TypeElement;
|
||||||
@@ -23,11 +25,14 @@ public class RemoteReadGenerator {
|
|||||||
this.serializers = serializers;
|
this.serializers = serializers;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**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{
|
||||||
|
|
||||||
@@ -129,7 +129,7 @@ public class RemoteWriteGenerator {
|
|||||||
method.beginControlFlow("if(" + getCheckString(methodEntry.where) + ")");
|
method.beginControlFlow("if(" + getCheckString(methodEntry.where) + ")");
|
||||||
|
|
||||||
//add statement to create packet from pool
|
//add statement to create packet from pool
|
||||||
method.addStatement("$1N packet = $2N.obtain($1N.class)", "io.anuke.mindustry.net.Packets.InvokePacket", "com.badlogic.gdx.utils.Pools");
|
method.addStatement("$1N packet = $2N.obtain($1N.class, $1N::new)", "io.anuke.mindustry.net.Packets.InvokePacket", "io.anuke.ucore.util.Pooling");
|
||||||
//assign buffer
|
//assign buffer
|
||||||
method.addStatement("packet.writeBuffer = TEMP_BUFFER");
|
method.addStatement("packet.writeBuffer = TEMP_BUFFER");
|
||||||
//assign priority
|
//assign priority
|
||||||
@@ -0,0 +1,110 @@
|
|||||||
|
package io.anuke.annotations;
|
||||||
|
|
||||||
|
import com.squareup.javapoet.*;
|
||||||
|
import io.anuke.annotations.Annotations.Serialize;
|
||||||
|
|
||||||
|
import javax.annotation.processing.*;
|
||||||
|
import javax.lang.model.SourceVersion;
|
||||||
|
import javax.lang.model.element.Modifier;
|
||||||
|
import javax.lang.model.element.TypeElement;
|
||||||
|
import javax.lang.model.element.VariableElement;
|
||||||
|
import javax.lang.model.util.ElementFilter;
|
||||||
|
import java.io.DataInput;
|
||||||
|
import java.io.DataOutput;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
@SupportedSourceVersion(SourceVersion.RELEASE_8)
|
||||||
|
@SupportedAnnotationTypes({
|
||||||
|
"io.anuke.annotations.Annotations.Serialize"
|
||||||
|
})
|
||||||
|
public class SerializeAnnotationProcessor extends AbstractProcessor{
|
||||||
|
/**Target class name.*/
|
||||||
|
private static final String className = "Serialization";
|
||||||
|
/** Name of the base package to put all the generated classes. */
|
||||||
|
private static final String packageName = "io.anuke.mindustry.gen";
|
||||||
|
|
||||||
|
private int round;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized void init(ProcessingEnvironment processingEnv){
|
||||||
|
super.init(processingEnv);
|
||||||
|
//put all relevant utils into utils class
|
||||||
|
Utils.typeUtils = processingEnv.getTypeUtils();
|
||||||
|
Utils.elementUtils = processingEnv.getElementUtils();
|
||||||
|
Utils.filer = processingEnv.getFiler();
|
||||||
|
Utils.messager = processingEnv.getMessager();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv){
|
||||||
|
if(round++ != 0) return false; //only process 1 round
|
||||||
|
|
||||||
|
try{
|
||||||
|
Set<TypeElement> elements = ElementFilter.typesIn(roundEnv.getElementsAnnotatedWith(Serialize.class));
|
||||||
|
|
||||||
|
TypeSpec.Builder classBuilder = TypeSpec.classBuilder(className).addModifiers(Modifier.PUBLIC);
|
||||||
|
MethodSpec.Builder method = MethodSpec.methodBuilder("init").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
||||||
|
|
||||||
|
for(TypeElement elem : elements){
|
||||||
|
TypeName type = TypeName.get(elem.asType());
|
||||||
|
|
||||||
|
TypeSpec.Builder serializer = TypeSpec.anonymousClassBuilder("")
|
||||||
|
.addSuperinterface(ParameterizedTypeName.get(
|
||||||
|
ClassName.bestGuess("io.anuke.ucore.io.TypeSerializer"), type));
|
||||||
|
|
||||||
|
MethodSpec.Builder writeMethod = MethodSpec.methodBuilder("write")
|
||||||
|
.returns(void.class)
|
||||||
|
.addParameter(DataOutput.class, "stream")
|
||||||
|
.addParameter(type, "object")
|
||||||
|
.addAnnotation(Override.class)
|
||||||
|
.addException(IOException.class)
|
||||||
|
.addModifiers(Modifier.PUBLIC);
|
||||||
|
|
||||||
|
MethodSpec.Builder readMethod = MethodSpec.methodBuilder("read")
|
||||||
|
.returns(type)
|
||||||
|
.addParameter(DataInput.class, "stream")
|
||||||
|
.addAnnotation(Override.class)
|
||||||
|
.addException(IOException.class)
|
||||||
|
.addModifiers(Modifier.PUBLIC);
|
||||||
|
|
||||||
|
readMethod.addStatement("$L object = new $L()", type, type);
|
||||||
|
|
||||||
|
List<VariableElement> fields = ElementFilter.fieldsIn(Utils.elementUtils.getAllMembers(elem));
|
||||||
|
for(VariableElement field : fields){
|
||||||
|
if(field.getModifiers().contains(Modifier.STATIC) || field.getModifiers().contains(Modifier.TRANSIENT) || field.getModifiers().contains(Modifier.PRIVATE)) continue;
|
||||||
|
|
||||||
|
String name = field.getSimpleName().toString();
|
||||||
|
String typeName = Utils.typeUtils.erasure(field.asType()).toString().replace('$', '.');
|
||||||
|
String capName = Character.toUpperCase(typeName.charAt(0)) + typeName.substring(1);
|
||||||
|
|
||||||
|
if(field.asType().getKind().isPrimitive()){
|
||||||
|
writeMethod.addStatement("stream.write" + capName + "(object." + name + ")");
|
||||||
|
readMethod.addStatement("object." + name + "= stream.read" + capName + "()");
|
||||||
|
}else{
|
||||||
|
writeMethod.addStatement("io.anuke.ucore.core.Settings.getSerializer(" + typeName+ ".class).write(stream, object." + name + ")");
|
||||||
|
readMethod.addStatement("object." + name + " = (" +typeName+")io.anuke.ucore.core.Settings.getSerializer(" + typeName+ ".class).read(stream)");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
readMethod.addStatement("return object");
|
||||||
|
|
||||||
|
serializer.addMethod(writeMethod.build());
|
||||||
|
serializer.addMethod(readMethod.build());
|
||||||
|
|
||||||
|
method.addStatement("io.anuke.ucore.core.Settings.setSerializer($N, $L)", Utils.elementUtils.getBinaryName(elem).toString().replace('$', '.') + ".class", serializer.build());
|
||||||
|
}
|
||||||
|
|
||||||
|
classBuilder.addMethod(method.build());
|
||||||
|
|
||||||
|
//write result
|
||||||
|
JavaFile.builder(packageName, classBuilder.build()).build().writeTo(Utils.filer);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}catch(Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
io.anuke.annotations.RemoteMethodAnnotationProcessor
|
||||||
|
io.anuke.annotations.SerializeAnnotationProcessor
|
||||||
165
build.gradle
@@ -8,8 +8,6 @@ buildscript {
|
|||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.mobidevelop.robovm:robovm-gradle-plugin:2.3.0'
|
classpath 'com.mobidevelop.robovm:robovm-gradle-plugin:2.3.0'
|
||||||
classpath 'de.richsource.gradle.plugins:gwt-gradle-plugin:0.6'
|
|
||||||
classpath 'com.android.tools.build:gradle:3.1.0'
|
|
||||||
classpath "com.badlogicgames.gdx:gdx-tools:1.9.8"
|
classpath "com.badlogicgames.gdx:gdx-tools:1.9.8"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -21,17 +19,17 @@ allprojects {
|
|||||||
version = 'release'
|
version = 'release'
|
||||||
|
|
||||||
ext {
|
ext {
|
||||||
versionNumber = '4.0'
|
versionNumber = '4'
|
||||||
versionType = 'alpha'
|
versionModifier = 'alpha'
|
||||||
|
versionType = 'official'
|
||||||
appName = 'Mindustry'
|
appName = 'Mindustry'
|
||||||
gdxVersion = '1.9.8'
|
gdxVersion = '1.9.9'
|
||||||
roboVMVersion = '2.3.0'
|
roboVMVersion = '2.3.0'
|
||||||
aiVersion = '1.8.1'
|
uCoreVersion = '3dfb820142a0fc583ad19413a24fc5038aa29d89'
|
||||||
uCoreVersion = '2241e5402e'
|
|
||||||
|
|
||||||
getVersionString = {
|
getVersionString = {
|
||||||
String buildVersion = getBuildVersion()
|
String buildVersion = getBuildVersion()
|
||||||
return "$versionNumber-$versionType-$buildVersion"
|
return "$versionNumber-$versionModifier-$buildVersion"
|
||||||
}
|
}
|
||||||
|
|
||||||
getBuildVersion = {
|
getBuildVersion = {
|
||||||
@@ -43,24 +41,34 @@ allprojects {
|
|||||||
return project.ext.mainClassName.substring(0, project.ext.mainClassName.indexOf("desktop") - 1)
|
return project.ext.mainClassName.substring(0, project.ext.mainClassName.indexOf("desktop") - 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
generateLocales = {
|
||||||
|
def output = 'en\n'
|
||||||
|
def bundles = new File(project(':core').projectDir, 'assets/bundles/')
|
||||||
|
bundles.listFiles().each { other ->
|
||||||
|
if(other.name == "bundle.properties") return
|
||||||
|
output += other.name.substring("bundle".length() + 1, other.name.lastIndexOf('.')) + "\n"
|
||||||
|
}
|
||||||
|
new File(project(':core').projectDir, 'assets/locales').text = output
|
||||||
|
}
|
||||||
|
|
||||||
writeVersion = {
|
writeVersion = {
|
||||||
def pfile = new File('core/assets/version.properties')
|
def pfile = new File(project(':core').projectDir, 'assets/version.properties')
|
||||||
def props = new Properties()
|
def props = new Properties()
|
||||||
|
|
||||||
try{
|
try{
|
||||||
pfile.createNewFile()
|
pfile.createNewFile()
|
||||||
}catch (Exception e){}
|
}catch (Exception ignored){}
|
||||||
|
|
||||||
if(pfile.exists()) {
|
if(pfile.exists()) {
|
||||||
|
|
||||||
props.load(new FileInputStream(pfile))
|
props.load(new FileInputStream(pfile))
|
||||||
|
|
||||||
String code = getBuildVersion()
|
String buildid = getBuildVersion()
|
||||||
|
|
||||||
props["name"] = appName
|
props["type"] = versionType
|
||||||
props["version"] = versionType
|
props["number"] = versionNumber
|
||||||
props["code"] = versionNumber
|
props["modifier"] = versionModifier
|
||||||
props["build"] = code
|
props["build"] = buildid
|
||||||
|
|
||||||
props.store(pfile.newWriter(), "Autogenerated file. Do not modify.")
|
props.store(pfile.newWriter(), "Autogenerated file. Do not modify.")
|
||||||
}
|
}
|
||||||
@@ -82,44 +90,55 @@ project(":desktop") {
|
|||||||
dependencies {
|
dependencies {
|
||||||
compile project(":core")
|
compile project(":core")
|
||||||
compile project(":kryonet")
|
compile project(":kryonet")
|
||||||
|
if(new File(projectDir.parent, '../debug').exists() && System.properties["release"] == null) compile project(":debug")
|
||||||
|
|
||||||
compile "com.badlogicgames.gdx:gdx-backend-lwjgl3:$gdxVersion"
|
compile "com.badlogicgames.gdx:gdx-backend-lwjgl3:$gdxVersion"
|
||||||
compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop"
|
compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop"
|
||||||
compile "com.badlogicgames.gdx:gdx-controllers-lwjgl3:$gdxVersion"
|
compile "com.badlogicgames.gdx:gdx-controllers-lwjgl3:$gdxVersion"
|
||||||
|
compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-desktop"
|
||||||
compile 'com.github.MinnDevelopment:java-discord-rpc:v2.0.0'
|
compile 'com.github.MinnDevelopment:java-discord-rpc:v2.0.0'
|
||||||
compile 'com.yuvimasory:orange-extensions:1.3.0'
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
project(":html") {
|
|
||||||
apply plugin: "gwt"
|
|
||||||
apply plugin: "war"
|
|
||||||
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
compile project(":core")
|
|
||||||
compileOnly project(":annotations")
|
|
||||||
|
|
||||||
compile "com.badlogicgames.gdx:gdx-backend-gwt:$gdxVersion"
|
|
||||||
compile "com.badlogicgames.gdx:gdx:$gdxVersion:sources"
|
|
||||||
compile "com.badlogicgames.gdx:gdx-backend-gwt:$gdxVersion:sources"
|
|
||||||
compile "com.badlogicgames.gdx:gdx-ai:$aiVersion:sources"
|
|
||||||
|
|
||||||
compile "com.badlogicgames.gdx:gdx-controllers:$gdxVersion:sources"
|
|
||||||
compile "com.badlogicgames.gdx:gdx-controllers-gwt:$gdxVersion"
|
|
||||||
compile "com.badlogicgames.gdx:gdx-controllers-gwt:$gdxVersion:sources"
|
|
||||||
compile "com.sksamuel.gwt:gwt-websockets:1.0.4"
|
|
||||||
compile "com.sksamuel.gwt:gwt-websockets:1.0.4:sources"
|
|
||||||
}
|
|
||||||
|
|
||||||
compileJava.options.compilerArgs = [
|
|
||||||
"-processor", "io.anuke.annotations.RemoteMethodAnnotationProcessor"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
project(":ios") {
|
project(":ios") {
|
||||||
apply plugin: "java"
|
apply plugin: "java"
|
||||||
apply plugin: "robovm"
|
apply plugin: "robovm"
|
||||||
|
|
||||||
|
task copyGen{
|
||||||
|
copy{
|
||||||
|
from ("core/build/classes/java/main/io/anuke/mindustry/gen/"){
|
||||||
|
include "**/*.java"
|
||||||
|
}
|
||||||
|
|
||||||
|
into "core/src/io/anuke/mindustry/gen"
|
||||||
|
}
|
||||||
|
|
||||||
|
doFirst{
|
||||||
|
delete{
|
||||||
|
delete "core/src/io/anuke/mindustry/gen/"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
task incrementConfig{
|
||||||
|
def vfile = file('robovm.properties')
|
||||||
|
|
||||||
|
def props = new Properties()
|
||||||
|
if(vfile.exists()){
|
||||||
|
props.load(new FileInputStream(vfile))
|
||||||
|
}
|
||||||
|
|
||||||
|
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.hasProperty("app.build") ? 40 : props['app.build'].toInteger() + 1)+""
|
||||||
|
props.store(vfile.newWriter(), null)
|
||||||
|
}
|
||||||
|
|
||||||
|
build.dependsOn(incrementConfig)
|
||||||
|
build.dependsOn(copyGen)
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compile project(":core")
|
compile project(":core")
|
||||||
@@ -129,23 +148,24 @@ project(":ios") {
|
|||||||
compile "com.mobidevelop.robovm:robovm-cocoatouch:$roboVMVersion"
|
compile "com.mobidevelop.robovm:robovm-cocoatouch:$roboVMVersion"
|
||||||
compile "com.badlogicgames.gdx:gdx-backend-robovm:$gdxVersion"
|
compile "com.badlogicgames.gdx:gdx-backend-robovm:$gdxVersion"
|
||||||
compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-ios"
|
compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-ios"
|
||||||
|
compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-ios"
|
||||||
|
compileOnly project(":annotations")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
project(":core") {
|
project(":core") {
|
||||||
apply plugin: "java"
|
apply plugin: "java"
|
||||||
|
|
||||||
dependencies {
|
task finish {
|
||||||
compileOnly project(":annotations")
|
generateLocales()
|
||||||
|
|
||||||
boolean comp = System.properties["release"] == null || System.properties["release"] == "false"
|
|
||||||
|
|
||||||
if(!comp){
|
|
||||||
println("NOTICE: Compiling release build.")
|
|
||||||
}else{
|
|
||||||
println("Compiling DEBUG build.")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
build.finalizedBy(finish)
|
||||||
|
|
||||||
|
def comp = System.properties["release"] == null || System.properties["release"] == "false"
|
||||||
|
if(!comp) println("Note: Compiling release build.")
|
||||||
|
|
||||||
if(new File(projectDir.parent, '../uCore').exists() && comp){
|
if(new File(projectDir.parent, '../uCore').exists() && comp){
|
||||||
compile project(":uCore")
|
compile project(":uCore")
|
||||||
}else{
|
}else{
|
||||||
@@ -158,18 +178,23 @@ project(":core") {
|
|||||||
|
|
||||||
compile "com.badlogicgames.gdx:gdx:$gdxVersion"
|
compile "com.badlogicgames.gdx:gdx:$gdxVersion"
|
||||||
compile "com.badlogicgames.gdx:gdx-controllers:$gdxVersion"
|
compile "com.badlogicgames.gdx:gdx-controllers:$gdxVersion"
|
||||||
}
|
compile "com.badlogicgames.gdx:gdx-freetype:$gdxVersion"
|
||||||
|
|
||||||
compileJava.options.compilerArgs = [
|
compileOnly project(":annotations")
|
||||||
"-processor", "io.anuke.annotations.RemoteMethodAnnotationProcessor"
|
annotationProcessor project(":annotations")
|
||||||
]
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
project(":server") {
|
project(":server") {
|
||||||
apply plugin: "java"
|
apply plugin: "java"
|
||||||
|
|
||||||
|
configurations {
|
||||||
|
if(findProject(":android") != null){
|
||||||
|
compile.exclude module: android
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compileOnly project(":annotations")
|
|
||||||
|
|
||||||
compile project(":core")
|
compile project(":core")
|
||||||
compile project(":kryonet")
|
compile project(":kryonet")
|
||||||
@@ -178,7 +203,24 @@ project(":server") {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
project(":packer") {
|
project(":tests"){
|
||||||
|
apply plugin: "java"
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
testImplementation project(":core")
|
||||||
|
testImplementation('org.junit.jupiter:junit-jupiter-api:5.1.0')
|
||||||
|
testRuntimeOnly('org.junit.jupiter:junit-jupiter-engine:5.1.0')
|
||||||
|
testImplementation "com.badlogicgames.gdx:gdx-backend-headless:$gdxVersion"
|
||||||
|
testImplementation "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop"
|
||||||
|
}
|
||||||
|
|
||||||
|
test {
|
||||||
|
useJUnitPlatform()
|
||||||
|
workingDir = new File("../core/assets")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
project(":tools") {
|
||||||
apply plugin: "java"
|
apply plugin: "java"
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
@@ -199,11 +241,8 @@ project(":kryonet") {
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compile project(":core")
|
compile project(":core")
|
||||||
compile 'com.github.crykn:kryonet:2.22.1'
|
compile "org.lz4:lz4-java:1.4.1"
|
||||||
compile "org.java-websocket:Java-WebSocket:1.3.7"
|
compile 'com.github.Anuken:kryonet:53b10247b1'
|
||||||
|
compile 'com.github.Anuken:WaifUPnP:05eb46bc577fd7674596946ba288c96c0cedd893'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.eclipse.doLast {
|
|
||||||
delete ".project"
|
|
||||||
}
|
|
||||||
|
|||||||
BIN
core/assets-raw/fonts/chinese/wqy-microhei.ttc
Normal file
BIN
core/assets-raw/fonts/cyrillic/Exo2-Regular.ttf
Normal file
BIN
core/assets-raw/fonts/korean/Sunflower-Medium.ttf
Normal file
BIN
core/assets-raw/fonts/pixel_UNEDITED.ttf
Normal file
|
Before Width: | Height: | Size: 59 KiB |
BIN
core/assets-raw/sprites/blocks/defense/force-projector-top.png
Normal file
|
After Width: | Height: | Size: 121 B |
BIN
core/assets-raw/sprites/blocks/defense/force-projector.png
Normal file
|
After Width: | Height: | Size: 312 B |
BIN
core/assets-raw/sprites/blocks/defense/mend-projector-top.png
Normal file
|
After Width: | Height: | Size: 111 B |
BIN
core/assets-raw/sprites/blocks/defense/mend-projector.png
Normal file
|
After Width: | Height: | Size: 217 B |
|
After Width: | Height: | Size: 111 B |
BIN
core/assets-raw/sprites/blocks/defense/overdrive-projector.png
Normal file
|
After Width: | Height: | Size: 215 B |
BIN
core/assets-raw/sprites/blocks/defense/shock-mine.png
Normal file
|
After Width: | Height: | Size: 123 B |
|
Before Width: | Height: | Size: 160 B After Width: | Height: | Size: 83 B |
|
Before Width: | Height: | Size: 177 B After Width: | Height: | Size: 93 B |
|
Before Width: | Height: | Size: 178 B After Width: | Height: | Size: 95 B |
|
Before Width: | Height: | Size: 227 B After Width: | Height: | Size: 119 B |
|
Before Width: | Height: | Size: 197 B |
|
After Width: | Height: | Size: 98 B |
|
After Width: | Height: | Size: 98 B |
|
After Width: | Height: | Size: 98 B |
|
After Width: | Height: | Size: 97 B |
|
After Width: | Height: | Size: 116 B |
|
After Width: | Height: | Size: 117 B |
|
After Width: | Height: | Size: 119 B |
|
After Width: | Height: | Size: 117 B |
|
After Width: | Height: | Size: 113 B |
|
After Width: | Height: | Size: 108 B |
|
After Width: | Height: | Size: 104 B |
|
After Width: | Height: | Size: 106 B |
|
After Width: | Height: | Size: 109 B |
|
After Width: | Height: | Size: 107 B |
|
After Width: | Height: | Size: 110 B |
|
After Width: | Height: | Size: 110 B |
|
After Width: | Height: | Size: 109 B |
|
After Width: | Height: | Size: 108 B |
|
After Width: | Height: | Size: 105 B |
|
After Width: | Height: | Size: 109 B |
|
After Width: | Height: | Size: 105 B |
|
After Width: | Height: | Size: 105 B |
|
After Width: | Height: | Size: 105 B |
|
After Width: | Height: | Size: 103 B |
|
After Width: | Height: | Size: 127 B |
|
After Width: | Height: | Size: 127 B |
|
After Width: | Height: | Size: 133 B |
|
After Width: | Height: | Size: 129 B |
|
After Width: | Height: | Size: 120 B |
|
After Width: | Height: | Size: 114 B |
|
After Width: | Height: | Size: 110 B |
|
After Width: | Height: | Size: 113 B |
|
After Width: | Height: | Size: 108 B |
|
After Width: | Height: | Size: 107 B |
|
After Width: | Height: | Size: 110 B |
|
After Width: | Height: | Size: 110 B |
|
After Width: | Height: | Size: 111 B |
|
After Width: | Height: | Size: 111 B |
|
After Width: | Height: | Size: 110 B |
|
After Width: | Height: | Size: 113 B |
BIN
core/assets-raw/sprites/blocks/distribution/distributor.png
Normal file
|
After Width: | Height: | Size: 163 B |
|
Before Width: | Height: | Size: 257 B After Width: | Height: | Size: 115 B |
|
Before Width: | Height: | Size: 682 B After Width: | Height: | Size: 405 B |
|
Before Width: | Height: | Size: 580 B After Width: | Height: | Size: 273 B |
|
Before Width: | Height: | Size: 296 B |
|
Before Width: | Height: | Size: 233 B After Width: | Height: | Size: 114 B |
|
Before Width: | Height: | Size: 179 B After Width: | Height: | Size: 83 B |
|
Before Width: | Height: | Size: 189 B After Width: | Height: | Size: 88 B |
|
Before Width: | Height: | Size: 172 B After Width: | Height: | Size: 78 B |
|
Before Width: | Height: | Size: 301 B After Width: | Height: | Size: 120 B |
|
Before Width: | Height: | Size: 226 B After Width: | Height: | Size: 113 B |
|
Before Width: | Height: | Size: 248 B After Width: | Height: | Size: 110 B |
|
Before Width: | Height: | Size: 234 B |
|
Before Width: | Height: | Size: 210 B |
|
Before Width: | Height: | Size: 346 B After Width: | Height: | Size: 216 B |