Compare commits

...

393 Commits
v45 ... v51

Author SHA1 Message Date
Anuken
c569232e74 Fixed multiblocks not accepting items 2018-08-15 19:38:13 -04:00
Anuken
14c526d0c4 Power distribution fix 2018-08-15 18:41:21 -04:00
Anuken
5c4ac6b702 Fixed major issue with Vector2.ZERO mutation 2018-08-15 18:37:20 -04:00
Anuken
d58cc18136 Fixed block targeting bug 2018-08-15 18:18:57 -04:00
Anuken
36c01fde94 Updated uCore / Minor server tweak 2018-08-15 17:46:33 -04:00
Anuken
d4d9d59fe4 Server sector commands / World data compression / Snapshot sent w/ world 2018-08-15 17:25:19 -04:00
Anuken
8dbd0a6130 Fixed drones repairing incorrect blocks 2018-08-15 16:28:00 -04:00
Anuken
3746344cba Crash fixes 2018-08-15 16:26:08 -04:00
Anuken
d07fd1bbfe Improved build sync 2018-08-15 15:16:56 -04:00
Anuken
02f95c0ed4 Merge remote-tracking branch 'origin/master' 2018-08-15 14:16:42 -04:00
Anuken
c98fcbd795 Turrets target blocks / Added core no-build radius 2018-08-15 14:13:50 -04:00
Anuken
d071877963 Merge pull request #186 from Leone25/patch-1
Big update for italian bundle
2018-08-15 13:12:18 -04:00
Anuken
0267cb4006 Conduit sprites improved / Fixed incorrect proximity update 2018-08-15 13:11:55 -04:00
Leone25
bf571e595c Update bundle_ita.properties 2018-08-15 19:05:18 +02:00
Anuken
c0cad70212 Merge remote-tracking branch 'origin/master' 2018-08-15 10:49:05 -04:00
Anuken
7bd6dbb4b4 Partial korean font PR revert / Crash fixes 2018-08-15 10:48:19 -04:00
Anuken
6d932e3d04 Merge pull request #185 from Prosta4okua/patch-19
Update bundle_ru.properties
2018-08-15 09:20:41 -04:00
Prosta4okua
e154b5179d Update bundle_ru.properties 2018-08-15 08:27:26 +03:00
Anuken
52110d6008 ok 2018-08-14 19:30:05 -04:00
Anuken
103b08fd1d Added build progress sync 2018-08-14 18:56:42 -04:00
Anuken
cb09d10e7f Merge remote-tracking branch 'origin/master' 2018-08-14 18:51:13 -04:00
Anuken
a041c1e60d Synced whole place queue / Fixed player flash desync 2018-08-14 18:51:06 -04:00
Anuken
586b4cf4bd Merge pull request #183 from cloud9350/master
Add korean chat fonts + fix typos
2018-08-14 18:32:52 -04:00
Leone25
d0ff149cca Update bundle_ita.properties 2018-08-14 21:07:39 +02:00
Anuken
f8ddc8325c Fixed puddle/IO crash / crafter storage / player NaN position / red tint 2018-08-14 12:24:04 -04:00
Anuken
59ec09e82c Crash fixes / Resource-steal fixed / No-build while shooting fixed 2018-08-14 12:16:21 -04:00
Anuken
2ae5c96690 Merge remote-tracking branch 'origin/master' 2018-08-14 10:42:09 -04:00
Anuken
fda9e6bb9c Various crashes fixed 2018-08-14 10:41:54 -04:00
Leone25
b70de81c2d Update bundle_ita.properties 2018-08-14 14:41:38 +02:00
Gureumi
5e89b2568f Add korean chat fonts + fix typos 2018-08-14 15:59:07 +09:00
Anuken
ac1d8215ff Merge pull request #182 from Prosta4okua/patch-18
[COMPLETE]Update bundle_ru.properties
2018-08-13 22:21:06 -04:00
Leone25
fefc734bfa Update bundle_ita.properties 2018-08-12 22:24:10 +02:00
Prosta4okua
7f8735842c Update bundle_ru.properties 2018-08-12 22:28:23 +03:00
Prosta4okua
a226983470 Update bundle_ru.properties 2018-08-12 19:19:07 +03:00
Prosta4okua
28526d0a12 Update bundle_ru.properties 2018-08-12 18:54:51 +03:00
Prosta4okua
913e005bae Update bundle_ru.properties 2018-08-12 10:44:56 +03:00
Prosta4okua
7bd9fd5bae Update bundle_ru.properties 2018-08-12 00:12:55 +03:00
Anuken
ef936214f0 Merge pull request #180 from Prosta4okua/patch-17
[Complete]Update bundle_uk_UA.properties
2018-08-10 10:20:43 -04:00
Anuken
18fce6b3e3 Merge pull request #179 from cloud9350/master
Change items name texts and update font
2018-08-10 09:12:52 -04:00
Prosta4okua
ecda4d74ab Update bundle_uk_UA.properties 2018-08-10 16:12:44 +03:00
Prosta4okua
31124037b5 Update bundle_uk_UA.properties 2018-08-10 16:07:46 +03:00
Prosta4okua
aaf95e0756 Update bundle_uk_UA.properties 2018-08-10 16:06:01 +03:00
Gureumi
804e311875 Update 2018-08-10 19:21:46 +09:00
Anuken
61ad9bc47d Merge remote-tracking branch 'origin/master' 2018-08-09 22:20:52 -04:00
Anuken
2b23b7876a Minor bugfix 2018-08-09 22:20:46 -04:00
Anuken
547d334f43 Merge pull request #178 from Leone25/patch-1
update italian boundle_ita
2018-08-09 19:29:34 -04:00
Leone25
7432dc115e Update bundle_ita.properties 2018-08-10 00:48:20 +02:00
Anuken
905defe8ce Merge pull request #177 from Prosta4okua/patch-15
Update bundle_ru.properties
2018-08-09 18:35:44 -04:00
Prosta4okua
0a8ff0cde7 Update bundle_ru.properties 2018-08-10 00:59:27 +03:00
Prosta4okua
bd5f44030e Update bundle_ru.properties 2018-08-10 00:53:41 +03:00
Anuken
79abb86262 Merge remote-tracking branch 'origin/master' 2018-08-09 17:45:09 -04:00
Anuken
fe6f98ec5a Minor bugfixes / Added block names to bundle/ Autogen ore names 2018-08-09 17:44:52 -04:00
Anuken
e39a856e54 Update TRANSLATING.md 2018-08-09 09:47:15 -04:00
Anuken
64e5f8155d Merge pull request #176 from cloud9350/patch-1
Update language ko file
2018-08-09 09:20:10 -04:00
Gureumi
8328b11f6b Update. 2018-08-09 19:54:09 +09:00
Anuken
15778b2ca5 Server hotfix 2018-08-08 22:37:52 -04:00
Anuken
b7842014c1 Fixed minor autotile bug 2018-08-08 22:29:56 -04:00
Anuken
a804053904 Typo fix / Biomatter compressor buffed 2018-08-08 21:10:57 -04:00
Anuken
2aee72b47b Improved host command 2018-08-08 20:57:24 -04:00
Anuken
0cb8c600b7 Merge remote-tracking branch 'origin/master' 2018-08-08 20:53:02 -04:00
Anuken
aa5348f37e Auto-play server sectors / Difficulty decrease / Improved d/c messages 2018-08-08 20:52:51 -04:00
Anuken
0736574a57 Merge pull request #174 from Prosta4okua/patch-13
[Сomlete]Update bundle_ru.properties
2018-08-08 20:07:23 -04:00
Anuken
d56365ce63 Merge pull request #175 from CinExPL/patch-1
Update bundle_pl.properties
2018-08-08 20:07:14 -04:00
Prosta4okua
c82d2f856a Update bundle_ru.properties 2018-08-09 00:02:22 +03:00
Prosta4okua
8432677826 Update bundle_ru.properties 2018-08-08 23:58:41 +03:00
Prosta4okua
0c0c6e5470 Update bundle_ru.properties 2018-08-08 23:56:42 +03:00
Anuken
57019b6e20 Fixed oil extractor desync / Buffed thermal genenerator / Typo fix 2018-08-08 16:00:33 -04:00
CinExPL
12ab2249b4 Update bundle_pl.properties 2018-08-08 21:10:42 +02:00
Anuken
22d0992d38 Merge remote-tracking branch 'origin/master' 2018-08-08 15:04:04 -04:00
Anuken
f8def04653 Overall difficulty decrease / Crash fix / Server fillitems command 2018-08-08 15:02:51 -04:00
Anuken
6349530fc5 Updated build.gradle 2018-08-08 14:42:10 -04:00
Anuken
ad83a7dcc3 Merge remote-tracking branch 'origin/master' 2018-08-08 12:37:46 -04:00
Anuken
cfc2239733 Minor iso changes 2018-08-08 12:37:29 -04:00
Anuken
91552a3a2b Various bugfixes 2018-08-08 12:22:47 -04:00
Anuken
4e3204bc6d All known crashes fixed 2018-08-08 11:18:30 -04:00
Anuken
a94998bd02 Merge remote-tracking branch 'origin/master' 2018-08-08 10:43:09 -04:00
Anuken
81c78eafa6 Biomass compressor fix / Crash fix / Removed spawners in waves 2018-08-08 10:43:03 -04:00
Prosta4okua
273523480f Update bundle_ru.properties 2018-08-08 08:34:44 +03:00
Anuken
b27fefae88 Misc fixes 2018-08-08 01:09:57 -04:00
Anuken
aa00a1b8d1 Minor save-time fix 2018-08-07 20:16:50 -04:00
Anuken
ba62e0eefc Fixed playtime not resetting on save exit 2018-08-07 19:46:05 -04:00
Anuken
cb16c75e11 Minor bundle fixes / Web build fixed 2018-08-07 19:36:56 -04:00
Anuken
3efed0ace3 Added sector loc display 2018-08-07 19:04:58 -04:00
Anuken
879fb8194f Further nerfed AI 2018-08-07 19:01:23 -04:00
Anuken
049dd89470 Fixed drone spam 2018-08-07 18:49:43 -04:00
Anuken
1f59d4354a Fixed retreat command, more pathfinding 2018-08-07 18:26:16 -04:00
Anuken
8dea45d9d5 More pathfinding fixes 2018-08-07 18:19:02 -04:00
Anuken
21ba6e257c Added indicator when core is under attack 2018-08-07 17:01:17 -04:00
Anuken
18ebda01a4 Drill balancing / More starting resources 2018-08-07 16:13:37 -04:00
Leone25
3acb843109 Update bundle_ita.properties 2018-08-07 21:48:42 +02:00
Leone25
1768aea66f Update bundle_ita.properties 2018-08-07 20:54:40 +02:00
Anuken
4b61f273d5 Targeting fixes / command center fixes 2018-08-07 11:59:16 -04:00
Anuken
a1dbbbdafc Crash fixes / 2x2 drills 2018-08-07 11:40:25 -04:00
Anuken
dcb840f290 Many bugfixes / Dagger unit buffed / Build times increased 2018-08-07 11:17:32 -04:00
Anuken
e6c4c66199 All drill costs decreased / Fixed specific sector save errors 2018-08-06 23:32:43 -04:00
Anuken
b76cd558aa Added difficulty grace period scaling 2018-08-06 22:58:22 -04:00
Anuken
85b077b5c5 Additional recipe balancing 2018-08-06 22:03:25 -04:00
Anuken
c34d6e6606 Improved targeting / Balancing / Monsoon nerf 2018-08-06 19:17:42 -04:00
Anuken
a5fd0aebe6 Fixed armageddon / Removed idle command / Balancing 2018-08-06 19:04:07 -04:00
Anuken
aaec04d04a Balancing / Made pads spawn infinite units 2018-08-06 16:58:44 -04:00
Leone25
b4272e0387 Update bundle_ita.properties 2018-08-06 20:44:09 +02:00
Anuken
77f9d6cb1d Grace period increased / Even more starting resources / Pulverizer buff 2018-08-06 12:52:29 -04:00
Anuken
aaa82b34e4 Difficulty display / More starting resources / Recipe tweaks 2018-08-06 12:42:34 -04:00
Anuken
7a6b1129d9 Merge remote-tracking branch 'origin/master' 2018-08-06 12:23:12 -04:00
Anuken
1f8918c773 Added starter items based on difficulty 2018-08-06 12:22:55 -04:00
Anuken
e9fe724e59 Merge pull request #172 from Prosta4okua/patch-11
(Complete)Update bundle_ru.properties
2018-08-06 11:21:41 -04:00
Anuken
80001246ef Added sector wave difficulty / ita bundle updated 2018-08-06 11:19:44 -04:00
Anuken
50461bb7c8 Merge pull request #164 from Leone25/patch-2 2018-08-06 11:17:29 -04:00
Anuken
c7c7cfde74 Merge branch 'master' into patch-2 2018-08-06 11:17:20 -04:00
Anuken
dcc29c0c48 Fixed extremely suicidal enemies / Conveyor tile fixes 2018-08-06 10:54:56 -04:00
Anuken
635e299464 Tweaked spawn times / Liquid bridge fixes 2018-08-06 10:31:50 -04:00
Prosta4okua
382fdcbb40 Update bundle_ru.properties 2018-08-06 15:03:23 +03:00
Anuken
468e092422 Pad ammo autofill / Per-mission waves / Better core resource selection 2018-08-05 23:19:11 -04:00
Anuken
6904d4693f Merge remote-tracking branch 'origin/master' 2018-08-05 19:19:55 -04:00
Anuken
3ef7ec3be5 Bundles updated 2018-08-05 19:19:50 -04:00
Anuken
70257cbbfa Merge pull request #170 from Prosta4okua/patch-10
[Complete] Update bundle_ru.properties
2018-08-05 19:18:25 -04:00
Anuken
6ef31d0ec1 Added spawner grace period 2018-08-05 19:17:46 -04:00
Prosta4okua
d3077bec58 Update bundle_ru.properties 2018-08-06 00:12:50 +03:00
Prosta4okua
a1095353fc Update bundle_ru.properties 2018-08-06 00:11:19 +03:00
Anuken
66fab1b3df Added thermal generator / Enemy bases with spawning 2018-08-05 17:00:26 -04:00
Prosta4okua
569d6d4272 Update bundle_ru.properties 2018-08-05 19:09:01 +03:00
Anuken
07c19ce085 Added thermal pump / Better conveyor autotile 2018-08-05 10:14:18 -04:00
Anuken
d86dd4f80b Fixed terrible spawn generation 2018-08-04 23:19:10 -04:00
Anuken
f0f89f0894 New non-clipped 8x8 turret sprites 2018-08-04 20:19:04 -04:00
Anuken
47af2e83f7 Improved structure generation 2018-08-04 16:58:31 -04:00
Anuken
8ec87872c8 Added outpost schematic system 2018-08-04 14:51:33 -04:00
Anuken
f30ea80b42 Made units self-destruct after spawner removal 2018-08-03 20:22:33 -04:00
Anuken
1dd6e66167 Added basic enemy outposts 2018-08-03 16:39:12 -04:00
Anuken
4e681b2dd1 Merge remote-tracking branch 'origin/master' 2018-08-03 12:13:39 -04:00
Anuken
58be00b3ce Exploit fixes 2018-08-03 12:13:17 -04:00
Anuken
5604ac6b6a Merge pull request #169 from Prosta4okua/patch-9
[COMPLETE]Update bundle_ru.properties
2018-08-03 10:53:52 -04:00
Anuken
effdaefdf3 Added built-in sandbox map 2018-08-02 13:58:02 -04:00
Anuken
5775fad030 Fixed core generation 2018-08-02 12:00:29 -04:00
Prosta4okua
eabc6d79c3 Update bundle_ru.properties 2018-08-02 12:44:35 +03:00
Prosta4okua
5f4ca6e383 Update bundle_ru.properties 2018-08-02 11:57:11 +03:00
Anuken
c05020e28e Fixed no-wave FPS display / Fixed unit pad inventories 2018-08-01 22:14:43 -04:00
Anuken
5206079e23 Implemented sandbox mode 2018-08-01 20:13:57 -04:00
Anuken
9b01140882 Fixed merge conflicts 2018-08-01 18:44:53 -04:00
Anuken
4dae27da98 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	core/assets/bundles/bundle_ru.properties
2018-08-01 18:44:25 -04:00
Anuken
f0cab65a6d Bundles updated 2018-08-01 18:38:48 -04:00
Anuken
699a47351b Merge pull request #168 from Prosta4okua/patch-8
[COMPLETE]Update bundle_ru.properties
2018-08-01 18:37:51 -04:00
Anuken
af004da699 Added mission completion dialog / Bundle fixes 2018-08-01 18:31:44 -04:00
Prosta4okua
b5ad885237 Update bundle_ru.properties 2018-08-01 23:45:08 +03:00
Prosta4okua
07bd0fec70 Update bundle_ru.properties 2018-08-01 23:44:25 +03:00
Prosta4okua
318e51d736 Update bundle_ru.properties 2018-08-01 23:43:18 +03:00
Anuken
ae90db50fe Added monsoon pad / Renamed factories to pads 2018-08-01 16:18:13 -04:00
Prosta4okua
64772c195e Update bundle_ru.properties 2018-08-01 21:17:23 +03:00
Prosta4okua
05ead63bdc Update bundle_ru.properties 2018-08-01 21:16:55 +03:00
Prosta4okua
6f5c64420d Update bundle_ru.properties 2018-08-01 20:59:45 +03:00
Prosta4okua
d9d9a00a24 Update bundle_ru.properties 2018-08-01 20:53:01 +03:00
Anuken
c1de67032c Nerfed monsoon bomber 2018-08-01 13:09:46 -04:00
Anuken
890d49fdd7 Merge remote-tracking branch 'origin/master' 2018-08-01 12:46:54 -04:00
Anuken
ba96ea5a0c Gamemode-specfic missions / Red-enabled location verification 2018-08-01 12:19:17 -04:00
Anuken
b481b784bb Merge pull request #166 from Predator127/patch-4
Fixed PT-BR
2018-07-31 21:56:58 -04:00
Anuken
53b6e68a85 Merge remote-tracking branch 'origin/master' 2018-07-31 21:55:22 -04:00
Anuken
e3d16418a0 Added island around core generation 2018-07-31 21:53:40 -04:00
Predator127
e41f560ecd Fixed PT-BR
Small fixes.
2018-07-31 17:49:14 -03:00
Anuken
d394d9a529 Merge pull request #165 from bdjnk/patch-1
fix english translation bundle link, fix spelling
2018-07-31 15:55:14 -04:00
Michael Plotke
a73015fa6e fix english translation bundle link, fix spelling 2018-07-31 14:37:54 -04:00
Anuken
87846864cc Merge remote-tracking branch 'origin/master' 2018-07-31 12:57:48 -04:00
Anuken
f3b976bdd1 All web version bugs fixed 2018-07-31 12:57:34 -04:00
Anuken
3a06e319b0 Merge pull request #163 from toushangyouxiang/master
Add bundle_zh_CN.properties
2018-07-31 07:02:25 -07:00
Anuken
fe31c404ff Merge pull request #162 from Predator127/patch-3
Huehue
2018-07-31 07:02:16 -07:00
Anuken
cc23378758 Updated gradle version 2018-07-31 09:48:33 -04:00
toushangyouxiang
5cac949ea8 fix translation 2018-07-31 21:02:25 +08:00
toushangyouxiang
a35e897194 translate fix 2018-07-31 21:01:29 +08:00
toushangyouxiang
8e92edeae1 add bundle_zh_CN.properties 2018-07-31 14:25:32 +08:00
toushangyouxiang
f289a0a9a8 fix name 2018-07-31 14:20:20 +08:00
toushangyouxiang
65a7e89a8c add bundle_zh_CN.properties 2018-07-31 14:17:01 +08:00
Anuken
43be3259c9 Removed all websocket code 2018-07-30 23:43:11 -04:00
Anuken
54a4c95a1b Minor UI fixes 2018-07-30 23:32:43 -04:00
Anuken
ddac5cbfbc Added unit type descriptions / Changed blast drill sprite 2018-07-30 21:20:00 -04:00
Anuken
22342d01a5 Added blast drill 2018-07-30 19:40:44 -04:00
Predator127
7cffaeb193 Huehue
small changes
2018-07-30 19:34:55 -03:00
Anuken
2534496543 Merge remote-tracking branch 'origin/master' 2018-07-30 17:00:24 -04:00
Anuken
fe9b11e771 Fully implemented mass driver 2018-07-30 17:00:18 -04:00
Anuken
032347840f Merge pull request #161 from Prosta4okua/patch-6
[COMPLETE] Upt8te bundle_ru.properties
2018-07-30 10:50:24 -07:00
Prosta4okua
2978bc6ac5 Update bundle_ru.properties 2018-07-30 19:24:06 +03:00
Prosta4okua
a3b0bb323f Update bundle_ru.properties 2018-07-30 19:23:06 +03:00
Prosta4okua
a6246d27d9 [INCOMPLETE]Upt8te bundle_ru.properties 2018-07-30 19:11:25 +03:00
Anuken
884b649b53 Merge pull request #160 from Predator127/patch-2
Update bundle_pt_BR.properties
2018-07-29 16:29:31 -07:00
Predator127
92a2f770b4 Update bundle_pt_BR.properties 2018-07-29 20:02:54 -03:00
Anuken
e88ce078df Fixed place distance not being respected 2018-07-29 19:00:29 -04:00
Anuken
77f0dfb9b1 Added system to query block outputs / Editor bugfixes 2018-07-29 17:41:27 -04:00
Anuken
78d1accf07 Added resource mission 2018-07-29 12:26:48 -04:00
Anuken
2ec68a7f07 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	core/assets/bundles/bundle_pt_BR.properties
2018-07-29 12:01:52 -04:00
Anuken
bbaa2a2c92 Updated bundles, removed unused text 2018-07-29 12:01:25 -04:00
Anuken
341bb67ef4 Merge pull request #159 from TriggeredBoi/patch-1
Update bundle_pt_BR.properties
2018-07-29 09:00:43 -07:00
Anuken
e377cb423b Merge remote-tracking branch 'origin/master' 2018-07-29 11:57:56 -04:00
Anuken
81e954c258 Implemented multi-mission sectors / Various bugfixes 2018-07-29 11:57:46 -04:00
Trigg
79d41ba7ac Update bundle_pt_BR.properties
fixed some stuff for now, I guess

