Compare commits
1753 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e8bbc2bf4c | ||
|
|
b02053a70c | ||
|
|
99f2b8f536 | ||
|
|
8346d5fc13 | ||
|
|
3a841c6c0f | ||
|
|
ecd30094b1 | ||
|
|
81909bd1a9 | ||
|
|
319d65f9a3 | ||
|
|
bc8c99df15 | ||
|
|
aef3a719fe | ||
|
|
2726ebe191 | ||
|
|
85767d4946 | ||
|
|
86a78b206a | ||
|
|
4e308d6600 | ||
|
|
7f2cc59b3c | ||
|
|
878901d05d | ||
|
|
d1304abb9e | ||
|
|
4ae39e851d | ||
|
|
06c5c92d2c | ||
|
|
fc6e529049 | ||
|
|
438f128e2e | ||
|
|
878af1ea28 | ||
|
|
8e84e7284e | ||
|
|
77d4b0972d | ||
|
|
2a518fa7c9 | ||
|
|
04c8ecf4af | ||
|
|
67743dded5 | ||
|
|
5acda423d8 | ||
|
|
8b3995686f | ||
|
|
f388ca298e | ||
|
|
636b92205b | ||
|
|
26d26b5e7a | ||
|
|
01efb59d25 | ||
|
|
b1980a17ac | ||
|
|
69ee5257f2 | ||
|
|
b812fcddf8 | ||
|
|
8393639735 | ||
|
|
dafbba0907 | ||
|
|
28ab2b3917 | ||
|
|
2be3cc2f1e | ||
|
|
d8085d88a8 | ||
|
|
d6b023709d | ||
|
|
2459fb23ae | ||
|
|
4bd3f415a9 | ||
|
|
4414ee6d38 | ||
|
|
fdd84066f5 | ||
|
|
4ebf39449e | ||
|
|
d4f26e0340 | ||
|
|
a00a208ff8 | ||
|
|
bc77fd619d | ||
|
|
5eadd6608d | ||
|
|
1340b8d4d8 | ||
|
|
9db86f212f | ||
|
|
697894274f | ||
|
|
7292479d9c | ||
|
|
301c11c208 | ||
|
|
71b218ad62 | ||
|
|
ec2f21b944 | ||
|
|
c65b3f3aca | ||
|
|
43280ee077 | ||
|
|
c7e4fb8021 | ||
|
|
132d058098 | ||
|
|
c678a5502d | ||
|
|
0ee35721b0 | ||
|
|
1932f9a9c3 | ||
|
|
8e85b71669 | ||
|
|
f439afae9e | ||
|
|
fdd749be18 | ||
|
|
666e3e51a3 | ||
|
|
b930d5a1f9 | ||
|
|
5c10a2662d | ||
|
|
214f451cc1 | ||
|
|
67b4fa6f68 | ||
|
|
aa3e7a8ef5 | ||
|
|
7bf6099528 | ||
|
|
e90a4eb71d | ||
|
|
7b83406ee4 | ||
|
|
c4157d2ec8 | ||
|
|
2bdfaef2d9 | ||
|
|
2b0fbd9904 | ||
|
|
0ffa0351b5 | ||
|
|
951cbf3d16 | ||
|
|
69454048ad | ||
|
|
c4ceb89240 | ||
|
|
4a638cba79 | ||
|
|
c209528271 | ||
|
|
0d1f590937 | ||
|
|
b59b839029 | ||
|
|
513243ba0f | ||
|
|
795e774119 | ||
|
|
d02d419729 | ||
|
|
518bffe644 | ||
|
|
88d1b31aff | ||
|
|
4db2dbff44 | ||
|
|
32ad577f6d | ||
|
|
3310f49f68 | ||
|
|
bf7803d554 | ||
|
|
c9bd253960 | ||
|
|
859591cea5 | ||
|
|
b99b13a6e4 | ||
|
|
c80be4940f | ||
|
|
52374ce06d | ||
|
|
5a594f7d9a | ||
|
|
aff87a26ce | ||
|
|
18aae0cfa5 | ||
|
|
6f0bc2ecf8 | ||
|
|
8d2a637bd8 | ||
|
|
54180c4768 | ||
|
|
4e22384ed1 | ||
|
|
029f801159 | ||
|
|
fd53671430 | ||
|
|
7b09548261 | ||
|
|
63e1311656 | ||
|
|
36a303a86f | ||
|
|
61f903dcf1 | ||
|
|
2a10562e9e | ||
|
|
d64796f32a | ||
|
|
f2d67d0a5d | ||
|
|
ad39a51fe8 | ||
|
|
14d0927fb6 | ||
|
|
1697465d0d | ||
|
|
e52965d039 | ||
|
|
a8d957bf7d | ||
|
|
b6b5343e04 | ||
|
|
d4c318438d | ||
|
|
d8d04f2ac3 | ||
|
|
1c38e73290 | ||
|
|
7fc6b9b940 | ||
|
|
ed50ed8550 | ||
|
|
fb4c65dae0 | ||
|
|
fc9543baa7 | ||
|
|
b0eaca091a | ||
|
|
aab13a5582 | ||
|
|
f852ba02d8 | ||
|
|
4aa074b9fc | ||
|
|
2f7503c752 | ||
|
|
d754593c2b | ||
|
|
07ea938885 | ||
|
|
ac87930672 | ||
|
|
3dfef06bba | ||
|
|
120faf3806 | ||
|
|
f51f04d170 | ||
|
|
ec7bb78ee4 | ||
|
|
5ae1e59b5c | ||
|
|
e3956ebcf2 | ||
|
|
bb75e8f2e0 | ||
|
|
a77b1416e5 | ||
|
|
121e0a433b | ||
|
|
988aee3078 | ||
|
|
2bb99bb100 | ||
|
|
4e7ddc7e71 | ||
|
|
174caef7ca | ||
|
|
d2bb3800e3 | ||
|
|
f0959ab356 | ||
|
|
2c5546c6fb | ||
|
|
a7a565b93e | ||
|
|
ed074bd08b | ||
|
|
d938b22729 | ||
|
|
bd88a2378f | ||
|
|
0371126ccf | ||
|
|
ab36b6a2e1 | ||
|
|
d43d4a1773 | ||
|
|
0837c476a1 | ||
|
|
77a41b1783 | ||
|
|
0d39400f8b | ||
|
|
d3c8678f80 | ||
|
|
b7008072f8 | ||
|
|
15737810f0 | ||
|
|
5036c57372 | ||
|
|
5799e6f567 | ||
|
|
310e8afc25 | ||
|
|
78215363dc | ||
|
|
4e873f8bf3 | ||
|
|
79dc116e6a | ||
|
|
a7480ae656 | ||
|
|
62e310a776 | ||
|
|
bb398a2f1e | ||
|
|
79ab2d122d | ||
|
|
3a2f73a176 | ||
|
|
217237b57e | ||
|
|
cb7b6eb3f8 | ||
|
|
6e21d7f560 | ||
|
|
09d905b96f | ||
|
|
8f29d4871d | ||
|
|
94f175e2cd | ||
|
|
5e15c5574a | ||
|
|
1c530a6c7a | ||
|
|
8fc0872b90 | ||
|
|
3021cc29da | ||
|
|
c77f51b7ae | ||
|
|
aa39d36663 | ||
|
|
40907db32d | ||
|
|
12bff75586 | ||
|
|
8bc59fb67c | ||
|
|
ab5319f3d1 | ||
|
|
6128df0062 | ||
|
|
142938cdca | ||
|
|
b32efe129e | ||
|
|
2b20272a61 | ||
|
|
d9ef79a7b5 | ||
|
|
576f0be4ab | ||
|
|
89a4e6506f | ||
|
|
47099a8a9b | ||
|
|
04dfda0c55 | ||
|
|
22656a40b2 | ||
|
|
b6df916700 | ||
|
|
6fa9abd896 | ||
|
|
e239406199 | ||
|
|
b7a0ebad17 | ||
|
|
266744b1dd | ||
|
|
f8526e1ac7 | ||
|
|
ab716e96e2 | ||
|
|
649d527dcf | ||
|
|
c5e7ddaf7a | ||
|
|
b2a4cb42cf | ||
|
|
3fc5941f54 | ||
|
|
741360022b | ||
|
|
86e2f62aed | ||
|
|
e552915637 | ||
|
|
98a51c1f61 | ||
|
|
aa84eefa8f | ||
|
|
22e12ce3e5 | ||
|
|
f4a82b5c01 | ||
|
|
60520ea855 | ||
|
|
b70a0869cd | ||
|
|
7bdd21bb75 | ||
|
|
0dd3736f2a | ||
|
|
deb2d30706 | ||
|
|
c416e1546d | ||
|
|
6d3a67ae59 | ||
|
|
6b60147152 | ||
|
|
8c91aca838 | ||
|
|
b47e282747 | ||
|
|
134d0e7e4a | ||
|
|
26b596760b | ||
|
|
8a5e15e82d | ||
|
|
ffb5eee62a | ||
|
|
387d9b39da | ||
|
|
43b5cb62bb | ||
|
|
580923a646 | ||
|
|
06444f497b | ||
|
|
1676ad5f1b | ||
|
|
478d86677d | ||
|
|
c5e0db8de9 | ||
|
|
228690b400 | ||
|
|
1fe30bc466 | ||
|
|
8e95be0ac2 | ||
|
|
47b1e700ea | ||
|
|
3ad1949727 | ||
|
|
441680861e | ||
|
|
5e848ecbb3 | ||
|
|
c9520e607f | ||
|
|
40a8c52ba1 | ||
|
|
cb6ffd7810 | ||
|
|
185a7bb7d8 | ||
|
|
bc3405d11d | ||
|
|
2804361436 | ||
|
|
4f40f3c4b2 | ||
|
|
897c55c410 | ||
|
|
9e97b5851e | ||
|
|
625fbdb2d7 | ||
|
|
0f32d3f619 | ||
|
|
273c74b275 | ||
|
|
2500d0a930 | ||
|
|
25bf3be009 | ||
|
|
910dab1896 | ||
|
|
6198ad557a | ||
|
|
89b3d3b670 | ||
|
|
122f43ddb9 | ||
|
|
50104d2532 | ||
|
|
f5f30d6026 | ||
|
|
114cd48521 | ||
|
|
548da3ea5f | ||
|
|
2a8b8d040b | ||
|
|
0dc2d4445b | ||
|
|
8ac497354a | ||
|
|
0cbbcc00a5 | ||
|
|
5cfab33ada | ||
|
|
18328320c1 | ||
|
|
73c48afc99 | ||
|
|
62bd0442df | ||
|
|
0aee75c1c1 | ||
|
|
dc3c27297f | ||
|
|
9363946874 | ||
|
|
df78412896 | ||
|
|
16190aa878 | ||
|
|
e6e5b95adc | ||
|
|
990adcd3b3 | ||
|
|
75a5bbdbb1 | ||
|
|
af1746932f | ||
|
|
56ff5689f4 | ||
|
|
0dd15f3141 | ||
|
|
72fb7b9df7 | ||
|
|
d7e1297cce | ||
|
|
3c9d4ee38f | ||
|
|
828e6bb1b7 | ||
|
|
6e42d59716 | ||
|
|
6f589b5c84 | ||
|
|
6d1b8b81fa | ||
|
|
cddd7e0e94 | ||
|
|
340bc5f2f7 | ||
|
|
ecd117cd58 | ||
|
|
ea0788f56c | ||
|
|
4199702b9b | ||
|
|
5946aaa31f | ||
|
|
444b5dbd97 | ||
|
|
695ccfcc4d | ||
|
|
a6d5bdd001 | ||
|
|
bd4d8efd78 | ||
|
|
53baad766f | ||
|
|
8ac746188b | ||
|
|
62dbce089f | ||
|
|
fd5d0b2cbb | ||
|
|
6226e0c5a3 | ||
|
|
01a9be835f | ||
|
|
97eb66b0a5 | ||
|
|
048c5e68f1 | ||
|
|
8f39def993 | ||
|
|
0be674d7af | ||
|
|
e6499f7e5a | ||
|
|
10bd1d1969 | ||
|
|
ec94267b8e | ||
|
|
d3ad113bf5 | ||
|
|
8d7242a1ef | ||
|
|
13879dd374 | ||
|
|
0f519fd358 | ||
|
|
e7fb128499 | ||
|
|
c2d619cb7f | ||
|
|
78176cca90 | ||
|
|
dbc49649c0 | ||
|
|
49ee821029 | ||
|
|
e1499330bc | ||
|
|
222175e005 | ||
|
|
388927715e | ||
|
|
ac9e1febfb | ||
|
|
e47836cc64 | ||
|
|
f8f48f1c88 | ||
|
|
95e8a603a5 | ||
|
|
c400fd88f3 | ||
|
|
095d90fd22 | ||
|
|
797be92ddd | ||
|
|
7f23bd694c | ||
|
|
1cbf8b960a | ||
|
|
c8ce195522 | ||
|
|
4458ae042e | ||
|
|
1c3d7c1c73 | ||
|
|
cb3bbd169f | ||
|
|
ab107bfc0d | ||
|
|
d0b5b49bf8 | ||
|
|
1b4b1d5c9f | ||
|
|
aee800ab7a | ||
|
|
895b46307a | ||
|
|
d300d45f22 | ||
|
|
dd05f5278c | ||
|
|
1897008c72 | ||
|
|
328cdac60f | ||
|
|
3942c6cd55 | ||
|
|
f0f7b5aaf7 | ||
|
|
3ad9e44891 | ||
|
|
80bdaa1edc | ||
|
|
39acb224d1 | ||
|
|
f51d565db8 | ||
|
|
d608cf6536 | ||
|
|
0b49bd1985 | ||
|
|
fce69005a9 | ||
|
|
b73420b156 | ||
|
|
fb863cb39b | ||
|
|
8247ff15ed | ||
|
|
af8db9062c | ||
|
|
9039d52817 | ||
|
|
88d5e1cca8 | ||
|
|
57544e615f | ||
|
|
61a92d55ae | ||
|
|
940965f03d | ||
|
|
30a254e9be | ||
|
|
581782af28 | ||
|
|
72cad1409f | ||
|
|
e7e4985761 | ||
|
|
cdb3d29767 | ||
|
|
90fe5329e3 | ||
|
|
22e20cb2da | ||
|
|
a3454e50d7 | ||
|
|
75b8f5e543 | ||
|
|
1a0b22ef15 | ||
|
|
bc78d1a561 | ||
|
|
00b953a04e | ||
|
|
aa0ef529f5 | ||
|
|
bd134bf9c9 | ||
|
|
752267c521 | ||
|
|
34635e3460 | ||
|
|
ba0b4513f1 | ||
|
|
4764808450 | ||
|
|
c66fd67510 | ||
|
|
3997ca6454 | ||
|
|
4242100c53 | ||
|
|
32adcc3676 | ||
|
|
80c26606f0 | ||
|
|
a7852098f1 | ||
|
|
72638fc215 | ||
|
|
65418529cd | ||
|
|
ceea0d1730 | ||
|
|
764ea699b1 | ||
|
|
bdb7f522fb | ||
|
|
2461331e32 | ||
|
|
3464f40da3 | ||
|
|
3b2b79d539 | ||
|
|
8616fc6b05 | ||
|
|
9e9c001422 | ||
|
|
93bbd34055 | ||
|
|
cac953e812 | ||
|
|
aeb3662414 | ||
|
|
1687ce3182 | ||
|
|
2888e87bb8 | ||
|
|
094ebb8020 | ||
|
|
54ad52edc2 | ||
|
|
0e869f3cb5 | ||
|
|
4d40af6ac0 | ||
|
|
79a2f31056 | ||
|
|
b2341bf75c | ||
|
|
c4c4b473e5 | ||
|
|
6e26ccf25d | ||
|
|
83bfad3546 | ||
|
|
90f6fff1ae | ||
|
|
52f2b52990 | ||
|
|
48ed4b0e49 | ||
|
|
c3c609e7b9 | ||
|
|
6cd8fa6b0c | ||
|
|
ffb6d398d7 | ||
|
|
52674b4668 | ||
|
|
4ae2370137 | ||
|
|
cee55afa5c | ||
|
|
f998bbbe4c | ||
|
|
e5d19a9819 | ||
|
|
dd75d88d2f | ||
|
|
65ea01218a | ||
|
|
7a2234cd25 | ||
|
|
11ede2756e | ||
|
|
3e51fab387 | ||
|
|
962f413421 | ||
|
|
ae6c938abb | ||
|
|
68faae69c5 | ||
|
|
08edce7906 | ||
|
|
55eb493d1f | ||
|
|
d6be07f1b8 | ||
|
|
064a012b25 | ||
|
|
df26148e7c | ||
|
|
d26f533111 | ||
|
|
69575dbab3 | ||
|
|
9f4a430412 | ||
|
|
23843be981 | ||
|
|
486e3ffc0a | ||
|
|
8127e5a66f | ||
|
|
53167a3b52 | ||
|
|
1b77247c40 | ||
|
|
24374cf7e3 | ||
|
|
88de54ec90 | ||
|
|
3035d569cc | ||
|
|
51f9ad5a2c | ||
|
|
bb322f1bff | ||
|
|
72843e9c92 | ||
|
|
20fbe2fbbe | ||
|
|
bf073a84c8 | ||
|
|
35b158dba7 | ||
|
|
465c0e7dc3 | ||
|
|
eb4f6f2e9f | ||
|
|
0ff56e3a68 | ||
|
|
4ddc59589c | ||
|
|
1e15d7a33e | ||
|
|
e4e2b6ab00 | ||
|
|
af67690e75 | ||
|
|
b37ae484c0 | ||
|
|
13969bdd29 | ||
|
|
a3f5583326 | ||
|
|
f137c11c6c | ||
|
|
8d6afbd80d | ||
|
|
c46fa206f6 | ||
|
|
e8da206389 | ||
|
|
18f1b5f9d2 | ||
|
|
b2b8cf2357 | ||
|
|
a4fd88a440 | ||
|
|
96a92fd85f | ||
|
|
e5175d6309 | ||
|
|
b5ceee3336 | ||
|
|
a1624f61ae | ||
|
|
5ee26fc3f4 | ||
|
|
93ffb66e59 | ||
|
|
4b9bcfb014 | ||
|
|
a161c09441 | ||
|
|
0c396f76b2 | ||
|
|
b2408b1a7c | ||
|
|
c97826ed29 | ||
|
|
9c653a46bc | ||
|
|
eaa2ad4f05 | ||
|
|
88ce7837a6 | ||
|
|
9f5a183793 | ||
|
|
c2a6690d24 | ||
|
|
5e5b719704 | ||
|
|
4054c7d12d | ||
|
|
bb5e454b91 | ||
|
|
ffb12f9c0b | ||
|
|
a89786d079 | ||
|
|
2d3fd513d8 | ||
|
|
271d01dc9d | ||
|
|
d3ffaea042 | ||
|
|
404b593ab8 | ||
|
|
b9f1dea914 | ||
|
|
f3385e6453 | ||
|
|
a2e55f7861 | ||
|
|
761e0114a5 | ||
|
|
dcae128d06 | ||
|
|
a891a8badc | ||
|
|
f3ec5b533e | ||
|
|
d50397edf1 | ||
|
|
49986f22c8 | ||
|
|
70f279d978 | ||
|
|
84c5a75b6c | ||
|
|
97663e87a6 | ||
|
|
5956edcb8e | ||
|
|
7e975f2134 | ||
|
|
40de13f9c7 | ||
|
|
70946539e3 | ||
|
|
996c594dfc | ||
|
|
d8eeb79b63 | ||
|
|
cf61dd0704 | ||
|
|
6fd5f1563a | ||
|
|
3c643c917a | ||
|
|
378be0ef86 | ||
|
|
29e90969eb | ||
|
|
fb724514f3 | ||
|
|
1f11da75d2 | ||
|
|
a2fa65330d | ||
|
|
d3af66b7ed | ||
|
|
fcc433fe17 | ||
|
|
617bdf9910 | ||
|
|
3b2aa92eb7 | ||
|
|
4c17b56e28 | ||
|
|
ad13c83f93 | ||
|
|
768d67a8ae | ||
|
|
d827cda395 | ||
|
|
106e6c98a3 | ||
|
|
e7ad797d4e | ||
|
|
6e1fb71194 | ||
|
|
9f5dc7f091 | ||
|
|
57b273639c | ||
|
|
278d690a6b | ||
|
|
c91c0f7b47 | ||
|
|
6a406f4d45 | ||
|
|
eecaa850e0 | ||
|
|
f332332eaa | ||
|
|
79b0e76be0 | ||
|
|
30650efd98 | ||
|
|
b7759c8151 | ||
|
|
0382c35ac0 | ||
|
|
819262c93f | ||
|
|
db60f4bb1c | ||
|
|
7785ca55c2 | ||
|
|
75dcceff43 | ||
|
|
af91979d4c | ||
|
|
52cd4a77dd | ||
|
|
8a1da3c0ed | ||
|
|
9d67c36c32 | ||
|
|
f283709e62 | ||
|
|
5035559b08 | ||
|
|
01e1438382 | ||
|
|
4eee472043 | ||
|
|
5f89a1b9ca | ||
|
|
b9db5ad662 | ||
|
|
4a7960d64b | ||
|
|
5b8084e1fa | ||
|
|
ab67b67e4c | ||
|
|
f825931f92 | ||
|
|
6113edf2ce | ||
|
|
8413443c26 | ||
|
|
f67fb31bc5 | ||
|
|
d321ec5ed1 | ||
|
|
084ae184f9 | ||
|
|
d1ec652f7b | ||
|
|
7a2a6586be | ||
|
|
392dcf3092 | ||
|
|
8a983c784d | ||
|
|
a443263439 | ||
|
|
3e766b9f54 | ||
|
|
89b9501f35 | ||
|
|
816ae84005 | ||
|
|
c0e425cf46 | ||
|
|
9ebb4c7d12 | ||
|
|
46c3b35028 | ||
|
|
ef2b8be726 | ||
|
|
df51078858 | ||
|
|
5783b61631 | ||
|
|
98a53381fb | ||
|
|
daccfa5fe3 | ||
|
|
d82c24616f | ||
|
|
905ca3dcfc | ||
|
|
b4fb687c4f | ||
|
|
39fb2ae5ab | ||
|
|
b40beb0d1d | ||
|
|
4a96b9bb00 | ||
|
|
f83a178982 | ||
|
|
986b4276e1 | ||
|
|
6f6f418ec9 | ||
|
|
1463571cd7 | ||
|
|
7dfb0a81e3 | ||
|
|
9699d9467a | ||
|
|
08a2872527 | ||
|
|
7c81a807ea | ||
|
|
3bf7031e6a | ||
|
|
503fc980f4 | ||
|
|
efed11eb97 | ||
|
|
330820062f | ||
|
|
45d157fe3f | ||
|
|
812dea385c | ||
|
|
c582bdea46 | ||
|
|
e6c6a9381b | ||
|
|
4b4c0755c6 | ||
|
|
aeb0539c91 | ||
|
|
9feafa45f5 | ||
|
|
927df391f3 | ||
|
|
cbef6adeb1 | ||
|
|
2dee221861 | ||
|
|
0b175cb25d | ||
|
|
0820338b55 | ||
|
|
a2b46eee6f | ||
|
|
09a435320a | ||
|
|
bf56200c06 | ||
|
|
2d18df2011 | ||
|
|
bab87c0da8 | ||
|
|
148f272500 | ||
|
|
6de4af727b | ||
|
|
75946b9d14 | ||
|
|
1c63ee6743 | ||
|
|
efdaf0d986 | ||
|
|
3f6aeac33d | ||
|
|
d9692004cc | ||
|
|
67a12eecad | ||
|
|
37999e0870 | ||
|
|
66dc1e94f5 | ||
|
|
ebcce194a0 | ||
|
|
95eab94c80 | ||
|
|
41a6dbe06c | ||
|
|
fa22b0ec12 | ||
|
|
be60a367e8 | ||
|
|
608de34205 | ||
|
|
0a8f2edb05 | ||
|
|
41b08f38c5 | ||
|
|
a83c0b2e9a | ||
|
|
8f853c8f18 | ||
|
|
b4071f6dcb | ||
|
|
6b70418861 | ||
|
|
de0235ad94 | ||
|
|
c278c632b3 | ||
|
|
6392330e70 | ||
|
|
160ae4e244 | ||
|
|
a6c9bd3182 | ||
|
|
801eadd8a8 | ||
|
|
211dab1297 | ||
|
|
0c3b39ffdc | ||
|
|
c31f88a318 | ||
|
|
e9eb981782 | ||
|
|
83bde8a781 | ||
|
|
52f352bf94 | ||
|
|
b419a96d69 | ||
|
|
eb3d5b62f5 | ||
|
|
1c5f578d88 | ||
|
|
db3aae1388 | ||
|
|
0b08eb72a6 | ||
|
|
cbc81376be | ||
|
|
27e9901d05 | ||
|
|
532c36677c | ||
|
|
0c20c6ecb7 | ||
|
|
fbb3240ebb | ||
|
|
bffae90022 | ||
|
|
61f6368591 | ||
|
|
1027ca2a85 | ||
|
|
5acc42f739 | ||
|
|
1edeaeb94e | ||
|
|
879acc6077 | ||
|
|
4e5d87104c | ||
|
|
e6a24b8ba1 | ||
|
|
fd190c7770 | ||
|
|
d56869aefa | ||
|
|
c8a15bb7e4 | ||
|
|
07c28c3f6d | ||
|
|
855957b099 | ||
|
|
50959317e9 | ||
|
|
20a681a71f | ||
|
|
4e2d558b36 | ||
|
|
0430b908f4 | ||
|
|
a84e9f2aaa | ||
|
|
7ce571e59c | ||
|
|
545a64f7dc | ||
|
|
10c999a4a2 | ||
|
|
d0e026d597 | ||
|
|
0b1e2bf19b | ||
|
|
71c2c7ad05 | ||
|
|
97f5bf3cc4 | ||
|
|
bb9573b85a | ||
|
|
e1f53dfc67 | ||
|
|
87481e0a4d | ||
|
|
f7aa58e385 | ||
|
|
ea5c78f814 | ||
|
|
c93c016e9c | ||
|
|
4bb6664c7e | ||
|
|
9578068a02 | ||
|
|
30e5f2b17d | ||
|
|
f959760c07 | ||
|
|
e7db2350bc | ||
|
|
0585dabf7a | ||
|
|
a3c6e3f1df | ||
|
|
9f57278644 | ||
|
|
afc35cf623 | ||
|
|
6d8523054b | ||
|
|
fdecd55278 | ||
|
|
7e7f95916b | ||
|
|
ab52c65dcf | ||
|
|
ed4d0eb5d0 | ||
|
|
4bc9143306 | ||
|
|
a4f558c77a | ||
|
|
e4f226a9c5 | ||
|
|
c7d34049fa | ||
|
|
ee06e620c6 | ||
|
|
b48110db3b | ||
|
|
8413046dd8 | ||
|
|
83a5a82e18 | ||
|
|
771c5fbe3d | ||
|
|
74f16d0137 | ||
|
|
5d5d354f7d | ||
|
|
8f5f27755d | ||
|
|
4cb92cdb06 | ||
|
|
9e067ebdd6 | ||
|
|
fd5fcc9928 | ||
|
|
c0b2abb5fd | ||
|
|
2c8620a75c | ||
|
|
62f6ed0878 | ||
|
|
886b62bbad | ||
|
|
4bd58589fc | ||
|
|
0ce4144767 | ||
|
|
cde945f40e | ||
|
|
c5226c9e59 | ||
|
|
e2126a2693 | ||
|
|
c9f6d92bef | ||
|
|
3bad95b389 | ||
|
|
54ef7760b9 | ||
|
|
fbf4c411c1 | ||
|
|
ce5218db58 | ||
|
|
e2ea7f9b87 | ||
|
|
94d9f04814 | ||
|
|
c86dbac04a | ||
|
|
f36eed32b9 | ||
|
|
cd752209ad | ||
|
|
fe37d619b9 | ||
|
|
2ed5d34192 | ||
|
|
043f4688ef | ||
|
|
949f171579 | ||
|
|
87d586a30e | ||
|
|
783f453da3 | ||
|
|
6dcf889ffe | ||
|
|
8d44879cc6 | ||
|
|
9336a2b4c5 | ||
|
|
eb92ca8cd7 | ||
|
|
e7b813962d | ||
|
|
22fadab3b3 | ||
|
|
91741ec29c | ||
|
|
8269d842ce | ||
|
|
d038bdb6ce | ||
|
|
6cef301b94 | ||
|
|
e7ffbd817c | ||
|
|
97067a6ee2 | ||
|
|
7d1a8f5404 | ||
|
|
43bcf0cf3b | ||
|
|
71751ee18d | ||
|
|
ed105b102d | ||
|
|
f2662045ed | ||
|
|
ecb77b0283 | ||
|
|
4d4869842e | ||
|
|
47300b42b0 | ||
|
|
609565af5f | ||
|
|
0c75f920de | ||
|
|
e7b51f313b | ||
|
|
e8204fc983 | ||
|
|
aa69af64fb | ||
|
|
41f734b04d | ||
|
|
8ad6f3abcc | ||
|
|
e4875903f1 | ||
|
|
0a04de04f1 | ||
|
|
20427fdffa | ||
|
|
0fd0abc6c0 | ||
|
|
70f7fc29d4 | ||
|
|
b0c1aff783 | ||
|
|
4909c28ed9 | ||
|
|
9e6745f691 | ||
|
|
6c3ccb259f | ||
|
|
6c8d80777c | ||
|
|
2db61f93ac | ||
|
|
ad059cbc38 | ||
|
|
87e7e04c5e | ||
|
|
c083d059c9 | ||
|
|
ebd44d3b60 | ||
|
|
51f5d04889 | ||
|
|
0f4d574115 | ||
|
|
1feb4a5e6d | ||
|
|
f861b75c7d | ||
|
|
3530ca8989 | ||
|
|
6b074ed4b2 | ||
|
|
671823b4fa | ||
|
|
8ceebf1546 | ||
|
|
376495836a | ||
|
|
98212df076 | ||
|
|
1316c9235a | ||
|
|
a0905d5695 | ||
|
|
2a35e22dd2 | ||
|
|
f86a07daee | ||
|
|
997628622a | ||
|
|
563e015c92 | ||
|
|
64533de597 | ||
|
|
3776b99c39 | ||
|
|
d3922905c9 | ||
|
|
f5866d7f72 | ||
|
|
dbbc72d00f | ||
|
|
a5d1350815 | ||
|
|
82e44397ff | ||
|
|
335c880af2 | ||
|
|
966efa0669 | ||
|
|
526a61381d | ||
|
|
d01f68f731 | ||
|
|
1235b41172 | ||
|
|
21f3a053ed | ||
|
|
9e960d461b | ||
|
|
02fad0a9cc | ||
|
|
627b78043b | ||
|
|
89b439c3c8 | ||
|
|
4a4a9f267b | ||
|
|
f605aabaa9 | ||
|
|
d82d0ae923 | ||
|
|
1e111d29d9 | ||
|
|
110def97d9 | ||
|
|
5bacdfa951 | ||
|
|
914f1b38f8 | ||
|
|
2aff73a958 | ||
|
|
13c2eae1f4 | ||
|
|
8f4258b119 | ||
|
|
4eba89603e | ||
|
|
61f75d7331 | ||
|
|
cd387c5c3a | ||
|
|
2fa32e5099 | ||
|
|
f12da57720 | ||
|
|
964d1a0d87 | ||
|
|
0cb14461ba | ||
|
|
d05f9c5540 | ||
|
|
690580c57d | ||
|
|
5039763a52 | ||
|
|
2cc54ffa5b | ||
|
|
0a9b78f013 | ||
|
|
e42fa7ad20 | ||
|
|
9c179e559b | ||
|
|
6dd10b74d5 | ||
|
|
a073b0ab18 | ||
|
|
4f253999ac | ||
|
|
9108a7bae6 | ||
|
|
6ba88323fe | ||
|
|
e112e3f949 | ||
|
|
1ed4e9f5bb | ||
|
|
b6c5f202e4 | ||
|
|
976b39414f | ||
|
|
d74887eaa1 | ||
|
|
7fb72bf0e2 | ||
|
|
b0126206e1 | ||
|
|
9c240850b8 | ||
|
|
5b7b50f555 | ||
|
|
f591403b7d | ||
|
|
4b028b3435 | ||
|
|
cbcf237d80 | ||
|
|
a815c564fb | ||
|
|
cb12501d5b | ||
|
|
86aeabc911 | ||
|
|
5e2a455045 | ||
|
|
86dddd0253 | ||
|
|
4677de80c1 | ||
|
|
fbcbca6f24 | ||
|
|
7024273a02 | ||
|
|
070bb4d2d1 | ||
|
|
2b4bcf0b0a | ||
|
|
f33e924cdf | ||
|
|
18fcc6e596 | ||
|
|
59e909ae3a | ||
|
|
66766b43c7 | ||
|
|
8c6c4c2630 | ||
|
|
ea2ed7d776 | ||
|
|
a708c8b7ea | ||
|
|
12ca4cda91 | ||
|
|
85f73fee02 | ||
|
|
1b5b6d424b | ||
|
|
126a764918 | ||
|
|
f796a24956 | ||
|
|
e815cff291 | ||
|
|
0851f2d0e2 | ||
|
|
0ad89ebc04 | ||
|
|
a4b9579d25 | ||
|
|
e65b6670ec | ||
|
|
1665e75068 | ||
|
|
6d01d893f7 | ||
|
|
cb9616a381 | ||
|
|
d218fb926a | ||
|
|
39276b4b03 | ||
|
|
51ba999ee1 | ||
|
|
52593252c5 | ||
|
|
718f56172e | ||
|
|
34b7961814 | ||
|
|
897b90f044 | ||
|
|
a9778e6e68 | ||
|
|
ccaf888e8b | ||
|
|
29821003fe | ||
|
|
3f7ba23dff | ||
|
|
6fd243522d | ||
|
|
368bf2258f | ||
|
|
533ddb874e | ||
|
|
baaf126c15 | ||
|
|
5b2bfe10bc | ||
|
|
17b24c3389 | ||
|
|
55b3e8639f | ||
|
|
22dad88ff7 | ||
|
|
ce3b0f2d8f | ||
|
|
a87e2a56d2 | ||
|
|
bb0ee26e4f | ||
|
|
adf5189541 | ||
|
|
82077936bb | ||
|
|
5094a6fc49 | ||
|
|
274ef166ef | ||
|
|
66c27fab13 | ||
|
|
56bcabedf7 | ||
|
|
79a9541394 | ||
|
|
7e35de3c33 | ||
|
|
7b90044544 | ||
|
|
5a7e5450dc | ||
|
|
ec2ec59be0 | ||
|
|
beb25bd595 | ||
|
|
c2919f7e7a | ||
|
|
cee9d86835 | ||
|
|
9dbedc6e5d | ||
|
|
53310ed80a | ||
|
|
9251c55be2 | ||
|
|
25658f2a0a | ||
|
|
4f9e64588f | ||
|
|
afeb4d033b | ||
|
|
2569b2139d | ||
|
|
d88923bb71 | ||
|
|
d0c6d9a489 | ||
|
|
1bdea1b8d8 | ||
|
|
6ea90ea828 | ||
|
|
6217ae78e3 | ||
|
|
20529d3ebc | ||
|
|
c8fa116a24 | ||
|
|
2904bc69d9 | ||
|
|
38b3ad07b7 | ||
|
|
fe765e5a5b | ||
|
|
6e7514491c | ||
|
|
eb5b50b3e9 | ||
|
|
82b908f0ab | ||
|
|
336256fc71 | ||
|
|
49a7da6393 | ||
|
|
a8c645f00d | ||
|
|
62d8cb0b25 | ||
|
|
f5028a4937 | ||
|
|
203612853b | ||
|
|
8e8e95cd2d | ||
|
|
696e6cb84b | ||
|
|
67940476af | ||
|
|
0dd9d2b460 | ||
|
|
6b2f2d0664 | ||
|
|
636bfdb530 | ||
|
|
c0d6618808 | ||
|
|
e21a3347ac | ||
|
|
59a68ee981 | ||
|
|
7a072746d9 | ||
|
|
a6799dd29b | ||
|
|
163ecb160a | ||
|
|
f00d1f9505 | ||
|
|
87b489a541 | ||
|
|
f670ade2ee | ||
|
|
b5508c1152 | ||
|
|
564c258c86 | ||
|
|
745ff1a270 | ||
|
|
e727ee6d4a | ||
|
|
e6a39a8255 | ||
|
|
43bff5c34d | ||
|
|
c046a1b474 | ||
|
|
209e3f03c1 | ||
|
|
dbf05a1419 | ||
|
|
5af35b6771 | ||
|
|
00abba11ae | ||
|
|
d268d94f76 | ||
|
|
76af3e3077 | ||
|
|
54bade668e | ||
|
|
5a3ec8f407 | ||
|
|
c043664ad6 | ||
|
|
7e9ca6fbb6 | ||
|
|
e9a82652a0 | ||
|
|
db2e6b6973 | ||
|
|
da9278ad8d | ||
|
|
5a9307e9a7 | ||
|
|
f31fd622dd | ||
|
|
6723157ca5 | ||
|
|
956448a1a5 | ||
|
|
4be675f977 | ||
|
|
7924051c0d | ||
|
|
83b5f6ef2d | ||
|
|
0f26d62a0a | ||
|
|
a9f11256cd | ||
|
|
ead0547d59 | ||
|
|
89e29bce62 | ||
|
|
058db5d5d0 | ||
|
|
76aa409f89 | ||
|
|
923d0497e6 | ||
|
|
dd4f4b83fc | ||
|
|
c2bed82db5 | ||
|
|
9a444da343 | ||
|
|
9dd6a77c76 | ||
|
|
895725df64 | ||
|
|
6f07576748 | ||
|
|
550a11962e | ||
|
|
c3883cdad0 | ||
|
|
e9e2cd614d | ||
|
|
55e1759b47 | ||
|
|
33f5215e6d | ||
|
|
5459a646b3 | ||
|
|
6229f99a2e | ||
|
|
0e5b95e3aa | ||
|
|
72d7c1ba54 | ||
|
|
ee9a2ee03d | ||
|
|
6bfbcc4aa9 | ||
|
|
a9d7ed50b7 | ||
|
|
bc77ebc10c | ||
|
|
cbdce79d7d | ||
|
|
46dfa064d0 | ||
|
|
0478af2564 | ||
|
|
750388a425 | ||
|
|
ea9155b903 | ||
|
|
d34f228d2f | ||
|
|
093043750b | ||
|
|
4fb0c246db | ||
|
|
5e951f27c9 | ||
|
|
49253964d8 | ||
|
|
4ff1d0c2e1 | ||
|
|
2385011f96 | ||
|
|
7527f9326c | ||
|
|
9c7b80f066 | ||
|
|
48facc0978 | ||
|
|
22a6c4e8af | ||
|
|
bd6cfa6461 | ||
|
|
c63dca1c0d | ||
|
|
c6af151bf3 | ||
|
|
ccc20a9716 | ||
|
|
47605583d1 | ||
|
|
58e83c11f0 | ||
|
|
836a4eb892 | ||
|
|
6d50a747e3 | ||
|
|
4344af1f02 | ||
|
|
6510d83524 | ||
|
|
6d01193e1e | ||
|
|
8c3d6d05ab | ||
|
|
733a064c79 | ||
|
|
8715f6a301 | ||
|
|
b51725633e | ||
|
|
5ec11c61bd | ||
|
|
ab038a4d46 | ||
|
|
a976a7affb | ||
|
|
2f76684113 | ||
|
|
1ad7f12e2d | ||
|
|
017b83d375 | ||
|
|
650b443fd0 | ||
|
|
8aa1509f47 | ||
|
|
b21bf2d544 | ||
|
|
777bd60f88 | ||
|
|
7889db43a8 | ||
|
|
ae3aa20508 | ||
|
|
84e754dd10 | ||
|
|
b9618d66f2 | ||
|
|
daa7b20e4a | ||
|
|
48a7254aa3 | ||
|
|
2bc63b37e4 | ||
|
|
33afab7294 | ||
|
|
8010a82776 | ||
|
|
048b7bd32f | ||
|
|
28fa0b070d | ||
|
|
dc0be93b25 | ||
|
|
5e49d2d8d6 | ||
|
|
1d8efe5f9d | ||
|
|
8b791b68d3 | ||
|
|
521174f911 | ||
|
|
a6f7bd9099 | ||
|
|
fed964e0f7 | ||
|
|
77b4f3e930 | ||
|
|
351b8c2469 | ||
|
|
ee9f65d4a3 | ||
|
|
a1a69f62e1 | ||
|
|
ff52fec663 | ||
|
|
5743d30851 | ||
|
|
de02061b5e | ||
|
|
b64c38809e | ||
|
|
a163db485b | ||
|
|
47f7507af3 | ||
|
|
568e55e373 | ||
|
|
79e722b5ff | ||
|
|
415252a5b2 | ||
|
|
307bb7aeec | ||
|
|
397da91ab4 | ||
|
|
fdd0c25a25 | ||
|
|
d691e9f39d | ||
|
|
a5cbe19d23 | ||
|
|
5661124d86 | ||
|
|
1346e163e9 | ||
|
|
d5626bfe52 | ||
|
|
0900c13fa1 | ||
|
|
5019f200b7 | ||
|
|
3b41ded045 | ||
|
|
9f84b84819 | ||
|
|
f61f3af687 | ||
|
|
0a6f7ac817 | ||
|
|
153e6c5f1b | ||
|
|
e24d96da6f | ||
|
|
59e5099ed6 | ||
|
|
b8e6e5df61 | ||
|
|
16851a457e | ||
|
|
1c5bb605c3 | ||
|
|
dc12d58054 | ||
|
|
120e0f6971 | ||
|
|
b9136e4e98 | ||
|
|
197b97d0db | ||
|
|
912136d174 | ||
|
|
653c85c58d | ||
|
|
638c99981d | ||
|
|
71e61abcd6 | ||
|
|
fa1d440bb0 | ||
|
|
f0064e35bc | ||
|
|
88d208268a | ||
|
|
6aa90a44f7 | ||
|
|
3c9322ee08 | ||
|
|
b2f47e6b70 | ||
|
|
c905a870e0 | ||
|
|
b2360e42c6 | ||
|
|
0da621745a | ||
|
|
d8fc3851a7 | ||
|
|
edd3fb3440 | ||
|
|
a105c017d5 | ||
|
|
dd1034e37b | ||
|
|
41f16a54de | ||
|
|
b91510efb3 | ||
|
|
745d8122f5 | ||
|
|
98e4f7409b | ||
|
|
cdb3971b8d | ||
|
|
d01b8c7ad1 | ||
|
|
7c35b6e95a | ||
|
|
86b35fc43d | ||
|
|
5b2c8ac337 | ||
|
|
734d4a912b | ||
|
|
4386d3169a | ||
|
|
35348f1150 | ||
|
|
36b27458b6 | ||
|
|
bbb2153112 | ||
|
|
9ec1d8f16b | ||
|
|
e1858df645 | ||
|
|
3b1066e16f | ||
|
|
75709a7812 | ||
|
|
81c68e90cb | ||
|
|
bc9110b344 | ||
|
|
89d5618232 | ||
|
|
1e8b844eac | ||
|
|
3fc278c7b7 | ||
|
|
db546412f1 | ||
|
|
3b42b604e1 | ||
|
|
f22caed088 | ||
|
|
1f4e611629 | ||
|
|
8879593381 | ||
|
|
22b7086bea | ||
|
|
c097841d78 | ||
|
|
44e4ffbe62 | ||
|
|
84f60f63b8 | ||
|
|
572f358bda | ||
|
|
46df7726c3 | ||
|
|
3abfaf1bca | ||
|
|
f119afe436 | ||
|
|
94908bc599 | ||
|
|
cabcfc7136 | ||
|
|
d2c6305548 | ||
|
|
414af6a5d5 | ||
|
|
ecab13af57 | ||
|
|
ea9ed841ee | ||
|
|
47f9aece38 | ||
|
|
6dc64cf2f6 | ||
|
|
832582caa9 | ||
|
|
828661e9de | ||
|
|
567f3fd3cd | ||
|
|
52f78ee4ed | ||
|
|
9dcd8dc419 | ||
|
|
6029b6d67f | ||
|
|
9d744580a1 | ||
|
|
b295f51c29 | ||
|
|
5c6aea0d50 | ||
|
|
99bf50ee52 | ||
|
|
f48a19a3bc | ||
|
|
fed11db92e | ||
|
|
23fb15fe78 | ||
|
|
7a533f6053 | ||
|
|
a292ff4287 | ||
|
|
29329383e4 | ||
|
|
fefdad5335 | ||
|
|
982f9ce8fb | ||
|
|
5c6d4b9ac2 | ||
|
|
49954f5c07 | ||
|
|
0b837925a2 | ||
|
|
54dd67a435 | ||
|
|
18ddc040d1 | ||
|
|
aeb28f67e4 | ||
|
|
54b892cd29 | ||
|
|
2e28525c4b | ||
|
|
8aa8de570f | ||
|
|
6723479c32 | ||
|
|
e318b6a113 | ||
|
|
df44f82198 | ||
|
|
97d54868e9 | ||
|
|
65e65ba308 | ||
|
|
2056d5e350 | ||
|
|
8b3b72243f | ||
|
|
814146f227 | ||
|
|
511983e1ea | ||
|
|
13e5df62c9 | ||
|
|
8debf8caf8 | ||
|
|
eab90cac05 | ||
|
|
ce401b01b6 | ||
|
|
271dcd46bc | ||
|
|
e19bd9d434 | ||
|
|
c1a7b452e0 | ||
|
|
e50ff6b0a5 | ||
|
|
34ddb92e4d | ||
|
|
35b16c7292 | ||
|
|
931fc93b4b | ||
|
|
35ecd26634 | ||
|
|
ac3bb37c36 | ||
|
|
17b8b285a3 | ||
|
|
788bf383aa | ||
|
|
8d0b889f3c | ||
|
|
d250fb655d | ||
|
|
aacd9dc62c | ||
|
|
061c55614b | ||
|
|
41c6887f33 | ||
|
|
b427185fac | ||
|
|
6fa14accfe | ||
|
|
1b8933cd84 | ||
|
|
e6261a6bf8 | ||
|
|
0a76647175 | ||
|
|
787706b1f7 | ||
|
|
94665e8055 | ||
|
|
b24770629e | ||
|
|
a09bd09a0e | ||
|
|
74eb79de17 | ||
|
|
988df8742c | ||
|
|
10c41bf443 | ||
|
|
bb30876557 | ||
|
|
81c24b3de1 | ||
|
|
4e1f734af7 | ||
|
|
2f726cf7f2 | ||
|
|
e726d16094 | ||
|
|
5bda5124e6 | ||
|
|
1a66b7c4c3 | ||
|
|
da86dee981 | ||
|
|
6caf0fc1cc | ||
|
|
8d28976b0d | ||
|
|
26e972314e | ||
|
|
8a582f8872 | ||
|
|
ca04504573 | ||
|
|
80360214df | ||
|
|
c69eae486e | ||
|
|
57bebd3fb6 | ||
|
|
329dac77ee | ||
|
|
e5dabc63c2 | ||
|
|
f652135e19 | ||
|
|
6bf7d8b111 | ||
|
|
004ad0eb8c | ||
|
|
989034c799 | ||
|
|
c2334ce80a | ||
|
|
6d59fe3080 | ||
|
|
9c01256029 | ||
|
|
e33c863162 | ||
|
|
787a9c0083 | ||
|
|
c75c22955c | ||
|
|
5afb5d24d8 | ||
|
|
134cc34d74 | ||
|
|
3397d6c907 | ||
|
|
f8cf185db9 | ||
|
|
735935c0c4 | ||
|
|
fd3beaf2b9 | ||
|
|
034fab480d | ||
|
|
17432d1f94 | ||
|
|
62c6d8e42d | ||
|
|
14e057cf05 | ||
|
|
982c9bf964 | ||
|
|
b4aba3d263 | ||
|
|
e2eabfc141 | ||
|
|
9f9d57b9a9 | ||
|
|
236e3c7e61 | ||
|
|
2160844ad0 | ||
|
|
51475d600c | ||
|
|
149f7a1d9d | ||
|
|
56ef7ae60c | ||
|
|
7ec6586c4a | ||
|
|
074a6bfa87 | ||
|
|
965fec5927 | ||
|
|
58b87aa999 | ||
|
|
b0b16b52ee | ||
|
|
9ab3f7e5aa | ||
|
|
61210955bd | ||
|
|
28f73d0a76 | ||
|
|
99fb1a4c5f | ||
|
|
42cf80106f | ||
|
|
bcb9cfd2fe | ||
|
|
1d57568322 | ||
|
|
d56c041c4a | ||
|
|
be48ed5589 | ||
|
|
897c296fbe | ||
|
|
d25fe028b8 | ||
|
|
d9ade96fad | ||
|
|
7fd05b7ca6 | ||
|
|
0eec5383ed | ||
|
|
f474d2c834 | ||
|
|
e40e5e6a99 | ||
|
|
82d20efa8d | ||
|
|
8c7716428d | ||
|
|
9ac8a4211e | ||
|
|
23750bab55 | ||
|
|
22aeddc655 | ||
|
|
ab69cd8027 | ||
|
|
f3d35e9537 | ||
|
|
4cb72c1998 | ||
|
|
12ccc10e83 | ||
|
|
ec631f3499 | ||
|
|
75d2ea1519 | ||
|
|
14e9a94061 | ||
|
|
d3284ab9f6 | ||
|
|
775df43470 | ||
|
|
e2e6024e8f | ||
|
|
d89b51f17d | ||
|
|
aa626947ed | ||
|
|
630693d64e | ||
|
|
f2be23274e | ||
|
|
2972780bed | ||
|
|
cf3d2c3def | ||
|
|
1f8751054c | ||
|
|
cc90e6d479 | ||
|
|
76dd3c86f2 | ||
|
|
91468fa2f9 | ||
|
|
739219c57b | ||
|
|
f56e1933a6 | ||
|
|
8e4aec9c4d | ||
|
|
e6e29aaf1e | ||
|
|
1ac5f54e9e | ||
|
|
bf983658c8 | ||
|
|
e17286eb9f | ||
|
|
19c17e96de | ||
|
|
b45368342d | ||
|
|
11e071289b | ||
|
|
dcea8ae64f | ||
|
|
c9480ef17d | ||
|
|
a9517096f9 | ||
|
|
fc3f03425e | ||
|
|
8d43046f13 | ||
|
|
cd6880aff4 | ||
|
|
ccefa45fb0 | ||
|
|
b721d7a10f | ||
|
|
ef85d1d83e | ||
|
|
d03ceb2a23 | ||
|
|
90198be1cb | ||
|
|
f640494c1f | ||
|
|
77b9feb765 | ||
|
|
99139dfcca | ||
|
|
a241f63ddc | ||
|
|
70507258ae | ||
|
|
51a8144f49 | ||
|
|
54ad9ba243 | ||
|
|
a7f7a09418 | ||
|
|
44897fb371 | ||
|
|
bb6a748167 | ||
|
|
a3ee43b31c | ||
|
|
12dd16d4bf | ||
|
|
a5b9e57576 | ||
|
|
6c194d257c | ||
|
|
21f61d46da | ||
|
|
6ac8a9d440 | ||
|
|
c321402414 | ||
|
|
ec80fc9f3f | ||
|
|
6bfd57097f | ||
|
|
6f5df6a671 | ||
|
|
1baf3190cd | ||
|
|
66c29c49e5 | ||
|
|
e5d6740555 | ||
|
|
30b5dd63e4 | ||
|
|
f0aa8d73ea | ||
|
|
8a0761cad8 | ||
|
|
322d76b713 | ||
|
|
4f56bf3c3e | ||
|
|
942eed402a | ||
|
|
24c72650fb | ||
|
|
f5959c8829 | ||
|
|
4a8299d9dc | ||
|
|
560d388df4 | ||
|
|
7621ebed42 | ||
|
|
5447c71790 | ||
|
|
c5241eaaf6 | ||
|
|
9266b55ddf | ||
|
|
1bc1f66613 | ||
|
|
7795a690ed | ||
|
|
d498ac89f2 | ||
|
|
7683e86d8b | ||
|
|
ebb763db03 | ||
|
|
920491ddb2 | ||
|
|
761728ac43 | ||
|
|
d8ddb9dc82 | ||
|
|
405f153439 | ||
|
|
f789a35901 | ||
|
|
2842018c2f | ||
|
|
51641cc704 | ||
|
|
729f5ed5e4 | ||
|
|
46c6b2168c | ||
|
|
1f955904a4 | ||
|
|
03ff33acaf | ||
|
|
46035e76cc | ||
|
|
7c073f76ae | ||
|
|
558c89cc30 | ||
|
|
222d41c84a | ||
|
|
12a62f4607 | ||
|
|
f561768c67 | ||
|
|
5ced5ce253 | ||
|
|
55781e911e | ||
|
|
ee3c4a4124 | ||
|
|
6815e56e57 | ||
|
|
6c744443fb | ||
|
|
3c37047afb | ||
|
|
f31f09d77a | ||
|
|
c1bb05c0a4 | ||
|
|
f5b8d8a60c | ||
|
|
8218cfc72c | ||
|
|
de508ee68f | ||
|
|
a932111040 | ||
|
|
8c437eb815 | ||
|
|
1ad4815983 | ||
|
|
00706daae5 | ||
|
|
c75cdc6d28 | ||
|
|
b9fae7fb7d | ||
|
|
e74a3da5cd | ||
|
|
08cf986cae | ||
|
|
ba01ed0153 | ||
|
|
19ac8bd9b2 | ||
|
|
ab79ccb02b | ||
|
|
6ba8a6a600 | ||
|
|
377fb2329c | ||
|
|
285ee665ee | ||
|
|
d862498516 | ||
|
|
b09b03a427 | ||
|
|
4ef2ede4cf | ||
|
|
0efaa11553 | ||
|
|
ea87b958ef | ||
|
|
ff62f075d0 | ||
|
|
348744086d | ||
|
|
d1d4f79973 | ||
|
|
2a3f7f8cb3 | ||
|
|
7eaef11a84 | ||
|
|
efe93d0117 | ||
|
|
7d12e18b98 | ||
|
|
de6bca424f | ||
|
|
03268a5575 | ||
|
|
1251680a1c | ||
|
|
f8d55ba837 | ||
|
|
cd0e49914b | ||
|
|
700e845727 | ||
|
|
bab8120814 | ||
|
|
c6f1f19866 | ||
|
|
745592f507 | ||
|
|
afec65eb56 | ||
|
|
d6661da0a7 | ||
|
|
dcc4732748 | ||
|
|
6a5bf08d55 | ||
|
|
d52f5e6e03 | ||
|
|
eb62356313 | ||
|
|
919dc248e3 | ||
|
|
ca5db2bff8 | ||
|
|
658698ed2f | ||
|
|
7f391dacbd | ||
|
|
09598e0ced | ||
|
|
6af2696f6a | ||
|
|
69dac77932 | ||
|
|
90e0bf95d1 | ||
|
|
930bfb26f4 | ||
|
|
7e788f212a | ||
|
|
8f99530795 | ||
|
|
434af4b998 | ||
|
|
a011728cc9 | ||
|
|
e584139b6d | ||
|
|
a7c8526f3e | ||
|
|
459256e83a | ||
|
|
21f3f52c7b | ||
|
|
568e43cf3d | ||
|
|
e004e540d7 | ||
|
|
cac6172344 | ||
|
|
8dbfb87246 | ||
|
|
2764e0e5fa | ||
|
|
fa5cdc3afa | ||
|
|
d8cbc7ddd8 | ||
|
|
8dae5ec47a | ||
|
|
bdf3a2dfe8 | ||
|
|
693b82e47d | ||
|
|
888be0fd5e | ||
|
|
9f97ed331b | ||
|
|
e8ea2af298 | ||
|
|
785c2e36c6 | ||
|
|
ee043e67a4 | ||
|
|
d824b41bbb | ||
|
|
a9df64f861 | ||
|
|
6c3b449f74 | ||
|
|
536c6a7b2c | ||
|
|
e90e0fc615 | ||
|
|
b704121dcb | ||
|
|
5e0886d744 | ||
|
|
f819e4829b | ||
|
|
8873948e9e | ||
|
|
a25ea14436 | ||
|
|
1a922f05c1 | ||
|
|
e8268b1dab | ||
|
|
4cb78f55d1 | ||
|
|
7a516930b1 | ||
|
|
8091bec6bf | ||
|
|
7baf42b138 | ||
|
|
ab9835b896 | ||
|
|
9d142c5607 | ||
|
|
92b68bdb8f | ||
|
|
a86bb9f6e6 | ||
|
|
09db6dc424 | ||
|
|
3b62526267 | ||
|
|
5d80031a40 | ||
|
|
c9777af91c | ||
|
|
656e4d529c | ||
|
|
a894873d6b | ||
|
|
2d1a97e042 | ||
|
|
ece3f96867 | ||
|
|
65a48b324d | ||
|
|
53bf622065 | ||
|
|
075be18123 | ||
|
|
044390b4b4 | ||
|
|
37d03aaebe | ||
|
|
51a51833d4 | ||
|
|
a8cfc1ef7a | ||
|
|
1d238c8315 | ||
|
|
4f96744ff2 | ||
|
|
e9783ecccc | ||
|
|
6342cc41ac | ||
|
|
c554390de5 | ||
|
|
4d8bbe3023 | ||
|
|
969076f1ef | ||
|
|
20032def7e | ||
|
|
94706460c0 | ||
|
|
b7506229f8 | ||
|
|
58c6df3537 | ||
|
|
235a1f36ec | ||
|
|
b53821976e | ||
|
|
4355881fb2 | ||
|
|
cf50d558ba | ||
|
|
7488dc3ebb | ||
|
|
b449847ad1 | ||
|
|
9785745384 | ||
|
|
56ffa7905e | ||
|
|
216433aa2d | ||
|
|
122fbbed22 | ||
|
|
042c671bd4 | ||
|
|
38fdc11917 | ||
|
|
2f4730a9c6 | ||
|
|
3759d32c89 | ||
|
|
93c2ca8df1 | ||
|
|
832aac0e6e | ||
|
|
6967d4e762 | ||
|
|
3c70681537 | ||
|
|
0ce08319e7 | ||
|
|
17e0489164 | ||
|
|
7953cc416b | ||
|
|
a670ac0aea | ||
|
|
ef30018008 | ||
|
|
66810c8b75 | ||
|
|
2bba55ebd5 | ||
|
|
b977ae4d3b | ||
|
|
d4f5e854c5 | ||
|
|
837f621633 | ||
|
|
a781b4a387 | ||
|
|
a73a75a7f8 | ||
|
|
17d1db913f | ||
|
|
a924509e92 | ||
|
|
04b4321ea1 | ||
|
|
1f9ebc7295 | ||
|
|
6d88111dfc | ||
|
|
184e52b4ec | ||
|
|
2a3cc3d88c | ||
|
|
ffa1aae27c | ||
|
|
7cd842df19 | ||
|
|
e399e4960c | ||
|
|
5c193a47eb | ||
|
|
b63c02cb10 | ||
|
|
09418f1a5d | ||
|
|
fa4491340a | ||
|
|
192814650d | ||
|
|
5f1addc54d | ||
|
|
9ffc8c6800 | ||
|
|
64cd8084ea | ||
|
|
2e6c9d408c | ||
|
|
f3bea49f61 | ||
|
|
48fdae754e | ||
|
|
64f2ee67b2 | ||
|
|
19d34779a0 | ||
|
|
76a6a0cf75 | ||
|
|
da47d97cd0 | ||
|
|
f59441005e | ||
|
|
e30347a11f | ||
|
|
8ac079fb72 | ||
|
|
4295f08a84 | ||
|
|
bd8eb97d46 | ||
|
|
329f656c40 | ||
|
|
f2c7a26ce0 | ||
|
|
930e25e64a | ||
|
|
963269a685 | ||
|
|
de23ef5d35 | ||
|
|
208ae6183c | ||
|
|
761ae4b816 | ||
|
|
ff308641e1 | ||
|
|
a2094ddf75 | ||
|
|
0391ed3e63 | ||
|
|
b6b3997498 | ||
|
|
9f77c0c9b7 | ||
|
|
dc4812a86e | ||
|
|
fc83b0d95b | ||
|
|
8e70568e32 | ||
|
|
f0e3a3a30c | ||
|
|
cf44efa02e | ||
|
|
ddc59dfb97 | ||
|
|
ef0a3396d7 | ||
|
|
8bf68aa020 | ||
|
|
02a90856ff | ||
|
|
8716695d4e | ||
|
|
9a1bb69cd8 | ||
|
|
6caad0daf6 | ||
|
|
6508f1541b | ||
|
|
6809b38821 | ||
|
|
7f9a3efa24 | ||
|
|
8ecea9792b | ||
|
|
7c85a03b42 | ||
|
|
d4d71b90eb | ||
|
|
fbf614a8df | ||
|
|
c02329e4b1 | ||
|
|
5aba065413 | ||
|
|
6e65096bb4 | ||
|
|
b39f25ed51 | ||
|
|
3925d5ec27 | ||
|
|
381b59acd4 | ||
|
|
5b01d923d3 | ||
|
|
108e5a2f5e | ||
|
|
e21d17a482 | ||
|
|
d4ea8c56c3 | ||
|
|
783ad64353 | ||
|
|
ac918c1a81 | ||
|
|
0f00074f77 | ||
|
|
eb20ec1556 | ||
|
|
32f9da0724 | ||
|
|
968be8eb8f | ||
|
|
d7e05cde42 | ||
|
|
557b86a7a9 | ||
|
|
f144dda8b5 | ||
|
|
80aed31135 | ||
|
|
2a21e7c2cb | ||
|
|
d281277797 | ||
|
|
fb807bcde4 | ||
|
|
ebf6f6782f | ||
|
|
008df649f0 | ||
|
|
a810e704ad | ||
|
|
d0b3167956 | ||
|
|
a726ecbdd8 | ||
|
|
da6a8f806d | ||
|
|
b47f44cacd | ||
|
|
0cc59adad7 | ||
|
|
6c076863db | ||
|
|
ddb6e74955 | ||
|
|
2094bc3d80 | ||
|
|
c922007d21 | ||
|
|
b1435c1264 | ||
|
|
be5e1648e0 | ||
|
|
a270feb1eb | ||
|
|
103b8cd13a | ||
|
|
e6dd36283d | ||
|
|
aae2d0a5dc | ||
|
|
fda1d4cc2b | ||
|
|
5be92460c1 | ||
|
|
15ce31ea3a | ||
|
|
35e5a669a0 | ||
|
|
8b8c74cf93 | ||
|
|
cc43524b4c | ||
|
|
f87d297155 | ||
|
|
605d50166a | ||
|
|
de6681d00a | ||
|
|
7632e33975 | ||
|
|
5993a596e8 | ||
|
|
2294b6babb | ||
|
|
c38f866363 | ||
|
|
511b112ac7 | ||
|
|
8cd0618e85 | ||
|
|
b4b589bfc2 | ||
|
|
cb69eb7c0f | ||
|
|
7d83cd89f2 | ||
|
|
b2dca0a34f | ||
|
|
3bd73961d7 | ||
|
|
67f574b5d8 | ||
|
|
f9b70a37aa | ||
|
|
d4047e1413 | ||
|
|
80f5b4c3b7 | ||
|
|
4668a6d8c0 | ||
|
|
e6f076306f | ||
|
|
b73dc127a3 | ||
|
|
8c8a2311d6 | ||
|
|
0555fb22ca | ||
|
|
85cde62039 | ||
|
|
46a2648d15 | ||
|
|
e55f6ecd6b | ||
|
|
c71fee3fed | ||
|
|
4d6c25c9d3 | ||
|
|
6ed4e2d946 | ||
|
|
6b4242478f | ||
|
|
ef5478279b | ||
|
|
62bb8bce1c | ||
|
|
83a5c3af8a | ||
|
|
f78abd61d4 | ||
|
|
209c6fa1c1 | ||
|
|
6e3c600a49 | ||
|
|
b1cda57174 | ||
|
|
412d92e782 | ||
|
|
c0703a6a5e | ||
|
|
64bd306c6d | ||
|
|
6be49f898c | ||
|
|
59bc73656f | ||
|
|
bed22f51b4 | ||
|
|
c1362a02f3 | ||
|
|
859a3cbe6e | ||
|
|
a6d82f44b3 | ||
|
|
e66e17a41a | ||
|
|
cfa6d7080c | ||
|
|
01ceedccd5 | ||
|
|
ed28af7c73 | ||
|
|
74cf91f99e | ||
|
|
44479930df | ||
|
|
cb1f54aac4 | ||
|
|
22328772ca | ||
|
|
52bd079c0a |
13
.gitignore
vendored
@@ -1,5 +1,4 @@
|
|||||||
##Packr, build stuff
|
logs/
|
||||||
|
|
||||||
/core/assets/mindustry-saves/
|
/core/assets/mindustry-saves/
|
||||||
/core/assets/mindustry-maps/
|
/core/assets/mindustry-maps/
|
||||||
/core/assets/bundles/output/
|
/core/assets/bundles/output/
|
||||||
@@ -12,19 +11,27 @@
|
|||||||
/desktop/gifexport/
|
/desktop/gifexport/
|
||||||
/core/lib/
|
/core/lib/
|
||||||
/core/assets-raw/sprites/generated/
|
/core/assets-raw/sprites/generated/
|
||||||
|
/core/assets-raw/sprites_out/
|
||||||
/annotations/build/
|
/annotations/build/
|
||||||
/kryonet/build/
|
/annotations/out/
|
||||||
|
/net/build/
|
||||||
/tools/build/
|
/tools/build/
|
||||||
/tests/build/
|
/tests/build/
|
||||||
/server/build/
|
/server/build/
|
||||||
/test_files/
|
/test_files/
|
||||||
/annotations/build/
|
/annotations/build/
|
||||||
|
/desktop-sdl/build/
|
||||||
|
desktop-sdl/build/
|
||||||
/android/assets/mindustry-maps/
|
/android/assets/mindustry-maps/
|
||||||
/android/assets/mindustry-saves/
|
/android/assets/mindustry-saves/
|
||||||
/core/assets/gifexport/
|
/core/assets/gifexport/
|
||||||
/core/assets/version.properties
|
/core/assets/version.properties
|
||||||
/core/assets/locales
|
/core/assets/locales
|
||||||
/ios/src/io/anuke/mindustry/gen/
|
/ios/src/io/anuke/mindustry/gen/
|
||||||
|
/core/src/io/anuke/mindustry/gen/
|
||||||
|
ios/robovm.properties
|
||||||
|
packr-out/
|
||||||
|
config/
|
||||||
*.gif
|
*.gif
|
||||||
|
|
||||||
version.properties
|
version.properties
|
||||||
|
|||||||
28
.travis.yml
@@ -1,28 +1,28 @@
|
|||||||
language: android
|
|
||||||
jdk:
|
jdk:
|
||||||
- openjdk8
|
- openjdk8
|
||||||
android:
|
|
||||||
components:
|
|
||||||
- android-28
|
|
||||||
- extra-google-google_play_services
|
|
||||||
- extra-google-m2repository
|
|
||||||
- extra-android-m2repository
|
|
||||||
- addon-google_apis-google-28
|
|
||||||
- build-tools-28.0.3
|
|
||||||
script:
|
script:
|
||||||
|
- git clone --depth=1 --branch=master https://github.com/Anuken/Arc ../Arc
|
||||||
- "./gradlew test"
|
- "./gradlew test"
|
||||||
- "./gradlew desktop:dist"
|
- "./gradlew desktop:dist -Pbuildversion=${TRAVIS_TAG:1}"
|
||||||
- "./gradlew server:dist"
|
- "./gradlew server:dist -Pbuildversion=${TRAVIS_TAG:1}"
|
||||||
|
|
||||||
deploy:
|
deploy:
|
||||||
provider: releases
|
- provider: releases
|
||||||
skip_cleanup: true
|
skip_cleanup: true
|
||||||
draft: false
|
draft: false
|
||||||
api_key:
|
api_key:
|
||||||
secure: Cv5wFtWt62/A24EvSEQvMow7gKPbZ3oATEFPuSghhB2TQz1dA40Zee3Qvk4LFlpLrhYo4K0ZSczCZRGpR+hCd8+Dpww52bheYEvWuh3ZQfvu/fXtEx2j5PwP1qMpmIgSxETV/gkD7l9FImdh0VzktYiAvQfmi0bEocG9/D4QwjFpNat7iwBdcMiw1MvAygpdIWRsjiw0RKlB2mWarmoHhQ7Gu7qlU3j50uaEvcrtmU0pBUPggNQwQRv32i9NPvNFxrqqlUjDLIS8JFea99zCkp8BwYqbEvBIMzd+Qip1/stLJJA3+cDUClbsDtg8rAVetzpOrdLEEBmqShFe5MDl2yEHcsgpN9CFsyTaUfvB3P3rVjizvycMm42IsUkXQiarm5xTQ/TIA8Rd8AHiSKuweNCg1Fd5SFaRtKy8JVLXuxyfUccmyje6hhz2L4lS2Wfj3mAG7sqZUCXhWP79EKdGkiPOjKv4CwXEKmuH3BMVqPlNUZJr9Eg3sV1FG0h2l+MVOOnR635qdUbb49sYojYxVruMLX0BH1c4ZCu230m8CUoWA1Em1QNI75ya7+9Y5T6AsgWDVpBvdUo9fWNbdp+VQ0GskFQsJD5wtnxbcbHeFiERAgGBm7z6qt9u9LrQpBH+dsW52ADvYsu3L4nQEa+sdMHwTTwmGY+iUvsxu0DqxGg=
|
secure: Cv5wFtWt62/A24EvSEQvMow7gKPbZ3oATEFPuSghhB2TQz1dA40Zee3Qvk4LFlpLrhYo4K0ZSczCZRGpR+hCd8+Dpww52bheYEvWuh3ZQfvu/fXtEx2j5PwP1qMpmIgSxETV/gkD7l9FImdh0VzktYiAvQfmi0bEocG9/D4QwjFpNat7iwBdcMiw1MvAygpdIWRsjiw0RKlB2mWarmoHhQ7Gu7qlU3j50uaEvcrtmU0pBUPggNQwQRv32i9NPvNFxrqqlUjDLIS8JFea99zCkp8BwYqbEvBIMzd+Qip1/stLJJA3+cDUClbsDtg8rAVetzpOrdLEEBmqShFe5MDl2yEHcsgpN9CFsyTaUfvB3P3rVjizvycMm42IsUkXQiarm5xTQ/TIA8Rd8AHiSKuweNCg1Fd5SFaRtKy8JVLXuxyfUccmyje6hhz2L4lS2Wfj3mAG7sqZUCXhWP79EKdGkiPOjKv4CwXEKmuH3BMVqPlNUZJr9Eg3sV1FG0h2l+MVOOnR635qdUbb49sYojYxVruMLX0BH1c4ZCu230m8CUoWA1Em1QNI75ya7+9Y5T6AsgWDVpBvdUo9fWNbdp+VQ0GskFQsJD5wtnxbcbHeFiERAgGBm7z6qt9u9LrQpBH+dsW52ADvYsu3L4nQEa+sdMHwTTwmGY+iUvsxu0DqxGg=
|
||||||
file:
|
file:
|
||||||
- "desktop/build/libs/desktop-release.jar"
|
- desktop/build/libs/desktop-release.jar
|
||||||
- "server/build/libs/server-release.jar"
|
- server/build/libs/server-release.jar
|
||||||
on:
|
on:
|
||||||
repo: Anuken/Mindustry
|
repo: Anuken/Mindustry
|
||||||
tags: true
|
tags: true
|
||||||
|
- provider: script
|
||||||
|
script: bash update_wiki.sh
|
||||||
|
on:
|
||||||
|
repo: Anuken/Mindustry
|
||||||
|
tags: true
|
||||||
|
env:
|
||||||
|
global:
|
||||||
|
secure: TqlUl/ojjkCMVOGbCTKz7Cnr4F08UyWzY/CiJ0vvUOGJGZ1qm7XavAlDf5XT0egU4mvr37THubFO8vojbqmrmy0oZnYh3njKFA8axgyZ8PyKkjGHOfd0i6qyEWsOr9H90/2X8r3LwEeLaDFyHpu3wljIGBjweg53g2qwmDwCFa9UR80FJZ+xDB+rD6B3cXT0DTEkCoLZXLqXm0Y3HvBdSuBL1LR/FNb2BSxNq+tNLGiz1kdQZV5erausbbZypBoGxzz63xAnyz2kkFz73A8xQYVTzGbFodTPz7HM13GVZ5s43I03Y+HYyHBgBaSLziO2hi2kzVJccOwzBp7wS4fs1MqsFY5+IeWJ9k+hm89NiYT7+6zlEgoUMlIniny1qLqWTzx7btUeuC/y/h5TVBNgaV+z0jmHycHfeSyq5I+vmX4J8qe3wmaN8TcdqYKU5nIznOTk3CM5Fzu0Bs9vkCkOxmormmcjMFW1RbdOLc/hpZWZggsBA88sNEAI8eq+r5QEeqzeCx8YKoZDjdrsqvgLMc3El3gS9oMGxkn0Y/TEcqs9Tc4BXtTkqIA68hD0DYzlAxYjVbbkAI9Hh9lHNvV3Dr/oCkGXQ/HflM143kj1L3tSBZpqeqQE2XhngB5nqpS3OZTmZbMTQ8qD2luU18yaTGMLF5tJS/fdKPRx0gQ1kL8=
|
||||||
|
|||||||
33
README.md
@@ -1,40 +1,45 @@
|
|||||||

|

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