diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml
new file mode 100644
index 0000000000..08ad3a55e6
--- /dev/null
+++ b/android/AndroidManifest.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/core/assets/maps/canyon.png b/android/assets/maps/canyon.png
similarity index 100%
rename from core/assets/maps/canyon.png
rename to android/assets/maps/canyon.png
diff --git a/core/assets/maps/delta.png b/android/assets/maps/delta.png
similarity index 100%
rename from core/assets/maps/delta.png
rename to android/assets/maps/delta.png
diff --git a/core/assets/maps/map.png b/android/assets/maps/map.png
similarity index 100%
rename from core/assets/maps/map.png
rename to android/assets/maps/map.png
diff --git a/core/assets/maps/maze.png b/android/assets/maps/maze.png
similarity index 100%
rename from core/assets/maps/maze.png
rename to android/assets/maps/maze.png
diff --git a/core/assets/maps/pit.png b/android/assets/maps/pit.png
similarity index 100%
rename from core/assets/maps/pit.png
rename to android/assets/maps/pit.png
diff --git a/core/assets/maps/test.png b/android/assets/maps/test.png
similarity index 100%
rename from core/assets/maps/test.png
rename to android/assets/maps/test.png
diff --git a/core/assets/music/1.mp3 b/android/assets/music/1.mp3
similarity index 100%
rename from core/assets/music/1.mp3
rename to android/assets/music/1.mp3
diff --git a/core/assets/music/2.mp3 b/android/assets/music/2.mp3
similarity index 100%
rename from core/assets/music/2.mp3
rename to android/assets/music/2.mp3
diff --git a/core/assets/music/3.mp3 b/android/assets/music/3.mp3
similarity index 100%
rename from core/assets/music/3.mp3
rename to android/assets/music/3.mp3
diff --git a/core/assets/music/place.wav b/android/assets/music/place.wav
similarity index 100%
rename from core/assets/music/place.wav
rename to android/assets/music/place.wav
diff --git a/core/assets/music/shoot.wav b/android/assets/music/shoot.wav
similarity index 100%
rename from core/assets/music/shoot.wav
rename to android/assets/music/shoot.wav
diff --git a/core/assets/sounds/bloop.wav b/android/assets/sounds/bloop.wav
similarity index 100%
rename from core/assets/sounds/bloop.wav
rename to android/assets/sounds/bloop.wav
diff --git a/core/assets/sounds/break.wav b/android/assets/sounds/break.wav
similarity index 100%
rename from core/assets/sounds/break.wav
rename to android/assets/sounds/break.wav
diff --git a/core/assets/sounds/corexplode.wav b/android/assets/sounds/corexplode.wav
similarity index 100%
rename from core/assets/sounds/corexplode.wav
rename to android/assets/sounds/corexplode.wav
diff --git a/core/assets/sounds/die.wav b/android/assets/sounds/die.wav
similarity index 100%
rename from core/assets/sounds/die.wav
rename to android/assets/sounds/die.wav
diff --git a/core/assets/sounds/enemyshoot.wav b/android/assets/sounds/enemyshoot.wav
similarity index 100%
rename from core/assets/sounds/enemyshoot.wav
rename to android/assets/sounds/enemyshoot.wav
diff --git a/core/assets/sounds/explosion.wav b/android/assets/sounds/explosion.wav
similarity index 100%
rename from core/assets/sounds/explosion.wav
rename to android/assets/sounds/explosion.wav
diff --git a/core/assets/sounds/flame.wav b/android/assets/sounds/flame.wav
similarity index 100%
rename from core/assets/sounds/flame.wav
rename to android/assets/sounds/flame.wav
diff --git a/core/assets/sounds/flame2.wav b/android/assets/sounds/flame2.wav
similarity index 100%
rename from core/assets/sounds/flame2.wav
rename to android/assets/sounds/flame2.wav
diff --git a/core/assets/sounds/missile.wav b/android/assets/sounds/missile.wav
similarity index 100%
rename from core/assets/sounds/missile.wav
rename to android/assets/sounds/missile.wav
diff --git a/core/assets/sounds/place.wav b/android/assets/sounds/place.wav
similarity index 100%
rename from core/assets/sounds/place.wav
rename to android/assets/sounds/place.wav
diff --git a/core/assets/sounds/purchase.wav b/android/assets/sounds/purchase.wav
similarity index 100%
rename from core/assets/sounds/purchase.wav
rename to android/assets/sounds/purchase.wav
diff --git a/core/assets/sounds/resonate.wav b/android/assets/sounds/resonate.wav
similarity index 100%
rename from core/assets/sounds/resonate.wav
rename to android/assets/sounds/resonate.wav
diff --git a/core/assets/sounds/respawn.wav b/android/assets/sounds/respawn.wav
similarity index 100%
rename from core/assets/sounds/respawn.wav
rename to android/assets/sounds/respawn.wav
diff --git a/core/assets/sounds/shoot.wav b/android/assets/sounds/shoot.wav
similarity index 100%
rename from core/assets/sounds/shoot.wav
rename to android/assets/sounds/shoot.wav
diff --git a/core/assets/sounds/spawn.wav b/android/assets/sounds/spawn.wav
similarity index 100%
rename from core/assets/sounds/spawn.wav
rename to android/assets/sounds/spawn.wav
diff --git a/core/assets/sprites/back.png b/android/assets/sprites/back.png
similarity index 100%
rename from core/assets/sprites/back.png
rename to android/assets/sprites/back.png
diff --git a/core/assets/sprites/conveyor.png b/android/assets/sprites/conveyor.png
similarity index 100%
rename from core/assets/sprites/conveyor.png
rename to android/assets/sprites/conveyor.png
diff --git a/core/assets/sprites/conveyort.png b/android/assets/sprites/conveyort.png
similarity index 100%
rename from core/assets/sprites/conveyort.png
rename to android/assets/sprites/conveyort.png
diff --git a/core/assets/sprites/mindustry.atlas b/android/assets/sprites/mindustry.atlas
similarity index 100%
rename from core/assets/sprites/mindustry.atlas
rename to android/assets/sprites/mindustry.atlas
diff --git a/core/assets/sprites/mindustry.png b/android/assets/sprites/mindustry.png
similarity index 100%
rename from core/assets/sprites/mindustry.png
rename to android/assets/sprites/mindustry.png
diff --git a/core/assets/ui/backup/uiskin.atlas b/android/assets/ui/backup/uiskin.atlas
similarity index 100%
rename from core/assets/ui/backup/uiskin.atlas
rename to android/assets/ui/backup/uiskin.atlas
diff --git a/core/assets/ui/backup/uiskin.png b/android/assets/ui/backup/uiskin.png
similarity index 100%
rename from core/assets/ui/backup/uiskin.png
rename to android/assets/ui/backup/uiskin.png
diff --git a/core/assets/ui/out/blank.png b/android/assets/ui/out/blank.png
similarity index 100%
rename from core/assets/ui/out/blank.png
rename to android/assets/ui/out/blank.png
diff --git a/core/assets/ui/out/border-circle-error.png b/android/assets/ui/out/border-circle-error.png
similarity index 100%
rename from core/assets/ui/out/border-circle-error.png
rename to android/assets/ui/out/border-circle-error.png
diff --git a/core/assets/ui/out/border-circle.png b/android/assets/ui/out/border-circle.png
similarity index 100%
rename from core/assets/ui/out/border-circle.png
rename to android/assets/ui/out/border-circle.png
diff --git a/core/assets/ui/out/border-dark-blue.9.png b/android/assets/ui/out/border-dark-blue.9.png
similarity index 100%
rename from core/assets/ui/out/border-dark-blue.9.png
rename to android/assets/ui/out/border-dark-blue.9.png
diff --git a/core/assets/ui/out/border-error.9.png b/android/assets/ui/out/border-error.9.png
similarity index 100%
rename from core/assets/ui/out/border-error.9.png
rename to android/assets/ui/out/border-error.9.png
diff --git a/core/assets/ui/out/border-white.9.png b/android/assets/ui/out/border-white.9.png
similarity index 100%
rename from core/assets/ui/out/border-white.9.png
rename to android/assets/ui/out/border-white.9.png
diff --git a/core/assets/ui/out/border.9.png b/android/assets/ui/out/border.9.png
similarity index 100%
rename from core/assets/ui/out/border.9.png
rename to android/assets/ui/out/border.9.png
diff --git a/core/assets/ui/out/bump.9.png b/android/assets/ui/out/bump.9.png
similarity index 100%
rename from core/assets/ui/out/bump.9.png
rename to android/assets/ui/out/bump.9.png
diff --git a/core/assets/ui/out/button-blue-down.9.png b/android/assets/ui/out/button-blue-down.9.png
similarity index 100%
rename from core/assets/ui/out/button-blue-down.9.png
rename to android/assets/ui/out/button-blue-down.9.png
diff --git a/core/assets/ui/out/button-blue-over.9.png b/android/assets/ui/out/button-blue-over.9.png
similarity index 100%
rename from core/assets/ui/out/button-blue-over.9.png
rename to android/assets/ui/out/button-blue-over.9.png
diff --git a/core/assets/ui/out/button-blue.9.png b/android/assets/ui/out/button-blue.9.png
similarity index 100%
rename from core/assets/ui/out/button-blue.9.png
rename to android/assets/ui/out/button-blue.9.png
diff --git a/core/assets/ui/out/button-down.9.png b/android/assets/ui/out/button-down.9.png
similarity index 100%
rename from core/assets/ui/out/button-down.9.png
rename to android/assets/ui/out/button-down.9.png
diff --git a/core/assets/ui/out/button-gray-over.9.png b/android/assets/ui/out/button-gray-over.9.png
similarity index 100%
rename from core/assets/ui/out/button-gray-over.9.png
rename to android/assets/ui/out/button-gray-over.9.png
diff --git a/core/assets/ui/out/button-gray.9.png b/android/assets/ui/out/button-gray.9.png
similarity index 100%
rename from core/assets/ui/out/button-gray.9.png
rename to android/assets/ui/out/button-gray.9.png
diff --git a/core/assets/ui/out/button-map-down.9.png b/android/assets/ui/out/button-map-down.9.png
similarity index 100%
rename from core/assets/ui/out/button-map-down.9.png
rename to android/assets/ui/out/button-map-down.9.png
diff --git a/core/assets/ui/out/button-map-over.9.png b/android/assets/ui/out/button-map-over.9.png
similarity index 100%
rename from core/assets/ui/out/button-map-over.9.png
rename to android/assets/ui/out/button-map-over.9.png
diff --git a/core/assets/ui/out/button-map.9.png b/android/assets/ui/out/button-map.9.png
similarity index 100%
rename from core/assets/ui/out/button-map.9.png
rename to android/assets/ui/out/button-map.9.png
diff --git a/core/assets/ui/out/button-over.9.png b/android/assets/ui/out/button-over.9.png
similarity index 100%
rename from core/assets/ui/out/button-over.9.png
rename to android/assets/ui/out/button-over.9.png
diff --git a/core/assets/ui/out/button-red.9.png b/android/assets/ui/out/button-red.9.png
similarity index 100%
rename from core/assets/ui/out/button-red.9.png
rename to android/assets/ui/out/button-red.9.png
diff --git a/core/assets/ui/out/button-select.9.png b/android/assets/ui/out/button-select.9.png
similarity index 100%
rename from core/assets/ui/out/button-select.9.png
rename to android/assets/ui/out/button-select.9.png
diff --git a/core/assets/ui/out/button-window-bg.9.png b/android/assets/ui/out/button-window-bg.9.png
similarity index 100%
rename from core/assets/ui/out/button-window-bg.9.png
rename to android/assets/ui/out/button-window-bg.9.png
diff --git a/core/assets/ui/out/button-window-over.9.png b/android/assets/ui/out/button-window-over.9.png
similarity index 100%
rename from core/assets/ui/out/button-window-over.9.png
rename to android/assets/ui/out/button-window-over.9.png
diff --git a/core/assets/ui/out/button.9.png b/android/assets/ui/out/button.9.png
similarity index 100%
rename from core/assets/ui/out/button.9.png
rename to android/assets/ui/out/button.9.png
diff --git a/core/assets/ui/out/check-off.png b/android/assets/ui/out/check-off.png
similarity index 100%
rename from core/assets/ui/out/check-off.png
rename to android/assets/ui/out/check-off.png
diff --git a/core/assets/ui/out/check-on.png b/android/assets/ui/out/check-on.png
similarity index 100%
rename from core/assets/ui/out/check-on.png
rename to android/assets/ui/out/check-on.png
diff --git a/core/assets/ui/out/check-over.png b/android/assets/ui/out/check-over.png
similarity index 100%
rename from core/assets/ui/out/check-over.png
rename to android/assets/ui/out/check-over.png
diff --git a/core/assets/ui/out/clear.png b/android/assets/ui/out/clear.png
similarity index 100%
rename from core/assets/ui/out/clear.png
rename to android/assets/ui/out/clear.png
diff --git a/core/assets/ui/out/color-picker-bar-selector.png b/android/assets/ui/out/color-picker-bar-selector.png
similarity index 100%
rename from core/assets/ui/out/color-picker-bar-selector.png
rename to android/assets/ui/out/color-picker-bar-selector.png
diff --git a/core/assets/ui/out/color-picker-cross.png b/android/assets/ui/out/color-picker-cross.png
similarity index 100%
rename from core/assets/ui/out/color-picker-cross.png
rename to android/assets/ui/out/color-picker-cross.png
diff --git a/core/assets/ui/out/color-picker-selector-horizontal.png b/android/assets/ui/out/color-picker-selector-horizontal.png
similarity index 100%
rename from core/assets/ui/out/color-picker-selector-horizontal.png
rename to android/assets/ui/out/color-picker-selector-horizontal.png
diff --git a/core/assets/ui/out/color-picker-selector-vertical.png b/android/assets/ui/out/color-picker-selector-vertical.png
similarity index 100%
rename from core/assets/ui/out/color-picker-selector-vertical.png
rename to android/assets/ui/out/color-picker-selector-vertical.png
diff --git a/core/assets/ui/out/cursor-normal.png b/android/assets/ui/out/cursor-normal.png
similarity index 100%
rename from core/assets/ui/out/cursor-normal.png
rename to android/assets/ui/out/cursor-normal.png
diff --git a/core/assets/ui/out/cursor.png b/android/assets/ui/out/cursor.png
similarity index 100%
rename from core/assets/ui/out/cursor.png
rename to android/assets/ui/out/cursor.png
diff --git a/core/assets/ui/out/default-pane-no-border.9.png b/android/assets/ui/out/default-pane-no-border.9.png
similarity index 100%
rename from core/assets/ui/out/default-pane-no-border.9.png
rename to android/assets/ui/out/default-pane-no-border.9.png
diff --git a/core/assets/ui/out/default-pane.9.png b/android/assets/ui/out/default-pane.9.png
similarity index 100%
rename from core/assets/ui/out/default-pane.9.png
rename to android/assets/ui/out/default-pane.9.png
diff --git a/core/assets/ui/out/default-select-selection.9.png b/android/assets/ui/out/default-select-selection.9.png
similarity index 100%
rename from core/assets/ui/out/default-select-selection.9.png
rename to android/assets/ui/out/default-select-selection.9.png
diff --git a/core/assets/ui/out/default-select.9.png b/android/assets/ui/out/default-select.9.png
similarity index 100%
rename from core/assets/ui/out/default-select.9.png
rename to android/assets/ui/out/default-select.9.png
diff --git a/core/assets/ui/out/grey.png b/android/assets/ui/out/grey.png
similarity index 100%
rename from core/assets/ui/out/grey.png
rename to android/assets/ui/out/grey.png
diff --git a/android/assets/ui/out/icon-cancel.png b/android/assets/ui/out/icon-cancel.png
new file mode 100644
index 0000000000..bf4c7ed9a0
Binary files /dev/null and b/android/assets/ui/out/icon-cancel.png differ
diff --git a/android/assets/ui/out/icon-check.png b/android/assets/ui/out/icon-check.png
new file mode 100644
index 0000000000..67bd7b09cd
Binary files /dev/null and b/android/assets/ui/out/icon-check.png differ
diff --git a/core/assets/ui/out/icon-close-down.png b/android/assets/ui/out/icon-close-down.png
similarity index 100%
rename from core/assets/ui/out/icon-close-down.png
rename to android/assets/ui/out/icon-close-down.png
diff --git a/core/assets/ui/out/icon-close-over.png b/android/assets/ui/out/icon-close-over.png
similarity index 100%
rename from core/assets/ui/out/icon-close-over.png
rename to android/assets/ui/out/icon-close-over.png
diff --git a/core/assets/ui/out/icon-close.png b/android/assets/ui/out/icon-close.png
similarity index 100%
rename from core/assets/ui/out/icon-close.png
rename to android/assets/ui/out/icon-close.png
diff --git a/core/assets/ui/out/icon-defense.png b/android/assets/ui/out/icon-defense.png
similarity index 100%
rename from core/assets/ui/out/icon-defense.png
rename to android/assets/ui/out/icon-defense.png
diff --git a/core/assets/ui/out/icon-distribution.png b/android/assets/ui/out/icon-distribution.png
similarity index 100%
rename from core/assets/ui/out/icon-distribution.png
rename to android/assets/ui/out/icon-distribution.png
diff --git a/core/assets/ui/out/icon-production.png b/android/assets/ui/out/icon-production.png
similarity index 100%
rename from core/assets/ui/out/icon-production.png
rename to android/assets/ui/out/icon-production.png
diff --git a/android/assets/ui/out/icon-rotate.png b/android/assets/ui/out/icon-rotate.png
new file mode 100644
index 0000000000..77ed4bb76d
Binary files /dev/null and b/android/assets/ui/out/icon-rotate.png differ
diff --git a/core/assets/ui/out/list-selection.png b/android/assets/ui/out/list-selection.png
similarity index 100%
rename from core/assets/ui/out/list-selection.png
rename to android/assets/ui/out/list-selection.png
diff --git a/core/assets/ui/out/menu-bg.png b/android/assets/ui/out/menu-bg.png
similarity index 100%
rename from core/assets/ui/out/menu-bg.png
rename to android/assets/ui/out/menu-bg.png
diff --git a/core/assets/ui/out/padded-list-selection.9.png b/android/assets/ui/out/padded-list-selection.9.png
similarity index 100%
rename from core/assets/ui/out/padded-list-selection.9.png
rename to android/assets/ui/out/padded-list-selection.9.png
diff --git a/core/assets/ui/out/progressbar-filled-vertical.png b/android/assets/ui/out/progressbar-filled-vertical.png
similarity index 100%
rename from core/assets/ui/out/progressbar-filled-vertical.png
rename to android/assets/ui/out/progressbar-filled-vertical.png
diff --git a/core/assets/ui/out/progressbar-filled.png b/android/assets/ui/out/progressbar-filled.png
similarity index 100%
rename from core/assets/ui/out/progressbar-filled.png
rename to android/assets/ui/out/progressbar-filled.png
diff --git a/core/assets/ui/out/progressbar-vertical.png b/android/assets/ui/out/progressbar-vertical.png
similarity index 100%
rename from core/assets/ui/out/progressbar-vertical.png
rename to android/assets/ui/out/progressbar-vertical.png
diff --git a/core/assets/ui/out/progressbar.png b/android/assets/ui/out/progressbar.png
similarity index 100%
rename from core/assets/ui/out/progressbar.png
rename to android/assets/ui/out/progressbar.png
diff --git a/core/assets/ui/out/radio-off.png b/android/assets/ui/out/radio-off.png
similarity index 100%
rename from core/assets/ui/out/radio-off.png
rename to android/assets/ui/out/radio-off.png
diff --git a/core/assets/ui/out/radio-on.png b/android/assets/ui/out/radio-on.png
similarity index 100%
rename from core/assets/ui/out/radio-on.png
rename to android/assets/ui/out/radio-on.png
diff --git a/core/assets/ui/out/scroll-horizontal.9.png b/android/assets/ui/out/scroll-horizontal.9.png
similarity index 100%
rename from core/assets/ui/out/scroll-horizontal.9.png
rename to android/assets/ui/out/scroll-horizontal.9.png
diff --git a/core/assets/ui/out/scroll-knob-horizontal.9.png b/android/assets/ui/out/scroll-knob-horizontal.9.png
similarity index 100%
rename from core/assets/ui/out/scroll-knob-horizontal.9.png
rename to android/assets/ui/out/scroll-knob-horizontal.9.png
diff --git a/core/assets/ui/out/scroll-knob-vertical.9.png b/android/assets/ui/out/scroll-knob-vertical.9.png
similarity index 100%
rename from core/assets/ui/out/scroll-knob-vertical.9.png
rename to android/assets/ui/out/scroll-knob-vertical.9.png
diff --git a/core/assets/ui/out/scroll.9.png b/android/assets/ui/out/scroll.9.png
similarity index 100%
rename from core/assets/ui/out/scroll.9.png
rename to android/assets/ui/out/scroll.9.png
diff --git a/core/assets/ui/out/select-box-list-bg.png b/android/assets/ui/out/select-box-list-bg.png
similarity index 100%
rename from core/assets/ui/out/select-box-list-bg.png
rename to android/assets/ui/out/select-box-list-bg.png
diff --git a/core/assets/ui/out/select-down.png b/android/assets/ui/out/select-down.png
similarity index 100%
rename from core/assets/ui/out/select-down.png
rename to android/assets/ui/out/select-down.png
diff --git a/core/assets/ui/out/select-up.png b/android/assets/ui/out/select-up.png
similarity index 100%
rename from core/assets/ui/out/select-up.png
rename to android/assets/ui/out/select-up.png
diff --git a/core/assets/ui/out/selection.png b/android/assets/ui/out/selection.png
similarity index 100%
rename from core/assets/ui/out/selection.png
rename to android/assets/ui/out/selection.png
diff --git a/core/assets/ui/out/separator-menu.png b/android/assets/ui/out/separator-menu.png
similarity index 100%
rename from core/assets/ui/out/separator-menu.png
rename to android/assets/ui/out/separator-menu.png
diff --git a/core/assets/ui/out/separator.png b/android/assets/ui/out/separator.png
similarity index 100%
rename from core/assets/ui/out/separator.png
rename to android/assets/ui/out/separator.png
diff --git a/core/assets/ui/out/slider-knob-disabled.png b/android/assets/ui/out/slider-knob-disabled.png
similarity index 100%
rename from core/assets/ui/out/slider-knob-disabled.png
rename to android/assets/ui/out/slider-knob-disabled.png
diff --git a/core/assets/ui/out/slider-knob-down.png b/android/assets/ui/out/slider-knob-down.png
similarity index 100%
rename from core/assets/ui/out/slider-knob-down.png
rename to android/assets/ui/out/slider-knob-down.png
diff --git a/core/assets/ui/out/slider-knob-over.png b/android/assets/ui/out/slider-knob-over.png
similarity index 100%
rename from core/assets/ui/out/slider-knob-over.png
rename to android/assets/ui/out/slider-knob-over.png
diff --git a/core/assets/ui/out/slider-knob.png b/android/assets/ui/out/slider-knob.png
similarity index 100%
rename from core/assets/ui/out/slider-knob.png
rename to android/assets/ui/out/slider-knob.png
diff --git a/core/assets/ui/out/slider-vertical.png b/android/assets/ui/out/slider-vertical.png
similarity index 100%
rename from core/assets/ui/out/slider-vertical.png
rename to android/assets/ui/out/slider-vertical.png
diff --git a/core/assets/ui/out/slider.png b/android/assets/ui/out/slider.png
similarity index 100%
rename from core/assets/ui/out/slider.png
rename to android/assets/ui/out/slider.png
diff --git a/core/assets/ui/out/slot.9.png b/android/assets/ui/out/slot.9.png
similarity index 100%
rename from core/assets/ui/out/slot.9.png
rename to android/assets/ui/out/slot.9.png
diff --git a/core/assets/ui/out/splitpane-over.png b/android/assets/ui/out/splitpane-over.png
similarity index 100%
rename from core/assets/ui/out/splitpane-over.png
rename to android/assets/ui/out/splitpane-over.png
diff --git a/core/assets/ui/out/splitpane-vertical-over.png b/android/assets/ui/out/splitpane-vertical-over.png
similarity index 100%
rename from core/assets/ui/out/splitpane-vertical-over.png
rename to android/assets/ui/out/splitpane-vertical-over.png
diff --git a/core/assets/ui/out/splitpane-vertical.png b/android/assets/ui/out/splitpane-vertical.png
similarity index 100%
rename from core/assets/ui/out/splitpane-vertical.png
rename to android/assets/ui/out/splitpane-vertical.png
diff --git a/core/assets/ui/out/splitpane.png b/android/assets/ui/out/splitpane.png
similarity index 100%
rename from core/assets/ui/out/splitpane.png
rename to android/assets/ui/out/splitpane.png
diff --git a/core/assets/ui/out/sub-menu.png b/android/assets/ui/out/sub-menu.png
similarity index 100%
rename from core/assets/ui/out/sub-menu.png
rename to android/assets/ui/out/sub-menu.png
diff --git a/core/assets/ui/out/textfield-over.9.png b/android/assets/ui/out/textfield-over.9.png
similarity index 100%
rename from core/assets/ui/out/textfield-over.9.png
rename to android/assets/ui/out/textfield-over.9.png
diff --git a/core/assets/ui/out/textfield.9.png b/android/assets/ui/out/textfield.9.png
similarity index 100%
rename from core/assets/ui/out/textfield.9.png
rename to android/assets/ui/out/textfield.9.png
diff --git a/core/assets/ui/out/tooltip-bg.9.png b/android/assets/ui/out/tooltip-bg.9.png
similarity index 100%
rename from core/assets/ui/out/tooltip-bg.9.png
rename to android/assets/ui/out/tooltip-bg.9.png
diff --git a/core/assets/ui/out/touchpad-knob.png b/android/assets/ui/out/touchpad-knob.png
similarity index 100%
rename from core/assets/ui/out/touchpad-knob.png
rename to android/assets/ui/out/touchpad-knob.png
diff --git a/core/assets/ui/out/tree-minus.png b/android/assets/ui/out/tree-minus.png
similarity index 100%
rename from core/assets/ui/out/tree-minus.png
rename to android/assets/ui/out/tree-minus.png
diff --git a/core/assets/ui/out/tree-over.png b/android/assets/ui/out/tree-over.png
similarity index 100%
rename from core/assets/ui/out/tree-over.png
rename to android/assets/ui/out/tree-over.png
diff --git a/core/assets/ui/out/tree-plus.png b/android/assets/ui/out/tree-plus.png
similarity index 100%
rename from core/assets/ui/out/tree-plus.png
rename to android/assets/ui/out/tree-plus.png
diff --git a/core/assets/ui/out/tree-selection.9.png b/android/assets/ui/out/tree-selection.9.png
similarity index 100%
rename from core/assets/ui/out/tree-selection.9.png
rename to android/assets/ui/out/tree-selection.9.png
diff --git a/core/assets/ui/out/white.png b/android/assets/ui/out/white.png
similarity index 100%
rename from core/assets/ui/out/white.png
rename to android/assets/ui/out/white.png
diff --git a/core/assets/ui/out/window-bg.png b/android/assets/ui/out/window-bg.png
similarity index 100%
rename from core/assets/ui/out/window-bg.png
rename to android/assets/ui/out/window-bg.png
diff --git a/core/assets/ui/out/window-border-bg.9.png b/android/assets/ui/out/window-border-bg.9.png
similarity index 100%
rename from core/assets/ui/out/window-border-bg.9.png
rename to android/assets/ui/out/window-border-bg.9.png
diff --git a/core/assets/ui/out/window-gray.9.png b/android/assets/ui/out/window-gray.9.png
similarity index 100%
rename from core/assets/ui/out/window-gray.9.png
rename to android/assets/ui/out/window-gray.9.png
diff --git a/core/assets/ui/out/window-noborder.9.png b/android/assets/ui/out/window-noborder.9.png
similarity index 100%
rename from core/assets/ui/out/window-noborder.9.png
rename to android/assets/ui/out/window-noborder.9.png
diff --git a/core/assets/ui/out/window-resizable.9.png b/android/assets/ui/out/window-resizable.9.png
similarity index 100%
rename from core/assets/ui/out/window-resizable.9.png
rename to android/assets/ui/out/window-resizable.9.png
diff --git a/core/assets/ui/out/window.9.png b/android/assets/ui/out/window.9.png
similarity index 100%
rename from core/assets/ui/out/window.9.png
rename to android/assets/ui/out/window.9.png
diff --git a/core/assets/ui/prose.fnt b/android/assets/ui/prose.fnt
similarity index 100%
rename from core/assets/ui/prose.fnt
rename to android/assets/ui/prose.fnt
diff --git a/core/assets/ui/prose.png b/android/assets/ui/prose.png
similarity index 100%
rename from core/assets/ui/prose.png
rename to android/assets/ui/prose.png
diff --git a/core/assets/ui/uiskin.atlas b/android/assets/ui/uiskin.atlas
similarity index 96%
rename from core/assets/ui/uiskin.atlas
rename to android/assets/ui/uiskin.atlas
index e041fb39c8..d9da6fe185 100644
--- a/core/assets/ui/uiskin.atlas
+++ b/android/assets/ui/uiskin.atlas
@@ -51,7 +51,7 @@ border-error
index: -1
border-white
rotate: false
- xy: 367, 6
+ xy: 421, 17
size: 12, 12
split: 4, 4, 4, 4
orig: 12, 12
@@ -251,7 +251,7 @@ color-picker-selector-vertical
index: -1
cursor
rotate: false
- xy: 136, 56
+ xy: 383, 14
size: 4, 4
orig: 4, 4
offset: 0, 0
@@ -309,6 +309,20 @@ menu-bg
orig: 1, 1
offset: 0, 0
index: -1
+icon-cancel
+ rotate: false
+ xy: 367, 4
+ size: 14, 14
+ orig: 14, 14
+ offset: 0, 0
+ index: -1
+icon-check
+ rotate: false
+ xy: 389, 15
+ size: 14, 14
+ orig: 14, 14
+ offset: 0, 0
+ index: -1
icon-close
rotate: false
xy: 217, 86
@@ -346,11 +360,18 @@ icon-distribution
index: -1
icon-production
rotate: false
- xy: 389, 19
+ xy: 383, 2
size: 10, 10
orig: 10, 10
offset: 0, 0
index: -1
+icon-rotate
+ rotate: false
+ xy: 405, 15
+ size: 14, 14
+ orig: 14, 14
+ offset: 0, 0
+ index: -1
list-selection
rotate: false
xy: 220, 3
@@ -616,7 +637,7 @@ touchpad-knob
index: -1
tree-minus
rotate: false
- xy: 401, 19
+ xy: 395, 2
size: 10, 10
orig: 10, 10
offset: 0, 0
@@ -630,7 +651,7 @@ tree-plus
index: -1
tree-selection
rotate: false
- xy: 430, 69
+ xy: 136, 57
size: 3, 3
split: 1, 1, 1, 1
orig: 3, 3
@@ -638,7 +659,7 @@ tree-selection
index: -1
white
rotate: false
- xy: 473, 17
+ xy: 430, 69
size: 3, 3
orig: 3, 3
offset: 0, 0
@@ -653,7 +674,7 @@ window
index: -1
window-border-bg
rotate: false
- xy: 136, 7
+ xy: 473, 17
size: 3, 3
split: 1, 1, 1, 1
orig: 3, 3
diff --git a/core/assets/ui/uiskin.json b/android/assets/ui/uiskin.json
similarity index 100%
rename from core/assets/ui/uiskin.json
rename to android/assets/ui/uiskin.json
diff --git a/android/assets/ui/uiskin.png b/android/assets/ui/uiskin.png
new file mode 100644
index 0000000000..35af964871
Binary files /dev/null and b/android/assets/ui/uiskin.png differ
diff --git a/android/build.gradle b/android/build.gradle
new file mode 100644
index 0000000000..42499f5ed1
--- /dev/null
+++ b/android/build.gradle
@@ -0,0 +1,135 @@
+android {
+ buildToolsVersion "25.0.0"
+ compileSdkVersion 25
+ sourceSets {
+ main {
+ manifest.srcFile 'AndroidManifest.xml'
+ java.srcDirs = ['src']
+ aidl.srcDirs = ['src']
+ renderscript.srcDirs = ['src']
+ res.srcDirs = ['res']
+ assets.srcDirs = ['assets']
+ jniLibs.srcDirs = ['libs']
+ }
+
+ instrumentTest.setRoot('tests')
+ }
+ packagingOptions {
+ exclude 'META-INF/robovm/ios/robovm.xml'
+ }
+ defaultConfig {
+ applicationId "io.anuke.mindustry"
+ minSdkVersion 9
+ targetSdkVersion 25
+
+ jackOptions {
+ enabled true
+ }
+ }
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+}
+// called every time gradle gets executed, takes the native dependencies of
+// the natives configuration, and extracts them to the proper libs/ folders
+// so they get packed with the APK.
+task copyAndroidNatives() {
+ file("libs/armeabi/").mkdirs();
+ file("libs/armeabi-v7a/").mkdirs();
+ file("libs/arm64-v8a/").mkdirs();
+ file("libs/x86_64/").mkdirs();
+ file("libs/x86/").mkdirs();
+
+ configurations.natives.files.each { jar ->
+ def outputDir = null
+ if (jar.name.endsWith("natives-arm64-v8a.jar")) outputDir = file("libs/arm64-v8a")
+ if (jar.name.endsWith("natives-armeabi-v7a.jar")) outputDir = file("libs/armeabi-v7a")
+ if (jar.name.endsWith("natives-armeabi.jar")) outputDir = file("libs/armeabi")
+ if (jar.name.endsWith("natives-x86_64.jar")) outputDir = file("libs/x86_64")
+ if (jar.name.endsWith("natives-x86.jar")) outputDir = file("libs/x86")
+ if (outputDir != null) {
+ copy {
+ from zipTree(jar)
+ into outputDir
+ include "*.so"
+ }
+ }
+ }
+}
+task run(type: Exec) {
+ def path
+ def localProperties = project.file("../local.properties")
+ if (localProperties.exists()) {
+ Properties properties = new Properties()
+ localProperties.withInputStream { instr ->
+ properties.load(instr)
+ }
+ def sdkDir = properties.getProperty('sdk.dir')
+ if (sdkDir) {
+ path = sdkDir
+ } else {
+ path = "$System.env.ANDROID_HOME"
+ }
+ } else {
+ path = "$System.env.ANDROID_HOME"
+ }
+
+ def adb = path + "/platform-tools/adb"
+ commandLine "$adb", 'shell', 'am', 'start', '-n', 'io.anuke.mindustry/io.anuke.mindustry.AndroidLauncher'
+}
+// sets up the Android Eclipse project, using the old Ant based build.
+eclipse {
+ // need to specify Java source sets explicitly, SpringSource Gradle Eclipse plugin
+ // ignores any nodes added in classpath.file.withXml
+ sourceSets {
+ main {
+ java.srcDirs "src", 'gen'
+ }
+ }
+
+ jdt {
+ sourceCompatibility = 1.7
+ targetCompatibility = 1.7
+ }
+
+ classpath {
+ plusConfigurations += [project.configurations.compile]
+ containers 'com.android.ide.eclipse.adt.ANDROID_FRAMEWORK', 'com.android.ide.eclipse.adt.LIBRARIES'
+ }
+
+ project {
+ name = appName + "-android"
+ natures 'com.android.ide.eclipse.adt.AndroidNature'
+ buildCommands.clear();
+ buildCommand "com.android.ide.eclipse.adt.ResourceManagerBuilder"
+ buildCommand "com.android.ide.eclipse.adt.PreCompilerBuilder"
+ buildCommand "org.eclipse.jdt.core.javabuilder"
+ buildCommand "com.android.ide.eclipse.adt.ApkBuilder"
+ }
+}
+// sets up the Android Idea project, using the old Ant based build.
+idea {
+ module {
+ sourceDirs += file("src");
+ scopes = [COMPILE: [plus: [project.configurations.compile]]]
+
+ iml {
+ withXml {
+ def node = it.asNode()
+ def builder = NodeBuilder.newInstance();
+ builder.current = node;
+ builder.component(name: "FacetManager") {
+ facet(type: "android", name: "Android") {
+ configuration {
+ option(name: "UPDATE_PROPERTY_FILES", value: "true")
+ }
+ }
+ }
+ }
+ }
+ }
+}
+dependencies {
+}
\ No newline at end of file
diff --git a/android/ic_launcher-web.png b/android/ic_launcher-web.png
new file mode 100644
index 0000000000..ebd65987ee
Binary files /dev/null and b/android/ic_launcher-web.png differ
diff --git a/android/proguard-project.txt b/android/proguard-project.txt
new file mode 100644
index 0000000000..b166b1e81c
--- /dev/null
+++ b/android/proguard-project.txt
@@ -0,0 +1,45 @@
+# To enable ProGuard in your project, edit project.properties
+# to define the proguard.config property as described in that file.
+#
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in ${sdk.dir}/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the ProGuard
+# include property in project.properties.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+-verbose
+
+-dontwarn android.support.**
+-dontwarn com.badlogic.gdx.backends.android.AndroidFragmentApplication
+-dontwarn com.badlogic.gdx.utils.GdxBuild
+-dontwarn com.badlogic.gdx.physics.box2d.utils.Box2DBuild
+-dontwarn com.badlogic.gdx.jnigen.BuildTarget*
+-dontwarn com.badlogic.gdx.graphics.g2d.freetype.FreetypeBuild
+
+-keep class com.badlogic.gdx.controllers.android.AndroidControllers
+
+-keepclassmembers class com.badlogic.gdx.backends.android.AndroidInput* {
+ (com.badlogic.gdx.Application, android.content.Context, java.lang.Object, com.badlogic.gdx.backends.android.AndroidApplicationConfiguration);
+}
+
+-keepclassmembers class com.badlogic.gdx.physics.box2d.World {
+ boolean contactFilter(long, long);
+ void beginContact(long);
+ void endContact(long);
+ void preSolve(long, long);
+ void postSolve(long, long);
+ boolean reportFixture(long);
+ float reportRayFixture(long, float, float, float, float, float);
+}
diff --git a/android/project.properties b/android/project.properties
new file mode 100644
index 0000000000..4ab125693c
--- /dev/null
+++ b/android/project.properties
@@ -0,0 +1,14 @@
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must be checked in Version Control Systems.
+#
+# To customize properties used by the Ant build system edit
+# "ant.properties", and override values to adapt the script to your
+# project structure.
+#
+# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
+#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
+
+# Project target.
+target=android-19
diff --git a/android/res/drawable-hdpi/ic_launcher.png b/android/res/drawable-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..b6b1472561
Binary files /dev/null and b/android/res/drawable-hdpi/ic_launcher.png differ
diff --git a/android/res/drawable-mdpi/ic_launcher.png b/android/res/drawable-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..1ce160b9a7
Binary files /dev/null and b/android/res/drawable-mdpi/ic_launcher.png differ
diff --git a/android/res/drawable-xhdpi/ic_launcher.png b/android/res/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..27109288a3
Binary files /dev/null and b/android/res/drawable-xhdpi/ic_launcher.png differ
diff --git a/android/res/drawable-xxhdpi/ic_launcher.png b/android/res/drawable-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..6dc9073e0f
Binary files /dev/null and b/android/res/drawable-xxhdpi/ic_launcher.png differ
diff --git a/android/res/drawable-xxxhdpi/ic_launcher.png b/android/res/drawable-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..d1099464ab
Binary files /dev/null and b/android/res/drawable-xxxhdpi/ic_launcher.png differ
diff --git a/android/res/values/strings.xml b/android/res/values/strings.xml
new file mode 100644
index 0000000000..d40cf3accd
--- /dev/null
+++ b/android/res/values/strings.xml
@@ -0,0 +1,6 @@
+
+
+
+ Mindustry
+
+
diff --git a/android/res/values/styles.xml b/android/res/values/styles.xml
new file mode 100644
index 0000000000..3f00fc5ac7
--- /dev/null
+++ b/android/res/values/styles.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
diff --git a/android/src/io/anuke/mindustry/AndroidLauncher.java b/android/src/io/anuke/mindustry/AndroidLauncher.java
new file mode 100644
index 0000000000..e01156c389
--- /dev/null
+++ b/android/src/io/anuke/mindustry/AndroidLauncher.java
@@ -0,0 +1,16 @@
+package io.anuke.mindustry;
+
+import com.badlogic.gdx.backends.android.AndroidApplication;
+import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration;
+
+import android.os.Bundle;
+
+public class AndroidLauncher extends AndroidApplication {
+ @Override
+ protected void onCreate (Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
+ config.useImmersiveMode = true;
+ initialize(new Mindustry(), config);
+ }
+}
diff --git a/build.gradle b/build.gradle
index b4e088bfc4..75c7c71038 100644
--- a/build.gradle
+++ b/build.gradle
@@ -7,6 +7,7 @@ buildscript {
}
dependencies {
classpath 'de.richsource.gradle.plugins:gwt-gradle-plugin:0.6'
+ classpath 'com.android.tools.build:gradle:2.2.0'
}
}
@@ -26,6 +27,7 @@ allprojects {
mavenCentral()
maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
maven { url "https://oss.sonatype.org/content/repositories/releases/" }
+ maven { url 'https://jitpack.io' }
}
}
@@ -54,11 +56,28 @@ project(":html") {
}
}
+project(":android") {
+ apply plugin: "android"
+
+ configurations { natives }
+
+ dependencies {
+ compile project(":core")
+ compile "com.badlogicgames.gdx:gdx-backend-android:$gdxVersion"
+ natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi"
+ natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a"
+ 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_64"
+ compile "com.badlogicgames.gdx:gdx-ai:$aiVersion"
+ }
+}
+
project(":core") {
apply plugin: "java"
dependencies {
- // compile fileTree(dir: '../core/lib', include: '*.jar')
+ compile 'com.github.Anuken:ucore:07fe3a5394'
compile "com.badlogicgames.gdx:gdx:$gdxVersion"
compile "com.badlogicgames.gdx:gdx-ai:1.8.1"
}
diff --git a/core/assets/ui/uiskin.png b/core/assets/ui/uiskin.png
deleted file mode 100644
index dd65603f7f..0000000000
Binary files a/core/assets/ui/uiskin.png and /dev/null differ
diff --git a/core/src/io/anuke/mindustry/Control.java b/core/src/io/anuke/mindustry/Control.java
index e81f16e0d6..671093f7d8 100644
--- a/core/src/io/anuke/mindustry/Control.java
+++ b/core/src/io/anuke/mindustry/Control.java
@@ -2,26 +2,41 @@ package io.anuke.mindustry;
import static io.anuke.mindustry.Vars.*;
+import com.badlogic.gdx.Application.ApplicationType;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input.Keys;
+import com.badlogic.gdx.input.GestureDetector;
import io.anuke.mindustry.entities.Player;
+import io.anuke.mindustry.input.AndroidInput;
+import io.anuke.mindustry.input.GestureHandler;
+import io.anuke.mindustry.input.Input;
import io.anuke.mindustry.world.Generator;
import io.anuke.mindustry.world.blocks.ProductionBlocks;
import io.anuke.ucore.core.*;
import io.anuke.ucore.entities.Entities;
import io.anuke.ucore.graphics.Atlas;
import io.anuke.ucore.modules.RendererModule;
+import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Timers;
public class Control extends RendererModule{
public int rangex = 10, rangey = 10;
+ public float targetzoom = 1f;
+ private float targetx, targety;
//GifRecorder recoder = new GifRecorder(batch);
public Control(){
cameraScale = 4;
pixelate();
+ Gdx.input.setCatchBackKey(true);
+
+ if(android){
+ Inputs.addProcessor(new GestureDetector(20, 0.5f, 2, 0.15f, new GestureHandler()));
+ Inputs.addProcessor(new AndroidInput());
+ }
+
Draw.addSurface("shadow", cameraScale);
atlas = new Atlas("mindustry.atlas");
@@ -39,7 +54,7 @@ public class Control extends RendererModule{
"down", Keys.S,
"right", Keys.D,
"rotate", Keys.R,
- "menu", Keys.ESCAPE
+ "menu", Gdx.app.getType() == ApplicationType.Android ? Keys.BACK : Keys.ESCAPE
);
Settings.loadAll("io.anuke.moment");
@@ -65,12 +80,19 @@ public class Control extends RendererModule{
EffectLoader.create();
}
+ public void clampZoom(){
+ targetzoom = Mathf.clamp(targetzoom, 0.5f, 2f);
+ camera.zoom = Mathf.clamp(camera.zoom, 0.5f, 2f);
+ }
+
@Override
public void update(){
if(Inputs.keyUp(Keys.ESCAPE) && debug)
Gdx.app.exit();
+ //camera.zoom = MathUtils.lerp(camera.zoom, targetzoom, 0.5f*delta());
+
if(Inputs.keyUp(Keys.SPACE) && debug)
Effects.sound("shoot", core.worldx(), core.worldy());
@@ -110,17 +132,26 @@ public class Control extends RendererModule{
}
Entities.update();
-
- Input.doInput();
+
+ if(!android){
+ Input.doInput();
+ }else{
+ AndroidInput.doInput();
+ }
+
}
- if(core.block() == ProductionBlocks.core)
- camera.position.set(player.x, player.y, 0f);
- else
- camera.position.set(core.worldx(), core.worldy(), 0f);
+ if(core.block() == ProductionBlocks.core){
+ smoothCamera(player.x, player.y, 0.3f);
+ }else{
+ smoothCamera(core.worldx(), core.worldy(), 0.4f);
+ }
updateShake();
clampCamera(-tilesize / 2f, -tilesize / 2f, pixsize - tilesize / 2f, pixsize - tilesize / 2f);
+
+ float lastx = camera.position.x, lasty = camera.position.y;
+ camera.position.set((int)camera.position.x, (int)camera.position.y, 0);
drawDefault();
@@ -129,6 +160,8 @@ public class Control extends RendererModule{
Renderer.renderOverlay();
batch.end();
+ camera.position.set(lastx, lasty, 0);
+
//recoder.update();
}
@@ -151,5 +184,8 @@ public class Control extends RendererModule{
rangex = (int) (width / tilesize / cameraScale/2)+2;
rangey = (int) (height / tilesize / cameraScale/2)+2;
+
+ AndroidInput.mousex = Gdx.graphics.getWidth()/2;
+ AndroidInput.mousey = Gdx.graphics.getHeight()/2;
}
}
diff --git a/core/src/io/anuke/mindustry/GameState.java b/core/src/io/anuke/mindustry/GameState.java
index 7278fac4d8..204007fb21 100644
--- a/core/src/io/anuke/mindustry/GameState.java
+++ b/core/src/io/anuke/mindustry/GameState.java
@@ -25,7 +25,10 @@ public class GameState{
wavetime = waveSpacing();
Entities.clear();
enemies = 0;
- player.add();
+
+ if(!android)
+ player.add();
+
player.heal();
Inventory.clearItems();
spawnpoints.clear();
@@ -40,6 +43,8 @@ public class GameState{
player.x = core.worldx();
player.y = core.worldy()-8;
+ control.camera.position.set(player.x, player.y, 0);
+
wavetime = waveSpacing();
if(showedTutorial || !Settings.getBool("tutorial")){
diff --git a/core/src/io/anuke/mindustry/Renderer.java b/core/src/io/anuke/mindustry/Renderer.java
index 29c3fac154..09fa10f05e 100644
--- a/core/src/io/anuke/mindustry/Renderer.java
+++ b/core/src/io/anuke/mindustry/Renderer.java
@@ -6,8 +6,10 @@ import com.badlogic.gdx.Input.Buttons;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.math.MathUtils;
+import com.badlogic.gdx.math.Vector2;
import io.anuke.mindustry.entities.TileEntity;
+import io.anuke.mindustry.input.AndroidInput;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.Blocks;
import io.anuke.mindustry.world.blocks.ProductionBlocks;
@@ -104,11 +106,27 @@ public class Renderer{
public static void renderPixelOverlay(){
- if(recipe != null && !ui.hasMouse()){
- float x = Mathf.round2(Graphics.mouseWorld().x, tilesize);
- float y = Mathf.round2(Graphics.mouseWorld().y, tilesize);
+ if(recipe != null && (!ui.hasMouse() || android)){
+ float x = 0;
+ float y = 0;
+
+ int tilex = 0;
+ int tiley = 0;
+
+ if(android){
+ Vector2 vec = Graphics.world(AndroidInput.mousex, AndroidInput.mousey);
+ x = Mathf.round2(vec.x, tilesize);
+ y = Mathf.round2(vec.y, tilesize);
+ tilex = Mathf.scl2(vec.x, tilesize);
+ tiley = Mathf.scl2(vec.y, tilesize);
+ }else{
+ x = Mathf.round2(Graphics.mouseWorld().x, tilesize);
+ y = Mathf.round2(Graphics.mouseWorld().y, tilesize);
+ tilex = World.tilex();
+ tiley = World.tiley();
+ }
- boolean valid = World.validPlace(World.tilex(), World.tiley(), recipe.result);
+ boolean valid = World.validPlace(tilex, tiley, recipe.result);
Draw.color(valid ? Color.PURPLE : Color.SCARLET);
Draw.thickness(2f);
@@ -143,6 +161,16 @@ public class Renderer{
Draw.reset();
}
}
+
+ if(android && breaktime > 0){
+ Tile tile = AndroidInput.selected();
+ if(tile.breakable() && tile.block() != ProductionBlocks.core){
+ float fract = breaktime / tile.block().breaktime;
+ Draw.color(Color.YELLOW, Color.SCARLET, fract);
+ Draw.circle(tile.worldx(), tile.worldy(), 4 + (1f-fract)*26);
+ Draw.reset();
+ }
+ }
if(recipe == null && !ui.hasMouse()){
Tile tile = World.cursorTile();
diff --git a/core/src/io/anuke/mindustry/UI.java b/core/src/io/anuke/mindustry/UI.java
index 3a17400b77..d7b7dfd3bf 100644
--- a/core/src/io/anuke/mindustry/UI.java
+++ b/core/src/io/anuke/mindustry/UI.java
@@ -12,10 +12,12 @@ import com.badlogic.gdx.utils.Align;
import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.entities.Weapon;
+import io.anuke.mindustry.input.AndroidInput;
import io.anuke.mindustry.resource.*;
import io.anuke.mindustry.ui.*;
import io.anuke.ucore.core.Draw;
import io.anuke.ucore.core.Settings;
+import io.anuke.ucore.function.Listenable;
import io.anuke.ucore.function.VisibilityProvider;
import io.anuke.ucore.graphics.Hue;
import io.anuke.ucore.graphics.Textures;
@@ -30,7 +32,7 @@ import io.anuke.ucore.scene.ui.layout.Table;
import io.anuke.ucore.util.Timers;
public class UI extends SceneModule{
- Table itemtable, weapontable;
+ Table itemtable, weapontable, tools;
SettingsDialog prefs;
KeybindDialog keys;
Dialog about, menu, restart, tutorial, levels, upgrades;
@@ -164,6 +166,10 @@ public class UI extends SceneModule{
weapontable.bottom();
weapontable.setVisible(play);
+ if(android){
+ weapontable.remove();
+ }
+
build.begin(scene);
new table(){{
@@ -229,7 +235,7 @@ public class UI extends SceneModule{
Table tiptable = new Table();
- Runnable run = ()->{
+ Listenable run = ()->{
tiptable.clearChildren();
String description = r.result.description();
@@ -253,7 +259,7 @@ public class UI extends SceneModule{
tiptable.pad(10f);
};
- run.run();
+ run.listen();
Tooltip tip = new Tooltip(tiptable, run);
@@ -288,10 +294,11 @@ public class UI extends SceneModule{
row();
- new button("Upgrades", ()->{
- upgrades.show();
- }).uniformX().fillX();
-
+ if(!android){
+ new button("Upgrades", ()->{
+ upgrades.show();
+ }).uniformX().fillX();
+ }
get().setVisible(play);
}}.end();
@@ -344,7 +351,8 @@ public class UI extends SceneModule{
}}.end();
- //+- table
+ //if(Gdx.app.getType() != ApplicationType.Android){
+ //+- table
new table(){{
aleft();
abottom();
@@ -368,6 +376,7 @@ public class UI extends SceneModule{
get().setVisible(play);
}}.end();
+ //}
//menu table
new table(){{
@@ -385,12 +394,14 @@ public class UI extends SceneModule{
}).width(w);
row();
-
- new button("Controls", () -> {
- keys.show(scene);
- }).width(w);
-
- row();
+
+ if(!android){
+ new button("Controls", () -> {
+ keys.show(scene);
+ }).width(w);
+
+ row();
+ }
new button("About", () -> {
about.show(scene);
@@ -427,6 +438,30 @@ public class UI extends SceneModule{
});
}};
}}.end();
+
+ tools = new Table();
+ tools.addIButton("icon-cancel", 42, ()->{
+ recipe = null;
+ });
+ tools.addIButton("icon-rotate", 42, ()->{
+ rotation++;
+
+ rotation %= 4;
+ });
+ tools.addIButton("icon-check", 42, ()->{
+ AndroidInput.place();
+ });
+
+
+ scene.add(tools);
+
+ tools.setVisible(()->{
+ return playing && android && recipe != null;
+ });
+
+ tools.update(()->{
+ tools.setPosition(AndroidInput.mousex, Gdx.graphics.getHeight()-AndroidInput.mousey-60, Align.top);
+ });
updateItems();
diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java
index d68def2fde..7f608907b7 100644
--- a/core/src/io/anuke/mindustry/Vars.java
+++ b/core/src/io/anuke/mindustry/Vars.java
@@ -1,5 +1,7 @@
package io.anuke.mindustry;
+import com.badlogic.gdx.Application.ApplicationType;
+import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Pixmap;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.math.Vector2;
@@ -14,9 +16,11 @@ import io.anuke.mindustry.world.Tile;
/**ick, global state*/
public class Vars{
+ public static final boolean android = (Gdx.app.getType() == ApplicationType.Android);
+
public static final float placerange = 66;
public static final float respawnduration = 60*4;
- public static final float wavespace = 20*60;
+ public static final float wavespace = 20*60*(android ? 2 : 1);
public static final float enemyspawnspace = 65;
public static boolean debug = false;
@@ -77,7 +81,23 @@ public class Vars{
"[YELLOW][[L-MOUSE][] to shoot.",
"[yellow][[scrollwheel] to switch weapons.",
"",
- "[GOLD]Every 20 seconds, a new wave will appear.",
+ "[GOLD]Every "+wavespace/60+" seconds, a new wave will appear.",
+ "Build turrets to defend the core.",
+ "If the core is destroyed, you lose the game.",
+ "",
+ "[LIME]To collect building resources, move them into the core with conveyors.",
+ "[LIME]Place [ORANGE]drills[] on the right material,they will automatically mine material",
+ "and dump it to nearby conveyors or turrets.",
+ "",
+ "[SCARLET]To produce steel, feed coal and iron into a smelter."
+ };
+
+ public static String[] androidTutorialText = {
+ "[GREEN]Default Controls:",
+ "[WHITE]Use [YELLOW]one finger[] to pan the camera, or two while placing blocks.",
+ "[YELLOW]Hold and tap[] to destroy blocks.",
+ "",
+ "[GOLD]Every "+wavespace/60+" seconds, a new wave will appear.",
"Build turrets to defend the core.",
"If the core is destroyed, you lose the game.",
"",
diff --git a/core/src/io/anuke/mindustry/World.java b/core/src/io/anuke/mindustry/World.java
index bfa44ba4e6..af1c521fcf 100644
--- a/core/src/io/anuke/mindustry/World.java
+++ b/core/src/io/anuke/mindustry/World.java
@@ -105,7 +105,7 @@ public class World{
public static boolean validPlace(int x, int y, Block type){
- if(!cursorNear())
+ if(!cursorNear() && !android)
return false;
for(Tile spawn : spawnpoints){
diff --git a/core/src/io/anuke/mindustry/entities/Player.java b/core/src/io/anuke/mindustry/entities/Player.java
index d7b513dc20..408c51c8a7 100644
--- a/core/src/io/anuke/mindustry/entities/Player.java
+++ b/core/src/io/anuke/mindustry/entities/Player.java
@@ -42,6 +42,7 @@ public class Player extends DestructibleEntity{
@Override
public void update(){
+
float speed = this.speed;
if(Vars.debug)
diff --git a/core/src/io/anuke/mindustry/input/AndroidInput.java b/core/src/io/anuke/mindustry/input/AndroidInput.java
new file mode 100644
index 0000000000..b24d88e24f
--- /dev/null
+++ b/core/src/io/anuke/mindustry/input/AndroidInput.java
@@ -0,0 +1,121 @@
+package io.anuke.mindustry.input;
+
+import static io.anuke.mindustry.Vars.*;
+
+import com.badlogic.gdx.Gdx;
+import com.badlogic.gdx.Input.Keys;
+import com.badlogic.gdx.InputAdapter;
+import com.badlogic.gdx.math.Vector2;
+
+import io.anuke.mindustry.Inventory;
+import io.anuke.mindustry.World;
+import io.anuke.mindustry.resource.ItemStack;
+import io.anuke.mindustry.world.Tile;
+import io.anuke.mindustry.world.blocks.Blocks;
+import io.anuke.mindustry.world.blocks.ProductionBlocks;
+import io.anuke.ucore.core.Effects;
+import io.anuke.ucore.core.Graphics;
+import io.anuke.ucore.core.Sounds;
+import io.anuke.ucore.scene.utils.Cursors;
+import io.anuke.ucore.util.Mathf;
+
+public class AndroidInput extends InputAdapter{
+ public static float mousex, mousey;
+ private static float lmousex, lmousey;
+ private static float warmup;
+ private static float warmupDelay = 20;
+
+ @Override
+ public boolean keyDown (int keycode) {
+ if(keycode == Keys.E){
+ place();
+ }
+ return false;
+ }
+
+ @Override
+ public boolean touchDown (int screenX, int screenY, int pointer, int button) {
+ if(pointer == 0){
+ lmousex = screenX;
+ lmousey = screenY;
+ }
+ warmup = 0;
+ return false;
+ }
+
+ public static Tile selected(){
+ Vector2 vec = Graphics.world(mousex, mousey);
+ return World.tile(Mathf.scl2(vec.x, tilesize), Mathf.scl2(vec.y, tilesize));
+ }
+
+ public static void breakBlock(){
+ Tile tile = selected();
+ breaktime += Mathf.delta();
+ if(breaktime >= tile.block().breaktime){
+ Effects.effect("break", tile.worldx(), tile.worldy());
+ Effects.shake(3f, 1f);
+ tile.setBlock(Blocks.air);
+ breaktime = 0f;
+ Sounds.play("break");
+ }
+ }
+
+ public static void place(){
+ Vector2 vec = Graphics.world(mousex, mousey);
+
+ int tilex = Mathf.scl2(vec.x, tilesize);
+ int tiley = Mathf.scl2(vec.y, tilesize);
+
+ if(recipe != null &&
+ World.validPlace(tilex, tiley, recipe.result)){
+
+ Tile tile = World.tile(tilex, tiley);
+
+ if(tile == null)
+ return; //just in case
+
+ tile.setBlock(recipe.result);
+ tile.rotation = rotation;
+
+ Effects.effect("place", tilex*tilesize, tiley*tilesize);
+ Effects.shake(2f, 2f);
+ Sounds.play("place");
+
+ for(ItemStack stack : recipe.requirements){
+ Inventory.removeItem(stack);
+ }
+
+ if(!Inventory.hasItems(recipe.requirements)){
+ recipe = null;
+ Cursors.restoreCursor();
+ }
+ }
+ }
+
+ public static void doInput(){
+ if(Gdx.input.isTouched(0)
+ && Mathf.near2d(lmousex, lmousey, Gdx.input.getX(0), Gdx.input.getY(0), 50)
+ && !ui.hasMouse() && recipe == null){
+ warmup += Mathf.delta();
+
+ mousex = Gdx.input.getX(0);
+ mousey = Gdx.input.getY(0);
+
+ Tile sel = selected();
+
+ if(warmup > warmupDelay && sel.block() != ProductionBlocks.core && sel.breakable()){
+ breaktime += Mathf.delta();
+
+ if(breaktime > selected().block().breaktime){
+ breakBlock();
+ breaktime = 0;
+ }
+ }
+ }else{
+ warmup = 0;
+ lmousex = Gdx.input.getX(0);
+ lmousey = Gdx.input.getY(0);
+ breaktime = 0;
+ }
+ }
+}
diff --git a/core/src/io/anuke/mindustry/input/GestureHandler.java b/core/src/io/anuke/mindustry/input/GestureHandler.java
new file mode 100644
index 0000000000..a49afc6158
--- /dev/null
+++ b/core/src/io/anuke/mindustry/input/GestureHandler.java
@@ -0,0 +1,99 @@
+package io.anuke.mindustry.input;
+
+import static io.anuke.mindustry.Vars.*;
+
+import com.badlogic.gdx.Gdx;
+import com.badlogic.gdx.input.GestureDetector.GestureAdapter;
+import com.badlogic.gdx.math.Vector2;
+
+import io.anuke.mindustry.World;
+import io.anuke.mindustry.world.Tile;
+import io.anuke.mindustry.world.blocks.Blocks;
+import io.anuke.ucore.core.Effects;
+import io.anuke.ucore.core.Sounds;
+import io.anuke.ucore.util.Mathf;
+
+public class GestureHandler extends GestureAdapter{
+ Vector2 pinch1 = new Vector2(-1, -1), pinch2 = pinch1.cpy();
+ Vector2 vector = new Vector2();
+ float initzoom = -1;
+
+ @Override
+ public boolean longPress(float x, float y){
+ Tile tile = World.cursorTile();
+ breaktime += Mathf.delta();
+ if(breaktime >= tile.block().breaktime){
+ Effects.effect("break", tile.worldx(), tile.worldy());
+ Effects.shake(3f, 1f);
+ tile.setBlock(Blocks.air);
+ breaktime = 0f;
+ Sounds.play("break");
+ }
+ return false;
+ }
+
+ @Override
+ public boolean pan(float x, float y, float deltaX, float deltaY){
+ if(recipe == null){
+ player.x -= deltaX*control.camera.zoom/control.cameraScale;
+ player.y += deltaY*control.camera.zoom/control.cameraScale;
+ }else{
+ AndroidInput.mousex += deltaX;
+ AndroidInput.mousey += deltaY;
+ }
+
+ return false;
+ }
+
+
+
+ @Override
+ public boolean pinch (Vector2 initialPointer1, Vector2 initialPointer2, Vector2 pointer1, Vector2 pointer2) {
+ if(recipe == null)
+ return false;
+
+ if(pinch1.x < 0){
+ pinch1.set(initialPointer1);
+ pinch2.set(initialPointer2);
+ }
+
+ Vector2 vec = (vector.set(pointer1).add(pointer2).scl(0.5f)).sub(pinch1.add(pinch2).scl(0.5f));
+
+ player.x -= vec.x*control.camera.zoom/control.cameraScale;
+ player.y += vec.y*control.camera.zoom/control.cameraScale;
+
+ pinch1.set(pointer1);
+ pinch2.set(pointer2);
+
+ return false;
+ }
+
+ @Override
+ public boolean zoom(float initialDistance, float distance){
+
+ if(initzoom <= 0)
+ initzoom = initialDistance;
+
+ control.targetzoom /= (distance/initzoom);
+ control.clampZoom();
+ control.camera.update();
+
+ initzoom = distance;
+
+ return false;
+ }
+
+ @Override
+ public void pinchStop () {
+ initzoom = -1;
+ pinch2.set(pinch1.set(-1, -1));
+ }
+
+ int touches(){
+ int sum = 0;
+ for(int i = 0; i < 10; i ++){
+ if(Gdx.input.isTouched(i)) sum++;
+ }
+ return sum;
+ }
+}
diff --git a/core/src/io/anuke/mindustry/Input.java b/core/src/io/anuke/mindustry/input/Input.java
similarity index 96%
rename from core/src/io/anuke/mindustry/Input.java
rename to core/src/io/anuke/mindustry/input/Input.java
index b46d97d770..ed2a430e23 100644
--- a/core/src/io/anuke/mindustry/Input.java
+++ b/core/src/io/anuke/mindustry/input/Input.java
@@ -1,10 +1,12 @@
-package io.anuke.mindustry;
+package io.anuke.mindustry.input;
import static io.anuke.mindustry.Vars.*;
import com.badlogic.gdx.Input.Buttons;
import com.badlogic.gdx.Input.Keys;
+import io.anuke.mindustry.Inventory;
+import io.anuke.mindustry.World;
import io.anuke.mindustry.entities.Weapon;
import io.anuke.mindustry.resource.ItemStack;
import io.anuke.mindustry.world.Tile;
diff --git a/core/src/io/anuke/mindustry/ui/TutorialDialog.java b/core/src/io/anuke/mindustry/ui/TutorialDialog.java
index 9d44eff94c..8ff86c5aae 100644
--- a/core/src/io/anuke/mindustry/ui/TutorialDialog.java
+++ b/core/src/io/anuke/mindustry/ui/TutorialDialog.java
@@ -8,7 +8,7 @@ import io.anuke.ucore.scene.ui.TextDialog;
public class TutorialDialog extends TextDialog{
public TutorialDialog(){
- super("Tutorial", tutorialText);
+ super("Tutorial", android ? androidTutorialText : tutorialText);
setup();
}
diff --git a/core/src/io/anuke/mindustry/ui/UpgradeDialog.java b/core/src/io/anuke/mindustry/ui/UpgradeDialog.java
index 3004410b44..8643e219f2 100644
--- a/core/src/io/anuke/mindustry/ui/UpgradeDialog.java
+++ b/core/src/io/anuke/mindustry/ui/UpgradeDialog.java
@@ -9,6 +9,7 @@ import io.anuke.mindustry.entities.Weapon;
import io.anuke.mindustry.resource.ItemStack;
import io.anuke.ucore.core.Draw;
import io.anuke.ucore.core.Effects;
+import io.anuke.ucore.function.Listenable;
import io.anuke.ucore.scene.event.Touchable;
import io.anuke.ucore.scene.ui.*;
import io.anuke.ucore.scene.ui.layout.Table;
@@ -71,7 +72,7 @@ public class UpgradeDialog extends Dialog{
Table tiptable = new Table();
- Runnable run = ()->{
+ Listenable run = ()->{
tiptable.clearChildren();
String description = weapon.description;
@@ -100,7 +101,7 @@ public class UpgradeDialog extends Dialog{
tiptable.pad(10f);
};
- run.run();
+ run.listen();
Tooltip tip = new Tooltip(tiptable, run);
@@ -114,7 +115,7 @@ public class UpgradeDialog extends Dialog{
Inventory.removeItems(weapon.requirements);
weapons.put(weapon, true);
ui.updateWeapons();
- run.run();
+ run.listen();
Effects.sound("purchase");
});
}
diff --git a/core/src/io/anuke/mindustry/world/Block.java b/core/src/io/anuke/mindustry/world/Block.java
index 7b8094008f..fbed23f177 100644
--- a/core/src/io/anuke/mindustry/world/Block.java
+++ b/core/src/io/anuke/mindustry/world/Block.java
@@ -160,10 +160,8 @@ public class Block{
if(floor.id <= this.id) continue;
- TextureRegion region = Draw.region(floor.name() + "edge");
-
- if(region == null)
- region = Draw.region(floor.edge + "edge");
+ TextureRegion region = Draw.hasRegion(floor.name() + "edge") ? Draw.region(floor.name() + "edge") :
+ Draw.region(floor.edge + "edge");
int sx = -dx*8+2, sy = -dy*8+2;
int x = Mathf.clamp(sx, 0, 12);
diff --git a/core/src/io/anuke/ucore/function/ActionProvider.java b/core/src/io/anuke/ucore/function/ActionProvider.java
new file mode 100644
index 0000000000..b21bf03b93
--- /dev/null
+++ b/core/src/io/anuke/ucore/function/ActionProvider.java
@@ -0,0 +1,7 @@
+package io.anuke.ucore.function;
+
+import io.anuke.ucore.scene.Action;
+
+public interface ActionProvider{
+ public Action get();
+}
diff --git a/core/src/io/anuke/ucore/function/ButtonTweaker.java b/core/src/io/anuke/ucore/function/ButtonTweaker.java
new file mode 100644
index 0000000000..a7ea0fb6d6
--- /dev/null
+++ b/core/src/io/anuke/ucore/function/ButtonTweaker.java
@@ -0,0 +1,7 @@
+package io.anuke.ucore.function;
+
+import io.anuke.ucore.scene.ui.TextButton;
+
+public interface ButtonTweaker{
+ public void tweak(TextButton button);
+}
diff --git a/core/src/io/anuke/ucore/function/Callable.java b/core/src/io/anuke/ucore/function/Callable.java
new file mode 100644
index 0000000000..8b4e399eb2
--- /dev/null
+++ b/core/src/io/anuke/ucore/function/Callable.java
@@ -0,0 +1,5 @@
+package io.anuke.ucore.function;
+
+public interface Callable{
+ public void run();
+}
diff --git a/core/src/io/anuke/ucore/function/CheckListenable.java b/core/src/io/anuke/ucore/function/CheckListenable.java
new file mode 100644
index 0000000000..fd71dfb0a4
--- /dev/null
+++ b/core/src/io/anuke/ucore/function/CheckListenable.java
@@ -0,0 +1,5 @@
+package io.anuke.ucore.function;
+
+public interface CheckListenable{
+ public void listen(boolean checked);
+}
diff --git a/core/src/io/anuke/ucore/function/ColorListenable.java b/core/src/io/anuke/ucore/function/ColorListenable.java
new file mode 100644
index 0000000000..72aa5f0577
--- /dev/null
+++ b/core/src/io/anuke/ucore/function/ColorListenable.java
@@ -0,0 +1,7 @@
+package io.anuke.ucore.function;
+
+import com.badlogic.gdx.graphics.Color;
+
+public interface ColorListenable{
+ public void changed(Color color);
+}
diff --git a/core/src/io/anuke/ucore/function/Consumer.java b/core/src/io/anuke/ucore/function/Consumer.java
new file mode 100644
index 0000000000..1799b048a5
--- /dev/null
+++ b/core/src/io/anuke/ucore/function/Consumer.java
@@ -0,0 +1,5 @@
+package io.anuke.ucore.function;
+
+public interface Consumer{
+ public void accept(T t);
+}
diff --git a/core/src/io/anuke/ucore/function/EffectRenderer.java b/core/src/io/anuke/ucore/function/EffectRenderer.java
new file mode 100644
index 0000000000..826b390d16
--- /dev/null
+++ b/core/src/io/anuke/ucore/function/EffectRenderer.java
@@ -0,0 +1,7 @@
+package io.anuke.ucore.function;
+
+import io.anuke.ucore.entities.Effect;
+
+public interface EffectRenderer{
+ public void render(Effect effect);
+}
diff --git a/core/src/io/anuke/ucore/function/FieldListenable.java b/core/src/io/anuke/ucore/function/FieldListenable.java
new file mode 100644
index 0000000000..a16ca9c1d3
--- /dev/null
+++ b/core/src/io/anuke/ucore/function/FieldListenable.java
@@ -0,0 +1,5 @@
+package io.anuke.ucore.function;
+
+public interface FieldListenable{
+ public void listen(String text);
+}
diff --git a/core/src/io/anuke/ucore/function/KeyListenable.java b/core/src/io/anuke/ucore/function/KeyListenable.java
new file mode 100644
index 0000000000..40d4caf8be
--- /dev/null
+++ b/core/src/io/anuke/ucore/function/KeyListenable.java
@@ -0,0 +1,5 @@
+package io.anuke.ucore.function;
+
+public interface KeyListenable{
+ public void pressed(int key);
+}
diff --git a/core/src/io/anuke/ucore/function/Listenable.java b/core/src/io/anuke/ucore/function/Listenable.java
new file mode 100644
index 0000000000..f77a4dcb87
--- /dev/null
+++ b/core/src/io/anuke/ucore/function/Listenable.java
@@ -0,0 +1,6 @@
+package io.anuke.ucore.function;
+
+/**Listener lambda class.*/
+public interface Listenable{
+ public void listen();
+}
diff --git a/core/src/io/anuke/ucore/function/PositionConsumer.java b/core/src/io/anuke/ucore/function/PositionConsumer.java
new file mode 100644
index 0000000000..86c855eb63
--- /dev/null
+++ b/core/src/io/anuke/ucore/function/PositionConsumer.java
@@ -0,0 +1,5 @@
+package io.anuke.ucore.function;
+
+public interface PositionConsumer{
+ public void accept(float x, float y);
+}
diff --git a/core/src/io/anuke/ucore/function/Predicate.java b/core/src/io/anuke/ucore/function/Predicate.java
new file mode 100644
index 0000000000..8a741c4d1b
--- /dev/null
+++ b/core/src/io/anuke/ucore/function/Predicate.java
@@ -0,0 +1,5 @@
+package io.anuke.ucore.function;
+
+public interface Predicate{
+ public boolean test(T t);
+}
diff --git a/core/src/io/anuke/ucore/function/StringProcessor.java b/core/src/io/anuke/ucore/function/StringProcessor.java
new file mode 100644
index 0000000000..ff4bc44cf4
--- /dev/null
+++ b/core/src/io/anuke/ucore/function/StringProcessor.java
@@ -0,0 +1,5 @@
+package io.anuke.ucore.function;
+
+public interface StringProcessor{
+ public String get(int i);
+}
diff --git a/core/src/io/anuke/ucore/function/StringSupplier.java b/core/src/io/anuke/ucore/function/StringSupplier.java
new file mode 100644
index 0000000000..cf04609aca
--- /dev/null
+++ b/core/src/io/anuke/ucore/function/StringSupplier.java
@@ -0,0 +1,5 @@
+package io.anuke.ucore.function;
+
+public interface StringSupplier{
+ public String get();
+}
diff --git a/core/src/io/anuke/ucore/function/TileCollider.java b/core/src/io/anuke/ucore/function/TileCollider.java
new file mode 100644
index 0000000000..3cd67b2771
--- /dev/null
+++ b/core/src/io/anuke/ucore/function/TileCollider.java
@@ -0,0 +1,6 @@
+package io.anuke.ucore.function;
+
+public interface TileCollider{
+ public boolean solid(int x, int y);
+}
+
diff --git a/core/src/io/anuke/ucore/function/TileHitboxProvider.java b/core/src/io/anuke/ucore/function/TileHitboxProvider.java
new file mode 100644
index 0000000000..328cd3984c
--- /dev/null
+++ b/core/src/io/anuke/ucore/function/TileHitboxProvider.java
@@ -0,0 +1,7 @@
+package io.anuke.ucore.function;
+
+import com.badlogic.gdx.math.Rectangle;
+
+public interface TileHitboxProvider{
+ public void getHitbox(int x, int y, Rectangle out);
+}
diff --git a/core/src/io/anuke/ucore/function/TypingListenable.java b/core/src/io/anuke/ucore/function/TypingListenable.java
new file mode 100644
index 0000000000..104bd09e19
--- /dev/null
+++ b/core/src/io/anuke/ucore/function/TypingListenable.java
@@ -0,0 +1,5 @@
+package io.anuke.ucore.function;
+
+public interface TypingListenable{
+ public void typed(char c);
+}
diff --git a/core/src/io/anuke/ucore/function/VisibilityProvider.java b/core/src/io/anuke/ucore/function/VisibilityProvider.java
new file mode 100644
index 0000000000..9b6daa84ba
--- /dev/null
+++ b/core/src/io/anuke/ucore/function/VisibilityProvider.java
@@ -0,0 +1,5 @@
+package io.anuke.ucore.function;
+
+public interface VisibilityProvider{
+ public boolean visible();
+}
diff --git a/gradle.properties b/gradle.properties
index 339fa1508b..bad4dbbeee 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,3 +1,3 @@
org.gradle.daemon=true
-org.gradle.jvmargs=-Xms128m -Xmx1500m
+org.gradle.jvmargs=-Xms1024m -Xmx2048m
org.gradle.configureondemand=true
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index b902acb8dd..9760ad1d54 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Sat Sep 21 13:08:26 CEST 2013
+#Sun May 28 16:07:17 EDT 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
+distributionUrl=http\://services.gradle.org/distributions/gradle-3.5-rc-3-all.zip
diff --git a/settings.gradle b/settings.gradle
index 56a7af46b1..e90e722ddb 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1 +1 @@
-include 'desktop', 'html', 'core'
+include 'desktop', 'html', 'core', 'android'
diff --git a/ui/blank.png b/ui/blank.png
new file mode 100644
index 0000000000..b2f9501f47
Binary files /dev/null and b/ui/blank.png differ
diff --git a/ui/border-circle-error.png b/ui/border-circle-error.png
new file mode 100644
index 0000000000..6aaeb4ecba
Binary files /dev/null and b/ui/border-circle-error.png differ
diff --git a/ui/border-circle.png b/ui/border-circle.png
new file mode 100644
index 0000000000..1d9c9bb057
Binary files /dev/null and b/ui/border-circle.png differ
diff --git a/ui/border-dark-blue.9.png b/ui/border-dark-blue.9.png
new file mode 100644
index 0000000000..59a7443282
Binary files /dev/null and b/ui/border-dark-blue.9.png differ
diff --git a/ui/border-error.9.png b/ui/border-error.9.png
new file mode 100644
index 0000000000..996a663927
Binary files /dev/null and b/ui/border-error.9.png differ
diff --git a/ui/border-white.9.png b/ui/border-white.9.png
new file mode 100644
index 0000000000..e5d219eef9
Binary files /dev/null and b/ui/border-white.9.png differ
diff --git a/ui/border.9.png b/ui/border.9.png
new file mode 100644
index 0000000000..6e0dea69e0
Binary files /dev/null and b/ui/border.9.png differ
diff --git a/ui/bump.9.png b/ui/bump.9.png
new file mode 100644
index 0000000000..12a1b3d66b
Binary files /dev/null and b/ui/bump.9.png differ
diff --git a/ui/button-blue-down.9.png b/ui/button-blue-down.9.png
new file mode 100644
index 0000000000..bd14b14179
Binary files /dev/null and b/ui/button-blue-down.9.png differ
diff --git a/ui/button-blue-over.9.png b/ui/button-blue-over.9.png
new file mode 100644
index 0000000000..071dc99259
Binary files /dev/null and b/ui/button-blue-over.9.png differ
diff --git a/ui/button-blue.9.png b/ui/button-blue.9.png
new file mode 100644
index 0000000000..7364829a7a
Binary files /dev/null and b/ui/button-blue.9.png differ
diff --git a/ui/button-down.9.png b/ui/button-down.9.png
new file mode 100644
index 0000000000..dd54656563
Binary files /dev/null and b/ui/button-down.9.png differ
diff --git a/ui/button-gray-over.9.png b/ui/button-gray-over.9.png
new file mode 100644
index 0000000000..31a904acba
Binary files /dev/null and b/ui/button-gray-over.9.png differ
diff --git a/ui/button-gray.9.png b/ui/button-gray.9.png
new file mode 100644
index 0000000000..d47e70b84f
Binary files /dev/null and b/ui/button-gray.9.png differ
diff --git a/ui/button-map-down.9.png b/ui/button-map-down.9.png
new file mode 100644
index 0000000000..b34035f63c
Binary files /dev/null and b/ui/button-map-down.9.png differ
diff --git a/ui/button-map-over.9.png b/ui/button-map-over.9.png
new file mode 100644
index 0000000000..02b2542e97
Binary files /dev/null and b/ui/button-map-over.9.png differ
diff --git a/ui/button-map.9.png b/ui/button-map.9.png
new file mode 100644
index 0000000000..0162270254
Binary files /dev/null and b/ui/button-map.9.png differ
diff --git a/ui/button-over.9.png b/ui/button-over.9.png
new file mode 100644
index 0000000000..9d1144c6ac
Binary files /dev/null and b/ui/button-over.9.png differ
diff --git a/ui/button-red.9.png b/ui/button-red.9.png
new file mode 100644
index 0000000000..1bebf700e4
Binary files /dev/null and b/ui/button-red.9.png differ
diff --git a/ui/button-select.9.png b/ui/button-select.9.png
new file mode 100644
index 0000000000..4d793ce8fe
Binary files /dev/null and b/ui/button-select.9.png differ
diff --git a/ui/button-window-bg.9.png b/ui/button-window-bg.9.png
new file mode 100644
index 0000000000..564a70a904
Binary files /dev/null and b/ui/button-window-bg.9.png differ
diff --git a/ui/button-window-over.9.png b/ui/button-window-over.9.png
new file mode 100644
index 0000000000..2e45f28378
Binary files /dev/null and b/ui/button-window-over.9.png differ
diff --git a/ui/button.9.png b/ui/button.9.png
new file mode 100644
index 0000000000..e3f0d440f2
Binary files /dev/null and b/ui/button.9.png differ
diff --git a/ui/check-off.png b/ui/check-off.png
new file mode 100644
index 0000000000..d73a1a6e1f
Binary files /dev/null and b/ui/check-off.png differ
diff --git a/ui/check-on.png b/ui/check-on.png
new file mode 100644
index 0000000000..f1d36ec60c
Binary files /dev/null and b/ui/check-on.png differ
diff --git a/ui/check-over.png b/ui/check-over.png
new file mode 100644
index 0000000000..d0fe60dbba
Binary files /dev/null and b/ui/check-over.png differ
diff --git a/ui/clear.png b/ui/clear.png
new file mode 100644
index 0000000000..a38cc5d663
Binary files /dev/null and b/ui/clear.png differ
diff --git a/ui/color-picker-bar-selector.png b/ui/color-picker-bar-selector.png
new file mode 100644
index 0000000000..84e626e0e2
Binary files /dev/null and b/ui/color-picker-bar-selector.png differ
diff --git a/ui/color-picker-cross.png b/ui/color-picker-cross.png
new file mode 100644
index 0000000000..70489c4919
Binary files /dev/null and b/ui/color-picker-cross.png differ
diff --git a/ui/color-picker-selector-horizontal.png b/ui/color-picker-selector-horizontal.png
new file mode 100644
index 0000000000..8b6025462f
Binary files /dev/null and b/ui/color-picker-selector-horizontal.png differ
diff --git a/ui/color-picker-selector-vertical.png b/ui/color-picker-selector-vertical.png
new file mode 100644
index 0000000000..c36d51297c
Binary files /dev/null and b/ui/color-picker-selector-vertical.png differ
diff --git a/ui/cursor-normal.png b/ui/cursor-normal.png
new file mode 100644
index 0000000000..7724fe99db
Binary files /dev/null and b/ui/cursor-normal.png differ
diff --git a/ui/cursor.png b/ui/cursor.png
new file mode 100644
index 0000000000..67ff25cb9a
Binary files /dev/null and b/ui/cursor.png differ
diff --git a/ui/default-pane-no-border.9.png b/ui/default-pane-no-border.9.png
new file mode 100644
index 0000000000..d2c3e66a49
Binary files /dev/null and b/ui/default-pane-no-border.9.png differ
diff --git a/ui/default-pane.9.png b/ui/default-pane.9.png
new file mode 100644
index 0000000000..6ff8c37650
Binary files /dev/null and b/ui/default-pane.9.png differ
diff --git a/ui/default-select-selection.9.png b/ui/default-select-selection.9.png
new file mode 100644
index 0000000000..faa20b6bb8
Binary files /dev/null and b/ui/default-select-selection.9.png differ
diff --git a/ui/default-select.9.png b/ui/default-select.9.png
new file mode 100644
index 0000000000..c837c8313e
Binary files /dev/null and b/ui/default-select.9.png differ
diff --git a/ui/grey.png b/ui/grey.png
new file mode 100644
index 0000000000..d57b4a1bb5
Binary files /dev/null and b/ui/grey.png differ
diff --git a/ui/icon-cancel.png b/ui/icon-cancel.png
new file mode 100644
index 0000000000..bf4c7ed9a0
Binary files /dev/null and b/ui/icon-cancel.png differ
diff --git a/ui/icon-check.png b/ui/icon-check.png
new file mode 100644
index 0000000000..b3958fa59e
Binary files /dev/null and b/ui/icon-check.png differ
diff --git a/ui/icon-close-down.png b/ui/icon-close-down.png
new file mode 100644
index 0000000000..204c2eb911
Binary files /dev/null and b/ui/icon-close-down.png differ
diff --git a/ui/icon-close-over.png b/ui/icon-close-over.png
new file mode 100644
index 0000000000..e526739fb6
Binary files /dev/null and b/ui/icon-close-over.png differ
diff --git a/ui/icon-close.png b/ui/icon-close.png
new file mode 100644
index 0000000000..02b26e0a25
Binary files /dev/null and b/ui/icon-close.png differ
diff --git a/ui/icon-defense.png b/ui/icon-defense.png
new file mode 100644
index 0000000000..003074bc56
Binary files /dev/null and b/ui/icon-defense.png differ
diff --git a/ui/icon-distribution.png b/ui/icon-distribution.png
new file mode 100644
index 0000000000..0c1ea5112e
Binary files /dev/null and b/ui/icon-distribution.png differ
diff --git a/ui/icon-production.png b/ui/icon-production.png
new file mode 100644
index 0000000000..2191bedfac
Binary files /dev/null and b/ui/icon-production.png differ
diff --git a/ui/icon-rotate.png b/ui/icon-rotate.png
new file mode 100644
index 0000000000..50ca4688dd
Binary files /dev/null and b/ui/icon-rotate.png differ
diff --git a/ui/list-selection.png b/ui/list-selection.png
new file mode 100644
index 0000000000..c31c5175b0
Binary files /dev/null and b/ui/list-selection.png differ
diff --git a/ui/menu-bg.png b/ui/menu-bg.png
new file mode 100644
index 0000000000..d57b4a1bb5
Binary files /dev/null and b/ui/menu-bg.png differ
diff --git a/ui/padded-list-selection.9.png b/ui/padded-list-selection.9.png
new file mode 100644
index 0000000000..9e6045b908
Binary files /dev/null and b/ui/padded-list-selection.9.png differ
diff --git a/ui/progressbar-filled-vertical.png b/ui/progressbar-filled-vertical.png
new file mode 100644
index 0000000000..6713cc9ea9
Binary files /dev/null and b/ui/progressbar-filled-vertical.png differ
diff --git a/ui/progressbar-filled.png b/ui/progressbar-filled.png
new file mode 100644
index 0000000000..50f58e3535
Binary files /dev/null and b/ui/progressbar-filled.png differ
diff --git a/ui/progressbar-vertical.png b/ui/progressbar-vertical.png
new file mode 100644
index 0000000000..adeec047fe
Binary files /dev/null and b/ui/progressbar-vertical.png differ
diff --git a/ui/progressbar.png b/ui/progressbar.png
new file mode 100644
index 0000000000..439795f5d5
Binary files /dev/null and b/ui/progressbar.png differ
diff --git a/ui/radio-off.png b/ui/radio-off.png
new file mode 100644
index 0000000000..6b418cf4ea
Binary files /dev/null and b/ui/radio-off.png differ
diff --git a/ui/radio-on.png b/ui/radio-on.png
new file mode 100644
index 0000000000..8192c2d22f
Binary files /dev/null and b/ui/radio-on.png differ
diff --git a/ui/scroll-horizontal.9.png b/ui/scroll-horizontal.9.png
new file mode 100644
index 0000000000..6569566c4b
Binary files /dev/null and b/ui/scroll-horizontal.9.png differ
diff --git a/ui/scroll-knob-horizontal.9.png b/ui/scroll-knob-horizontal.9.png
new file mode 100644
index 0000000000..2b898da798
Binary files /dev/null and b/ui/scroll-knob-horizontal.9.png differ
diff --git a/ui/scroll-knob-vertical.9.png b/ui/scroll-knob-vertical.9.png
new file mode 100644
index 0000000000..36f994e9c9
Binary files /dev/null and b/ui/scroll-knob-vertical.9.png differ
diff --git a/ui/scroll.9.png b/ui/scroll.9.png
new file mode 100644
index 0000000000..efbaeea0e3
Binary files /dev/null and b/ui/scroll.9.png differ
diff --git a/ui/select-box-list-bg.png b/ui/select-box-list-bg.png
new file mode 100644
index 0000000000..640981b220
Binary files /dev/null and b/ui/select-box-list-bg.png differ
diff --git a/ui/select-down.png b/ui/select-down.png
new file mode 100644
index 0000000000..4390d83447
Binary files /dev/null and b/ui/select-down.png differ
diff --git a/ui/select-up.png b/ui/select-up.png
new file mode 100644
index 0000000000..67fcb85d76
Binary files /dev/null and b/ui/select-up.png differ
diff --git a/ui/selection.png b/ui/selection.png
new file mode 100644
index 0000000000..e779aea9b1
Binary files /dev/null and b/ui/selection.png differ
diff --git a/ui/separator-menu.png b/ui/separator-menu.png
new file mode 100644
index 0000000000..5c633eb1c7
Binary files /dev/null and b/ui/separator-menu.png differ
diff --git a/ui/separator.png b/ui/separator.png
new file mode 100644
index 0000000000..114704cbce
Binary files /dev/null and b/ui/separator.png differ
diff --git a/ui/slider-knob-disabled.png b/ui/slider-knob-disabled.png
new file mode 100644
index 0000000000..7bbf8cabc5
Binary files /dev/null and b/ui/slider-knob-disabled.png differ
diff --git a/ui/slider-knob-down.png b/ui/slider-knob-down.png
new file mode 100644
index 0000000000..369c253da6
Binary files /dev/null and b/ui/slider-knob-down.png differ
diff --git a/ui/slider-knob-over.png b/ui/slider-knob-over.png
new file mode 100644
index 0000000000..dce3813656
Binary files /dev/null and b/ui/slider-knob-over.png differ
diff --git a/ui/slider-knob.png b/ui/slider-knob.png
new file mode 100644
index 0000000000..9e7bd21cc6
Binary files /dev/null and b/ui/slider-knob.png differ
diff --git a/ui/slider-vertical.png b/ui/slider-vertical.png
new file mode 100644
index 0000000000..e4139783a0
Binary files /dev/null and b/ui/slider-vertical.png differ
diff --git a/ui/slider.png b/ui/slider.png
new file mode 100644
index 0000000000..7986f4f53b
Binary files /dev/null and b/ui/slider.png differ
diff --git a/ui/slot.9.png b/ui/slot.9.png
new file mode 100644
index 0000000000..66d175ec16
Binary files /dev/null and b/ui/slot.9.png differ
diff --git a/ui/splitpane-over.png b/ui/splitpane-over.png
new file mode 100644
index 0000000000..feaf4d9010
Binary files /dev/null and b/ui/splitpane-over.png differ
diff --git a/ui/splitpane-vertical-over.png b/ui/splitpane-vertical-over.png
new file mode 100644
index 0000000000..211cba34aa
Binary files /dev/null and b/ui/splitpane-vertical-over.png differ
diff --git a/ui/splitpane-vertical.png b/ui/splitpane-vertical.png
new file mode 100644
index 0000000000..4328d75f8d
Binary files /dev/null and b/ui/splitpane-vertical.png differ
diff --git a/ui/splitpane.png b/ui/splitpane.png
new file mode 100644
index 0000000000..ff4820d685
Binary files /dev/null and b/ui/splitpane.png differ
diff --git a/ui/sub-menu.png b/ui/sub-menu.png
new file mode 100644
index 0000000000..43fe36b6b3
Binary files /dev/null and b/ui/sub-menu.png differ
diff --git a/ui/textfield-over.9.png b/ui/textfield-over.9.png
new file mode 100644
index 0000000000..3fe1f1ec4f
Binary files /dev/null and b/ui/textfield-over.9.png differ
diff --git a/ui/textfield.9.png b/ui/textfield.9.png
new file mode 100644
index 0000000000..fda1b6679a
Binary files /dev/null and b/ui/textfield.9.png differ
diff --git a/ui/tooltip-bg.9.png b/ui/tooltip-bg.9.png
new file mode 100644
index 0000000000..00ddecbbb2
Binary files /dev/null and b/ui/tooltip-bg.9.png differ
diff --git a/ui/touchpad-knob.png b/ui/touchpad-knob.png
new file mode 100644
index 0000000000..48b9c26339
Binary files /dev/null and b/ui/touchpad-knob.png differ
diff --git a/ui/tree-minus.png b/ui/tree-minus.png
new file mode 100644
index 0000000000..cbfe2436a5
Binary files /dev/null and b/ui/tree-minus.png differ
diff --git a/ui/tree-over.png b/ui/tree-over.png
new file mode 100644
index 0000000000..114704cbce
Binary files /dev/null and b/ui/tree-over.png differ
diff --git a/ui/tree-plus.png b/ui/tree-plus.png
new file mode 100644
index 0000000000..9aafc6b9c7
Binary files /dev/null and b/ui/tree-plus.png differ
diff --git a/ui/tree-selection.9.png b/ui/tree-selection.9.png
new file mode 100644
index 0000000000..9721e9ed9e
Binary files /dev/null and b/ui/tree-selection.9.png differ
diff --git a/ui/white.png b/ui/white.png
new file mode 100644
index 0000000000..ba9bf827c1
Binary files /dev/null and b/ui/white.png differ
diff --git a/ui/window-bg.png b/ui/window-bg.png
new file mode 100644
index 0000000000..640981b220
Binary files /dev/null and b/ui/window-bg.png differ
diff --git a/ui/window-border-bg.9.png b/ui/window-border-bg.9.png
new file mode 100644
index 0000000000..aba4bf1526
Binary files /dev/null and b/ui/window-border-bg.9.png differ
diff --git a/ui/window-gray.9.png b/ui/window-gray.9.png
new file mode 100644
index 0000000000..36c4fc6ca5
Binary files /dev/null and b/ui/window-gray.9.png differ
diff --git a/ui/window-noborder.9.png b/ui/window-noborder.9.png
new file mode 100644
index 0000000000..e73c7cab58
Binary files /dev/null and b/ui/window-noborder.9.png differ
diff --git a/ui/window-resizable.9.png b/ui/window-resizable.9.png
new file mode 100644
index 0000000000..59839b9515
Binary files /dev/null and b/ui/window-resizable.9.png differ
diff --git a/ui/window.9.png b/ui/window.9.png
new file mode 100644
index 0000000000..8bb4f278ae
Binary files /dev/null and b/ui/window.9.png differ