(Don't want to be rude, but a good chunk of Predator's translation seems to have been made by fucken google translate )
2018-07-29 12:20:30 -03:00
Anuken
e740e4da87 Merge pull request #158 from Predator127/patch-1
Update bundle_pt_BR.properties
2018-07-29 06:51:58 -07:00
Predator127
b476c47194 Update bundle_pt_BR.properties 2018-07-28 23:33:56 -03:00
Anuken
b2d61a93d9 Added sector mission display and generation 2018-07-28 22:06:01 -04:00
Anuken
a045ec9d46 Fixed sector dialog UI scaling 2018-07-28 12:59:52 -04:00
Anuken
1daf8d2743 cleanup of cleanup 2018-07-28 12:52:02 -04:00
Anuken
295824f440 Minor cleanup 2018-07-28 12:50:11 -04:00
Anuken
22b59e0cf6 Merge pull request #157 from Ameb/libgdx-miui-fix
Introduce workaround for libgdx issue by @codegist
2018-07-28 08:49:52 -07:00
Ameb
ecabdb82e6 Introduce workaround for libgdx issue by @codegist
libgdx/libgdx#3861 libgdx/libgdx#4626 libgdx/libgdx#5312
2018-07-28 17:24:20 +02:00
Anuken
924b1c1a67 Fixed #156 2018-07-28 10:06:28 -04:00
Anuken
0454c4c25a Added skin aliases 2018-07-28 09:44:38 -04:00
Anuken
3a3b81941b Fixed server fog not being cleared by blocks 2018-07-27 20:18:04 -04:00
Anuken
0875c29da5 Implemented fog saving 2018-07-27 17:26:12 -04:00
Anuken
0d4cf9f6c4 Mac crash fix 2018-07-27 14:26:34 -04:00
Anuken
6a525dcf59 Mac crash fix 2018-07-27 14:25:06 -04:00
Anuken
01f6904f82 Tile field encapsulation 2018-07-27 10:52:14 -04:00
Anuken
23bd9a989b Merge remote-tracking branch 'origin/master'
# Conflicts:
#	core/assets/bundles/bundle_ru.properties
2018-07-27 09:15:24 -04:00
Anuken
acfa02475b Updated bundles 2018-07-27 09:10:39 -04:00
Anuken
9dba304011 Merge pull request #151 from Prosta4okua/patch-5
[COMPLETE]Update bundle_ru.properties
2018-07-27 09:09:37 -04:00
Prosta4okua
69b0020d15 Update bundle_ru.properties 2018-07-27 10:03:52 +03:00
Anuken
ce2896cb38 Command center name added / Regression fix 2018-07-26 23:04:37 -04:00
Anuken
68fd09c222 Improved unit commands 2018-07-26 19:20:47 -04:00
Anuken
c832a7b93f Full command center implementation 2018-07-26 17:51:25 -04:00
Anuken
49e19ab34d Removed 'in' class 2018-07-26 15:40:35 -04:00
Anuken
c1c82b451d Removed multi-class call generation 2018-07-26 15:24:48 -04:00
Anuken
ea6f88b7f6 Added basic command center logic 2018-07-26 15:17:23 -04:00
Anuken
2a6ee6d65b Bundle cleanup 2018-07-26 14:19:58 -04:00
Anuken
583342b430 Merge remote-tracking branch 'origin/master' 2018-07-26 13:34:25 -04:00
Anuken
7289c1080c Cleaned up custom game dialog / Disabled saving in sectors 2018-07-26 13:34:20 -04:00
Prosta4okua
9ed4f2b7a3 Update bundle_ru.properties 2018-07-26 19:40:51 +03:00
Prosta4okua
7396f91a5e Update bundle_ru.properties 2018-07-26 19:39:48 +03:00
Prosta4okua
ccc926d812 Update bundle_ru.properties 2018-07-26 19:36:26 +03:00
Prosta4okua
bd39255ead Update bundle_ru.properties 2018-07-26 19:31:21 +03:00
Prosta4okua
add7b1a7d9 Update bundle_ru.properties 2018-07-26 19:29:19 +03:00
Prosta4okua
8e471f9939 Update bundle_ru.properties 2018-07-26 19:24:08 +03:00
Prosta4okua
c61568ef98 Update bundle_ru.properties 2018-07-26 19:13:47 +03:00
Prosta4okua
3260e45e71 Update bundle_ru.properties 2018-07-26 19:11:48 +03:00
Prosta4okua
ea61b560b8 Update bundle_ru.properties 2018-07-26 19:03:58 +03:00
Prosta4okua
f8ad7d485b [INCOMPLETE]Update bundle_ru.properties 2018-07-26 18:58:24 +03:00
Anuken
229e624434 Merge pull request #150 from Prosta4okua/patch-4
Update bundle_ru.properties
2018-07-26 11:19:31 -04:00
Anuken
7a3fb9c759 Sector size increased / Cores moved / Fixed desktop recipes appearing 2018-07-26 10:47:46 -04:00
Prosta4okua
9a7ea0d28c Update bundle_ru.properties 2018-07-26 17:40:38 +03:00
Anuken
ee5e655668 Made splitter faster when unchained 2018-07-25 17:29:43 -04:00
Anuken
58be055f57 Added interceptor factory / Sector-specific ore gen 2018-07-24 21:57:09 -04:00
Leone25
38e1944503 Update bundle_ita.properties 2018-07-24 16:34:52 +02:00
Anuken
992b402e9c Merge remote-tracking branch 'origin/master' 2018-07-24 10:15:31 -04:00
Anuken
81bf28e4ed Fixed build error / Added per-type drone mine config 2018-07-24 10:15:25 -04:00
Anuken
f10734b083 Merge pull request #149 from Prosta4okua/patch-3
[Сomplete]Upd8te bundle_ru.properties
2018-07-24 10:00:35 -04:00
Anuken
bf8f565631 Fixed ore-cliff blending 2018-07-24 09:18:04 -04:00
Anuken
9bc1ff8fa2 Added unit type unlocking / Fixed viewing of enemy block stats 2018-07-24 09:08:35 -04:00
Prosta4okua
56239b6bbf Up8te bundle_ru.properties
It's all?!
2018-07-24 13:44:30 +03:00
Leone25
cedd2bfe57 Update bundle_ita.properties 2018-07-24 10:42:09 +02:00
Anuken
7e187a57d8 Volcanic terrain now more frequent 2018-07-23 22:58:56 -04:00
Anuken
572a30a2c5 Improved worldgen 2018-07-23 22:36:39 -04:00
Anuken
f3235ef7e8 Merge remote-tracking branch 'origin/master' 2018-07-23 20:44:42 -04:00
Anuken
7448eb32cc Added battle misson / Team block colors / Mission worldgen 2018-07-23 20:44:33 -04:00
Anuken
33e8cc4711 Merge pull request #148 from Prosta4okua/patch-2
[WIP] Update bundle_ru.properties
2018-07-23 17:53:27 -04:00
Prosta4okua
6cdb016c2c [WIP] Update bundle_ru.properties 2018-07-23 23:45:43 +03:00
Leone25
ababb7f5ab Update bundle_ita.properties 2018-07-23 21:24:23 +02:00
Leone25
9f2b66e09d Update bundle_ita.properties 2018-07-23 20:56:38 +02:00
Leone25
8de267f6a9 Update bundle_ita.properties 2018-07-23 19:20:58 +02:00
Anuken
ecf9a3cbc9 Added FPS cap setting / Bugfixes 2018-07-23 11:09:51 -04:00
Anuken
01300b97e2 Changed game over menu for sectors 2018-07-22 19:06:52 -04:00
Leone25
787163fb06 Flew changes at the bottom 2018-07-22 22:18:51 +02:00
Anuken
3701a3c3d9 Updated italian bundle 2018-07-22 15:55:36 -04:00
Anuken
68c51bb1bc More generation improvements 2018-07-22 13:29:01 -04:00
Anuken
df147c700c Merge remote-tracking branch 'origin/master' 2018-07-21 22:05:10 -04:00
Anuken
f5fc4d99dd Improved generation 2018-07-21 22:04:10 -04:00
Anuken
2a4aa9e550 Merge pull request #145 from theshadowknight/patch-2
PL update
2018-07-21 17:38:12 -04:00
theshadowknight
0a489f1117 . 2018-07-21 18:16:33 +02:00
theshadowknight
9cc7c061a3 FINAL 2018-07-21 18:10:38 +02:00
theshadowknight
a1e7274ec3 I think it is final
*think*
2018-07-21 17:59:44 +02:00
theshadowknight
51d516a39e . 2018-07-21 17:49:32 +02:00
theshadowknight
de7c38231c look 2018-07-21 17:46:48 +02:00
theshadowknight
c352ef9382 PL update
YAY! *Some easter eggs here*
2018-07-21 17:15:14 +02:00
Anuken
e36b5551e9 Added translation testing info, useful information 2018-07-21 11:13:21 -04:00
Anuken
57856c38d6 Merge remote-tracking branch 'origin/master' 2018-07-21 10:07:01 -04:00
Anuken
2a8e02339b Added disclaimer 2018-07-21 10:06:20 -04:00
Anuken
57f94ca6a2 Merge pull request #144 from theshadowknight/patch-1
PL translation update
2018-07-21 10:03:17 -04:00
theshadowknight
0eaca8b80a PL translation update
I finished at 458
2018-07-21 13:00:56 +02:00
Anuken
d2dbab57dc Updated translation guide 2018-07-21 00:47:31 -04:00
Anuken
cb448a3494 Ignored locales.json 2018-07-21 00:45:11 -04:00
Anuken
3fa6eae05b Removed locales.json 2018-07-21 00:44:49 -04:00
Anuken
52cc7d699a Added translation guide / Added locale list autogen 2018-07-21 00:44:13 -04:00
Anuken
ec4eac3a7d Moved locale declaration to json file 2018-07-20 23:48:42 -04:00
Anuken
fbcfb23676 fixBundles -> updateBundles 2018-07-20 20:35:53 -04:00
Anuken
dbb2371801 Re-added block shadows / Block optimization 2018-07-20 18:41:08 -04:00
Anuken
4d6dc9546f Fixed cliffs not blending properly 2018-07-20 16:52:42 -04:00
Anuken
06b9d328f4 Added auto-generated cliffs for floor blocks 2018-07-20 16:06:26 -04:00
Anuken
48c7daa4ab iOS fixes 2018-07-20 13:59:00 -04:00
Anuken
3c83b88127 Multi-threaded generation previews 2018-07-20 09:26:41 -04:00
Anuken
3a63fa5475 Generation minor improvements / Added debug map view 2018-07-19 20:46:30 -04:00
Anuken
882790d133 Sleeping system changes 2018-07-19 18:10:29 -04:00
Anuken
bcf72b894d Fixed conveyor entities not sleeping 2018-07-19 17:58:16 -04:00
Anuken
9f723c39ef Bundles updated / Fixed player name color changing join/leave text 2018-07-19 14:20:51 -04:00
Anuken
56fc40a64d Removed sound assets / Fixed text wrap / Proper screen clear 2018-07-19 11:06:10 -04:00
Anuken
091f591ffb Added sector-specific spawns 2018-07-19 09:58:19 -04:00
Anuken
4d88a8206a Fixed unnecessary disconnect messages / Fixed player ban crash 2018-07-19 09:30:58 -04:00
Anuken
363bf7c552 Removed sector camera clamp / Added map edge padding / Turret sprite fix 2018-07-18 22:43:35 -04:00
Anuken
7ff4e5879d Implemented multi-cell sectors 2018-07-18 13:23:54 -04:00
Anuken
0b7decbfdd Removed static block layer / Minor bugfixes 2018-07-18 10:40:31 -04:00
Anuken
be9ea33aa4 Improved floodfill / Fixed resource use bug / Fixed editor turret draw 2018-07-17 23:20:05 -04:00
Anuken
d4b2cad94e Merge remote-tracking branch 'origin/master' 2018-07-17 19:19:55 -04:00
Anuken
ac039ce7cd Fixed sector world gen / Added sector goal unlocks 2018-07-17 19:12:44 -04:00
Anuken
946e60937d iOS fixes 2018-07-17 14:15:43 -04:00
Anuken
6f6601d270 Improved sector dialog look / Made mobile versions show play select 2018-07-17 13:19:20 -04:00
Anuken
71016f0d7c Updated uCore / Added hidden sector saves 2018-07-17 12:47:11 -04:00
Anuken
c2c2551607 Implemented save time recording 2018-07-17 10:42:44 -04:00
Anuken
d7812ec030 New save slot system / Buffed smelter / Fixed flying shadow glitches 2018-07-17 09:18:19 -04:00
Anuken
f184b0700f Fixed conveyor/conduit crash / Improved conveyor movement 2018-07-16 21:44:15 -04:00
Anuken
07f0be8d8d Updated uCore / Sector deploying support 2018-07-16 20:53:35 -04:00
Anuken
dd45b43d7f Classes moved / Fixed autotile bugs / Added sector display 2018-07-16 18:42:29 -04:00
Anuken
9b505106e3 Fixed ugly oversized shadows in corner autotiles 2018-07-16 09:42:13 -04:00
Anuken
d552f37daf Added conveyor autotiling / Fixed autotile update bug 2018-07-15 22:33:14 -04:00
Anuken
6a7ff13859 Added basic sector classes / Changed play menu dialog 2018-07-15 17:19:33 -04:00
Anuken
9e3af13efc Added build version warning for servers 2018-07-15 14:51:03 -04:00
Anuken
92a968217c Fixed power being set to NaN / Set splitter sprite to router 2018-07-15 11:50:06 -04:00
Anuken
37b9df3202 Removed all UI builders / Updated uCore and functional interfaces 2018-07-14 22:06:03 -04:00
Anuken
7dc33111fc Changed default world size back 2018-07-14 20:04:27 -04:00
Anuken
ab2f260a52 Fixed some crashes 2018-07-14 17:16:13 -04:00
Anuken
1aa4b8cb88 Fixed crash report displaying location incorrectly 2018-07-14 17:00:33 -04:00
Anuken
dfed36748c Fixed saves not loading / Increased biomatter compressor output 2018-07-14 16:06:38 -04:00
Anuken
d35f736548 Updated traditional chinese bundle / Fixed korean bundle 2018-07-14 12:14:22 -04:00
Anuken
cfecdae970 Class package refactoring 2018-07-14 12:11:48 -04:00
Anuken
59ade6cf09 Vault optimizations / Removed unloader 2018-07-14 10:47:18 -04:00
Anuken
642842888a Removed Waffle.io links 2018-07-14 09:34:19 -04:00
Anuken
3ae51edf3a Merge branch '4.0' of https://github.com/Anuken/Mindustry
# Conflicts:
#	core/assets/bundles/bundle_ko.properties
#	core/src/io/anuke/mindustry/Vars.java
#	core/src/io/anuke/mindustry/core/UI.java
2018-07-14 09:32:55 -04:00
Anuken
d8ccb81015 Merge remote-tracking branch 'origin/4.0' into 4.0 2018-07-14 09:26:43 -04:00
Anuken
0db6020231 Increased bridge range / Bugfixes 2018-07-14 09:26:34 -04:00
Anuken
738c0a5c9c Merge pull request #143 from player20033/patch-1
#142 Solution
2018-07-13 22:12:51 -04:00
player20033
a2f7d3e241 #142 Solution 2018-07-14 10:02:13 +08:00
Anuken
9b86ded164 Merge pull request #141 from cloud9350/patch-4
Update bundle_ko.properties
2018-07-13 20:00:34 -04:00
Gureumi
6cbb645b10 Update bundle_ko.properties 2018-07-14 08:54:55 +09:00
Anuken
066a1d7591 Merge remote-tracking branch 'origin/4.0' into 4.0
# Conflicts:
#	core/src/io/anuke/mindustry/Vars.java
2018-07-13 19:54:20 -04:00
Anuken
5f82d575ee iOS fixes 2018-07-13 19:50:18 -04:00
Anuken
302ae0a83c Merge remote-tracking branch 'origin/4.0' into 4.0
# Conflicts:
#	core/assets/bundles/bundle_ko.properties
2018-07-13 13:48:52 -04:00
Anuken
82c4c791cc Added message for loading broken saves 2018-07-13 13:43:37 -04:00
Anuken
3c0310120d Merge pull request #140 from cloud9350/patch-4
Update bundle_ko.properties
2018-07-13 13:24:05 -04:00
Anuken
21c106e9d5 Updated splitter description 2018-07-13 12:53:40 -04:00
Anuken
2c8cd2f8dc Fixed autosave not triggering 2018-07-13 12:50:45 -04:00
Anuken
380d9908b4 Fixed chat stopping velocity / Fixed drone repair not being synced 2018-07-13 11:46:16 -04:00
Anuken
6abef7d645 Fixed item bridge crash 2018-07-13 11:09:33 -04:00
Anuken
98ac25ac29 Fixed distributor 2018-07-13 10:21:17 -04:00
Anuken
93bec04c92 Fixed overflow gate, splitter 2018-07-13 10:11:42 -04:00
Gureumi
136559cddd Update bundle_ko.properties 2018-07-13 22:34:41 +09:00
Gureumi
3f63a6ed70 Update bundle_ko.properties 2018-07-13 22:24:00 +09:00
Anuken
2fcb3c4420 Bugfixes 2018-07-12 21:13:08 -04:00
Anuken
baaeb229cf Formatting 2018-07-12 20:37:15 -04:00
Anuken
a3bda3a941 Changed crash report location 2018-07-12 19:00:02 -04:00
Anuken
3d536aa28d Fixed player names not displaying 2018-07-12 18:58:02 -04:00
Anuken
454267455b Fixed mobile consume frag / Added ability for ship to mine 2018-07-12 15:44:05 -04:00
Anuken
8e9adeb4b4 Fixed web version bugs 2018-07-12 14:06:50 -04:00
Anuken
1f18e7beed Improved glitchy interpolation / Updated uCore 2018-07-12 11:38:09 -04:00
Anuken
b5e8e54107 Added build tools to travis 2018-07-12 10:24:56 -04:00
Anuken
f41e426b69 Reactor balancing / Fixed generators / Fixed pump crash / Travis update 2018-07-12 10:20:38 -04:00
Anuken
6375862a71 Fixed deadlock / Crafter fixes / Autotile fixes / Low FPS ship fixes 2018-07-12 09:11:28 -04:00
Anuken
be2a745d78 Increased ore generation amount 2018-07-11 19:58:49 -04:00
Anuken
d89feb2c75 Bugfixes, minor optimizations 2018-07-11 19:57:27 -04:00
Anuken
b4a20c8fcb Fixed fog glitching around during screenshake 2018-07-11 12:30:07 -04:00
Anuken
73087a92f4 Fixed build error 2018-07-11 12:21:46 -04:00
Anuken
2b58bd5bd8 Optimizations 2018-07-11 12:19:21 -04:00
Anuken
bce0101278 Fixed some multiplayer crashes 2018-07-10 21:04:14 -04:00
Anuken
bba418c79d Added consumers for repair/resupply points 2018-07-10 18:57:50 -04:00
Anuken
cb58eb82fc Added requirement display / Text fixes / Better crash reports 2018-07-10 16:53:35 -04:00
Anuken
3aafffabc1 Added BlockConsumeFragment 2018-07-10 11:41:51 -04:00
Anuken
66b9cdf64c Conduit autotiling / Added Block.onProximityUpdate() 2018-07-10 10:14:10 -04:00
Anuken
d31fbf3b6f Added flyer shadows / Fixed block inventory rebuild spawn / Distributor 2018-07-09 20:18:50 -04:00
Anuken
dbee30a412 Updated uCore / Made splitter distribute properly 2018-07-09 18:14:55 -04:00
Anuken
f3cc881930 Status bar cleanup / Fixed power distribution / Fixed adjacency updates 2018-07-09 14:25:52 -04:00
Anuken
3d9c9e639d Automatic external bundle loading 2018-07-09 11:24:24 -04:00
Anuken
d6969d2c74 Removed unused bundle keys 2018-07-09 11:06:15 -04:00
Anuken
b7e28a73ba Bugfixes / Added tool to re-format bundles with missing text 2018-07-09 11:02:30 -04:00
Anuken
1e8206757d Various bugfixes / Fixed persistent inventory, block crashes 2018-07-08 23:59:02 -04:00
Anuken
a0e94577fc Fixed infinite red square, glitchy shadows 2018-07-08 17:04:32 -04:00
Anuken
a2a0c2f791 Fixed startup error 2018-07-08 16:50:52 -04:00
Anuken
63a0fde121 Offload optimizations / Compile errors fixed / Massive refactor 2018-07-08 16:38:29 -04:00
Anuken
c06152de07 Consumption system more or less complete 2018-07-08 00:04:41 -04:00
Anuken
0b3ccbda20 Merge pull request #136 from JaiunL/patch-1
Translated a few parts
2018-07-07 21:00:03 -04:00
Anuken
97b7eb0768 Bugfixes / Compile error fixes / Removed routers 2018-07-07 13:48:20 -04:00
Jaiun Lee
b712301804 Revised 2018-07-07 13:29:11 +09:00
Jaiun Lee
76ebe3ff41 Translated a few parts
Mostly focused on grammatical errors and inconsistency in styling. Still need multiple revisions on a full spectrum. Discord: Reaper#7917
2018-07-07 13:24:00 +09:00
Anuken
d988bb1821 Massive amount of bugfixes / Multi-liquid support / Broken build 2018-07-06 23:24:14 -04:00
Anuken
64f1fbe400 Fixed many various crashes 2018-07-06 12:04:33 -04:00
Anuken
c2c837329c Fixed block construction / Added build version to crash 2018-07-06 10:54:20 -04:00
Anuken
b6531efe08 Merge remote-tracking branch 'origin/4.0' into 4.0 2018-07-06 09:52:26 -04:00
Anuken
2c97a4aefe Fixed importing saves / File chooser bad size 2018-07-06 09:52:18 -04:00
Anuken
f0ffebd58c Delete vcs.xml 2018-07-05 18:56:48 -04:00
Anuken
05e407f064 Delete github_settings.xml 2018-07-05 18:56:33 -04:00
Anuken
6dd2eec1b6 Merge pull request #131 from Lorex/master
Add Traditional Chinese support
2018-07-05 18:56:12 -04:00
Anuken
df13436688 Merge pull request #135 from cloud9350/patch-1
Update language file for game beta version
2018-07-05 18:54:27 -04:00
Anuken
fa0d89b6df Fixed crash 2018-07-05 17:37:24 -04:00
Anuken
ab0f8defa4 Merge branch '4.0' of https://github.com/Anuken/Mindustry into 4.0 2018-07-05 17:11:27 -04:00
Anuken
6b3329845b Fixed onConstructFinish() not syncing rotation 2018-07-05 16:49:29 -04:00
Gureumi
14fe35bba0 Update bundle_ko.properties 2018-07-05 22:21:12 +09:00
Anuken
cb9d3414f2 Merge branch '4.0' of https://github.com/Anuken/Mindustry into 4.0 2018-07-03 20:07:15 -04:00
Anuken
677526cb16 Fixed iOS NullPtr 2018-07-03 19:03:53 -04:00
Anuken
08690b9d9e Merge pull request #133 from cloud9350/patch-4
fix fatal language translate (bundle ko)
2018-06-18 23:10:07 -04:00
Gureumi
d3eb9c9d99 Update bundle_ko.properties 2018-06-19 10:18:32 +09:00
Gureumi
a0ef3a0e44 fix fatal language translate (bundle ko)
fix no show server version + host user name on list
2018-06-19 10:13:07 +09:00
Lorex
87c5ad79f4 IC-2018.1.4 <Lorex@DESKTOP-8V15HFB Merge branch 'master' 2018-06-09 16:33:18 +08:00
Lorex
2e210e7adc Add Traditional Chinese support 2018-06-09 16:15:17 +08:00
Lorex
c56f4783c0 IC-2018.1.4 <Lorex@DESKTOP-8V15HFB Create vcs.xml, github_settings.xml 2018-06-09 16:13:55 +08:00
Lorex
a1d351aa37 IC-2018.1.4 <Lorex@DESKTOP-8V15HFB Overwrite remote https://github.com/Lorex/Mindustry.git to local 2018-06-09 16:02:39 +08:00
618 changed files with 35545 additions and 28739 deletions

