From 547c2b90257a113c65f4e65e28870d95948d668d Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 29 Jun 2017 00:54:10 -0400 Subject: [PATCH] Implemented Android support --- android/AndroidManifest.xml | 26 ++++ {core => android}/assets/maps/canyon.png | Bin {core => android}/assets/maps/delta.png | Bin {core => android}/assets/maps/map.png | Bin {core => android}/assets/maps/maze.png | Bin {core => android}/assets/maps/pit.png | Bin {core => android}/assets/maps/test.png | Bin {core => android}/assets/music/1.mp3 | Bin {core => android}/assets/music/2.mp3 | Bin {core => android}/assets/music/3.mp3 | Bin {core => android}/assets/music/place.wav | Bin {core => android}/assets/music/shoot.wav | Bin {core => android}/assets/sounds/bloop.wav | Bin {core => android}/assets/sounds/break.wav | Bin .../assets/sounds/corexplode.wav | Bin {core => android}/assets/sounds/die.wav | Bin .../assets/sounds/enemyshoot.wav | Bin {core => android}/assets/sounds/explosion.wav | Bin {core => android}/assets/sounds/flame.wav | Bin {core => android}/assets/sounds/flame2.wav | Bin {core => android}/assets/sounds/missile.wav | Bin {core => android}/assets/sounds/place.wav | Bin {core => android}/assets/sounds/purchase.wav | Bin {core => android}/assets/sounds/resonate.wav | Bin {core => android}/assets/sounds/respawn.wav | Bin {core => android}/assets/sounds/shoot.wav | Bin {core => android}/assets/sounds/spawn.wav | Bin {core => android}/assets/sprites/back.png | Bin {core => android}/assets/sprites/conveyor.png | Bin .../assets/sprites/conveyort.png | Bin .../assets/sprites/mindustry.atlas | 0 .../assets/sprites/mindustry.png | Bin .../assets/ui/backup/uiskin.atlas | 0 {core => android}/assets/ui/backup/uiskin.png | Bin {core => android}/assets/ui/out/blank.png | Bin .../assets/ui/out/border-circle-error.png | Bin .../assets/ui/out/border-circle.png | Bin .../assets/ui/out/border-dark-blue.9.png | Bin .../assets/ui/out/border-error.9.png | Bin .../assets/ui/out/border-white.9.png | Bin {core => android}/assets/ui/out/border.9.png | Bin {core => android}/assets/ui/out/bump.9.png | Bin .../assets/ui/out/button-blue-down.9.png | Bin .../assets/ui/out/button-blue-over.9.png | Bin .../assets/ui/out/button-blue.9.png | Bin .../assets/ui/out/button-down.9.png | Bin .../assets/ui/out/button-gray-over.9.png | Bin .../assets/ui/out/button-gray.9.png | Bin .../assets/ui/out/button-map-down.9.png | Bin .../assets/ui/out/button-map-over.9.png | Bin .../assets/ui/out/button-map.9.png | Bin .../assets/ui/out/button-over.9.png | Bin .../assets/ui/out/button-red.9.png | Bin .../assets/ui/out/button-select.9.png | Bin .../assets/ui/out/button-window-bg.9.png | Bin .../assets/ui/out/button-window-over.9.png | Bin {core => android}/assets/ui/out/button.9.png | Bin {core => android}/assets/ui/out/check-off.png | Bin {core => android}/assets/ui/out/check-on.png | Bin .../assets/ui/out/check-over.png | Bin {core => android}/assets/ui/out/clear.png | Bin .../ui/out/color-picker-bar-selector.png | Bin .../assets/ui/out/color-picker-cross.png | Bin .../out/color-picker-selector-horizontal.png | Bin .../ui/out/color-picker-selector-vertical.png | Bin .../assets/ui/out/cursor-normal.png | Bin {core => android}/assets/ui/out/cursor.png | Bin .../ui/out/default-pane-no-border.9.png | Bin .../assets/ui/out/default-pane.9.png | Bin .../ui/out/default-select-selection.9.png | Bin .../assets/ui/out/default-select.9.png | Bin {core => android}/assets/ui/out/grey.png | Bin android/assets/ui/out/icon-cancel.png | Bin 0 -> 265 bytes android/assets/ui/out/icon-check.png | Bin 0 -> 252 bytes .../assets/ui/out/icon-close-down.png | Bin .../assets/ui/out/icon-close-over.png | Bin .../assets/ui/out/icon-close.png | Bin .../assets/ui/out/icon-defense.png | Bin .../assets/ui/out/icon-distribution.png | Bin .../assets/ui/out/icon-production.png | Bin android/assets/ui/out/icon-rotate.png | Bin 0 -> 256 bytes .../assets/ui/out/list-selection.png | Bin {core => android}/assets/ui/out/menu-bg.png | Bin .../assets/ui/out/padded-list-selection.9.png | Bin .../ui/out/progressbar-filled-vertical.png | Bin .../assets/ui/out/progressbar-filled.png | Bin .../assets/ui/out/progressbar-vertical.png | Bin .../assets/ui/out/progressbar.png | Bin {core => android}/assets/ui/out/radio-off.png | Bin {core => android}/assets/ui/out/radio-on.png | Bin .../assets/ui/out/scroll-horizontal.9.png | Bin .../ui/out/scroll-knob-horizontal.9.png | Bin .../assets/ui/out/scroll-knob-vertical.9.png | Bin {core => android}/assets/ui/out/scroll.9.png | Bin .../assets/ui/out/select-box-list-bg.png | Bin .../assets/ui/out/select-down.png | Bin {core => android}/assets/ui/out/select-up.png | Bin {core => android}/assets/ui/out/selection.png | Bin .../assets/ui/out/separator-menu.png | Bin {core => android}/assets/ui/out/separator.png | Bin .../assets/ui/out/slider-knob-disabled.png | Bin .../assets/ui/out/slider-knob-down.png | Bin .../assets/ui/out/slider-knob-over.png | Bin .../assets/ui/out/slider-knob.png | Bin .../assets/ui/out/slider-vertical.png | Bin {core => android}/assets/ui/out/slider.png | Bin {core => android}/assets/ui/out/slot.9.png | Bin .../assets/ui/out/splitpane-over.png | Bin .../assets/ui/out/splitpane-vertical-over.png | Bin .../assets/ui/out/splitpane-vertical.png | Bin {core => android}/assets/ui/out/splitpane.png | Bin {core => android}/assets/ui/out/sub-menu.png | Bin .../assets/ui/out/textfield-over.9.png | Bin .../assets/ui/out/textfield.9.png | Bin .../assets/ui/out/tooltip-bg.9.png | Bin .../assets/ui/out/touchpad-knob.png | Bin .../assets/ui/out/tree-minus.png | Bin {core => android}/assets/ui/out/tree-over.png | Bin {core => android}/assets/ui/out/tree-plus.png | Bin .../assets/ui/out/tree-selection.9.png | Bin {core => android}/assets/ui/out/white.png | Bin {core => android}/assets/ui/out/window-bg.png | Bin .../assets/ui/out/window-border-bg.9.png | Bin .../assets/ui/out/window-gray.9.png | Bin .../assets/ui/out/window-noborder.9.png | Bin .../assets/ui/out/window-resizable.9.png | Bin {core => android}/assets/ui/out/window.9.png | Bin {core => android}/assets/ui/prose.fnt | 0 {core => android}/assets/ui/prose.png | Bin {core => android}/assets/ui/uiskin.atlas | 35 ++++- {core => android}/assets/ui/uiskin.json | 0 android/assets/ui/uiskin.png | Bin 0 -> 12205 bytes android/build.gradle | 135 ++++++++++++++++++ android/ic_launcher-web.png | Bin 0 -> 22030 bytes android/proguard-project.txt | 45 ++++++ android/project.properties | 14 ++ android/res/drawable-hdpi/ic_launcher.png | Bin 0 -> 3430 bytes android/res/drawable-mdpi/ic_launcher.png | Bin 0 -> 1931 bytes android/res/drawable-xhdpi/ic_launcher.png | Bin 0 -> 4373 bytes android/res/drawable-xxhdpi/ic_launcher.png | Bin 0 -> 8265 bytes android/res/drawable-xxxhdpi/ic_launcher.png | Bin 0 -> 19448 bytes android/res/values/strings.xml | 6 + android/res/values/styles.xml | 12 ++ .../io/anuke/mindustry/AndroidLauncher.java | 16 +++ build.gradle | 21 ++- core/assets/ui/uiskin.png | Bin 11990 -> 0 bytes core/src/io/anuke/mindustry/Control.java | 50 ++++++- core/src/io/anuke/mindustry/GameState.java | 7 +- core/src/io/anuke/mindustry/Renderer.java | 36 ++++- core/src/io/anuke/mindustry/UI.java | 63 ++++++-- core/src/io/anuke/mindustry/Vars.java | 24 +++- core/src/io/anuke/mindustry/World.java | 2 +- .../io/anuke/mindustry/entities/Player.java | 1 + .../anuke/mindustry/input/AndroidInput.java | 121 ++++++++++++++++ .../anuke/mindustry/input/GestureHandler.java | 99 +++++++++++++ .../io/anuke/mindustry/{ => input}/Input.java | 4 +- .../io/anuke/mindustry/ui/TutorialDialog.java | 2 +- .../io/anuke/mindustry/ui/UpgradeDialog.java | 7 +- core/src/io/anuke/mindustry/world/Block.java | 6 +- .../anuke/ucore/function/ActionProvider.java | 7 + .../anuke/ucore/function/ButtonTweaker.java | 7 + .../src/io/anuke/ucore/function/Callable.java | 5 + .../anuke/ucore/function/CheckListenable.java | 5 + .../anuke/ucore/function/ColorListenable.java | 7 + .../src/io/anuke/ucore/function/Consumer.java | 5 + .../anuke/ucore/function/EffectRenderer.java | 7 + .../anuke/ucore/function/FieldListenable.java | 5 + .../anuke/ucore/function/KeyListenable.java | 5 + .../io/anuke/ucore/function/Listenable.java | 6 + .../ucore/function/PositionConsumer.java | 5 + .../io/anuke/ucore/function/Predicate.java | 5 + .../anuke/ucore/function/StringProcessor.java | 5 + .../anuke/ucore/function/StringSupplier.java | 5 + .../io/anuke/ucore/function/TileCollider.java | 6 + .../ucore/function/TileHitboxProvider.java | 7 + .../ucore/function/TypingListenable.java | 5 + .../ucore/function/VisibilityProvider.java | 5 + gradle.properties | 2 +- gradle/wrapper/gradle-wrapper.properties | 4 +- settings.gradle | 2 +- ui/blank.png | Bin 0 -> 85 bytes ui/border-circle-error.png | Bin 0 -> 995 bytes ui/border-circle.png | Bin 0 -> 1189 bytes ui/border-dark-blue.9.png | Bin 0 -> 86 bytes ui/border-error.9.png | Bin 0 -> 87 bytes ui/border-white.9.png | Bin 0 -> 176 bytes ui/border.9.png | Bin 0 -> 178 bytes ui/bump.9.png | Bin 0 -> 381 bytes ui/button-blue-down.9.png | Bin 0 -> 124 bytes ui/button-blue-over.9.png | Bin 0 -> 125 bytes ui/button-blue.9.png | Bin 0 -> 127 bytes ui/button-down.9.png | Bin 0 -> 212 bytes ui/button-gray-over.9.png | Bin 0 -> 200 bytes ui/button-gray.9.png | Bin 0 -> 222 bytes ui/button-map-down.9.png | Bin 0 -> 213 bytes ui/button-map-over.9.png | Bin 0 -> 212 bytes ui/button-map.9.png | Bin 0 -> 205 bytes ui/button-over.9.png | Bin 0 -> 212 bytes ui/button-red.9.png | Bin 0 -> 126 bytes ui/button-select.9.png | Bin 0 -> 175 bytes ui/button-window-bg.9.png | Bin 0 -> 200 bytes ui/button-window-over.9.png | Bin 0 -> 199 bytes ui/button.9.png | Bin 0 -> 206 bytes ui/check-off.png | Bin 0 -> 194 bytes ui/check-on.png | Bin 0 -> 210 bytes ui/check-over.png | Bin 0 -> 197 bytes ui/clear.png | Bin 0 -> 149 bytes ui/color-picker-bar-selector.png | Bin 0 -> 309 bytes ui/color-picker-cross.png | Bin 0 -> 104 bytes ui/color-picker-selector-horizontal.png | Bin 0 -> 74 bytes ui/color-picker-selector-vertical.png | Bin 0 -> 76 bytes ui/cursor-normal.png | Bin 0 -> 103 bytes ui/cursor.png | Bin 0 -> 143 bytes ui/default-pane-no-border.9.png | Bin 0 -> 78 bytes ui/default-pane.9.png | Bin 0 -> 88 bytes ui/default-select-selection.9.png | Bin 0 -> 86 bytes ui/default-select.9.png | Bin 0 -> 303 bytes ui/grey.png | Bin 0 -> 70 bytes ui/icon-cancel.png | Bin 0 -> 265 bytes ui/icon-check.png | Bin 0 -> 258 bytes ui/icon-close-down.png | Bin 0 -> 321 bytes ui/icon-close-over.png | Bin 0 -> 316 bytes ui/icon-close.png | Bin 0 -> 319 bytes ui/icon-defense.png | Bin 0 -> 200 bytes ui/icon-distribution.png | Bin 0 -> 161 bytes ui/icon-production.png | Bin 0 -> 164 bytes ui/icon-rotate.png | Bin 0 -> 237 bytes ui/list-selection.png | Bin 0 -> 70 bytes ui/menu-bg.png | Bin 0 -> 70 bytes ui/padded-list-selection.9.png | Bin 0 -> 82 bytes ui/progressbar-filled-vertical.png | Bin 0 -> 72 bytes ui/progressbar-filled.png | Bin 0 -> 73 bytes ui/progressbar-vertical.png | Bin 0 -> 72 bytes ui/progressbar.png | Bin 0 -> 73 bytes ui/radio-off.png | Bin 0 -> 591 bytes ui/radio-on.png | Bin 0 -> 743 bytes ui/scroll-horizontal.9.png | Bin 0 -> 98 bytes ui/scroll-knob-horizontal.9.png | Bin 0 -> 122 bytes ui/scroll-knob-vertical.9.png | Bin 0 -> 102 bytes ui/scroll.9.png | Bin 0 -> 95 bytes ui/select-box-list-bg.png | Bin 0 -> 70 bytes ui/select-down.png | Bin 0 -> 254 bytes ui/select-up.png | Bin 0 -> 262 bytes ui/selection.png | Bin 0 -> 128 bytes ui/separator-menu.png | Bin 0 -> 70 bytes ui/separator.png | Bin 0 -> 70 bytes ui/slider-knob-disabled.png | Bin 0 -> 102 bytes ui/slider-knob-down.png | Bin 0 -> 173 bytes ui/slider-knob-over.png | Bin 0 -> 173 bytes ui/slider-knob.png | Bin 0 -> 175 bytes ui/slider-vertical.png | Bin 0 -> 131 bytes ui/slider.png | Bin 0 -> 117 bytes ui/slot.9.png | Bin 0 -> 366 bytes ui/splitpane-over.png | Bin 0 -> 72 bytes ui/splitpane-vertical-over.png | Bin 0 -> 73 bytes ui/splitpane-vertical.png | Bin 0 -> 73 bytes ui/splitpane.png | Bin 0 -> 72 bytes ui/sub-menu.png | Bin 0 -> 247 bytes ui/textfield-over.9.png | Bin 0 -> 116 bytes ui/textfield.9.png | Bin 0 -> 185 bytes ui/tooltip-bg.9.png | Bin 0 -> 90 bytes ui/touchpad-knob.png | Bin 0 -> 1127 bytes ui/tree-minus.png | Bin 0 -> 133 bytes ui/tree-over.png | Bin 0 -> 70 bytes ui/tree-plus.png | Bin 0 -> 359 bytes ui/tree-selection.9.png | Bin 0 -> 86 bytes ui/white.png | Bin 0 -> 71 bytes ui/window-bg.png | Bin 0 -> 70 bytes ui/window-border-bg.9.png | Bin 0 -> 90 bytes ui/window-gray.9.png | Bin 0 -> 280 bytes ui/window-noborder.9.png | Bin 0 -> 127 bytes ui/window-resizable.9.png | Bin 0 -> 187 bytes ui/window.9.png | Bin 0 -> 243 bytes 273 files changed, 792 insertions(+), 50 deletions(-) create mode 100644 android/AndroidManifest.xml rename {core => android}/assets/maps/canyon.png (100%) rename {core => android}/assets/maps/delta.png (100%) rename {core => android}/assets/maps/map.png (100%) rename {core => android}/assets/maps/maze.png (100%) rename {core => android}/assets/maps/pit.png (100%) rename {core => android}/assets/maps/test.png (100%) rename {core => android}/assets/music/1.mp3 (100%) rename {core => android}/assets/music/2.mp3 (100%) rename {core => android}/assets/music/3.mp3 (100%) rename {core => android}/assets/music/place.wav (100%) rename {core => android}/assets/music/shoot.wav (100%) rename {core => android}/assets/sounds/bloop.wav (100%) rename {core => android}/assets/sounds/break.wav (100%) rename {core => android}/assets/sounds/corexplode.wav (100%) rename {core => android}/assets/sounds/die.wav (100%) rename {core => android}/assets/sounds/enemyshoot.wav (100%) rename {core => android}/assets/sounds/explosion.wav (100%) rename {core => android}/assets/sounds/flame.wav (100%) rename {core => android}/assets/sounds/flame2.wav (100%) rename {core => android}/assets/sounds/missile.wav (100%) rename {core => android}/assets/sounds/place.wav (100%) rename {core => android}/assets/sounds/purchase.wav (100%) rename {core => android}/assets/sounds/resonate.wav (100%) rename {core => android}/assets/sounds/respawn.wav (100%) rename {core => android}/assets/sounds/shoot.wav (100%) rename {core => android}/assets/sounds/spawn.wav (100%) rename {core => android}/assets/sprites/back.png (100%) rename {core => android}/assets/sprites/conveyor.png (100%) rename {core => android}/assets/sprites/conveyort.png (100%) rename {core => android}/assets/sprites/mindustry.atlas (100%) rename {core => android}/assets/sprites/mindustry.png (100%) rename {core => android}/assets/ui/backup/uiskin.atlas (100%) rename {core => android}/assets/ui/backup/uiskin.png (100%) rename {core => android}/assets/ui/out/blank.png (100%) rename {core => android}/assets/ui/out/border-circle-error.png (100%) rename {core => android}/assets/ui/out/border-circle.png (100%) rename {core => android}/assets/ui/out/border-dark-blue.9.png (100%) rename {core => android}/assets/ui/out/border-error.9.png (100%) rename {core => android}/assets/ui/out/border-white.9.png (100%) rename {core => android}/assets/ui/out/border.9.png (100%) rename {core => android}/assets/ui/out/bump.9.png (100%) rename {core => android}/assets/ui/out/button-blue-down.9.png (100%) rename {core => android}/assets/ui/out/button-blue-over.9.png (100%) rename {core => android}/assets/ui/out/button-blue.9.png (100%) rename {core => android}/assets/ui/out/button-down.9.png (100%) rename {core => android}/assets/ui/out/button-gray-over.9.png (100%) rename {core => android}/assets/ui/out/button-gray.9.png (100%) rename {core => android}/assets/ui/out/button-map-down.9.png (100%) rename {core => android}/assets/ui/out/button-map-over.9.png (100%) rename {core => android}/assets/ui/out/button-map.9.png (100%) rename {core => android}/assets/ui/out/button-over.9.png (100%) rename {core => android}/assets/ui/out/button-red.9.png (100%) rename {core => android}/assets/ui/out/button-select.9.png (100%) rename {core => android}/assets/ui/out/button-window-bg.9.png (100%) rename {core => android}/assets/ui/out/button-window-over.9.png (100%) rename {core => android}/assets/ui/out/button.9.png (100%) rename {core => android}/assets/ui/out/check-off.png (100%) rename {core => android}/assets/ui/out/check-on.png (100%) rename {core => android}/assets/ui/out/check-over.png (100%) rename {core => android}/assets/ui/out/clear.png (100%) rename {core => android}/assets/ui/out/color-picker-bar-selector.png (100%) rename {core => android}/assets/ui/out/color-picker-cross.png (100%) rename {core => android}/assets/ui/out/color-picker-selector-horizontal.png (100%) rename {core => android}/assets/ui/out/color-picker-selector-vertical.png (100%) rename {core => android}/assets/ui/out/cursor-normal.png (100%) rename {core => android}/assets/ui/out/cursor.png (100%) rename {core => android}/assets/ui/out/default-pane-no-border.9.png (100%) rename {core => android}/assets/ui/out/default-pane.9.png (100%) rename {core => android}/assets/ui/out/default-select-selection.9.png (100%) rename {core => android}/assets/ui/out/default-select.9.png (100%) rename {core => android}/assets/ui/out/grey.png (100%) create mode 100644 android/assets/ui/out/icon-cancel.png create mode 100644 android/assets/ui/out/icon-check.png rename {core => android}/assets/ui/out/icon-close-down.png (100%) rename {core => android}/assets/ui/out/icon-close-over.png (100%) rename {core => android}/assets/ui/out/icon-close.png (100%) rename {core => android}/assets/ui/out/icon-defense.png (100%) rename {core => android}/assets/ui/out/icon-distribution.png (100%) rename {core => android}/assets/ui/out/icon-production.png (100%) create mode 100644 android/assets/ui/out/icon-rotate.png rename {core => android}/assets/ui/out/list-selection.png (100%) rename {core => android}/assets/ui/out/menu-bg.png (100%) rename {core => android}/assets/ui/out/padded-list-selection.9.png (100%) rename {core => android}/assets/ui/out/progressbar-filled-vertical.png (100%) rename {core => android}/assets/ui/out/progressbar-filled.png (100%) rename {core => android}/assets/ui/out/progressbar-vertical.png (100%) rename {core => android}/assets/ui/out/progressbar.png (100%) rename {core => android}/assets/ui/out/radio-off.png (100%) rename {core => android}/assets/ui/out/radio-on.png (100%) rename {core => android}/assets/ui/out/scroll-horizontal.9.png (100%) rename {core => android}/assets/ui/out/scroll-knob-horizontal.9.png (100%) rename {core => android}/assets/ui/out/scroll-knob-vertical.9.png (100%) rename {core => android}/assets/ui/out/scroll.9.png (100%) rename {core => android}/assets/ui/out/select-box-list-bg.png (100%) rename {core => android}/assets/ui/out/select-down.png (100%) rename {core => android}/assets/ui/out/select-up.png (100%) rename {core => android}/assets/ui/out/selection.png (100%) rename {core => android}/assets/ui/out/separator-menu.png (100%) rename {core => android}/assets/ui/out/separator.png (100%) rename {core => android}/assets/ui/out/slider-knob-disabled.png (100%) rename {core => android}/assets/ui/out/slider-knob-down.png (100%) rename {core => android}/assets/ui/out/slider-knob-over.png (100%) rename {core => android}/assets/ui/out/slider-knob.png (100%) rename {core => android}/assets/ui/out/slider-vertical.png (100%) rename {core => android}/assets/ui/out/slider.png (100%) rename {core => android}/assets/ui/out/slot.9.png (100%) rename {core => android}/assets/ui/out/splitpane-over.png (100%) rename {core => android}/assets/ui/out/splitpane-vertical-over.png (100%) rename {core => android}/assets/ui/out/splitpane-vertical.png (100%) rename {core => android}/assets/ui/out/splitpane.png (100%) rename {core => android}/assets/ui/out/sub-menu.png (100%) rename {core => android}/assets/ui/out/textfield-over.9.png (100%) rename {core => android}/assets/ui/out/textfield.9.png (100%) rename {core => android}/assets/ui/out/tooltip-bg.9.png (100%) rename {core => android}/assets/ui/out/touchpad-knob.png (100%) rename {core => android}/assets/ui/out/tree-minus.png (100%) rename {core => android}/assets/ui/out/tree-over.png (100%) rename {core => android}/assets/ui/out/tree-plus.png (100%) rename {core => android}/assets/ui/out/tree-selection.9.png (100%) rename {core => android}/assets/ui/out/white.png (100%) rename {core => android}/assets/ui/out/window-bg.png (100%) rename {core => android}/assets/ui/out/window-border-bg.9.png (100%) rename {core => android}/assets/ui/out/window-gray.9.png (100%) rename {core => android}/assets/ui/out/window-noborder.9.png (100%) rename {core => android}/assets/ui/out/window-resizable.9.png (100%) rename {core => android}/assets/ui/out/window.9.png (100%) rename {core => android}/assets/ui/prose.fnt (100%) rename {core => android}/assets/ui/prose.png (100%) rename {core => android}/assets/ui/uiskin.atlas (96%) rename {core => android}/assets/ui/uiskin.json (100%) create mode 100644 android/assets/ui/uiskin.png create mode 100644 android/build.gradle create mode 100644 android/ic_launcher-web.png create mode 100644 android/proguard-project.txt create mode 100644 android/project.properties create mode 100644 android/res/drawable-hdpi/ic_launcher.png create mode 100644 android/res/drawable-mdpi/ic_launcher.png create mode 100644 android/res/drawable-xhdpi/ic_launcher.png create mode 100644 android/res/drawable-xxhdpi/ic_launcher.png create mode 100644 android/res/drawable-xxxhdpi/ic_launcher.png create mode 100644 android/res/values/strings.xml create mode 100644 android/res/values/styles.xml create mode 100644 android/src/io/anuke/mindustry/AndroidLauncher.java delete mode 100644 core/assets/ui/uiskin.png create mode 100644 core/src/io/anuke/mindustry/input/AndroidInput.java create mode 100644 core/src/io/anuke/mindustry/input/GestureHandler.java rename core/src/io/anuke/mindustry/{ => input}/Input.java (96%) create mode 100644 core/src/io/anuke/ucore/function/ActionProvider.java create mode 100644 core/src/io/anuke/ucore/function/ButtonTweaker.java create mode 100644 core/src/io/anuke/ucore/function/Callable.java create mode 100644 core/src/io/anuke/ucore/function/CheckListenable.java create mode 100644 core/src/io/anuke/ucore/function/ColorListenable.java create mode 100644 core/src/io/anuke/ucore/function/Consumer.java create mode 100644 core/src/io/anuke/ucore/function/EffectRenderer.java create mode 100644 core/src/io/anuke/ucore/function/FieldListenable.java create mode 100644 core/src/io/anuke/ucore/function/KeyListenable.java create mode 100644 core/src/io/anuke/ucore/function/Listenable.java create mode 100644 core/src/io/anuke/ucore/function/PositionConsumer.java create mode 100644 core/src/io/anuke/ucore/function/Predicate.java create mode 100644 core/src/io/anuke/ucore/function/StringProcessor.java create mode 100644 core/src/io/anuke/ucore/function/StringSupplier.java create mode 100644 core/src/io/anuke/ucore/function/TileCollider.java create mode 100644 core/src/io/anuke/ucore/function/TileHitboxProvider.java create mode 100644 core/src/io/anuke/ucore/function/TypingListenable.java create mode 100644 core/src/io/anuke/ucore/function/VisibilityProvider.java create mode 100644 ui/blank.png create mode 100644 ui/border-circle-error.png create mode 100644 ui/border-circle.png create mode 100644 ui/border-dark-blue.9.png create mode 100644 ui/border-error.9.png create mode 100644 ui/border-white.9.png create mode 100644 ui/border.9.png create mode 100644 ui/bump.9.png create mode 100644 ui/button-blue-down.9.png create mode 100644 ui/button-blue-over.9.png create mode 100644 ui/button-blue.9.png create mode 100644 ui/button-down.9.png create mode 100644 ui/button-gray-over.9.png create mode 100644 ui/button-gray.9.png create mode 100644 ui/button-map-down.9.png create mode 100644 ui/button-map-over.9.png create mode 100644 ui/button-map.9.png create mode 100644 ui/button-over.9.png create mode 100644 ui/button-red.9.png create mode 100644 ui/button-select.9.png create mode 100644 ui/button-window-bg.9.png create mode 100644 ui/button-window-over.9.png create mode 100644 ui/button.9.png create mode 100644 ui/check-off.png create mode 100644 ui/check-on.png create mode 100644 ui/check-over.png create mode 100644 ui/clear.png create mode 100644 ui/color-picker-bar-selector.png create mode 100644 ui/color-picker-cross.png create mode 100644 ui/color-picker-selector-horizontal.png create mode 100644 ui/color-picker-selector-vertical.png create mode 100644 ui/cursor-normal.png create mode 100644 ui/cursor.png create mode 100644 ui/default-pane-no-border.9.png create mode 100644 ui/default-pane.9.png create mode 100644 ui/default-select-selection.9.png create mode 100644 ui/default-select.9.png create mode 100644 ui/grey.png create mode 100644 ui/icon-cancel.png create mode 100644 ui/icon-check.png create mode 100644 ui/icon-close-down.png create mode 100644 ui/icon-close-over.png create mode 100644 ui/icon-close.png create mode 100644 ui/icon-defense.png create mode 100644 ui/icon-distribution.png create mode 100644 ui/icon-production.png create mode 100644 ui/icon-rotate.png create mode 100644 ui/list-selection.png create mode 100644 ui/menu-bg.png create mode 100644 ui/padded-list-selection.9.png create mode 100644 ui/progressbar-filled-vertical.png create mode 100644 ui/progressbar-filled.png create mode 100644 ui/progressbar-vertical.png create mode 100644 ui/progressbar.png create mode 100644 ui/radio-off.png create mode 100644 ui/radio-on.png create mode 100644 ui/scroll-horizontal.9.png create mode 100644 ui/scroll-knob-horizontal.9.png create mode 100644 ui/scroll-knob-vertical.9.png create mode 100644 ui/scroll.9.png create mode 100644 ui/select-box-list-bg.png create mode 100644 ui/select-down.png create mode 100644 ui/select-up.png create mode 100644 ui/selection.png create mode 100644 ui/separator-menu.png create mode 100644 ui/separator.png create mode 100644 ui/slider-knob-disabled.png create mode 100644 ui/slider-knob-down.png create mode 100644 ui/slider-knob-over.png create mode 100644 ui/slider-knob.png create mode 100644 ui/slider-vertical.png create mode 100644 ui/slider.png create mode 100644 ui/slot.9.png create mode 100644 ui/splitpane-over.png create mode 100644 ui/splitpane-vertical-over.png create mode 100644 ui/splitpane-vertical.png create mode 100644 ui/splitpane.png create mode 100644 ui/sub-menu.png create mode 100644 ui/textfield-over.9.png create mode 100644 ui/textfield.9.png create mode 100644 ui/tooltip-bg.9.png create mode 100644 ui/touchpad-knob.png create mode 100644 ui/tree-minus.png create mode 100644 ui/tree-over.png create mode 100644 ui/tree-plus.png create mode 100644 ui/tree-selection.9.png create mode 100644 ui/white.png create mode 100644 ui/window-bg.png create mode 100644 ui/window-border-bg.9.png create mode 100644 ui/window-gray.9.png create mode 100644 ui/window-noborder.9.png create mode 100644 ui/window-resizable.9.png create mode 100644 ui/window.9.png 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 0000000000000000000000000000000000000000..bf4c7ed9a0e88083f34a1b1be3ff61685bd3dd78 GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa&H|6fVg?3oVGw3ym^DWND9B#o z>Fdh=kWH3JoxS?j>$5$biRXKC^R3l0-z~{Ar@Q1hhk*wu_!J z=+Nx?xxjPom5BoCkwxcrSwBsg7p27acxHO}{WlD|FZc3%zOral=B&B}FWY;%pMB&N z=xJyAwJT0Tuuu6{=!)qXj)t!lXGtb&UfLULvrzq2luh?>jYL zD7~ss__WdzwP{_cT1gAH+OQOt+>S1jW;n1Fdh=kWH3JN@s6hlrd0fwx^3@h{pN36E5-|GT?EU&+HtMB(aOhURS$BF>J*t|8R}N z3d=N}sW!VC?` zt=He~T2}B}@zJ6qM>5O|nFS|4a=oi`*FICVd)BW4hWGB$E}9Fc%vrT^%Y_w%pO!qk xFdh=kWH3JM&VJ?#(6-Y`JOJ0AsXlBPP)r`$bhHiJ(qJxl4RHm@55ZN9imzliLGT4 zM?~I!baMLqc)=&nX)-6%=leZ0`ubr`p6tAL6TdPPSlk!f=wqwWn$<4&*1*X!k&Qu0 zWzRZsi4|2BSG*|txQNl&`JGVOAKfM2b6O6X$kgpId;Mm^xpngr{vG@1{>I3eOE~`Y zD%ID)sY+f)b@CLFSJ%x}$vfn5aO&A_@zW}pqrcSJC%OD<06LYy)78&qol`;+03GRH A$^ZZW literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..35af9648711c3d56251812b281e3a8b73341e81d GIT binary patch literal 12205 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 MeB7wm0Dt5E0siO8Q2+n{ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ebd65987eeb1ddb1243f7eadb3e7c9eee78efb2f GIT binary patch literal 22030 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 Ci#Cw} literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b6b1472561d949d26a75d0a002fd9fbb44731ada GIT binary patch literal 3430 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 IM6N<$fgwL6bcmATF^G(hhy>q%onR- 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 c6~I%GGY_qpw@*<2*a7U{Ypj>Q$3E literal 0 HcmV?d00001 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 dd65603f7f1a6b6b8acdd79aa8b3ef5829617980..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11990 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 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 0000000000000000000000000000000000000000..b2f9501f470dd0bd5d2a6003e55a3e866b73554a GIT binary patch literal 85 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqGM+AuAr-fhfBgS%&un+bVGGmt iJE9sD3L+EUax;{DUaI)y;8Gu;ItEWyKbLh*2~7ZN2pIkV literal 0 HcmV?d00001 diff --git a/ui/border-circle-error.png b/ui/border-circle-error.png new file mode 100644 index 0000000000000000000000000000000000000000..6aaeb4ecba65f1537aae85998ec625fbaab82822 GIT binary patch literal 995 zcmV<9104K`P)gQenL+?fXj?0are zF!74c1~C;`aRG|Shbl~dgTgm-CS)&6dKP~JG*KAtR4x~H1~+<^ePtP`FsMvj#8Cb$ zvQh`N6$=P^0^`pvh8Kygy`eh9Qn(j)3RV`0-kss?M$C#;>ZI4yBhbGsz{+%*;T?eS zxxk=i=>ixZnI%AtM)iF#0n7Y*I_UCXVkx_K%JkMKyjEA2wt1mn$DP5Au+WL(ej+a=W*snKX+Jcq!aCC2rB5w2@a36W zxMZ-S0(#JuENIX?t)wxiznT}~Lj+8Z=x{~7z0cButIb_Pr}h$mJW&{uw{`2f1?u`? zaL4p>)LyjG7VBmMgWmGm(|p#R&=hsx89=kN1`H@H)v7N| z)*{cAMYQYaJ>o`ZS#Z;9z?jSfJDOK?mV7qOm3rXAvv|EE|NI z&1NPx%HeVmQEr-p%L;>No+wTF0_ZS1`aH*wdq`??dCe7U26YJ3^pB2?(l4v1%`rK3 RPP+gA002ovPDHLkV1kM++?xOZ literal 0 HcmV?d00001 diff --git a/ui/border-circle.png b/ui/border-circle.png new file mode 100644 index 0000000000000000000000000000000000000000..1d9c9bb057a66a18f579c8b26812030cda11100b GIT binary patch literal 1189 zcmV;W1X}xvP)2)`!3aeVd%DMlQ5FffcxFzC63e#ZMB+VmK8>&RIEND zl*%mZ??O?Kd@&sLpYj6Su$Ay&sRcQRoA3OL-+4In`L9-=h83nuivJ>%N(mcUTo-jN zeP+$*l>O;N=B+v|Q3?6uzIZJ_XLCRiWQ5HUmJuc+b3LhJdx3eIXE>!a@3Zr(%F<}0 zlS@9^ChQb$g{O?+u#vE*(EnP59l6|>u^a~1WDdG*gXudmp1HLt8u~UG)%G+al@Ug} z^SReW*fE4YpHvE;UL2g8o;y5$SDd;#EgqMp+pm^GKil-*T|(tkINlzJ#Dp zc=%Oo&c!B56QD3>R}Q+WGYUhVs>&PItltP;eo-K*hUOL$n$UwT!d^oD0w&1Kjw^ix zZsl^#v{n%$^OIUkkBN3xj@B)fs{2aEhrEsd1c9%2dUD~)3PoMAqBg~)1Z5LgLy7Wn zs{{KG_4!rQQ474{QiBS=wZNq&<#WgBfq_lr9HCPkHiYzM5j1R`uA~80^-*0axEVux zzw5b~HF*Vjd=@Z3eU}y}@E-{~brs#9{Gd3$m5t|}Js%qw zIDM8QmL*q+AKQ0Gg|QZjJvN|2IQusX{E_C>`GaG@puCxB+hU4Byk{7@J2s(I$Elz= zH%i}VENqAycv!%%7wrkH#kLq#>T2Vod`2^l1wDnbnFIPxsSz(|d%C@uH()#P)YvSG z1`KF@Q1zt}XSQk#BA5}~=q$_2@rpue#(J#K3#A6UI@0>}#qn$Fc>{K%oE>;3ITjRA zi(){ZR-yr{RvP(S&Q2lM2vVQrW-LaGN^DM_M2!YiMiybx@+fBqp2?C@4J5W0hBtGo zJY#a(+^sSiO97(F6xPXL9V16kqX`{2+m3Q};Hhye*gYmPfwdypF;U<1q~1LyF3^lr zrm(ir=R*I literal 0 HcmV?d00001 diff --git a/ui/border-dark-blue.9.png b/ui/border-dark-blue.9.png new file mode 100644 index 0000000000000000000000000000000000000000..59a74432826d2786413cf21f4416e8c4bfda1377 GIT binary patch literal 86 zcmeAS@N?(olHy`uVBq!ia0vp^tRT$61|)m))t&+=Sx*WBMb}@qQd@uyTS~B3K=|I{an^LB{Ts5M!6Q$ literal 0 HcmV?d00001 diff --git a/ui/border-error.9.png b/ui/border-error.9.png new file mode 100644 index 0000000000000000000000000000000000000000..996a6639274f0f0e000a1d59d7db01beee4d74a5 GIT binary patch literal 87 zcmeAS@N?(olHy`uVBq!ia0vp^tRT$61|)m))t&+=IZqeIkcwN$2@Vbac}_gwV?JLm k(YCswa02VbRYw>YwyFu5hc3SP2dI+4)78&qol`;+0DFZP^Z)<= literal 0 HcmV?d00001 diff --git a/ui/border-white.9.png b/ui/border-white.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e5d219eef9d5ef0331e1e6b43dba61639ec10bf5 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xawj^(N7ltZ^H4LwA&3RJ{6yYrJ zhy>Ey!XV7ZFl&wkP>{XE)7O>#A+r=CJ8$GK{f9syTTd6q5RLO!CmQlGC~zEEckF-t z&pE2*8qJ+|6%sQXC8tX+ZOwhn)UZ(PJ%2ifVnX*sshVdVUu}NAcJIp-bK1@?QI);0 Q3}_I8r>mdKI;Vst0E+H2T>t<8 literal 0 HcmV?d00001 diff --git a/ui/border.9.png b/ui/border.9.png new file mode 100644 index 0000000000000000000000000000000000000000..6e0dea69e00b53c865aa93a804d7a2b2f10ea1b2 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xawj^(N7l!`~HyG>+@339~if|Tq zL>4nJa0`PlBg3pY5H=O_J_XB~)z4*}Q$iB}@F_HE literal 0 HcmV?d00001 diff --git a/ui/bump.9.png b/ui/bump.9.png new file mode 100644 index 0000000000000000000000000000000000000000..12a1b3d66b3600f3df76e85483eef574592aa57e GIT binary patch literal 381 zcmeAS@N?(olHy`uVBq!ia0vp^ULefD1|(%J94Z7-Y)RhkE)4M?c;Dn$FHnTDz$3Dl zfq`2Xgc%uT&5-~KvX^-Jy0SlH5o9tqJ$cjR2vA6}#5JPCIX^cyHLrxhxhOTUBsE2$ zJhLQ2!QIn0AiR-J9H{82r;B4q#jUq@Hu5$(NHknLyn$)UnUoZ%wTV)^%?3xe8nKAA zxwITQ#MJjav_*zh|9@;{4uqHTJU-DdpTx%TwU&*?vJwVz!& zL-yWT3%R7MW&iiswjE`do3rXZ6YHz}PqW#-?|h&Be$^^3sf8L`!l|ztZ|Pm>IOx*I z#L6Y20U-kxumITs3miDXWFwO*kPVWW0w&RwP15C$7r(hjzp!(&tKqRFf_JJDfTn(t p+`6Ls>O#HKuOB4{sl44K{+UaO#r5bFBcO*FJYD@<);T3K0RV_9i7WsB literal 0 HcmV?d00001 diff --git a/ui/button-blue-down.9.png b/ui/button-blue-down.9.png new file mode 100644 index 0000000000000000000000000000000000000000..bd14b141796534eca257fae98870fc91c1646782 GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^Qb4T5!3HGP8h9rIDQ8a?$B>F!Z*OcAWH8`x3Oru6 zo~NVMiYs`+dD*YoQ?>MWWi9Iuo6W(=p&=tA009@K3$UvMsD1gR{k@&1`i6v0Rr2Qd T-L5V`;}|?${an^LB{Ts5uTvyK literal 0 HcmV?d00001 diff --git a/ui/button-blue-over.9.png b/ui/button-blue-over.9.png new file mode 100644 index 0000000000000000000000000000000000000000..071dc99259a40439e1fc6366a5f917dce5a31d1e GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^Qb4T5!3HGP8h9rIDHl%{$B>F!Z*MFVWH8`yy7(r4 zQ_Oe8eS8zSe(iL&pB?bjHT>+Ci&?^ojEt?$Oi=Jk=urd9sg}6F!Z*OemWl-Q@K6vJ= zkIyloWy_0IG|og9)#g6Z(zkk*dS>bD-WC=X5k5{12zcS$!7QX9T=i$Fc^gmljT?TA W`xbZ@uigzbk-^i|&t;ucLK6Ua+9uWj literal 0 HcmV?d00001 diff --git a/ui/button-down.9.png b/ui/button-down.9.png new file mode 100644 index 0000000000000000000000000000000000000000..dd54656563f1d48a06bed6171db20c34e02391ba GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^Qb4T5!3HGP8h9rIDb50q$YKTtZeb8+WSBKa0w~B{ z;_2(k{*XnEh1;zDEJG?#sMyoRF(l$}a*6`)ANR+`LaQfEY;0_N`2W<5|2!rvJrBJl zW=gzZX`An=bA#o*O{MR|g<3|7loejQkaCx(JhALGlWW_)8BeUF+!u@WMww(?T;U35 ze96CVxM=&^4O>sUHRmP#cAxUC-R*Hk1p`CeP9gDY_6j?J)-!mz`njxgN@xNA%GgNx literal 0 HcmV?d00001 diff --git a/ui/button-gray-over.9.png b/ui/button-gray-over.9.png new file mode 100644 index 0000000000000000000000000000000000000000..31a904acbace5062b1d800cde235d491ac057143 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^Qb4T5!3HGP8h9rIDYhhUcNd2LAh=-f^2tCE&H|6f zVg?3oVGw3ym^DWND9B#o>Fdh=kVTM*moK)ucqULN)YHW=B;xSf>xO&{20YGzv$>z^ zSZFdh=kVTM*Ph&~+(&a#*Y)==*kch)?uOH+*V8Fq8A^#*p z-YcEFS8U(psy4LTm{yn1d8A#wD4<|{k(Kw?g$xZdRn4aDKHa$NRnw;2MTMo3g5JKN zUpKzssAchTbMFvPbZX%c{H3bW^X}?}74OV@^6ve+t+wjl!kD+kOtbX3+cKs){sLOd N;OXk;vd$@?2>=VvO^pBm literal 0 HcmV?d00001 diff --git a/ui/button-map-down.9.png b/ui/button-map-down.9.png new file mode 100644 index 0000000000000000000000000000000000000000..b34035f63c775fcc47c0e3d1c1fca44934266788 GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^Qb4T5!3HGP8h9rIDb50q$YKTtZeb8+WSBKa0w~B{ z;_2(k{*YBz+?w%ZO#NM;P>H9DV@Sl|g;r0T*x1}Snx#IIK9oM#V(|#ICxi1#$jWWr)xWX0A z_>zC!aMAX+X}kYP@a}TFX1{2Qy@{0jVP*z~DZxVQBFe5ZK>HayUHx3vIVCg!07Q^R AnE(I) literal 0 HcmV?d00001 diff --git a/ui/button-map-over.9.png b/ui/button-map-over.9.png new file mode 100644 index 0000000000000000000000000000000000000000..02b2542e97511d9db1b057639f13614a32cfbf39 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^Qb4T5!3HGP8h9rIDb50q$YKTtZeb8+WSBKa0w~B{ z;_2(k{*YBz+{*HY>o+E#P_d_rV@Sl|g;r0T*x1lr*<{an^LB{Ts5yvImI literal 0 HcmV?d00001 diff --git a/ui/button-map.9.png b/ui/button-map.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0162270254981f7dff2f88743b4444b1cb563b66 GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^Qb4T5!3HGP8h9rIDb50q$YKTtZeb8+WSBKa0w~B{ z;_2(k{*YBz+?p@)agq;ED96*qF(l&f+v$#62Mjn^u3zH+!E*nl<@>AhOTKSupK{^C zvfbvavIT-61^!z*mu?SWSTH5%mdKI;Vst09N5f?f?J) literal 0 HcmV?d00001 diff --git a/ui/button-over.9.png b/ui/button-over.9.png new file mode 100644 index 0000000000000000000000000000000000000000..9d1144c6ac9bf5515a14571b577b9a96189b6343 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^Qb4T5!3HGP8h9rIDb50q$YKTtZeb8+WSBKa0w~B{ z;_2(k{*XnEh1-~a`IlEfp<+)L$B>A_$teoFf7~A%3$30wv9Yo7;a{Eo|9MPUnlfig z%#?V+(l*~!=LU=XzMp;*7k*Njqpa}ag_OHQ<%!xys$D#LFXq@uxi1#$jWWr)xWX0A z_>zC!aMAX+8@8TyYtBpf?LOsOyW8W83I>Mxd4jLbUGrNGw4TA!)z4*}Q$iB}JdaBT literal 0 HcmV?d00001 diff --git a/ui/button-red.9.png b/ui/button-red.9.png new file mode 100644 index 0000000000000000000000000000000000000000..1bebf700e4eed214eb51760421bc382c727c2599 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^Qb4T5!3HGP8h9rIDOXPy$B>F!Z*OemWl#`s3T!L* z|8@>@wYATd1O85bZ&@$Vxi>47?`N8}A~WMuXEr7X_$BnHf#p?;T>VpaXE&Q1ot`Hv VRG8x!Lx2V{c)I$ztaD0e0svmSB~${XE z)7O>#A&VTVp;TtwjT1m2KTj9O5Rc=@DF^ue83(XQY~k#+3eZ-@4;f+T%CVg(YQd={wEDG#)(^U$PH(Yexb4!ME&#{XS*cpy1@p0Ka S2=M@#%;4$j=d#Wzp$PybXf<{K literal 0 HcmV?d00001 diff --git a/ui/button-window-bg.9.png b/ui/button-window-bg.9.png new file mode 100644 index 0000000000000000000000000000000000000000..564a70a904b3768531e0c52280532b68080bdfa9 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^Qb4T5!3HGP8h9rIDYhhUcNZWH1V5d3*8?fe0*}aI z1_o|n5N2eUHAey{$X?><>&pI+S&C6sraArV37}A@r;B4q#NoHs4fz@jc$@=gcR$Oq zTsbpQ%PB?UestTjmD8-QR86~+wq9<>&pI+S&C6s%{5!63Mdrf>Eaj?aro_ZL%s$B9_PT>+3DwY zp5+M^RC4}#&&b4o>y?GqHa{_|{<=VQFRuq{O@zVRd58Qhc5xU$kWx&Wt~$(695W-KJx$o literal 0 HcmV?d00001 diff --git a/ui/button.9.png b/ui/button.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e3f0d440f26a3116a40a4900b951d1b0ddcf2794 GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^Qb4T5!3HGP8h9rIDb50q$YKTtZeb8+WSBKa0w~B{ z;_2(k{*XnEh12lz{O>M6pA_Z>L}6JYc}#a{f~6oddda%r0BB2`~AdX&>a| zJp0~X%@@tWj;!B9W=B+UvohS-`^a%>P|9JIwd}XnPZBh|5)xXUaQBMj+%gU0Oj$=3 xK^FlKapC(rtIT|BFdh=kVQ^FUS{HVQ7@p7zo(01h{y5dFJHg@J@4Rt;D|%I z!5`feNAVq%pVdNj1H!}Qd!4P0KRn(q@7`Q;Fdh=kVQ^F!8%8|OBN^;@9E+g;&D9r%h#`e&pWsuIO33Q z@JBbrQG7?`XSGn>fbeknmyTURd(NgkVNHIk`AGNAkB`bn_Z>(-mSHEewcyI3KyLS_ zhqcd7zP_j+`$x>EZ<}{}oy@A0D|?SUys%Ax;nFeTD@Paq76Mwu;OXk;vd$@?2>{RB BOD_Nb literal 0 HcmV?d00001 diff --git a/ui/check-over.png b/ui/check-over.png new file mode 100644 index 0000000000000000000000000000000000000000..d0fe60dbba001f4f986e767f16d932052e53ea4b GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^GC-`r!3HE5w@NqxDYhhUcNd2LAh=-f^2tCE&H|6f zVg?3oVGw3ym^DWND9B#o>Fdh=kVQ^FN!?3i%LSlNkf)1dh{y5dKl_cI*)z*B3Nz0= z_+k45*4PKfq{DV#4=Qrrj)7d_~s5ZqId#3oWu9u4r8>))xh2By68hxFy!= l%Wab@dF_2{ns;?s807Zzdr#S0a|viVgQu&X%Q~loCII-tKDqz^ literal 0 HcmV?d00001 diff --git a/ui/clear.png b/ui/clear.png new file mode 100644 index 0000000000000000000000000000000000000000..a38cc5d66374555ef29b06b8085817f52e181792 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4aTa()7Bet#3xhBt!>l+@pIrhB410EQIWE4m=p;}-gQu&X%Q~loCIICED#8E& literal 0 HcmV?d00001 diff --git a/ui/color-picker-bar-selector.png b/ui/color-picker-bar-selector.png new file mode 100644 index 0000000000000000000000000000000000000000..84e626e0e2f54037d34eaba4fe56aa8bcc35c7a9 GIT binary patch literal 309 zcmV-50m}Y~P)>_J%f4>3h03hE&{2{_+36J+nwNBQrCz zgfim>8)i+eKnAhaf~!X~TRa6CJ3~Bb&4X-Z7{zA@{Sp7leFLbK!PC{xWt~$(69CSV B8z%q& literal 0 HcmV?d00001 diff --git a/ui/color-picker-selector-horizontal.png b/ui/color-picker-selector-horizontal.png new file mode 100644 index 0000000000000000000000000000000000000000..8b6025462f90812c2a6df3acd536807504bd4cf0 GIT binary patch literal 74 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ&0V4mNy#E1633|FXhE&{2{=v`6!^4xn!_08k WTJZhd;>H-DB!j1`pUXO@geCw&F!$v^m6coLX67O=$d ZFmNdezArvm8UmDN@O1TaS?83{1OV=-55xcf literal 0 HcmV?d00001 diff --git a/ui/cursor-normal.png b/ui/cursor-normal.png new file mode 100644 index 0000000000000000000000000000000000000000..7724fe99dbcbfef363cf1331e1792dffbb689d2f GIT binary patch literal 103 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4>3O<1hE&{2{_+36J+q;N&yJ_- z9K>1}MJ#i61&S=1;nC&f)KJnIQl`A~V6!MQ!`({`4lBJy!+<&&JYD@<);T3K0RUtD B9;N^Q literal 0 HcmV?d00001 diff --git a/ui/cursor.png b/ui/cursor.png new file mode 100644 index 0000000000000000000000000000000000000000..67ff25cb9aab70bfb47ba98a79ad4e1911808332 GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1|(O0oL2{=*pj^6T^Rl|++eUPyu*3{D8gCb z5n0T@z%2~Ij105pNB{-dOFVsD*&i~CFi9)spSf-d6q50DaSY+Oo@`T5@IIc6jZKYB iBf;sJ!GhuqKnt&~VfHA`OKb(IWAJqKb6Mw<&;$T@JtB7i literal 0 HcmV?d00001 diff --git a/ui/default-pane-no-border.9.png b/ui/default-pane-no-border.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d2c3e66a4966cc7a0c5e7c89a4f7828aec66c2bb GIT binary patch literal 78 zcmeAS@N?(olHy`uVBq!ia0vp^%plCc1|-8Yw(bW~qMj~}Ar-fh6B-)+^BA-(U#>of anVlj05A)5P{1ZSr89ZJ6T-G@yGywp5i4%_i literal 0 HcmV?d00001 diff --git a/ui/default-pane.9.png b/ui/default-pane.9.png new file mode 100644 index 0000000000000000000000000000000000000000..6ff8c3765046e60cd12b449d8ae95315bcf014be GIT binary patch literal 88 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)Q!3HEdXMMW?q~twa978H@B_}vE{P&Px{d2rY mP-xz~c?CV|q?h~6VPM$mDq64JvdjXgl)=;0&t;ucLK6VAOc?|K literal 0 HcmV?d00001 diff --git a/ui/default-select-selection.9.png b/ui/default-select-selection.9.png new file mode 100644 index 0000000000000000000000000000000000000000..faa20b6bb828ed73a89fd38b4eba122c2ff0003b GIT binary patch literal 86 zcmeAS@N?(olHy`uVBq!ia0vp^tRT$61|)m))t&+=Sx*yo!3HEbWhE+r)HhET$B>F!Z?771H5-T=D_nnh zYxQ|0AgJIMXJr>>XBRIFDGwKS^q=yHNziNM6hGe|_CFNV@_&9b__*i2*WVfcSKR)) zFowsWfq{{Ug+o9A&N%S;N##0Y-^o^ekBuH%%=>$dp?lE<&C@};r#}g*r(a6`wU+VM zzV)kCU0V4%YVGS^ZIf*+jcXGnZhhrvb6mhUX~#*PJarQ){m!zopr0LZxzAOHXW literal 0 HcmV?d00001 diff --git a/ui/icon-cancel.png b/ui/icon-cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..bf4c7ed9a0e88083f34a1b1be3ff61685bd3dd78 GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa&H|6fVg?3oVGw3ym^DWND9B#o z>Fdh=kWH3JoxS?j>$5$biRXKC^R3l0-z~{Ar@Q1hhk*wu_!J z=+Nx?xxjPom5BoCkwxcrSwBsg7p27acxHO}{WlD|FZc3%zOral=B&B}FWY;%pMB&N z=xJyAwJT0Tuuu6{=!)qXj)t!lXGtb&UfLULvrzq2luh?>jYL zD7~ss__WdzwP{_cT1gAH+OQOt+>S1jW;n1Fdh=kWH3ZnyZeGT?E!FWR=^h(RiAT~yc$r!@gn<-;@% zD=gD^*zVH#TH&DQv_+H8>u+3C`m)pNjJn+6++wyHvg<{nrq2^_T2(eDih40SlKtcx`t@W2>U{qCMJf_IX<} z&iJ;g{Pwd{l)mNB%?&kH+|c^j3$rEb!6poj{_ac;OXk;vd$@?2>^ms BSN8w_ literal 0 HcmV?d00001 diff --git a/ui/icon-close-down.png b/ui/icon-close-down.png new file mode 100644 index 0000000000000000000000000000000000000000..204c2eb91185a9667d8204f8a0faded988ff2f78 GIT binary patch literal 321 zcmV-H0lxl;P)_3V$8if+va_*q2CZmv7m;ARK%}xT=>2=}A+~ONlX4U$@hIV8-&WGWrW;7_hvt`~ zAjC0^=iPy7UM%N>)co=k3}wn?lFFR?Dh_1`V-jO7KLy|Fb7~Z{;Ke=#xC~+8V_2S( z#Oh;QZAp6t-Z; T!wXx$00000NkvXXu0mjfPN0Ui literal 0 HcmV?d00001 diff --git a/ui/icon-close-over.png b/ui/icon-close-over.png new file mode 100644 index 0000000000000000000000000000000000000000..e526739fb6494cda281dd659c41fc09a4305d69a GIT binary patch literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEoCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#A&VRfi;VKSt2IEO+nz3tArXh)&M@R_P~dSrSivrta>-iKKV#42+1=YOaI*Ja z3o_Vp;iTiLpOtU(FZ$kIIc0HBr~6yEZKaN~CfnTizMnn6zbXC9<9}62GfZA~pZLQg z`X%MnDV1rK|3crK6*!`DB&Lpw?NxD-$dz;5@}dexEXSA+|Cyr_Ccn69cZ1eGBd1iM zmrrX%d(J+&UTIXxdYa!Y*`Q3m<(a2rt-%&?<>#I|t3Ss3aNX(Nc#rET^Ncgg1Ep^- zexGf0_Z7plIbG?YLLe1}M{fI`tofew$mPxJkeoR#)1&K>WTIw;O23S7SP1kcgQu&X J%Q~loCIACcfZqTB literal 0 HcmV?d00001 diff --git a/ui/icon-close.png b/ui/icon-close.png new file mode 100644 index 0000000000000000000000000000000000000000..02b26e0a258e1d95c1ce7a462233918eabe2c5cc GIT binary patch literal 319 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEY)RhkEJ6q7XTW&xM$K%q09E{-7)hu_X{9DnFN3k*cGN)HE^U`*A zYPtD6dt)$Tf~P^P$XdBLAmqQb1i0e>3MyVZ+QK{j~J#2?j5h2bLdp z`Mf4aTa()7Bet#3xhBt!>lYKyKdZPPUP|7S@FQ0&y1OSmQ&mF%SsX(7}a#t{f4aTa()7Bet#3xhBt!>lK1G;wme-Wd7hErMl$19z@-bXw7Id4mZQ~c9Sqz@8elF{r5}E*N CkT8w_ literal 0 HcmV?d00001 diff --git a/ui/icon-production.png b/ui/icon-production.png new file mode 100644 index 0000000000000000000000000000000000000000..2191bedfac5d968da4dbb52d2550d14e4d1bad4f GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4aTa()7Bet#3xhBt!>lP8O1N1p=#BGFdh=kWH3Z)IyQ($2Oo)kEe@ch{pN36HoIt81OjHy`(B|dIOXAjmDD=+}Z~WdKjNM zIMz7*a9NdNTABHX$=p#$<^83CsK5(bX8kNqntJN4;*q8;Q4?7|CQpByTJV3u=4BjF zejg?o%vsFlIpeBtEn~L&XX}40zZ1@6PuN}j(S`N#rm8zPr6*+eu{T`3x#XOINNz@h fFSElGGxh>Db5q;Tj(R6SPG#_P^>bP0l+XkKx3E-8 literal 0 HcmV?d00001 diff --git a/ui/list-selection.png b/ui/list-selection.png new file mode 100644 index 0000000000000000000000000000000000000000..c31c5175b0cb6073d3efd0c7b87efadfa74b3cf8 GIT binary patch literal 70 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k92}1TpU9xZY8gX`uxhCf$a#hfEuF# QD^P;L)78&qol`;+0JPi=oB#j- literal 0 HcmV?d00001 diff --git a/ui/menu-bg.png b/ui/menu-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..d57b4a1bb54850b50e5d8dd64fee0f5c21084871 GIT binary patch literal 70 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k92}1TpU9xZY5tZ+4Ps6foTWh4DoBr Qjersip00i_>zopr0LZxzAOHXW literal 0 HcmV?d00001 diff --git a/ui/padded-list-selection.9.png b/ui/padded-list-selection.9.png new file mode 100644 index 0000000000000000000000000000000000000000..9e6045b908ebe9c747bfc53a32ea767acb6011d3 GIT binary patch literal 82 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CM!3HFkE59=WQj(r7jv*Ddk`oT_{c|=f3)uSX gYJHLcvn2z=Mhk_hbL1smfr=PBUHx3vIVCg!0Mx(~p#T5? literal 0 HcmV?d00001 diff --git a/ui/progressbar-filled-vertical.png b/ui/progressbar-filled-vertical.png new file mode 100644 index 0000000000000000000000000000000000000000..6713cc9ea96b08c717c6287c7c0719c0e2b3d9de GIT binary patch literal 72 zcmeAS@N?(olHy`uVBq!ia0vp^3P8-r!3HGvcdbbWQv9ASjv*Ddl2=51e)ZoWiJ^}( V@gWcEetDo2gQu&X%Q~loCIBvy5{Uo+ literal 0 HcmV?d00001 diff --git a/ui/progressbar-filled.png b/ui/progressbar-filled.png new file mode 100644 index 0000000000000000000000000000000000000000..50f58e3535d2f94a9e5c9db268fa07dabe0c7380 GIT binary patch literal 73 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfw!3HERKNXS!QUabXjv*Ddl2=51er137fht4w Xq{N5M3STGy>I_ChT7(8A5T-G@yGywoL?Gsx7 literal 0 HcmV?d00001 diff --git a/ui/progressbar.png b/ui/progressbar.png new file mode 100644 index 0000000000000000000000000000000000000000..439795f5d5f3343820156c979de759d7343a29cb GIT binary patch literal 73 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfw!3HERKNXS!QUabXjv*Ddk}sHS`g`7>f|Ft2 WMx%#YSQ6uaatxlXelF{r5}E)tmlE~> literal 0 HcmV?d00001 diff --git a/ui/radio-off.png b/ui/radio-off.png new file mode 100644 index 0000000000000000000000000000000000000000..6b418cf4ea1adcaab27cc7cc03d6c4196703f46a GIT binary patch literal 591 zcmV-V0^Vf-s;Uxw)H^iOj4?z(5YSA}ME8T%+VFSBtaDb6^<;Hx$BtNf zRd3RKvP6wWL*@vhIV#JN{@4I>YQ`%L^qoKVS=Bq$%k%sj{yU#63rw4Wc%Hw*tXiz= z{{X$!6~p4pbOokOPDN1+VOT|KHpXGwtosRIPQMuTIWwie0F_AHK6lI}V4qkoQ-C== zGi(=7z``&bMrrpu<{$i=B5XX;#Ux2+l#Mv#3D4}G;zYUxL$VjC&nx&*7i@NE9tB zQkG>4broQEBx}sL05?LwXibav*o7^arp4f`+-d8L-xd@wrHvRJxGX-;t!bGkcqG8! zXF7UapkjalGkF0Rsk|%x2DV_5Gs6+Bsv!ihkv9bp4KP6A;99MgBob_ab=U7seV+IW z(!Z@r*}XRRB{J8X&4&PsqDaP(z3?Eg1*p_0o_Lz<0tQy-pEBftcPUFbl8zpl-&7e& dGb7M(#w!N^G9HHP4tD?m002ovPDHLkV1gfS162S3 literal 0 HcmV?d00001 diff --git a/ui/radio-on.png b/ui/radio-on.png new file mode 100644 index 0000000000000000000000000000000000000000..8192c2d22ffc1a40a825f387b736ecbcfbef38dc GIT binary patch literal 743 zcmV?P)h(AR4`f*8tS&vrwJ^NEH%e<0V`a^bIuLDBkGJ zdj4U@VpC=zESvmf*qz;P&Y3eaKaEBs8V-j__r(cq#S(-o5{b}OB!=cKA%x^-Z&>eH z6V@+ZWB=YMOYDnd+DYD_Xf&$6Va2y8pU+dJQc?Qv0!%BGxTitS`Tu8@x1=Vn>psJ~ zJIT8WCS;EIJBwkyQmjuafUfI;VF_Cn6ii5$a=F|LhEZhY(LC%S>+2dYt?vwbY|FfY z0jeU^dCtgVz#g&wgaFg}&9D-nfLWF`i_*_`f;)T*5jG#`UNV`af7OUdUUSZj;zIfe zhN@naK9Ar<&`afV*=shNUc24)dcB^~+1Z)bXf)KbC7@5SWOQ`K(y!HOUboxz27|$k z!ZY*mV`H*eqYAj*qP9Z#$eVE9KNQG9ogY}?-5)By~S z*bRd-XD8UwlX)!pJCuwnXWkCURgj7ZcE{o^$L0BdV9tkk`nT$A8P;~(& z-5g-#xCP~JU<=lnGfdIGGlKvIsONcC-V`uE;owrKlqw|H0^eOP3%cYFS5W?GC$F-X z=C+PZ0r8{BfW_l+)kgKggTNNxq{iWit;rw2)EC<440**_va=jXM$F7_){&I8rGjb( Z^cVZ9G2iNi-Jt*g002ovPDHLkV1g+gTgLzZ literal 0 HcmV?d00001 diff --git a/ui/scroll-horizontal.9.png b/ui/scroll-horizontal.9.png new file mode 100644 index 0000000000000000000000000000000000000000..6569566c4b061feb2586d9bc1197e48083d535a7 GIT binary patch literal 98 zcmeAS@N?(olHy`uVBq!ia0vp^96+qX!3HF^Bvu~-QktGFjv*Ddk`o+Q|1Xpf&5*kJ w?|55#SJVH+TyCO0S_-j@ca8L~C9!ic%wkCJC_3xH4%Ecp>FVdQ&MBb@0IbRznE(I) literal 0 HcmV?d00001 diff --git a/ui/scroll-knob-horizontal.9.png b/ui/scroll-knob-horizontal.9.png new file mode 100644 index 0000000000000000000000000000000000000000..2b898da798484ec76a6ea3ad6b23f385004f016f GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^96+qX!3HF^Bvu~-QjVT3jv*Ddk`o+Q|1Xpf&5*iT zceHJy=%3?l?xG7cPn*+7j9p00i_>zopr042{I AUjP6A literal 0 HcmV?d00001 diff --git a/ui/scroll.9.png b/ui/scroll.9.png new file mode 100644 index 0000000000000000000000000000000000000000..efbaeea0e362db58838f1481d433f039cdfe01a1 GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^DnQJ^!3HEJ=EYtGQfi(qjv*Ddk`oT_{kzPW%s$I) u+kbXuxh;IZ>|ZTdD3;oM-m#gJf#K!f1P|AkX@7t^7(8A5T-G@yGywp6upHr%Y|5prWFJf{H(-+S}R)`b4vHg;_p!*$teK%)KWN1VJEV+ctTg=U>)! z73(7mLm^QV$#EQiO3c`?KH@lbijXYJ$<)ro;kBT z&vT!qDJVfND9h4SRV8Fu7P;^Hg=d>9z9@>fZxZUdhQ93hI@$OA#qNq{M`cj{l+d;< zx~_AI{J=9~$7JX~J|*;hk8vE`G)+S0dG^CFyqU>dUoy=nX2pqkrT_o{07*qoM6N<$ Ef=7vQj{pDw literal 0 HcmV?d00001 diff --git a/ui/select-up.png b/ui/select-up.png new file mode 100644 index 0000000000000000000000000000000000000000..67fcb85d761cfa9e9dfcfcb5012a9d74909749c0 GIT binary patch literal 262 zcmV+h0r~!kP)RUO%wNh?{~-`>rYV>RF>s?**NlnwNzD=&r_CV?`7i%Y}@AP+hJrN z&vT+ANwjPnfq9@?>vg<&WVMUm|L{->m{Lq_uy1cAW1uK$+QvMi$cUoU?qq#bb4XaE2J M07*qoM6N<$f^e{QRR910 literal 0 HcmV?d00001 diff --git a/ui/selection.png b/ui/selection.png new file mode 100644 index 0000000000000000000000000000000000000000..e779aea9b1973e59db97f70bf4c38490105ef2f7 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k8}blwj^(N7l!`~HyG>+@339~if|Tq zL>4nJa0`PlBg3pY5H=O_J_gTe~DWM4f0HYgc literal 0 HcmV?d00001 diff --git a/ui/separator-menu.png b/ui/separator-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..5c633eb1c72cba04fac02ab8572b2fa295fa8a82 GIT binary patch literal 70 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k92}1TpU9xZY6*C`0*z{1M>#PCt|ZW QjDQjhp00i_>zopr0Ngwfp#T5? literal 0 HcmV?d00001 diff --git a/ui/separator.png b/ui/separator.png new file mode 100644 index 0000000000000000000000000000000000000000..114704cbced7a0fa5dad0fc1b095507cde8a2e44 GIT binary patch literal 70 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k92}1TpU9xZY6Ih;rzwVz#PGNe$z?y Q6+j6FPgg&ebxsLQ0Kg&-@Bjb+ literal 0 HcmV?d00001 diff --git a/ui/slider-knob-disabled.png b/ui/slider-knob-disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..7bbf8cabc5fa4300d333db078ea03848548862ec GIT binary patch literal 102 zcmeAS@N?(olHy`uVBq!ia0vp^VnD3J!3HD~Lp?qKDP2z&$B>F!Z_g<5GB9v37`#gO y_@$p!)8NgcZxgQ;D;`PO7@;H9eH29flhj`m^LQ?&1LX(^>bP0 Hl+XkKU@|Zo literal 0 HcmV?d00001 diff --git a/ui/slider-knob-over.png b/ui/slider-knob-over.png new file mode 100644 index 0000000000000000000000000000000000000000..dce38136568e767b9771007cf5aa1449c9d6971e GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^VnD3J!3HD~Lp?qKDb50q$YKTtZeb8+WSBKa0w~B{ z;_2(k{*XnEg_|p2QOzTukdLQ}V~EG`p{yp!&eBg+KvcVUgG)HlZ+HXpcY%`@^ z_qTmqad0tPzm!eZ2PDSfb+tYB&dKs7cQGzrwdz%deg8H#W`@%T*xhCbw*CT|%;4$j K=d#Wzp$P!DBsk>& literal 0 HcmV?d00001 diff --git a/ui/slider-vertical.png b/ui/slider-vertical.png new file mode 100644 index 0000000000000000000000000000000000000000..e4139783a05304a8519008fc8a80f5a1669eacc6 GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^96-#-!3HEBGrV^OQfx`y?k+$Y2!1;6t_M<_1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPti@3P8s(Y;JYoL&Tr;B3<$MxhA|9gMtGx9Sqxcy;@ U(|hszBv6jQ)78&qol`;+03>Z4hyVZp literal 0 HcmV?d00001 diff --git a/ui/slider.png b/ui/slider.png new file mode 100644 index 0000000000000000000000000000000000000000..7986f4f53bb7d6b9dabaa54e653127335fc413a1 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^j6lr6!3HEPq^3FoDb50q$YKTtZeb8+WSBKa0w~B{ z;_2(k{*XnEg;ndTf8i3Kkcg*?V+hCfJ6r+UZip59Q0fi(>Tq8=H^K)}k^GX<;i&7IyQd1Pl zGfOfQ+&z5*!W;R-fr_qqx;TbZ+5k$6za-x<&953gQzYSoijc78xpP8%yd`e**@zG7a@G6kjPgF!$sJu?|Ia(jU|?`w WE->-`LsN609D}E;pUXO@geCwB?-CCH literal 0 HcmV?d00001 diff --git a/ui/splitpane-vertical.png b/ui/splitpane-vertical.png new file mode 100644 index 0000000000000000000000000000000000000000..4328d75f8d00bb40e126cec725d15db7c1d7a649 GIT binary patch literal 73 zcmeAS@N?(olHy`uVBq!ia0vp^j6lr6!3HEPq^3FoDFIIx$B>F!$s0;If1P)j!N4G1 W&R4i=!M)=^IR;NxKbLh*2~7b14iV4* literal 0 HcmV?d00001 diff --git a/ui/splitpane.png b/ui/splitpane.png new file mode 100644 index 0000000000000000000000000000000000000000..ff4820d685493c7bdc6d9e86894f3041920e32e7 GIT binary patch literal 72 zcmeAS@N?(olHy`uVBq!ia0vp^96-#-!3HEBGrV^OQv9ASjv*Ddk~fra{_5vvW_WUw VuP}dFKqgR%!PC{xWt~$(695Uf5u^YB literal 0 HcmV?d00001 diff --git a/ui/sub-menu.png b/ui/sub-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..43fe36b6b3f60fbcf878d5b53d6a912119f8cd42 GIT binary patch literal 247 zcmV{Q70002KNklAPncgrnsdm9HO;x^IF7fX xSTMJuu2rXLYNTqGpwcPuN0~T|!4g!G^9JolCR0Xet+D_B002ovPDHLkV1hv7Vg3LB literal 0 HcmV?d00001 diff --git a/ui/textfield-over.9.png b/ui/textfield-over.9.png new file mode 100644 index 0000000000000000000000000000000000000000..3fe1f1ec4f69ec241a1cb3968ad50b38a051557a GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{2o-U3d6}OTT99aKn_5?OA^}bMF z^@wr%kN+!<^hmm?W5?3b}c@IEHu}Pfj_&|IavpP2!_h zhSbfVEJn`^>bP0l+XkK%c&VD literal 0 HcmV?d00001 diff --git a/ui/touchpad-knob.png b/ui/touchpad-knob.png new file mode 100644 index 0000000000000000000000000000000000000000..48b9c263391274ae4d8b192e90ed1f995cb40c91 GIT binary patch literal 1127 zcmV-t1ep7YP)0)Dhp5|FY05{2$ytpX+n@iX`CFfNqNw1A=uBMDJt zfzcJH5ErN`nHfF|#kQbW&;_3N&P*wWq9D+jo1A1QGxt7o@0oMXeJ@FpM5%4B$4{=t zt8}n!ki4>Hn4(hdNR()0h1_HFls_~_Ro&B6*gJbbQuGFothak*z0WJFAFn^2jk5hT zEy}-t@CLP~e9tXO*6Z<1{ev%5{VGcC(RtCQ=S`frA6l;k0)eEJmsc1+q-#>APF}WR z6FUE81OsGYU1lcV{<8GIQV_730nOKe z&?KNQaHsFL0GZCl7`7=8o)jwySOJ}8w$}&dCE7QWpu*vp0UZ?3exA|6Z3JCoJjMXS zmRhidBQeUJSrRN81M>}gzW*|PHBOZ;B7i=}9mRJFHVG}O3k=(gF`}m$AndUhQ0{P4K#MrLgQ4qxLLS%vi;O6~#QdQMpwHV4c6Fxpv&e`d z#JR1gu)P^9L2Y1TSYbXzI|WamDrFkJ`^fIV?8`j?d5WmuUc|M`l7@B-+t770PEL9FfAY$Llyep_JwU|i75Ce-+fzbe4$UY*zL_=8V$eakM-L4Ho zo>HkSz1Ci0Y8wZOFOL^wOB7`|;U67BqA~~Uu z5h@P%mB(2Y@%1=Is$*eIKyT?_F|`5KojkgY3q2Xa9LhZm3`GXJ0c>H+J>s%yxE?qE t*NS=;&!Fl;A7(`23>Gtz!e1JIe*<f4`FOfGhE&{2?&$4JZeY~a)n)Vb z^-bBu=<%ODv2DkWil(jwT*4e$MI|MF{HH8BapJ^(7fmK@6*s|6ofV=7eNsIE-QGcGg0Xh-g$3u&BrurGK5;xA zvEOIpd5ZzB<0m{%V6hMoLg0G60;ACwK@g&CTgtMG_@%?+&W?rfnd}2HOmK^G;+F%W zvt!>6fbsZ^3>z4Eo|ErOhsT{6OBn)_$&?H`KA+D&Hj*+J2)iIqz;yaf#^40l=x{ht z7^;D&`!jfq3Q{U^UY+m|6-7Z&wCue+;jXp8avAsj3-04@isO~@D(J@_@{3lh#EIji zdHSq&T$UxR*V;)E-Ej2xk1NZHwB8Kph9hwFd^M`7qRl3Cv`!n2z!6N;Up}Q2ZsVHL zbUTnX9P!w=MVQa$IGs+Y>zcOPos*`!h9htU8(l6J`~n#bWvUeJS_%LF002ovPDHLk FV1m^vq38er literal 0 HcmV?d00001 diff --git a/ui/tree-selection.9.png b/ui/tree-selection.9.png new file mode 100644 index 0000000000000000000000000000000000000000..9721e9ed9e5dec4415a5a5fd2ea3c9207fa27a34 GIT binary patch literal 86 zcmeAS@N?(olHy`uVBq!ia0vp^tRT$61|)m))t&+=Sx* literal 0 HcmV?d00001 diff --git a/ui/white.png b/ui/white.png new file mode 100644 index 0000000000000000000000000000000000000000..ba9bf827c1f3fd6fc95544f0d9c34f0ffc29a2ec GIT binary patch literal 71 zcmeAS@N?(olHy`uVBq!ia0vp^%plCc1|-8Yw(bW~e4Z|jAr-fhfAq6R6cjP+ZdbnB TH*u90P=>+N)z4*}Q$iB}^}rF8 literal 0 HcmV?d00001 diff --git a/ui/window-bg.png b/ui/window-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..640981b2206bf419ddc3975ef6cbfd39d8b1c895 GIT binary patch literal 70 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k92}1TpU9xZY2v$5B$f^!1#+XY;uDc PNF{@(tDnm{r-UW|w0jRX literal 0 HcmV?d00001 diff --git a/ui/window-border-bg.9.png b/ui/window-border-bg.9.png new file mode 100644 index 0000000000000000000000000000000000000000..aba4bf1526c75bb0d0ca23c460f3113e0f33ca92 GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^tRT$61|)m))t&+=MNb#UkcwN$2@Vbac}^_II=lM6 n0Z%yNqmI)Wi#d`)I~f^n2}_@0*?A`fsF=ai)z4*}Q$iB}*Tfn5 literal 0 HcmV?d00001 diff --git a/ui/window-gray.9.png b/ui/window-gray.9.png new file mode 100644 index 0000000000000000000000000000000000000000..36c4fc6ca550d8c76fe047fbbd0999c95e9e26d0 GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^vOsLl!3HE{z8^LMQfx`y?k)`fL2$v|<&%LToCO|{ z#S9GG!XV7ZFl&wkP>{XE)7O>#Aq$_Fo~4J?+etv7rJgR1ArXh)-rUH0SV4gGLj4Kb zkeS^|)fdtmzPy?EC~T20tMH9dj=)*M+n)YEtzE(7$IeVCoV%|C3{)5+UO@A3u`bsBMl&?&lC1*+ZeVHZs%N%DHSDtTvH;I>Nf!x(sJhz&F P4rcIl^>bP0l+XkKIDls| literal 0 HcmV?d00001 diff --git a/ui/window-noborder.9.png b/ui/window-noborder.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e73c7cab5838ee7a657d70e0b865c2b5f0282f8e GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^vOsLl!3HE{z8^LMQf{6ujv*Dd-dvHaxt&* z;Ku(wsf@2Yf9n3+lu)% z`FYdIxhGHFaoo3dky2OSmGXkG&5z9+mu&G_^X1o;So=FyC8MtTe)PN8;IuG6Lxigp ziTc7K1rquzILof_*_`C47r!sQk9~iw$Mt#Zu6xceE=ra^^S$u=qR{)x&oA8GU!AL> c_ae(p?K9(?Ya1S}2D*m9)78&qol`;+01*{X>i_@% literal 0 HcmV?d00001 diff --git a/ui/window.9.png b/ui/window.9.png new file mode 100644 index 0000000000000000000000000000000000000000..8bb4f278ae3ad388d7e6e1d3982578553eb2895c GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^vOsLl!3HE{z8^LMQk(@Ik;M!Q+`=Ht$S`Y;1W=H@ z#M9T6{UM7S3y;RB=G6y*LX$jQ977@wzrDGav%x^1?ctmhv5gzVxZMS~*|!R~ZxmR5 zf-OB!HDb;W@sEE`34A)By3($2+ltNZKGLt2*%rN6$y2M|S*`fr@$bDyHoemsGpF4S z2>pAq!u3g|Ny~xhjI5}jS1R-v_b<;YySLih*z;h~8j1JY-+#HZ=s?fCSdk;f_jY$T cX>4M6K1r-=Vc^Utpz9bsUHx3vIVCg!01gvZN&o-= literal 0 HcmV?d00001