From 4eef02123e44de6e80392f4e69fd2ad4b5fbc556 Mon Sep 17 00:00:00 2001 From: Vadim Grigoruk Date: Wed, 14 Aug 2019 16:45:38 +0300 Subject: [PATCH] added Android build to Travis CI --- .gitignore | 4 + .travis.yml | 34 +- 3rd-party | 2 +- CMakeLists.txt | 118 +- appveyor.yml | 9 +- build/android/ant.properties | 24 - build/android/app/build.gradle | 73 ++ .../proguard-rules.pro} | 9 +- .../{ => app/src/main}/AndroidManifest.xml | 12 +- .../src/main/java}/com/nesbox/tic/TIC.java | 9 +- .../samsung/sprc/fileselector/FileData.java | 0 .../sprc/fileselector/FileListAdapter.java | 0 .../sprc/fileselector/FileOperation.java | 0 .../sprc/fileselector/FileSelector.java | 0 .../samsung/sprc/fileselector/FileUtils.java | 0 .../fileselector/OnHandleFileListener.java | 0 .../fileselector/SaveLoadClickListener.java | 0 .../sprc/fileselector/TextViewWithImage.java | 0 .../main/java/org/libsdl/app/HIDDevice.java | 19 + .../app/HIDDeviceBLESteamController.java | 644 ++++++++++ .../java/org/libsdl/app/HIDDeviceManager.java | 682 ++++++++++ .../java/org/libsdl/app/HIDDeviceUSB.java | 307 +++++ .../app/src/main/java/org/libsdl/app/SDL.java | 84 ++ .../java}/org/libsdl/app/SDLActivity.java | 1133 +++++++++++++---- .../java/org/libsdl/app/SDLAudioManager.java | 387 ++++++ .../org/libsdl/app/SDLControllerManager.java | 788 ++++++++++++ .../main}/res/drawable-hdpi/ic_launcher.png | Bin .../main}/res/drawable-mdpi/ic_launcher.png | Bin .../main}/res/drawable-xhdpi/ic_launcher.png | Bin .../main}/res/drawable-xxhdpi/ic_launcher.png | Bin .../{ => app/src/main}/res/drawable/file.png | Bin .../src/main}/res/drawable/folder.png | Bin .../src/main}/res/drawable/up_folder.png | Bin .../{ => app/src/main}/res/layout/dialog.xml | 0 .../{ => app/src/main}/res/layout/item.xml | 0 .../{ => app/src/main}/res/values/strings.xml | 0 build/android/build.gradle | 25 + build/android/build.properties | 17 - build/android/build.xml | 93 -- build/android/default.properties | 11 - build/android/gradle.properties | 22 + .../android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53636 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + build/android/gradlew | 160 +++ build/android/gradlew.bat | 90 ++ build/android/jni/Android.mk | 1 - build/android/jni/Application.mk | 9 - build/android/jni/SDL2/Android.mk | 6 - build/android/jni/gif/Android.mk | 6 - build/android/jni/lua/Android.mk | 6 - build/android/jni/sdlgpu/Android.mk | 6 - build/android/jni/src/Android.mk | 64 - build/android/jni/src/Android_static.mk | 12 - build/android/jni/wren/Android.mk | 6 - build/android/jni/zlib/Android.mk | 6 - build/android/project.properties | 14 - build/android/settings.gradle | 1 + build/android/src/org/libsdl/app/SDL.java | 37 - .../src/org/libsdl/app/SDLAudioManager.java | 178 --- .../org/libsdl/app/SDLControllerManager.java | 432 ------- build/android/store/0.png | Bin 27650 -> 0 bytes build/android/store/1.png | Bin 31736 -> 0 bytes build/android/store/2.png | Bin 28228 -> 0 bytes build/android/store/3.png | Bin 29447 -> 0 bytes build/android/store/logo-1024x500.png | Bin 2495 -> 0 bytes build/android/store/logo-512.png | Bin 1660 -> 0 bytes build_demos.sh | 6 + include/tic80_config.h | 7 +- src/config.c | 2 - src/console.c | 9 +- src/ext/file_dialog.c | 1 + 71 files changed, 4328 insertions(+), 1243 deletions(-) delete mode 100644 build/android/ant.properties create mode 100644 build/android/app/build.gradle rename build/android/{proguard-project.txt => app/proguard-rules.pro} (62%) rename build/android/{ => app/src/main}/AndroidManifest.xml (78%) rename build/android/{src => app/src/main/java}/com/nesbox/tic/TIC.java (96%) rename build/android/{src => app/src/main/java}/com/samsung/sprc/fileselector/FileData.java (100%) rename build/android/{src => app/src/main/java}/com/samsung/sprc/fileselector/FileListAdapter.java (100%) rename build/android/{src => app/src/main/java}/com/samsung/sprc/fileselector/FileOperation.java (100%) rename build/android/{src => app/src/main/java}/com/samsung/sprc/fileselector/FileSelector.java (100%) rename build/android/{src => app/src/main/java}/com/samsung/sprc/fileselector/FileUtils.java (100%) rename build/android/{src => app/src/main/java}/com/samsung/sprc/fileselector/OnHandleFileListener.java (100%) rename build/android/{src => app/src/main/java}/com/samsung/sprc/fileselector/SaveLoadClickListener.java (100%) rename build/android/{src => app/src/main/java}/com/samsung/sprc/fileselector/TextViewWithImage.java (100%) create mode 100644 build/android/app/src/main/java/org/libsdl/app/HIDDevice.java create mode 100644 build/android/app/src/main/java/org/libsdl/app/HIDDeviceBLESteamController.java create mode 100644 build/android/app/src/main/java/org/libsdl/app/HIDDeviceManager.java create mode 100644 build/android/app/src/main/java/org/libsdl/app/HIDDeviceUSB.java create mode 100644 build/android/app/src/main/java/org/libsdl/app/SDL.java rename build/android/{src => app/src/main/java}/org/libsdl/app/SDLActivity.java (58%) create mode 100644 build/android/app/src/main/java/org/libsdl/app/SDLAudioManager.java create mode 100644 build/android/app/src/main/java/org/libsdl/app/SDLControllerManager.java rename build/android/{ => app/src/main}/res/drawable-hdpi/ic_launcher.png (100%) rename build/android/{ => app/src/main}/res/drawable-mdpi/ic_launcher.png (100%) rename build/android/{ => app/src/main}/res/drawable-xhdpi/ic_launcher.png (100%) rename build/android/{ => app/src/main}/res/drawable-xxhdpi/ic_launcher.png (100%) rename build/android/{ => app/src/main}/res/drawable/file.png (100%) rename build/android/{ => app/src/main}/res/drawable/folder.png (100%) rename build/android/{ => app/src/main}/res/drawable/up_folder.png (100%) rename build/android/{ => app/src/main}/res/layout/dialog.xml (100%) rename build/android/{ => app/src/main}/res/layout/item.xml (100%) rename build/android/{ => app/src/main}/res/values/strings.xml (100%) create mode 100644 build/android/build.gradle delete mode 100644 build/android/build.properties delete mode 100644 build/android/build.xml delete mode 100644 build/android/default.properties create mode 100644 build/android/gradle.properties create mode 100644 build/android/gradle/wrapper/gradle-wrapper.jar create mode 100644 build/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 build/android/gradlew create mode 100644 build/android/gradlew.bat delete mode 100644 build/android/jni/Android.mk delete mode 100644 build/android/jni/Application.mk delete mode 100644 build/android/jni/SDL2/Android.mk delete mode 100644 build/android/jni/gif/Android.mk delete mode 100644 build/android/jni/lua/Android.mk delete mode 100644 build/android/jni/sdlgpu/Android.mk delete mode 100644 build/android/jni/src/Android.mk delete mode 100644 build/android/jni/src/Android_static.mk delete mode 100644 build/android/jni/wren/Android.mk delete mode 100644 build/android/jni/zlib/Android.mk delete mode 100644 build/android/project.properties create mode 100644 build/android/settings.gradle delete mode 100644 build/android/src/org/libsdl/app/SDL.java delete mode 100644 build/android/src/org/libsdl/app/SDLAudioManager.java delete mode 100644 build/android/src/org/libsdl/app/SDLControllerManager.java delete mode 100644 build/android/store/0.png delete mode 100644 build/android/store/1.png delete mode 100644 build/android/store/2.png delete mode 100644 build/android/store/3.png delete mode 100644 build/android/store/logo-1024x500.png delete mode 100644 build/android/store/logo-512.png create mode 100644 build_demos.sh diff --git a/.gitignore b/.gitignore index 85e328e7..fc8b5fb8 100644 --- a/.gitignore +++ b/.gitignore @@ -130,3 +130,7 @@ lib/ *.cmake CMakeCache.txt Makefile +build/android/.gradle/ +build/android/app/.externalNativeBuild/ +build/android/app/build/ +build/android/build/ diff --git a/.travis.yml b/.travis.yml index 3cfdc1a8..0e763bac 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,9 @@ language: c script: - - cmake -DCMAKE_BUILD_TYPE=MinSizeRel . - - make -j4 + - mkdir out && cd out + - cmake -DCMAKE_BUILD_TYPE=MinSizeRel .. + - make -j$(nproc) matrix: include: @@ -24,6 +25,26 @@ matrix: - EXE_FILE=tic80 - os: linux + language: android + install: + - wget https://dl.google.com/android/repository/android-ndk-r18b-linux-x86_64.zip + - unzip android-ndk-r18b-linux-x86_64.zip -d $HOME + - export ANDROID_NDK_HOME=$HOME/android-ndk-r18b + - touch $HOME/.android/repositories.cfg + - yes | sdkmanager "platforms;android-26" + - yes | sdkmanager "build-tools;28.0.3" + + script: + - bash build_demos.sh + - cd build/android + - ./gradlew assembleRelease + + after_success: + - cp app/build/outputs/apk/universal/release/app-universal-release.apk tic80.apk + - curl --retry 3 --ftp-create-dirs -T tic80.apk ${BUILD_SERVER}/files/$TRAVIS_BRANCH/$(date +%Y.%m.%d)/android/ + + - os: linux + dist: trusty env: - OS_FOLDER=wasm - EXE_FILE="tic80.js tic80.wasm" @@ -33,14 +54,11 @@ matrix: before_install: - docker run -dit --name emscripten -v $(pwd):/src trzeci/emscripten:sdk-incoming-64bit bash script: - - cmake -DBUILD_SDL=Off -DBUILD_SOKOL=Off . - - make generate_demo_carts - - git clean -xdf -e *.tic.dat - - git submodule foreach --recursive git clean -xfd - - docker exec -it emscripten emcmake cmake -DBUILD_SOKOL=Off -DBUILD_LIBRETRO=Off -DCMAKE_BUILD_TYPE=MinSizeRel . + - bash build_demos.sh + - docker exec -it emscripten emcmake cmake -DCMAKE_BUILD_TYPE=MinSizeRel . - docker exec -it emscripten make -j4 after_success: - BUILDS_SERVER_PATH=${BUILD_SERVER}/files/$TRAVIS_BRANCH/$(date +%Y.%m.%d)/$OS_FOLDER - - tar -cvzf tic80.tar.gz --directory=$HOME/build/nesbox/TIC-80/bin $EXE_FILE + - tar -cvzf tic80.tar.gz --directory=$HOME/build/nesbox/TIC-80/out/bin $EXE_FILE - curl --retry 3 --ftp-create-dirs -T tic80.tar.gz $BUILDS_SERVER_PATH/ diff --git a/3rd-party b/3rd-party index ffde1ce9..62c418b2 160000 --- a/3rd-party +++ b/3rd-party @@ -1 +1 @@ -Subproject commit ffde1ce9b52065fcfdeaabceda1445e912036920 +Subproject commit 62c418b272da3104df4a04a5a280311892d62df5 diff --git a/CMakeLists.txt b/CMakeLists.txt index 5eeccc65..ce4a8e45 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,10 +3,20 @@ cmake_minimum_required(VERSION 3.3) project(TIC-80 C CXX) message("Building for target : ${CMAKE_SYSTEM_NAME}") -option(BUILD_SDL "SDL Enabled" TRUE) -option(BUILD_SOKOL "Sokol Enabled" TRUE) -option(BUILD_LIBRETRO "libretro Enabled" TRUE) -option(BUILD_DEMO_CARTS "Demo Carts Enabled" TRUE) +if(ANDROID OR EMSCRIPTEN) + set(BUILD_SOKOL_DEFAULT OFF) + set(BUILD_LIBRETRO_DEFAULT OFF) + set(BUILD_DEMO_CARTS_DEFAULT OFF) +else() + set(BUILD_SOKOL_DEFAULT ON) + set(BUILD_LIBRETRO_DEFAULT ON) + set(BUILD_DEMO_CARTS_DEFAULT ON) +endif() + +option(BUILD_SDL "SDL Enabled" ON) +option(BUILD_SOKOL "Sokol Enabled" ${BUILD_SOKOL_DEFAULT}) +option(BUILD_LIBRETRO "libretro Enabled" ${BUILD_LIBRETRO_DEFAULT}) +option(BUILD_DEMO_CARTS "Demo Carts Enabled" ${BUILD_DEMO_CARTS_DEFAULT}) option(BUILD_PRO "Build PRO version" FALSE) if(UNIX AND NOT APPLE AND NOT EMSCRIPTEN AND NOT ANDROID) @@ -233,8 +243,12 @@ if(BUILD_SDL AND NOT EMSCRIPTEN) set(HAVE_LIBC TRUE) endif() - set(SDL_SHARED_ENABLED_BY_DEFAULT OFF) - add_subdirectory(${THIRDPARTY_DIR}/SDL2-2.0.8) + if(ANDROID) + set(SDL_SHARED_ENABLED_BY_DEFAULT OFF CACHE BOOL "Build a shared version of the library") + include_directories(${ANDROID_NDK}/sources/android/cpufeatures) + endif() + + add_subdirectory(${THIRDPARTY_DIR}/sdl2) endif() @@ -243,7 +257,7 @@ endif() ################################ set(EXAMPLE_DIR ${CMAKE_SOURCE_DIR}/examples) -if(BUILD_SDL AND NOT EMSCRIPTEN) +if(BUILD_SDL AND NOT EMSCRIPTEN AND NOT ANDROID) set(EXAMPLE_SRC ${EXAMPLE_DIR}/sdl/main.c ) @@ -254,7 +268,7 @@ if(BUILD_SDL AND NOT EMSCRIPTEN) add_executable(sdl-renderer ${EXAMPLE_SRC}) endif() - target_include_directories(sdl-renderer PRIVATE ${THIRDPARTY_DIR}/SDL2-2.0.8/include) + target_include_directories(sdl-renderer PRIVATE ${THIRDPARTY_DIR}/sdl2/include) target_include_directories(sdl-renderer PRIVATE ${CMAKE_SOURCE_DIR}/include) target_include_directories(sdl-renderer PRIVATE ${CMAKE_SOURCE_DIR}/src) @@ -279,7 +293,7 @@ else() set(SOKOL_LIB_SRC ${SOKOL_LIB_SRC} ${CMAKE_SOURCE_DIR}/src/system/sokol_impl.c) endif() -add_library(sokol ${SOKOL_LIB_SRC}) +add_library(sokol STATIC ${SOKOL_LIB_SRC}) if(APPLE) target_compile_definitions(sokol PRIVATE SOKOL_METAL) @@ -383,27 +397,32 @@ endif() if(BUILD_SDL) set(SDLGPU_DIR ${THIRDPARTY_DIR}/sdl-gpu/src) set(SDLGPU_SRC - ${SDLGPU_DIR}/renderer_GLES_1.c ${SDLGPU_DIR}/renderer_GLES_2.c - ${SDLGPU_DIR}/renderer_GLES_3.c - ${SDLGPU_DIR}/renderer_OpenGL_1.c - ${SDLGPU_DIR}/renderer_OpenGL_1_BASE.c - ${SDLGPU_DIR}/renderer_OpenGL_2.c - ${SDLGPU_DIR}/renderer_OpenGL_3.c - ${SDLGPU_DIR}/renderer_OpenGL_4.c ${SDLGPU_DIR}/SDL_gpu.c ${SDLGPU_DIR}/SDL_gpu_matrix.c ${SDLGPU_DIR}/SDL_gpu_renderer.c - ${SDLGPU_DIR}/SDL_gpu_shapes.c - ${SDLGPU_DIR}/externals/glew/glew.c ${SDLGPU_DIR}/externals/stb_image/stb_image.c ${SDLGPU_DIR}/externals/stb_image_write/stb_image_write.c ) +if(NOT ANDROID) + list(APPEND SDLGPU_SRC + ${SDLGPU_DIR}/renderer_GLES_1.c + ${SDLGPU_DIR}/renderer_GLES_3.c + ${SDLGPU_DIR}/renderer_OpenGL_1.c + ${SDLGPU_DIR}/renderer_OpenGL_1_BASE.c + ${SDLGPU_DIR}/renderer_OpenGL_2.c + ${SDLGPU_DIR}/renderer_OpenGL_3.c + ${SDLGPU_DIR}/renderer_OpenGL_4.c + ${SDLGPU_DIR}/SDL_gpu_shapes.c + ${SDLGPU_DIR}/externals/glew/glew.c + ) +endif() + add_library(sdlgpu STATIC ${SDLGPU_SRC}) -if(EMSCRIPTEN) - target_compile_definitions(sdlgpu PRIVATE GLEW_STATIC DSDL_GPU_DISABLE_OPENGL SDL_GPU_DISABLE_GLES_1 SDL_GPU_DISABLE_GLES_3 SDL_GPU_DISABLE_OPENGL) +if(EMSCRIPTEN OR ANDROID) + target_compile_definitions(sdlgpu PRIVATE GLEW_STATIC SDL_GPU_DISABLE_GLES_1 SDL_GPU_DISABLE_GLES_3 SDL_GPU_DISABLE_OPENGL) else() target_compile_definitions(sdlgpu PRIVATE GLEW_STATIC SDL_GPU_DISABLE_GLES SDL_GPU_DISABLE_OPENGL_3 SDL_GPU_DISABLE_OPENGL_4) endif() @@ -413,7 +432,7 @@ target_include_directories(sdlgpu PRIVATE ${THIRDPARTY_DIR}/sdl-gpu/src/external target_include_directories(sdlgpu PRIVATE ${THIRDPARTY_DIR}/sdl-gpu/src/externals/glew/GL) target_include_directories(sdlgpu PRIVATE ${THIRDPARTY_DIR}/sdl-gpu/src/externals/stb_image) target_include_directories(sdlgpu PRIVATE ${THIRDPARTY_DIR}/sdl-gpu/src/externals/stb_image_write) -target_include_directories(sdlgpu PRIVATE ${THIRDPARTY_DIR}/SDL2-2.0.8/include) +target_include_directories(sdlgpu PRIVATE ${THIRDPARTY_DIR}/sdl2/include) if(WIN32) target_link_libraries(sdlgpu opengl32) @@ -424,9 +443,26 @@ if(LINUX) endif() if(APPLE) - FIND_LIBRARY(OPENGL_LIBRARY OpenGL) + find_library(OPENGL_LIBRARY OpenGL) target_link_libraries(sdlgpu ${OPENGL_LIBRARY}) endif() + +if(ANDROID) + find_library( ANDROID_LOG_LIBRARY log ) + find_library( ANDROID_GLES2_LIBRARY GLESv2 ) + find_library( ANDROID_GLES1_LIBRARY GLESv1_CM ) + target_link_libraries(sdlgpu + ${ANDROID_LOG_LIBRARY} + ${ANDROID_GLES2_LIBRARY} + ${ANDROID_GLES1_LIBRARY} + ) +endif() + +if(NOT EMSCRIPTEN) + add_dependencies(sdlgpu SDL2-static) + target_link_libraries(sdlgpu SDL2-static) +endif() + endif() ################################ @@ -442,7 +478,7 @@ set(SDLNET_SRC ) add_library(sdlnet STATIC ${SDLNET_SRC}) -target_include_directories(sdlnet PRIVATE ${THIRDPARTY_DIR}/SDL2-2.0.8/include) +target_include_directories(sdlnet PRIVATE ${THIRDPARTY_DIR}/sdl2/include) if(WIN32) target_link_libraries(sdlnet ws2_32) @@ -474,7 +510,7 @@ add_library(zlib STATIC ${ZLIB_SRC}) # bin2txt ################################ -if(NOT EMSCRIPTEN AND BUILD_DEMO_CARTS) +if(BUILD_DEMO_CARTS) set(BIN2TXT_DIR ${CMAKE_SOURCE_DIR}/tools/bin2txt) set(BIN2TXT_SRC ${BIN2TXT_DIR}/bin2txt.c @@ -563,10 +599,6 @@ foreach(TIC80_OUTPUT ${TIC80_OUTPUTS}) add_dependencies(${TIC80_OUTPUT}lib tic80core zlib) target_link_libraries(${TIC80_OUTPUT}lib tic80core zlib) - if(BUILD_DEMO_CARTS) - target_compile_definitions(${TIC80_OUTPUT}lib PUBLIC BUILD_DEMO_CARTS) - endif() - endforeach() if(BUILD_PRO) @@ -597,9 +629,15 @@ foreach(TIC80_OUTPUT ${TIC80_OUTPUTS}) add_executable(${TIC80_OUTPUT} ${SYSTEM_TYPE} ${TIC80_SRC}) elseif(APPLE) - add_executable(${TIC80_OUTPUT} MACOSX_BUNDLE ${TIC80_SRC} build/macosx/tic80.icns) - set_source_files_properties(build/macosx/tic80.icns PROPERTIES MACOSX_PACKAGE_LOCATION RESOURCES) - set_target_properties(${TIC80_OUTPUT} PROPERTIES MACOSX_BUNDLE_INFO_PLIST build/macosx/${TIC80_OUTPUT}.plist) + add_executable(${TIC80_OUTPUT} MACOSX_BUNDLE ${TIC80_SRC} ${CMAKE_SOURCE_DIR}/build/macosx/tic80.icns) + set_source_files_properties(${CMAKE_SOURCE_DIR}/build/macosx/tic80.icns PROPERTIES MACOSX_PACKAGE_LOCATION RESOURCES) + set_target_properties(${TIC80_OUTPUT} PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_SOURCE_DIR}/build/macosx/${TIC80_OUTPUT}.plist) + elseif(ANDROID) + + set(TIC80_SRC ${TIC80_SRC} ${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c) + + add_library(${TIC80_OUTPUT} SHARED ${TIC80_SRC}) + target_link_libraries(${TIC80_OUTPUT} hidapi) else() add_executable(${TIC80_OUTPUT} ${TIC80_SRC}) endif() @@ -607,7 +645,7 @@ foreach(TIC80_OUTPUT ${TIC80_OUTPUTS}) target_include_directories(${TIC80_OUTPUT} PRIVATE ${CMAKE_SOURCE_DIR}/include) target_include_directories(${TIC80_OUTPUT} PRIVATE ${CMAKE_SOURCE_DIR}/src) target_include_directories(${TIC80_OUTPUT} PRIVATE ${THIRDPARTY_DIR}/SDL2_net-2.0.1) - target_include_directories(${TIC80_OUTPUT} PRIVATE ${THIRDPARTY_DIR}/SDL2-2.0.8/include) + target_include_directories(${TIC80_OUTPUT} PRIVATE ${THIRDPARTY_DIR}/sdl2/include) target_include_directories(${TIC80_OUTPUT} PRIVATE ${THIRDPARTY_DIR}/sdl-gpu/include) @@ -616,10 +654,10 @@ foreach(TIC80_OUTPUT ${TIC80_OUTPUTS}) endif() if(EMSCRIPTEN) - set_target_properties(${TIC80_OUTPUT} PROPERTIES LINK_FLAGS "-s WASM=1 -s USE_SDL=2 -s TOTAL_MEMORY=67108864 --pre-js build/html/prejs.js") - else() - add_dependencies(${TIC80_OUTPUT} SDL2main SDL2-static) - target_link_libraries(${TIC80_OUTPUT} SDL2-static SDL2main) + set_target_properties(${TIC80_OUTPUT} PROPERTIES LINK_FLAGS "-s WASM=1 -s USE_SDL=2 -s TOTAL_MEMORY=67108864 --pre-js ${CMAKE_SOURCE_DIR}/build/html/prejs.js") + elseif(NOT ANDROID) + add_dependencies(${TIC80_OUTPUT} SDL2main) + target_link_libraries(${TIC80_OUTPUT} SDL2main) endif() add_dependencies(${TIC80_OUTPUT} ${TIC80_OUTPUT}lib sdlnet sdlgpu) @@ -664,9 +702,9 @@ foreach(TIC80_OUTPUT ${TIC80_OUTPUTS}) add_executable(${TIC80_OUTPUT}-sokol ${SYSTEM_TYPE} ${TIC80_SRC}) elseif(APPLE) - add_executable(${TIC80_OUTPUT}-sokol MACOSX_BUNDLE ${TIC80_SRC} build/macosx/tic80.icns) - set_source_files_properties(build/macosx/tic80.icns PROPERTIES MACOSX_PACKAGE_LOCATION RESOURCES) - set_target_properties(${TIC80_OUTPUT}-sokol PROPERTIES MACOSX_BUNDLE_INFO_PLIST build/macosx/${TIC80_OUTPUT}-sokol.plist) + add_executable(${TIC80_OUTPUT}-sokol MACOSX_BUNDLE ${TIC80_SRC} ${CMAKE_SOURCE_DIR}/build/macosx/tic80.icns) + set_source_files_properties(${CMAKE_SOURCE_DIR}/build/macosx/tic80.icns PROPERTIES MACOSX_PACKAGE_LOCATION RESOURCES) + set_target_properties(${TIC80_OUTPUT}-sokol PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_SOURCE_DIR}/build/macosx/${TIC80_OUTPUT}-sokol.plist) else() add_executable(${TIC80_OUTPUT}-sokol ${TIC80_SRC}) endif() @@ -674,7 +712,7 @@ foreach(TIC80_OUTPUT ${TIC80_OUTPUTS}) target_include_directories(${TIC80_OUTPUT}-sokol PRIVATE ${CMAKE_SOURCE_DIR}/include) target_include_directories(${TIC80_OUTPUT}-sokol PRIVATE ${CMAKE_SOURCE_DIR}/src) target_include_directories(${TIC80_OUTPUT}-sokol PRIVATE ${THIRDPARTY_DIR}/SDL2_net-2.0.1) - target_include_directories(${TIC80_OUTPUT}-sokol PRIVATE ${THIRDPARTY_DIR}/SDL2-2.0.8/include) + target_include_directories(${TIC80_OUTPUT}-sokol PRIVATE ${THIRDPARTY_DIR}/sdl2/include) target_include_directories(${TIC80_OUTPUT}-sokol PRIVATE ${THIRDPARTY_DIR}/sokol) diff --git a/appveyor.yml b/appveyor.yml index 0c3fd33d..eb76710f 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -15,13 +15,14 @@ install: - if [%COMPILER%]==[MinGW-w64] set PATH=C:\mingw-w64\x86_64-7.3.0-posix-seh-rt_v5-rev0\mingw64\bin;%PATH% build_script: - - if [%COMPILER%]==[MinGW-w64] cmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=%BUILD_TYPE% -DCMAKE_SH=CMAKE_SH-NOTFOUND . - - if [%COMPILER%]==[MSVC] cmake -G "Visual Studio 14 2015" -DCMAKE_BUILD_TYPE=%BUILD_TYPE% . - - if [%COMPILER%]==[MSVC64] cmake -G "Visual Studio 14 2015 Win64" -DCMAKE_BUILD_TYPE=%BUILD_TYPE% . + - mkdir out && cd out + - if [%COMPILER%]==[MinGW-w64] cmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=%BUILD_TYPE% -DCMAKE_SH=CMAKE_SH-NOTFOUND .. + - if [%COMPILER%]==[MSVC] cmake -G "Visual Studio 14 2015" -DCMAKE_BUILD_TYPE=%BUILD_TYPE% .. + - if [%COMPILER%]==[MSVC64] cmake -G "Visual Studio 14 2015 Win64" -DCMAKE_BUILD_TYPE=%BUILD_TYPE% .. - cmake --build . --parallel --config %BUILD_TYPE% after_build: - 7z a tic80.zip %APPVEYOR_BUILD_FOLDER%\bin\tic80.exe + 7z a tic80.zip %APPVEYOR_BUILD_FOLDER%\out\bin\tic80.exe on_success: - ps: $env:DATE=[TimeZoneInfo]::ConvertTimeBySystemTimeZoneId([DateTime]::UtcNow, "Belarus Standard Time").ToString('yyyy.MM.dd') diff --git a/build/android/ant.properties b/build/android/ant.properties deleted file mode 100644 index 92433717..00000000 --- a/build/android/ant.properties +++ /dev/null @@ -1,24 +0,0 @@ -# This file is used to override default values used by the Ant build system. -# -# This file must be checked into Version Control Systems, as it is -# integral to the build system of your project. - -# This file is only used by the Ant script. - -# You can use this to override default values such as -# 'source.dir' for the location of your java source folder and -# 'out.dir' for the location of your output folder. - -# You can also use it define how the release builds are signed by declaring -# the following properties: -# 'key.store' for the location of your keystore and -# 'key.alias' for the name of the key to use. -# The password will be asked during the build when you use the 'release' target. - -key.store=my-release-key.keystore -key.store.password = 123456 -key.alias=alias_name -key.alias.password = 123456 - -java.source=8 -java.target=8 diff --git a/build/android/app/build.gradle b/build/android/app/build.gradle new file mode 100644 index 00000000..97de7c7b --- /dev/null +++ b/build/android/app/build.gradle @@ -0,0 +1,73 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 26 + defaultConfig { + applicationId 'com.nesbox.tic' + minSdkVersion 16 + targetSdkVersion 26 + versionCode 8000 + versionName '0.80.0' + } + + signingConfigs { + + release { + storeFile file(RELEASE_STORE_FILE) + storePassword RELEASE_STORE_PASSWORD + keyAlias RELEASE_KEY_ALIAS + keyPassword RELEASE_KEY_PASSWORD + } + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), + 'proguard-rules.pro' + signingConfig signingConfigs.release + } + } + externalNativeBuild { + cmake { + path '../../../CMakeLists.txt' + } + } + + flavorDimensions 'cpuArch' + productFlavors { + // arm7 { + // dimension 'cpuArch' + // ndk { + // abiFilter 'armeabi-v7a' + // } + // } + // arm8 { + // dimension 'cpuArch' + // ndk { + // abiFilters 'arm64-v8a' + // } + // } + // x86 { + // dimension 'cpuArch' + // ndk { + // abiFilter 'x86' + // } + // } + // x86_64 { + // dimension 'cpuArch' + // ndk { + // abiFilter 'x86_64' + // } + // } + universal { + dimension 'cpuArch' + // include all default ABIs. with NDK-r16, it is: + // armeabi-v7a, arm64-v8a, x86, x86_64 + } + } +} + +dependencies { + compile fileTree(include: ['*.jar'], dir: 'libs') +} diff --git a/build/android/proguard-project.txt b/build/android/app/proguard-rules.pro similarity index 62% rename from build/android/proguard-project.txt rename to build/android/app/proguard-rules.pro index f2fe1559..b7420a70 100644 --- a/build/android/proguard-project.txt +++ b/build/android/app/proguard-rules.pro @@ -1,11 +1,8 @@ -# 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. +# in /Users/gfan/dev/sdk_current/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. # # For more details, see # http://developer.android.com/guide/developing/tools/proguard.html diff --git a/build/android/AndroidManifest.xml b/build/android/app/src/main/AndroidManifest.xml similarity index 78% rename from build/android/AndroidManifest.xml rename to build/android/app/src/main/AndroidManifest.xml index e3310350..e7dc6866 100644 --- a/build/android/AndroidManifest.xml +++ b/build/android/app/src/main/AndroidManifest.xml @@ -4,18 +4,20 @@ --> - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/build/android/default.properties b/build/android/default.properties deleted file mode 100644 index 0a69b774..00000000 --- a/build/android/default.properties +++ /dev/null @@ -1,11 +0,0 @@ -# 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 use, -# "build.properties", and override values to adapt the script to your -# project structure. - -# Project target. -target=android-16 diff --git a/build/android/gradle.properties b/build/android/gradle.properties new file mode 100644 index 00000000..c94f459b --- /dev/null +++ b/build/android/gradle.properties @@ -0,0 +1,22 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx1536m + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true + +RELEASE_STORE_FILE=../my-release-key.keystore +RELEASE_STORE_PASSWORD=123456 +RELEASE_KEY_ALIAS=alias_name +RELEASE_KEY_PASSWORD=123456 diff --git a/build/android/gradle/wrapper/gradle-wrapper.jar b/build/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..13372aef5e24af05341d49695ee84e5f9b594659 GIT binary patch literal 53636 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ⅅ8zCNKueM5c!$)^mKpZNR!eIlFST57ePGQcqCqedAQ3UaUEzpjM--5V4YO zY22VxQm%$2NDnwfK+jkz=i2>NjAM6&P1DdcO<*Xs1-lzdXWn#LGSxwhPH7N%D8-zCgpFWt@`LgNYI+Fh^~nSiQmwH0^>E>*O$47MqfQza@Ce z1wBw;igLc#V2@y-*~Hp?jA1)+MYYyAt|DV_8RQCrRY@sAviO}wv;3gFdO>TE(=9o? z=S(r=0oT`w24=ihA=~iFV5z$ZG74?rmYn#eanx(!Hkxcr$*^KRFJKYYB&l6$WVsJ^ z-Iz#HYmE)Da@&seqG1fXsTER#adA&OrD2-T(z}Cwby|mQf{0v*v3hq~pzF`U`jenT z=XHXeB|fa?Ws$+9ADO0rco{#~+`VM?IXg7N>M0w1fyW1iiKTA@p$y zSiAJ%-Mg{m>&S4r#Tw@?@7ck}#oFo-iZJCWc`hw_J$=rw?omE{^tc59ftd`xq?jzf zo0bFUI=$>O!45{!c4?0KsJmZ#$vuYpZLo_O^oHTmmLMm0J_a{Nn`q5tG1m=0ecv$T z5H7r0DZGl6be@aJ+;26EGw9JENj0oJ5K0=^f-yBW2I0jqVIU};NBp*gF7_KlQnhB6 z##d$H({^HXj@il`*4^kC42&3)(A|tuhs;LygA-EWFSqpe+%#?6HG6}mE215Z4mjO2 zY2^?5$<8&k`O~#~sSc5Fy`5hg5#e{kG>SAbTxCh{y32fHkNryU_c0_6h&$zbWc63T z7|r?X7_H!9XK!HfZ+r?FvBQ$x{HTGS=1VN<>Ss-7M3z|vQG|N}Frv{h-q623@Jz*@ ziXlZIpAuY^RPlu&=nO)pFhML5=ut~&zWDSsn%>mv)!P1|^M!d5AwmSPIckoY|0u9I zTDAzG*U&5SPf+@c_tE_I!~Npfi$?gX(kn=zZd|tUZ_ez(xP+)xS!8=k(<{9@<+EUx zYQgZhjn(0qA#?~Q+EA9oh_Jx5PMfE3#KIh#*cFIFQGi)-40NHbJO&%ZvL|LAqU=Rw zf?Vr4qkUcKtLr^g-6*N-tfk+v8@#Lpl~SgKyH!+m9?T8B>WDWK22;!i5&_N=%f{__ z-LHb`v-LvKqTJZCx~z|Yg;U_f)VZu~q7trb%C6fOKs#eJosw&b$nmwGwP;Bz`=zK4 z>U3;}T_ptP)w=vJaL8EhW;J#SHA;fr13f=r#{o)`dRMOs-T;lp&Toi@u^oB_^pw=P zp#8Geo2?@!h2EYHY?L;ayT}-Df0?TeUCe8Cto{W0_a>!7Gxmi5G-nIIS;X{flm2De z{SjFG%knZoVa;mtHR_`*6)KEf=dvOT3OgT7C7&-4P#4X^B%VI&_57cBbli()(%zZC?Y0b;?5!f22UleQ=9h4_LkcA!Xsqx@q{ko&tvP_V@7epFs}AIpM{g??PA>U(sk$Gum>2Eu zD{Oy{$OF%~?B6>ixQeK9I}!$O0!T3#Ir8MW)j2V*qyJ z8Bg17L`rg^B_#rkny-=<3fr}Y42+x0@q6POk$H^*p3~Dc@5uYTQ$pfaRnIT}Wxb;- zl!@kkZkS=l)&=y|21veY8yz$t-&7ecA)TR|=51BKh(@n|d$EN>18)9kSQ|GqP?aeM ztXd9C&Md$PPF*FVs*GhoHM2L@D$(Qf%%x zwQBUt!jM~GgwluBcwkgwQ!249uPkNz3u@LSYZgmpHgX|P#8!iKk^vSKZ;?)KE$92d z2U>y}VWJ0&zjrIqddM3dz-nU%>bL&KU%SA|LiiUU7Ka|c=jF|vQ1V)Jz`JZe*j<5U6~RVuBEVJoY~ z&GE+F$f>4lN=X4-|9v*5O*Os>>r87u z!_1NSV?_X&HeFR1fOFb8_P)4lybJ6?1BWK`Tv2;4t|x1<#@17UO|hLGnrB%nu)fDk zfstJ4{X4^Y<8Lj<}g2^kksSefQTMuTo?tJLCh zC~>CR#a0hADw!_Vg*5fJwV{~S(j8)~sn>Oyt(ud2$1YfGck77}xN@3U_#T`q)f9!2 zf>Ia;Gwp2_C>WokU%(z2ec8z94pZyhaK+e>3a9sj^-&*V494;p9-xk+u1Jn#N_&xs z59OI2w=PuTErv|aNcK*>3l^W*p3}fjXJjJAXtBA#%B(-0--s;1U#f8gFYW!JL+iVG zV0SSx5w8eVgE?3Sg@eQv)=x<+-JgpVixZQNaZr}3b8sVyVs$@ndkF5FYKka@b+YAh z#nq_gzlIDKEs_i}H4f)(VQ!FSB}j>5znkVD&W0bOA{UZ7h!(FXrBbtdGA|PE1db>s z$!X)WY)u#7P8>^7Pjjj-kXNBuJX3(pJVetTZRNOnR5|RT5D>xmwxhAn)9KF3J05J; z-Mfb~dc?LUGqozC2p!1VjRqUwwDBnJhOua3vCCB-%ykW_ohSe?$R#dz%@Gym-8-RA zjMa_SJSzIl8{9dV+&63e9$4;{=1}w2=l+_j_Dtt@<(SYMbV-18&%F@Zl7F_5! z@xwJ0wiDdO%{}j9PW1(t+8P7Ud79yjY>x>aZYWJL_NI?bI6Y02`;@?qPz_PRqz(7v``20`- z033Dy|4;y6di|>cz|P-z|6c&3f&g^OAt8aN0Zd&0yZ>dq2aFCsE<~Ucf$v{sL=*++ zBxFSa2lfA+Y%U@B&3D=&CBO&u`#*nNc|PCY7XO<}MnG0VR764XrHtrb5zwC*2F!Lp zE<~Vj0;z!S-|3M4DFxuQ=`ShTf28<9p!81(0hFbGNqF%0gg*orez9!qt8e%o@Yfl@ zhvY}{@3&f??}7<`p>FyU;7?VkKbh8_=csozU=|fH&szgZ{=NDCylQ>EH^x5!K3~-V z)_2Y>0uJ`Z0Pb58y`RL+&n@m9tJ)O<%q#&u#DAIt+-rRt0eSe1MTtMl@W)H$b3D)@ z*A-1bUgZI)>HdcI4&W>P4W5{-j=s5p5`cbQ+{(g0+RDnz!TR^mxSLu_y#SDVKrj8i zA^hi6>jMGM;`$9Vfb-Yf!47b)Ow`2OKtNB=z|Kxa$5O}WPo;(Dc^`q(7X8kkeFyO8 z{XOq^07=u|7*P2`m;>PIFf=i80MKUxsN{d2cX0M+REsE*20+WQ79T9&cqT>=I_U% z{=8~^Isg(Nzo~`4iQfIb_#CVCD>#5h>=-Z#5dH}WxYzn%0)GAm6L2WdUdP=0_h>7f z(jh&7%1i(ZOn+}D8$iGK4Vs{pmHl_w4Qm-46H9>4^{3dz^DZDh+dw)6Xd@CpQNK$j z{CU;-cmpK=egplZ3y3%y=sEnCJ^eYVKXzV8H2_r*fJ*%*B;a1_lOpt6)IT1IAK2eB z{rie|uDJUrbgfUE>~C>@RO|m5ex55F{=~Bb4Cucp{ok7Yf9V}QuZ`#Gc|WaqsQlK- zKaV)iMRR__&Ak2Z=IM9R9g5$WM4u{a^C-7uX*!myEym z#_#p^T!P~#Dx$%^K>Y_nj_3J*E_LwJ60-5Xu=LkJAwcP@|0;a&+|+ZX`Jbj9P5;T% z|KOc}4*#4o{U?09`9Hz`Xo-I!P=9XfIrr*MQ}y=$!qgv?_J38^bNb4kM&_OVg^_=Eu-qG5U(fw0KMgH){C8pazq~51rN97hf#20-7=aK0)N|UM H-+%o-(+5aQ literal 0 HcmV?d00001 diff --git a/build/android/gradle/wrapper/gradle-wrapper.properties b/build/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..5dd6067c --- /dev/null +++ b/build/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Mon Oct 30 21:37:25 PDT 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip diff --git a/build/android/gradlew b/build/android/gradlew new file mode 100644 index 00000000..9d82f789 --- /dev/null +++ b/build/android/gradlew @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/build/android/gradlew.bat b/build/android/gradlew.bat new file mode 100644 index 00000000..8a0b282a --- /dev/null +++ b/build/android/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/build/android/jni/Android.mk b/build/android/jni/Android.mk deleted file mode 100644 index 5053e7d6..00000000 --- a/build/android/jni/Android.mk +++ /dev/null @@ -1 +0,0 @@ -include $(call all-subdir-makefiles) diff --git a/build/android/jni/Application.mk b/build/android/jni/Application.mk deleted file mode 100644 index 401324f0..00000000 --- a/build/android/jni/Application.mk +++ /dev/null @@ -1,9 +0,0 @@ - -# Uncomment this if you're using STL in your project -# See CPLUSPLUS-SUPPORT.html in the NDK documentation for more information -# APP_STL := stlport_static - -APP_ABI := armeabi-v7a x86 - -# Min SDK level -APP_PLATFORM=android-14 diff --git a/build/android/jni/SDL2/Android.mk b/build/android/jni/SDL2/Android.mk deleted file mode 100644 index ce1241e8..00000000 --- a/build/android/jni/SDL2/Android.mk +++ /dev/null @@ -1,6 +0,0 @@ -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) -LOCAL_MODULE := SDL2 -LOCAL_SRC_FILES := ../../../../3rd-party/pre-built/android/sdl2/$(TARGET_ARCH_ABI)/libSDL2.so -include $(PREBUILT_SHARED_LIBRARY) diff --git a/build/android/jni/gif/Android.mk b/build/android/jni/gif/Android.mk deleted file mode 100644 index d1c17583..00000000 --- a/build/android/jni/gif/Android.mk +++ /dev/null @@ -1,6 +0,0 @@ -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) -LOCAL_MODULE := gif -LOCAL_SRC_FILES := ../../../../3rd-party/pre-built/android/gif/$(TARGET_ARCH_ABI)/libgif.so -include $(PREBUILT_SHARED_LIBRARY) diff --git a/build/android/jni/lua/Android.mk b/build/android/jni/lua/Android.mk deleted file mode 100644 index 1ec602a1..00000000 --- a/build/android/jni/lua/Android.mk +++ /dev/null @@ -1,6 +0,0 @@ -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) -LOCAL_MODULE := lua -LOCAL_SRC_FILES := ../../../../3rd-party/pre-built/android/lua/$(TARGET_ARCH_ABI)/liblua.so -include $(PREBUILT_SHARED_LIBRARY) diff --git a/build/android/jni/sdlgpu/Android.mk b/build/android/jni/sdlgpu/Android.mk deleted file mode 100644 index 3dd94188..00000000 --- a/build/android/jni/sdlgpu/Android.mk +++ /dev/null @@ -1,6 +0,0 @@ -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) -LOCAL_MODULE := sdlgpu -LOCAL_SRC_FILES := ../../../../3rd-party/pre-built/android/sdlgpu/$(TARGET_ARCH_ABI)/libsdlgpu.so -include $(PREBUILT_SHARED_LIBRARY) diff --git a/build/android/jni/src/Android.mk b/build/android/jni/src/Android.mk deleted file mode 100644 index 576a8dc1..00000000 --- a/build/android/jni/src/Android.mk +++ /dev/null @@ -1,64 +0,0 @@ -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) -LOCAL_CFLAGS += -O3 -Wall -std=gnu99 -D"log2(x)=(log(x)/log(2))" -LOCAL_MODULE := main - -SRC_PATH := ../../../../src -THIRD_PARTY_PATH := ../../../../3rd-party - -LOCAL_C_INCLUDES := \ - $(LOCAL_PATH)/$(THIRD_PARTY_PATH)/SDL2-2.0.7/include \ - $(LOCAL_PATH)/$(THIRD_PARTY_PATH)/lua-5.3.1/src \ - $(LOCAL_PATH)/$(THIRD_PARTY_PATH)/giflib-5.1.4/lib \ - $(LOCAL_PATH)/$(THIRD_PARTY_PATH)/zlib-1.2.8 \ - $(LOCAL_PATH)/$(THIRD_PARTY_PATH)/duktape/src \ - $(LOCAL_PATH)/$(THIRD_PARTY_PATH)/blip-buf \ - $(LOCAL_PATH)/$(THIRD_PARTY_PATH)/SDL2_net-2.0.1 \ - $(LOCAL_PATH)/$(THIRD_PARTY_PATH)/moonscript \ - $(LOCAL_PATH)/$(THIRD_PARTY_PATH)/wren/src/include \ - $(LOCAL_PATH)/$(THIRD_PARTY_PATH)/sdl-gpu/include \ - $(LOCAL_PATH)/$(THIRD_PARTY_PATH)/fennel \ - $(LOCAL_PATH)/../../../../include - -# Add your application source files here... -LOCAL_SRC_FILES := \ - $(THIRD_PARTY_PATH)/duktape/src/duktape.c \ - $(THIRD_PARTY_PATH)/blip-buf/blip_buf.c \ - $(THIRD_PARTY_PATH)/SDL2_net-2.0.1/SDLnet.c \ - $(THIRD_PARTY_PATH)/SDL2_net-2.0.1/SDLnetTCP.c \ - $(THIRD_PARTY_PATH)/SDL2_net-2.0.1/SDLnetselect.c \ - $(SRC_PATH)/studio.c \ - $(SRC_PATH)/console.c \ - $(SRC_PATH)/html.c \ - $(SRC_PATH)/run.c \ - $(SRC_PATH)/ext/file_dialog.c \ - $(SRC_PATH)/ext/md5.c \ - $(SRC_PATH)/ext/gif.c \ - $(SRC_PATH)/fs.c \ - $(SRC_PATH)/tools.c \ - $(SRC_PATH)/start.c \ - $(SRC_PATH)/sprite.c \ - $(SRC_PATH)/map.c \ - $(SRC_PATH)/sfx.c \ - $(SRC_PATH)/music.c \ - $(SRC_PATH)/history.c \ - $(SRC_PATH)/world.c \ - $(SRC_PATH)/code.c \ - $(SRC_PATH)/config.c \ - $(SRC_PATH)/net.c \ - $(SRC_PATH)/luaapi.c \ - $(SRC_PATH)/jsapi.c \ - $(SRC_PATH)/wrenapi.c \ - $(SRC_PATH)/tic.c \ - $(SRC_PATH)/dialog.c \ - $(SRC_PATH)/menu.c \ - $(SRC_PATH)/surf.c \ - $(SRC_PATH)/tic80.c \ - $(SRC_PATH)/system.c - -LOCAL_SHARED_LIBRARIES := SDL2 lua z gif wren sdlgpu - -LOCAL_LDLIBS := -lGLESv1_CM -lGLESv2 -llog - -include $(BUILD_SHARED_LIBRARY) diff --git a/build/android/jni/src/Android_static.mk b/build/android/jni/src/Android_static.mk deleted file mode 100644 index faed669c..00000000 --- a/build/android/jni/src/Android_static.mk +++ /dev/null @@ -1,12 +0,0 @@ -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) - -LOCAL_MODULE := main - -LOCAL_SRC_FILES := YourSourceHere.c - -LOCAL_STATIC_LIBRARIES := SDL2_static - -include $(BUILD_SHARED_LIBRARY) -$(call import-module,SDL)LOCAL_PATH := $(call my-dir) diff --git a/build/android/jni/wren/Android.mk b/build/android/jni/wren/Android.mk deleted file mode 100644 index 1e101a6c..00000000 --- a/build/android/jni/wren/Android.mk +++ /dev/null @@ -1,6 +0,0 @@ -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) -LOCAL_MODULE := wren -LOCAL_SRC_FILES := ../../../../3rd-party/pre-built/android/wren/$(TARGET_ARCH_ABI)/libwren.so -include $(PREBUILT_SHARED_LIBRARY) diff --git a/build/android/jni/zlib/Android.mk b/build/android/jni/zlib/Android.mk deleted file mode 100644 index 605795de..00000000 --- a/build/android/jni/zlib/Android.mk +++ /dev/null @@ -1,6 +0,0 @@ -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) -LOCAL_MODULE := z -LOCAL_SRC_FILES := ../../../../3rd-party/pre-built/android/zlib/$(TARGET_ARCH_ABI)/libz.so -include $(PREBUILT_SHARED_LIBRARY) diff --git a/build/android/project.properties b/build/android/project.properties deleted file mode 100644 index 9b84a6b4..00000000 --- a/build/android/project.properties +++ /dev/null @@ -1,14 +0,0 @@ -# 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-16 diff --git a/build/android/settings.gradle b/build/android/settings.gradle new file mode 100644 index 00000000..e7b4def4 --- /dev/null +++ b/build/android/settings.gradle @@ -0,0 +1 @@ +include ':app' diff --git a/build/android/src/org/libsdl/app/SDL.java b/build/android/src/org/libsdl/app/SDL.java deleted file mode 100644 index cfe48309..00000000 --- a/build/android/src/org/libsdl/app/SDL.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.libsdl.app; - -import android.content.Context; - -/** - SDL library initialization -*/ -public class SDL { - - // This function should be called first and sets up the native code - // so it can call into the Java classes - public static void setupJNI() { - SDLActivity.nativeSetupJNI(); - SDLAudioManager.nativeSetupJNI(); - SDLControllerManager.nativeSetupJNI(); - } - - // This function should be called each time the activity is started - public static void initialize() { - setContext(null); - - SDLActivity.initialize(); - SDLAudioManager.initialize(); - SDLControllerManager.initialize(); - } - - // This function stores the current activity (SDL or not) - public static void setContext(Context context) { - mContext = context; - } - - public static Context getContext() { - return mContext; - } - - protected static Context mContext; -} diff --git a/build/android/src/org/libsdl/app/SDLAudioManager.java b/build/android/src/org/libsdl/app/SDLAudioManager.java deleted file mode 100644 index 26baf822..00000000 --- a/build/android/src/org/libsdl/app/SDLAudioManager.java +++ /dev/null @@ -1,178 +0,0 @@ -package org.libsdl.app; - -import android.media.*; -import android.util.Log; - -public class SDLAudioManager -{ - protected static final String TAG = "SDLAudio"; - - protected static AudioTrack mAudioTrack; - protected static AudioRecord mAudioRecord; - - public static void initialize() { - mAudioTrack = null; - mAudioRecord = null; - } - - // Audio - - /** - * This method is called by SDL using JNI. - */ - public static int audioOpen(int sampleRate, boolean is16Bit, boolean isStereo, int desiredFrames) { - int channelConfig = isStereo ? AudioFormat.CHANNEL_CONFIGURATION_STEREO : AudioFormat.CHANNEL_CONFIGURATION_MONO; - int audioFormat = is16Bit ? AudioFormat.ENCODING_PCM_16BIT : AudioFormat.ENCODING_PCM_8BIT; - int frameSize = (isStereo ? 2 : 1) * (is16Bit ? 2 : 1); - - Log.v(TAG, "SDL audio: wanted " + (isStereo ? "stereo" : "mono") + " " + (is16Bit ? "16-bit" : "8-bit") + " " + (sampleRate / 1000f) + "kHz, " + desiredFrames + " frames buffer"); - - // Let the user pick a larger buffer if they really want -- but ye - // gods they probably shouldn't, the minimums are horrifyingly high - // latency already - desiredFrames = Math.max(desiredFrames, (AudioTrack.getMinBufferSize(sampleRate, channelConfig, audioFormat) + frameSize - 1) / frameSize); - - if (mAudioTrack == null) { - mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, - channelConfig, audioFormat, desiredFrames * frameSize, AudioTrack.MODE_STREAM); - - // Instantiating AudioTrack can "succeed" without an exception and the track may still be invalid - // Ref: https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/media/java/android/media/AudioTrack.java - // Ref: http://developer.android.com/reference/android/media/AudioTrack.html#getState() - - if (mAudioTrack.getState() != AudioTrack.STATE_INITIALIZED) { - Log.e(TAG, "Failed during initialization of Audio Track"); - mAudioTrack = null; - return -1; - } - - mAudioTrack.play(); - } - - Log.v(TAG, "SDL audio: got " + ((mAudioTrack.getChannelCount() >= 2) ? "stereo" : "mono") + " " + ((mAudioTrack.getAudioFormat() == AudioFormat.ENCODING_PCM_16BIT) ? "16-bit" : "8-bit") + " " + (mAudioTrack.getSampleRate() / 1000f) + "kHz, " + desiredFrames + " frames buffer"); - - return 0; - } - - /** - * This method is called by SDL using JNI. - */ - public static void audioWriteShortBuffer(short[] buffer) { - if (mAudioTrack == null) { - Log.e(TAG, "Attempted to make audio call with uninitialized audio!"); - return; - } - - for (int i = 0; i < buffer.length; ) { - int result = mAudioTrack.write(buffer, i, buffer.length - i); - if (result > 0) { - i += result; - } else if (result == 0) { - try { - Thread.sleep(1); - } catch(InterruptedException e) { - // Nom nom - } - } else { - Log.w(TAG, "SDL audio: error return from write(short)"); - return; - } - } - } - - /** - * This method is called by SDL using JNI. - */ - public static void audioWriteByteBuffer(byte[] buffer) { - if (mAudioTrack == null) { - Log.e(TAG, "Attempted to make audio call with uninitialized audio!"); - return; - } - - for (int i = 0; i < buffer.length; ) { - int result = mAudioTrack.write(buffer, i, buffer.length - i); - if (result > 0) { - i += result; - } else if (result == 0) { - try { - Thread.sleep(1); - } catch(InterruptedException e) { - // Nom nom - } - } else { - Log.w(TAG, "SDL audio: error return from write(byte)"); - return; - } - } - } - - /** - * This method is called by SDL using JNI. - */ - public static int captureOpen(int sampleRate, boolean is16Bit, boolean isStereo, int desiredFrames) { - int channelConfig = isStereo ? AudioFormat.CHANNEL_CONFIGURATION_STEREO : AudioFormat.CHANNEL_CONFIGURATION_MONO; - int audioFormat = is16Bit ? AudioFormat.ENCODING_PCM_16BIT : AudioFormat.ENCODING_PCM_8BIT; - int frameSize = (isStereo ? 2 : 1) * (is16Bit ? 2 : 1); - - Log.v(TAG, "SDL capture: wanted " + (isStereo ? "stereo" : "mono") + " " + (is16Bit ? "16-bit" : "8-bit") + " " + (sampleRate / 1000f) + "kHz, " + desiredFrames + " frames buffer"); - - // Let the user pick a larger buffer if they really want -- but ye - // gods they probably shouldn't, the minimums are horrifyingly high - // latency already - desiredFrames = Math.max(desiredFrames, (AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat) + frameSize - 1) / frameSize); - - if (mAudioRecord == null) { - mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, sampleRate, - channelConfig, audioFormat, desiredFrames * frameSize); - - // see notes about AudioTrack state in audioOpen(), above. Probably also applies here. - if (mAudioRecord.getState() != AudioRecord.STATE_INITIALIZED) { - Log.e(TAG, "Failed during initialization of AudioRecord"); - mAudioRecord.release(); - mAudioRecord = null; - return -1; - } - - mAudioRecord.startRecording(); - } - - Log.v(TAG, "SDL capture: got " + ((mAudioRecord.getChannelCount() >= 2) ? "stereo" : "mono") + " " + ((mAudioRecord.getAudioFormat() == AudioFormat.ENCODING_PCM_16BIT) ? "16-bit" : "8-bit") + " " + (mAudioRecord.getSampleRate() / 1000f) + "kHz, " + desiredFrames + " frames buffer"); - - return 0; - } - - /** This method is called by SDL using JNI. */ - public static int captureReadShortBuffer(short[] buffer, boolean blocking) { - // !!! FIXME: this is available in API Level 23. Until then, we always block. :( - //return mAudioRecord.read(buffer, 0, buffer.length, blocking ? AudioRecord.READ_BLOCKING : AudioRecord.READ_NON_BLOCKING); - return mAudioRecord.read(buffer, 0, buffer.length); - } - - /** This method is called by SDL using JNI. */ - public static int captureReadByteBuffer(byte[] buffer, boolean blocking) { - // !!! FIXME: this is available in API Level 23. Until then, we always block. :( - //return mAudioRecord.read(buffer, 0, buffer.length, blocking ? AudioRecord.READ_BLOCKING : AudioRecord.READ_NON_BLOCKING); - return mAudioRecord.read(buffer, 0, buffer.length); - } - - - /** This method is called by SDL using JNI. */ - public static void audioClose() { - if (mAudioTrack != null) { - mAudioTrack.stop(); - mAudioTrack.release(); - mAudioTrack = null; - } - } - - /** This method is called by SDL using JNI. */ - public static void captureClose() { - if (mAudioRecord != null) { - mAudioRecord.stop(); - mAudioRecord.release(); - mAudioRecord = null; - } - } - - public static native int nativeSetupJNI(); -} diff --git a/build/android/src/org/libsdl/app/SDLControllerManager.java b/build/android/src/org/libsdl/app/SDLControllerManager.java deleted file mode 100644 index 34729f62..00000000 --- a/build/android/src/org/libsdl/app/SDLControllerManager.java +++ /dev/null @@ -1,432 +0,0 @@ -package org.libsdl.app; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -import android.content.Context; -import android.os.*; -import android.view.*; -import android.util.Log; - - -public class SDLControllerManager -{ - - public static native int nativeSetupJNI(); - - public static native int nativeAddJoystick(int device_id, String name, String desc, - int is_accelerometer, int nbuttons, - int naxes, int nhats, int nballs); - public static native int nativeRemoveJoystick(int device_id); - public static native int nativeAddHaptic(int device_id, String name); - public static native int nativeRemoveHaptic(int device_id); - public static native int onNativePadDown(int device_id, int keycode); - public static native int onNativePadUp(int device_id, int keycode); - public static native void onNativeJoy(int device_id, int axis, - float value); - public static native void onNativeHat(int device_id, int hat_id, - int x, int y); - - protected static SDLJoystickHandler mJoystickHandler; - protected static SDLHapticHandler mHapticHandler; - - private static final String TAG = "SDLControllerManager"; - - public static void initialize() { - mJoystickHandler = null; - mHapticHandler = null; - - SDLControllerManager.setup(); - } - - public static void setup() { - if (Build.VERSION.SDK_INT >= 16) { - mJoystickHandler = new SDLJoystickHandler_API16(); - } else if (Build.VERSION.SDK_INT >= 12) { - mJoystickHandler = new SDLJoystickHandler_API12(); - } else { - mJoystickHandler = new SDLJoystickHandler(); - } - mHapticHandler = new SDLHapticHandler(); - } - - // Joystick glue code, just a series of stubs that redirect to the SDLJoystickHandler instance - public static boolean handleJoystickMotionEvent(MotionEvent event) { - return mJoystickHandler.handleMotionEvent(event); - } - - /** - * This method is called by SDL using JNI. - */ - public static void pollInputDevices() { - mJoystickHandler.pollInputDevices(); - } - - /** - * This method is called by SDL using JNI. - */ - public static void pollHapticDevices() { - mHapticHandler.pollHapticDevices(); - } - - /** - * This method is called by SDL using JNI. - */ - public static void hapticRun(int device_id, int length) { - mHapticHandler.run(device_id, length); - } - - // Check if a given device is considered a possible SDL joystick - public static boolean isDeviceSDLJoystick(int deviceId) { - InputDevice device = InputDevice.getDevice(deviceId); - // We cannot use InputDevice.isVirtual before API 16, so let's accept - // only nonnegative device ids (VIRTUAL_KEYBOARD equals -1) - if ((device == null) || (deviceId < 0)) { - return false; - } - int sources = device.getSources(); - - if ((sources & InputDevice.SOURCE_CLASS_JOYSTICK) == InputDevice.SOURCE_CLASS_JOYSTICK) { - Log.v(TAG, "Input device " + device.getName() + " is a joystick."); - } - if ((sources & InputDevice.SOURCE_DPAD) == InputDevice.SOURCE_DPAD) { - Log.v(TAG, "Input device " + device.getName() + " is a dpad."); - } - if ((sources & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD) { - Log.v(TAG, "Input device " + device.getName() + " is a gamepad."); - } - - return (((sources & InputDevice.SOURCE_CLASS_JOYSTICK) == InputDevice.SOURCE_CLASS_JOYSTICK) || - ((sources & InputDevice.SOURCE_DPAD) == InputDevice.SOURCE_DPAD) || - ((sources & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD) - ); - } - -} - -/* A null joystick handler for API level < 12 devices (the accelerometer is handled separately) */ -class SDLJoystickHandler { - - /** - * Handles given MotionEvent. - * @param event the event to be handled. - * @return if given event was processed. - */ - public boolean handleMotionEvent(MotionEvent event) { - return false; - } - - /** - * Handles adding and removing of input devices. - */ - public void pollInputDevices() { - } -} - -/* Actual joystick functionality available for API >= 12 devices */ -class SDLJoystickHandler_API12 extends SDLJoystickHandler { - - static class SDLJoystick { - public int device_id; - public String name; - public String desc; - public ArrayList axes; - public ArrayList hats; - } - static class RangeComparator implements Comparator { - @Override - public int compare(InputDevice.MotionRange arg0, InputDevice.MotionRange arg1) { - return arg0.getAxis() - arg1.getAxis(); - } - } - - private ArrayList mJoysticks; - - public SDLJoystickHandler_API12() { - - mJoysticks = new ArrayList(); - } - - @Override - public void pollInputDevices() { - int[] deviceIds = InputDevice.getDeviceIds(); - // It helps processing the device ids in reverse order - // For example, in the case of the XBox 360 wireless dongle, - // so the first controller seen by SDL matches what the receiver - // considers to be the first controller - - for(int i=deviceIds.length-1; i>-1; i--) { - SDLJoystick joystick = getJoystick(deviceIds[i]); - if (joystick == null) { - joystick = new SDLJoystick(); - InputDevice joystickDevice = InputDevice.getDevice(deviceIds[i]); - if (SDLControllerManager.isDeviceSDLJoystick(deviceIds[i])) { - joystick.device_id = deviceIds[i]; - joystick.name = joystickDevice.getName(); - joystick.desc = getJoystickDescriptor(joystickDevice); - joystick.axes = new ArrayList(); - joystick.hats = new ArrayList(); - - List ranges = joystickDevice.getMotionRanges(); - Collections.sort(ranges, new RangeComparator()); - for (InputDevice.MotionRange range : ranges ) { - if ((range.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) != 0) { - if (range.getAxis() == MotionEvent.AXIS_HAT_X || - range.getAxis() == MotionEvent.AXIS_HAT_Y) { - joystick.hats.add(range); - } - else { - joystick.axes.add(range); - } - } - } - - mJoysticks.add(joystick); - SDLControllerManager.nativeAddJoystick(joystick.device_id, joystick.name, joystick.desc, 0, -1, - joystick.axes.size(), joystick.hats.size()/2, 0); - } - } - } - - /* Check removed devices */ - ArrayList removedDevices = new ArrayList(); - for(int i=0; i < mJoysticks.size(); i++) { - int device_id = mJoysticks.get(i).device_id; - int j; - for (j=0; j < deviceIds.length; j++) { - if (device_id == deviceIds[j]) break; - } - if (j == deviceIds.length) { - removedDevices.add(Integer.valueOf(device_id)); - } - } - - for(int i=0; i < removedDevices.size(); i++) { - int device_id = removedDevices.get(i).intValue(); - SDLControllerManager.nativeRemoveJoystick(device_id); - for (int j=0; j < mJoysticks.size(); j++) { - if (mJoysticks.get(j).device_id == device_id) { - mJoysticks.remove(j); - break; - } - } - } - } - - protected SDLJoystick getJoystick(int device_id) { - for(int i=0; i < mJoysticks.size(); i++) { - if (mJoysticks.get(i).device_id == device_id) { - return mJoysticks.get(i); - } - } - return null; - } - - @Override - public boolean handleMotionEvent(MotionEvent event) { - if ((event.getSource() & InputDevice.SOURCE_JOYSTICK) != 0) { - int actionPointerIndex = event.getActionIndex(); - int action = event.getActionMasked(); - switch(action) { - case MotionEvent.ACTION_MOVE: - SDLJoystick joystick = getJoystick(event.getDeviceId()); - if ( joystick != null ) { - for (int i = 0; i < joystick.axes.size(); i++) { - InputDevice.MotionRange range = joystick.axes.get(i); - /* Normalize the value to -1...1 */ - float value = ( event.getAxisValue( range.getAxis(), actionPointerIndex) - range.getMin() ) / range.getRange() * 2.0f - 1.0f; - SDLControllerManager.onNativeJoy(joystick.device_id, i, value ); - } - for (int i = 0; i < joystick.hats.size(); i+=2) { - int hatX = Math.round(event.getAxisValue( joystick.hats.get(i).getAxis(), actionPointerIndex ) ); - int hatY = Math.round(event.getAxisValue( joystick.hats.get(i+1).getAxis(), actionPointerIndex ) ); - SDLControllerManager.onNativeHat(joystick.device_id, i/2, hatX, hatY ); - } - } - break; - default: - break; - } - } - return true; - } - - public String getJoystickDescriptor(InputDevice joystickDevice) { - return joystickDevice.getName(); - } -} - - -class SDLJoystickHandler_API16 extends SDLJoystickHandler_API12 { - - @Override - public String getJoystickDescriptor(InputDevice joystickDevice) { - String desc = joystickDevice.getDescriptor(); - - if (desc != null && desc != "") { - return desc; - } - - return super.getJoystickDescriptor(joystickDevice); - } -} - -class SDLHapticHandler { - - class SDLHaptic { - public int device_id; - public String name; - public Vibrator vib; - } - - private ArrayList mHaptics; - - public SDLHapticHandler() { - mHaptics = new ArrayList(); - } - - public void run(int device_id, int length) { - SDLHaptic haptic = getHaptic(device_id); - if (haptic != null) { - haptic.vib.vibrate (length); - } - } - - public void pollHapticDevices() { - - final int deviceId_VIBRATOR_SERVICE = 999999; - boolean hasVibratorService = false; - - int[] deviceIds = InputDevice.getDeviceIds(); - // It helps processing the device ids in reverse order - // For example, in the case of the XBox 360 wireless dongle, - // so the first controller seen by SDL matches what the receiver - // considers to be the first controller - - if (Build.VERSION.SDK_INT >= 16) - { - for (int i = deviceIds.length - 1; i > -1; i--) { - SDLHaptic haptic = getHaptic(deviceIds[i]); - if (haptic == null) { - InputDevice device = InputDevice.getDevice(deviceIds[i]); - Vibrator vib = device.getVibrator(); - if (vib.hasVibrator()) { - haptic = new SDLHaptic(); - haptic.device_id = deviceIds[i]; - haptic.name = device.getName(); - haptic.vib = vib; - mHaptics.add(haptic); - SDLControllerManager.nativeAddHaptic(haptic.device_id, haptic.name); - } - } - } - } - - /* Check VIBRATOR_SERVICE */ - Vibrator vib = (Vibrator) SDL.getContext().getSystemService(Context.VIBRATOR_SERVICE); - if (vib != null) { - if (Build.VERSION.SDK_INT >= 11) { - hasVibratorService = vib.hasVibrator(); - } else { - hasVibratorService = true; - } - - if (hasVibratorService) { - SDLHaptic haptic = getHaptic(deviceId_VIBRATOR_SERVICE); - if (haptic == null) { - haptic = new SDLHaptic(); - haptic.device_id = deviceId_VIBRATOR_SERVICE; - haptic.name = "VIBRATOR_SERVICE"; - haptic.vib = vib; - mHaptics.add(haptic); - SDLControllerManager.nativeAddHaptic(haptic.device_id, haptic.name); - } - } - } - - /* Check removed devices */ - ArrayList removedDevices = new ArrayList(); - for(int i=0; i < mHaptics.size(); i++) { - int device_id = mHaptics.get(i).device_id; - int j; - for (j=0; j < deviceIds.length; j++) { - if (device_id == deviceIds[j]) break; - } - - if (device_id == deviceId_VIBRATOR_SERVICE && hasVibratorService) { - // don't remove the vibrator if it is still present - } else if (j == deviceIds.length) { - removedDevices.add(device_id); - } - } - - for(int i=0; i < removedDevices.size(); i++) { - int device_id = removedDevices.get(i); - SDLControllerManager.nativeRemoveHaptic(device_id); - for (int j=0; j < mHaptics.size(); j++) { - if (mHaptics.get(j).device_id == device_id) { - mHaptics.remove(j); - break; - } - } - } - } - - protected SDLHaptic getHaptic(int device_id) { - for(int i=0; i < mHaptics.size(); i++) { - if (mHaptics.get(i).device_id == device_id) { - return mHaptics.get(i); - } - } - return null; - } -} - -class SDLGenericMotionListener_API12 implements View.OnGenericMotionListener { - // Generic Motion (mouse hover, joystick...) events go here - @Override - public boolean onGenericMotion(View v, MotionEvent event) { - float x, y; - int action; - - switch ( event.getSource() ) { - case InputDevice.SOURCE_JOYSTICK: - case InputDevice.SOURCE_GAMEPAD: - case InputDevice.SOURCE_DPAD: - return SDLControllerManager.handleJoystickMotionEvent(event); - - case InputDevice.SOURCE_MOUSE: - if (!SDLActivity.mSeparateMouseAndTouch) { - break; - } - action = event.getActionMasked(); - switch (action) { - case MotionEvent.ACTION_SCROLL: - x = event.getAxisValue(MotionEvent.AXIS_HSCROLL, 0); - y = event.getAxisValue(MotionEvent.AXIS_VSCROLL, 0); - SDLActivity.onNativeMouse(0, action, x, y); - return true; - - case MotionEvent.ACTION_HOVER_MOVE: - x = event.getX(0); - y = event.getY(0); - - SDLActivity.onNativeMouse(0, action, x, y); - return true; - - default: - break; - } - break; - - default: - break; - } - - // Event was not managed - return false; - } -} - diff --git a/build/android/store/0.png b/build/android/store/0.png deleted file mode 100644 index c45ae7f1e1b21c6c795599c7d9e8b2d92a5cb498..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27650 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 diff --git a/build/android/store/1.png b/build/android/store/1.png deleted file mode 100644 index 6f57c8ed247018dbdc1da6153339813834fe3864..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31736 zcmeHQ2Ut_twm$Y5MY&@GRK!6=y#gV0L&+%CK|lqhNHK%}krGM*NJ+Rl;wS=loVkJm zA{LM$Wk666P!Ui;su2VMB_M_(y_4kalR%8^X5O7M?|bik$)~V9XV-tPwe~7|$1?{E z_bgtxY9Rzci}&r_c?g2OX@H=4^S_x5o;>t@i2=X9b>C~@1wo6J!GC8#m!c&hXxmky zi8gI z;I2n-BJTC`BpCY{n&ADM@!RZWvAPSjeKDW`R{|Ng&ezq&%?snJBg<_U18Dd$N_HK$ z2-#Ujc01hRI&*^q>-0#Tgmr3)>I!%zwCXyIZHj0$b&YKr^6Qkrzfnq>C}kxDrEM5B z6^xSdy6KOs?m|Fmd)hl-4(;4M-5vOsj;s@z?2bX9e0+QqeN+@lo{lK=wr$%`O3El@ zWd%?|!Rxpi8Rx6u=Cz*J$V@vs30`Y=|_4?t>Qz_0qn?p$5J zSksGqi0}cCFV^%jIqptC9U^#o%Ja-Rwy|UR$(LpH}(6I3HRg?8K1?x`46O70^lw%4id`8b(bM{Mo7m z*jq`U5njnp+Atv56CI8Vw1HMYtC*mbfMj5l)dkxSDEVm{KoIS5WZWNWMX;~N|)I1CH~tAEz?P7TbPVdOLP+N2_RXQ3lNlRQ# zvNO`cS0B?X!xc9S@$;!pk4N?E`$@2_7Fmoq6Fx{DTX_Uml>u zFgQG{;B~!lU~#okT*Wr??8BgVHQPwG5^sf!?0x;JC0C3!;Mr)%!d-iF0b6BQbDBSWI z%1YpaLc>3&s|vpUw5r9wuPXTZ)2bh8nz|9my2{hNeezhK7Q9vQz%T~p89`TFO-)5j z8};eqPiq_?`Vw5scM^e`^n#gRSy^3uy4I(!zF5`bLshi0=0{ZpUQJi!EwX?y#pMCs zQ(&qAD-p#v6F+7TzSJR1e3%o$4GT6W>O>F?p|l7tp%4ic5WyvghEQ4rmr#fV3y9zn zL_;Vof=ehwf(1ly38EpC7QrPHBEbS8xCGGP+A0+P>2Kzh~N@L zLntkRODIHw1w?QOq9K$P!6g(T!2%+<1kn&mi{KIpkzfH4T!Lr_rA2TFg-Eb~2rfZ1 zgwi6oghC`(Km?Z{8bWCiTtXodEFgkQ5DlTU2ri)z2^J8+C5VPlS_GF+hy)9W;1Wbb zC@q3ZC`5t|*Yn4H=9ecr*%ysy^hYTRdZzBW+orIuq z4*1Q4Ac_(MbsmKvOe6$Jkj~o{?}ni5Rr_{sH}P%gZp=TXVsSP5&B*S!ISZDAhTqSS zTC-&Bf`$M379&;Ec5CnAv-584jS=@fKcBF0g;V)Y4hOo|SA943w}RLD>X}E9FAl#j zCb6u{EKTT^$xls{H7FGSz)?L;OhxI#7qQf-$s z0)l=BTQiSG{PRB|sy293)sCCjPxx|bV#YZWjVOiK{sbA?+L5_hYOJc<+t?68>(T{WSw_3GUXDST4}MbOyWk$OuH{_)g)zgvoYrtK z`5;x>J@9}a=x-bT9HE-nJV@46FJLfO`aT!l!pk&%4$B(zDl6Szjz))!RGQmd9O6yUX-1Njlc0vX!zpC*%A~wJ6u*<{Jl=<6hk?@{P{s z{JgdZ4=!K_ab91<@Q}B4k(984;&SmZi zMzcCCe(SwigOQM2W-WBmU}xSze~)2SH?#OgZ#C&mszG5oepqUmo-3zw za@l+c%B@6RRu?w1`$uUbgjG7L{(k55_dRK}$q=kYrN;eOu-`yUZxDmx0%SQDUdS1& zi7#aLph9JqnbGct9Ja}+3QN_MzB?f{`K|i7xUeay6}c0ar-1%W8^^%kbO2;+-8N*1 zE6I&rTFKltp&x!uyT+rwIWHn05eR@8{zDKhne-mV$e>*P?$I)Sk0=+PED66GRUt3W zWv?m&Bo*BIn(W%~`T?i4y|$g+RxU3>#U1jj=slX)?nOs@YAssRLt~e4yS?%qQr+@5 z8mB|`BfgwN^?n$cF7N&Iie_`}NDdYiq*F9v=sn+Xd+n1(N@lM-QHsx~PXYST`|gio z6l%R~LsnG9t6#X?+`m8eSEz=(5^?U_0`AeIrp{JQuj8wy+&+KMKx}G%i59wKe&T(k z%*d%*dCU~8lZh_|j7_EY zR_Mwkaq>_C2P&WjAgv?tU|{tW{@{#5WUlu7|L+FohUy3K{pV}5t9@5GNho=PW8MS}H~V2CYNLzfzcf-n66AHQcv^~-k%-~m|h zyeVi0Qeaj+TB_6JpHW?Dt>8Mbb^ zoG_TtU#$%|q~{LMoigR#cas`DsPz)r@8dJyTd@ZY9C?xWFP@Ke33;O*_FpV@+nE9P zvY7pB0_2RrcIT-?g2hc_=3v)yr~G?t9 z{hH25$*xaXbR?(DG|F**G;D?ik=l^*p7=2aSjaj@0%(4BvY6wH%y#1P`NlezAE7yY z>6F~;*9w)g=*UzB-vkqsuU%7c{{s5@!JH`lDDO1ed`U;An?11^fg#T(YT|o5=^-B8 zu3VMNK+efK<=Sf`PFZlPxqqDDRW5POZ{pNEqcxe%W=TqsYoA>;rm4kI^k3an2(N{s zC=hhz1mbSkrRCW=w1Ab_1z4TuJ>RH~bpXd1e58?c>Wd;v21^}rU6ZvZw>GghD#T_O zXYLiFh?&v)x^^?(k~Cs4-S3B!?Tp=IDJK)Nty2|UEnQwvv<`2LMti_t(gzj%g7~y^ zbMp%_d44kV6XHq`DHmMS4ubKF{{b+sJbB!~VGp?zYXQgG23uC$w%AbK;-=`@kWXEF zbS3N3UR!zfF8!$NGSjxDG9$nq)`+=%SNU#n|EkW%bM8%Dl`2{^?@Fj`U<7UHhUV_q zIUq7GjhMQDm0`+`J@>FW%d>T90hU)=)M$A`U=!D+6^N;!L#j0OlKr08Wh%NfDVjaA zZ7C{HWijPF>Pw8w@{`VNlzzg<_n`NJVn?Vn(@I&@ibqLdQ=1-4TQE2J@rPxyr&c9h z@U54NkJWUDrN$i2&+|$n^}bY>Nmx(2=tr9c9Y8)1EQgP5o2=Cj-tQU5*fL z&a;l%^>C`^ZB2YrR~_U~opxrZ*eTb4pl7GmE0$6n{DFkhPAW|u(rSk}%$XJB;!H!96GQ0kc7$~ceU!^7u`9jxnf zty3Ec4vJ4cr9@Ta4t5+ir;kLCmBL3$Obbyv7%t;1Qyn1X%aSnzv2zm!`)lG$CnHM2 zEduKYoNrpT;-Vs{t&uu@z2b};*x*r@Ru9ZTMB=Cf_- zX85y!cgFVqRnrAmS|v64dlJYb9&3uv4B6^c@4tHSkv9jee6xLeX4wGyZcVanJiT-{gKj)QUv1v&jSO=?`)LX}J6YcYiQdYx({QI`?P)Th8@oia^SiBW^v- zBp!Zf0Z{SWRh!J@V{ra;OdKf|gHw8L<%6^t*8rub@UB6ADKJMP)O&0S=PQL!4X&eB zMh)LEXlzd!kX<{XP-(~Aty_NA9BNfFp;n)Jb82=~Nm@Y}R&puHyYI+sC@2guPJ;dQ z!*T1uQY<_Yi`7-A?!8plq)IJs>N2wpz7)C3DLT$H-#)`aBHJw@`TJK>r&-1H%N3S3 zbeufX=lDI1)QQ0FRymgSrgd8URC3Xr{tIV=W=uHHUd@G|mCm9IwtDoX;*F1nmX)q4 zSu`O|l_%J=G-tZ%8t!2$53^@OSMDRlhkOlXP@?n%Y#3+rFJpB#?BhPF@nB~qX5(~pyA7?teDGDbN;(EK8# zrUcJqMpP!0BOiwSAOSKN4_`Eq9nJtX?-*wg@(klq-{YzF)>L|&yI}{}3?i;&mg(OQ zde-9B>HR97dRzPXfK-=U4O<>V$g^6J4Pth=(p|kJMFn)NW5DXk__BZ(ePq7v5if^1 zqPy0psv&}UytFeSZ&TqWnzKG|l@QbJe|0u}eJp3Pw&;cdum{1$x4q8c7bRNW-7Mnh zgj$frkh5$cNR^;m8x+m{CD9LJ?{h(%k+F49Aw&;lqt`C+OwwjE@Vt8@> zSOT5&Efn+%VypK*DB0cB{)K%f*e7N5FV^LZxK@E!JD z>XkyhcvwcoV;ko7bscar$dgzLOv$N8dUhEdx{&2(x=eqfNE{2?rxKt2R*3_Pawqb! zo(kA;z3|$Cd;7J9Pt1poDj^mjwio*~fIS96vtUZ7lUusKAwQT(N4Yc^IIf6Fsx%MW zFWILr(~wo4vg|Z)mhd+8heKtHbO$JduxXx)nCcX|h0809kq_tod^&J2$DsclWg*PR zMH>OcjjXcBL6!!Akyfi8^!e{@zQJrxG zVkV+8&d-DX#lp^y^oa-vLhNkS|9&v#E?m(9wi-y_)}i#DrxZH`5^KHh9-Hix8M%>+ zjkz6A^3x-E4COm+`ew`;QLC}<*XS8j%*UZR@c}SLB%&y|F3`V!(~`-j#TP4r`yzag zPn`MIyQgyw9Kk$y0r3dtB{BRepj&~>(G{_^sr$TT58Sb$;ux+aE;&|eKW+l<7!r#_ zs^?4Qv#E6;Q0rDY-e^$fczxhU=@AK_$sGc@9XXvvsv~|11P;=!p4tEcIUrI7e3%%E z4fB6B&+7f%ZQgWLe#Ko__32|`D2_@!l~-9I+?3>f8lt&m#8bH+GOdr6Dp}4X7zU2M zJspVaa>ID#&kq;|$$DHDgH;BBP#S(bE#B}Q=@#%&tm1nI5~^cLcL46{YGj92U&C&O zu-CQnUdPejKR5D$pd`eyvEbxI-UB1gnIOU($^B&@b$sitFN!d)-FhtrvhY}mgtpSSF?yJ_ujH`Gp|iDhnnwYojoHlOj@*0l#ak{nxe zswkV&*83dT?c@!~n4mo^k7L!>+xDcg-Y!7U{V)hdhXRgm3IkEW_vKgpluj{E%hg|t z^M2}v$-AR`I?$)&F4)JlfFFg%y3QO6rf7M0Hal@94?0As^!Z`X- zh8@>7x=xwN%(*ksUh1Fezxb`|Yy{8uab@~M@d%Kf zNABPSd>kRh^vd=bZN70;UoL>_;R}#;9FxMbSsnUOm)S#UkHRRWQx}S|wOJ!8f*aW9 zPjYL-j1Ejt~^C7x{f;&6KUw2BdJ@lvQ=0klPq%;OU!vdd2L(k+Eei6ToIw@5|PisW0hD>kN113Fr z30PK{tXN}dA?MWqoy0juZnIo&II7^-U45W*s!eA6{GsuX(R38+_n3+XZG0=4rn$$g zupNZyw`HgFg&%p-qQmK*1+_dzYUyF09(XLpHeek}!Y@iX9>00UgZ-v8>zV%jS7n)fhTXzz>92ba8LpU_L=yqbCv)Us(kICb}9Avgd0{>e;vrgFi^Z0#`+mOmWt&eSvGh_hMb;UiX3P|zBr6ql-05xi@!@CT8!S29`g z0fm&#watoV5$b@ibETPK;WW-HmDli2vSVk zgMr|3(m2kxJ{KHZrEq6H^czxegX5m?1_VwTTc?)XyMBrpVdme~#XITHgM26io+SP< z2kdQ){r&9XCj36m5wNKJ`1kQDKGNK|S-(ZpnyF{b>nm>zXPOho5DcABGl-bpOQj&Cd+~+Yyq~&^-@2=9{Q&yICu;C zIivDI8f>ARadPo8x!^yAgg-46NXZ!AelSQH1p%b20A2^bA+^O`0Vj#4Pt)kZhk2#% zJse7o;9Z8hl8Kc5`{1B(O%vW6);&TTBtBXq0)qbCg+dl~q^CaHLlU~OdA9wM@HgLS zXYJ{Owix>cmAkWM9sIs+*@j^oXHB^+2g9bmpSl0TUq!w&^ONR$7kdWypJqZnJ7!e1 zs2LG9Gq)!HAMj08>1bty>9i(mWp3tCf0EmEjS2^;{!=40T`VgC+rRw8;x*A{8>2%{ z<}|wK`)ObHvWo8uC4$8D(L&DY^$DD3Yq8Hw9X$GF{*ho=lUPy1I3u4G*UiGpoJ*Lw zRfiDM1zx6hbg`y-ZcO%gybooB%9QuFx?n>R!`QyX)wWJ2imPLf?Mt{+ke~h3tYk+- ztxmzH^*9*kQe##$MLW`zdOUCJmW3)yhw5)ZxS1L1)#q!-2}-YO9wkrTy#AB=A=WIi zjWwd#pISG$%{Mv$+kf;#am%@|;<0%$y+^~UPmpMT0~j%wDDuxSXZ6K~TO*9ks1S6g zTiTY~s7seW8|PMdeUWrazkcr11J@ecOe;dSt_d`nxeAStf}6PaaD#1c2MN_g65sTo zMRCh&&1Q)(wsv003UFB_XqUneqv*kb@Y3UcD-*CDedl*C$cUukk~T^gD*KBK`zoCr zrDny&V-D)fT(19fsu*VCx>!y%Sk%7GE>^T7dx2hPiA6xGNv5Vcy*jotK+83*)?spE zlf%uChR5?-7@oORqXlJP$+`m>>SMI-t*@wIwmGJ5$5&d`Z0)|Zm2~q|a3@02z~4e- xTClc;MMXgD#I=MZKoSy@FrMlP;)5yRDum<`q9F-MfPhF;tn`60 z$5v^vQ0k^rYmwTC9U@Q!v;)yOMN4@L2x567@9f+J!j*>?-RtTo)k}+3mh!k5G9AVMQ!rtNA2M=1(uH7d2AI6C};fRA(_f#GRYKMvaKx% zaF7&{5+zSXk|t0x<}Lg^L`pcsL68j9S)!IUOdB@31+rHWwb6aeZUPYI(^ z6g0)0kS9}$!79-dV#pJnnAWFsre*`wSuS#zrR0Ds=30QaV#l;}9e>F|^aL_v`# z9aIw4&YMaBk-@TmMhA*>ybchE0-lmLEiGtXlpX<}6(p61@RVFp2u}!;WfCEqJl2Tf z)Os&#qeP+PN%-(aS1xF<5s3sW8lTQ*1oB}LlkQ+g5>V_ZBxVqwM&i@$?df&`o;@Ro zu7$(X6D>YLwX2jLh6K=vY5`Df@8;~{?%?9gWH`7{scv)!XE!$oiW9?*LU*D$IXR4~ zMTt&S3(G~}u)tj|4bf%;8BeZ&kznCijz)_liSO9op6jq1@Uj*h!RGIxK)e>Iy^U)|Ng+#>4vcM} zJcGG(8qJQzCXa6(FR@vqg2g_rB9JB(i1XXp(m`s~N{xRssi^OmDAm^C8Bx@u5mB9y zQN@(j2Xw8VR0CBaSzjhT>mK^3!WEIzXkgL=T$m7{83?%0XkgL=T$m7{ z83?%0XkgL=T$m7{83?%0XkgL=T$m7{83?%0XkgL=T$m7{83?%0XkgL=T$m7{83?%0 zXkgL=T$m7{83?%0XkgL=T$m7{83?%0XkgL=T$m7{83?%0XkgL=T$m7{83?%0XkgL= zT$m7{83?%0XkgL=T$m7{83?%0XkgL=T$m7{83?%0XkgL=T$m7{83?%0XkgL=T$m7{ z83?%0XkgL=T$m7{83?%0XkgL=T$m7{83?%0XkgL=T$m7{83?%0XkgL=T$m7{83?%0 zXkgOMg=^l}7cXH6__k#P_*$iGj>H*!CDVexVXG$uMg0nb_Qyg{p9cJFf}k)81T_ah z5Gx6SmP-HVU*HZw_NE(MoxD}wwUlSSFAxUquQ_%mU{=P`>QB=H?lk3Ad%T@D&%XLM zmy0jla$505GIjCtg}cs=7zeUwL&ehZ40fk`_z*A~SiP3ppj{RM@bm$|8aVNpYu zAhNiuqOvMpXsdY~eTrL}^R2g)vOmr<%)4{&53Pm#VHf+fJ5S5i#VfdJcT$VYEg`7- zwtU@`oxi?bI~!=>A75Y&w`!}cssKQ--TwZ&R`wlv{G=f%F|vK|?y;o~Y2-ro)%+sI zz#b;Y*C@WSvdSaym$%sl^u}t&l5L#cg~ll!8Fsg?u2i43>vi(He(2J_rRvI@p*juU z?@Fk%CJCTodZheifSfoNl2J@YLFbNv!-zR!&-+Rl1x363cXP6}%yg>Y$qN{AV*eBU;e+*8hr7csN+0!i?4Dy7 zJ@7+!?xPPH(~V5tuQWN|e%*M9VGB2$9oK8}ePtE9SD2DwZ9W(_E0vj6pRhZ{qkaYa zR>;iwKL52j+aM^Q`TJ2HnoieKyJB!?TcWfoJEqORpRJ~)AULg$sq3!48>?<;`_L@< zU4xvA%~wKI!lOBbwSRH{dv2ry$JeayNaj;UVsG(WlDc=HL8Z@$;XE)-m*|I%jGe5M zGe>vZCJbgeUU`4ZC&TTffdPF9HDpH!qJ&9a#^ol4jeg4gNXXJ-;Vb)|Mg?>sxbFGA zlreC47nsX{%ZZ`o=J~6%q1NW`^~&+Vr`PgA{=Yu?cw;ySoZbwrExQEF*xA6-=g0pL z9s!&!y1m}}UT??a^qvLhw|g0wo%nW+q@t#*8=x8BMiDJnmNOkC5dCAqZ$NxN6n-_T2;LTI4KS#z~f8(g5Ipn@4Gpn5O zl^=)GlE+Jp$t-7dX@_CG2a0>OWF3irg22N(+E^U<_ z9jxvvc)&AUrjlh>uzTMyqF>3)Kjl~4ncm?Jt!YkZRj+HE{l#`K^Ue<73VhtxzHgR5 z7nOU}c4rOJ$>~M|_eV0o*V0FWwJq0Ia4Dr3p549DR{}l*i_TEeaZQ|hD545PXm#3U zoYIeW2vJ{}nq+6^Fgs!!mkN!C3lF5lGK2vs`Nl?G4HwRsUHNN1aHCj9P)XFUH=yKb z0)PkOJcO7~IwdOVOLj+Wf%nN0W=r0d62<*Pr?kaJXEok2m_R3&J^_imjSn2M>Q>W@ ze+`2vwH*fwch3TxGW&GW?ZicW>XlVrRNlv8-O`AqB_&?EkZ9AR^utC*izSRp0F z(Yl`Dph`nF$Cm|HZT0s?VxyOe_Zt2)1NQ$ad;YYtjNwj*-=<5f6+hfuRlBqK17xkw z#XX-BHY9@fzuMZk1xny3@tI`@nl*rD3#2T>mFz!>bUl_q7+<==Q%^?B~=j~JdUe8M{Ibdss zG6!skwUk}<!zi=w|fSY=JV_v1Xw+6~hwDQ`1?lc{#V3U>*`ven?(s6>E zP&4&yh3Q}e_IzIlr?KB@H+!Mn#W>|uP#IHRJ8kurb}xCbw)n@}OMd+(`KDNVW(*Z4 z;B*(^rOK=6p#AfBE&B26KEL}jk@I{z?X{njzWE*v)xR^!8~x#8+i7#)j#*SfP*{(HtmuDlHZ{uyf%Wtyn@8p74gkS%8u`d+t>1BsANWJ zWK3xI{l`WzvVauxFQbwEpfx2w!W{p7J~O%91Ke9;Qler)d#cU%wh1={_h~!y_!y_q z0v8|>FN|D7c)9>wk6N6#OjXxc;M-n!;GN(5?>f?$beIwCy-j=hqdFL;%Lw|jJ!FNh z0B6!y)9xhJ=f;9tF>xG+w!-VV(MKIW%5Pv^I-^Y`GJE`v!#ygZvX}vnZX{ZbI?hSI zI$&7swSoK({n-wb(i;5zXiZI*psyNn9(ruO@#lf6JMP^UT3gyR;C-Y=9QQ&NMEV~s zM37yvS$;bdBkMc0 zIQchH8=Xk8wxX7n53Gm_+pqT7X8ZujF?9sk|- z8{U=zwZfX3p5ekZ#rIn!_w0NM$|KT+>aFLbF`U-fF$3MLLiM|jLnY+K?A-3~x`a1? z*X7>F=~|N>YY>h}hsaffk*{?QHrIR2aaV^89632?{v#E_VIHqZBDc8(oC|#rC#A%}Y%6AOQkp-7xppvA=DjZoCEuG@dZ(IqwrHoB_SujeNYL>Nzo9_UpNOG{114~iRb_T diff --git a/build/android/store/3.png b/build/android/store/3.png deleted file mode 100644 index 4e873346f17ac4d92355e98c517d1d14e493316c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29447 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 PLAHCk`njxgN@xNAASv1K diff --git a/build/android/store/logo-512.png b/build/android/store/logo-512.png deleted file mode 100644 index c2232d7bfa95c9cf3b5dc590fb1f6f485c8349a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1660 zcmeAS@N?(olHy`uVBq!ia0y~yU;;9k7&t&wwUqN(ASGGi8c`CQpH@@ zvz;V6nmmuf9nEOK1ZR^IY!$1Dt{<)N^xZ86o_^X5^RqT zXs@f)4F1BpmdKI;Vst0AO3Q AX#fBK diff --git a/build_demos.sh b/build_demos.sh new file mode 100644 index 00000000..5998a895 --- /dev/null +++ b/build_demos.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +cmake -DBUILD_SDL=Off -DBUILD_SOKOL=Off . +make generate_demo_carts +git clean -xdf -e *.tic.dat +git submodule foreach --recursive git clean -xfd diff --git a/include/tic80_config.h b/include/tic80_config.h index 8794620c..9fc7dbba 100644 --- a/include/tic80_config.h +++ b/include/tic80_config.h @@ -73,9 +73,12 @@ # endif #endif -#if (defined(linux) || defined(__linux) || defined(__linux__)) +#if defined(ANDROID) || defined(__ANDROID__) +# undef __TIC_ANDROID__ +# define __TIC_ANDROID__ 1 +#elif (defined(linux) || defined(__linux) || defined(__linux__)) # undef __TIC_LINUX__ -# define __TIC_LINUX__ 1 +# define __TIC_LINUX__ 1 #endif #ifndef TIC80_API diff --git a/src/config.c b/src/config.c index fd3a5138..f132175a 100644 --- a/src/config.c +++ b/src/config.c @@ -290,7 +290,6 @@ static void setDefault(Config* config) config->data.cart = &config->cart; -#if BUILD_DEMO_CARTS { static const u8 DefaultBiosZip[] = { @@ -307,7 +306,6 @@ static void setDefault(Config* config) free(embedBios); } } -#endif } static void saveConfig(Config* config, bool overwrite) diff --git a/src/console.c b/src/console.c index 188f3752..cf33c63b 100644 --- a/src/console.c +++ b/src/console.c @@ -510,7 +510,6 @@ static void* getDemoCart(Console* console, ScriptLang script, s32* size) switch(script) { -#if defined(BUILD_DEMO_CARTS) #if defined(TIC_BUILD_WITH_LUA) case LuaScript: { @@ -596,7 +595,6 @@ static void* getDemoCart(Console* console, ScriptLang script, s32* size) } break; #endif /* defined(TIC_BUILD_WITH_SQUIRREL) */ -#endif /* BUILD_DEMO_CARTS */ } u8* data = NULL; @@ -1448,7 +1446,6 @@ static void installDemoCart(FileSystem* fs, const char* name, const void* cart, static void onConsoleInstallDemosCommand(Console* console, const char* param) { -#if BUILD_DEMO_CARTS static const u8 DemoFire[] = { #include "../bin/assets/fire.tic.dat" @@ -1493,13 +1490,11 @@ static void onConsoleInstallDemosCommand(Console* console, const char* param) { #include "../bin/assets/benchmark.tic.dat" }; -#endif FileSystem* fs = console->fs; static const struct {const char* name; const u8* data; s32 size;} Demos[] = { -#if BUILD_DEMO_CARTS {"fire.tic", DemoFire, sizeof DemoFire}, {"font.tic", DemoFont, sizeof DemoFont}, {"music.tic", DemoMusic, sizeof DemoMusic}, @@ -1509,7 +1504,6 @@ static void onConsoleInstallDemosCommand(Console* console, const char* param) {"sfx.tic", DemoSFX, sizeof DemoSFX}, {"tetris.tic", GameTetris, sizeof GameTetris}, {"benchmark.tic", Benchmark, sizeof Benchmark}, -#endif }; printBack(console, "\nadded carts:\n\n"); @@ -2044,7 +2038,8 @@ static void onConsoleExportCommand(Console* console, const char* param) } else { - onConsoleExportNativeCommand(console, getExportName(console)); + printError(console, "\nhtml export not implemented\n"); + commandDone(console); } } diff --git a/src/ext/file_dialog.c b/src/ext/file_dialog.c index 65df691a..a6aa8712 100644 --- a/src/ext/file_dialog.c +++ b/src/ext/file_dialog.c @@ -347,6 +347,7 @@ void file_dialog_save(file_dialog_save_callback callback, const char* name, cons #elif defined(__TIC_ANDROID__) +#include #include #include