3
.gitignore vendored
View File

@@ -2,6 +2,7 @@
/core/assets/mindustry-saves/ /core/assets/mindustry-saves/
/core/assets/mindustry-maps/ /core/assets/mindustry-maps/
/core/assets/bundles/output/
/deploy/ /deploy/
/desktop/packr-out/ /desktop/packr-out/
/desktop/packr-export/ /desktop/packr-export/
@@ -19,6 +20,8 @@
/android/assets/mindustry-saves/ /android/assets/mindustry-saves/
/core/assets/gifexport/ /core/assets/gifexport/
/core/assets/version.properties /core/assets/version.properties
/core/assets/locales.json
/ios/src/io/anuke/mindustry/gen/
*.gif *.gif
version.properties version.properties

View File

@@ -5,13 +5,14 @@ jdk:
android: android:
components: components:
- android-26 - android-27
# Additional components # Additional components
- extra-google-google_play_services - extra-google-google_play_services
- extra-google-m2repository - extra-google-m2repository
- extra-android-m2repository - extra-android-m2repository
- addon-google_apis-google-26 - addon-google_apis-google-27
- build-tools-27.0.3
script: script:
- ./gradlew desktop:dist - ./gradlew desktop:dist

View File

@@ -1,11 +1,9 @@
![Imgur](https://i.imgur.com/w4N0yhv.png) ![Imgur](https://i.imgur.com/w4N0yhv.png)
[![Build Status](https://travis-ci.org/Anuken/Mindustry.svg?branch=master)](https://travis-ci.org/Anuken/Mindustry) [![Build Status](https://travis-ci.org/Anuken/Mindustry.svg?branch=master)](https://travis-ci.org/Anuken/Mindustry)
[![Waffle.io - Columns and their card count](https://badge.waffle.io/Anuken/Mindustry.svg?columns=all)](https://waffle.io/Anuken/Mindustry) \
A pixelated sandbox tower defense game made using [LibGDX](https://libgdx.badlogicgames.com/). Winner of the [GDL Metal Monstrosity Jam](https://itch.io/jam/gdl---metal-monstrosity-jam). A pixelated sandbox tower defense game made using [LibGDX](https://libgdx.badlogicgames.com/). Winner of the [GDL Metal Monstrosity Jam](https://itch.io/jam/gdl---metal-monstrosity-jam).
_[Issue tracker](https://waffle.io/Anuken/Mindustry)_
_[Trello Board](https://trello.com/b/aE2tcUwF/mindustry-40-plans)_ _[Trello Board](https://trello.com/b/aE2tcUwF/mindustry-40-plans)_
_[Wiki](http://mindustry.wikia.com/wiki/Mindustry_Wiki)_ _[Wiki](http://mindustry.wikia.com/wiki/Mindustry_Wiki)_
_[Discord](https://discord.gg/r8BkXNd)_ _[Discord](https://discord.gg/r8BkXNd)_

39
TRANSLATING.md Normal file
View File

@@ -0,0 +1,39 @@
## Translating for Mindustry
**DISCLAIMER:** *Currently, 4.0 is far from done, which means that things such as block names, descriptions, and core text will be changing often. If you begin translating now, you might have to re-do large chunks of the bundle before final release.*
To begin, log in to your GitHub account, or if you don't have one yet, create it [here](https://github.com/).
Consult [this list](https://www.science.co.il/language/Locale-codes.php) to find the locale code for your language. Once you've found it,
head over to the translation bundle folder and check the [list of bundles](https://github.com/Anuken/Mindustry/tree/master/core/assets/bundles) that have already been created.
You're looking for a file called "`bundle_`(insert locale code here)`.properties`". If you don't find one, create one manually (more info below).
#### Editing an existing translation
If a translation bundle already exists, that means someone has already started working on a translation. To edit it or translate text, simply click the file and press the edit (pencil) button in the top right. Once you're done editing, press the green "propose file change" button at the bottom, then "create pull request" (twice).
Once this is done, all you need to do is wait for me to approve your changes.
#### Creating a new translation bundle
If a translation bundle for your language *doesn't* exist, you need to create one yourself.
In the folder with all the bundles in it, click the *'create new file'* button, and name it `bundle_(locale code here).properties`.
Then, copy-paste the entire contents of the [English translation bundle](https://raw.githubusercontent.com/Anuken/Mindustry/master/core/assets/bundles/bundle.properties) into the file, and translate all the necessary text to your language.
Once you are done, press the *propose new file* button at the bottom, then 'create pull request' twice.
#### Useful Information
- When you see text surrounded by square brackets, such as `[RED]`, `[]` or `[accent]`, this indicates a color code. Don't translate it.
- `{0}` means an argument that will be replaced when the text is displayed. For example, `Wave: {0}` will replace the `{0}` with whatever wave you are in.
- Empty lines are fine, and it doesn't matter in what order you place the text.
- `\n` means "new line". If you want to split text into multiple lines, use `\n` to do it.
#### Testing your translation bundle
There are two ways to test the translation bundle:
1) Assuming you have the PC version downloaded, download your bundle file, name it `bundle.properties`, then place it in the same folder as the Mindustry desktop executable and run it. *You should get a popup message in-game confirming that you have loaded an external translation.*
2) For advanced users: simply download your fork of mindustry and compile/run the game.
**And that's it.**
*(...of course, that's never really it. Bother me on Discord when something inevitably goes wrong.)*

View File

@@ -20,8 +20,8 @@
<activity <activity
android:name="io.anuke.mindustry.AndroidLauncher" android:name="io.anuke.mindustry.AndroidLauncher"
android:label="@string/app_name" android:label="@string/app_name"
android:screenOrientation="sensor" android:screenOrientation="user"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"> android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />

View File

@@ -24,7 +24,6 @@ dependencies {
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-arm64-v8a" natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-arm64-v8a"
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86" natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86"
natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86_64" natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-x86_64"
implementation "com.badlogicgames.gdx:gdx-ai:$aiVersion"
implementation "com.badlogicgames.gdx:gdx-controllers-android:$gdxVersion" implementation "com.badlogicgames.gdx:gdx-controllers-android:$gdxVersion"
} }

View File

@@ -12,7 +12,6 @@ import android.provider.Settings.Secure;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import android.util.Log; import android.util.Log;
import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.backends.android.AndroidApplication;
import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration; import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration;
import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.utils.Base64Coder; import com.badlogic.gdx.utils.Base64Coder;
@@ -25,8 +24,8 @@ import io.anuke.kryonet.KryoClient;
import io.anuke.kryonet.KryoServer; import io.anuke.kryonet.KryoServer;
import io.anuke.mindustry.core.Platform; import io.anuke.mindustry.core.Platform;
import io.anuke.mindustry.core.ThreadHandler.ThreadProvider; import io.anuke.mindustry.core.ThreadHandler.ThreadProvider;
import io.anuke.mindustry.game.Saves.SaveSlot;
import io.anuke.mindustry.io.SaveIO; import io.anuke.mindustry.io.SaveIO;
import io.anuke.mindustry.io.Saves.SaveSlot;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.ui.dialogs.FileChooser; import io.anuke.mindustry.ui.dialogs.FileChooser;
import io.anuke.ucore.function.Consumer; import io.anuke.ucore.function.Consumer;
@@ -48,24 +47,21 @@ import java.util.Locale;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
public class AndroidLauncher extends AndroidApplication{ public class AndroidLauncher extends PatchedAndroidApplication{
public static final int PERMISSION_REQUEST_CODE = 1; public static final int PERMISSION_REQUEST_CODE = 1;
boolean doubleScaleTablets = true; boolean doubleScaleTablets = true;
FileChooser chooser; FileChooser chooser;
@Override @Override
protected void onCreate(Bundle savedInstanceState){ protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
AndroidApplicationConfiguration config = new AndroidApplicationConfiguration(); AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
config.useImmersiveMode = true; config.useImmersiveMode = true;
Platform.instance = new Platform(){ Platform.instance = new Platform(){
DateFormat format = SimpleDateFormat.getDateTimeInstance(); DateFormat format = SimpleDateFormat.getDateTimeInstance();
@Override @Override
public boolean hasDiscord() { public boolean hasDiscord(){
return isPackageInstalled("com.discord"); return isPackageInstalled("com.discord");
} }
@@ -90,78 +86,69 @@ public class AndroidLauncher extends AndroidApplication{
} }
@Override @Override
public void openDonations() { public void openDonations(){
showDonations(); showDonations();
} }
@Override @Override
public ThreadProvider getThreadProvider() { public ThreadProvider getThreadProvider(){
return new DefaultThreadImpl(); return new DefaultThreadImpl();
} }
@Override @Override
public boolean isDebug() { public boolean isDebug(){
return false; return false;
} }
@Override @Override
public String getUUID() { public String getUUID(){
try { try{
String s = Secure.getString(getContext().getContentResolver(), String s = Secure.getString(getContext().getContentResolver(),
Secure.ANDROID_ID); Secure.ANDROID_ID);
int len = s.length(); int len = s.length();
byte[] data = new byte[len / 2]; byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) { for(int i = 0; i < len; i += 2){
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+ Character.digit(s.charAt(i + 1), 16)); + Character.digit(s.charAt(i + 1), 16));
} }
String result = new String(Base64Coder.encode(data)); String result = new String(Base64Coder.encode(data));
if(result.equals("AAAAAAAAAOA=")) throw new RuntimeException("Bad UUID."); if(result.equals("AAAAAAAAAOA=")) throw new RuntimeException("Bad UUID.");
return result; return result;
}catch (Exception e){ }catch(Exception e){
return super.getUUID(); return super.getUUID();
} }
} }
@Override @Override
public void shareFile(FileHandle file){ public void shareFile(FileHandle file){
} }
@Override @Override
public void showFileChooser(String text, String content, Consumer<FileHandle> cons, boolean open, String filetype) { public void showFileChooser(String text, String content, Consumer<FileHandle> cons, boolean open, String filetype){
chooser = new FileChooser(text, file -> file.extension().equalsIgnoreCase(filetype), open, cons); chooser = new FileChooser(text, file -> file.extension().equalsIgnoreCase(filetype), open, cons);
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M || (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED && if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M || (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)){ checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)){
chooser.show(); chooser.show();
chooser = null; chooser = null;
}else { }else{
ArrayList<String> perms = new ArrayList<>(); ArrayList<String> perms = new ArrayList<>();
if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
perms.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); perms.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
} }
if(checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
perms.add(Manifest.permission.READ_EXTERNAL_STORAGE); perms.add(Manifest.permission.READ_EXTERNAL_STORAGE);
} }
requestPermissions(perms.toArray(new String[perms.size()]), PERMISSION_REQUEST_CODE); requestPermissions(perms.toArray(new String[perms.size()]), PERMISSION_REQUEST_CODE);
} }
} }
@Override @Override
public void beginForceLandscape() { public void beginForceLandscape(){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
} }
@Override @Override
public void endForceLandscape() { public void endForceLandscape(){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
} }
@@ -170,37 +157,30 @@ public class AndroidLauncher extends AndroidApplication{
return true; return true;
} }
}; };
try{
try {
ProviderInstaller.installIfNeeded(this); ProviderInstaller.installIfNeeded(this);
} catch (GooglePlayServicesRepairableException e) { }catch(GooglePlayServicesRepairableException e){
GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance(); GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance();
apiAvailability.getErrorDialog(this, e.getConnectionStatusCode(), 0).show(); apiAvailability.getErrorDialog(this, e.getConnectionStatusCode(), 0).show();
} catch (GooglePlayServicesNotAvailableException e) { }catch(GooglePlayServicesNotAvailableException e){
Log.e("SecurityException", "Google Play Services not available."); Log.e("SecurityException", "Google Play Services not available.");
} }
if(doubleScaleTablets && isTablet(this.getContext())){ if(doubleScaleTablets && isTablet(this.getContext())){
Unit.dp.addition = 0.5f; Unit.dp.addition = 0.5f;
} }
config.hideStatusBar = true; config.hideStatusBar = true;
Net.setClientProvider(new KryoClient()); Net.setClientProvider(new KryoClient());
Net.setServerProvider(new KryoServer()); Net.setServerProvider(new KryoServer());
initialize(new Mindustry(), config); initialize(new Mindustry(), config);
checkFiles(getIntent()); checkFiles(getIntent());
} }
@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;
} }
if(chooser != null){ if(chooser != null){
chooser.show(); chooser.show();
} }
@@ -208,73 +188,65 @@ public class AndroidLauncher extends AndroidApplication{
} }
private void checkFiles(Intent intent){ private void checkFiles(Intent intent){
try { try{
Uri uri = intent.getData(); Uri uri = intent.getData();
if (uri != null) { if(uri != null){
File myFile = null; File myFile = null;
String scheme = uri.getScheme(); String scheme = uri.getScheme();
if (scheme.equals("file")) { if(scheme.equals("file")){
String fileName = uri.getEncodedPath(); String fileName = uri.getEncodedPath();
myFile = new File(fileName); myFile = new File(fileName);
} else if (!scheme.equals("content")) { }else if(!scheme.equals("content")){
//error //error
return; return;
} }
boolean save = uri.getPath().endsWith(saveExtension); boolean save = uri.getPath().endsWith(saveExtension);
boolean map = uri.getPath().endsWith(mapExtension); boolean map = uri.getPath().endsWith(mapExtension);
InputStream inStream; InputStream inStream;
if (myFile != null) inStream = new FileInputStream(myFile); if(myFile != null) inStream = new FileInputStream(myFile);
else inStream = getContentResolver().openInputStream(uri); else inStream = getContentResolver().openInputStream(uri);
Gdx.app.postRunnable(() -> { Gdx.app.postRunnable(() -> {
if(save){ //open save if(save){ //open save
System.out.println("Opening save."); System.out.println("Opening save.");
FileHandle file = Gdx.files.local("temp-save." + saveExtension); FileHandle file = Gdx.files.local("temp-save." + saveExtension);
file.write(inStream, false); file.write(inStream, false);
if(SaveIO.isSaveValid(file)){ if(SaveIO.isSaveValid(file)){
try{ try{
SaveSlot slot = control.getSaves().importSave(file); SaveSlot slot = control.getSaves().importSave(file);
ui.load.runLoadSave(slot); ui.load.runLoadSave(slot);
}catch (IOException e){ }catch(IOException e){
ui.showError(Bundles.format("text.save.import.fail", Strings.parseException(e, false))); ui.showError(Bundles.format("text.save.import.fail", Strings.parseException(e, false)));
} }
}else{ }else{
ui.showError("$text.save.import.invalid"); ui.showError("$text.save.import.invalid");
} }
}else if(map){ //open map }else if(map){ //open map
Gdx.app.postRunnable(() -> { Gdx.app.postRunnable(() -> {
System.out.println("Opening map."); System.out.println("Opening map.");
if (!ui.editor.isShown()) { if(!ui.editor.isShown()){
ui.editor.show(); ui.editor.show();
} }
ui.editor.beginEditMap(inStream); ui.editor.beginEditMap(inStream);
}); });
} }
}); });
} }
}catch(IOException e){
}catch (IOException e){
e.printStackTrace(); e.printStackTrace();
} }
} }
private boolean isPackageInstalled(String packagename) { private boolean isPackageInstalled(String packagename){
try { try{
getPackageManager().getPackageInfo(packagename, 0); getPackageManager().getPackageInfo(packagename, 0);
return true; return true;
} catch (Exception e) { }catch(Exception e){
return false; 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.getPhoneType() == TelephonyManager.PHONE_TYPE_NONE;
} }

View File

@@ -17,12 +17,12 @@ public class AndroidTextFieldDialog{
private TextPromptListener listener; private TextPromptListener listener;
private boolean isBuild; private boolean isBuild;
public AndroidTextFieldDialog() { public AndroidTextFieldDialog(){
this.activity = (Activity)Gdx.app; this.activity = (Activity) Gdx.app;
load(); load();
} }
public AndroidTextFieldDialog show() { public AndroidTextFieldDialog show(){
activity.runOnUiThread(() -> { activity.runOnUiThread(() -> {
AlertDialog dialog = builder.create(); AlertDialog dialog = builder.create();
@@ -36,7 +36,7 @@ public class AndroidTextFieldDialog{
return this; return this;
} }
private AndroidTextFieldDialog load() { private AndroidTextFieldDialog load(){
activity.runOnUiThread(() -> { activity.runOnUiThread(() -> {
@@ -56,19 +56,20 @@ public class AndroidTextFieldDialog{
}); });
// Wait till TextPrompt is built. // Wait till TextPrompt is built.
while (!isBuild) { while(!isBuild){
try { try{
Thread.sleep(10); Thread.sleep(10);
} catch (InterruptedException e) { } }catch(InterruptedException e){
}
} }
return this; return this;
} }
public int getResourceId(String pVariableName, String pVariableType) { public int getResourceId(String pVariableName, String pVariableType){
try { try{
return activity.getResources().getIdentifier(pVariableName, pVariableType, activity.getPackageName()); return activity.getResources().getIdentifier(pVariableName, pVariableType, activity.getPackageName());
} catch (Exception e) { }catch(Exception e){
Gdx.app.error("Android Dialogs", "Cannot find resouce with name: " + pVariableName Gdx.app.error("Android Dialogs", "Cannot find resouce with name: " + pVariableName
+ " Did you copy the layouts to /res/layouts and /res/layouts_v14 ?"); + " Did you copy the layouts to /res/layouts and /res/layouts_v14 ?");
e.printStackTrace(); e.printStackTrace();
@@ -76,19 +77,19 @@ public class AndroidTextFieldDialog{
} }
} }
public AndroidTextFieldDialog setText(CharSequence value) { public AndroidTextFieldDialog setText(CharSequence value){
userInput.append(value); userInput.append(value);
return this; return this;
} }
public AndroidTextFieldDialog setCancelButtonLabel(CharSequence label) { public AndroidTextFieldDialog setCancelButtonLabel(CharSequence label){
builder.setNegativeButton(label, (dialog, id) -> dialog.cancel()); builder.setNegativeButton(label, (dialog, id) -> dialog.cancel());
return this; return this;
} }
public AndroidTextFieldDialog setConfirmButtonLabel(CharSequence label) { public AndroidTextFieldDialog setConfirmButtonLabel(CharSequence label){
builder.setPositiveButton(label, (dialog, id) -> { builder.setPositiveButton(label, (dialog, id) -> {
if (listener != null && !userInput.getText().toString().isEmpty()) { if(listener != null && !userInput.getText().toString().isEmpty()){
listener.confirm(userInput.getText().toString()); listener.confirm(userInput.getText().toString());
} }
@@ -96,18 +97,18 @@ public class AndroidTextFieldDialog{
return this; return this;
} }
public AndroidTextFieldDialog setTextPromptListener(TextPromptListener listener) { public AndroidTextFieldDialog setTextPromptListener(TextPromptListener listener){
this.listener = listener; this.listener = listener;
return this; return this;
} }
public AndroidTextFieldDialog setInputType(int type) { public AndroidTextFieldDialog setInputType(int type){
userInput.setInputType(type); userInput.setInputType(type);
return this; return this;
} }
public AndroidTextFieldDialog setMaxLength(int length) { public AndroidTextFieldDialog setMaxLength(int length){
userInput.setFilters(new InputFilter[] { new InputFilter.LengthFilter(length) }); userInput.setFilters(new InputFilter[]{new InputFilter.LengthFilter(length)});
return this; return this;
} }

View File

@@ -8,12 +8,9 @@ import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction; import android.support.v4.app.FragmentTransaction;
import android.view.View; import android.view.View;
import android.widget.Button; import android.widget.Button;
import org.sufficientlysecure.donations.DonationsFragment; import org.sufficientlysecure.donations.DonationsFragment;
public class DonationsActivity extends FragmentActivity { public class DonationsActivity extends FragmentActivity{
DonationsFragment donationsFragment;
/** /**
* Google * Google
*/ */
@@ -21,13 +18,14 @@ public class DonationsActivity extends FragmentActivity {
private static final String[] GOOGLE_CATALOG = new String[]{ private static final String[] GOOGLE_CATALOG = new String[]{
"mindustry.donation.1", "mindustry.donation.2", "mindustry.donation.5", "mindustry.donation.1", "mindustry.donation.2", "mindustry.donation.5",
"mindustry.donation.10", "mindustry.donation.15", "mindustry.donation.10", "mindustry.donation.15",
"mindustry.donation.25", "mindustry.donation.50" }; "mindustry.donation.25", "mindustry.donation.50"};
DonationsFragment donationsFragment;
/** /**
* Called when the activity is first created. * Called when the activity is first created.
*/ */
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setTheme(R.style.GdxTheme); setTheme(R.style.GdxTheme);
@@ -35,7 +33,7 @@ public class DonationsActivity extends FragmentActivity {
setContentView(R.layout.donations_activity); setContentView(R.layout.donations_activity);
FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
if (BuildConfig.DONATIONS_GOOGLE) { if(BuildConfig.DONATIONS_GOOGLE){
donationsFragment = DonationsFragment.newInstance(BuildConfig.DEBUG, true, GOOGLE_PUBKEY, GOOGLE_CATALOG, donationsFragment = DonationsFragment.newInstance(BuildConfig.DEBUG, true, GOOGLE_PUBKEY, GOOGLE_CATALOG,
getResources().getStringArray(R.array.donation_google_catalog_values), false, null, null, getResources().getStringArray(R.array.donation_google_catalog_values), false, null, null,
null, false, null, null, false, null); null, false, null, null, false, null);
@@ -48,9 +46,10 @@ public class DonationsActivity extends FragmentActivity {
public void onStart(){ public void onStart(){
super.onStart(); super.onStart();
Button b = ((Button)findViewById(org.sufficientlysecure.donations.R.id.donations__google_android_market_donate_button)); Button b = ((Button) findViewById(org.sufficientlysecure.donations.R.id.donations__google_android_market_donate_button));
b.setOnClickListener(new View.OnClickListener() { b.setOnClickListener(new View.OnClickListener(){
@Override public void onClick(View view) { @Override
public void onClick(View view){
donationsFragment.donateGoogleOnClick(donationsFragment.getView()); donationsFragment.donateGoogleOnClick(donationsFragment.getView());
b.setEnabled(false); b.setEnabled(false);
} }
@@ -58,20 +57,19 @@ public class DonationsActivity extends FragmentActivity {
} }
/** /**
* Needed for Google Play In-app Billing. It uses startIntentSenderForResult(). The result is not propagated to * Needed for Google Play In-app Billing. It uses startIntentSenderForResult(). The result is not propagated to
* the Fragment like in startActivityForResult(). Thus we need to propagate manually to our Fragment. * the Fragment like in startActivityForResult(). Thus we need to propagate manually to our Fragment.
*/ */
@Override @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) { protected void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data);
Button b = ((Button)findViewById(org.sufficientlysecure.donations.R.id.donations__google_android_market_donate_button)); Button b = ((Button) findViewById(org.sufficientlysecure.donations.R.id.donations__google_android_market_donate_button));
b.setEnabled(true); b.setEnabled(true);
FragmentManager fragmentManager = getSupportFragmentManager(); FragmentManager fragmentManager = getSupportFragmentManager();
Fragment fragment = fragmentManager.findFragmentByTag("donationsFragment"); Fragment fragment = fragmentManager.findFragmentByTag("donationsFragment");
if (fragment != null) { if(fragment != null){
fragment.onActivityResult(requestCode, resultCode, data); fragment.onActivityResult(requestCode, resultCode, data);
//TODO donation event, set settings? //TODO donation event, set settings?
} }

View File

@@ -0,0 +1,20 @@
package io.anuke.mindustry;
import com.badlogic.gdx.backends.android.AndroidApplication;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class PatchedAndroidApplication extends AndroidApplication {
private final ExecutorService exec = Executors.newSingleThreadExecutor();
@Override
protected void onPause () {
if(useImmersiveMode) {
exec.submit(() -> {
try {Thread.sleep(100);} catch (InterruptedException ignored) {}
graphics.onDrawFrame(null);
});
}
super.onPause();
}
}

View File

@@ -15,10 +15,17 @@ public class TextFieldDialogListener extends ClickListener{
private int type; private int type;
private int max; 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){ public static void add(TextField field, int type, int max){
field.addListener(new TextFieldDialogListener(field, type, max)); field.addListener(new TextFieldDialogListener(field, type, max));
field.addListener(new InputListener(){ field.addListener(new InputListener(){
public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) { public boolean touchDown(InputEvent event, float x, float y, int pointer, int button){
Gdx.input.setOnscreenKeyboardVisible(false); Gdx.input.setOnscreenKeyboardVisible(false);
return false; return false;
} }
@@ -29,13 +36,6 @@ public class TextFieldDialogListener extends ClickListener{
add(field, 0, 16); add(field, 0, 16);
} }
//type - 0 is text, 1 is numbers, 2 is decimals
public TextFieldDialogListener(TextField field, int type, int max){
this.field = field;
this.type = type;
this.max = max;
}
public void clicked(final InputEvent event, float x, float y){ public void clicked(final InputEvent event, float x, float y){
if(Gdx.app.getType() == ApplicationType.Desktop) return; if(Gdx.app.getType() == ApplicationType.Desktop) return;

View File

@@ -9,70 +9,31 @@ import java.lang.annotation.Target;
* Goal: To create a system to send events to the server from the client and vice versa, without creating a new packet type each time.<br> * Goal: To create a system to send events to the server from the client and vice versa, without creating a new packet type each time.<br>
* These events may optionally also trigger on the caller client/server as well.<br> * These events may optionally also trigger on the caller client/server as well.<br>
*/ */
public class Annotations { public class Annotations{
/**Marks a method as invokable remotely across a server/client connection.*/ public enum PacketPriority{
@Target(ElementType.METHOD) /** Gets put in a queue and processed if not connected. */
@Retention(RetentionPolicy.CLASS)
public @interface Remote {
/**Specifies the locations from which this method can be invoked.*/
Loc targets() default Loc.server;
/**Specifies which methods are generated. Only affects server-to-client methods.*/
Variant variants() default Variant.all;
/**The local locations where this method is called locally, when invoked.*/
Loc called() default Loc.none;
/**Whether to forward this packet to all other clients upon recieval. Server only.*/
boolean forward() default false;
/**Whether the packet for this method is sent with UDP instead of TCP.
* UDP is faster, but is prone to packet loss and duplication.*/
boolean unreliable() default false;
/**The simple class name where this method is placed.*/
String in() default "Call";
/**Priority of this event.*/
PacketPriority priority() default PacketPriority.normal;
}
/**Specifies that this method will be used to write classes of the type returned by {@link #value()}.<br>
* This method must return void and have two parameters, the first being of type {@link java.nio.ByteBuffer} and the second
* being the type returned by {@link #value()}.*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface WriteClass {
Class<?> value();
}
/**Specifies that this method will be used to read classes of the type returned by {@link #value()}. <br>
* This method must return the type returned by {@link #value()},
* and have one parameter, being of type {@link java.nio.ByteBuffer}.*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface ReadClass {
Class<?> value();
}
public enum PacketPriority {
/**Gets put in a queue and processed if not connected.*/
normal, normal,
/**Gets handled immediately, regardless of connection status.*/ /** Gets handled immediately, regardless of connection status. */
high, high,
/**Does not get handled unless client is connected.*/ /** Does not get handled unless client is connected. */
low low
} }
/**A set of two booleans, one specifying server and one specifying client.*/ /** A set of two booleans, one specifying server and one specifying client. */
public enum Loc { public enum Loc{
/**Method can only be invoked on the client from the server.*/ /** Method can only be invoked on the client from the server. */
server(true, false), server(true, false),
/**Method can only be invoked on the server from the client.*/ /** Method can only be invoked on the server from the client. */
client(false, true), client(false, true),
/**Method can be invoked from anywhere*/ /** Method can be invoked from anywhere */
both(true, true), both(true, true),
/**Neither server no client.*/ /** Neither server nor client. */
none(false, false); none(false, false);
/**If true, this method can be invoked ON clients FROM servers.*/ /** If true, this method can be invoked ON clients FROM servers. */
public final boolean isServer; public final boolean isServer;
/**If true, this method can be invoked ON servers FROM clients.*/ /** If true, this method can be invoked ON servers FROM clients. */
public final boolean isClient; public final boolean isClient;
Loc(boolean server, boolean client){ Loc(boolean server, boolean client){
@@ -81,12 +42,12 @@ public class Annotations {
} }
} }
public enum Variant { public enum Variant{
/**Method can only be invoked targeting one player.*/ /** Method can only be invoked targeting one player. */
one(true, false), one(true, false),
/**Method can only be invoked targeting all players.*/ /** Method can only be invoked targeting all players. */
all(false, true), all(false, true),
/**Method targets both one player and all players.*/ /** Method targets both one player and all players. */
both(true, true); both(true, true);
public final boolean isOne, isAll; public final boolean isOne, isAll;
@@ -96,4 +57,52 @@ public class Annotations {
this.isAll = isAll; this.isAll = isAll;
} }
} }
/** Marks a method as invokable remotely across a server/client connection. */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface Remote{
/** Specifies the locations from which this method can be invoked. */
Loc targets() default Loc.server;
/** Specifies which methods are generated. Only affects server-to-client methods. */
Variant variants() default Variant.all;
/** The local locations where this method is called locally, when invoked. */
Loc called() default Loc.none;
/** Whether to forward this packet to all other clients upon recieval. Client only. */
boolean forward() default false;
/**
* Whether the packet for this method is sent with UDP instead of TCP.
* UDP is faster, but is prone to packet loss and duplication.
*/
boolean unreliable() default false;
/** Priority of this event. */
PacketPriority priority() default PacketPriority.normal;
}
/**
* Specifies that this method will be used to write classes of the type returned by {@link #value()}.<br>
* This method must return void and have two parameters, the first being of type {@link java.nio.ByteBuffer} and the second
* being the type returned by {@link #value()}.
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface WriteClass{
Class<?> value();
}
/**
* Specifies that this method will be used to read classes of the type returned by {@link #value()}. <br>
* This method must return the type returned by {@link #value()},
* and have one parameter, being of type {@link java.nio.ByteBuffer}.
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface ReadClass{
Class<?> value();
}
} }

View File

@@ -2,14 +2,14 @@ package io.anuke.annotations;
import java.util.ArrayList; import java.util.ArrayList;
/**Represents a class witha list method entries to include in it.*/ /** Represents a class witha list method entries to include in it. */
public class ClassEntry { public class ClassEntry{
/**All methods in this generated class.*/ /** All methods in this generated class. */
public final ArrayList<MethodEntry> methods = new ArrayList<>(); public final ArrayList<MethodEntry> methods = new ArrayList<>();
/**Simple class name.*/ /** Simple class name. */
public final String name; public final String name;
public ClassEntry(String name) { public ClassEntry(String name){
this.name = name; this.name = name;
} }
} }

View File

@@ -10,12 +10,16 @@ import javax.tools.Diagnostic.Kind;
import java.util.HashMap; import java.util.HashMap;
import java.util.Set; import java.util.Set;
/**This class finds reader and writer methods annotated by the {@link io.anuke.annotations.Annotations.WriteClass} /**
* and {@link io.anuke.annotations.Annotations.ReadClass} annotations.*/ * This class finds reader and writer methods annotated by the {@link io.anuke.annotations.Annotations.WriteClass}
public class IOFinder { * and {@link io.anuke.annotations.Annotations.ReadClass} annotations.
*/
public class IOFinder{
/**Finds all class serializers for all types and returns them. Logs errors when necessary. /**
* Maps fully qualified class names to their serializers.*/ * Finds all class serializers for all types and returns them. Logs errors when necessary.
* Maps fully qualified class names to their serializers.
*/
public HashMap<String, ClassSerializer> findSerializers(RoundEnvironment env){ public HashMap<String, ClassSerializer> findSerializers(RoundEnvironment env){
HashMap<String, ClassSerializer> result = new HashMap<>(); HashMap<String, ClassSerializer> result = new HashMap<>();
@@ -51,33 +55,33 @@ public class IOFinder {
} }
private String getValue(WriteClass write){ private String getValue(WriteClass write){
try { try{
Class<?> type = write.value(); Class<?> type = write.value();
return type.getName(); return type.getName();
}catch (MirroredTypeException e){ }catch(MirroredTypeException e){
return e.getTypeMirror().toString(); return e.getTypeMirror().toString();
} }
} }
private String getValue(ReadClass read){ private String getValue(ReadClass read){
try { try{
Class<?> type = read.value(); Class<?> type = read.value();
return type.getName(); return type.getName();
}catch (MirroredTypeException e){ }catch(MirroredTypeException e){
return e.getTypeMirror().toString(); return e.getTypeMirror().toString();
} }
} }
/**Information about read/write methods for a specific class type.*/ /** Information about read/write methods for a specific class type. */
public static class ClassSerializer{ public static class ClassSerializer{
/**Fully qualified method name of the reader.*/ /** Fully qualified method name of the reader. */
public final String readMethod; public final String readMethod;
/**Fully qualified method name of the writer.*/ /** Fully qualified method name of the writer. */
public final String writeMethod; public final String writeMethod;
/**Fully qualified class type name.*/ /** Fully qualified class type name. */
public final String classType; public final String classType;
public ClassSerializer(String readMethod, String writeMethod, String classType) { public ClassSerializer(String readMethod, String writeMethod, String classType){
this.readMethod = readMethod; this.readMethod = readMethod;
this.writeMethod = writeMethod; this.writeMethod = writeMethod;
this.classType = classType; this.classType = classType;

View File

@@ -6,32 +6,34 @@ import io.anuke.annotations.Annotations.Variant;
import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.ExecutableElement;
/**Class that repesents a remote method to be constructed and put into a class.*/ /** Class that repesents a remote method to be constructed and put into a class. */
public class MethodEntry { public class MethodEntry{
/**Simple target class name.*/ /** Simple target class name. */
public final String className; public final String className;
/**Fully qualified target method to call.*/ /** Fully qualified target method to call. */
public final String targetMethod; public final String targetMethod;
/**Whether this method can be called on a client/server.*/ /** Whether this method can be called on a client/server. */
public final Loc where; public final Loc where;
/**Whether an additional 'one' and 'all' method variant is generated. At least one of these must be true. /**
* Only applicable to client (server-invoked) methods.*/ * Whether an additional 'one' and 'all' method variant is generated. At least one of these must be true.
* Only applicable to client (server-invoked) methods.
*/
public final Variant target; public final Variant target;
/**Whether this method is called locally as well as remotely.*/ /** Whether this method is called locally as well as remotely. */
public final Loc local; public final Loc local;
/**Whether this method is unreliable and uses UDP.*/ /** Whether this method is unreliable and uses UDP. */
public final boolean unreliable; public final boolean unreliable;
/**Whether to forward this method call to all other clients when a client invokes it. Server only.*/ /** Whether to forward this method call to all other clients when a client invokes it. Server only. */
public final boolean forward; public final boolean forward;
/**Unique method ID.*/ /** Unique method ID. */
public final int id; public final int id;
/**The element method associated with this entry.*/ /** The element method associated with this entry. */
public final ExecutableElement element; public final ExecutableElement element;
/**The assigned packet priority. Only used in clients.*/ /** The assigned packet priority. Only used in clients. */
public final PacketPriority priority; public final PacketPriority priority;
public MethodEntry(String className, String targetMethod, Loc where, Variant target, public MethodEntry(String className, String targetMethod, Loc where, Variant target,
Loc local, boolean unreliable, boolean forward, int id, ExecutableElement element, PacketPriority priority) { Loc local, boolean unreliable, boolean forward, int id, ExecutableElement element, PacketPriority priority){
this.className = className; this.className = className;
this.forward = forward; this.forward = forward;
this.targetMethod = targetMethod; this.targetMethod = targetMethod;
@@ -45,7 +47,7 @@ public class MethodEntry {
} }
@Override @Override
public int hashCode() { public int hashCode(){
return targetMethod.hashCode(); return targetMethod.hashCode();
} }
} }

View File

@@ -18,25 +18,27 @@ import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/**The annotation processor for generating remote method call code.*/ /** The annotation processor for generating remote method call code. */
@SupportedSourceVersion(SourceVersion.RELEASE_8) @SupportedSourceVersion(SourceVersion.RELEASE_8)
@SupportedAnnotationTypes({ @SupportedAnnotationTypes({
"io.anuke.annotations.Annotations.Remote", "io.anuke.annotations.Annotations.Remote",
"io.anuke.annotations.Annotations.WriteClass", "io.anuke.annotations.Annotations.WriteClass",
"io.anuke.annotations.Annotations.ReadClass", "io.anuke.annotations.Annotations.ReadClass",
}) })
public class RemoteMethodAnnotationProcessor extends AbstractProcessor { public class RemoteMethodAnnotationProcessor extends AbstractProcessor{
/**Maximum size of each event packet.*/ /** Maximum size of each event packet. */
public static final int maxPacketSize = 4096; public static final int maxPacketSize = 4096;
/**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";
/**Name of class that handles reading and invoking packets on the server.*/ /** Name of class that handles reading and invoking packets on the server. */
private static final String readServerName = "RemoteReadServer"; private static final String readServerName = "RemoteReadServer";
/**Name of class that handles reading and invoking packets on the client.*/ /** Name of class that handles reading and invoking packets on the client. */
private static final String readClientName = "RemoteReadClient"; private static final String readClientName = "RemoteReadClient";
/**Simple class name of generated class name.*/
private static final String callLocation = "Call";
/**Processing round number.*/ /** Processing round number. */
private int round; private int round;
//class serializers //class serializers
@@ -51,7 +53,7 @@ public class RemoteMethodAnnotationProcessor extends AbstractProcessor {
private ArrayList<ClassEntry> classes; private ArrayList<ClassEntry> classes;
@Override @Override
public synchronized void init(ProcessingEnvironment processingEnv) { public synchronized void init(ProcessingEnvironment processingEnv){
super.init(processingEnv); super.init(processingEnv);
//put all relevant utils into utils class //put all relevant utils into utils class
Utils.typeUtils = processingEnv.getTypeUtils(); Utils.typeUtils = processingEnv.getTypeUtils();
@@ -61,15 +63,15 @@ public class RemoteMethodAnnotationProcessor extends AbstractProcessor {
} }
@Override @Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv){
if(round > 1) return false; //only process 2 rounds if(round > 1) return false; //only process 2 rounds
round ++; round++;
try { try{
//round 1: find all annotations, generate *writers* //round 1: find all annotations, generate *writers*
if(round == 1) { if(round == 1){
//get serializers //get serializers
serializers = new IOFinder().findSerializers(roundEnv); serializers = new IOFinder().findSerializers(roundEnv);
@@ -88,29 +90,29 @@ public class RemoteMethodAnnotationProcessor extends AbstractProcessor {
orderedElements.sort(Comparator.comparing(Object::toString)); orderedElements.sort(Comparator.comparing(Object::toString));
//create methods //create methods
for (Element element : orderedElements) { for(Element element : orderedElements){
Remote annotation = element.getAnnotation(Remote.class); Remote annotation = element.getAnnotation(Remote.class);
//check for static //check for static
if (!element.getModifiers().contains(Modifier.STATIC) || !element.getModifiers().contains(Modifier.PUBLIC)) { if(!element.getModifiers().contains(Modifier.STATIC) || !element.getModifiers().contains(Modifier.PUBLIC)){
Utils.messager.printMessage(Kind.ERROR, "All @Remote methods must be public and static: ", element); Utils.messager.printMessage(Kind.ERROR, "All @Remote methods must be public and static: ", element);
} }
//can't generate none methods //can't generate none methods
if (annotation.targets() == Loc.none) { if(annotation.targets() == Loc.none){
Utils.messager.printMessage(Kind.ERROR, "A @Remote method's targets() cannot be equal to 'none':", element); Utils.messager.printMessage(Kind.ERROR, "A @Remote method's targets() cannot be equal to 'none':", element);
} }
//get and create class entry if needed //get and create class entry if needed
if (!classMap.containsKey(annotation.in())) { if(!classMap.containsKey(callLocation)){
ClassEntry clas = new ClassEntry(annotation.in()); ClassEntry clas = new ClassEntry(callLocation);
classMap.put(annotation.in(), clas); classMap.put(callLocation, clas);
classes.add(clas); classes.add(clas);
Utils.messager.printMessage(Kind.NOTE, "Generating class '" + clas.name + "'."); Utils.messager.printMessage(Kind.NOTE, "Generating class '" + clas.name + "'.");
} }
ClassEntry entry = classMap.get(annotation.in()); ClassEntry entry = classMap.get(callLocation);
//create and add entry //create and add entry
MethodEntry method = new MethodEntry(entry.name, Utils.getMethodName(element), annotation.targets(), annotation.variants(), MethodEntry method = new MethodEntry(entry.name, Utils.getMethodName(element), annotation.targets(), annotation.variants(),
@@ -127,7 +129,7 @@ public class RemoteMethodAnnotationProcessor extends AbstractProcessor {
writegen.generateFor(classes, packageName); writegen.generateFor(classes, packageName);
return true; return true;
}else if(round == 2) { //round 2: generate all *readers* }else if(round == 2){ //round 2: generate all *readers*
RemoteReadGenerator readgen = new RemoteReadGenerator(serializers); RemoteReadGenerator readgen = new RemoteReadGenerator(serializers);
//generate server readers //generate server readers
@@ -147,7 +149,7 @@ public class RemoteMethodAnnotationProcessor extends AbstractProcessor {
return true; return true;
} }
}catch (Exception e){ }catch(Exception e){
e.printStackTrace(); e.printStackTrace();
throw new RuntimeException(e); throw new RuntimeException(e);
} }

View File

@@ -14,22 +14,25 @@ import java.nio.ByteBuffer;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
/**Generates code for reading remote invoke packets on the client and server.*/ /** Generates code for reading remote invoke packets on the client and server. */
public class RemoteReadGenerator { public class RemoteReadGenerator{
private final HashMap<String, ClassSerializer> serializers; private final HashMap<String, ClassSerializer> serializers;
/**Creates a read generator that uses the supplied serializer setup.*/ /** Creates a read generator that uses the supplied serializer setup. */
public RemoteReadGenerator(HashMap<String, ClassSerializer> serializers) { public RemoteReadGenerator(HashMap<String, ClassSerializer> serializers){
this.serializers = serializers; this.serializers = serializers;
} }
/**Generates a class for reading remote invoke packets. /**
* Generates a class for reading remote invoke packets.
*
* @param entries List of methods to use/ * @param entries List of methods to use/
* @param className Simple target class name. * @param className Simple target class name.
* @param packageName Full target package name. * @param packageName Full target package name.
* @param needsPlayer Whether this read method requires a reference to the player sender.*/ * @param needsPlayer Whether this read method requires a reference to the player sender.
*/
public void generateFor(List<MethodEntry> entries, String className, String packageName, boolean needsPlayer) public void generateFor(List<MethodEntry> entries, String className, String packageName, boolean needsPlayer)
throws IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException, IOException { throws IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException, IOException{
TypeSpec.Builder classBuilder = TypeSpec.classBuilder(className).addModifiers(Modifier.PUBLIC); TypeSpec.Builder classBuilder = TypeSpec.classBuilder(className).addModifiers(Modifier.PUBLIC);
@@ -69,10 +72,10 @@ public class RemoteReadGenerator {
StringBuilder varResult = new StringBuilder(); StringBuilder varResult = new StringBuilder();
//go through each parameter //go through each parameter
for(int i = 0; i < entry.element.getParameters().size(); i ++){ for(int i = 0; i < entry.element.getParameters().size(); i++){
VariableElement var = entry.element.getParameters().get(i); VariableElement var = entry.element.getParameters().get(i);
if(!needsPlayer || i != 0) { //if client, skip first parameter since it's always of type player and doesn't need to be read if(!needsPlayer || i != 0){ //if client, skip first parameter since it's always of type player and doesn't need to be read
//full type name of parameter //full type name of parameter
String typeName = var.asType().toString(); String typeName = var.asType().toString();
//name of parameter //name of parameter
@@ -81,17 +84,17 @@ public class RemoteReadGenerator {
String capName = typeName.equals("byte") ? "" : Character.toUpperCase(typeName.charAt(0)) + typeName.substring(1); String capName = typeName.equals("byte") ? "" : Character.toUpperCase(typeName.charAt(0)) + typeName.substring(1);
//write primitives automatically //write primitives automatically
if (Utils.isPrimitive(typeName)) { if(Utils.isPrimitive(typeName)){
if (typeName.equals("boolean")) { if(typeName.equals("boolean")){
readBlock.addStatement("boolean " + varName + " = buffer.get() == 1"); readBlock.addStatement("boolean " + varName + " = buffer.get() == 1");
} else { }else{
readBlock.addStatement(typeName + " " + varName + " = buffer.get" + capName + "()"); readBlock.addStatement(typeName + " " + varName + " = buffer.get" + capName + "()");
} }
} else { }else{
//else, try and find a serializer //else, try and find a serializer
ClassSerializer ser = serializers.get(typeName); ClassSerializer ser = serializers.get(typeName);
if (ser == null) { //make sure a serializer exists! if(ser == null){ //make sure a serializer exists!
Utils.messager.printMessage(Kind.ERROR, "No @ReadClass method to read class type: '" + typeName + "'", var); Utils.messager.printMessage(Kind.ERROR, "No @ReadClass method to read class type: '" + typeName + "'", var);
return; return;
} }
@@ -121,7 +124,7 @@ public class RemoteReadGenerator {
} }
readBlock.nextControlFlow("catch (java.lang.Exception e)"); readBlock.nextControlFlow("catch (java.lang.Exception e)");
readBlock.addStatement("throw new java.lang.RuntimeException(\"Failed to to read remote method '"+entry.element.getSimpleName() +"'!\", e)"); readBlock.addStatement("throw new java.lang.RuntimeException(\"Failed to to read remote method '" + entry.element.getSimpleName() + "'!\", e)");
readBlock.endControlFlow(); readBlock.endControlFlow();
} }

View File

@@ -14,17 +14,17 @@ import java.nio.ByteBuffer;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
/**Generates code for writing remote invoke packets on the client and server.*/ /** Generates code for writing remote invoke packets on the client and server. */
public class RemoteWriteGenerator { public class RemoteWriteGenerator{
private final HashMap<String, ClassSerializer> serializers; private final HashMap<String, ClassSerializer> serializers;
/**Creates a write generator that uses the supplied serializer setup.*/ /** Creates a write generator that uses the supplied serializer setup. */
public RemoteWriteGenerator(HashMap<String, ClassSerializer> serializers) { public RemoteWriteGenerator(HashMap<String, ClassSerializer> serializers){
this.serializers = serializers; this.serializers = serializers;
} }
/**Generates all classes in this list.*/ /** Generates all classes in this list. */
public void generateFor(List<ClassEntry> entries, String packageName) throws IOException { public void generateFor(List<ClassEntry> entries, String packageName) throws IOException{
for(ClassEntry entry : entries){ for(ClassEntry entry : entries){
//create builder //create builder
@@ -58,7 +58,7 @@ public class RemoteWriteGenerator {
} }
} }
/**Creates a specific variant for a method entry.*/ /** Creates a specific variant for a method entry. */
private void writeMethodVariant(TypeSpec.Builder classBuilder, MethodEntry methodEntry, boolean toAll, boolean forwarded){ private void writeMethodVariant(TypeSpec.Builder classBuilder, MethodEntry methodEntry, boolean toAll, boolean forwarded){
ExecutableElement elem = methodEntry.element; ExecutableElement elem = methodEntry.element;
@@ -99,7 +99,7 @@ public class RemoteWriteGenerator {
if(!forwarded && methodEntry.local != Loc.none){ if(!forwarded && methodEntry.local != Loc.none){
//add in local checks //add in local checks
if(methodEntry.local != Loc.both){ if(methodEntry.local != Loc.both){
method.beginControlFlow("if("+getCheckString(methodEntry.local) + " || !io.anuke.mindustry.net.Net.active())"); method.beginControlFlow("if(" + getCheckString(methodEntry.local) + " || !io.anuke.mindustry.net.Net.active())");
} }
//concatenate parameters //concatenate parameters
@@ -109,16 +109,16 @@ public class RemoteWriteGenerator {
//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.players[0]");
}else { }else{
results.append(var.getSimpleName()); results.append(var.getSimpleName());
} }
if(index != elem.getParameters().size() - 1) results.append(", "); if(index != elem.getParameters().size() - 1) results.append(", ");
index ++; index++;
} }
//add the statement to call it //add the statement to call it
method.addStatement("$N." + elem.getSimpleName() + "(" + results.toString() + ")", method.addStatement("$N." + elem.getSimpleName() + "(" + results.toString() + ")",
((TypeElement)elem.getEnclosingElement()).getQualifiedName().toString()); ((TypeElement) elem.getEnclosingElement()).getQualifiedName().toString());
if(methodEntry.local != Loc.both){ if(methodEntry.local != Loc.both){
method.endControlFlow(); method.endControlFlow();
@@ -126,10 +126,10 @@ public class RemoteWriteGenerator {
} }
//start control flow to check if it's actually client/server so no netcode is called //start control flow to check if it's actually client/server so no netcode is called
method.beginControlFlow("if("+getCheckString(methodEntry.where)+")"); method.beginControlFlow("if(" + getCheckString(methodEntry.where) + ")");
//add statement to create packet from pool //add statement to create packet from pool
method.addStatement("$1N packet = $2N.obtain($1N.class)", "io.anuke.mindustry.net.Packets.InvokePacket", "com.badlogic.gdx.utils.Pools"); method.addStatement("$1N packet = $2N.obtain($1N.class)", "io.anuke.mindustry.net.Packets.InvokePacket", "io.anuke.ucore.util.Pooling");
//assign buffer //assign buffer
method.addStatement("packet.writeBuffer = TEMP_BUFFER"); method.addStatement("packet.writeBuffer = TEMP_BUFFER");
//assign priority //assign priority
@@ -139,7 +139,7 @@ public class RemoteWriteGenerator {
//rewind buffer //rewind buffer
method.addStatement("TEMP_BUFFER.position(0)"); method.addStatement("TEMP_BUFFER.position(0)");
for(int i = 0; i < elem.getParameters().size(); i ++){ for(int i = 0; i < elem.getParameters().size(); i++){
//first argument is skipped as it is always the player caller //first argument is skipped as it is always the player caller
if((!methodEntry.where.isServer/* || methodEntry.mode == Loc.both*/) && i == 0){ if((!methodEntry.where.isServer/* || methodEntry.mode == Loc.both*/) && i == 0){
continue; continue;
@@ -164,7 +164,7 @@ public class RemoteWriteGenerator {
method.beginControlFlow("if(io.anuke.mindustry.net.Net.server())"); method.beginControlFlow("if(io.anuke.mindustry.net.Net.server())");
} }
if(Utils.isPrimitive(typeName)) { //check if it's a primitive, and if so write it if(Utils.isPrimitive(typeName)){ //check if it's a primitive, and if so write it
if(typeName.equals("boolean")){ //booleans are special if(typeName.equals("boolean")){ //booleans are special
method.addStatement("TEMP_BUFFER.put(" + varName + " ? (byte)1 : 0)"); method.addStatement("TEMP_BUFFER.put(" + varName + " ? (byte)1 : 0)");
}else{ }else{
@@ -181,7 +181,7 @@ public class RemoteWriteGenerator {
} }
//add statement for writing it //add statement for writing it
method.addStatement(ser.writeMethod + "(TEMP_BUFFER, " + varName +")"); method.addStatement(ser.writeMethod + "(TEMP_BUFFER, " + varName + ")");
} }
if(writePlayerSkipCheck){ //write end check if(writePlayerSkipCheck){ //write end check
@@ -197,7 +197,7 @@ public class RemoteWriteGenerator {
if(forwarded){ //forward packet if(forwarded){ //forward packet
if(!methodEntry.local.isClient){ //if the client doesn't get it called locally, forward it back after validation if(!methodEntry.local.isClient){ //if the client doesn't get it called locally, forward it back after validation
sendString = "send("; sendString = "send(";
}else { }else{
sendString = "sendExcept(exceptSenderID, "; sendString = "sendExcept(exceptSenderID, ";
} }
}else if(toAll){ //send to all players / to server }else if(toAll){ //send to all players / to server
@@ -207,8 +207,8 @@ public class RemoteWriteGenerator {
} }
//send the actual packet //send the actual packet
method.addStatement("io.anuke.mindustry.net.Net." + sendString + "packet, "+ method.addStatement("io.anuke.mindustry.net.Net." + sendString + "packet, " +
(methodEntry.unreliable ? "io.anuke.mindustry.net.Net.SendMode.udp" : "io.anuke.mindustry.net.Net.SendMode.tcp")+")"); (methodEntry.unreliable ? "io.anuke.mindustry.net.Net.SendMode.udp" : "io.anuke.mindustry.net.Net.SendMode.tcp") + ")");
//end check for server/client //end check for server/client

View File

@@ -7,14 +7,14 @@ import javax.lang.model.element.TypeElement;
import javax.lang.model.util.Elements; import javax.lang.model.util.Elements;
import javax.lang.model.util.Types; import javax.lang.model.util.Types;
public class Utils { public class Utils{
public static Types typeUtils; public static Types typeUtils;
public static Elements elementUtils; public static Elements elementUtils;
public static Filer filer; public static Filer filer;
public static Messager messager; public static Messager messager;
public static String getMethodName(Element element){ public static String getMethodName(Element element){
return ((TypeElement)element.getEnclosingElement()).getQualifiedName().toString() + "." + element.getSimpleName(); return ((TypeElement) element.getEnclosingElement()).getQualifiedName().toString() + "." + element.getSimpleName();
} }
public static boolean isPrimitive(String type){ public static boolean isPrimitive(String type){

View File

@@ -9,7 +9,7 @@ buildscript {
dependencies { dependencies {
classpath 'com.mobidevelop.robovm:robovm-gradle-plugin:2.3.0' classpath 'com.mobidevelop.robovm:robovm-gradle-plugin:2.3.0'
classpath 'de.richsource.gradle.plugins:gwt-gradle-plugin:0.6' classpath 'de.richsource.gradle.plugins:gwt-gradle-plugin:0.6'
classpath 'com.android.tools.build:gradle:3.1.0' classpath 'com.android.tools.build:gradle:3.1.3'
classpath "com.badlogicgames.gdx:gdx-tools:1.9.8" classpath "com.badlogicgames.gdx:gdx-tools:1.9.8"
} }
} }
@@ -26,8 +26,7 @@ allprojects {
appName = 'Mindustry' appName = 'Mindustry'
gdxVersion = '1.9.8' gdxVersion = '1.9.8'
roboVMVersion = '2.3.0' roboVMVersion = '2.3.0'
aiVersion = '1.8.1' uCoreVersion = '76dc741b49'
uCoreVersion = '2241e5402e'
getVersionString = { getVersionString = {
String buildVersion = getBuildVersion() String buildVersion = getBuildVersion()
@@ -43,6 +42,17 @@ allprojects {
return project.ext.mainClassName.substring(0, project.ext.mainClassName.indexOf("desktop") - 1) return project.ext.mainClassName.substring(0, project.ext.mainClassName.indexOf("desktop") - 1)
} }
generateLocales = {
def output = '["en",'
def bundles = new File('core/assets/bundles/')
bundles.listFiles().each { other ->
if(other.name == "bundle.properties") return;
output += '"' + other.name.substring("bundle".length() + 1, other.name.lastIndexOf('.')) + '",'
}
output = (output.substring(0, output.size() - 1) + "]")
new File(project(':core').projectDir, 'assets/locales.json').text = output;
}
writeVersion = { writeVersion = {
def pfile = new File('core/assets/version.properties') def pfile = new File('core/assets/version.properties')
def props = new Properties() def props = new Properties()
@@ -86,7 +96,6 @@ project(":desktop") {
compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop" compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop"
compile "com.badlogicgames.gdx:gdx-controllers-lwjgl3:$gdxVersion" compile "com.badlogicgames.gdx:gdx-controllers-lwjgl3:$gdxVersion"
compile 'com.github.MinnDevelopment:java-discord-rpc:v2.0.0' compile 'com.github.MinnDevelopment:java-discord-rpc:v2.0.0'
compile 'com.yuvimasory:orange-extensions:1.3.0'
} }
} }
@@ -102,13 +111,10 @@ project(":html") {
compile "com.badlogicgames.gdx:gdx-backend-gwt:$gdxVersion" compile "com.badlogicgames.gdx:gdx-backend-gwt:$gdxVersion"
compile "com.badlogicgames.gdx:gdx:$gdxVersion:sources" compile "com.badlogicgames.gdx:gdx:$gdxVersion:sources"
compile "com.badlogicgames.gdx:gdx-backend-gwt:$gdxVersion:sources" compile "com.badlogicgames.gdx:gdx-backend-gwt:$gdxVersion:sources"
compile "com.badlogicgames.gdx:gdx-ai:$aiVersion:sources"
compile "com.badlogicgames.gdx:gdx-controllers:$gdxVersion:sources" compile "com.badlogicgames.gdx:gdx-controllers:$gdxVersion:sources"
compile "com.badlogicgames.gdx:gdx-controllers-gwt:$gdxVersion" compile "com.badlogicgames.gdx:gdx-controllers-gwt:$gdxVersion"
compile "com.badlogicgames.gdx:gdx-controllers-gwt:$gdxVersion:sources" compile "com.badlogicgames.gdx:gdx-controllers-gwt:$gdxVersion:sources"
compile "com.sksamuel.gwt:gwt-websockets:1.0.4"
compile "com.sksamuel.gwt:gwt-websockets:1.0.4:sources"
} }
compileJava.options.compilerArgs = [ compileJava.options.compilerArgs = [
@@ -120,6 +126,25 @@ project(":ios") {
apply plugin: "java" apply plugin: "java"
apply plugin: "robovm" apply plugin: "robovm"
task copyGen{
doFirst{
copy{
from ("../core/build/classes/java/main/io/anuke/mindustry/gen/"){
include "**/*.java"
}
into "../core/src/io/anuke/mindustry/gen"
}
}
doLast{
delete{
delete "../core/src/io/anuke/mindustry/gen/"
}
}
}
build.finalizedBy(copyGen)
dependencies { dependencies {
compile project(":core") compile project(":core")
@@ -135,16 +160,16 @@ project(":ios") {
project(":core") { project(":core") {
apply plugin: "java" apply plugin: "java"
task finish {
generateLocales()
}
dependencies { dependencies {
compileOnly project(":annotations") compileOnly project(":annotations")
build.finalizedBy(finish)
boolean comp = System.properties["release"] == null || System.properties["release"] == "false" def comp = System.properties["release"] == null || System.properties["release"] == "false"
if(!comp) println("Note: Compiling release build.")
if(!comp){
println("NOTICE: Compiling release build.")
}else{
println("Compiling DEBUG build.")
}
if(new File(projectDir.parent, '../uCore').exists() && comp){ if(new File(projectDir.parent, '../uCore').exists() && comp){
compile project(":uCore") compile project(":uCore")
@@ -168,6 +193,10 @@ project(":core") {
project(":server") { project(":server") {
apply plugin: "java" apply plugin: "java"
configurations {
compile.exclude module: android
}
dependencies { dependencies {
compileOnly project(":annotations") compileOnly project(":annotations")
@@ -200,7 +229,6 @@ project(":kryonet") {
dependencies { dependencies {
compile project(":core") compile project(":core")
compile 'com.github.crykn:kryonet:2.22.1' compile 'com.github.crykn:kryonet:2.22.1'
compile "org.java-websocket:Java-WebSocket:1.3.7"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 197 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 212 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 212 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 231 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 229 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 233 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 248 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 234 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 233 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 229 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 232 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 210 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 229 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 248 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 281 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 243 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 253 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 254 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 260 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 258 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 260 B

View File

Before

Width:  |  Height:  |  Size: 296 B

After

Width:  |  Height:  |  Size: 296 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 682 B

After

Width:  |  Height:  |  Size: 789 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 580 B

After

Width:  |  Height:  |  Size: 532 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 226 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 234 B

After

Width:  |  Height:  |  Size: 226 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 574 B

After

Width:  |  Height:  |  Size: 562 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 174 B

After

Width:  |  Height:  |  Size: 298 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 196 B

After

Width:  |  Height:  |  Size: 261 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 233 B

After

Width:  |  Height:  |  Size: 286 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 174 B

After

Width:  |  Height:  |  Size: 279 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 188 B

After

Width:  |  Height:  |  Size: 255 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 188 B

After

Width:  |  Height:  |  Size: 274 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 169 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 155 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 162 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 175 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 157 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 163 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 169 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 155 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 162 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 197 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 231 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 213 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 199 B

After

Width:  |  Height:  |  Size: 217 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 210 B

Some files were not shown because too many files have changed in this diff Show More