Compare commits
166 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 00e076fca4 | |||
| 0023c4a086 | |||
| 7c9fd90903 | |||
| d95e9e1155 | |||
| d4cb3e8384 | |||
| d566524499 | |||
| f3bb5ccef9 | |||
| 4709295598 | |||
| af0c423359 | |||
| 45253e0008 | |||
| e32e5c2a47 | |||
| 3a4f9f06cb | |||
| a563030440 | |||
| 80d43896ff | |||
| 1c5949411f | |||
| 699b151939 | |||
| e6af1a08b9 | |||
| 7eac02f8d4 | |||
| 58e70e2500 | |||
| 56ca2021dc | |||
| e4e431dcee | |||
| abfff205ee | |||
| 6416e4e0d9 | |||
| 86f4730db7 | |||
| 33a5479512 | |||
| 891859f4ca | |||
| d5bfb8201b | |||
| f49ef92f90 | |||
| 02d004b5bf | |||
| 55f8a8a1d0 | |||
| 068a69c80b | |||
| 375e66489f | |||
| cbbd034862 | |||
| f7fe948da5 | |||
| 478ce0863b | |||
| 329011460f | |||
| 48ec51a923 | |||
| 9936962c56 | |||
| 15111d1b20 | |||
| 2b342ca33b | |||
| 97e6df7f59 | |||
| a2bb67a828 | |||
| d14e28d7b3 | |||
| 0a0ee3cc98 | |||
| 99e6a254e1 | |||
| 68714ebad8 | |||
| 48ef4144bc | |||
| 78a4da4945 | |||
| af0861877a | |||
| a23b96ba75 | |||
| 47704f7591 | |||
| 755f90f38b | |||
| 8a56406c19 | |||
| 887ea94a4d | |||
| 499b3ddf3e | |||
| 83e55b1074 | |||
| 1f87ed77e4 | |||
| 93b7d210dc | |||
| 10d9d84f84 | |||
| fc9a4d5431 | |||
| 4b3a2531a6 | |||
| ed4871548e | |||
| 1284b8da8b | |||
| 95455603a1 | |||
| 813c54a166 | |||
| fa2a2d51a5 | |||
| 4b68b636ce | |||
| 0a01b0af69 | |||
| e4e809f3fe | |||
| 1667b79fa8 | |||
| 31272ff0fe | |||
| 9335063d68 | |||
| 39dfaf3acb | |||
| 3e7ecd51fd | |||
| c9ee4a304e | |||
| 2f1bf7bdbe | |||
| 41890f6bb4 | |||
| 24cd7cab58 | |||
| 473d9387d4 | |||
| f5495adce1 | |||
| d802ec4b59 | |||
| 8f69e2a204 | |||
| c3fc579907 | |||
| cc06370bcd | |||
| ed15ec2469 | |||
| 3f7d5ff041 | |||
| d5bcf40cbb | |||
| 49c196814f | |||
| c4282ce936 | |||
| cd1c09127f | |||
| 9afebe0851 | |||
| 9a7382ea06 | |||
| 7a7e723009 | |||
| 9d772284cc | |||
| a981761deb | |||
| fc13ffa242 | |||
| 878b2cd639 | |||
| 995922d2d7 | |||
| 0d100aa9be | |||
| d4fabed317 | |||
| 9eff781103 | |||
| 0353da3d27 | |||
| 3cbdc6e9fe | |||
| ce71afd704 | |||
| 603d491bed | |||
| 20a792f135 | |||
| 87f5e7f3a6 | |||
| e272925f3d | |||
| 19091ade7b | |||
| e62c065e2c | |||
| 2312381b82 | |||
| 639942d444 | |||
| 55a5b9d0ba | |||
| a33517e5d0 | |||
| c981586bcf | |||
| b473238f02 | |||
| 1d9b92080f | |||
| 7f89d4d39f | |||
| 4f00ec2277 | |||
| 26db10a083 | |||
| 3ec2ceb725 | |||
| 667ac39e06 | |||
| 993d62a8c8 | |||
| 09a70d4573 | |||
| 3afa730751 | |||
| 3245ddbfe7 | |||
| def55943ed | |||
| 4accc9c018 | |||
| 579d612397 | |||
| daabce1d2f | |||
| 5885829585 | |||
| 3e7b9e68d5 | |||
| 4a52139457 | |||
| 79ea403273 | |||
| 397d7fa6c8 | |||
| ac787a6f51 | |||
| 0418e77d34 | |||
| a2c6a3669b | |||
| b8d22240a8 | |||
| b458d570a1 | |||
| 5022df0d14 | |||
| 220b48b144 | |||
| 8aeed46181 | |||
| 38b34eae2f | |||
| 648b21f972 | |||
| 09717a966b | |||
| eef46fe743 | |||
| 5f91566fa7 | |||
| c83a476ebe | |||
| 954bba274c | |||
| d370a5c13d | |||
| 181189bee0 | |||
| c678f5e85a | |||
| 0fabf83c62 | |||
| b7e8d19290 | |||
| d0db71602a | |||
| 112efddb4e | |||
| 4cea81e564 | |||
| 3a40a34566 | |||
| a4ff87a7d5 | |||
| 797077c47b | |||
| 075d950249 | |||
| 22d14b2a4f | |||
| 4272e2e2b2 | |||
| 34279cfacf | |||
| 85f4a4c36a |
@@ -1,3 +1,12 @@
|
||||
[submodule "thirdparty/zlib"]
|
||||
path = thirdparty/zlib
|
||||
url = https://github.com/madler/zlib
|
||||
[submodule "thirdparty/SDL2"]
|
||||
path = thirdparty/SDL2
|
||||
url = https://github.com/libsdl-org/SDL
|
||||
[submodule "docs/wiki"]
|
||||
path = docs/wiki
|
||||
url = https://github.com/WagicProject/wagic.wiki
|
||||
[submodule "thirdparty/curl"]
|
||||
path = thirdparty/curl
|
||||
url = https://github.com/curl/curl.git
|
||||
|
||||
+134
-54
@@ -1,79 +1,159 @@
|
||||
language: cpp
|
||||
dist: xenial
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
except:
|
||||
- latest-master
|
||||
- latest-cmake
|
||||
|
||||
matrix:
|
||||
include:
|
||||
- os: linux
|
||||
env: BUILD_TYPE=PSP
|
||||
sudo: required
|
||||
- os: linux
|
||||
env: BUILD_TYPE=SDL
|
||||
sudo: required
|
||||
- os: linux
|
||||
env: BUILD_TYPE=Qt
|
||||
sudo: required
|
||||
- os: osx
|
||||
env: BUILD_TYPE=Qt
|
||||
- os: osx
|
||||
env: BUILD_TYPE=iOS
|
||||
- os: linux
|
||||
language: android
|
||||
env: BUILD_TYPE=ANDROID
|
||||
sudo: required
|
||||
- os: osx
|
||||
env: BUILD_TYPE=Emscripten
|
||||
|
||||
android:
|
||||
components:
|
||||
- platform-tools
|
||||
- build-tools-23.0.1
|
||||
- android-10
|
||||
|
||||
cache:
|
||||
directories:
|
||||
- opt/pspsdk
|
||||
- android-ndk-r9
|
||||
|
||||
before_install:
|
||||
- export BUILD_PSP=YES
|
||||
- export BUILD_ANDROID=YES
|
||||
- export BUILD_Qt=YES
|
||||
- export BUILD_MAC=NO
|
||||
- echo -e "machine github.com\n login $GH_TOKEN2" > ~/.netrc
|
||||
- git lfs pull
|
||||
# Only building on Mac when not handling pull request
|
||||
# - if [ "$TRAVIS_PULL_REQUEST" == "false" ]; then
|
||||
# export BUILD_MAC=YES;
|
||||
# fi
|
||||
- sudo apt-get update -qq
|
||||
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then
|
||||
sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu trusty universe" &&
|
||||
sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu trusty main" &&
|
||||
sudo add-apt-repository --yes ppa:ubuntu-toolchain-r/test &&
|
||||
sudo apt-get -qq update &&
|
||||
sudo apt-get -qq install g++-4.8 &&
|
||||
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 90;
|
||||
fi
|
||||
- if [ "$TRAVIS_OS_NAME" == "osx" ]; then
|
||||
brew update &&
|
||||
brew install dpkg &&
|
||||
pwd &&
|
||||
ls;
|
||||
fi
|
||||
- if [ "$BUILD_TYPE" == "iOS" ]; then
|
||||
curl -s -f -L https://raw.github.com/r-plus/dotfiles/master/install_theos.sh | bash &&
|
||||
pwd &&
|
||||
ls;
|
||||
fi
|
||||
# Building for PSP here
|
||||
- if [ "$BUILD_PSP" == "YES" ]; then
|
||||
- if [ "$BUILD_TYPE" == "PSP" ]; then
|
||||
export PSPDEV="$TRAVIS_BUILD_DIR/opt/pspsdk" &&
|
||||
export PSPSDK="$PSPDEV/psp/sdk" &&
|
||||
export PATH="$PATH:$PSPDEV/bin:$PSPSDK/bin" &&
|
||||
wget --no-check-certificate -O sdk.lzma http://downloads.sourceforge.net/project/minpspw/SDK%20%2B%20devpak/pspsdk%200.11.2/minpspw_0.11.2-amd64.tar.lzma;
|
||||
wget -O sdk.lzma https://sourceforge.net/projects/minpspw/files/SDK%20%2B%20devpak/pspsdk%200.11.2/minpspw_0.11.2-amd64.tar.lzma/download;
|
||||
fi
|
||||
# Building for Android here
|
||||
- if [ "$BUILD_TYPE" == "ANDROID" ]; then
|
||||
export ANDROID="/usr/local/android-sdk-linux/tools/android" &&
|
||||
export PATH=$PATH:"/usr/local/android-sdk-linux/tools" &&
|
||||
wget https://dl.google.com/android/repository/android-ndk-r22-linux-x86_64.zip -nv &&
|
||||
wget https://bitbucket.org/ewing/sdl_androidcmake/get/4e9e88c03f04.zip -nv;
|
||||
fi
|
||||
# Building for Qt here
|
||||
- if [ "$BUILD_Qt" == "YES" ]; then
|
||||
- if [ "$BUILD_TYPE" == "Qt" ] && [ "$TRAVIS_OS_NAME" == "osx" ]; then
|
||||
brew install qt5 &&
|
||||
export QMAKE="qmake -qt=qt5";
|
||||
fi
|
||||
- if [ "$BUILD_TYPE" == "Qt" ] && [ "$TRAVIS_OS_NAME" == "linux" ]; then
|
||||
sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu xenial universe" &&
|
||||
sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu xenial main" &&
|
||||
sudo apt-get -qq update &&
|
||||
sudo apt-get -qq install qt5-qmake qtbase5-dev qtdeclarative5-dev qttools5-dev qtmultimedia5-dev libqt5opengl5 libqt5opengl5-dev pulseaudio libpulse-dev &&
|
||||
export QMAKE="qmake -qt=qt5";
|
||||
fi
|
||||
# Building for Android here
|
||||
- if [ "$BUILD_ANDROID" == "YES" ]; then
|
||||
export ANDROID="android-sdk-linux/tools/android" &&
|
||||
if [ `uname -m` = x86_64 ]; then
|
||||
sudo dpkg --add-architecture i386 && sudo apt-get update &&
|
||||
sudo apt-get install -qq --force-yes libgd2-xpm-dev libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5 lib32z1 jq ant; fi &&
|
||||
wget https://dl.google.com/android/repository/android-ndk-r22-linux-x86_64.zip -nv &&
|
||||
wget http://dl.google.com/android/android-sdk_r24.4.1-linux.tgz -nv;
|
||||
# Building for SDL here
|
||||
- if [ "$BUILD_TYPE" == "SDL" ]; then
|
||||
export SDL2DIR="$TRAVIS_BUILD_DIR/thirdparty/SDL2";
|
||||
fi
|
||||
# Building for Emscripten here
|
||||
- if [ "$BUILD_TYPE" == "Emscripten" ] && [ "$TRAVIS_OS_NAME" == "osx" ]; then
|
||||
brew install emscripten && export LLVM=/usr/local/opt/emscripten/libexec/llvm/bin && emcc;
|
||||
fi
|
||||
|
||||
install:
|
||||
- if [ "$BUILD_PSP" == "YES" ]; then
|
||||
tar -x --xz -f sdk.lzma;
|
||||
fi
|
||||
- if [ "$BUILD_ANDROID" == "YES" ]; then
|
||||
unzip android-ndk-r22-linux-x86_64.zip &&
|
||||
tar -zxf android-sdk_r24.4.1-linux.tgz &&
|
||||
$ANDROID list sdk --extended -a &&
|
||||
echo yes | $ANDROID update sdk -a -t tools,platform-tools,build-tools-23.0.1,android-23 --no-ui --force --no-https;
|
||||
sudo apt-get install openjdk-8-jdk;
|
||||
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64;
|
||||
export PATH=$JAVA_HOME/bin:$PATH;
|
||||
fi
|
||||
- |
|
||||
if [[ "${TRAVIS_OS_NAME}" == "linux" ]]; then
|
||||
if [[ -z "$(ls -A ${DEPS_DIR}/cmake/bin)" ]]; then
|
||||
CMAKE_URL="https://cmake.org/files/v3.7/cmake-3.7.2-Linux-x86_64.tar.gz"
|
||||
mkdir -p cmake && travis_retry wget --no-check-certificate --quiet -O - "${CMAKE_URL}" | tar --strip-components=1 -xz -C cmake
|
||||
fi
|
||||
export PATH="${DEPS_DIR}/cmake/bin:${PATH}"
|
||||
fi
|
||||
- if [ "$TRAVIS_OS_NAME" == "osx" ]; then
|
||||
if ! brew ls --version cmake &>/dev/null; then brew install cmake; fi
|
||||
fi
|
||||
- if [ "$BUILD_TYPE" == "PSP" ]; then
|
||||
tar -x --xz -f sdk.lzma;
|
||||
fi
|
||||
- if [ "$TRAVIS_OS_NAME" == "linux" ] && [ "$BUILD_TYPE" == "ANDROID" ]; then
|
||||
jdk_switcher use openjdk7 %%
|
||||
tar --absolute-names -jxf android-ndk-r9-linux-x86_64.tar.bz2 &&
|
||||
export ANDROID_NDK=`pwd`/android-ndk-r9 &&
|
||||
unzip 4e9e88c03f04.zip &&
|
||||
rm -rf thirdparty/SDL2/* &&
|
||||
mv ewing-sdl_androidcmake-4e9e88c03f04/* thirdparty/SDL2/ &&
|
||||
sudo pip install cpp-coveralls &&
|
||||
sudo apt-get install --force-yes -qq libtinyxml-dev libjpeg-dev libpng-dev libgif-dev libz-dev libboost-system-dev libboost-thread-dev libboost-date-time-dev ant;
|
||||
fi
|
||||
- if [ "$TRAVIS_OS_NAME" == "linux" ] && [ "$BUILD_TYPE" != "ANDROID" ]; then
|
||||
jdk_switcher use openjdk7 &&
|
||||
sudo pip install cpp-coveralls &&
|
||||
sudo apt-get install --force-yes -qq libtinyxml-dev libjpeg-dev libpng-dev libgif-dev libz-dev libboost-system-dev libboost-thread-dev libboost-date-time-dev ant;
|
||||
fi
|
||||
- sudo pip install pyjavaproperties
|
||||
- sudo pip install github3.py
|
||||
|
||||
env:
|
||||
global:
|
||||
# - JAVA_HOME=/usr/lib/jvm/java-7-oracle # Force set JVM version to comply with Travis Ant version (1.8.2)
|
||||
- secure: "EBzr1+qjQsOhn0s+tcFmXR1jP9B0xiOSXuXbRXWZ1OEHNvp8+A5/pS84LYVFlaZqmxr5dApxvPtwhgLIUbQ3EPXm8LpC3KgSD4dS+9/QMbxhe5TK4oczgFRGcDTMJQZsCzhOh7hp3tbcbJg5Gp+VT7aFjFQSHDGwhzSJXsXwh/8="
|
||||
- secure: "X5dTQfofqAutnXxmu11Ep2MQ5QYnMN8m0AITRtwymhEF2UclcOudI1+skPtuhAGbWQnSO+lhunV3cvMfw2/Ml3k/VDz6VdFSKFrzAu7ja1VLJfcxr7chi0s8q30pVBb66tGydjIBac3B+RQyqgmZQW1frbRrhC/kPFQ6wPWOJdQ="
|
||||
- secure: "T97NUPnxCpVZ/c5HH0zfo0FO3DPSRMSmze58ubW5EUTZOjAMtEt+OFdsrNZvUTCugUj2M1agtonZbAbczpaAL+lgZcHDgXgWMkfO0pMnsWX1yyCNqMuE/iTMpJr/xsLQeyWlftWjJLsseQU45abZsd1XVmda/G+ZhrDLF1y55SA="
|
||||
|
||||
- curl https://bootstrap.pypa.io/pip/2.7/get-pip.py -o get-pip.py
|
||||
- sudo python2 get-pip.py
|
||||
- sudo python2 -m pip install --upgrade pip
|
||||
- sudo python2 -m pip install setuptools-rust
|
||||
- sudo python2 -m pip install pyOpenSSL
|
||||
- sudo python2 -m pip install pyjavaproperties
|
||||
- sudo python2 -m pip install github3.py
|
||||
- sudo python2 -m pip install cpp-coveralls
|
||||
- sudo python2 -m pip install certifi
|
||||
|
||||
before_script:
|
||||
- export REQUESTS_CA_BUNDLE=/usr/local/lib/python2.7/dist-packages/certifi/cacert.pem
|
||||
script: "tools/travis-script.sh"
|
||||
|
||||
after_success:
|
||||
- coveralls -b . -e JGE/src -e JGE/include -i projects/mtg/include -i projects/mtg/src --gcov-options '\-lp'
|
||||
- export VERSION=$(grep "=" projects/mtg/build.number.properties | sed 's/.*=//' | tr -d '\n\t\r ')
|
||||
- python2 tools/upload-binaries.py -t $GH_TOKEN2 -s $TRAVIS_COMMIT -l core.zip -r Wagic-core-$VERSION.zip -b $TRAVIS_BRANCH
|
||||
- python2 tools/upload-binaries.py -t $GH_TOKEN2 -s $TRAVIS_COMMIT -l projects/mtg/Android/bin/Wagic-debug.apk -r Wagic-$VERSION.apk -b $TRAVIS_BRANCH
|
||||
- python2 tools/upload-binaries.py -t $GH_TOKEN2 -s $TRAVIS_COMMIT -l projects/mtg/psprelease.zip -r WagicPSP-$VERSION.zip -b $TRAVIS_BRANCH
|
||||
- python2 tools/upload-binaries.py -t $GH_TOKEN2 -s $TRAVIS_COMMIT -l qt-gui-build/linuxqtrelease.zip -r WagicLinux-$VERSION.zip -b $TRAVIS_BRANCH
|
||||
- python2 tools/upload-binaries.py -t $GH_TOKEN2 -s $TRAVIS_COMMIT -l projects/mtg/CardImageLinks.csv -r CardImageLinks.csv -b $TRAVIS_BRANCH
|
||||
- if [ "$TRAVIS_OS_NAME" == "linux" ] && [ "$BUILD_TYPE" == "Qt" ]; then
|
||||
coveralls -b . -e JGE/src -e JGE/include -i projects/mtg/include -i projects/mtg/src --gcov-options '\-lp';
|
||||
fi
|
||||
- if [ "$BUILD_TYPE" == "ANDROID" ]; then
|
||||
python tools/upload-binaries.py -t $GH_TOKEN -s $TRAVIS_COMMIT -l core.zip -r Wagic-core.zip -b $TRAVIS_BRANCH &&
|
||||
python tools/upload-binaries.py -t $GH_TOKEN -s $TRAVIS_COMMIT -l build_android/package/bin/Wagic_*.apk -r Wagic-android.apk -b $TRAVIS_BRANCH;
|
||||
fi
|
||||
- if [ "$TRAVIS_OS_NAME" == "linux" ] && [ "$BUILD_TYPE" == "PSP" ]; then
|
||||
python tools/upload-binaries.py -t $GH_TOKEN -s $TRAVIS_COMMIT -l build_psp/psprelease.zip -r Wagic-psp.zip -b $TRAVIS_BRANCH;
|
||||
fi
|
||||
- if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$BUILD_TYPE" == "iOS" ]; then
|
||||
python tools/upload-binaries.py -t $GH_TOKEN -s $TRAVIS_COMMIT -l net.wagic_0.19.2-1_iphoneos-arm.deb -r Wagic-iOS.deb -b $TRAVIS_BRANCH;
|
||||
fi
|
||||
- if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$BUILD_TYPE" == "Qt" ]; then
|
||||
python tools/upload-binaries.py -t $GH_TOKEN -s $TRAVIS_COMMIT -l build_qt_widget/wagic.dmg -r Wagic-macosx.dmg -b $TRAVIS_BRANCH;
|
||||
fi
|
||||
- if [ "$TRAVIS_OS_NAME" == "osx" ] && [ "$BUILD_TYPE" == "Emscripten" ]; then
|
||||
./tools/deploy-emscripten.sh;
|
||||
fi
|
||||
|
||||
|
||||
+242
@@ -0,0 +1,242 @@
|
||||
cmake_minimum_required(VERSION 4.0)
|
||||
if(CMAKE_MAJOR_VERSION STRGREATER 3)
|
||||
cmake_policy(SET CMP0054 NEW)
|
||||
endif()
|
||||
|
||||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/CMakeModules)
|
||||
|
||||
#this block will fix install prefixes to install everything in a subdirectory
|
||||
#of cmake_binary_dir if we are on windows/android to make packaging more easy
|
||||
if(NOT CMAKE_TOOLCHAIN_FILE)
|
||||
if(WIN32)
|
||||
set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "Install directory")
|
||||
else()
|
||||
set(CMAKE_INSTALL_PREFIX "/usr/local" CACHE PATH "Install directory")
|
||||
endif()
|
||||
else() #we are cross-compiling (psp/android)
|
||||
#Android: set output folder for platform/android to pick up
|
||||
set(LIBRARY_OUTPUT_PATH_ROOT ${CMAKE_BINARY_DIR} CACHE PATH "library output root")
|
||||
set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "Install directory")
|
||||
endif()
|
||||
|
||||
#set available build types (debug/release)
|
||||
set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "Configs" FORCE)
|
||||
if(DEFINED CMAKE_BUILD_TYPE)
|
||||
set_property( CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS ${CMAKE_CONFIGURATION_TYPES} )
|
||||
endif()
|
||||
|
||||
set(EXECUTABLE_OUTPUT_PATH "${CMAKE_BINARY_DIR}/bin" CACHE PATH "Application output directory")
|
||||
|
||||
|
||||
project(wagic CXX C)
|
||||
#todo: somehow determine wagics version
|
||||
set(WAGIC_VERSION "0.19")
|
||||
|
||||
#add standard paths to search for libraries. borrowed from opencv
|
||||
if(UNIX AND NOT ANDROID)
|
||||
if(X86_64 OR CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||
if(EXISTS /lib64)
|
||||
list(APPEND CMAKE_LIBRARY_PATH /lib64)
|
||||
else()
|
||||
list(APPEND CMAKE_LIBRARY_PATH /lib)
|
||||
endif()
|
||||
if(EXISTS /usr/lib64)
|
||||
list(APPEND CMAKE_LIBRARY_PATH /usr/lib64)
|
||||
else()
|
||||
list(APPEND CMAKE_LIBRARY_PATH /usr/lib)
|
||||
endif()
|
||||
elseif(X86 OR CMAKE_SIZEOF_VOID_P EQUAL 4)
|
||||
if(EXISTS /lib32)
|
||||
list(APPEND CMAKE_LIBRARY_PATH /lib32)
|
||||
else()
|
||||
list(APPEND CMAKE_LIBRARY_PATH /lib)
|
||||
endif()
|
||||
if(EXISTS /usr/lib32)
|
||||
list(APPEND CMAKE_LIBRARY_PATH /usr/lib32)
|
||||
else()
|
||||
list(APPEND CMAKE_LIBRARY_PATH /usr/lib)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(ANDROID OR PSP OR IOS)
|
||||
#to allow finding of pathes/headers/libs within the source tree
|
||||
#even if only search for target platform libs
|
||||
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SOURCE_DIR} ${CMAKE_FIND_ROOT_PATH})
|
||||
endif()
|
||||
|
||||
#also borrowed from opencv
|
||||
if(MINGW)
|
||||
if(EXISTS /mingw)
|
||||
list(APPEND CMAKE_INCLUDE_PATH /mingw)
|
||||
endif()
|
||||
if(EXISTS /mingw32)
|
||||
list(APPEND CMAKE_INCLUDE_PATH /mingw32)
|
||||
endif()
|
||||
if(EXISTS /mingw64)
|
||||
list(APPEND CMAKE_INCLUDE_PATH /mingw64)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
include(utils)
|
||||
|
||||
#select the target backend
|
||||
if(PSP)
|
||||
WAGIC_OPTION(backend_psp "build for psp" ON)
|
||||
endif()
|
||||
if(WIN32 OR ANDROID OR UNIX)
|
||||
WAGIC_OPTION(backend_sdl "build for sdl" (WIN32 OR ANDROID OR EMSCRIPTEN))
|
||||
endif()
|
||||
if(NOT backend_sdl AND UNIX AND NOT ANDROID AND NOT IOS)
|
||||
WAGIC_OPTION(backend_qt_console "build qt-console version with testsuit" ON)
|
||||
WAGIC_OPTION(backend_qt_widget "build qt-widget version" OFF)
|
||||
endif()
|
||||
|
||||
#third party build options
|
||||
WAGIC_OPTION(BUILD_ZLIB "build zlib from source" ((NOT MINGW) AND (WIN32 OR APPLE)))
|
||||
WAGIC_OPTION(BUILD_JPEG "build jpeg from source" (WIN32 OR APPLE OR PSP OR ANDROID OR EMSCRIPTEN))
|
||||
WAGIC_OPTION(BUILD_PNG "build png from source" (WIN32 OR APPLE OR PSP OR ANDROID OR EMSCRIPTEN))
|
||||
WAGIC_OPTION(BUILD_UNZIP "build unzip from source" ON)
|
||||
WAGIC_OPTION(BUILD_TINYXML "build tinyxml from source" (WIN32 OR APPLE OR PSP OR ANDROID OR EMSCRIPTEN OR IOS))
|
||||
WAGIC_OPTION(BUILD_ZIPFS "build zipfs from source" ON)
|
||||
WAGIC_OPTION(BUILD_SDL2 "build SDL2 from source" (backend_sdl AND (UNIX OR WIN32 OR ANDROID) AND (NOT EMSCRIPTEN AND NOT IOS)))
|
||||
#WAGIC_OPTION(BUILD_CURL "build curl from source" (backend_sdl AND WIN32))
|
||||
|
||||
#project options
|
||||
if(ANDROID)
|
||||
WAGIC_OPTION(BUILD_ANDROID_PACKAGE "put the compiled code in an android package" ON)
|
||||
endif()
|
||||
|
||||
|
||||
if(ANDROID)
|
||||
set(LIBRARY_OUTPUT_PATH "${CMAKE_BINARY_DIR}/lib/${ANDROID_NDK_ABI_NAME}")
|
||||
set(3P_LIBRARY_OUTPUT_PATH "${CMAKE_BINARY_DIR}/3rdparty/lib/${ANDROID_NDK_ABI_NAME}")
|
||||
set(WAGIC_LIB_INSTALL_PATH sdk/native/libs/${ANDROID_NDK_ABI_NAME})
|
||||
set(WAGIC_3P_LIB_INSTALL_PATH sdk/native/3rdparty/libs/${ANDROID_NDK_ABI_NAME})
|
||||
set(WAGIC_CONFIG_INSTALL_PATH sdk/native/jni)
|
||||
set(WAGIC_INCLUDE_INSTALL_PATH sdk/native/jni/include)
|
||||
set(EXECUTABLE_OUTPUT_PATH "${CMAKE_BINARY_DIR}/package/bin")
|
||||
else()
|
||||
set(LIBRARY_OUTPUT_PATH "${CMAKE_BINARY_DIR}/lib")
|
||||
set(3P_LIBRARY_OUTPUT_PATH "${CMAKE_BINARY_DIR}/3rdparty/lib${LIB_SUFFIX}")
|
||||
set(WAGIC_LIB_INSTALL_PATH lib${LIB_SUFFIX})
|
||||
set(WAGIC_3P_LIB_INSTALL_PATH share/wagic/3rdparty/${WAGIC_LIB_INSTALL_PATH})
|
||||
set(WAGIC_INCLUDE_INSTALL_PATH "include")
|
||||
set(WAGIC_CONFIG_INSTALL_PATH share/wagic)
|
||||
endif()
|
||||
|
||||
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${WAGIC_LIB_INSTALL_PATH}")
|
||||
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
|
||||
|
||||
#if no build type is specified, we assume debug
|
||||
if(CMAKE_GENERATOR MATCHES "Makefiles|Ninja" AND "${CMAKE_BUILD_TYPE}" STREQUAL "")
|
||||
set(CMAKE_BUILD_TYPE Debug)
|
||||
endif()
|
||||
|
||||
include(FindOrBuild)
|
||||
|
||||
#set platform dependend configurations
|
||||
if(PSP)
|
||||
FindOrBuildPSPSDK()
|
||||
include(platforms/psp/configure.cmake)
|
||||
elseif(EMSCRIPTEN)
|
||||
include(platforms/emscripten/configure.cmake)
|
||||
elseif(WIN32)
|
||||
include(platforms/win/configure.cmake)
|
||||
elseif(APPLE)
|
||||
include(platforms/macosx/configure.cmake)
|
||||
elseif(UNIX AND NOT ANDROID)
|
||||
include(platforms/unix/configure.cmake)
|
||||
elseif(ANDROID)
|
||||
include(platforms/android/configure.cmake)
|
||||
endif()
|
||||
|
||||
#set backend dependend configurations
|
||||
if(backend_qt_console OR backend_qt_widget)
|
||||
add_definitions(-DQT_CONFIG)
|
||||
if(backend_qt_console)
|
||||
add_definitions(-DTESTSUITE -D_DEBUG)
|
||||
add_definitions(-DCONSOLE_CONFIG -DCAPTURE_STDERR)
|
||||
endif()
|
||||
elseif(backend_sdl)
|
||||
add_definitions(-DSDL_CONFIG)
|
||||
endif()
|
||||
|
||||
# find or build 3rd party libraries
|
||||
FindOrBuildZLIB()
|
||||
FindOrBuildOpenGL()
|
||||
FindOrBuildTinyXML()
|
||||
FindOrBuildZipFS()
|
||||
FindOrBuildUNZIP()
|
||||
FindOrBuildPNG()
|
||||
FindOrBuildJPEG()
|
||||
FindOrBuildBoost()
|
||||
#FindOrBuildCurl()
|
||||
|
||||
if(PSP)
|
||||
FindOrBuildGIF()
|
||||
endif()
|
||||
if(ANDROID)
|
||||
FindOrBuildOpenSL()
|
||||
endif()
|
||||
if(backend_sdl)
|
||||
FindOrBuildSDL2()
|
||||
endif()
|
||||
if(backend_psp)
|
||||
FindOrBuildFreetype()
|
||||
FindOrBuildHgeTools()
|
||||
FindOrBuildMikMod()
|
||||
endif()
|
||||
if(backend_qt_console OR backend_qt_widget)
|
||||
FindOrBuildQt()
|
||||
endif()
|
||||
if(ANDROID)
|
||||
include(DetectAndroidSDK)
|
||||
endif()
|
||||
|
||||
if(BUILD_ANDROID_PACKAGE)
|
||||
find_package(Ant REQUIRED)
|
||||
endif()
|
||||
|
||||
#add jge and mtg projects
|
||||
add_subdirectory(JGE)
|
||||
add_subdirectory(projects/mtg)
|
||||
|
||||
if(BUILD_ANDROID_PACKAGE)
|
||||
add_subdirectory(platforms/android/package)
|
||||
endif()
|
||||
|
||||
if(EMSCRIPTEN)
|
||||
set(CMAKE_EXECUTABLE_SUFFIX ".html")
|
||||
endif()
|
||||
|
||||
if(IOS)
|
||||
list_add_prefix(JGE_SOURCES " JGE/")
|
||||
list_add_prefix(MTG_generic_src " projects/mtg/")
|
||||
list_add_prefix(JGE_INCLUDE_DIRS " -IJGE/")
|
||||
list_add_prefix(MTG_INCLUDE_DIRS " -Iprojects/mtg/")
|
||||
list_add_prefix(TINYXML_SRC " thirdparty/tinyxml/")
|
||||
list_add_prefix(UNZIP_SRC " thirdparty/unzip/")
|
||||
list_add_prefix(ZIPFS_SRC " thirdparty/zipFS/")
|
||||
|
||||
file(WRITE makefile.ios
|
||||
"ARCHS= armv7 armv7s \n"
|
||||
"include ${THEOS_PATH}/makefiles/common.mk\n"
|
||||
"TARGET= iphone:clang:latest:8.0 \n"
|
||||
"APPLICATION_NAME = " ${PROJECT_NAME} "\n"
|
||||
${PROJECT_NAME} "_FILES =" ${ZIPFS_SRC} ${UNZIP_SRC} ${TINYXML_SRC} ${JGE_SOURCES} ${MTG_generic_src} " thirdparty/Boost/lib/pthread/once.cpp thirdparty/Boost/lib/pthread/thread.cpp\n"
|
||||
${PROJECT_NAME} "_LDFLAGS = -lz\n"
|
||||
${PROJECT_NAME} "_FRAMEWORKS = UIKit CoreGraphics OpenGLES Foundation CFNetwork MobileCoreServices AVFoundation OpenAL AudioToolbox QuartzCore SystemConfiguration\n"
|
||||
"include ${THEOS_PATH}/makefiles/application.mk\n"
|
||||
"ADDITIONAL_CFLAGS = " ${MTG_INCLUDE_DIRS} ${JGE_INCLUDE_DIRS} " -I" ${ZIPFS_INCLUDE_DIR} " -I" ${UNZIP_INCLUDE_DIR} " -I" ${HGE_INCLUDE_DIR} ${TINYXML_INCLUDE_DIR} " -I" ${ZLIB_INCLUDE_DIRS} ${BOOST_INCLUDE_DIRS} " "
|
||||
"-DIOS -D__arm__ -DTIXML_USE_STL -DVERSION=\"$(GIT_VERSION)\" "
|
||||
"-Wno-parentheses-equality -Wno-delete-non-virtual-dtor "
|
||||
"-Wno-tautological-undefined-compare -Wno-undefined-bool-conversion "
|
||||
"-Wno-visibility -Wno-deprecated-declarations -Wno-non-literal-null-conversion "
|
||||
"-Wno-format -Wno-distributed-object-modifiers -Wno-missing-braces -Wno-uninitialized "
|
||||
"-Wno-unused-const-variable -Wno-unused-function -Wno-unknown-warning-option -Wno-unused-local-typedef "
|
||||
"-x objective-c++ \n"
|
||||
|
||||
"_THEOS_TARGET_ONLY_OBJCFLAGS :=\"\"\n"
|
||||
)
|
||||
endif()
|
||||
@@ -0,0 +1,373 @@
|
||||
if(EXISTS "${ANDROID_EXECUTABLE}")
|
||||
set(ANDROID_SDK_DETECT_QUIET TRUE)
|
||||
endif()
|
||||
|
||||
file(TO_CMAKE_PATH "$ENV{ProgramFiles}" ProgramFiles_ENV_PATH)
|
||||
file(TO_CMAKE_PATH "$ENV{HOME}" HOME_ENV_PATH)
|
||||
|
||||
if(CMAKE_HOST_WIN32)
|
||||
set(ANDROID_SDK_OS windows)
|
||||
elseif(CMAKE_HOST_APPLE)
|
||||
set(ANDROID_SDK_OS macosx)
|
||||
else()
|
||||
set(ANDROID_SDK_OS linux)
|
||||
endif()
|
||||
|
||||
#find android SDK: search in ANDROID_SDK first
|
||||
find_host_program(ANDROID_EXECUTABLE
|
||||
NAMES android.bat android
|
||||
PATH_SUFFIXES tools
|
||||
PATHS
|
||||
ENV ANDROID_SDK
|
||||
DOC "Android SDK location"
|
||||
NO_DEFAULT_PATH
|
||||
)
|
||||
|
||||
# Now search default paths
|
||||
find_host_program(ANDROID_EXECUTABLE
|
||||
NAMES android.bat android
|
||||
PATH_SUFFIXES android-sdk-${ANDROID_SDK_OS}/tools
|
||||
android-sdk-${ANDROID_SDK_OS}_x86/tools
|
||||
android-sdk-${ANDROID_SDK_OS}_86/tools
|
||||
android-sdk/tools
|
||||
PATHS /opt
|
||||
"${HOME_ENV_PATH}/NVPACK"
|
||||
"$ENV{SystemDrive}/NVPACK"
|
||||
"${ProgramFiles_ENV_PATH}/Android"
|
||||
DOC "Android SDK location"
|
||||
)
|
||||
|
||||
if(ANDROID_EXECUTABLE)
|
||||
if(NOT ANDROID_SDK_DETECT_QUIET)
|
||||
message(STATUS "Found android tool: ${ANDROID_EXECUTABLE}")
|
||||
endif()
|
||||
|
||||
get_filename_component(ANDROID_SDK_TOOLS_PATH "${ANDROID_EXECUTABLE}" PATH)
|
||||
|
||||
#read source.properties
|
||||
if(EXISTS "${ANDROID_SDK_TOOLS_PATH}/source.properties")
|
||||
file(STRINGS "${ANDROID_SDK_TOOLS_PATH}/source.properties" ANDROID_SDK_TOOLS_SOURCE_PROPERTIES_LINES REGEX "^[ ]*[^#].*$")
|
||||
foreach(line ${ANDROID_SDK_TOOLS_SOURCE_PROPERTIES_LINES})
|
||||
string(REPLACE "\\:" ":" line ${line})
|
||||
string(REPLACE "=" ";" line ${line})
|
||||
list(GET line 0 line_name)
|
||||
list(GET line 1 line_value)
|
||||
string(REPLACE "." "_" line_name ${line_name})
|
||||
SET(ANDROID_TOOLS_${line_name} "${line_value}" CACHE INTERNAL "from ${ANDROID_SDK_TOOLS_PATH}/source.properties")
|
||||
MARK_AS_ADVANCED(ANDROID_TOOLS_${line_name})
|
||||
endforeach()
|
||||
endif()
|
||||
|
||||
#fix missing revision (SDK tools before r9 don't set revision number correctly)
|
||||
if(NOT ANDROID_TOOLS_Pkg_Revision)
|
||||
SET(ANDROID_TOOLS_Pkg_Revision "Unknown" CACHE INTERNAL "")
|
||||
MARK_AS_ADVANCED(ANDROID_TOOLS_Pkg_Revision)
|
||||
endif()
|
||||
|
||||
#fix missing description
|
||||
if(NOT ANDROID_TOOLS_Pkg_Desc)
|
||||
SET(ANDROID_TOOLS_Pkg_Desc "Android SDK Tools, revision ${ANDROID_TOOLS_Pkg_Revision}." CACHE INTERNAL "")
|
||||
MARK_AS_ADVANCED(ANDROID_TOOLS_Pkg_Desc)
|
||||
endif()
|
||||
|
||||
#warn about outdated SDK
|
||||
if(NOT ANDROID_TOOLS_Pkg_Revision GREATER 13)
|
||||
SET(ANDROID_TOOLS_Pkg_Desc "${ANDROID_TOOLS_Pkg_Desc} It is recommended to update your SDK tools to revision 14 or newer." CACHE INTERNAL "")
|
||||
endif()
|
||||
|
||||
if(ANDROID_TOOLS_Pkg_Revision GREATER 13)
|
||||
SET(ANDROID_PROJECT_PROPERTIES_FILE project.properties)
|
||||
SET(ANDROID_ANT_PROPERTIES_FILE ant.properties)
|
||||
else()
|
||||
SET(ANDROID_PROJECT_PROPERTIES_FILE default.properties)
|
||||
SET(ANDROID_ANT_PROPERTIES_FILE build.properties)
|
||||
endif()
|
||||
|
||||
set(ANDROID_MANIFEST_FILE AndroidManifest.xml)
|
||||
set(ANDROID_LIB_PROJECT_FILES build.xml local.properties proguard-project.txt ${ANDROID_PROJECT_PROPERTIES_FILE})
|
||||
set(ANDROID_PROJECT_FILES ${ANDROID_LIB_PROJECT_FILES})
|
||||
|
||||
#get installed targets
|
||||
if(ANDROID_TOOLS_Pkg_Revision GREATER 11)
|
||||
execute_process(COMMAND ${ANDROID_EXECUTABLE} list target -c
|
||||
RESULT_VARIABLE ANDROID_PROCESS
|
||||
OUTPUT_VARIABLE ANDROID_SDK_TARGETS
|
||||
ERROR_VARIABLE ANDROID_PROCESS_ERRORS
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
string(REGEX MATCHALL "[^\n]+" ANDROID_SDK_TARGETS "${ANDROID_SDK_TARGETS}")
|
||||
else()
|
||||
#old SDKs (r11 and older) don't provide compact list
|
||||
execute_process(COMMAND ${ANDROID_EXECUTABLE} list target
|
||||
RESULT_VARIABLE ANDROID_PROCESS
|
||||
OUTPUT_VARIABLE ANDROID_SDK_TARGETS_FULL
|
||||
ERROR_VARIABLE ANDROID_PROCESS_ERRORS
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
string(REGEX MATCHALL "(^|\n)id: [0-9]+ or \"([^\n]+[0-9+])\"(\n|$)" ANDROID_SDK_TARGETS_FULL "${ANDROID_SDK_TARGETS_FULL}")
|
||||
|
||||
SET(ANDROID_SDK_TARGETS "")
|
||||
if(ANDROID_PROCESS EQUAL 0)
|
||||
foreach(line ${ANDROID_SDK_TARGETS_FULL})
|
||||
string(REGEX REPLACE "(^|\n)id: [0-9]+ or \"([^\n]+[0-9+])\"(\n|$)" "\\2" line "${line}")
|
||||
list(APPEND ANDROID_SDK_TARGETS "${line}")
|
||||
endforeach()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NOT ANDROID_PROCESS EQUAL 0)
|
||||
message(ERROR "Failed to get list of installed Android targets.")
|
||||
set(ANDROID_EXECUTABLE "ANDROID_EXECUTABLE-NOTFOUND")
|
||||
endif()
|
||||
|
||||
# clear ANDROID_SDK_TARGET if no target is provided by user
|
||||
if(NOT ANDROID_SDK_TARGET)
|
||||
set(ANDROID_SDK_TARGET "" CACHE STRING "Android SDK target for the Wagic Java API and samples")
|
||||
endif()
|
||||
if(ANDROID_SDK_TARGETS)
|
||||
set_property( CACHE ANDROID_SDK_TARGET PROPERTY STRINGS ${ANDROID_SDK_TARGETS} )
|
||||
endif()
|
||||
endif(ANDROID_EXECUTABLE)
|
||||
|
||||
# finds minimal installed SDK target compatible with provided names or API levels
|
||||
# usage:
|
||||
# get_compatible_android_api_level(VARIABLE [level1] [level2] ...)
|
||||
macro(android_get_compatible_target VAR)
|
||||
set(${VAR} "${VAR}-NOTFOUND")
|
||||
if(ANDROID_SDK_TARGETS)
|
||||
list(GET ANDROID_SDK_TARGETS 0 __lvl)
|
||||
string(REGEX MATCH "[0-9]+$" __lvl "${__lvl}")
|
||||
|
||||
#find minimal level mathing to all provided levels
|
||||
foreach(lvl ${ARGN})
|
||||
string(REGEX MATCH "[0-9]+$" __level "${lvl}")
|
||||
if(__level GREATER __lvl)
|
||||
set(__lvl ${__level})
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
#search for compatible levels
|
||||
foreach(lvl ${ANDROID_SDK_TARGETS})
|
||||
string(REGEX MATCH "[0-9]+$" __level "${lvl}")
|
||||
if(__level EQUAL __lvl)
|
||||
#look for exact match
|
||||
foreach(usrlvl ${ARGN})
|
||||
if("${usrlvl}" STREQUAL "${lvl}")
|
||||
set(${VAR} "${lvl}")
|
||||
break()
|
||||
endif()
|
||||
endforeach()
|
||||
if("${${VAR}}" STREQUAL "${lvl}")
|
||||
break() #exact match was found
|
||||
elseif(NOT ${VAR})
|
||||
set(${VAR} "${lvl}")
|
||||
endif()
|
||||
elseif(__level GREATER __lvl)
|
||||
if(NOT ${VAR})
|
||||
set(${VAR} "${lvl}")
|
||||
endif()
|
||||
break()
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
unset(__lvl)
|
||||
unset(__level)
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
unset(__android_project_chain CACHE)
|
||||
|
||||
# add_android_project(target_name ${path} NATIVE_DEPS opencv_core LIBRARY_DEPS ${Wagic_BINARY_DIR} SDK_TARGET 11)
|
||||
macro(add_android_project target path)
|
||||
# parse arguments
|
||||
set(android_proj_arglist NATIVE_DEPS LIBRARY_DEPS SDK_TARGET IGNORE_JAVA IGNORE_MANIFEST)
|
||||
set(__varname "android_proj_")
|
||||
foreach(v ${android_proj_arglist})
|
||||
set(${__varname}${v} "")
|
||||
endforeach()
|
||||
foreach(arg ${ARGN})
|
||||
set(__var "${__varname}")
|
||||
foreach(v ${android_proj_arglist})
|
||||
if("${v}" STREQUAL "${arg}")
|
||||
set(__varname "android_proj_${v}")
|
||||
break()
|
||||
endif()
|
||||
endforeach()
|
||||
if(__var STREQUAL __varname)
|
||||
list(APPEND ${__var} "${arg}")
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
# get compatible SDK target
|
||||
android_get_compatible_target(android_proj_sdk_target ${ANDROID_NATIVE_API_LEVEL} ${android_proj_SDK_TARGET})
|
||||
|
||||
if(NOT android_proj_sdk_target)
|
||||
message(WARNING "Can not find any SDK target compatible with: ${ANDROID_NATIVE_API_LEVEL} ${android_proj_SDK_TARGET}
|
||||
The project ${target} will not be build")
|
||||
endif()
|
||||
|
||||
# check native dependencies
|
||||
if(android_proj_IGNORE_JAVA)
|
||||
ocv_check_dependencies(${android_proj_NATIVE_DEPS})
|
||||
else()
|
||||
ocv_check_dependencies(${android_proj_NATIVE_DEPS} opencv_java)
|
||||
endif()
|
||||
|
||||
if(EXISTS "${path}/jni/Android.mk" )
|
||||
# find if native_app_glue is used
|
||||
file(STRINGS "${path}/jni/Android.mk" NATIVE_APP_GLUE REGEX ".*(call import-module,android/native_app_glue)" )
|
||||
if(NATIVE_APP_GLUE)
|
||||
if(ANDROID_NATIVE_API_LEVEL LESS 9 OR NOT EXISTS "${ANDROID_NDK}/sources/android/native_app_glue")
|
||||
set(OCV_DEPENDENCIES_FOUND FALSE)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(OCV_DEPENDENCIES_FOUND AND android_proj_sdk_target AND ANDROID_EXECUTABLE AND ANT_EXECUTABLE AND ANDROID_TOOLS_Pkg_Revision GREATER 13 AND EXISTS "${path}/${ANDROID_MANIFEST_FILE}")
|
||||
|
||||
project(${target})
|
||||
set(android_proj_bin_dir "${CMAKE_CURRENT_BINARY_DIR}/.build")
|
||||
|
||||
# get project sources
|
||||
file(GLOB_RECURSE android_proj_files RELATIVE "${path}" "${path}/res/*" "${path}/src/*")
|
||||
|
||||
if(NOT android_proj_IGNORE_MANIFEST)
|
||||
list(APPEND android_proj_files ${ANDROID_MANIFEST_FILE})
|
||||
endif()
|
||||
|
||||
# copy sources out from the build tree
|
||||
set(android_proj_file_deps "")
|
||||
foreach(f ${android_proj_files})
|
||||
add_custom_command(
|
||||
OUTPUT "${android_proj_bin_dir}/${f}"
|
||||
COMMAND ${CMAKE_COMMAND} -E copy "${path}/${f}" "${android_proj_bin_dir}/${f}"
|
||||
MAIN_DEPENDENCY "${path}/${f}"
|
||||
COMMENT "Copying ${f}")
|
||||
list(APPEND android_proj_file_deps "${path}/${f}" "${android_proj_bin_dir}/${f}")
|
||||
endforeach()
|
||||
|
||||
set(android_proj_lib_deps_commands "")
|
||||
set(android_proj_target_files ${ANDROID_PROJECT_FILES})
|
||||
ocv_list_add_prefix(android_proj_target_files "${android_proj_bin_dir}/")
|
||||
|
||||
# process Android library dependencies
|
||||
foreach(dep ${android_proj_LIBRARY_DEPS})
|
||||
file(RELATIVE_PATH __dep "${android_proj_bin_dir}" "${dep}")
|
||||
list(APPEND android_proj_lib_deps_commands
|
||||
COMMAND ${ANDROID_EXECUTABLE} --silent update project --path "${android_proj_bin_dir}" --library "${__dep}")
|
||||
endforeach()
|
||||
|
||||
# fix Android project
|
||||
add_custom_command(
|
||||
OUTPUT ${android_proj_target_files}
|
||||
COMMAND ${CMAKE_COMMAND} -E remove ${android_proj_target_files}
|
||||
COMMAND ${ANDROID_EXECUTABLE} --silent update project --path "${android_proj_bin_dir}" --target "${android_proj_sdk_target}" --name "${target}"
|
||||
${android_proj_lib_deps_commands}
|
||||
MAIN_DEPENDENCY "${android_proj_bin_dir}/${ANDROID_MANIFEST_FILE}"
|
||||
DEPENDS "${path}/${ANDROID_MANIFEST_FILE}"
|
||||
COMMENT "Updating Android project at ${path}. SDK target: ${android_proj_sdk_target}"
|
||||
)
|
||||
|
||||
list(APPEND android_proj_file_deps ${android_proj_target_files})
|
||||
|
||||
# build native part
|
||||
file(GLOB_RECURSE android_proj_jni_files "${path}/jni/*.c" "${path}/jni/*.h" "${path}/jni/*.cpp" "${path}/jni/*.hpp")
|
||||
ocv_list_filterout(android_proj_jni_files "\\\\.svn")
|
||||
|
||||
if(android_proj_jni_files AND EXISTS ${path}/jni/Android.mk AND NOT DEFINED JNI_LIB_NAME)
|
||||
# find local module name in Android.mk file to build native lib
|
||||
file(STRINGS "${path}/jni/Android.mk" JNI_LIB_NAME REGEX "LOCAL_MODULE[ ]*:=[ ]*.*" )
|
||||
string(REGEX REPLACE "LOCAL_MODULE[ ]*:=[ ]*([a-zA-Z_][a-zA-Z_0-9]*)[ ]*" "\\1" JNI_LIB_NAME "${JNI_LIB_NAME}")
|
||||
|
||||
if(JNI_LIB_NAME)
|
||||
ocv_include_modules_recurse(${android_proj_NATIVE_DEPS})
|
||||
ocv_include_directories("${path}/jni")
|
||||
|
||||
if(NATIVE_APP_GLUE)
|
||||
include_directories(${ANDROID_NDK}/sources/android/native_app_glue)
|
||||
list(APPEND android_proj_jni_files ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c)
|
||||
ocv_warnings_disable(CMAKE_C_FLAGS -Wstrict-prototypes -Wunused-parameter -Wmissing-prototypes)
|
||||
set(android_proj_NATIVE_DEPS ${android_proj_NATIVE_DEPS} android)
|
||||
endif()
|
||||
|
||||
add_library(${JNI_LIB_NAME} MODULE ${android_proj_jni_files})
|
||||
target_link_libraries(${JNI_LIB_NAME} ${OPENCV_LINKER_LIBS} ${android_proj_NATIVE_DEPS})
|
||||
|
||||
set_target_properties(${JNI_LIB_NAME} PROPERTIES
|
||||
OUTPUT_NAME "${JNI_LIB_NAME}"
|
||||
LIBRARY_OUTPUT_DIRECTORY "${android_proj_bin_dir}/libs/${ANDROID_NDK_ABI_NAME}"
|
||||
)
|
||||
|
||||
get_target_property(android_proj_jni_location "${JNI_LIB_NAME}" LOCATION)
|
||||
if (NOT (CMAKE_BUILD_TYPE MATCHES "debug"))
|
||||
add_custom_command(TARGET ${JNI_LIB_NAME} POST_BUILD COMMAND ${CMAKE_STRIP} --strip-unneeded "${android_proj_jni_location}")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# build java part
|
||||
if(android_proj_IGNORE_JAVA)
|
||||
add_custom_command(
|
||||
OUTPUT "${android_proj_bin_dir}/bin/${target}-debug.apk"
|
||||
COMMAND ${ANT_EXECUTABLE} -q -noinput -k debug
|
||||
COMMAND ${CMAKE_COMMAND} -E touch "${android_proj_bin_dir}/bin/${target}-debug.apk" # needed because ant does not update the timestamp of updated apk
|
||||
WORKING_DIRECTORY "${android_proj_bin_dir}"
|
||||
MAIN_DEPENDENCY "${android_proj_bin_dir}/${ANDROID_MANIFEST_FILE}"
|
||||
DEPENDS ${android_proj_file_deps} ${JNI_LIB_NAME})
|
||||
else()
|
||||
add_custom_command(
|
||||
OUTPUT "${android_proj_bin_dir}/bin/${target}-debug.apk"
|
||||
COMMAND ${ANT_EXECUTABLE} -q -noinput -k debug
|
||||
COMMAND ${CMAKE_COMMAND} -E touch "${android_proj_bin_dir}/bin/${target}-debug.apk" # needed because ant does not update the timestamp of updated apk
|
||||
WORKING_DIRECTORY "${android_proj_bin_dir}"
|
||||
MAIN_DEPENDENCY "${android_proj_bin_dir}/${ANDROID_MANIFEST_FILE}"
|
||||
DEPENDS "${Wagic_BINARY_DIR}/bin/classes.jar.dephelper" opencv_java # as we are part of Wagic we can just force this dependency
|
||||
DEPENDS ${android_proj_file_deps} ${JNI_LIB_NAME})
|
||||
endif()
|
||||
|
||||
unset(JNI_LIB_NAME)
|
||||
|
||||
add_custom_target(${target} ALL SOURCES "${android_proj_bin_dir}/bin/${target}-debug.apk" )
|
||||
if(NOT android_proj_IGNORE_JAVA)
|
||||
add_dependencies(${target} opencv_java)
|
||||
endif()
|
||||
if(android_proj_native_deps)
|
||||
add_dependencies(${target} ${android_proj_native_deps})
|
||||
endif()
|
||||
|
||||
if(__android_project_chain)
|
||||
add_dependencies(${target} ${__android_project_chain})
|
||||
endif()
|
||||
set(__android_project_chain ${target} CACHE INTERNAL "auxiliary variable used for Android progects chaining")
|
||||
|
||||
# put the final .apk to the Wagic's bin folder
|
||||
add_custom_command(TARGET ${target} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy "${android_proj_bin_dir}/bin/${target}-debug.apk" "${Wagic_BINARY_DIR}/bin/${target}.apk")
|
||||
if(INSTALL_ANDROID_EXAMPLES AND "${target}" MATCHES "^example-")
|
||||
#apk
|
||||
install(FILES "${Wagic_BINARY_DIR}/bin/${target}.apk" DESTINATION "samples" COMPONENT main)
|
||||
get_filename_component(sample_dir "${path}" NAME)
|
||||
#java part
|
||||
list(REMOVE_ITEM android_proj_files ${ANDROID_MANIFEST_FILE})
|
||||
foreach(f ${android_proj_files} ${ANDROID_MANIFEST_FILE})
|
||||
get_filename_component(install_subdir "${f}" PATH)
|
||||
install(FILES "${android_proj_bin_dir}/${f}" DESTINATION "samples/${sample_dir}/${install_subdir}" COMPONENT main)
|
||||
endforeach()
|
||||
#jni part + eclipse files
|
||||
file(GLOB_RECURSE jni_files RELATIVE "${path}" "${path}/jni/*" "${path}/.cproject")
|
||||
ocv_list_filterout(jni_files "\\\\.svn")
|
||||
foreach(f ${jni_files} ".classpath" ".project" ".settings/org.eclipse.jdt.core.prefs")
|
||||
get_filename_component(install_subdir "${f}" PATH)
|
||||
install(FILES "${path}/${f}" DESTINATION "samples/${sample_dir}/${install_subdir}" COMPONENT main)
|
||||
endforeach()
|
||||
#update proj
|
||||
if(android_proj_lib_deps_commands)
|
||||
set(inst_lib_opt " --library ../../sdk/java")
|
||||
endif()
|
||||
install(CODE "EXECUTE_PROCESS(COMMAND ${ANDROID_EXECUTABLE} --silent update project --path . --target \"${android_proj_sdk_target}\" --name \"${target}\" ${inst_lib_opt}
|
||||
WORKING_DIRECTORY \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/samples/${sample_dir}\"
|
||||
)" COMPONENT main)
|
||||
#empty 'gen'
|
||||
install(CODE "MAKE_DIRECTORY(\"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/samples/${sample_dir}/gen\")" COMPONENT main)
|
||||
endif()
|
||||
endif()
|
||||
endmacro()
|
||||
@@ -0,0 +1,13 @@
|
||||
find_host_program(ANT_EXECUTABLE "ant")
|
||||
|
||||
if(ANT_EXECUTABLE)
|
||||
set(ANT_FOUND ON)
|
||||
else()
|
||||
set(ANT_FOUND OFF)
|
||||
endif()
|
||||
|
||||
|
||||
INCLUDE(FindPackageHandleStandardArgs)
|
||||
|
||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(ANT REQUIRED_VARS ANT_EXECUTABLE)
|
||||
mark_as_advanced(ANT_EXECUTABLE ANT_FOUND)
|
||||
@@ -0,0 +1,29 @@
|
||||
# - Find OpenSL (actually OpenSLES)
|
||||
# Find the OpenSLES includes and libraries
|
||||
#
|
||||
# OPENSL_INCLUDE_DIR - where to find dsound.h
|
||||
# OPENSL_LIBRARIES - List of libraries when using dsound.
|
||||
# OPENSL_FOUND - True if dsound found.
|
||||
|
||||
if(OPENSL_INCLUDE_DIR)
|
||||
# Already in cache, be silent
|
||||
set(OPENSL_FIND_QUIETLY TRUE)
|
||||
endif(OPENSL_INCLUDE_DIR)
|
||||
|
||||
find_path(OPENSL_INCLUDE_DIR SLES/OpenSLES.h)
|
||||
|
||||
find_library(OPENSL_LIBRARY NAMES OpenSLES)
|
||||
|
||||
# Handle the QUIETLY and REQUIRED arguments and set OPENSL_FOUND to TRUE if
|
||||
# all listed variables are TRUE.
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(OPENSL DEFAULT_MSG
|
||||
OPENSL_INCLUDE_DIR OPENSL_LIBRARY)
|
||||
|
||||
if(OPENSL_FOUND)
|
||||
set(OPENSL_LIBRARIES ${OPENSL_LIBRARY})
|
||||
else(OPENSL_FOUND)
|
||||
set(OPENSL_LIBRARIES)
|
||||
endif(OPENSL_FOUND)
|
||||
|
||||
mark_as_advanced(OPENSL_INCLUDE_DIR OPENSL_LIBRARY)
|
||||
@@ -0,0 +1,267 @@
|
||||
macro(FindOrBuildZipFS)
|
||||
if(BUILD_ZIPFS)
|
||||
add_subdirectory(
|
||||
${CMAKE_SOURCE_DIR}/thirdparty/zipFS
|
||||
${CMAKE_BINARY_DIR}/thirdparty/zipFS)
|
||||
set(ZIPFS_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/thirdparty/zipFS)
|
||||
set(ZIPFS_LIBRARY zipFS)
|
||||
else()
|
||||
message(WARNING "ZIPFS must get build")
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
macro(FindOrBuildTinyXML)
|
||||
if(BUILD_TINYXML)
|
||||
add_definitions(-DTIXML_USE_STL)
|
||||
add_subdirectory(
|
||||
${CMAKE_SOURCE_DIR}/thirdparty/tinyxml
|
||||
${CMAKE_BINARY_DIR}/thirdparty/tinyxml)
|
||||
set(TINYXML_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/thirdparty/tinyxml)
|
||||
set(TINYXML_LIBRARIES tinyxml)
|
||||
else()
|
||||
find_package(TinyXML REQUIRED)
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
macro(FindOrBuildSDL2)
|
||||
if(BUILD_SDL2)
|
||||
if(WIN32)
|
||||
#SDL2 DirectX build is somehow broken...
|
||||
set(SDL_AUDIO FALSE)
|
||||
set(SDL_JOYSTICK FALSE)
|
||||
set(SDL_HAPTIC FALSE)
|
||||
# Forcing static build on Windows as SDL2main is often needed and easier to link statically.
|
||||
# Set SDL_SHARED to OFF *before* adding the subdirectory to influence its build.
|
||||
set(SDL_SHARED OFF CACHE BOOL "Build SDL2 as a static library" FORCE)
|
||||
endif()
|
||||
# Add the subdirectory. This creates targets like SDL2::SDL2, SDL2::SDL2-static, SDL2::SDL2main
|
||||
add_subdirectory(${CMAKE_SOURCE_DIR}/thirdparty/SDL2 ${CMAKE_BINARY_DIR}/thirdparty/SDL2)
|
||||
set(SDL2_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/thirdparty/SDL2/include ${CMAKE_BINARY_DIR}/thirdparty/SDL2)
|
||||
# Linking against SDL2::SDL2 below handles includes automatically.
|
||||
if(EMSCRIPTEN)
|
||||
# Emscripten typically uses static linking
|
||||
set(SDL2_LIBRARY SDL2::SDL2-static) # Use the CMake target
|
||||
else()
|
||||
# Link against SDL2 (shared or static based on SDL_SHARED) and SDL2main
|
||||
# SDL2::SDL2 resolves to the correct shared/static target.
|
||||
# SDL2::SDL2main is needed on many platforms, especially Windows.
|
||||
set(SDL2_LIBRARY SDL2::SDL2 SDL2::SDL2main) # Use the CMake targets
|
||||
endif()
|
||||
elseif(NOT EMSCRIPTEN)
|
||||
# If not building from source, use the find_package module
|
||||
find_package(SDL2)
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
macro(FindOrBuildUNZIP)
|
||||
if(BUILD_UNZIP)
|
||||
add_subdirectory(
|
||||
${CMAKE_SOURCE_DIR}/thirdparty/unzip
|
||||
${CMAKE_BINARY_DIR}/thirdparty/unzip)
|
||||
set(UNZIP_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/thirdparty/unzip)
|
||||
set(UNZIP_LIBRARY unzip)
|
||||
else()
|
||||
message(WARNING "UNZIP must get build")
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
macro(FindOrBuildBoost)
|
||||
if(PSP OR UNIX OR WIN32 OR IOS)
|
||||
#the psp build does not need more than a few headers
|
||||
#todo: remove from the repository
|
||||
set(BOOST_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/thirdparty/Boost)
|
||||
# elseif(WIN32)
|
||||
#set BOOST_ROOT to the root of boost
|
||||
# set(Boost_USE_STATIC_LIBS ON)
|
||||
# set(Boost_USE_MULTITHREADED ON)
|
||||
# set(BOOST_ROOT $ENV{BOOST_ROOT})
|
||||
|
||||
# set(BOOST_LIBRARYDIR ${BOOST_ROOT}/libs)
|
||||
# set(BOOST_INCLUDEDIR ${BOOST_ROOT})
|
||||
|
||||
# find_package(Boost COMPONENTS system thread date_time REQUIRED)
|
||||
# if(NOT Boost_FOUND)
|
||||
# message("Set the BOOST_ROOT environment variable to point to your boost installation.")
|
||||
# message("We need system thread and date_time compiled static libs")
|
||||
# message("These libs are compiler specific.")
|
||||
# endif()
|
||||
# elseif(UNIX AND NOT ANDROID)
|
||||
# find_package(Boost COMPONENTS system thread date_time REQUIRED)
|
||||
elseif(ANDROID)
|
||||
#this is a hack. we compile a few boost libds directly into
|
||||
#the application. we should require static libs for android
|
||||
#to be available. maybe we could add the build option to
|
||||
#download and build a compatible boost version
|
||||
find_path(BOOST_INCLUDE_DIRS NAMES bind.hpp HINTS $ENV{ANDROID_BOOST_ROOT} PATH_SUFFIXES boost)
|
||||
|
||||
if(BOOST_INCLUDE_DIRS)
|
||||
get_filename_component(BOOST_INCLUDE_DIRS ${BOOST_INCLUDE_DIRS} PATH)
|
||||
set(ANDROID_BOOST_PTHREAD_SRC_DIR ${BOOST_INCLUDE_DIRS}/libs/thread/src/pthread)
|
||||
set(ANDROID_BOOST_SYSTEM_SRC_DIR ${BOOST_INCLUDE_DIRS}/libs/system/src/)
|
||||
else()
|
||||
message(SEND_ERROR "We require a few boost sources to get compiled into wagic. Please point the ANDROID_BOOST_ROOT environment variable to a boost-source copy root.")
|
||||
endif()
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
|
||||
macro(FindOrBuildZLIB)
|
||||
if(BUILD_ZLIB)
|
||||
add_subdirectory(${CMAKE_SOURCE_DIR}/thirdparty/zlib ${CMAKE_BINARY_DIR}/thirdparty/zlib)
|
||||
set(ZLIB_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/thirdparty/zlib)
|
||||
set(ZLIB_LIBRARIES ZLIB::ZLIBSTATIC)
|
||||
else()
|
||||
if(WIN32 AND NOT MINGW)
|
||||
set(ZLIB_ROOT ${CMAKE_SOURCE_DIR}/thirdparty/binary/win)
|
||||
find_package(ZLIB)
|
||||
else()
|
||||
if(MINGW)
|
||||
set(ZLIB_USE_STATIC_LIBS TRUE)
|
||||
find_package(ZLIB REQUIRED)
|
||||
else()
|
||||
if(backend_qt_console OR backend_qt_widget OR EMSCRIPTEN)
|
||||
set(ZLIB_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/thirdparty/zlib)
|
||||
else()
|
||||
find_package(ZLIB)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
macro(FindOrBuildGIF)
|
||||
if(BUILD_GIF)
|
||||
message(WARNING "GIF sources are currently not included within the wagic tree")
|
||||
else()
|
||||
if(PSP)
|
||||
find_package(GIF)
|
||||
endif()
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
macro(FindOrBuildJPEG)
|
||||
if(BUILD_JPEG)
|
||||
add_subdirectory(${CMAKE_SOURCE_DIR}/thirdparty/libjpeg ${CMAKE_BINARY_DIR}/thirdparty/libjpeg)
|
||||
set(JPEG_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/thirdparty/libjpeg)
|
||||
set(JPEG_LIBRARY jpeg)
|
||||
else()
|
||||
if(WIN32)
|
||||
#findJPEG does currently not provide prefix vars to guide it
|
||||
find_path(JPEG_INCLUDE_DIR jpeglib.h HINTS ${CMAKE_SOURCE_DIR}/thirdparty/binary/win/include)
|
||||
find_library(JPEG_LIBRARY NAMES libjpeg-static-mt HINTS ${CMAKE_SOURCE_DIR}/thirdparty/binary/win/lib)
|
||||
|
||||
if(JPEG_INCLUDE_DIR AND JPEG_LIBRARY)
|
||||
set(JPEG_FOUND ON)
|
||||
mark_as_advanced(JPEG_INCLUDE_DIR JPEG_LIBRARY)
|
||||
else()
|
||||
message(FATAL_ERROR "Could not find JPEG on windows")
|
||||
endif()
|
||||
else()
|
||||
find_package(JPEG)
|
||||
endif()
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
macro(FindOrBuildPNG)
|
||||
if(BUILD_PNG)
|
||||
add_subdirectory(${CMAKE_SOURCE_DIR}/thirdparty/libpng ${CMAKE_BINARY_DIR}/thirdparty/libpng)
|
||||
set(PNG_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/thirdparty/libpng)
|
||||
# find_path(PNG_INCLUDE_DIRS NAMES png.h HINTS ${CMAKE_SOURCE_DIR}/thirdparty/libpng)
|
||||
set(PNG_LIBRARIES png)
|
||||
else()
|
||||
if(WIN32)
|
||||
#findPNG does currently not provide prefix vars. so we find
|
||||
find_path(PNG_INCLUDE_DIRS png.h HINTS ${CMAKE_SOURCE_DIR}/thirdparty/binary/win/include)
|
||||
find_library(PNG_LIBRARIES libpng HINTS ${CMAKE_SOURCE_DIR}/thirdparty/binary/win/lib)
|
||||
|
||||
if (PNG_LIBRARIES AND PNG_INCLUDE_DIRS)
|
||||
set(PNG_FOUND ON)
|
||||
mark_as_advanced(PNG_INCLUDE_DIRS PNG_LIBRARIES)
|
||||
else()
|
||||
message(FATAL_ERROR "Could not find PNG on windows")
|
||||
endif()
|
||||
else()
|
||||
find_package(PNG)
|
||||
endif()
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
macro(FindOrBuildCurl)
|
||||
if(BUILD_CURL)
|
||||
add_subdirectory(${CMAKE_SOURCE_DIR}/thirdparty/curl ${CMAKE_BINARY_DIR}/thirdparty/curl)
|
||||
set(CURL curl_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/thirdparty/curl)
|
||||
set(CURL_LIBRARIES curl)
|
||||
else()
|
||||
if(WIN32)
|
||||
#findPNG does currently not provide prefix vars. so we find
|
||||
find_path(CURL CURL_INCLUDE_DIRS curl.h HINTS ${CMAKE_SOURCE_DIR}/thirdparty/binary/win/include)
|
||||
find_library(CURL_LIBRARIES libcurl HINTS ${CMAKE_SOURCE_DIR}/thirdparty/binary/win/lib)
|
||||
|
||||
if (CURL_LIBRARIES AND CURL_INCLUDE_DIRS)
|
||||
set(CURL_FOUND ON)
|
||||
mark_as_advanced(CURL_INCLUDE_DIRS CURL_LIBRARIES)
|
||||
else()
|
||||
message(FATAL_ERROR "Could not find CURL on windows")
|
||||
endif()
|
||||
else()
|
||||
find_package(CURL)
|
||||
endif()
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
macro(FindOrBuildFreetype)
|
||||
if(PSP)
|
||||
set(ENV{FREETYPE_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR}/thirdparty/binary/psp/include)
|
||||
set(ENV{FREETYPE_LIBRARIES} freetype)
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
macro(FindOrBuildHgeTools)
|
||||
if(PSP)
|
||||
find_library(HGETOOLS_LIBRARY NAMES hgetools HINTS "${CMAKE_SOURCE_DIR}/thirdparty/binary/psp/lib")
|
||||
set(HGETOOLS_INCLUDE_DIRS "${CMAKE_SOURCE_DIR}/thirdparty/binary/psp/include")
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
macro(FindOrBuildMikMod)
|
||||
if(PSP)
|
||||
find_library(MIKMOD_LIBRARY NAMES mikmod HINTS "${CMAKE_SOURCE_DIR}/thirdparty/binary/psp/lib")
|
||||
set(MIKMOD_INCLUDE_DIRS "${CMAKE_SOURCE_DIR}/thirdparty/binary/psp/include")
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
macro(FindOrBuildQt)
|
||||
if(backend_qt_console)
|
||||
add_definitions(-DCONSOLE_CONFIG -DTESTSUITE)
|
||||
find_package(Qt5Core REQUIRED)
|
||||
find_package(Qt5 COMPONENTS Core Network Multimedia REQUIRED)
|
||||
elseif(backend_qt_widget)
|
||||
add_definitions(-DQT_WIDGET)
|
||||
find_package(OpenGL REQUIRED)
|
||||
find_package(X11 REQUIRED)
|
||||
find_package(Qt5 COMPONENTS Core Gui OpenGL Network Multimedia REQUIRED)
|
||||
endif()
|
||||
# include(${QT_USE_FILE})
|
||||
endmacro()
|
||||
|
||||
macro(FindOrBuildOpenGL)
|
||||
if(backend_sdl OR backend_qt_console OR backend_qt_widget)
|
||||
if(ANDROID)
|
||||
#find openglesv on android
|
||||
set(OPENGL_LIBRARIES "-ldl -lGLESv1_CM -lGLESv2 -llog -landroid")
|
||||
elseif(EMSCRIPTEN)
|
||||
set(OPENGL_LIBRARIES "")
|
||||
else()
|
||||
find_package(OpenGL)
|
||||
# find_package(GLUT)
|
||||
endif()
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
macro(FindOrBuildOpenSL)
|
||||
find_package(OpenSL)
|
||||
endmacro()
|
||||
|
||||
macro(FindOrBuildPSPSDK)
|
||||
find_package(PSPSDK COMPONENTS psppower pspmpeg pspaudiocodec pspaudiolib pspaudio pspmp3 pspgum pspgu psprtc pspfpu REQUIRED)
|
||||
endmacro()
|
||||
@@ -0,0 +1,62 @@
|
||||
# - Try to find PSPSDK
|
||||
# Once done this will define
|
||||
# PSPSDK_FOUND - System has PSPSDK
|
||||
# PSPSDK_INCLUDE_DIR - The PSPSDK include directories
|
||||
# PSPSDK_LIB - The libraries requested with the components field
|
||||
# PSPSDK_REQUIRED_LIB - The libriries the PSPSDK needs always
|
||||
# PSPSDK_CFLAGS - The CFLAGS to use
|
||||
# PSPSDK_PATH - The output of psp-config --pspsdk-path
|
||||
# PSPSDK_PREFIX - The output of psp-config --psp-prefix
|
||||
# PSPSDK_CXX_COMPILER - The PSPSDK CXX Compilers path
|
||||
# PSPSDK_CXX_LINKER - The PSPSDK CXX Linker command
|
||||
# PSPSDK_FIXUP_IMPORTS_COMMAND - psp-fixup-imports command
|
||||
# PSPSDK_PRXGEN_COMMAND - psp-prxgen command
|
||||
# PSPSDK_PACK_PBP_COMMAND - pack-pbp command
|
||||
# PSPSDK_MKSFO_COMMAND - mksfo command
|
||||
|
||||
#find the psp-config progams absolute path
|
||||
#psp-config needs to be reachable via the system shell (PATH)
|
||||
find_program(PSP_CONFIG_PROGRAM psp-config)
|
||||
|
||||
#TODO: check if something is REQUIRED and throw errors instead of messages
|
||||
if(PSP_CONFIG_PROGRAM)
|
||||
find_program(PSPSDK_CXX_COMPILER psp-g++)
|
||||
find_program(PSPSDK_CXX_LINKER psp-gcc)
|
||||
find_program(PSPSDK_FIXUP_IMPORTS_COMMAND psp-fixup-imports)
|
||||
find_program(PSPSDK_PRXGEN_COMMAND psp-prxgen)
|
||||
find_program(PSPSDK_PACK_PBP_COMMAND pack-pbp)
|
||||
find_program(PSPSDK_MKSFO_COMMAND mksfo)
|
||||
|
||||
#ask psp-config for the
|
||||
execute_process(COMMAND psp-config --pspsdk-path OUTPUT_VARIABLE PSPSDK_PATH OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
execute_process(COMMAND psp-config --psp-prefix OUTPUT_VARIABLE PSPSDK_PREFIX OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
|
||||
set(PSPSDK_INCLUDE_DIR "${PSPSDK_PATH}/include")
|
||||
|
||||
foreach(_COMPONENT ${PSPSDK_FIND_COMPONENTS})
|
||||
find_library(PSPSDK_${_COMPONENT} NAMES ${_COMPONENT})
|
||||
if(NOT PSPSDK_${_COMPONENT})
|
||||
message(SEND_ERROR "PSPSDK: ${_COMPONENT} not found")
|
||||
else()
|
||||
set(PSPSDK_LIB ${PSPSDK_LIB} ${PSPSDK_${_COMPONENT}})
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
#find libs which pspsdk does require to link even if the programs does not need one of them directly
|
||||
foreach(_COMPONENT pspdebug pspdisplay pspge pspctrl pspsdk c pspnet pspnet_inet pspnet_apctl pspnet_resolver psputility pspuser)
|
||||
find_library(PSPSDK_${_COMPONENT} NAMES ${_COMPONENT})
|
||||
if(NOT PSPSDK_${_COMPONENT})
|
||||
message(SEND_ERROR "PSPSDK: ${_COMPONENT} not found")
|
||||
else()
|
||||
set(PSPSDK_REQUIRED_LIB ${PSPSDK_REQUIRED_LIB} ${PSPSDK_${_COMPONENT}})
|
||||
endif()
|
||||
endforeach()
|
||||
endif()
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
# handle the QUIETLY and REQUIRED arguments and set LIBXML2_FOUND to TRUE
|
||||
# if all listed variables are TRUE
|
||||
find_package_handle_standard_args(PSPSDK DEFAULT_MSG
|
||||
PSPSDK_CXX_LINKER PSPSDK_CXX_COMPILER PSPSDK_PATH PSPSDK_PREFIX PSPSDK_LIB PSPSDK_REQUIRED_LIB PSPSDK_INCLUDE_DIR)
|
||||
|
||||
mark_as_advanced(PSPSDK_CXX_LINKER PSPSDK_CXX_COMPILER PSPSDK_PATH PSPSDK_PREFIX PSPSDK_LIB PSPSDK_REQUIRED_LIB PSPSDK_INCLUDE_DIR)
|
||||
@@ -0,0 +1,181 @@
|
||||
|
||||
# Locate SDL2 library
|
||||
# This module defines
|
||||
# SDL2_LIBRARY, the name of the library to link against
|
||||
# SDL2_FOUND, if false, do not try to link to SDL2
|
||||
# SDL2_INCLUDE_DIR, where to find SDL.h
|
||||
#
|
||||
# This module responds to the the flag:
|
||||
# SDL2_BUILDING_LIBRARY
|
||||
# If this is defined, then no SDL2_main will be linked in because
|
||||
# only applications need main().
|
||||
# Otherwise, it is assumed you are building an application and this
|
||||
# module will attempt to locate and set the the proper link flags
|
||||
# as part of the returned SDL2_LIBRARY variable.
|
||||
#
|
||||
# Don't forget to include SDL2main.h and SDL2main.m your project for the
|
||||
# OS X framework based version. (Other versions link to -lSDL2main which
|
||||
# this module will try to find on your behalf.) Also for OS X, this
|
||||
# module will automatically add the -framework Cocoa on your behalf.
|
||||
#
|
||||
#
|
||||
# Additional Note: If you see an empty SDL2_LIBRARY_TEMP in your configuration
|
||||
# and no SDL2_LIBRARY, it means CMake did not find your SDL2 library
|
||||
# (SDL2.dll, libsdl2.so, SDL2.framework, etc).
|
||||
# Set SDL2_LIBRARY_TEMP to point to your SDL2 library, and configure again.
|
||||
# Similarly, if you see an empty SDL2MAIN_LIBRARY, you should set this value
|
||||
# as appropriate. These values are used to generate the final SDL2_LIBRARY
|
||||
# variable, but when these values are unset, SDL2_LIBRARY does not get created.
|
||||
#
|
||||
#
|
||||
# $SDL2DIR is an environment variable that would
|
||||
# correspond to the ./configure --prefix=$SDL2DIR
|
||||
# used in building SDL2.
|
||||
# l.e.galup 9-20-02
|
||||
#
|
||||
# Modified by Eric Wing.
|
||||
# Added code to assist with automated building by using environmental variables
|
||||
# and providing a more controlled/consistent search behavior.
|
||||
# Added new modifications to recognize OS X frameworks and
|
||||
# additional Unix paths (FreeBSD, etc).
|
||||
# Also corrected the header search path to follow "proper" SDL2 guidelines.
|
||||
# Added a search for SDL2main which is needed by some platforms.
|
||||
# Added a search for threads which is needed by some platforms.
|
||||
# Added needed compile switches for MinGW.
|
||||
#
|
||||
# On OSX, this will prefer the Framework version (if found) over others.
|
||||
# People will have to manually change the cache values of
|
||||
# SDL2_LIBRARY to override this selection or set the CMake environment
|
||||
# CMAKE_INCLUDE_PATH to modify the search paths.
|
||||
#
|
||||
# Note that the header path has changed from SDL2/SDL.h to just SDL.h
|
||||
# This needed to change because "proper" SDL2 convention
|
||||
# is #include "SDL.h", not <SDL2/SDL.h>. This is done for portability
|
||||
# reasons because not all systems place things in SDL2/ (see FreeBSD).
|
||||
#
|
||||
# Ported by Johnny Patterson. This is a literal port for SDL2 of the FindSDL.cmake
|
||||
# module with the minor edit of changing "SDL" to "SDL2" where necessary. This
|
||||
# was not created for redistribution, and exists temporarily pending official
|
||||
# SDL2 CMake modules.
|
||||
|
||||
#=============================================================================
|
||||
# Copyright 2003-2009 Kitware, Inc.
|
||||
#
|
||||
# Distributed under the OSI-approved BSD License (the "License");
|
||||
# see accompanying file Copyright.txt for details.
|
||||
#
|
||||
# This software is distributed WITHOUT ANY WARRANTY; without even the
|
||||
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See the License for more information.
|
||||
#=============================================================================
|
||||
# (To distribute this file outside of CMake, substitute the full
|
||||
# License text for the above reference.)
|
||||
|
||||
FIND_PATH(SDL2_INCLUDE_DIR SDL.h
|
||||
HINTS
|
||||
$ENV{SDL2DIR}
|
||||
PATH_SUFFIXES include/SDL2 include
|
||||
PATHS
|
||||
~/Library/Frameworks
|
||||
/Library/Frameworks
|
||||
/usr/local/include/SDL2
|
||||
/usr/include/SDL2
|
||||
/sw # Fink
|
||||
/opt/local # DarwinPorts
|
||||
/opt/csw # Blastwave
|
||||
/opt
|
||||
)
|
||||
|
||||
FIND_LIBRARY(SDL2_LIBRARY_TEMP
|
||||
NAMES SDL2
|
||||
HINTS
|
||||
$ENV{SDL2DIR}
|
||||
PATH_SUFFIXES lib64 lib
|
||||
PATHS
|
||||
/sw
|
||||
/opt/local
|
||||
/opt/csw
|
||||
/opt
|
||||
)
|
||||
|
||||
#MESSAGE("SDL2_LIBRARY_TEMP is ${SDL2_LIBRARY_TEMP}")
|
||||
|
||||
IF(NOT SDL2_BUILDING_LIBRARY)
|
||||
IF(NOT ${SDL2_INCLUDE_DIR} MATCHES ".framework")
|
||||
# Non-OS X framework versions expect you to also dynamically link to
|
||||
# SDL2main. This is mainly for Windows and OS X. Other (Unix) platforms
|
||||
# seem to provide SDL2main for compatibility even though they don't
|
||||
# necessarily need it.
|
||||
FIND_LIBRARY(SDL2MAIN_LIBRARY
|
||||
NAMES SDL2main
|
||||
HINTS
|
||||
$ENV{SDL2DIR}
|
||||
PATH_SUFFIXES lib64 lib
|
||||
PATHS
|
||||
/sw
|
||||
/opt/local
|
||||
/opt/csw
|
||||
/opt
|
||||
)
|
||||
ENDIF(NOT ${SDL2_INCLUDE_DIR} MATCHES ".framework")
|
||||
ENDIF(NOT SDL2_BUILDING_LIBRARY)
|
||||
|
||||
# SDL2 may require threads on your system.
|
||||
# The Apple build may not need an explicit flag because one of the
|
||||
# frameworks may already provide it.
|
||||
# But for non-OSX systems, I will use the CMake Threads package.
|
||||
IF(NOT APPLE)
|
||||
FIND_PACKAGE(Threads)
|
||||
ENDIF(NOT APPLE)
|
||||
|
||||
# MinGW needs an additional library, mwindows
|
||||
# It's total link flags should look like -lmingw32 -lSDL2main -lSDL2 -lmwindows
|
||||
# (Actually on second look, I think it only needs one of the m* libraries.)
|
||||
IF(MINGW)
|
||||
SET(MINGW32_LIBRARY mingw32 CACHE STRING "mwindows for MinGW")
|
||||
ENDIF(MINGW)
|
||||
|
||||
SET(SDL2_FOUND "NO")
|
||||
IF(SDL2_LIBRARY_TEMP)
|
||||
# For SDL2main
|
||||
IF(NOT SDL2_BUILDING_LIBRARY)
|
||||
IF(SDL2MAIN_LIBRARY)
|
||||
SET(SDL2_LIBRARY_TEMP ${SDL2MAIN_LIBRARY} ${SDL2_LIBRARY_TEMP})
|
||||
ENDIF(SDL2MAIN_LIBRARY)
|
||||
ENDIF(NOT SDL2_BUILDING_LIBRARY)
|
||||
|
||||
# For OS X, SDL2 uses Cocoa as a backend so it must link to Cocoa.
|
||||
# CMake doesn't display the -framework Cocoa string in the UI even
|
||||
# though it actually is there if I modify a pre-used variable.
|
||||
# I think it has something to do with the CACHE STRING.
|
||||
# So I use a temporary variable until the end so I can set the
|
||||
# "real" variable in one-shot.
|
||||
IF(APPLE)
|
||||
SET(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} "-framework Cocoa")
|
||||
ENDIF(APPLE)
|
||||
|
||||
# For threads, as mentioned Apple doesn't need this.
|
||||
# In fact, there seems to be a problem if I used the Threads package
|
||||
# and try using this line, so I'm just skipping it entirely for OS X.
|
||||
IF(NOT APPLE)
|
||||
SET(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} ${CMAKE_THREAD_LIBS_INIT})
|
||||
ENDIF(NOT APPLE)
|
||||
|
||||
# For MinGW library
|
||||
IF(MINGW)
|
||||
SET(SDL2_LIBRARY_TEMP ${MINGW32_LIBRARY} ${SDL2_LIBRARY_TEMP})
|
||||
ENDIF(MINGW)
|
||||
|
||||
# Set the final string here so the GUI reflects the final state.
|
||||
SET(SDL2_LIBRARY ${SDL2_LIBRARY_TEMP} CACHE STRING "Where the SDL2 Library can be found")
|
||||
# Set the temp variable to INTERNAL so it is not seen in the CMake GUI
|
||||
SET(SDL2_LIBRARY_TEMP "${SDL2_LIBRARY_TEMP}" CACHE INTERNAL "")
|
||||
|
||||
SET(SDL2_FOUND "YES")
|
||||
ENDIF(SDL2_LIBRARY_TEMP)
|
||||
|
||||
INCLUDE(FindPackageHandleStandardArgs)
|
||||
|
||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2
|
||||
REQUIRED_VARS SDL2_LIBRARY SDL2_INCLUDE_DIR)
|
||||
mark_as_advanced(SDL2MAIN_LIBRARY SDL2_LIBRARY SDL2_INCLUDE_DIR)
|
||||
Executable
+26
@@ -0,0 +1,26 @@
|
||||
# - Find TinyXML
|
||||
# Find the native TinyXML includes and library
|
||||
#
|
||||
# TINYXML_FOUND - True if TinyXML found.
|
||||
# TINYXML_INCLUDE_DIR - where to find tinyxml.h, etc.
|
||||
# TINYXML_LIBRARIES - List of libraries when using TinyXML.
|
||||
#
|
||||
|
||||
IF( TINYXML_INCLUDE_DIR )
|
||||
# Already in cache, be silent
|
||||
SET( TinyXML_FIND_QUIETLY TRUE )
|
||||
ENDIF( TINYXML_INCLUDE_DIR )
|
||||
|
||||
FIND_PATH( TINYXML_INCLUDE_DIR "tinyxml.h"
|
||||
PATH_SUFFIXES "tinyxml" )
|
||||
|
||||
FIND_LIBRARY( TINYXML_LIBRARIES
|
||||
NAMES "tinyxml"
|
||||
PATH_SUFFIXES "tinyxml" )
|
||||
|
||||
# handle the QUIETLY and REQUIRED arguments and set TINYXML_FOUND to TRUE if
|
||||
# all listed variables are TRUE
|
||||
INCLUDE( "FindPackageHandleStandardArgs" )
|
||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS( "TinyXML" DEFAULT_MSG TINYXML_INCLUDE_DIR TINYXML_LIBRARIES )
|
||||
|
||||
MARK_AS_ADVANCED( TINYXML_INCLUDE_DIR TINYXML_LIBRARIES )
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,48 @@
|
||||
include(CMakeForceCompiler)
|
||||
|
||||
# this one is important
|
||||
SET(CMAKE_SYSTEM_NAME "Generic")
|
||||
#this one not so much
|
||||
SET(CMAKE_SYSTEM_VERSION 1)
|
||||
|
||||
set (CMAKE_SYSTEM_NAME Generic)
|
||||
|
||||
# Just point to anything that exists.
|
||||
# We don't need CMake to generate proper build files.
|
||||
set(CMAKE_C_COMPILER ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
set(CMAKE_CXX_COMPILER ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
|
||||
# Skip the platform compiler checks
|
||||
set (CMAKE_CXX_COMPILER_WORKS TRUE)
|
||||
set (CMAKE_C_COMPILER_WORKS TRUE)
|
||||
|
||||
#how libraries look
|
||||
SET(CMAKE_FIND_LIBRARY_PREFIXES "lib")
|
||||
SET(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".a")
|
||||
|
||||
SET(CMAKE_SYSTEM_INCLUDE_PATH
|
||||
${THEOS_PATH}/include
|
||||
${CMAKE_INSTALL_PREFIX}/include
|
||||
${CMAKE_SYSTEM_INCLUDE_PATH})
|
||||
|
||||
# where is the target environment
|
||||
SET(CMAKE_SYSTEM_LIBRARY_PATH
|
||||
${THEOS_PATH}/lib
|
||||
${CMAKE_INSTALL_PREFIX}/lib
|
||||
${CMAKE_SYSTEM_LIBRARY_PATH})
|
||||
|
||||
|
||||
SET(CMAKE_FIND_ROOT_PATH
|
||||
${CMAKE_SOURCE_DIR}
|
||||
${THEOS_PATH}
|
||||
${THEOS_PATH}/lib
|
||||
${THEOS_PATH}/include
|
||||
)
|
||||
|
||||
# search for programs in the build host directories
|
||||
# for libraries and headers in the target directories and then in the host
|
||||
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
||||
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY FIRST)
|
||||
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE FIRST)
|
||||
|
||||
set(IOS 1)
|
||||
@@ -0,0 +1,333 @@
|
||||
# This file is part of the ios-cmake project. It was retrieved from
|
||||
# https://github.com/cristeab/ios-cmake.git, which is a fork of
|
||||
# https://code.google.com/p/ios-cmake/. Which in turn is based off of
|
||||
# the Platform/Darwin.cmake and Platform/UnixPaths.cmake files which
|
||||
# are included with CMake 2.8.4
|
||||
#
|
||||
# The ios-cmake project is licensed under the new BSD license.
|
||||
#
|
||||
# Copyright (c) 2014, Bogdan Cristea and LTE Engineering Software,
|
||||
# Kitware, Inc., Insight Software Consortium. All rights reserved.
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
#
|
||||
# 2. Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
#
|
||||
# 3. Neither the name of the copyright holder nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# This file is based off of the Platform/Darwin.cmake and
|
||||
# Platform/UnixPaths.cmake files which are included with CMake 2.8.4
|
||||
# It has been altered for iOS development.
|
||||
#
|
||||
# Updated by Alex Stewart (alexs.mac@gmail.com).
|
||||
# The following variables control the behaviour of this toolchain:
|
||||
#
|
||||
# IOS_PLATFORM: OS (default) or SIMULATOR or SIMULATOR64
|
||||
# OS = Build for iPhoneOS.
|
||||
# SIMULATOR = Build for x86 i386 iPhone Simulator.
|
||||
# SIMULATOR64 = Build for x86 x86_64 iPhone Simulator.
|
||||
# CMAKE_OSX_SYSROOT: Path to the iOS SDK to use. By default this is
|
||||
# automatically determined from IOS_PLATFORM and xcodebuild, but
|
||||
# can also be manually specified (although this should not be required).
|
||||
# CMAKE_IOS_DEVELOPER_ROOT: Path to the Developer directory for the iOS platform
|
||||
# being compiled for. By default this is automatically determined from
|
||||
# CMAKE_OSX_SYSROOT, but can also be manually specified (although this should
|
||||
# not be required).
|
||||
# ENABLE_BITCODE: (true|false) Enables or disables bitcode support. Default true
|
||||
#
|
||||
# This toolchain defines the following variables for use externally:
|
||||
#
|
||||
# XCODE_VERSION: Version number (not including Build version) of Xcode detected.
|
||||
# IOS_SDK_VERSION: Version of iOS SDK being used.
|
||||
# CMAKE_OSX_ARCHITECTURES: Architectures being compiled for (generated from
|
||||
# IOS_PLATFORM).
|
||||
#
|
||||
# This toolchain defines the following macros for use externally:
|
||||
#
|
||||
# set_xcode_property (TARGET XCODE_PROPERTY XCODE_VALUE XCODE_VARIANT)
|
||||
# A convenience macro for setting xcode specific properties on targets.
|
||||
# Available variants are: All, Release, RelWithDebInfo, Debug, MinSizeRel
|
||||
# example: set_xcode_property (myioslib IPHONEOS_DEPLOYMENT_TARGET "3.1" "all").
|
||||
#
|
||||
# find_host_package (PROGRAM ARGS)
|
||||
# A macro used to find executable programs on the host system, not within the
|
||||
# iOS environment. Thanks to the android-cmake project for providing the
|
||||
# command.
|
||||
|
||||
# Fix for PThread library not in path
|
||||
set(CMAKE_THREAD_LIBS_INIT "-lpthread")
|
||||
set(CMAKE_HAVE_THREADS_LIBRARY 1)
|
||||
set(CMAKE_USE_WIN32_THREADS_INIT 0)
|
||||
set(CMAKE_USE_PTHREADS_INIT 1)
|
||||
|
||||
# Get the Xcode version being used.
|
||||
execute_process(COMMAND xcodebuild -version
|
||||
OUTPUT_VARIABLE XCODE_VERSION
|
||||
ERROR_QUIET
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
string(REGEX MATCH "Xcode [0-9\\.]+" XCODE_VERSION "${XCODE_VERSION}")
|
||||
string(REGEX REPLACE "Xcode ([0-9\\.]+)" "\\1" XCODE_VERSION "${XCODE_VERSION}")
|
||||
message(STATUS "Building with Xcode version: ${XCODE_VERSION}")
|
||||
# Default to building for iPhoneOS if not specified otherwise, and we cannot
|
||||
# determine the platform from the CMAKE_OSX_ARCHITECTURES variable. The use
|
||||
# of CMAKE_OSX_ARCHITECTURES is such that try_compile() projects can correctly
|
||||
# determine the value of IOS_PLATFORM from the root project, as
|
||||
# CMAKE_OSX_ARCHITECTURES is propagated to them by CMake.
|
||||
if (NOT DEFINED IOS_PLATFORM)
|
||||
if (CMAKE_OSX_ARCHITECTURES)
|
||||
if (CMAKE_OSX_ARCHITECTURES MATCHES ".*arm.*")
|
||||
set(IOS_PLATFORM "OS")
|
||||
elseif (CMAKE_OSX_ARCHITECTURES MATCHES "i386")
|
||||
set(IOS_PLATFORM "SIMULATOR")
|
||||
elseif (CMAKE_OSX_ARCHITECTURES MATCHES "x86_64")
|
||||
set(IOS_PLATFORM "SIMULATOR64")
|
||||
endif()
|
||||
endif()
|
||||
if (NOT IOS_PLATFORM)
|
||||
set(IOS_PLATFORM "OS")
|
||||
endif()
|
||||
endif()
|
||||
set(IOS_PLATFORM ${IOS_PLATFORM} CACHE STRING
|
||||
"Type of iOS platform for which to build.")
|
||||
# Determine the platform name and architectures for use in xcodebuild commands
|
||||
# from the specified IOS_PLATFORM name.
|
||||
if (IOS_PLATFORM STREQUAL "OS")
|
||||
set(XCODE_IOS_PLATFORM iphoneos)
|
||||
set(IOS_ARCH armv7 armv7s arm64)
|
||||
elseif (IOS_PLATFORM STREQUAL "SIMULATOR")
|
||||
set(XCODE_IOS_PLATFORM iphonesimulator)
|
||||
set(IOS_ARCH i386)
|
||||
elseif(IOS_PLATFORM STREQUAL "SIMULATOR64")
|
||||
set(XCODE_IOS_PLATFORM iphonesimulator)
|
||||
set(IOS_ARCH x86_64)
|
||||
else()
|
||||
message(FATAL_ERROR "Invalid IOS_PLATFORM: ${IOS_PLATFORM}")
|
||||
endif()
|
||||
message(STATUS "Configuring iOS build for platform: ${IOS_PLATFORM}, "
|
||||
"architecture(s): ${IOS_ARCH}")
|
||||
# If user did not specify the SDK root to use, then query xcodebuild for it.
|
||||
if (NOT CMAKE_OSX_SYSROOT)
|
||||
execute_process(COMMAND xcodebuild -version -sdk ${XCODE_IOS_PLATFORM} Path
|
||||
OUTPUT_VARIABLE CMAKE_OSX_SYSROOT
|
||||
ERROR_QUIET
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
message(STATUS "Using SDK: ${CMAKE_OSX_SYSROOT} for platform: ${IOS_PLATFORM}")
|
||||
endif()
|
||||
if (NOT EXISTS ${CMAKE_OSX_SYSROOT})
|
||||
message(FATAL_ERROR "Invalid CMAKE_OSX_SYSROOT: ${CMAKE_OSX_SYSROOT} "
|
||||
"does not exist.")
|
||||
endif()
|
||||
# Specify minimum version of deployment target.
|
||||
if (NOT DEFINED IOS_DEPLOYMENT_TARGET)
|
||||
# Unless specified, SDK version 8.0 is used by default as minimum target version.
|
||||
set(IOS_DEPLOYMENT_TARGET "8.0"
|
||||
CACHE STRING "Minimum iOS version to build for." )
|
||||
message(STATUS "Using the default min-version since IOS_DEPLOYMENT_TARGET not provided!")
|
||||
endif()
|
||||
# Use bitcode or not
|
||||
if (NOT DEFINED ENABLE_BITCODE)
|
||||
# Unless specified, enable bitcode support by default
|
||||
set(ENABLE_BITCODE TRUE CACHE BOOL "Wheter or not to enable bitcode")
|
||||
message(STATUS "Enabling bitcode support by default. ENABLE_BITCODE not provided!")
|
||||
endif()
|
||||
# Get the SDK version information.
|
||||
execute_process(COMMAND xcodebuild -sdk ${CMAKE_OSX_SYSROOT} -version SDKVersion
|
||||
OUTPUT_VARIABLE IOS_SDK_VERSION
|
||||
ERROR_QUIET
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
# Find the Developer root for the specific iOS platform being compiled for
|
||||
# from CMAKE_OSX_SYSROOT. Should be ../../ from SDK specified in
|
||||
# CMAKE_OSX_SYSROOT. There does not appear to be a direct way to obtain
|
||||
# this information from xcrun or xcodebuild.
|
||||
if (NOT CMAKE_IOS_DEVELOPER_ROOT)
|
||||
get_filename_component(IOS_PLATFORM_SDK_DIR ${CMAKE_OSX_SYSROOT} PATH)
|
||||
get_filename_component(CMAKE_IOS_DEVELOPER_ROOT ${IOS_PLATFORM_SDK_DIR} PATH)
|
||||
endif()
|
||||
if (NOT EXISTS ${CMAKE_IOS_DEVELOPER_ROOT})
|
||||
message(FATAL_ERROR "Invalid CMAKE_IOS_DEVELOPER_ROOT: "
|
||||
"${CMAKE_IOS_DEVELOPER_ROOT} does not exist.")
|
||||
endif()
|
||||
# Find the C & C++ compilers for the specified SDK.
|
||||
if (NOT CMAKE_C_COMPILER)
|
||||
execute_process(COMMAND xcrun -sdk ${CMAKE_OSX_SYSROOT} -find clang
|
||||
OUTPUT_VARIABLE CMAKE_C_COMPILER
|
||||
ERROR_QUIET
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
message(STATUS "Using C compiler: ${CMAKE_C_COMPILER}")
|
||||
endif()
|
||||
if (NOT CMAKE_CXX_COMPILER)
|
||||
execute_process(COMMAND xcrun -sdk ${CMAKE_OSX_SYSROOT} -find clang++
|
||||
OUTPUT_VARIABLE CMAKE_CXX_COMPILER
|
||||
ERROR_QUIET
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
message(STATUS "Using CXX compiler: ${CMAKE_CXX_COMPILER}")
|
||||
endif()
|
||||
# Find (Apple's) libtool.
|
||||
execute_process(COMMAND xcrun -sdk ${CMAKE_OSX_SYSROOT} -find libtool
|
||||
OUTPUT_VARIABLE IOS_LIBTOOL
|
||||
ERROR_QUIET
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
message(STATUS "Using libtool: ${IOS_LIBTOOL}")
|
||||
# Configure libtool to be used instead of ar + ranlib to build static libraries.
|
||||
# This is required on Xcode 7+, but should also work on previous versions of
|
||||
# Xcode.
|
||||
set(CMAKE_C_CREATE_STATIC_LIBRARY
|
||||
"${IOS_LIBTOOL} -static -o <TARGET> <LINK_FLAGS> <OBJECTS> ")
|
||||
set(CMAKE_CXX_CREATE_STATIC_LIBRARY
|
||||
"${IOS_LIBTOOL} -static -o <TARGET> <LINK_FLAGS> <OBJECTS> ")
|
||||
# Get the version of Darwin (OS X) of the host.
|
||||
execute_process(COMMAND uname -r
|
||||
OUTPUT_VARIABLE CMAKE_HOST_SYSTEM_VERSION
|
||||
ERROR_QUIET
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
# Standard settings.
|
||||
set(CMAKE_SYSTEM_NAME Darwin CACHE INTERNAL "")
|
||||
set(CMAKE_SYSTEM_VERSION ${IOS_SDK_VERSION} CACHE INTERNAL "")
|
||||
set(UNIX TRUE CACHE BOOL "")
|
||||
set(APPLE TRUE CACHE BOOL "")
|
||||
set(IOS TRUE CACHE BOOL "")
|
||||
set(CMAKE_AR ar CACHE FILEPATH "" FORCE)
|
||||
set(CMAKE_RANLIB ranlib CACHE FILEPATH "" FORCE)
|
||||
# Force unset of OS X-specific deployment target (otherwise autopopulated),
|
||||
# required as of cmake 2.8.10.
|
||||
set(CMAKE_OSX_DEPLOYMENT_TARGET "" CACHE STRING
|
||||
"Must be empty for iOS builds." FORCE)
|
||||
# Set the architectures for which to build.
|
||||
set(CMAKE_OSX_ARCHITECTURES ${IOS_ARCH} CACHE STRING "Build architecture for iOS")
|
||||
# Skip the platform compiler checks for cross compiling.
|
||||
set(CMAKE_CXX_COMPILER_FORCED TRUE)
|
||||
set(CMAKE_CXX_COMPILER_WORKS TRUE)
|
||||
set(CMAKE_C_COMPILER_FORCED TRUE)
|
||||
set(CMAKE_C_COMPILER_WORKS TRUE)
|
||||
# All iOS/Darwin specific settings - some may be redundant.
|
||||
set(CMAKE_SHARED_LIBRARY_PREFIX "lib")
|
||||
set(CMAKE_SHARED_LIBRARY_SUFFIX ".dylib")
|
||||
set(CMAKE_SHARED_MODULE_PREFIX "lib")
|
||||
set(CMAKE_SHARED_MODULE_SUFFIX ".so")
|
||||
set(CMAKE_MODULE_EXISTS 1)
|
||||
set(CMAKE_DL_LIBS "")
|
||||
set(CMAKE_C_OSX_COMPATIBILITY_VERSION_FLAG "-compatibility_version ")
|
||||
set(CMAKE_C_OSX_CURRENT_VERSION_FLAG "-current_version ")
|
||||
set(CMAKE_CXX_OSX_COMPATIBILITY_VERSION_FLAG "${CMAKE_C_OSX_COMPATIBILITY_VERSION_FLAG}")
|
||||
set(CMAKE_CXX_OSX_CURRENT_VERSION_FLAG "${CMAKE_C_OSX_CURRENT_VERSION_FLAG}")
|
||||
message(STATUS "Building for minimum iOS version: ${IOS_DEPLOYMENT_TARGET}"
|
||||
" (SDK version: ${IOS_SDK_VERSION})")
|
||||
# Note that only Xcode 7+ supports the newer more specific:
|
||||
# -m${XCODE_IOS_PLATFORM}-version-min flags, older versions of Xcode use:
|
||||
# -m(ios/ios-simulator)-version-min instead.
|
||||
if (IOS_PLATFORM STREQUAL "OS")
|
||||
if (XCODE_VERSION VERSION_LESS 7.0)
|
||||
set(XCODE_IOS_PLATFORM_VERSION_FLAGS
|
||||
"-mios-version-min=${IOS_DEPLOYMENT_TARGET}")
|
||||
else()
|
||||
# Xcode 7.0+ uses flags we can build directly from XCODE_IOS_PLATFORM.
|
||||
set(XCODE_IOS_PLATFORM_VERSION_FLAGS
|
||||
"-m${XCODE_IOS_PLATFORM}-version-min=${IOS_DEPLOYMENT_TARGET}")
|
||||
endif()
|
||||
else()
|
||||
# SIMULATOR or SIMULATOR64 both use -mios-simulator-version-min.
|
||||
set(XCODE_IOS_PLATFORM_VERSION_FLAGS
|
||||
"-mios-simulator-version-min=${IOS_DEPLOYMENT_TARGET}")
|
||||
endif()
|
||||
message(STATUS "Version flags set to: ${XCODE_IOS_PLATFORM_VERSION_FLAGS}")
|
||||
|
||||
if (ENABLE_BITCODE)
|
||||
set(BITCODE "-fembed-bitcode")
|
||||
message(STATUS "Enabling bitcode support.")
|
||||
else()
|
||||
set(BITCODE "")
|
||||
message(STATUS "Disabling bitcode support.")
|
||||
endif()
|
||||
|
||||
set(CMAKE_C_FLAGS
|
||||
"${XCODE_IOS_PLATFORM_VERSION_FLAGS} ${BITCODE} -fobjc-abi-version=2 -fobjc-arc ${CMAKE_C_FLAGS}")
|
||||
# Hidden visibilty is required for C++ on iOS.
|
||||
set(CMAKE_CXX_FLAGS
|
||||
"${XCODE_IOS_PLATFORM_VERSION_FLAGS} ${BITCODE} -fvisibility=hidden -fvisibility-inlines-hidden -fobjc-abi-version=2 -fobjc-arc ${CMAKE_CXX_FLAGS}")
|
||||
set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG -O3 -fomit-frame-pointer -ffast-math ${BITCODE} ${CMAKE_CXX_FLAGS_RELEASE}")
|
||||
set(CMAKE_C_LINK_FLAGS "${XCODE_IOS_PLATFORM_VERSION_FLAGS} -Wl,-search_paths_first ${CMAKE_C_LINK_FLAGS}")
|
||||
set(CMAKE_CXX_LINK_FLAGS "${XCODE_IOS_PLATFORM_VERSION_FLAGS} -Wl,-search_paths_first ${CMAKE_CXX_LINK_FLAGS}")
|
||||
# In order to ensure that the updated compiler flags are used in try_compile()
|
||||
# tests, we have to forcibly set them in the CMake cache, not merely set them
|
||||
# in the local scope.
|
||||
list(APPEND VARS_TO_FORCE_IN_CACHE
|
||||
CMAKE_C_FLAGS
|
||||
CMAKE_CXX_FLAGS
|
||||
CMAKE_CXX_RELEASE
|
||||
CMAKE_C_LINK_FLAGS
|
||||
CMAKE_CXX_LINK_FLAGS)
|
||||
foreach(VAR_TO_FORCE ${VARS_TO_FORCE_IN_CACHE})
|
||||
set(${VAR_TO_FORCE} "${${VAR_TO_FORCE}}" CACHE STRING "" FORCE)
|
||||
endforeach()
|
||||
set(CMAKE_PLATFORM_HAS_INSTALLNAME 1)
|
||||
set(CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS "-dynamiclib -headerpad_max_install_names")
|
||||
set(CMAKE_SHARED_MODULE_CREATE_C_FLAGS "-bundle -headerpad_max_install_names")
|
||||
set(CMAKE_SHARED_MODULE_LOADER_C_FLAG "-Wl,-bundle_loader,")
|
||||
set(CMAKE_SHARED_MODULE_LOADER_CXX_FLAG "-Wl,-bundle_loader,")
|
||||
set(CMAKE_FIND_LIBRARY_SUFFIXES ".dylib" ".so" ".a")
|
||||
# Hack: if a new cmake (which uses CMAKE_INSTALL_NAME_TOOL) runs on an old
|
||||
# build tree (where install_name_tool was hardcoded) and where
|
||||
# CMAKE_INSTALL_NAME_TOOL isn't in the cache and still cmake didn't fail in
|
||||
# CMakeFindBinUtils.cmake (because it isn't rerun) hardcode
|
||||
# CMAKE_INSTALL_NAME_TOOL here to install_name_tool, so it behaves as it did
|
||||
# before, Alex.
|
||||
if (NOT DEFINED CMAKE_INSTALL_NAME_TOOL)
|
||||
find_program(CMAKE_INSTALL_NAME_TOOL install_name_tool)
|
||||
endif (NOT DEFINED CMAKE_INSTALL_NAME_TOOL)
|
||||
# Set the find root to the iOS developer roots and to user defined paths.
|
||||
set(CMAKE_FIND_ROOT_PATH ${CMAKE_IOS_DEVELOPER_ROOT} ${CMAKE_OSX_SYSROOT}
|
||||
${CMAKE_PREFIX_PATH} CACHE string "iOS find search path root" FORCE)
|
||||
# Default to searching for frameworks first.
|
||||
set(CMAKE_FIND_FRAMEWORK FIRST)
|
||||
# Set up the default search directories for frameworks.
|
||||
set(CMAKE_SYSTEM_FRAMEWORK_PATH
|
||||
${CMAKE_OSX_SYSROOT}/System/Library/Frameworks
|
||||
${CMAKE_OSX_SYSROOT}/System/Library/PrivateFrameworks
|
||||
${CMAKE_OSX_SYSROOT}/Developer/Library/Frameworks)
|
||||
# Only search the specified iOS SDK, not the remainder of the host filesystem.
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
||||
# This little macro lets you set any XCode specific property.
|
||||
macro(set_xcode_property TARGET XCODE_PROPERTY XCODE_VALUE XCODE_RELVERSION)
|
||||
set(XCODE_RELVERSION_I "${XCODE_RELVERSION}")
|
||||
if (XCODE_RELVERSION_I STREQUAL "All")
|
||||
set_property(TARGET ${TARGET} PROPERTY
|
||||
XCODE_ATTRIBUTE_${XCODE_PROPERTY} "${XCODE_VALUE}")
|
||||
else()
|
||||
set_property(TARGET ${TARGET} PROPERTY
|
||||
XCODE_ATTRIBUTE_${XCODE_PROPERTY}[variant=${XCODE_RELVERSION_I}] "${XCODE_VALUE}")
|
||||
endif()
|
||||
endmacro(set_xcode_property)
|
||||
# This macro lets you find executable programs on the host system.
|
||||
macro(find_host_package)
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER)
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER)
|
||||
set(IOS FALSE)
|
||||
find_package(${ARGN})
|
||||
set(IOS TRUE)
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
||||
endmacro(find_host_package)
|
||||
@@ -0,0 +1,62 @@
|
||||
include(CMakeForceCompiler)
|
||||
|
||||
# this one is important
|
||||
SET(CMAKE_SYSTEM_NAME "Generic")
|
||||
#this one not so much
|
||||
SET(CMAKE_SYSTEM_VERSION 1)
|
||||
|
||||
find_program(PSP_CONFIG_PROGRAM psp-config)
|
||||
|
||||
execute_process(COMMAND psp-config --pspsdk-path OUTPUT_VARIABLE PSPSDK_PATH OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
execute_process(COMMAND psp-config --psp-prefix OUTPUT_VARIABLE PSPSDK_PREFIX OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
|
||||
# specify compiler and linker:
|
||||
find_program(PSP_GPP psp-g++)
|
||||
find_program(PSP_GCC psp-gcc)
|
||||
|
||||
CMAKE_FORCE_C_COMPILER(${PSP_GCC} GNU)
|
||||
CMAKE_FORCE_CXX_COMPILER(${PSP_GPP} GNU)
|
||||
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -G0")
|
||||
|
||||
set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
|
||||
set(CMAKE_CXX_LINK_EXECUTABLE "${PSP_GCC} <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>")
|
||||
|
||||
#how libraries look
|
||||
SET(CMAKE_FIND_LIBRARY_PREFIXES "lib")
|
||||
SET(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".a")
|
||||
|
||||
# where is the target environment
|
||||
SET(CMAKE_SYSTEM_INCLUDE_PATH
|
||||
${CMAKE_SOURCE_DIR}/thirdparty/binary/psp/include
|
||||
${PSPSDK_PATH}/include
|
||||
${PSPSDK_PREFIX}/include
|
||||
${CMAKE_INSTALL_PREFIX}/include
|
||||
${CMAKE_SYSTEM_INCLUDE_PATH})
|
||||
|
||||
SET(CMAKE_SYSTEM_LIBRARY_PATH
|
||||
${CMAKE_SOURCE_DIR}/thirdparty/binary/psp/lib
|
||||
${PSPSDK_PATH}/lib
|
||||
${PSPSDK_PREFIX}/lib
|
||||
${CMAKE_INSTALL_PREFIX}/lib
|
||||
${CMAKE_SYSTEM_LIBRARY_PATH})
|
||||
|
||||
SET(CMAKE_FIND_ROOT_PATH
|
||||
${CMAKE_SOURCE_DIR}/thirdparty/binary/psp
|
||||
${CMAKE_SOURCE_DIR}/thirdparty/binary/psp/lib
|
||||
${CMAKE_SOURCE_DIR}/thirdparty/binary/psp/include
|
||||
${PSPSDK_PATH}
|
||||
${PSPSDK_PATH}/lib
|
||||
${PSPSDK_PATH}/include
|
||||
${PSPSDK_PREFIX}
|
||||
${PSPSDK_PREFIX}/lib
|
||||
${PSPSDK_PREFIX}/include
|
||||
)
|
||||
|
||||
# search for programs in the build host directories
|
||||
# for libraries and headers in the target directories and then in the host
|
||||
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
||||
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY FIRST)
|
||||
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE FIRST)
|
||||
|
||||
set(PSP 1)
|
||||
@@ -0,0 +1,57 @@
|
||||
macro(WAGIC_OPTION variable description value)
|
||||
set(__value ${value})
|
||||
set(__condition "")
|
||||
set(__varname "__value")
|
||||
foreach(arg ${ARGN})
|
||||
if(arg STREQUAL "IF" OR arg STREQUAL "if")
|
||||
set(__varname "__condition")
|
||||
else()
|
||||
list(APPEND ${__varname} ${arg})
|
||||
endif()
|
||||
endforeach()
|
||||
unset(__varname)
|
||||
if("${__condition}" STREQUAL "")
|
||||
set(__condition 2 GREATER 1)
|
||||
endif()
|
||||
|
||||
if(${__condition})
|
||||
if("${__value}" MATCHES ";")
|
||||
if(${__value})
|
||||
option(${variable} "${description}" ON)
|
||||
else()
|
||||
option(${variable} "${description}" OFF)
|
||||
endif()
|
||||
elseif(DEFINED ${__value})
|
||||
if(${__value})
|
||||
option(${variable} "${description}" ON)
|
||||
else()
|
||||
option(${variable} "${description}" OFF)
|
||||
endif()
|
||||
else()
|
||||
option(${variable} "${description}" ${__value})
|
||||
endif()
|
||||
else()
|
||||
unset(${variable} CACHE)
|
||||
endif()
|
||||
unset(__condition)
|
||||
unset(__value)
|
||||
endmacro()
|
||||
|
||||
# add prefix to each item in the list
|
||||
macro(list_add_prefix LST PREFIX)
|
||||
set(__tmp "")
|
||||
foreach(item ${${LST}})
|
||||
list(APPEND __tmp "${PREFIX}${item}")
|
||||
endforeach()
|
||||
set(${LST} ${__tmp})
|
||||
unset(__tmp)
|
||||
endmacro()
|
||||
|
||||
|
||||
macro(find_host_program)
|
||||
set(_find_program ${CMAKE_FIND_ROOT_PATH_MODE_PROGRAM})
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
||||
find_program(${ARGN})
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ${_find_program})
|
||||
unset(_find_program)
|
||||
endmacro()
|
||||
@@ -0,0 +1,165 @@
|
||||
#the sources, jge will need always
|
||||
set(JGE_generic_src
|
||||
src/Encoding.cpp
|
||||
src/JAnimator.cpp
|
||||
src/JApp.cpp
|
||||
src/JDistortionMesh.cpp
|
||||
src/JFileSystem.cpp
|
||||
src/JGameObject.cpp
|
||||
src/JGE.cpp
|
||||
src/JGui.cpp
|
||||
src/JLogger.cpp
|
||||
src/JLBFont.cpp
|
||||
src/JOBJModel.cpp
|
||||
src/JParticle.cpp
|
||||
src/JParticleEffect.cpp
|
||||
src/JParticleEmitter.cpp
|
||||
src/JParticleSystem.cpp
|
||||
src/JResourceManager.cpp
|
||||
src/JSpline.cpp
|
||||
src/JSprite.cpp
|
||||
src/Vector2D.cpp)
|
||||
|
||||
set(JGE_hge_src
|
||||
src/hge/hgecolor.cpp
|
||||
src/hge/hgedistort.cpp
|
||||
src/hge/hgefont.cpp
|
||||
src/hge/hgeparticle.cpp
|
||||
src/hge/hgerect.cpp
|
||||
src/hge/hgevector.cpp)
|
||||
|
||||
#the sources we need to get graphical output desktops
|
||||
#used by qt-widget build option
|
||||
set(JGE_graphics_src
|
||||
src/Downloader.cpp
|
||||
include/Downloader.h
|
||||
src/JMD2Model.cpp
|
||||
src/pc/JGfx.cpp)
|
||||
|
||||
#the sources we need to fake graphical output on desktops
|
||||
#these are used for the console-only testsuit
|
||||
set(JGE_console_src
|
||||
src/OutputCapturer.cpp
|
||||
src/JGfx-fake.cpp)
|
||||
|
||||
#the sources we need on linux
|
||||
set(JGE_linux_src
|
||||
src/JNetwork.cpp
|
||||
src/pc/JSocket.cpp
|
||||
src/pc/JSfx.cpp)
|
||||
|
||||
set(JGE_android_src
|
||||
src/JNetwork.cpp
|
||||
src/JSocket.cpp
|
||||
src/android/JSfx.cpp)
|
||||
|
||||
#the sources we need if we compile for psp
|
||||
#note: main.cpp contains the main-function.
|
||||
#the other main functions reside in projects/mtg to reduce cross-library dependencies.
|
||||
#there may be a way to get all main-functions into the same project
|
||||
set(JGE_psp_src
|
||||
src/JNetwork.cpp
|
||||
src/JSocket.cpp
|
||||
src/JGfx.cpp
|
||||
src/JSfx.cpp
|
||||
src/JAudio.cpp
|
||||
src/JMP3.cpp
|
||||
src/decoder_prx.cpp
|
||||
src/main.cpp
|
||||
src/vram.cpp)
|
||||
|
||||
set(JGE_ios_src
|
||||
src/iOS/main.m
|
||||
src/iOS/wagicAppDelegate.m
|
||||
src/iOS/ES2Renderer.m
|
||||
src/iOS/EAGLView.m
|
||||
src/iOS/EAGLViewController.m
|
||||
src/iOS/JSfx.cpp)
|
||||
|
||||
set(JGE_windows_src
|
||||
src/JNetwork.cpp
|
||||
src/pc/JSocket.cpp
|
||||
src/windows/JSfx.cpp)
|
||||
|
||||
set(JGE_INCLUDE_DIRS include include/hge)
|
||||
set(EXTRA_INCLUDE_DIR ../projects/mtg/extra)
|
||||
|
||||
#turn moc on
|
||||
if(backend_qt_console OR backend_qt_widget)
|
||||
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||
set(CMAKE_AUTOMOC TRUE)
|
||||
endif()
|
||||
|
||||
|
||||
if(backend_qt_console)
|
||||
if(UNIX AND NOT ANDROID)
|
||||
set(JGE_INTERNAL_INCLUDE_DIRS ${TINYXML_INCLUDE_DIR} ${ZIPFS_INCLUDE_DIR}
|
||||
${UNZIP_INCLUDE_DIR} ${QT_MKSPECS_DIR}/default ${Qt5Core_INCLUDE_DIRS} ${Qt5Multimedia_INCLUDE_DIRS})
|
||||
set(JGE_SOURCES ${JGE_generic_src} ${JGE_console_src} ${JGE_linux_src} ${JGE_hge_src})
|
||||
set(JGE_LINK_LIBRARIES ${Qt5Core_LIBRARIES} ${Qt5Multimedia_LIBRARIES} ${ZIPFS_LIBRARY} ${UNZIP_LIRARY}
|
||||
${JPEG_LIBRARIES} ${PNG_LIBRARIES})
|
||||
else()
|
||||
message(FATAL_ERROR "qt builds of jge platforms other than linux are not supported")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(backend_qt_widget)
|
||||
if(UNIX AND NOT ANDROID)
|
||||
set(JGE_INTERNAL_INCLUDE_DIRS ${TINYXML_INCLUDE_DIR} ${ZIPFS_INCLUDE_DIR}
|
||||
${UNZIP_INCLUDE_DIR} ${QT_MKSPECS_DIR}/default ${Qt5Core_INCLUDE_DIRS} ${Qt5Multimedia_INCLUDE_DIRS} ${Qt5OpenGL_INCLUDE_DIRS} )
|
||||
set(JGE_SOURCES ${JGE_generic_src} ${JGE_graphics_src} ${JGE_linux_src} ${JGE_hge_src})
|
||||
set(JGE_LINK_LIBRARIES ${Qt5Core_LIBRARIES} ${Qt5Multimedia_LIBRARIES} ${Qt5OpenGL_LIBRARIES} ${ZIPFS_LIBRARY} ${UNZIP_LIRARY}
|
||||
${JPEG_LIBRARIES} ${PNG_LIBRARIES})
|
||||
else()
|
||||
message(FATAL_ERROR "qt builds of jge platforms other than linux are not supported")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(backend_sdl)
|
||||
if((UNIX OR EMSCRIPTEN) AND NOT ANDROID)
|
||||
set(JGE_INTERNAL_INCLUDE_DIRS ${TINYXML_INCLUDE_DIR} ${ZIPFS_INCLUDE_DIR} ${OPENGL_INCLUDE_DIR} ${GLUT_INCLUDE_DIR}
|
||||
${SDL2_INCLUDE_DIR} ${UNZIP_INCLUDE_DIR} ${PNG_INCLUDE_DIRS} ${JPEG_INCLUDE_DIR} ${ZLIB_INCLUDE_DIRS})
|
||||
set(JGE_SOURCES ${JGE_generic_src} ${JGE_graphics_src} ${JGE_linux_src} ${JGE_hge_src})
|
||||
set(JGE_LINK_LIBRARIES ${ZIPFS_LIBRARY} ${UNZIP_LIRARY} ${JPEG_LIBRARY}
|
||||
${PNG_LIBRARIES} ${OPENGL_LIBRARIES} ${GLUT_LIBRARY})
|
||||
elseif(ANDROID)
|
||||
set(JGE_INTERNAL_INCLUDE_DIRS ${BOOST_INCLUDE_DIRS} ${TINYXML_INCLUDE_DIR} ${ZIPFS_INCLUDE_DIR}
|
||||
${SDL2_INCLUDE_DIR} ${UNZIP_INCLUDE_DIR} ${PNG_INCLUDE_DIRS} ${JPEG_INCLUDE_DIR}
|
||||
${OPENSL_INCLUDE_DIR} ${ZLIB_INCLUDE_DIRS})
|
||||
set(JGE_SOURCES ${JGE_generic_src} ${JGE_android_src} ${JGE_graphics_src} ${JGE_hge_src})
|
||||
set(JGE_LINK_LIBRARIES ${ZIPFS_LIBRARY} ${UNZIP_LIRARY} ${JPEG_LIBRARY} ${PNG_LIBRARIES}
|
||||
${OPENSL_LIBRARIES})
|
||||
elseif(WIN32)
|
||||
set(JGE_INTERNAL_INCLUDE_DIRS ${EXTRA_INCLUDE_DIR} ${TINYXML_INCLUDE_DIR} ${ZIPFS_INCLUDE_DIR} ${SDL2_INCLUDE_DIR}
|
||||
${UNZIP_INCLUDE_DIR} ${PNG_INCLUDE_DIRS} ${JPEG_INCLUDE_DIR} ${ZLIB_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR}/thirdparty/binary/win/include)
|
||||
set(JGE_SOURCES ${JGE_generic_src} ${JGE_graphics_src} ${JGE_windows_src} ${JGE_hge_src})
|
||||
set(JGE_LINK_LIBRARIES ${ZIPFS_LIBRARY} ${UNZIP_LIRARY} ${JPEG_LIBRARY} ${PNG_LIBRARIES})
|
||||
set(JGE_LINK_DIRECTORIES ${Boost_LIBRARY_DIR})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(backend_psp)
|
||||
if(PSP)
|
||||
#${PSPSDK_PATH}/include should be in system pathes
|
||||
set(JGE_INTERNAL_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/thirdparty/psp/include ${TINYXML_INCLUDE_DIR}
|
||||
${ZIPFS_INCLUDE_DIR} ${UNZIP_INCLUDE_DIR} ${BOOST_INCLUDE_DIRS} ${GIF_INCLUDE_DIR} ${PNG_INCLUDE_DIRS} )
|
||||
set(JGE_SOURCES ${JGE_generic_src} ${JGE_psp_src} ${JGE_hge_src})
|
||||
set(JGE_LINK_LIBRARIES ${TINYXML_LIBRARIES} ${ZIPFS_LIBRARY} ${UNZIP_LIRARY})
|
||||
else()
|
||||
message(FATAL_ERROR "use the cross-compile toolchain to build as the psp target")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(IOS)
|
||||
set(JGE_SOURCES ${JGE_generic_src} ${JGE_ios_src} ${JGE_hge_src} src/pc/JGfx.cpp)
|
||||
set(JGE_SOURCES ${JGE_SOURCES} PARENT_SCOPE)
|
||||
set(JGE_INCLUDE_DIRS ${JGE_INCLUDE_DIRS} src/iOS PARENT_SCOPE)
|
||||
set(JGE_LINK_LIBRARIES ${TINYXML_LIBRARIES} ${ZIPFS_LIBRARY} ${UNZIP_LIRARY})
|
||||
endif()
|
||||
|
||||
add_library(jge STATIC ${JGE_SOURCES})
|
||||
include_directories(${JGE_INTERNAL_INCLUDE_DIRS} ${JGE_INCLUDE_DIRS})
|
||||
target_link_libraries(jge ${JGE_LINK_LIBRARIES})
|
||||
link_directories(${JGE_LINK_DIRECTORIES})
|
||||
|
||||
set(${JGE_LIBRARIES} jge)
|
||||
@@ -25,6 +25,7 @@ std::string ToHex(T* pointer)
|
||||
|
||||
#ifdef LINUX
|
||||
#define OutputDebugString(val) (std::cerr << val);
|
||||
#define OutputDebugStringA(val) (std::cerr << val);
|
||||
#endif
|
||||
|
||||
#ifdef _DEBUG
|
||||
|
||||
@@ -41,7 +41,7 @@ class DownloadRequest
|
||||
private slots:
|
||||
#endif
|
||||
void fileDownloaded();
|
||||
void downloadProgress(qint64 bytesReceived, qint64 bytesTotal);
|
||||
void downloadProgress(int64_t bytesReceived, int64_t bytesTotal);
|
||||
|
||||
#ifdef QT_CONFIG
|
||||
signals:
|
||||
@@ -72,7 +72,13 @@ protected:
|
||||
QNetworkReply* mNetworkReply;
|
||||
static QNetworkAccessManager networkAccessManager;
|
||||
#endif
|
||||
|
||||
#ifdef __EMSCRIPTEN__
|
||||
static void onLoadCb(unsigned int handle, DownloadRequest* req, const char *buffer, unsigned int size);
|
||||
static void onErrorCb(unsigned int handle, DownloadRequest* req, int errorCode, const char* errorText);
|
||||
static void onProgressCb(unsigned int handle, DownloadRequest* req, int bytesReceived, int bytesTotal);
|
||||
#endif
|
||||
void processError(int errorCode, const char* errorText);
|
||||
void processBufferDownloaded(unsigned int size, const char*buffer);
|
||||
|
||||
public:
|
||||
DownloadRequest(string localPath="",
|
||||
|
||||
+1
-1
@@ -31,7 +31,7 @@ typedef u32 LocalKeySym;
|
||||
|
||||
#elif defined(SDL_CONFIG)
|
||||
#include <SDL.h>
|
||||
typedef SDLKey LocalKeySym;
|
||||
typedef SDL_Keycode LocalKeySym;
|
||||
#define LOCAL_KEY_NONE SDLK_UNKNOWN
|
||||
|
||||
#elif defined(WIN32)
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#if (!defined IOS) && (!defined ANDROID) && (!defined QT_CONFIG)
|
||||
#if (!defined IOS) && (!defined ANDROID) && (!defined QT_CONFIG) && (!defined SDL_CONFIG)
|
||||
#include <gif_lib.h>
|
||||
#endif //IOS ANDROID
|
||||
|
||||
@@ -567,7 +567,7 @@ private:
|
||||
#if (!defined IOS) && (!defined QT_CONFIG)
|
||||
void LoadJPG(TextureInfo &textureInfo, const char *filename, int mode = 0, int TextureFormat = TEXTURE_FORMAT);
|
||||
int LoadPNG(TextureInfo &textureInfo, const char *filename, int mode = 0, int TextureFormat = TEXTURE_FORMAT);
|
||||
#if (!defined ANDROID) && (!defined QT_CONFIG)
|
||||
#if (!defined ANDROID) && (!defined QT_CONFIG) && (!defined SDL_CONFIG)
|
||||
void LoadGIF(TextureInfo &textureInfo, const char *filename, int mode = 0, int TextureFormat = TEXTURE_FORMAT);
|
||||
int image_readgif(void * handle, TextureInfo &textureInfo, DWORD * bgcolor, InputFunc readFunc,int mode = 0, int TextureFormat = TEXTURE_FORMAT);
|
||||
#endif // (ANDROID) How can we get gif support for android ?
|
||||
|
||||
@@ -42,9 +42,9 @@ private:
|
||||
// convert the socket into non-blocking state
|
||||
bool SetNonBlocking(int sock);
|
||||
// socket handle
|
||||
#ifdef WIN32
|
||||
#if (defined WIN32) && (!defined __GNUG__)
|
||||
SOCKET mfd;
|
||||
#elif LINUX || PSP
|
||||
#elif LINUX || PSP || __GNUG__
|
||||
int mfd;
|
||||
#endif
|
||||
};
|
||||
|
||||
+24
-16
@@ -18,20 +18,20 @@
|
||||
|
||||
#include "JTypes.h"
|
||||
|
||||
|
||||
#ifdef ANDROID
|
||||
#include <SLES/OpenSLES.h>
|
||||
#include "SLES/OpenSLES_Android.h"
|
||||
|
||||
#elif defined USE_PHONON
|
||||
#elif defined(USE_PHONON)
|
||||
#include <phonon/AudioOutput>
|
||||
#include <phonon/MediaObject>
|
||||
#elif (defined QT_CONFIG)
|
||||
#elif defined (QT_CONFIG)
|
||||
#include "QMediaPlayer"
|
||||
#include "QMediaPlaylist"
|
||||
#include "QSoundEffect"
|
||||
#elif defined WIN32
|
||||
#elif defined(WIN32)
|
||||
#include <windows.h>
|
||||
#define WITH_FMOD
|
||||
//#define WITH_FMOD
|
||||
#elif defined (PSP)
|
||||
#include <pspgu.h>
|
||||
#include <pspkernel.h>
|
||||
@@ -48,7 +48,7 @@
|
||||
#endif
|
||||
|
||||
#ifdef WITH_FMOD
|
||||
#include "../Dependencies/include/fmod.h"
|
||||
#include "fmod.h"
|
||||
#endif
|
||||
|
||||
//------------------------------------------------------------------------------------------------
|
||||
@@ -79,20 +79,26 @@ public slots:
|
||||
std::string filename;
|
||||
std::string key;
|
||||
std::string ext;
|
||||
void* mTrack;
|
||||
#elif defined WITH_FMOD
|
||||
FSOUND_SAMPLE* mTrack; // MP3 needed to be of "sample" type for FMOD, FMUSIC_MODULE is for MODs
|
||||
void* mTrack;
|
||||
#elif defined ANDROID
|
||||
SLObjectItf playerObject;
|
||||
SLPlayItf playInterface;
|
||||
SLSeekItf seekInterface;
|
||||
SLVolumeItf musicVolumeInterface;
|
||||
void* mTrack;
|
||||
#elif (defined QT_CONFIG)
|
||||
QMediaPlaylist* playlist;
|
||||
QMediaPlayer* player;
|
||||
string fullpath;
|
||||
#else
|
||||
void* mTrack;
|
||||
#endif //WITH_FMOD
|
||||
void* mTrack;
|
||||
#elif (defined WIN32)
|
||||
std::string filename;
|
||||
void* mTrack;
|
||||
#endif
|
||||
//#endif //WITH_FMOD
|
||||
|
||||
};
|
||||
|
||||
@@ -107,28 +113,30 @@ public:
|
||||
unsigned long fileSize();
|
||||
#if (defined QT_CONFIG) && (!defined USE_PHONON)
|
||||
QMediaPlayer* effect;
|
||||
void* mSample;
|
||||
void* mSample;
|
||||
#elif defined (PSP)
|
||||
WAVDATA *mSample;
|
||||
WAVDATA* mSample;
|
||||
#elif defined (IOS)
|
||||
std::string filename;
|
||||
std::string key;
|
||||
std::string ext;
|
||||
|
||||
void* mSample;
|
||||
void* mSample;
|
||||
#elif defined (WITH_FMOD)
|
||||
FSOUND_SAMPLE *mSample;
|
||||
#elif defined (USE_PHONON)
|
||||
Phonon::AudioOutput* mOutput;
|
||||
Phonon::MediaObject* mMediaObject;
|
||||
void* mSample;
|
||||
void* mSample;
|
||||
#elif defined ANDROID
|
||||
SLObjectItf playerObject;
|
||||
SLPlayItf playInterface;
|
||||
SLVolumeItf sampleVolumeInterface;
|
||||
void* mSample;
|
||||
void* mSample;
|
||||
#elif (defined WIN32)
|
||||
std::string filename;
|
||||
void* mSample;
|
||||
#else
|
||||
void* mSample;
|
||||
void* mSample;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
+16
-2
@@ -26,8 +26,16 @@
|
||||
#include "JAudio.h"
|
||||
|
||||
#else
|
||||
|
||||
#include <stdint.h>
|
||||
//#define __STDC_LIMIT_MACROS
|
||||
#ifdef IOS
|
||||
#include <tr1/cstdint>
|
||||
#else
|
||||
#include <cstdint>
|
||||
#endif
|
||||
//#include <stdint.h>
|
||||
//the MSC version might only define _MSC_STDINT_H_
|
||||
//and that might cause redefinition of standard types
|
||||
//#define _STDINT_H_
|
||||
|
||||
#endif
|
||||
|
||||
@@ -104,6 +112,7 @@ enum {
|
||||
#endif // CONSOLE_CONFIG
|
||||
|
||||
#if (defined WIN32) && (!defined LINUX)
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#endif
|
||||
#if defined(LINUX) && (!defined WIN32) || defined(IOS) || defined (ANDROID)
|
||||
@@ -140,9 +149,14 @@ typedef uint32_t u32;
|
||||
#include <GLES/gl.h>
|
||||
#include <GLES/glext.h>
|
||||
#elif defined (WIN32) || defined (LINUX)
|
||||
#if defined(__APPLE__)
|
||||
#include <OpenGL/gl.h>
|
||||
#include <OpenGL/glu.h>
|
||||
#else
|
||||
#include <GL/gl.h>
|
||||
#include <GL/glu.h>
|
||||
#endif
|
||||
#endif
|
||||
#else
|
||||
#include <QtOpenGL>
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
#ifndef PRECOMPILEDHEADER_H
|
||||
#define PRECOMPILEDHEADER_H
|
||||
|
||||
#include <algorithm>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <list>
|
||||
#include <map>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "DebugRoutines.h"
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#include "JGE.h"
|
||||
#include "JFileSystem.h"
|
||||
#include "JLogger.h"
|
||||
|
||||
//#ifndef WP8
|
||||
//#include <boost/shared_ptr.hpp>
|
||||
//#endif
|
||||
|
||||
#if defined (WP8) || defined (IOS) || defined (ANDROID) || defined (QT_CONFIG) || defined (SDL_CONFIG)
|
||||
#define TOUCH_ENABLED
|
||||
#endif
|
||||
|
||||
#endif //PRECOMPILEDHEADER_H
|
||||
@@ -1,7 +1,7 @@
|
||||
#ifndef THREADING_H
|
||||
#define THREADING_H
|
||||
|
||||
#if !defined(PSP) && !defined(QT_CONFIG) && !(__cplusplus > 199711L)
|
||||
#if !defined(PSP) && !defined(QT_CONFIG) && !(__cplusplus > 199711L) && !(_MSC_VER >= 1700)
|
||||
#include <boost/date_time.hpp>
|
||||
|
||||
#ifdef WIN32
|
||||
@@ -537,7 +537,7 @@ namespace boost
|
||||
}
|
||||
}
|
||||
|
||||
#elif (__cplusplus > 199711L)
|
||||
#elif (__cplusplus > 199711L) || (_MSC_VER >= 1700)
|
||||
|
||||
#include <thread>
|
||||
#include <mutex>
|
||||
|
||||
@@ -33,6 +33,7 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
void* vrelptr( void *ptr ); // make a pointer relative to memory base address (ATTENTION: A NULL rel ptr is not illegal/invalid!)
|
||||
|
||||
void* vabsptr( void *ptr ); // make a pointer absolute (default return type of valloc)
|
||||
|
||||
void* valloc( size_t size );
|
||||
|
||||
+73
-21
@@ -7,6 +7,9 @@
|
||||
#ifdef QT_CONFIG
|
||||
QNetworkAccessManager DownloadRequest::networkAccessManager;
|
||||
#endif
|
||||
#ifdef __EMSCRIPTEN__
|
||||
#include "emscripten.h"
|
||||
#endif
|
||||
|
||||
DownloadRequest::DownloadRequest(string localPath,
|
||||
string remoteResourceURL,
|
||||
@@ -48,15 +51,71 @@ void DownloadRequest::startGet()
|
||||
JFileSystem::GetInstance()->Remove(getTempLocalPath());
|
||||
JFileSystem::GetInstance()->openForWrite(mFile, getTempLocalPath());
|
||||
#ifdef QT_CONFIG
|
||||
connect(mNetworkReply, SIGNAL(downloadProgress(qint64, qint64)),
|
||||
SLOT(downloadProgress(qint64, qint64)));
|
||||
connect(mNetworkReply, SIGNAL(downloadProgress(int64_t, int64_t)),
|
||||
SLOT(downloadProgress(int64_t, int64_t)));
|
||||
connect(mNetworkReply, SIGNAL(finished()), SLOT(fileDownloaded()));
|
||||
#endif
|
||||
|
||||
#ifdef __EMSCRIPTEN__
|
||||
emscripten_async_wget2_data(mRemoteResourceURL.c_str(), "GET", 0, this, 1,
|
||||
(em_async_wget2_data_onload_func)DownloadRequest::onLoadCb,
|
||||
(em_async_wget2_data_onerror_func)DownloadRequest::onErrorCb,
|
||||
(em_async_wget2_data_onprogress_func)DownloadRequest::onProgressCb);
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
#ifdef __EMSCRIPTEN__
|
||||
void DownloadRequest::onLoadCb(unsigned int handle, DownloadRequest* req, const char *buffer, unsigned int size)
|
||||
{
|
||||
|
||||
DebugTrace("DownloadRequest::onLoadCb: " << size);
|
||||
req->processBufferDownloaded(size, buffer);
|
||||
Downloader::GetInstance()->Update();
|
||||
}
|
||||
|
||||
void DownloadRequest::onErrorCb(unsigned int handle, DownloadRequest* req, int errorCode, const char* errorText)
|
||||
{
|
||||
DebugTrace("DownloadRequest::onErrorCb");
|
||||
req->processError(errorCode, errorText);
|
||||
Downloader::GetInstance()->Update();
|
||||
}
|
||||
|
||||
void DownloadRequest::onProgressCb(unsigned int handle, DownloadRequest* req, int bytesReceived, int bytesTotal)
|
||||
{
|
||||
DebugTrace("DownloadRequest::onProgressCb");
|
||||
req->DownloadRequest::downloadProgress(bytesReceived, bytesTotal);
|
||||
}
|
||||
#endif
|
||||
|
||||
void DownloadRequest::processError(int errorCode, const char* errorText)
|
||||
{
|
||||
DebugTrace(errorText);
|
||||
mDownloadStatus = DownloadRequest::DOWNLOAD_ERROR;
|
||||
mFile.close();
|
||||
JFileSystem::GetInstance()->Remove(getTempLocalPath());
|
||||
}
|
||||
|
||||
void DownloadRequest::processBufferDownloaded(unsigned int size, const char*buffer)
|
||||
{
|
||||
if(mFile.is_open())
|
||||
{
|
||||
mTotalSize = size;
|
||||
mFile.write(buffer, size);
|
||||
mFile.close();
|
||||
if(!JFileSystem::GetInstance()->Rename(getTempLocalPath(), mLocalPath)) {
|
||||
mDownloadStatus = DownloadRequest::DOWNLOAD_ERROR;
|
||||
return;
|
||||
}
|
||||
}
|
||||
mDownloadStatus = DownloadRequest::DOWNLOADED;
|
||||
}
|
||||
|
||||
void DownloadRequest::fileDownloaded()
|
||||
{
|
||||
do {
|
||||
#ifdef QT_CONFIG
|
||||
do {
|
||||
QByteArray eTagByteArray = mNetworkReply->rawHeader("ETag");
|
||||
if(!eTagByteArray.isEmpty()) {
|
||||
string oldETag = mETag;
|
||||
@@ -67,10 +126,7 @@ void DownloadRequest::fileDownloaded()
|
||||
|
||||
// let's check some error
|
||||
if(mNetworkReply->error() != QNetworkReply::NoError) {
|
||||
DebugTrace(mNetworkReply->errorString().toStdString());
|
||||
mDownloadStatus = DownloadRequest::DOWNLOAD_ERROR;
|
||||
mFile.close();
|
||||
JFileSystem::GetInstance()->Remove(getTempLocalPath());
|
||||
processError((int)mNetworkReply->error(), mNetworkReply->errorString().toStdString().c_str());
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -89,35 +145,31 @@ void DownloadRequest::fileDownloaded()
|
||||
return;
|
||||
}
|
||||
|
||||
if(mFile.is_open())
|
||||
{
|
||||
QByteArray byteArray = mNetworkReply->readAll();
|
||||
mFile.write(byteArray.constData(), byteArray.size());
|
||||
mFile.close();
|
||||
if(!JFileSystem::GetInstance()->Rename(getTempLocalPath(), mLocalPath)) {
|
||||
mDownloadStatus = DownloadRequest::DOWNLOAD_ERROR;
|
||||
break;
|
||||
}
|
||||
}
|
||||
mDownloadStatus = DownloadRequest::DOWNLOADED;
|
||||
QByteArray byteArray = mNetworkReply->readAll();
|
||||
processBufferDownloaded(byteArray.size(), byteArray.constData());
|
||||
} while(0);
|
||||
|
||||
Downloader::GetInstance()->Update();
|
||||
mNetworkReply->deleteLater();
|
||||
|
||||
mNetworkReply->deleteLater();
|
||||
emit statusChanged((int)mDownloadStatus);
|
||||
#endif
|
||||
}
|
||||
|
||||
void DownloadRequest::downloadProgress(qint64 bytesReceived, qint64 bytesTotal)
|
||||
void DownloadRequest::downloadProgress(int64_t bytesReceived, int64_t bytesTotal)
|
||||
{
|
||||
QByteArray byteArray = mNetworkReply->readAll();
|
||||
#ifdef QT_CONFIG
|
||||
QByteArray byteArray = mNetworkReply->readAll();
|
||||
mFile.write(byteArray.constData(), byteArray.size());
|
||||
#endif
|
||||
mCurrentSize = bytesReceived;
|
||||
mTotalSize = bytesTotal;
|
||||
int percent = 0;
|
||||
if(bytesTotal)
|
||||
percent = (bytesReceived/bytesTotal)*100;
|
||||
#ifdef QT_CONFIG
|
||||
emit percentChanged(percent);
|
||||
#endif
|
||||
}
|
||||
|
||||
Downloader* Downloader::mInstance = 0;
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
#include "../include/JSprite.h"
|
||||
#include "../include/JAnimator.h"
|
||||
|
||||
#include "tinyxml/tinyxml.h"
|
||||
#include "tinyxml.h"
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
+11
-13
@@ -16,14 +16,7 @@ User folder is the only one that is really needed to guarantee both read and wri
|
||||
The content that users should not be touching.
|
||||
*/
|
||||
|
||||
#if defined (ANDROID)
|
||||
#include "PrecompiledHeader.h"
|
||||
#endif //ANDROID
|
||||
|
||||
#if defined (LINUX)
|
||||
#include "../../projects/mtg/include/PrecompiledHeader.h"
|
||||
#endif //LINUX
|
||||
|
||||
#include "dirent.h"
|
||||
|
||||
#ifdef WIN32
|
||||
#pragma warning(disable : 4786)
|
||||
@@ -37,7 +30,8 @@ The content that users should not be touching.
|
||||
#include "../include/JGE.h"
|
||||
#include "../include/JFileSystem.h"
|
||||
#include "../include/JLogger.h"
|
||||
#include <dirent.h>
|
||||
#include "DebugRoutines.h"
|
||||
|
||||
|
||||
#ifdef QT_CONFIG
|
||||
#include <QDir>
|
||||
@@ -130,6 +124,10 @@ JFileSystem::JFileSystem(const string & _userPath, const string & _systemPath)
|
||||
userPath = [[documentsDirectory stringByAppendingString: @"/User/"] cStringUsingEncoding:1];
|
||||
systemPath = [[documentsDirectory stringByAppendingString: @"/Res/"] cStringUsingEncoding:1];
|
||||
|
||||
#elif defined (__EMSCRIPTEN__)
|
||||
systemPath = "/";
|
||||
DebugTrace("User path " << userPath);
|
||||
DebugTrace("System path " << systemPath);
|
||||
#elif defined (ANDROID)
|
||||
userPath = JGE::GetInstance()->getFileUserFolderPath();
|
||||
systemPath = JGE::GetInstance()->getFileSystemLocation();
|
||||
@@ -146,9 +144,9 @@ JFileSystem::JFileSystem(const string & _userPath, const string & _systemPath)
|
||||
userPath = QDir::toNativeSeparators(dir.absolutePath()).toStdString();
|
||||
systemPath = QDir::toNativeSeparators(sysDir.absolutePath()).toStdString();
|
||||
|
||||
DebugTrace("User path " << userPath);
|
||||
DebugTrace("System path " << systemPath);
|
||||
DebugTrace("Current path " << QDir::currentPath().toStdString());
|
||||
DebugTrace("User path " + userPath);
|
||||
DebugTrace("System path " + systemPath);
|
||||
DebugTrace("Current path " + QDir::currentPath().toStdString());
|
||||
#else
|
||||
//Find the Res.txt file and matching Res folders for backwards compatibility
|
||||
ifstream mfile("Res.txt");
|
||||
@@ -304,6 +302,7 @@ void JFileSystem::DetachZipFile()
|
||||
|
||||
bool JFileSystem::openForRead(izfstream & File, const string & FilePath) {
|
||||
|
||||
DebugTrace("JFileSystem::openForRead " << FilePath);
|
||||
File.open(FilePath.c_str(), mUserFS);
|
||||
if (File)
|
||||
return true;
|
||||
@@ -414,7 +413,6 @@ bool JFileSystem::OpenFile(const string &filename)
|
||||
mCurrentFileInZip = &(it2->second);
|
||||
mFileSize = it2->second.m_Size;
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
+2
-2
@@ -34,7 +34,7 @@
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
#if defined (WIN32) // WIN32 specific code
|
||||
#include "../../Dependencies/include/fmod.h"
|
||||
#include "fmod.h"
|
||||
|
||||
u8 JGE::GetAnalogX()
|
||||
{
|
||||
@@ -54,7 +54,7 @@ u8 JGE::GetAnalogY()
|
||||
#elif defined (LINUX) // Unix specific code
|
||||
#include <sys/time.h>
|
||||
#ifdef WITH_FMOD
|
||||
#include "../Dependencies/include/fmod.h"
|
||||
#include "fmod.h"
|
||||
#endif //WITH_FMOD
|
||||
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#include <pspaudio.h>
|
||||
#include <pspmp3.h>
|
||||
#include <psputility.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#else
|
||||
#define PSP_AUDIO_VOLUME_MAX 100
|
||||
|
||||
@@ -42,7 +42,7 @@ bool JNetwork::isConnected(){
|
||||
|
||||
void JNetwork::getServerIp(string& aString)
|
||||
{
|
||||
#ifdef WIN32
|
||||
#if (defined WIN32) && (!defined __GNUG__)
|
||||
char ac[80];
|
||||
if (gethostname(ac, sizeof(ac)) == SOCKET_ERROR) {
|
||||
DebugTrace("Error " << WSAGetLastError() <<
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
#include "../include/JFileSystem.h"
|
||||
#include "../include/JResourceManager.h"
|
||||
|
||||
#include "tinyxml/tinyxml.h"
|
||||
#include "tinyxml.h"
|
||||
|
||||
//-------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -14,9 +14,9 @@
|
||||
#include "../include/JResourceManager.h"
|
||||
#include "../include/JFileSystem.h"
|
||||
#include "../include/JLBFont.h"
|
||||
#include "tinyxml/tinyxml.h"
|
||||
#include "tinyxml.h"
|
||||
|
||||
#if defined (_DEBUG) && defined (WIN32) && (!defined LINUX)
|
||||
#if defined (_DEBUG) && defined (WIN32) && (!defined LINUX) && (!defined __GNUG__)
|
||||
#include "crtdbg.h"
|
||||
#define NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
|
||||
#else
|
||||
|
||||
+1
-1
@@ -13,7 +13,7 @@
|
||||
#include "../include/JFileSystem.h"
|
||||
#include "../include/JSpline.h"
|
||||
|
||||
#include "tinyxml/tinyxml.h"
|
||||
#include "tinyxml.h"
|
||||
|
||||
#define SMALL_NUMBER 0.0001f
|
||||
|
||||
|
||||
@@ -19,7 +19,8 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "../include/decoder_prx.h"
|
||||
#include "decoder_prx.h"
|
||||
#include <psputility.h>
|
||||
|
||||
char *prx_static_init()
|
||||
{
|
||||
+5
-5
@@ -12,7 +12,7 @@
|
||||
#if (!defined IOS) && (!defined QT_CONFIG)
|
||||
#ifdef WIN32
|
||||
#pragma warning(disable : 4786)
|
||||
#pragma comment( lib, "giflib.lib" )
|
||||
//#pragma comment( lib, "giflib.lib" )
|
||||
#endif
|
||||
|
||||
#include <png.h>
|
||||
@@ -35,7 +35,7 @@ extern "C" {
|
||||
#include "../../include/JFileSystem.h"
|
||||
#include "../../include/JAssert.h"
|
||||
|
||||
#if (defined WIN32) && (!defined QT_CONFIG)
|
||||
#if (defined WIN32) && (!defined QT_CONFIG) && (!defined SDL_CONFIG)
|
||||
#ifndef __attribute__
|
||||
#define __attribute__((a))
|
||||
#endif
|
||||
@@ -1665,7 +1665,7 @@ static void jpeg_mem_src(j_decompress_ptr cinfo, byte *mem, int len)
|
||||
cinfo->src->resync_to_restart = jpeg_resync_to_restart;
|
||||
cinfo->src->term_source = jpg_null;
|
||||
cinfo->src->bytes_in_buffer = len;
|
||||
cinfo->src->next_input_byte = mem;
|
||||
cinfo->src->next_input_byte = (const JOCTET*)mem;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1702,7 +1702,7 @@ void JRenderer::LoadJPG(TextureInfo &textureInfo, const char *filename, int mode
|
||||
cinfo.err = jpeg_std_error(&jerr);
|
||||
jpeg_create_decompress(&cinfo);
|
||||
|
||||
jpeg_mem_src(&cinfo, rawdata, rawsize);
|
||||
jpeg_mem_src(&cinfo, (byte*)rawdata, rawsize);
|
||||
|
||||
// Process JPEG header
|
||||
jpeg_read_header(&cinfo, true);
|
||||
@@ -1740,7 +1740,7 @@ void JRenderer::LoadJPG(TextureInfo &textureInfo, const char *filename, int mode
|
||||
// Pass sizes to output
|
||||
|
||||
// Allocate Scanline buffer
|
||||
scanline = (byte *)malloc(cinfo.output_width * 3);
|
||||
scanline = (BYTE *)malloc(cinfo.output_width * 3);
|
||||
if(!scanline)
|
||||
{
|
||||
//// ri.Con_Printf(PRINT_ALL, "Insufficient RAM for JPEG scanline buffer\n");
|
||||
|
||||
@@ -75,7 +75,7 @@ static int __largest_block = __MEM_BLOCKS;
|
||||
static int __mem_free = __MEM_BLOCKS;
|
||||
|
||||
|
||||
inline void* vrelptr( void *ptr )
|
||||
void* vrelptr( void *ptr )
|
||||
{
|
||||
return (void*)((unsigned int)ptr & ~__MEM_START);
|
||||
}
|
||||
@@ -0,0 +1,182 @@
|
||||
#include <Windows.h>
|
||||
#include <Mmsystem.h>
|
||||
#include <mciapi.h>
|
||||
//these two headers are already included in the <Windows.h> header
|
||||
#pragma comment(lib, "Winmm.lib")
|
||||
|
||||
#include "DebugRoutines.h"
|
||||
#include "../../include/JSoundSystem.h"
|
||||
#include "../../include/JFileSystem.h"
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
JMusic::JMusic()
|
||||
:
|
||||
mTrack(0)
|
||||
{
|
||||
}
|
||||
|
||||
void JMusic::Update(){
|
||||
|
||||
}
|
||||
|
||||
int JMusic::getPlayTime(){
|
||||
return 0;
|
||||
}
|
||||
|
||||
JMusic::~JMusic()
|
||||
{
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
JSample::JSample()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
JSample::~JSample()
|
||||
{
|
||||
}
|
||||
|
||||
unsigned long JSample::fileSize()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
JSoundSystem* JSoundSystem::mInstance = NULL;
|
||||
|
||||
JSoundSystem* JSoundSystem::GetInstance()
|
||||
{
|
||||
if (mInstance == NULL)
|
||||
{
|
||||
mInstance = new JSoundSystem();
|
||||
mInstance->InitSoundSystem();
|
||||
}
|
||||
return mInstance;
|
||||
}
|
||||
|
||||
|
||||
void JSoundSystem::Destroy()
|
||||
{
|
||||
if (mInstance)
|
||||
{
|
||||
mInstance->DestroySoundSystem();
|
||||
delete mInstance;
|
||||
mInstance = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
JSoundSystem::JSoundSystem()
|
||||
{
|
||||
mVolume = 0;
|
||||
mSampleVolume = 0;
|
||||
}
|
||||
|
||||
JSoundSystem::~JSoundSystem()
|
||||
{
|
||||
}
|
||||
|
||||
void JSoundSystem::InitSoundSystem()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void JSoundSystem::DestroySoundSystem()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
JMusic *JSoundSystem::LoadMusic(const char *fileName)
|
||||
{
|
||||
JMusic* music = NULL;
|
||||
music = new JMusic();
|
||||
if (music)
|
||||
{
|
||||
music->filename = JFileSystem::GetInstance()->GetResourceFile(fileName);
|
||||
std::string aString = "open \"" + music->filename + "\" type mpegvideo alias mp3";
|
||||
mciSendString(aString.c_str(), NULL, 0, NULL);
|
||||
music->mTrack = (void*)-1;
|
||||
}
|
||||
|
||||
return music;
|
||||
}
|
||||
|
||||
|
||||
void JSoundSystem::PlayMusic(JMusic *music, bool looping)
|
||||
{
|
||||
if (music && music->mTrack)
|
||||
{
|
||||
if(looping)
|
||||
mciSendString("play mp3 repeat", NULL, 0, NULL);
|
||||
else
|
||||
mciSendString("play mp3", NULL, 0, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void JSoundSystem::StopMusic(JMusic *music)
|
||||
{
|
||||
if (music && music->mTrack)
|
||||
{
|
||||
mciSendString("stop mp3", NULL, 0, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void JSoundSystem::PauseMusic(JMusic *music)
|
||||
{
|
||||
if (music && music->mTrack)
|
||||
{
|
||||
mciSendString("pause mp3", NULL, 0, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void JSoundSystem::ResumeMusic(JMusic *music)
|
||||
{
|
||||
if (music && music->mTrack)
|
||||
{
|
||||
mciSendString("resume mp3", NULL, 0, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void JSoundSystem::SetVolume(int volume)
|
||||
{
|
||||
SetMusicVolume(volume);
|
||||
SetSfxVolume(volume);
|
||||
}
|
||||
|
||||
void JSoundSystem::SetMusicVolume(int volume)
|
||||
{
|
||||
mVolume = volume;
|
||||
}
|
||||
|
||||
void JSoundSystem::SetSfxVolume(int volume)
|
||||
{
|
||||
mSampleVolume = volume;
|
||||
SetMusicVolume(mVolume);
|
||||
}
|
||||
|
||||
JSample *JSoundSystem::LoadSample(const char *fileName)
|
||||
{
|
||||
JSample* sample = NULL;
|
||||
sample = new JSample();
|
||||
if (sample)
|
||||
{
|
||||
sample->filename = JFileSystem::GetInstance()->GetResourceFile(fileName);
|
||||
}
|
||||
|
||||
return sample;
|
||||
}
|
||||
|
||||
|
||||
void JSoundSystem::PlaySample(JSample *sample)
|
||||
{
|
||||
if(sample)
|
||||
{
|
||||
sndPlaySound(sample->filename.c_str(), SND_FILENAME | SND_ASYNC);
|
||||
}
|
||||
}
|
||||
|
||||
+15
-2
@@ -17,6 +17,7 @@ skip_tags: true
|
||||
#---------------------------------#
|
||||
|
||||
environment:
|
||||
DXSDK_DIR: "C:/Program Files (x86)/Microsoft DirectX SDK/"
|
||||
GH_TOKEN:
|
||||
secure: dYnBDQkiY5oVjIlswzBX9BJigNtBGXgGlp1tK3XbHzrDEDrs2vaKD5m+Oz5OSz1C
|
||||
|
||||
@@ -26,6 +27,10 @@ install:
|
||||
- powershell -Command "& {C:/Python27/python.exe C:/get-pip.py}"
|
||||
- "C:/Python27/Scripts/pip.exe install pyjavaproperties"
|
||||
- "C:/Python27/Scripts/pip.exe install github3.py"
|
||||
- git submodule update --init --recursive
|
||||
- cd thirdparty/SDL2
|
||||
# - git checkout release-2.0.3
|
||||
- cd ../..
|
||||
|
||||
#---------------------------------#
|
||||
# build configuration #
|
||||
@@ -34,8 +39,16 @@ install:
|
||||
# build Configuration, i.e. Debug, Release, etc.
|
||||
configuration: Release
|
||||
|
||||
# scripts to run before build
|
||||
before_build:
|
||||
- echo Running cmake...
|
||||
- mkdir build
|
||||
- cd build
|
||||
- cmake -Dbackend_sdl=ON ..
|
||||
- cd ..
|
||||
|
||||
build:
|
||||
project: projects/mtg/mtg_vs2010.sln # path to Visual Studio solution or project
|
||||
project: build/wagic.sln # path to Visual Studio solution or project
|
||||
|
||||
#---------------------------------#
|
||||
# tests configuration #
|
||||
@@ -61,7 +74,7 @@ artifacts:
|
||||
# scripts to run before deployment
|
||||
before_deploy:
|
||||
- cd projects/mtg/bin
|
||||
- "C:/Python27/python.exe createWindowsZip.py"
|
||||
- "C:/Python27/python.exe createWindowsZip.py -b ../../../build"
|
||||
- cd ../../..
|
||||
|
||||
# scripts to run after deployment
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
add_definitions(-DANDROID -DLINUX)
|
||||
add_definitions(-D_STLP_USE_SIMPLE_NODE_ALLOC -D__arm__ -D_REENTRANT -D_GLIBCXX__PTHREADS)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
|
||||
@@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="0192" android:versionName="@string/app_version" package="net.wagic.app">
|
||||
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
||||
<uses-permission android:name="android.permission.INTERNET"/>
|
||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
|
||||
<application android:debuggable="true" android:icon="@drawable/icon" android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
|
||||
<activity android:configChanges="keyboard|keyboardHidden|orientation" android:label="@string/app_name" android:name="org.libsdl.app.SDLActivity" android:screenOrientation="sensorLandscape">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
<activity android:configChanges="keyboard|keyboardHidden|orientation" android:name="com.google.ads.AdActivity" android:screenOrientation="sensorLandscape"/>
|
||||
</application>
|
||||
<uses-sdk android:minSdkVersion="@ANDROID_NATIVE_API_LEVEL@" android:targetSdkVersion="@ANDROID_NATIVE_API_LEVEL@"/>
|
||||
</manifest>
|
||||
@@ -0,0 +1,121 @@
|
||||
if(NOT ANDROID_PACKAGE_RELEASE)
|
||||
set(ANDROID_PACKAGE_RELEASE 1)
|
||||
endif()
|
||||
|
||||
if(NOT ANDROID_PACKAGE_PLATFORM)
|
||||
if(ARMEABI_V7A)
|
||||
if(NEON)
|
||||
set(ANDROID_PACKAGE_PLATFORM armv7a_neon)
|
||||
else()
|
||||
set(ANDROID_PACKAGE_PLATFORM armv7a)
|
||||
endif()
|
||||
elseif(ARMEABI_V6)
|
||||
set(ANDROID_PACKAGE_PLATFORM armv6)
|
||||
elseif(ARMEABI)
|
||||
set(ANDROID_PACKAGE_PLATFORM armv5)
|
||||
elseif(X86)
|
||||
set(ANDROID_PACKAGE_PLATFORM x86)
|
||||
elseif(MIPS)
|
||||
set(ANDROID_PACKAGE_PLATFORM mips)
|
||||
else()
|
||||
message(ERROR "Can not automatically determine the value for ANDROID_PACKAGE_PLATFORM")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NOT ANDROID_PACKAGE_PLATFORM_NAME)
|
||||
if(ARMEABI_V7A)
|
||||
if(NEON)
|
||||
set(ANDROID_PACKAGE_PLATFORM_NAME "armeabi-v7a with NEON")
|
||||
else()
|
||||
set(ANDROID_PACKAGE_PLATFORM_NAME "armeabi-v7a")
|
||||
endif()
|
||||
elseif(ARMEABI_V6)
|
||||
set(ANDROID_PACKAGE_PLATFORM_NAME "armeabi-v6")
|
||||
elseif(ARMEABI)
|
||||
set(ANDROID_PACKAGE_PLATFORM_NAME "armeabi")
|
||||
elseif(X86)
|
||||
set(ANDROID_PACKAGE_PLATFORM_NAME "x86")
|
||||
elseif(MIPS)
|
||||
set(ANDROID_PACKAGE_PLATFORM_NAME "mips")
|
||||
else()
|
||||
message(ERROR "Can not automatically determine the value for ANDROID_PACKAGE_PLATFORM_NAME")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if("${ANDROID_NATIVE_API_LEVEL}" MATCHES "[1-9][0-9]*$")
|
||||
set(ANDROID_SDK_VERSION ${CMAKE_MATCH_0})
|
||||
endif()
|
||||
|
||||
if(NOT ANDROID_SDK_VERSION GREATER 7)
|
||||
set(ANDROID_SDK_VERSION 8)
|
||||
endif()
|
||||
|
||||
set(PACKAGE_DIR "${CMAKE_BINARY_DIR}/package")
|
||||
|
||||
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/AndroidManifest.xml"
|
||||
"${PACKAGE_DIR}/AndroidManifest.xml" @ONLY)
|
||||
#configure_file("${CMAKE_CURRENT_SOURCE_DIR}/build.xml"
|
||||
# "${PACKAGE_DIR}/build.xml" COPYONLY)
|
||||
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/res/values/strings.xml"
|
||||
"${PACKAGE_DIR}/res/values/strings.xml" COPYONLY)
|
||||
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/res/drawable-hdpi/icon.png"
|
||||
"${PACKAGE_DIR}/res/drawable-hdpi/icon.png" COPYONLY)
|
||||
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/res/drawable-ldpi/icon.png"
|
||||
"${PACKAGE_DIR}/res/drawable-ldpi/icon.png" COPYONLY)
|
||||
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/res/drawable-mdpi/icon.png"
|
||||
"${PACKAGE_DIR}/res/drawable-mdpi/icon.png" COPYONLY)
|
||||
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/res/layout/main.xml"
|
||||
"${PACKAGE_DIR}/res/layout/main.xml" COPYONLY)
|
||||
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/assets/_keystore/wagic-release.keystore"
|
||||
"${PACKAGE_DIR}/assets/_keystore/wagic-release.keystore" COPYONLY)
|
||||
|
||||
string( REGEX MATCH "[0-9]+" ANDROID_NATIVE_API_LEVEL_NUMBER "${ANDROID_NATIVE_API_LEVEL}" )
|
||||
|
||||
set(target_name "Wagic_${WAGIC_VERSION}_binary_pack_${ANDROID_PACKAGE_PLATFORM}")
|
||||
get_target_property(wagic_location wagic LOCATION)
|
||||
|
||||
string(TOLOWER ${CMAKE_BUILD_TYPE} android_build_type)
|
||||
|
||||
set(android_proj_target_files ${ANDROID_PROJECT_FILES})
|
||||
list_add_prefix(android_proj_target_files "${PACKAGE_DIR}/")
|
||||
set(APK_NAME "${PACKAGE_DIR}/bin/${target_name}-${android_build_type}-unsigned.apk")
|
||||
|
||||
file(GLOB camera_wrappers "${OpenCV_SOURCE_DIR}/3rdparty/lib/${ANDROID_NDK_ABI_NAME}/libnative_camera_r*.so")
|
||||
set(CAMERA_LIB_COMMANDS "")
|
||||
|
||||
foreach(wrapper ${camera_wrappers})
|
||||
list(APPEND CAMERA_LIB_COMMANDS COMMAND ${CMAKE_COMMAND} -E copy "${wrapper}" "${PACKAGE_DIR}/libs/${ANDROID_NDK_ABI_NAME}/")
|
||||
endforeach()
|
||||
|
||||
add_custom_command(
|
||||
OUTPUT "${APK_NAME}"
|
||||
COMMAND ${CMAKE_COMMAND} -E remove_directory "${PACKAGE_DIR}/libs"
|
||||
COMMAND ${CMAKE_COMMAND} -E remove_directory "${PACKAGE_DIR}/bin"
|
||||
COMMAND ${CMAKE_COMMAND} -E remove_directory "${PACKAGE_DIR}/gen"
|
||||
COMMAND ${CMAKE_COMMAND} -E remove ${android_proj_target_files}
|
||||
COMMAND ${CMAKE_COMMAND} -E make_directory "${PACKAGE_DIR}/src"
|
||||
COMMAND ${CMAKE_COMMAND} -E make_directory "${PACKAGE_DIR}/libs/${ANDROID_NDK_ABI_NAME}/"
|
||||
# COMMAND ${CMAKE_COMMAND} -E copy "${SDL2_LIBRARY}" "${PACKAGE_DIR}/libs/${ANDROID_NDK_ABI_NAME}/"
|
||||
# COMMAND ${CMAKE_COMMAND} -E copy "${ZLIB_LIBRARY}" "${PACKAGE_DIR}/libs/${ANDROID_NDK_ABI_NAME}/"
|
||||
# COMMAND ${CMAKE_COMMAND} -E copy "${OPENSL_LIBRARY}" "${PACKAGE_DIR}/libs/${ANDROID_NDK_ABI_NAME}/"
|
||||
COMMAND ${CMAKE_COMMAND} -E copy "${wagic_location}" "${PACKAGE_DIR}/libs/${ANDROID_NDK_ABI_NAME}/"
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/src" "${PACKAGE_DIR}/src"
|
||||
# COMMAND ${ANDROID_EXECUTABLE} --silent update project --path "${PACKAGE_DIR}" --target "android-${ANDROID_NATIVE_API_LEVEL}" --name "${target_name}"
|
||||
COMMAND ${ANDROID_EXECUTABLE} --silent update project --path "${PACKAGE_DIR}" --target "android-10" --name "${target_name}"
|
||||
COMMAND ${ANT_EXECUTABLE} -noinput -k ${android_build_type}
|
||||
COMMAND ${CMAKE_COMMAND} -E touch "${APK_NAME}"
|
||||
WORKING_DIRECTORY "${PACKAGE_DIR}"
|
||||
MAIN_DEPENDENCY "${PACKAGE_DIR}/${ANDROID_MANIFEST_FILE}"
|
||||
DEPENDS
|
||||
"${PACKAGE_DIR}/res/values/strings.xml"
|
||||
"${PACKAGE_DIR}/res/layout/main.xml"
|
||||
"${PACKAGE_DIR}/res/drawable-mdpi/icon.png"
|
||||
"${PACKAGE_DIR}/res/drawable-ldpi/icon.png"
|
||||
"${PACKAGE_DIR}/res/drawable-hdpi/icon.png"
|
||||
"${PACKAGE_DIR}/${ANDROID_MANIFEST_FILE}"
|
||||
wagic
|
||||
)
|
||||
|
||||
install(FILES "${APK_NAME}" DESTINATION "apk/" COMPONENT main)
|
||||
add_custom_target(android_package ALL SOURCES "${APK_NAME}" )
|
||||
add_dependencies(android_package wagic)
|
||||
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 8.5 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 2.8 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 4.4 KiB |
@@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:orientation="vertical"
|
||||
android:id="@+id/mainLayout"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
>
|
||||
<TextView
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Wagic"
|
||||
/>
|
||||
</LinearLayout>
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">Wagic</string>
|
||||
<string name="app_version">0.19.2</string>
|
||||
<string name="info_text">Wagic v0.19.2\\nAll Rights Reserved.</string>
|
||||
</resources>
|
||||
@@ -0,0 +1,174 @@
|
||||
package net.wagic.utils;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Scanner;
|
||||
|
||||
import android.os.Environment;
|
||||
import android.util.Log;
|
||||
|
||||
public class StorageOptions
|
||||
{
|
||||
private static ArrayList<String> mMounts = new ArrayList<String>();
|
||||
private static ArrayList<String> mVold = new ArrayList<String>();
|
||||
|
||||
public static String[] labels;
|
||||
public static String[] paths;
|
||||
public static int count = 0;
|
||||
public static String defaultMountPoint;
|
||||
|
||||
public static void determineStorageOptions()
|
||||
{
|
||||
initializeMountPoints();
|
||||
readMountsFile();
|
||||
readVoldFile();
|
||||
compareMountsWithVold();
|
||||
testAndCleanMountsList();
|
||||
setProperties();
|
||||
}
|
||||
|
||||
private static void initializeMountPoints()
|
||||
{
|
||||
try
|
||||
{
|
||||
defaultMountPoint = Environment.getExternalStorageDirectory().getCanonicalPath();
|
||||
} catch (Exception ioEx)
|
||||
{
|
||||
// an error occurred trying to get the canonical path, use '/mnt/sdcard' instead
|
||||
defaultMountPoint = "/mnt/sdcard";
|
||||
}
|
||||
}
|
||||
|
||||
private static void readMountsFile()
|
||||
{
|
||||
/*
|
||||
* Scan the /proc/mounts file and look for lines like this: /dev/block/vold/179:1 /mnt/sdcard vfat
|
||||
* rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0602,dmask=0602,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
|
||||
*
|
||||
* When one is found, split it into its elements and then pull out the path to the that mount point and add it to the arraylist
|
||||
*/
|
||||
|
||||
try
|
||||
{
|
||||
Scanner scanner = new Scanner(new File("/proc/mounts"));
|
||||
while (scanner.hasNext())
|
||||
{
|
||||
String line = scanner.nextLine();
|
||||
if (line.startsWith("/dev/block/vold/"))
|
||||
{
|
||||
String[] lineElements = line.split(" ");
|
||||
lineElements[1].replaceAll(":.*$", "");
|
||||
mMounts.add(lineElements[1]);
|
||||
}
|
||||
}
|
||||
} catch (FileNotFoundException fnfex)
|
||||
{
|
||||
// if proc/mount doesn't exist we just use
|
||||
Log.i(StorageOptions.class.getCanonicalName(), fnfex.getMessage() + ": assuming " + defaultMountPoint + " is the only mount point");
|
||||
mMounts.add(defaultMountPoint);
|
||||
} catch (Exception e)
|
||||
{
|
||||
Log.e(StorageOptions.class.getCanonicalName(), e.getMessage() + ": unknown exception while reading mounts file");
|
||||
mMounts.add(defaultMountPoint);
|
||||
}
|
||||
}
|
||||
|
||||
private static void readVoldFile()
|
||||
{
|
||||
/*
|
||||
* Scan the /system/etc/vold.fstab file and look for lines like this: dev_mount sdcard /mnt/sdcard 1 /devices/platform/s3c-sdhci.0/mmc_host/mmc0
|
||||
*
|
||||
* When one is found, split it into its elements and then pull out the path to the that mount point and add it to the arraylist
|
||||
*/
|
||||
|
||||
try
|
||||
{
|
||||
Scanner scanner = new Scanner(new File("/system/etc/vold.fstab"));
|
||||
while (scanner.hasNext())
|
||||
{
|
||||
String line = scanner.nextLine();
|
||||
if (line.startsWith("dev_mount"))
|
||||
{
|
||||
String[] lineElements = line.split(" ");
|
||||
lineElements[2] = lineElements[2].replaceAll(":.*$", "");
|
||||
mVold.add(lineElements[2]);
|
||||
}
|
||||
}
|
||||
} catch (FileNotFoundException fnfex)
|
||||
{
|
||||
// if vold.fstab doesn't exist we use the value gathered from the Environment
|
||||
Log.i(StorageOptions.class.getCanonicalName(), fnfex.getMessage() + ": assuming " + defaultMountPoint + " is the only mount point");
|
||||
mMounts.add(defaultMountPoint);
|
||||
} catch (Exception e)
|
||||
{
|
||||
Log.e(StorageOptions.class.getCanonicalName(), e.getMessage() + ": unknown exception while reading mounts file");
|
||||
mMounts.add(defaultMountPoint);
|
||||
}
|
||||
}
|
||||
|
||||
private static void compareMountsWithVold()
|
||||
{
|
||||
/*
|
||||
* Sometimes the two lists of mount points will be different. We only want those mount points that are in both list.
|
||||
*
|
||||
* Compare the two lists together and remove items that are not in both lists.
|
||||
*/
|
||||
|
||||
for (int i = 0; i < mMounts.size(); i++)
|
||||
{
|
||||
String mount = mMounts.get(i);
|
||||
if (!mVold.contains(mount))
|
||||
mMounts.remove(i--);
|
||||
}
|
||||
|
||||
// don't need this anymore, clear the vold list to reduce memory
|
||||
// use and to prepare it for the next time it's needed.
|
||||
mVold.clear();
|
||||
}
|
||||
|
||||
private static void testAndCleanMountsList()
|
||||
{
|
||||
/*
|
||||
* Now that we have a cleaned list of mount paths Test each one to make sure it's a valid and available path. If it is not, remove it from the list.
|
||||
*/
|
||||
|
||||
for (int i = 0; i < mMounts.size(); i++)
|
||||
{
|
||||
String mount = mMounts.get(i);
|
||||
File root = new File(mount);
|
||||
if (!root.exists() || !root.isDirectory() || !root.canWrite())
|
||||
mMounts.remove(i--);
|
||||
}
|
||||
}
|
||||
|
||||
private static void setProperties()
|
||||
{
|
||||
/*
|
||||
* At this point all the paths in the list should be valid. Build the public properties.
|
||||
*/
|
||||
|
||||
ArrayList<String> mLabels = new ArrayList<String>();
|
||||
|
||||
int i = 1;
|
||||
for (String path : mMounts)
|
||||
{ // TODO: /mnt/sdcard is assumed to always mean internal storage. Use this comparison until there is a better way to do this
|
||||
if ("/mnt/sdcard".equalsIgnoreCase(path))
|
||||
mLabels.add("Built-in Storage");
|
||||
else
|
||||
mLabels.add("External SD Card " + i++);
|
||||
}
|
||||
|
||||
labels = new String[mLabels.size()];
|
||||
mLabels.toArray(labels);
|
||||
|
||||
paths = new String[mMounts.size()];
|
||||
mMounts.toArray(paths);
|
||||
|
||||
count = Math.min(labels.length, paths.length);
|
||||
|
||||
// don't need this anymore, clear the mounts list to reduce memory
|
||||
// use and to prepare it for the next time it's needed.
|
||||
mMounts.clear();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,771 @@
|
||||
package org.libsdl.app;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import android.app.*;
|
||||
import android.content.*;
|
||||
import android.view.*;
|
||||
import android.view.inputmethod.BaseInputConnection;
|
||||
import android.view.inputmethod.EditorInfo;
|
||||
import android.view.inputmethod.InputConnection;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
import android.widget.AbsoluteLayout;
|
||||
import android.os.*;
|
||||
import android.util.Log;
|
||||
import android.graphics.*;
|
||||
import android.media.*;
|
||||
import android.hardware.*;
|
||||
|
||||
|
||||
/**
|
||||
SDL Activity
|
||||
*/
|
||||
public class SDLActivity extends Activity {
|
||||
private static final String TAG = "SDL";
|
||||
|
||||
// Keep track of the paused state
|
||||
public static boolean mIsPaused = false, mIsSurfaceReady = false, mHasFocus = true;
|
||||
|
||||
// Main components
|
||||
protected static SDLActivity mSingleton;
|
||||
protected static SDLSurface mSurface;
|
||||
protected static View mTextEdit;
|
||||
protected static ViewGroup mLayout;
|
||||
|
||||
// This is what SDL runs in. It invokes SDL_main(), eventually
|
||||
protected static Thread mSDLThread;
|
||||
|
||||
// Audio
|
||||
protected static Thread mAudioThread;
|
||||
protected static AudioTrack mAudioTrack;
|
||||
|
||||
// Load the .so
|
||||
static {
|
||||
System.loadLibrary("SDL2");
|
||||
//System.loadLibrary("SDL2_image");
|
||||
//System.loadLibrary("SDL2_mixer");
|
||||
//System.loadLibrary("SDL2_net");
|
||||
//System.loadLibrary("SDL2_ttf");
|
||||
System.loadLibrary("wagic");
|
||||
}
|
||||
|
||||
// Setup
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
//Log.v("SDL", "onCreate()");
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
// So we can call stuff from static callbacks
|
||||
mSingleton = this;
|
||||
|
||||
// Set up the surface
|
||||
mSurface = new SDLSurface(getApplication());
|
||||
|
||||
mLayout = new AbsoluteLayout(this);
|
||||
mLayout.addView(mSurface);
|
||||
|
||||
setContentView(mLayout);
|
||||
}
|
||||
|
||||
// Events
|
||||
@Override
|
||||
protected void onPause() {
|
||||
Log.v("SDL", "onPause()");
|
||||
super.onPause();
|
||||
SDLActivity.handlePause();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
Log.v("SDL", "onResume()");
|
||||
super.onResume();
|
||||
SDLActivity.handleResume();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onWindowFocusChanged(boolean hasFocus) {
|
||||
super.onWindowFocusChanged(hasFocus);
|
||||
Log.v("SDL", "onWindowFocusChanged(): " + hasFocus);
|
||||
|
||||
SDLActivity.mHasFocus = hasFocus;
|
||||
if (hasFocus) {
|
||||
SDLActivity.handleResume();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLowMemory() {
|
||||
Log.v("SDL", "onLowMemory()");
|
||||
super.onLowMemory();
|
||||
SDLActivity.nativeLowMemory();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
Log.v("SDL", "onDestroy()");
|
||||
// Send a quit message to the application
|
||||
SDLActivity.nativeQuit();
|
||||
|
||||
// Now wait for the SDL thread to quit
|
||||
if (mSDLThread != null) {
|
||||
try {
|
||||
mSDLThread.join();
|
||||
} catch(Exception e) {
|
||||
Log.v("SDL", "Problem stopping thread: " + e);
|
||||
}
|
||||
mSDLThread = null;
|
||||
|
||||
//Log.v("SDL", "Finished waiting for SDL thread");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean dispatchKeyEvent(KeyEvent event) {
|
||||
int keyCode = event.getKeyCode();
|
||||
// Ignore certain special keys so they're handled by Android
|
||||
if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN ||
|
||||
keyCode == KeyEvent.KEYCODE_VOLUME_UP ||
|
||||
keyCode == KeyEvent.KEYCODE_CAMERA ||
|
||||
keyCode == 168 || /* API 11: KeyEvent.KEYCODE_ZOOM_IN */
|
||||
keyCode == 169 /* API 11: KeyEvent.KEYCODE_ZOOM_OUT */
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
return super.dispatchKeyEvent(event);
|
||||
}
|
||||
|
||||
/** Called by onPause or surfaceDestroyed. Even if surfaceDestroyed
|
||||
* is the first to be called, mIsSurfaceReady should still be set
|
||||
* to 'true' during the call to onPause (in a usual scenario).
|
||||
*/
|
||||
public static void handlePause() {
|
||||
if (!SDLActivity.mIsPaused && SDLActivity.mIsSurfaceReady) {
|
||||
SDLActivity.mIsPaused = true;
|
||||
SDLActivity.nativePause();
|
||||
mSurface.enableSensor(Sensor.TYPE_ACCELEROMETER, false);
|
||||
}
|
||||
}
|
||||
|
||||
/** Called by onResume or surfaceCreated. An actual resume should be done only when the surface is ready.
|
||||
* Note: Some Android variants may send multiple surfaceChanged events, so we don't need to resume
|
||||
* every time we get one of those events, only if it comes after surfaceDestroyed
|
||||
*/
|
||||
public static void handleResume() {
|
||||
if (SDLActivity.mIsPaused && SDLActivity.mIsSurfaceReady && SDLActivity.mHasFocus) {
|
||||
SDLActivity.mIsPaused = false;
|
||||
SDLActivity.nativeResume();
|
||||
mSurface.enableSensor(Sensor.TYPE_ACCELEROMETER, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Messages from the SDLMain thread
|
||||
static final int COMMAND_CHANGE_TITLE = 1;
|
||||
static final int COMMAND_UNUSED = 2;
|
||||
static final int COMMAND_TEXTEDIT_HIDE = 3;
|
||||
|
||||
protected static final int COMMAND_USER = 0x8000;
|
||||
|
||||
/**
|
||||
* This method is called by SDL if SDL did not handle a message itself.
|
||||
* This happens if a received message contains an unsupported command.
|
||||
* Method can be overwritten to handle Messages in a different class.
|
||||
* @param command the command of the message.
|
||||
* @param param the parameter of the message. May be null.
|
||||
* @return if the message was handled in overridden method.
|
||||
*/
|
||||
protected boolean onUnhandledMessage(int command, Object param) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* A Handler class for Messages from native SDL applications.
|
||||
* It uses current Activities as target (e.g. for the title).
|
||||
* static to prevent implicit references to enclosing object.
|
||||
*/
|
||||
protected static class SDLCommandHandler extends Handler {
|
||||
@Override
|
||||
public void handleMessage(Message msg) {
|
||||
Context context = getContext();
|
||||
if (context == null) {
|
||||
Log.e(TAG, "error handling message, getContext() returned null");
|
||||
return;
|
||||
}
|
||||
switch (msg.arg1) {
|
||||
case COMMAND_CHANGE_TITLE:
|
||||
if (context instanceof Activity) {
|
||||
((Activity) context).setTitle((String)msg.obj);
|
||||
} else {
|
||||
Log.e(TAG, "error handling message, getContext() returned no Activity");
|
||||
}
|
||||
break;
|
||||
case COMMAND_TEXTEDIT_HIDE:
|
||||
if (mTextEdit != null) {
|
||||
mTextEdit.setVisibility(View.GONE);
|
||||
|
||||
InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
imm.hideSoftInputFromWindow(mTextEdit.getWindowToken(), 0);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
if ((context instanceof SDLActivity) && !((SDLActivity) context).onUnhandledMessage(msg.arg1, msg.obj)) {
|
||||
Log.e(TAG, "error handling message, command is " + msg.arg1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Handler for the messages
|
||||
Handler commandHandler = new SDLCommandHandler();
|
||||
|
||||
// Send a message from the SDLMain thread
|
||||
boolean sendCommand(int command, Object data) {
|
||||
Message msg = commandHandler.obtainMessage();
|
||||
msg.arg1 = command;
|
||||
msg.obj = data;
|
||||
return commandHandler.sendMessage(msg);
|
||||
}
|
||||
|
||||
// C functions we call
|
||||
public static native void nativeInit();
|
||||
public static native void nativeLowMemory();
|
||||
public static native void nativeQuit();
|
||||
public static native void nativePause();
|
||||
public static native void nativeResume();
|
||||
public static native void onNativeResize(int x, int y, int format);
|
||||
public static native void onNativeKeyDown(int keycode);
|
||||
public static native void onNativeKeyUp(int keycode);
|
||||
public static native void onNativeKeyboardFocusLost();
|
||||
public static native void onNativeTouch(int touchDevId, int pointerFingerId,
|
||||
int action, float x,
|
||||
float y, float p);
|
||||
public static native void onNativeAccel(float x, float y, float z);
|
||||
public static native void onNativeSurfaceChanged();
|
||||
public static native void onNativeSurfaceDestroyed();
|
||||
public static native void nativeFlipBuffers();
|
||||
|
||||
public static void flipBuffers() {
|
||||
SDLActivity.nativeFlipBuffers();
|
||||
}
|
||||
|
||||
public static boolean setActivityTitle(String title) {
|
||||
// Called from SDLMain() thread and can't directly affect the view
|
||||
return mSingleton.sendCommand(COMMAND_CHANGE_TITLE, title);
|
||||
}
|
||||
|
||||
public static boolean sendMessage(int command, int param) {
|
||||
return mSingleton.sendCommand(command, Integer.valueOf(param));
|
||||
}
|
||||
|
||||
public static Context getContext() {
|
||||
return mSingleton;
|
||||
}
|
||||
|
||||
static class ShowTextInputTask implements Runnable {
|
||||
/*
|
||||
* This is used to regulate the pan&scan method to have some offset from
|
||||
* the bottom edge of the input region and the top edge of an input
|
||||
* method (soft keyboard)
|
||||
*/
|
||||
static final int HEIGHT_PADDING = 15;
|
||||
|
||||
public int x, y, w, h;
|
||||
|
||||
public ShowTextInputTask(int x, int y, int w, int h) {
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.w = w;
|
||||
this.h = h;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
AbsoluteLayout.LayoutParams params = new AbsoluteLayout.LayoutParams(
|
||||
w, h + HEIGHT_PADDING, x, y);
|
||||
|
||||
if (mTextEdit == null) {
|
||||
mTextEdit = new DummyEdit(getContext());
|
||||
|
||||
mLayout.addView(mTextEdit, params);
|
||||
} else {
|
||||
mTextEdit.setLayoutParams(params);
|
||||
}
|
||||
|
||||
mTextEdit.setVisibility(View.VISIBLE);
|
||||
mTextEdit.requestFocus();
|
||||
|
||||
InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
imm.showSoftInput(mTextEdit, 0);
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean showTextInput(int x, int y, int w, int h) {
|
||||
// Transfer the task to the main thread as a Runnable
|
||||
return mSingleton.commandHandler.post(new ShowTextInputTask(x, y, w, h));
|
||||
}
|
||||
|
||||
public static Surface getNativeSurface() {
|
||||
return SDLActivity.mSurface.getNativeSurface();
|
||||
}
|
||||
|
||||
// Audio
|
||||
public static int audioInit(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("SDL", "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("SDL", "Failed during initialization of Audio Track");
|
||||
mAudioTrack = null;
|
||||
return -1;
|
||||
}
|
||||
|
||||
mAudioTrack.play();
|
||||
}
|
||||
|
||||
Log.v("SDL", "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;
|
||||
}
|
||||
|
||||
public static void audioWriteShortBuffer(short[] buffer) {
|
||||
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("SDL", "SDL audio: error return from write(short)");
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void audioWriteByteBuffer(byte[] buffer) {
|
||||
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("SDL", "SDL audio: error return from write(byte)");
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void audioQuit() {
|
||||
if (mAudioTrack != null) {
|
||||
mAudioTrack.stop();
|
||||
mAudioTrack = null;
|
||||
}
|
||||
}
|
||||
|
||||
// Input
|
||||
|
||||
/**
|
||||
* @return an array which may be empty but is never null.
|
||||
*/
|
||||
public static int[] inputGetInputDeviceIds(int sources) {
|
||||
int[] ids = InputDevice.getDeviceIds();
|
||||
int[] filtered = new int[ids.length];
|
||||
int used = 0;
|
||||
for (int i = 0; i < ids.length; ++i) {
|
||||
InputDevice device = InputDevice.getDevice(ids[i]);
|
||||
if ((device != null) && ((device.getSources() & sources) != 0)) {
|
||||
filtered[used++] = device.getId();
|
||||
}
|
||||
}
|
||||
return Arrays.copyOf(filtered, used);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Simple nativeInit() runnable
|
||||
*/
|
||||
class SDLMain implements Runnable {
|
||||
@Override
|
||||
public void run() {
|
||||
// Runs SDL_main()
|
||||
SDLActivity.nativeInit();
|
||||
|
||||
//Log.v("SDL", "SDL thread terminated");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
SDLSurface. This is what we draw on, so we need to know when it's created
|
||||
in order to do anything useful.
|
||||
|
||||
Because of this, that's where we set up the SDL thread
|
||||
*/
|
||||
class SDLSurface extends SurfaceView implements SurfaceHolder.Callback,
|
||||
View.OnKeyListener, View.OnTouchListener, SensorEventListener {
|
||||
|
||||
// Sensors
|
||||
protected static SensorManager mSensorManager;
|
||||
protected static Display mDisplay;
|
||||
|
||||
// Keep track of the surface size to normalize touch events
|
||||
protected static float mWidth, mHeight;
|
||||
|
||||
// Startup
|
||||
public SDLSurface(Context context) {
|
||||
super(context);
|
||||
getHolder().addCallback(this);
|
||||
|
||||
setFocusable(true);
|
||||
setFocusableInTouchMode(true);
|
||||
requestFocus();
|
||||
setOnKeyListener(this);
|
||||
setOnTouchListener(this);
|
||||
|
||||
mDisplay = ((WindowManager)context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
|
||||
mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
|
||||
|
||||
// Some arbitrary defaults to avoid a potential division by zero
|
||||
mWidth = 1.0f;
|
||||
mHeight = 1.0f;
|
||||
}
|
||||
|
||||
public Surface getNativeSurface() {
|
||||
return getHolder().getSurface();
|
||||
}
|
||||
|
||||
// Called when we have a valid drawing surface
|
||||
@Override
|
||||
public void surfaceCreated(SurfaceHolder holder) {
|
||||
Log.v("SDL", "surfaceCreated()");
|
||||
holder.setType(SurfaceHolder.SURFACE_TYPE_GPU);
|
||||
}
|
||||
|
||||
// Called when we lose the surface
|
||||
@Override
|
||||
public void surfaceDestroyed(SurfaceHolder holder) {
|
||||
Log.v("SDL", "surfaceDestroyed()");
|
||||
// Call this *before* setting mIsSurfaceReady to 'false'
|
||||
SDLActivity.handlePause();
|
||||
SDLActivity.mIsSurfaceReady = false;
|
||||
SDLActivity.onNativeSurfaceDestroyed();
|
||||
}
|
||||
|
||||
// Called when the surface is resized
|
||||
@Override
|
||||
public void surfaceChanged(SurfaceHolder holder,
|
||||
int format, int width, int height) {
|
||||
Log.v("SDL", "surfaceChanged()");
|
||||
|
||||
int sdlFormat = 0x15151002; // SDL_PIXELFORMAT_RGB565 by default
|
||||
switch (format) {
|
||||
case PixelFormat.A_8:
|
||||
Log.v("SDL", "pixel format A_8");
|
||||
break;
|
||||
case PixelFormat.LA_88:
|
||||
Log.v("SDL", "pixel format LA_88");
|
||||
break;
|
||||
case PixelFormat.L_8:
|
||||
Log.v("SDL", "pixel format L_8");
|
||||
break;
|
||||
case PixelFormat.RGBA_4444:
|
||||
Log.v("SDL", "pixel format RGBA_4444");
|
||||
sdlFormat = 0x15421002; // SDL_PIXELFORMAT_RGBA4444
|
||||
break;
|
||||
case PixelFormat.RGBA_5551:
|
||||
Log.v("SDL", "pixel format RGBA_5551");
|
||||
sdlFormat = 0x15441002; // SDL_PIXELFORMAT_RGBA5551
|
||||
break;
|
||||
case PixelFormat.RGBA_8888:
|
||||
Log.v("SDL", "pixel format RGBA_8888");
|
||||
sdlFormat = 0x16462004; // SDL_PIXELFORMAT_RGBA8888
|
||||
break;
|
||||
case PixelFormat.RGBX_8888:
|
||||
Log.v("SDL", "pixel format RGBX_8888");
|
||||
sdlFormat = 0x16261804; // SDL_PIXELFORMAT_RGBX8888
|
||||
break;
|
||||
case PixelFormat.RGB_332:
|
||||
Log.v("SDL", "pixel format RGB_332");
|
||||
sdlFormat = 0x14110801; // SDL_PIXELFORMAT_RGB332
|
||||
break;
|
||||
case PixelFormat.RGB_565:
|
||||
Log.v("SDL", "pixel format RGB_565");
|
||||
sdlFormat = 0x15151002; // SDL_PIXELFORMAT_RGB565
|
||||
break;
|
||||
case PixelFormat.RGB_888:
|
||||
Log.v("SDL", "pixel format RGB_888");
|
||||
// Not sure this is right, maybe SDL_PIXELFORMAT_RGB24 instead?
|
||||
sdlFormat = 0x16161804; // SDL_PIXELFORMAT_RGB888
|
||||
break;
|
||||
default:
|
||||
Log.v("SDL", "pixel format unknown " + format);
|
||||
break;
|
||||
}
|
||||
|
||||
mWidth = width;
|
||||
mHeight = height;
|
||||
SDLActivity.onNativeResize(width, height, sdlFormat);
|
||||
Log.v("SDL", "Window size:" + width + "x"+height);
|
||||
|
||||
// Set mIsSurfaceReady to 'true' *before* making a call to handleResume
|
||||
SDLActivity.mIsSurfaceReady = true;
|
||||
SDLActivity.onNativeSurfaceChanged();
|
||||
|
||||
|
||||
if (SDLActivity.mSDLThread == null) {
|
||||
// This is the entry point to the C app.
|
||||
// Start up the C app thread and enable sensor input for the first time
|
||||
|
||||
SDLActivity.mSDLThread = new Thread(new SDLMain(), "SDLThread");
|
||||
enableSensor(Sensor.TYPE_ACCELEROMETER, true);
|
||||
SDLActivity.mSDLThread.start();
|
||||
}
|
||||
}
|
||||
|
||||
// unused
|
||||
@Override
|
||||
public void onDraw(Canvas canvas) {}
|
||||
|
||||
|
||||
// Key events
|
||||
@Override
|
||||
public boolean onKey(View v, int keyCode, KeyEvent event) {
|
||||
|
||||
if (event.getAction() == KeyEvent.ACTION_DOWN) {
|
||||
//Log.v("SDL", "key down: " + keyCode);
|
||||
SDLActivity.onNativeKeyDown(keyCode);
|
||||
return true;
|
||||
}
|
||||
else if (event.getAction() == KeyEvent.ACTION_UP) {
|
||||
//Log.v("SDL", "key up: " + keyCode);
|
||||
SDLActivity.onNativeKeyUp(keyCode);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Touch events
|
||||
@Override
|
||||
public boolean onTouch(View v, MotionEvent event) {
|
||||
final int touchDevId = event.getDeviceId();
|
||||
final int pointerCount = event.getPointerCount();
|
||||
// touchId, pointerId, action, x, y, pressure
|
||||
int actionPointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT; /* API 8: event.getActionIndex(); */
|
||||
int pointerFingerId = event.getPointerId(actionPointerIndex);
|
||||
int action = (event.getAction() & MotionEvent.ACTION_MASK); /* API 8: event.getActionMasked(); */
|
||||
|
||||
float x = event.getX(actionPointerIndex) / mWidth;
|
||||
float y = event.getY(actionPointerIndex) / mHeight;
|
||||
float p = event.getPressure(actionPointerIndex);
|
||||
|
||||
if (action == MotionEvent.ACTION_MOVE && pointerCount > 1) {
|
||||
// TODO send motion to every pointer if its position has
|
||||
// changed since prev event.
|
||||
for (int i = 0; i < pointerCount; i++) {
|
||||
pointerFingerId = event.getPointerId(i);
|
||||
x = event.getX(i) / mWidth;
|
||||
y = event.getY(i) / mHeight;
|
||||
p = event.getPressure(i);
|
||||
SDLActivity.onNativeTouch(touchDevId, pointerFingerId, action, x, y, p);
|
||||
}
|
||||
} else {
|
||||
SDLActivity.onNativeTouch(touchDevId, pointerFingerId, action, x, y, p);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// Sensor events
|
||||
public void enableSensor(int sensortype, boolean enabled) {
|
||||
// TODO: This uses getDefaultSensor - what if we have >1 accels?
|
||||
if (enabled) {
|
||||
mSensorManager.registerListener(this,
|
||||
mSensorManager.getDefaultSensor(sensortype),
|
||||
SensorManager.SENSOR_DELAY_GAME, null);
|
||||
} else {
|
||||
mSensorManager.unregisterListener(this,
|
||||
mSensorManager.getDefaultSensor(sensortype));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAccuracyChanged(Sensor sensor, int accuracy) {
|
||||
// TODO
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSensorChanged(SensorEvent event) {
|
||||
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
|
||||
float x, y;
|
||||
switch (mDisplay.getRotation()) {
|
||||
case Surface.ROTATION_90:
|
||||
x = -event.values[1];
|
||||
y = event.values[0];
|
||||
break;
|
||||
case Surface.ROTATION_270:
|
||||
x = event.values[1];
|
||||
y = -event.values[0];
|
||||
break;
|
||||
case Surface.ROTATION_180:
|
||||
x = -event.values[1];
|
||||
y = -event.values[0];
|
||||
break;
|
||||
default:
|
||||
x = event.values[0];
|
||||
y = event.values[1];
|
||||
break;
|
||||
}
|
||||
SDLActivity.onNativeAccel(-x / SensorManager.GRAVITY_EARTH,
|
||||
y / SensorManager.GRAVITY_EARTH,
|
||||
event.values[2] / SensorManager.GRAVITY_EARTH - 1);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* This is a fake invisible editor view that receives the input and defines the
|
||||
* pan&scan region
|
||||
*/
|
||||
class DummyEdit extends View implements View.OnKeyListener {
|
||||
InputConnection ic;
|
||||
|
||||
public DummyEdit(Context context) {
|
||||
super(context);
|
||||
setFocusableInTouchMode(true);
|
||||
setFocusable(true);
|
||||
setOnKeyListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCheckIsTextEditor() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onKey(View v, int keyCode, KeyEvent event) {
|
||||
|
||||
// This handles the hardware keyboard input
|
||||
if (event.isPrintingKey()) {
|
||||
if (event.getAction() == KeyEvent.ACTION_DOWN) {
|
||||
ic.commitText(String.valueOf((char) event.getUnicodeChar()), 1);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
if (event.getAction() == KeyEvent.ACTION_DOWN) {
|
||||
SDLActivity.onNativeKeyDown(keyCode);
|
||||
return true;
|
||||
} else if (event.getAction() == KeyEvent.ACTION_UP) {
|
||||
SDLActivity.onNativeKeyUp(keyCode);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
//
|
||||
@Override
|
||||
public boolean onKeyPreIme (int keyCode, KeyEvent event) {
|
||||
// As seen on StackOverflow: http://stackoverflow.com/questions/7634346/keyboard-hide-event
|
||||
// FIXME: Discussion at http://bugzilla.libsdl.org/show_bug.cgi?id=1639
|
||||
// FIXME: This is not a 100% effective solution to the problem of detecting if the keyboard is showing or not
|
||||
// FIXME: A more effective solution would be to change our Layout from AbsoluteLayout to Relative or Linear
|
||||
// FIXME: And determine the keyboard presence doing this: http://stackoverflow.com/questions/2150078/how-to-check-visibility-of-software-keyboard-in-android
|
||||
// FIXME: An even more effective way would be if Android provided this out of the box, but where would the fun be in that :)
|
||||
if (event.getAction()==KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) {
|
||||
if (SDLActivity.mTextEdit != null && SDLActivity.mTextEdit.getVisibility() == View.VISIBLE) {
|
||||
SDLActivity.onNativeKeyboardFocusLost();
|
||||
}
|
||||
}
|
||||
return super.onKeyPreIme(keyCode, event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
|
||||
ic = new SDLInputConnection(this, true);
|
||||
|
||||
outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_EXTRACT_UI
|
||||
| 33554432 /* API 11: EditorInfo.IME_FLAG_NO_FULLSCREEN */;
|
||||
|
||||
return ic;
|
||||
}
|
||||
}
|
||||
|
||||
class SDLInputConnection extends BaseInputConnection {
|
||||
|
||||
public SDLInputConnection(View targetView, boolean fullEditor) {
|
||||
super(targetView, fullEditor);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean sendKeyEvent(KeyEvent event) {
|
||||
|
||||
/*
|
||||
* This handles the keycodes from soft keyboard (and IME-translated
|
||||
* input from hardkeyboard)
|
||||
*/
|
||||
int keyCode = event.getKeyCode();
|
||||
if (event.getAction() == KeyEvent.ACTION_DOWN) {
|
||||
if (event.isPrintingKey()) {
|
||||
commitText(String.valueOf((char) event.getUnicodeChar()), 1);
|
||||
}
|
||||
SDLActivity.onNativeKeyDown(keyCode);
|
||||
return true;
|
||||
} else if (event.getAction() == KeyEvent.ACTION_UP) {
|
||||
|
||||
SDLActivity.onNativeKeyUp(keyCode);
|
||||
return true;
|
||||
}
|
||||
return super.sendKeyEvent(event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean commitText(CharSequence text, int newCursorPosition) {
|
||||
|
||||
nativeCommitText(text.toString(), newCursorPosition);
|
||||
|
||||
return super.commitText(text, newCursorPosition);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean setComposingText(CharSequence text, int newCursorPosition) {
|
||||
|
||||
nativeSetComposingText(text.toString(), newCursorPosition);
|
||||
|
||||
return super.setComposingText(text, newCursorPosition);
|
||||
}
|
||||
|
||||
public native void nativeCommitText(String text, int newCursorPosition);
|
||||
|
||||
public native void nativeSetComposingText(String text, int newCursorPosition);
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
set(CMAKE_CXX_FLAGS "-s USE_SDL=2 -s USE_ZLIB=1 -s FULL_ES2=1 -std=c++11 -s TOTAL_MEMORY=16777216 -O0 --preload-file ../../../projects/mtg/bin/Res@/")
|
||||
#set(CMAKE_CXX_FLAGS "-s USE_SDL=2 -s FULL_ES2=1 -std=c++11 -g4 -s ALLOW_MEMORY_GROWTH=1 --preload-file ../../../projects/mtg/bin/Res@/")
|
||||
set(CMAKE_EXECUTABLE_SUFFIX ".html")
|
||||
add_definitions(-DLINUX)
|
||||
add_definitions(-D_DEBUG)
|
||||
add_definitions(-DUSERDIR=".wagic")
|
||||
add_definitions(-DRESDIR="/")
|
||||
add_definitions(-DGL_ES_VERSION_2_0)
|
||||
@@ -0,0 +1,5 @@
|
||||
add_definitions(-DLINUX)
|
||||
add_definitions(-DUSERDIR=".wagic")
|
||||
add_definitions(-DRESDIR="Res")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++ -std=c++0x")
|
||||
set(CMAKE_PREFIX_PATH "/usr/local/opt/qt5")
|
||||
@@ -0,0 +1,5 @@
|
||||
add_definitions(-DPSP -G0)
|
||||
add_definitions(-D_PSP_FW_VERSION=371)
|
||||
add_definitions(-DDEVHOOK -DPSPFW3XX)
|
||||
|
||||
include_directories(${PSPSDK_PATH}/include)
|
||||
@@ -0,0 +1,4 @@
|
||||
add_definitions(-DLINUX)
|
||||
add_definitions(-DUSERDIR=".wagic")
|
||||
add_definitions(-DRESDIR="Res")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
|
||||
@@ -0,0 +1,3 @@
|
||||
add_definitions(-DWIN32)
|
||||
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_DEBUG")
|
||||
@@ -0,0 +1,244 @@
|
||||
#MTGs common sources
|
||||
set(MTG_generic_src
|
||||
src/AbilityParser.cpp
|
||||
src/ActionElement.cpp
|
||||
src/ActionLayer.cpp
|
||||
src/ActionStack.cpp
|
||||
src/AIHints.cpp
|
||||
src/AIMomirPlayer.cpp
|
||||
src/AIPlayer.cpp
|
||||
src/AIPlayerBaka.cpp
|
||||
src/AIStats.cpp
|
||||
src/AllAbilities.cpp
|
||||
src/CardDescriptor.cpp
|
||||
src/CardDisplay.cpp
|
||||
src/CardGui.cpp
|
||||
src/CardPrimitive.cpp
|
||||
src/CardSelector.cpp
|
||||
src/CardSelectorSingleton.cpp
|
||||
src/CarouselDeckView.cpp
|
||||
src/Closest.cpp
|
||||
src/Counters.cpp
|
||||
src/Credits.cpp
|
||||
src/Damage.cpp
|
||||
src/DamagerDamaged.cpp
|
||||
src/DeckDataWrapper.cpp
|
||||
src/DeckEditorMenu.cpp
|
||||
src/DeckManager.cpp
|
||||
src/DeckMenu.cpp
|
||||
src/DeckMenuItem.cpp
|
||||
src/DeckMetaData.cpp
|
||||
src/DeckStats.cpp
|
||||
src/DeckView.cpp
|
||||
src/DuelLayers.cpp
|
||||
src/ExtraCost.cpp
|
||||
src/GameApp.cpp
|
||||
src/GameLauncher.cpp
|
||||
src/GameObserver.cpp
|
||||
src/GameOptions.cpp
|
||||
src/GameStateAwards.cpp
|
||||
src/GameState.cpp
|
||||
src/GameStateDeckViewer.cpp
|
||||
src/GameStateDuel.cpp
|
||||
src/GameStateMenu.cpp
|
||||
src/GameStateOptions.cpp
|
||||
src/GameStateShop.cpp
|
||||
src/GameStateStory.cpp
|
||||
src/GameStateTransitions.cpp
|
||||
src/GridDeckView.cpp
|
||||
src/GuiAvatars.cpp
|
||||
src/GuiBackground.cpp
|
||||
src/GuiCardsController.cpp
|
||||
src/GuiCombat.cpp
|
||||
src/GuiFrame.cpp
|
||||
src/GuiHand.cpp
|
||||
src/GuiLayers.cpp
|
||||
src/GuiMana.cpp
|
||||
src/GuiPhaseBar.cpp
|
||||
src/GuiPlay.cpp
|
||||
src/GuiStatic.cpp
|
||||
src/IconButton.cpp
|
||||
src/InteractiveButton.cpp
|
||||
src/ManaCost.cpp
|
||||
src/ManaCostHybrid.cpp
|
||||
src/MenuItem.cpp
|
||||
src/ModRules.cpp
|
||||
src/MTGAbility.cpp
|
||||
src/MTGCard.cpp
|
||||
src/MTGCardInstance.cpp
|
||||
src/MTGDeck.cpp
|
||||
src/MTGDefinitions.cpp
|
||||
src/MTGGamePhase.cpp
|
||||
src/MTGGameZones.cpp
|
||||
src/MTGPack.cpp
|
||||
src/MTGRules.cpp
|
||||
src/ObjectAnalytics.cpp
|
||||
src/OptionItem.cpp
|
||||
src/PhaseRing.cpp
|
||||
src/Player.cpp
|
||||
src/PlayerData.cpp
|
||||
src/PlayGuiObject.cpp
|
||||
src/PlayGuiObjectController.cpp
|
||||
src/PlayRestrictions.cpp
|
||||
src/Pos.cpp
|
||||
src/PriceList.cpp
|
||||
src/ReplacementEffects.cpp
|
||||
src/Rules.cpp
|
||||
src/SimpleMenu.cpp
|
||||
src/SimpleMenuItem.cpp
|
||||
src/SimpleButton.cpp
|
||||
src/SimplePad.cpp
|
||||
src/SimplePopup.cpp
|
||||
src/StoryFlow.cpp
|
||||
src/Subtypes.cpp
|
||||
src/StyleManager.cpp
|
||||
src/TargetChooser.cpp
|
||||
src/TargetsList.cpp
|
||||
src/Tasks.cpp
|
||||
src/TextScroller.cpp
|
||||
src/ThisDescriptor.cpp
|
||||
src/Token.cpp
|
||||
src/Translate.cpp
|
||||
src/TranslateKeys.cpp
|
||||
src/Trash.cpp
|
||||
src/utils.cpp
|
||||
src/WCachedResource.cpp
|
||||
src/WDataSrc.cpp
|
||||
src/WEvent.cpp
|
||||
src/WFilter.cpp
|
||||
src/WFont.cpp
|
||||
src/WGui.cpp
|
||||
src/WResourceManager.cpp
|
||||
src/WParsedInt.cpp
|
||||
)
|
||||
|
||||
set(MTG_network_src src/NetworkPlayer.cpp)
|
||||
|
||||
#the sources we need if we compile a graphical qt version
|
||||
#TODO: add declarative version since this only works with QWidget right now
|
||||
set(MTG_qt_graphic_src
|
||||
src/qt/filedownloader.cpp
|
||||
src/qt/corewrapper.cpp
|
||||
include/qt/corewrapper.h #so automoc finds it
|
||||
include/qt/filedownloader.h
|
||||
src/Qtmain.cpp)
|
||||
|
||||
#the sources we need to compile the testsuit
|
||||
set(MTG_qt_console_src
|
||||
src/Qtconsole.cpp
|
||||
src/TestSuiteAI.cpp)
|
||||
|
||||
set(MTG_sdl_src
|
||||
src/SDLmain.cpp)
|
||||
|
||||
set(MTG_android_sdl_src
|
||||
src/SDLmain.cpp)
|
||||
|
||||
set(MTG_iOS_src
|
||||
iOS/UI/WagicDownloadProgressViewController.m
|
||||
iOS/asi-http-request/ASIAuthenticationDialog.m
|
||||
iOS/asi-http-request/ASIDataCompressor.m
|
||||
iOS/asi-http-request/ASIDataDecompressor.m
|
||||
iOS/asi-http-request/ASIDownloadCache.m
|
||||
iOS/asi-http-request/ASIFormDataRequest.m
|
||||
iOS/asi-http-request/ASIHTTPRequest.m
|
||||
iOS/asi-http-request/ASIInputStream.m
|
||||
iOS/asi-http-request/ASINetworkQueue.m
|
||||
iOS/SoundManager/SoundManager.m
|
||||
iOS/SoundManager/MyOpenALSupport.c
|
||||
iOS/Reachability/Reachability/Reachability.m
|
||||
iOS/ZipArchive/ZipArchive.mm)
|
||||
|
||||
|
||||
set(MTG_iOS_INCLUDE_DIRS iOS/UI iOS/Reachability/Reachability iOS/asi-http-request iOS/ZipArchive iOS/SoundManager)
|
||||
|
||||
set(MTG_INCLUDE_DIRS include include/qt)
|
||||
set(JGE_INCLUDE_DIRS ../../JGE/include ../../JGE/include/hge)
|
||||
set(JGE_LIBRARY jge)
|
||||
set(EXTRA_INCLUDE_DIR extra)
|
||||
|
||||
#turn moc on
|
||||
if(backend_qt_console OR backend_qt_widget)
|
||||
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||
set(CMAKE_AUTOMOC TRUE)
|
||||
endif()
|
||||
|
||||
if(backend_qt_console)
|
||||
if(UNIX AND NOT ANDROID)
|
||||
include_directories(${MTG_INCLUDE_DIRS} ${JGE_INCLUDE_DIRS} ${ZIPFS_INCLUDE_DIR} ${Qt5Core_INCLUDE_DIRS} ${Qt5Multimedia_INCLUDE_DIRS}
|
||||
${UNZIP_INCLUDE_DIR} ${HGE_INCLUDE_DIR} ${TINYXML_INCLUDE_DIR} ${QT_MKSPECS_DIR}/default)
|
||||
add_executable(wagic ${MTG_generic_src} ${MTG_qt_console_src} ${MTG_network_src})
|
||||
target_link_libraries(wagic ${JGE_LIBRARY} ${Qt5Core_INCLUDE_DIRS} ${Qt5Multimedia_INCLUDE_DIRS} ${TINYXML_LIBRARIES}
|
||||
${HGE_LIBRARY} ${ZLIB_LIBRARIES})
|
||||
else()
|
||||
message(FATAL_ERROR "qt-console builds are only supported on unix platforms")
|
||||
endif()
|
||||
elseif(backend_qt_widget)
|
||||
if(UNIX AND NOT ANDROID)
|
||||
include_directories(${MTG_INCLUDE_DIRS} ${JGE_INCLUDE_DIRS} ${ZIPFS_INCLUDE_DIR} ${Qt5Core_INCLUDE_DIRS} ${Qt5Multimedia_INCLUDE_DIRS}
|
||||
${UNZIP_INCLUDE_DIR} ${HGE_INCLUDE_DIR} ${TINYXML_INCLUDE_DIR} ${QT_MKSPECS_DIR}/default)
|
||||
add_executable(wagic ${MTG_generic_src} ${MTG_qt_graphic_src} ${MTG_network_src})
|
||||
target_link_libraries(wagic ${JGE_LIBRARY} ${Qt5Core_INCLUDE_DIRS} ${Qt5Multimedia_INCLUDE_DIRS} ${OPENGL_LIBRARIES} ${TINYXML_LIBRARIES}
|
||||
${HGE_LIBRARY} ${ZLIB_LIBRARIES})# ${X11_LIBRARIES})
|
||||
else()
|
||||
message(FATAL_ERROR "qt-widget builds are only supported on unix platforms")
|
||||
endif()
|
||||
elseif(backend_sdl)
|
||||
if((UNIX OR EMSCRIPTEN) AND NOT ANDROID)
|
||||
include_directories(${MTG_INCLUDE_DIRS} ${JGE_INCLUDE_DIRS} ${SDL2_INCLUDE_DIR} ${ZIPFS_INCLUDE_DIR} ${UNZIP_INCLUDE_DIR} ${HGE_INCLUDE_DIR} ${TINYXML_INCLUDE_DIR} ${ZLIB_INCLUDE_DIRS})
|
||||
add_executable(wagic ${MTG_generic_src} ${MTG_sdl_src} ${MTG_network_src} src/TestSuiteAI.cpp src/AIPlayerBakaB.cpp)
|
||||
target_link_libraries(wagic ${JGE_LIBRARY} ${SDL2_LIBRARY} ${OPENGL_LIBRARIES} ${TINYXML_LIBRARIES} ${HGE_LIBRARY} ${ZLIB_LIBRARIES})
|
||||
elseif(ANDROID)
|
||||
include_directories(${MTG_INCLUDE_DIRS} ${JGE_INCLUDE_DIRS} ${SDL2_INCLUDE_DIR} ${ZIPFS_INCLUDE_DIR} ${BOOST_INCLUDE_DIRS} ${UNZIP_INCLUDE_DIR} ${HGE_INCLUDE_DIR} ${TINYXML_INCLUDE_DIR})
|
||||
#we should try to get rid of this hack
|
||||
add_library(wagic SHARED ${MTG_generic_src} ${MTG_network_src} ${MTG_android_sdl_src} src/TestSuiteAI.cpp)
|
||||
target_link_libraries(wagic ${JGE_LIBRARY} ${SDL2_LIBRARY} ${OPENGL_LIBRARIES} ${TINYXML_LIBRARIES} ${HGE_LIBRARY} ${ZLIB_LIBRARIES})
|
||||
elseif(WIN32)
|
||||
include_directories(${EXTRA_INCLUDE_DIR} ${MTG_INCLUDE_DIRS} ${JGE_INCLUDE_DIRS} ${SDL2_INCLUDE_DIR} ${ZIPFS_INCLUDE_DIR}
|
||||
${Boost_INCLUDE_DIRS} ${UNZIP_INCLUDE_DIR} ${HGE_INCLUDE_DIR} ${TINYXML_INCLUDE_DIR} ${ZLIB_INCLUDE_DIRS})
|
||||
add_executable(wagic ${MTG_generic_src} ${MTG_sdl_src} src/TestSuiteAI.cpp src/AIPlayerBakaB.cpp)
|
||||
link_directories(${Boost_LIBRARY_DIR} ${SDL2_LIBRARY_DIR})
|
||||
target_link_libraries(wagic PRIVATE
|
||||
${JGE_LIBRARY}
|
||||
${PNG_LIBRARIES} # Explicitly link libpng
|
||||
${ZIPFS_LIBRARY} # Explicitly link libzipFS
|
||||
${SDL2_LIBRARY}
|
||||
${OPENGL_LIBRARIES}
|
||||
${TINYXML_LIBRARIES}
|
||||
${HGE_LIBRARY}
|
||||
${BOOST_date_time}
|
||||
${ZLIB_LIBRARIES} # Ensure zlib is linked
|
||||
)
|
||||
endif()
|
||||
elseif(backend_psp)
|
||||
if(PSP)
|
||||
#${PSPSDK_PATH}/include
|
||||
include_directories(${MTG_INCLUDE_DIRS} ${JGE_INCLUDE_DIRS} ${TINYXML_INCLUDE_DIR} ${ZIPFS_INCLUDE_DIR}
|
||||
${UNZIP_INCLUDE_DIR} ${BOOST_INCLUDE_DIRS} ${GIF_INCLUDE_DIR} ${HGETOOLS_INCLUDE_DIRS})
|
||||
add_executable(wagic ${MTG_generic_src} ${MTG_network_src})
|
||||
target_link_libraries(wagic ${JGE_LIBRARY} ${PSPSDK_LIB} ${HGETOOLS_LIBRARY} ${FREETYPE_LIB} ${JPEG_LIBRARY}
|
||||
${GIF_LIBRARIES} ${PNG_LIBRARIES} z m ${MIKMOD_LIBRARY} ${TINYXML_LIBRARIES}
|
||||
stdc++ ${PSPSDK_REQUIRED_LIB})
|
||||
|
||||
set(PRXSPECS_FILE "${PSPSDK_PATH}/lib/prxspecs")
|
||||
set(LINKFILE_FILE "${PSPSDK_PATH}/lib/linkfile.prx")
|
||||
|
||||
get_property(wagic_elf_location TARGET wagic PROPERTY LOCATION)
|
||||
get_filename_component(wagic_elf_directory ${wagic_elf_location} PATH)
|
||||
|
||||
set_target_properties(wagic PROPERTIES LINK_FLAGS "-specs=${PRXSPECS_FILE} -Wl,-q,-T${LINKFILE_FILE}")
|
||||
|
||||
add_custom_command(TARGET wagic POST_BUILD
|
||||
COMMAND ${PSPSDK_MKSFO_COMMAND} ARGS "'Wagic, the Homebrew?!'" "${wagic_elf_directory}/PARAM.SFO"
|
||||
COMMAND ${PSPSDK_FIXUP_IMPORTS_COMMAND} ARGS ${wagic_elf_location}
|
||||
COMMAND ${PSPSDK_PRXGEN_COMMAND} ARGS ${wagic_elf_location} "${wagic_elf_directory}/wagic.prx"
|
||||
COMMAND ${PSPSDK_PACK_PBP_COMMAND} ARGS ${wagic_elf_directory}/EBOOT.PBP ${wagic_elf_directory}/PARAM.SFO ${CMAKE_CURRENT_SOURCE_DIR}/icon.png NULL ${CMAKE_CURRENT_SOURCE_DIR}/pic0.png ${CMAKE_CURRENT_SOURCE_DIR}/pic1.png NULL "${wagic_elf_directory}/wagic.prx" NULL)
|
||||
else()
|
||||
message(FATAL_ERROR "use the cross-compile toolchain to build as the psp target")
|
||||
endif()
|
||||
endif()
|
||||
if(IOS)
|
||||
set(MTG_generic_src ${MTG_generic_src} ${MTG_iOS_src} PARENT_SCOPE)
|
||||
set(MTG_INCLUDE_DIRS ${MTG_INCLUDE_DIRS} ${MTG_iOS_INCLUDE_DIRS} PARENT_SCOPE)
|
||||
|
||||
endif()
|
||||
+369
-1925
File diff suppressed because it is too large
Load Diff
@@ -1,38 +1,63 @@
|
||||
#NAME:Nightmare
|
||||
#DESC:'All evil is as a nightmare'
|
||||
#DESC:Thomas Carlyle
|
||||
#DESC:
|
||||
#DESC:Win matches to unlock more
|
||||
#DESC:opponents, sets and game modes
|
||||
Air Elemental (RV) (*) * 2
|
||||
Animate Dead (RV) (*) * 2
|
||||
Bad Moon (RV) (*) * 2
|
||||
Bog Wraith (RV) (*) * 2
|
||||
Cursed Land (RV) (*) * 1
|
||||
El-Hajjaj (RV) (*) * 2
|
||||
Fear (RV) (*) * 1
|
||||
Hypnotic Specter (RV) (*) * 2
|
||||
# RV Islands
|
||||
1392
|
||||
1392
|
||||
1392
|
||||
1392
|
||||
1393
|
||||
1393
|
||||
1393
|
||||
1393
|
||||
1394
|
||||
1394
|
||||
1394
|
||||
1394
|
||||
Lifetap (RV) (*) * 2
|
||||
Lord of Atlantis (RV) (*) * 2
|
||||
Mahamoti Djinn (RV) (*) * 2
|
||||
Merfolk of the Pearl Trident (RV) (*) * 4
|
||||
Nightmare (RV) (*) * 4
|
||||
Obsianus Golem (RV) (*) * 2
|
||||
Scathe Zombies (RV) (*) * 3
|
||||
# RV Islands
|
||||
#DESC:I had a terrible Nightmare once
|
||||
#DESC:and then a second
|
||||
#DESC:and a third
|
||||
#DESC:and then I won.
|
||||
#2x Obsianus Golem
|
||||
1129
|
||||
1129
|
||||
#2x animate dead
|
||||
1143
|
||||
1143
|
||||
#2x Bad Moon
|
||||
1144
|
||||
1144
|
||||
#2x Bog Wraith
|
||||
1146
|
||||
1146
|
||||
#1x Cursed Land
|
||||
1148
|
||||
#1x Fear
|
||||
1161
|
||||
#2x El-Hajjâj
|
||||
1158
|
||||
1158
|
||||
#2x Hypnotic Specter
|
||||
1165
|
||||
1165
|
||||
#4x Nightmare
|
||||
1170
|
||||
1170
|
||||
1170
|
||||
1170
|
||||
#3x Scathe Zombie
|
||||
1177
|
||||
1177
|
||||
1177
|
||||
#1x Unholy Strength
|
||||
1183
|
||||
#1x Wall of Bone
|
||||
1184
|
||||
#1x Zombie Master
|
||||
1188
|
||||
#2x Air Elemental
|
||||
1189
|
||||
1189
|
||||
#2x Lifetap
|
||||
1205
|
||||
1205
|
||||
#2x Lord of Atlantis
|
||||
1206
|
||||
1206
|
||||
#2x Mahamoti Djinn
|
||||
1208
|
||||
1208
|
||||
#4x Merfolk of the Pearl Trident
|
||||
1210
|
||||
1210
|
||||
1210
|
||||
1210
|
||||
# Swamp (RV)
|
||||
1373
|
||||
1373
|
||||
1373
|
||||
@@ -45,6 +70,16 @@ Scathe Zombies (RV) (*) * 3
|
||||
1375
|
||||
1375
|
||||
1375
|
||||
Unholy Strength (RV)(*) * 1
|
||||
Wall of Bone (RV) (*) * 1
|
||||
Zombie Master (RV) (*) * 1
|
||||
# Island (RV)
|
||||
1392
|
||||
1392
|
||||
1392
|
||||
1392
|
||||
1393
|
||||
1393
|
||||
1393
|
||||
1393
|
||||
1394
|
||||
1394
|
||||
1394
|
||||
1394
|
||||
|
||||
@@ -1,24 +1,30 @@
|
||||
#NAME:Howlings
|
||||
#DESC:'What the howling deep down
|
||||
#DESC:there conceals, no blessed
|
||||
#DESC:living soul can tell'
|
||||
#DESC:Friedrich Schiller
|
||||
#DESC:
|
||||
#DESC:Win matches to unlock more
|
||||
#DESC:opponents, sets and game modes
|
||||
Black Vise (MPS) * 4
|
||||
#DESC:Supported by elemental rage
|
||||
#DESC:goblins descend from the mountains
|
||||
#DESC:to conquer the lands below.
|
||||
|
||||
# (PSY) added 2 Mountains, 1 Black Vise, 1 Howling Mine
|
||||
# (would've been better to add creatures, but all creatures in the
|
||||
# deck were already at 4 pieces))
|
||||
|
||||
# Land(s)
|
||||
Mountain (8ED) * 20
|
||||
|
||||
# Creature(s)
|
||||
Goblin King (8ED) * 4
|
||||
Goblin Mountaineer (9ED) * 4
|
||||
Goblin Piker (9ED) * 4
|
||||
Goblin Striker (MRD) * 4
|
||||
Hearthfire Hobgoblin (EVE) * 4
|
||||
Howling Mine (8ED) * 3
|
||||
Lightning Bolt (M10) * 4
|
||||
Mountain (10E) * 4
|
||||
Mountain (7ED) * 4
|
||||
Mountain (8ED) * 4
|
||||
Mountain (9ED) * 4
|
||||
Mountain (M10) * 4
|
||||
Raging Goblin (8ED) * 4
|
||||
Spark Elemental (5DN) * 4
|
||||
|
||||
# Artifact(s)
|
||||
Black Vise (V10) * 4
|
||||
Howling Mine (8ED) * 3
|
||||
|
||||
# Instant(s)
|
||||
Lightning Bolt (M10) * 4
|
||||
|
||||
# Sorcery(s)
|
||||
Wheel of Fortune (VMA) * 1
|
||||
@@ -1,17 +1,66 @@
|
||||
#NAME:Taiga
|
||||
#DESC:Beware the fires deep in
|
||||
#DESC:the boreal forest
|
||||
#DESC:The forces of fire and nature unite.
|
||||
#DESC:
|
||||
#DESC:Win matches to unlock more
|
||||
#DESC:opponents, sets and game modes
|
||||
Cockatrice (RV) (*) * 2
|
||||
Craw Wurm (RV) (*) * 3
|
||||
Earth Elemental (RV) (*) * 2
|
||||
Elvish Archers (RV) (*) * 2
|
||||
Firebreathing (RV) (*) * 1
|
||||
Fire Elemental (RV) (*) * 2
|
||||
Flashfires (RV) (*) * 2
|
||||
# RV Forests
|
||||
#DESC:Can you withstand
|
||||
#DESC:their combined fervor?
|
||||
#2x Cockatrice
|
||||
1238
|
||||
1238
|
||||
#3x Craw Wurm
|
||||
1239
|
||||
1239
|
||||
1239
|
||||
#2x Elvish Archers
|
||||
1242
|
||||
1242
|
||||
#2x Giant Spider
|
||||
1249
|
||||
1249
|
||||
#2x Grizzly Bears
|
||||
1250
|
||||
1250
|
||||
#2x Scryb Sprites
|
||||
1264
|
||||
1264
|
||||
#2x Shanodin Dryads
|
||||
1265
|
||||
1265
|
||||
#1x Tranquility
|
||||
1270
|
||||
#1x Tsunami
|
||||
1271
|
||||
#2x Earth Elemental
|
||||
1287
|
||||
1287
|
||||
#2x Fire Elemental
|
||||
1290
|
||||
1290
|
||||
#1x Flashfires
|
||||
1293
|
||||
#3x Goblin King
|
||||
1296
|
||||
1296
|
||||
1296
|
||||
#2x Hill Giant
|
||||
1299
|
||||
1299
|
||||
#4x Mons's Goblin Raiders
|
||||
1308
|
||||
1308
|
||||
1308
|
||||
1308
|
||||
#2x Orcish Oriflamme
|
||||
1310
|
||||
1310
|
||||
1310
|
||||
# (PSY) Power Surge not available any more, replaced with a third Orcish Oriflamme
|
||||
#1x Power Surge
|
||||
#1311
|
||||
#1x Wheel of Fortune
|
||||
1326
|
||||
#1x White Ward
|
||||
1371
|
||||
#Forest (RV)
|
||||
1386
|
||||
1386
|
||||
1386
|
||||
@@ -24,12 +73,7 @@ Flashfires (RV) (*) * 2
|
||||
1388
|
||||
1388
|
||||
1388
|
||||
Giant Spider (RV) (*) * 2
|
||||
Goblin King (RV) (*) * 3
|
||||
Grizzly Bears (RV) (*) * 2
|
||||
Hill Giant (RV) (*) * 2
|
||||
Mons's Goblin Raiders (RV) (*) * 4
|
||||
# RV Mountains
|
||||
#Mountain
|
||||
1389
|
||||
1389
|
||||
1389
|
||||
@@ -42,9 +86,3 @@ Mons's Goblin Raiders (RV) (*) * 4
|
||||
1391
|
||||
1391
|
||||
1391
|
||||
Orcish Oriflamme (RV) (*) * 2
|
||||
Scryb Sprites (RV) (*) * 2
|
||||
Shanodin Dryads (RV) (*) * 2
|
||||
Tranquility (RV) (*) * 1
|
||||
Tsunami (RV) (*) * 1
|
||||
Wheel of Fortune (RV) (*) * 1
|
||||
|
||||
@@ -1,33 +1,39 @@
|
||||
#NAME:Savannah
|
||||
#DESC:Beasts stalk their prey
|
||||
#DESC:among the tall grasses
|
||||
#DESC:
|
||||
#DESC:
|
||||
#DESC:Win matches to unlock more
|
||||
#DESC:opponents, sets and game modes
|
||||
Armageddon (VMA) * 1
|
||||
Black Vise (V10) * 2
|
||||
Builder's Blessing (AVR) * 2
|
||||
#DESC:United against the terrible
|
||||
#DESC:Phyrexian Fate,
|
||||
#DESC:there is no time for dispute
|
||||
#DESC:or rivalries
|
||||
#DESC:in Eladamri and Gerrard's army
|
||||
# (PSY) 2x Benalish Hero not available any more, removed (deck has still >60 cards)
|
||||
# (PSY) 2x Mesa Pegasus not available any more, removed (deck has still >60 cards)
|
||||
|
||||
# Land(s)
|
||||
Forest (8ED) * 13
|
||||
Plains (8ED) * 9
|
||||
|
||||
# Creature(s)
|
||||
Cockatrice (TSB) * 2
|
||||
Craw Wurm (9ED) * 2
|
||||
Crusade (DDF) * 2
|
||||
Forest (8ED) * 4
|
||||
Forest (9ED) * 4
|
||||
Forest (MRD) * 1
|
||||
Forest (ONS) * 4
|
||||
Giant Spider (AKH) * 2
|
||||
Grizzly Bears (8ED) * 2
|
||||
Jukai Messenger (CHK) * 4
|
||||
Kessig Recluse (DKA) * 2
|
||||
Living Lands (ME4) * 1
|
||||
Plains (8ED) * 4
|
||||
Plains (9ED) * 1
|
||||
Plains (ONS) * 4
|
||||
Rhox Charger (ALA) * 1
|
||||
Spitting Spider (8ED) * 2
|
||||
Ronom Unicorn (CSP) * 2
|
||||
Savannah Lions (A25) * 2
|
||||
Scute Mob (ZEN) * 3
|
||||
Serra Angel (M13) * 2
|
||||
Spitting Spider (8ED) * 2
|
||||
Jukai Messenger (CHK) * 4
|
||||
Kessig Recluse (DKA) * 2
|
||||
Rhox Charger (ALA) * 1
|
||||
|
||||
# Artifact(s)
|
||||
Black Vise (V10) * 2
|
||||
The Rack (DPA) * 2
|
||||
|
||||
# Enchantment(s)
|
||||
Builder's Blessing (AVR) * 2
|
||||
Crusade (DDF) * 2
|
||||
Living Lands (ME4) * 1
|
||||
|
||||
# Sorcery(s)
|
||||
Armageddon (VMA) * 1
|
||||
Wrath of God (8ED) * 2
|
||||
|
||||
@@ -1,23 +1,64 @@
|
||||
#NAME:Plateau
|
||||
#DESC:There are no hiding places
|
||||
#DESC:on the high steppes beyond
|
||||
#DESC:the mountain passes
|
||||
#DESC:
|
||||
#DESC:Win matches to unlock more
|
||||
#DESC:opponents, sets and game modes
|
||||
Boros Recruit (RAV) * 4
|
||||
Bull Cerodon (ALA) * 3
|
||||
Castle (RV) * 2
|
||||
Cerodon Yearling (ARB) * 2
|
||||
Crusade (RV) * 1
|
||||
Fire Elemental (RV) * 2
|
||||
Goblin King (10E) * 2
|
||||
Hearthfire Hobgoblin (EVE) * 2
|
||||
Hill Giant (RV) * 1
|
||||
Keldon Warlord (RV) * 1
|
||||
Lightning Helix (RAV) * 4
|
||||
Mons's Goblin Raiders (RV) * 1
|
||||
# RV Mountains
|
||||
#DESC:In the highland of Boros
|
||||
#DESC:Angels, elementals and goblins
|
||||
#DESC:are preparing for battle.
|
||||
#DESC:Beware, the crusade is coming...
|
||||
#4x Lightning Helix {W}{R} - does 3 damage and you gain 3 life replacement for #2x Black Vise (1097) and #2x The Rack (1139)
|
||||
87908
|
||||
87908
|
||||
87908
|
||||
87908
|
||||
# (PSY) added a third Bull Cerodon to bring the deck to 60 cards
|
||||
#2x Bull Cerodon replacement for #3x Earth Elementat {3}{R}{R} -4/5 (1287)
|
||||
174952
|
||||
174952
|
||||
174952
|
||||
#2x Fire Elemental {3}{R}{R} - 5/4
|
||||
1290
|
||||
1290
|
||||
#2 x Nobilis of War {RW}{RW}{RW}{RW}{RW} replacement for 2x Fire elemental (1290)
|
||||
154258
|
||||
154258
|
||||
#2x Goblin king (replaced Rv version 1296 with 10E)
|
||||
129578
|
||||
129578
|
||||
#4 x Boros Recruit - {WR} - Goblin 1/1 first strike - Replace 2x Goblin Baloon brigade (1295) and 2 x Benalish Hero {W} -1/1 banding (1330)
|
||||
88992
|
||||
88992
|
||||
88992
|
||||
88992
|
||||
#1x Mons Goblin Raide (1308)
|
||||
1308
|
||||
#2x Skyknight Legionnaire replacement for #2x Granite Gargoyle {2}{R} - 2/2 flying {R}:0/1 1297
|
||||
109082
|
||||
109082
|
||||
#1x Orcish Oriflame
|
||||
1310
|
||||
#2x Castle {3}{W} - untapped creature get 0/2
|
||||
1334
|
||||
1334
|
||||
#1x Crusade White creature get +1/+1 {W}{W}
|
||||
1341
|
||||
#2x Cerodon Yearling {R}{W} vigilance haste 2/2 replacement for pearled Unicord 2/2 {2}{W} (1356)
|
||||
180604
|
||||
180604
|
||||
#2x Serra Angel {3}{W}{W} - 4/4 flying,vigilance
|
||||
1366
|
||||
1366
|
||||
#2x Wall of sword {3}{W} 3/5 flying defender
|
||||
1369
|
||||
1369
|
||||
#2x White knight 2/2 first strike, protection from black
|
||||
1370
|
||||
1370
|
||||
#1x Hill Giant {3}{R} - 3/3
|
||||
1299
|
||||
#2x Hearthfire Hobgoblin replacement for - 1x Hurloon Minotaur - {1}{R}{R} - 2/3 - 1300 and 1xEarth Elementat {3}{R}{R} -4/5 - 1287
|
||||
157201
|
||||
157201
|
||||
#1x Keldon Warlord
|
||||
1301
|
||||
#Moutains
|
||||
1389
|
||||
1389
|
||||
1389
|
||||
@@ -30,9 +71,7 @@ Mons's Goblin Raiders (RV) * 1
|
||||
1391
|
||||
1391
|
||||
1391
|
||||
Nobilis of War (EVE) * 2
|
||||
Orcish Oriflamme (RV) * 1
|
||||
# RV Plains
|
||||
#Plains
|
||||
1395
|
||||
1395
|
||||
1395
|
||||
@@ -45,7 +84,3 @@ Orcish Oriflamme (RV) * 1
|
||||
1397
|
||||
1397
|
||||
1397
|
||||
Serra Angel (RV) * 2
|
||||
Skyknight Legionnaire (RAV) * 2
|
||||
Wall of Swords (RV) * 2
|
||||
White knight (RV) * 2
|
||||
|
||||
@@ -1,37 +1,68 @@
|
||||
#NAME:Badlands
|
||||
#DESC:The badlands are full of
|
||||
#DESC:treachery; even the paths
|
||||
#DESC:through the marshes will
|
||||
#DESC:mislead and betray
|
||||
#DESC:
|
||||
#DESC:Win matches to unlock more
|
||||
#DESC:opponents, sets and game modes
|
||||
Ankh of Mishra (RV) * 4
|
||||
Armageddon Clock (RV) * 1
|
||||
Bad Moon (RV) * 2
|
||||
Black Knight (RV) * 2
|
||||
Black Vise (RV) * 2
|
||||
Dancing Scimitar (RV) * 2
|
||||
Drudge Skeletons (RV) * 4
|
||||
El-Hajjaj (RV) * 2
|
||||
Goblin King (RV) * 2
|
||||
Howling Mine (RV) * 1
|
||||
Hypnotic Specter (RV) * 2
|
||||
Mons's Goblin Raiders (RV) * 4
|
||||
# RV Mountains
|
||||
1389
|
||||
1390
|
||||
1391
|
||||
1389
|
||||
1390
|
||||
1391
|
||||
1389
|
||||
1390
|
||||
1391
|
||||
Orcish Oriflamme (RV) * 2
|
||||
Scathe Zombies (RV) * 4
|
||||
Sedge Troll (RV) * 3
|
||||
# RV Swamps
|
||||
#DESC:Dangerous foes await you.
|
||||
#DESC:Both undead, goblins, and
|
||||
#DESC:other abominations will
|
||||
#DESC:fight you recklessly.
|
||||
#Ankh of Mishra
|
||||
1094
|
||||
1094
|
||||
1094
|
||||
1094
|
||||
#Armageddon Clock
|
||||
1095
|
||||
#Black Vise
|
||||
1097
|
||||
1097
|
||||
#Dancing Scimitar
|
||||
1104
|
||||
1104
|
||||
#Howling Mine
|
||||
1112
|
||||
#The Rack
|
||||
1139
|
||||
1139
|
||||
#Bad Moon
|
||||
1144
|
||||
1144
|
||||
#Black Knight
|
||||
1145
|
||||
1145
|
||||
#Drudge Skeletons
|
||||
1157
|
||||
1157
|
||||
1157
|
||||
1157
|
||||
#El-Hajjaj
|
||||
1158
|
||||
1158
|
||||
#Hypnotic Specter
|
||||
1165
|
||||
1165
|
||||
#Scathe Zombies
|
||||
1177
|
||||
1177
|
||||
1177
|
||||
1177
|
||||
#Zombie Master
|
||||
1188
|
||||
#Goblin King
|
||||
1296
|
||||
1296
|
||||
#Orcish Oriflamme
|
||||
1310
|
||||
1310
|
||||
#Wheel of Fortune
|
||||
1326
|
||||
#Sedge Troll
|
||||
1315
|
||||
1315
|
||||
1315
|
||||
#Mons's Goblin Raiders
|
||||
1308
|
||||
1308
|
||||
1308
|
||||
1308
|
||||
#Swamp
|
||||
1373
|
||||
1374
|
||||
1375
|
||||
@@ -42,6 +73,13 @@ Sedge Troll (RV) * 3
|
||||
1374
|
||||
1375
|
||||
1373
|
||||
The Rack (RV) * 2
|
||||
Wheel of Fortune (RV) * 1
|
||||
Zombie Master (RV) * 1
|
||||
#Mountain
|
||||
1389
|
||||
1390
|
||||
1391
|
||||
1389
|
||||
1390
|
||||
1391
|
||||
1389
|
||||
1390
|
||||
1391
|
||||
|
||||
@@ -1,18 +1,66 @@
|
||||
#NAME:Yavimaya
|
||||
#DESC:On the island of Yavimaya
|
||||
#DESC:the forest is not just
|
||||
#DESC:ancient and wild. It is
|
||||
#DESC:also sentient.
|
||||
#DESC:
|
||||
#DESC:Win matches to unlock more
|
||||
#DESC:opponents, sets and game modes
|
||||
#HINT:combo hold(Tranquility|myhand)^cast(Tranquility|myhand)^restriction{type(enchantment|opponentbattlefield)~morethan~0}^totalmananeeded({2}{G})
|
||||
Air Elemental (RV) * 4
|
||||
Armageddon Clock (RV) * 1
|
||||
Cockatrice (RV) * 1
|
||||
Craw Wurm (RV) * 1
|
||||
Elvish Archers (RV) * 2
|
||||
# RV Forests
|
||||
#DESC:Beasts of the woods and the
|
||||
#DESC:seas are gathering, preparing
|
||||
#DESC:for battle.
|
||||
#Armageddon Clock
|
||||
1095
|
||||
#Obsianus Golem
|
||||
1129
|
||||
1129
|
||||
#Air Elemental
|
||||
1189
|
||||
1189
|
||||
1189
|
||||
1189
|
||||
#Lifetap
|
||||
1205
|
||||
1205
|
||||
#Lord of Atlantis
|
||||
1206
|
||||
1206
|
||||
#Merfolk of the Pearl Trident
|
||||
1210
|
||||
1210
|
||||
1210
|
||||
1210
|
||||
#Phantom Monster
|
||||
1213
|
||||
1213
|
||||
#Serendib Efreet
|
||||
1221
|
||||
1221
|
||||
#Sea Serpent
|
||||
1220
|
||||
1220
|
||||
#Cockatrice
|
||||
1238
|
||||
#Craw Wurm
|
||||
1239
|
||||
#Elvish Archers
|
||||
1242
|
||||
#Giant Spider
|
||||
1249
|
||||
1249
|
||||
#Grizzly Bears
|
||||
1250
|
||||
1250
|
||||
#Scryb Sprites
|
||||
1264
|
||||
1264
|
||||
1264
|
||||
#Thicket Basilisk
|
||||
1267
|
||||
# (PSY) Timber Wolves not available any more, replaced with Scryb Sprites
|
||||
#Timber Wolves
|
||||
#1268
|
||||
#Tsunami
|
||||
1271
|
||||
#Wall of Ice
|
||||
1274
|
||||
#War Mammoth
|
||||
1277
|
||||
1277
|
||||
#Forest
|
||||
1386
|
||||
1387
|
||||
1388
|
||||
@@ -25,9 +73,7 @@ Elvish Archers (RV) * 2
|
||||
1386
|
||||
1387
|
||||
1388
|
||||
Giant Spider (RV) * 2
|
||||
Grizzly Bears (RV) * 2
|
||||
# RV Islands
|
||||
#Island
|
||||
1392
|
||||
1393
|
||||
1394
|
||||
@@ -40,14 +86,3 @@ Grizzly Bears (RV) * 2
|
||||
1392
|
||||
1393
|
||||
1394
|
||||
Lord of Atlantis (RV) * 3
|
||||
Merfolk of the Pearl Trident (RV) * 4
|
||||
Obsianus Golem (RV) * 2
|
||||
Phantom Monster (RV) * 2
|
||||
Scryb Sprites (RV) * 3
|
||||
Sea Serpent (RV) * 2
|
||||
Serendib Efreet (RV) * 2
|
||||
Thicket Basilisk (RV) * 1
|
||||
Tranquility (RV) * 1
|
||||
Wall of Ice (RV) * 1
|
||||
War Mammoth (RV) * 2
|
||||
|
||||
@@ -1,26 +1,25 @@
|
||||
#NAME:Wrath
|
||||
#DESC:The truly wrathful person
|
||||
#DESC:harms themselves as much as
|
||||
#DESC:their enemies
|
||||
#DESC:
|
||||
#DESC:Win matches to unlock more
|
||||
#DESC:opponents, sets and game modes
|
||||
#HINT:combo hold(Armageddon|myhand)^cast(Armageddon|myhand)^restriction{type(creature|mybattlefield)~morethan~1}^totalmananeeded({3}{W})
|
||||
#HINT:combo hold(Wrath of God|myhand)^cast(Wrath of God|myhand)^restriction{type(creature|opponentbattlefield)~morethan~2}^totalmananeeded({2}{W}{W})
|
||||
Armageddon (VMA) * 4
|
||||
Crusade (DDF) * 4
|
||||
#DESC:O miserable of happy
|
||||
#DESC:Is this the end
|
||||
#DESC:Of this new glorious world
|
||||
# Land(s)
|
||||
Plains (8ED) * 21
|
||||
|
||||
# Creature(s)
|
||||
Guardians of Akrasa (ALA) * 4
|
||||
Paladin en-Vec (9ED) * 1
|
||||
Plains (8ED) * 4
|
||||
Plains (9ED) * 4
|
||||
Plains (M10) * 4
|
||||
Plains (ALA) * 4
|
||||
Plains (DDF) * 4
|
||||
Plains (10E) * 1
|
||||
Savannah Lions (8ED) * 4
|
||||
Serra Angel (8ED) * 4
|
||||
Sigiled Paladin (ALA) * 4
|
||||
Skyhunter Skirmisher (5DN) * 3
|
||||
Swords to Plowshares (DDF) * 4
|
||||
White Knight (M10) * 4
|
||||
|
||||
# Enchantment(s)
|
||||
Crusade (DDF) * 4
|
||||
|
||||
# Instant(s)
|
||||
Swords to Plowshares (DDF) * 4
|
||||
|
||||
# Sorcery(s)
|
||||
Armageddon (VMA) * 4
|
||||
Wrath of God (8ED) * 3
|
||||
@@ -1,16 +1,58 @@
|
||||
#Mill /Artifact Game for AI
|
||||
#NAME:Inquisitor
|
||||
#DESC:'The voice of nature is
|
||||
#DESC:worthless in front of
|
||||
#DESC:the Inquisition'
|
||||
#DESC:Friedrich Schiller
|
||||
#DESC:
|
||||
#DESC:Win matches to unlock more
|
||||
#DESC:opponents, sets and game modes
|
||||
Black Vise (RV) * 4
|
||||
Clockwork Beast (RV) * 4
|
||||
Dancing Scimitar (RV) * 4
|
||||
Howling Mine (10E) * 4
|
||||
# 10E Islands
|
||||
#DESC:Black vises in Ivory Towers
|
||||
#DESC:await you, when facing
|
||||
#DESC:this artificially created army,
|
||||
#DESC:designed to completely stop
|
||||
#DESC:your progress, and then
|
||||
#DESC:torture you to death.
|
||||
#4x Howling Mine
|
||||
129598
|
||||
129598
|
||||
129598
|
||||
129598
|
||||
#4 x Black Vise
|
||||
1097
|
||||
1097
|
||||
1097
|
||||
1097
|
||||
#4x Ivory Tower
|
||||
1115
|
||||
1115
|
||||
1115
|
||||
1115
|
||||
#4x Obsianus Golem
|
||||
1129
|
||||
1129
|
||||
1129
|
||||
1129
|
||||
#4xTower Gargoyle
|
||||
174924
|
||||
174924
|
||||
174924
|
||||
174924
|
||||
#4xLiving Wall
|
||||
1123
|
||||
1123
|
||||
1123
|
||||
1123
|
||||
#4x Dancing Scimitar
|
||||
1104
|
||||
1104
|
||||
1104
|
||||
1104
|
||||
#4x Clockwork Beast
|
||||
1101
|
||||
1101
|
||||
1101
|
||||
1101
|
||||
#4x Master of Etherium
|
||||
175114
|
||||
175114
|
||||
175114
|
||||
175114
|
||||
#Lands
|
||||
#10islands
|
||||
129606
|
||||
129606
|
||||
129606
|
||||
@@ -21,19 +63,7 @@ Howling Mine (10E) * 4
|
||||
129607
|
||||
129608
|
||||
129609
|
||||
Ivory Tower (RV) * 4
|
||||
Living Wall (RV) * 4
|
||||
Master of Etherium (ALA) * 4
|
||||
Obsianus Golem (RV) * 4
|
||||
# 10E Plains
|
||||
129681
|
||||
129682
|
||||
129683
|
||||
129680
|
||||
129681
|
||||
129682
|
||||
129683
|
||||
# 10E Swamps
|
||||
#7swamps
|
||||
129755
|
||||
129756
|
||||
129757
|
||||
@@ -41,4 +71,11 @@ Obsianus Golem (RV) * 4
|
||||
129755
|
||||
129756
|
||||
129757
|
||||
Tower Gargoyle (ALA) * 4
|
||||
#7Plains
|
||||
129681
|
||||
129682
|
||||
129683
|
||||
129680
|
||||
129681
|
||||
129682
|
||||
129683
|
||||
|
||||
@@ -1,23 +1,22 @@
|
||||
#NAME:Shatter
|
||||
#DESC:See your efforts shattered
|
||||
#DESC:by righteous fury
|
||||
#DESC:
|
||||
#DESC:Win matches to unlock more
|
||||
#DESC:opponents, sets and game modes
|
||||
#DESC:See all your efforts shattered
|
||||
#DESC:by the all-consuming power
|
||||
#DESC:of righteous fury.
|
||||
# Land(s)
|
||||
Mountain (8ED) * 12
|
||||
Plains (8ED) * 12
|
||||
|
||||
# Creature(s)
|
||||
Anaba Bodyguard (10E) * 4
|
||||
Ancestor's Chosen (10E) * 4
|
||||
Angelic Wall (10E) * 4
|
||||
Disenchant (M20) * 2
|
||||
Lightning Bolt (M10) * 4
|
||||
Mountain (10E) * 4
|
||||
Mountain (8ED) * 4
|
||||
Mountain (M10) * 4
|
||||
Plains (10E) * 4
|
||||
Plains (8ED) * 4
|
||||
Plains (M10) * 4
|
||||
Rock Badger (10E) * 4
|
||||
Shatter (8ED) * 2
|
||||
Steadfast Guard (10E) * 4
|
||||
Suntail Hawk (8ED) * 2
|
||||
Tempest of Light (MRD) * 2
|
||||
Thundering Giant (10E) * 4
|
||||
|
||||
# Instant(s)
|
||||
Disenchant (M20) * 2
|
||||
Lightning Bolt (M10) * 4
|
||||
Shatter (8ED) * 2
|
||||
Tempest of Light (MRD) * 2
|
||||
@@ -3,9 +3,219 @@ author=Wagic Team
|
||||
name=Commander 2021
|
||||
orderindex=COM-P.C21
|
||||
year=2021-04-23
|
||||
total=410
|
||||
total=371
|
||||
[/meta]
|
||||
[card]
|
||||
primitive=Myr
|
||||
id=-519288
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Eldrazi
|
||||
id=-519281
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Saproling
|
||||
id=-519276
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Spirit
|
||||
id=-519265
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Elemental
|
||||
id=-519246
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Elephant
|
||||
id=-519242
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Beast
|
||||
id=-519238
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Elephant
|
||||
id=-519231
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Hydra
|
||||
id=-519229
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Insect
|
||||
id=-519228
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Insect
|
||||
id=-519227
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Wurm
|
||||
id=-519225
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Beast
|
||||
id=-519223
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Beast
|
||||
id=-519221
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Thopter
|
||||
id=-519216
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Thopter
|
||||
id=-519212
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Zombie
|
||||
id=-519173
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Drake
|
||||
id=-519166
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Kraken
|
||||
id=-519162
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Lizard
|
||||
id=-519161
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Construct
|
||||
id=-519157
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Boar
|
||||
id=-519153
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Horror
|
||||
id=-519129
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Eldrazi
|
||||
id=-519117
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Golem
|
||||
id=-518475
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Fractal
|
||||
id=-518473
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Fractal
|
||||
id=-518468
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Inkling
|
||||
id=-518467
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Beast
|
||||
id=-518465
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Fractal
|
||||
id=-518463
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Pest
|
||||
id=-518461
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Fractal
|
||||
id=-518460
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Fractal
|
||||
id=-518457
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Demon
|
||||
id=-518441
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Inkling
|
||||
id=-518436
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Pest
|
||||
id=-518432
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Kraken
|
||||
id=-518429
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Target
|
||||
id=-518422
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Construct
|
||||
id=-518411
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Inkling
|
||||
id=-518410
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Elemental
|
||||
id=-518310
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Inkling
|
||||
id=-518308
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Breena, the Demagogue
|
||||
id=518307
|
||||
rarity=M
|
||||
@@ -728,7 +938,7 @@ rarity=C
|
||||
[card]
|
||||
primitive=Greed
|
||||
id=519180
|
||||
rarity=U
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Infernal Offering
|
||||
@@ -1493,7 +1703,7 @@ rarity=R
|
||||
[card]
|
||||
primitive=Lonely Sandbar
|
||||
id=519333
|
||||
rarity=U
|
||||
rarity=C
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Lumbering Falls
|
||||
@@ -1578,7 +1788,7 @@ rarity=R
|
||||
[card]
|
||||
primitive=Secluded Steppe
|
||||
id=519350
|
||||
rarity=U
|
||||
rarity=C
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Shivan Reef
|
||||
@@ -1641,406 +1851,6 @@ id=519362
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Breena, the Demagogue
|
||||
id=521597
|
||||
rarity=M
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Felisa, Fang of Silverquill
|
||||
id=521598
|
||||
rarity=M
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Veyran, Voice of Duality
|
||||
id=521599
|
||||
rarity=M
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Zaffai, Thunder Conductor
|
||||
id=521600
|
||||
rarity=M
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Gyome, Master Chef
|
||||
id=521601
|
||||
rarity=M
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Willowdusk, Essence Seer
|
||||
id=521602
|
||||
rarity=M
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Alibou, Ancient Witness
|
||||
id=521603
|
||||
rarity=M
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Osgir, the Reconstructor
|
||||
id=521604
|
||||
rarity=M
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Adrix and Nev, Twincasters
|
||||
id=521605
|
||||
rarity=M
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Esix, Fractal Bloom
|
||||
id=521606
|
||||
rarity=M
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Angel of the Ruins
|
||||
id=521607
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Archaeomancer's Map
|
||||
id=521608
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Bronze Guardian
|
||||
id=521609
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Combat Calligrapher
|
||||
id=521610
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Digsite Engineer
|
||||
id=521611
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Excavation Technique
|
||||
id=521612
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Guardian Archon
|
||||
id=521613
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Losheel, Clockwork Scholar
|
||||
id=521614
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Monologue Tax
|
||||
id=521615
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Nils, Discipline Enforcer
|
||||
id=521616
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Promise of Loyalty
|
||||
id=521617
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Scholarship Sponsor
|
||||
id=521618
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Commander's Insight
|
||||
id=521619
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Curiosity Crafter
|
||||
id=521620
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Dazzling Sphinx
|
||||
id=521621
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Deekah, Fractal Theorist
|
||||
id=521622
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Inspiring Refrain
|
||||
id=521623
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Muse Vortex
|
||||
id=521624
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Octavia, Living Thesis
|
||||
id=521625
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Perplexing Test
|
||||
id=521626
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Replication Technique
|
||||
id=521627
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Sly Instigator
|
||||
id=521628
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Spawning Kraken
|
||||
id=521629
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Theoretical Duplication
|
||||
id=521630
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Author of Shadows
|
||||
id=521631
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Blight Mound
|
||||
id=521632
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Bold Plagiarist
|
||||
id=521633
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Cunning Rhetoric
|
||||
id=521634
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Essence Pulse
|
||||
id=521635
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Fain, the Broker
|
||||
id=521636
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Incarnation Technique
|
||||
id=521637
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Keen Duelist
|
||||
id=521638
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Marshland Bloodcaster
|
||||
id=521639
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Stinging Study
|
||||
id=521640
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Tivash, Gloom Summoner
|
||||
id=521641
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Veinwitch Coven
|
||||
id=521642
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Audacious Reshapers
|
||||
id=521643
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Battlemage's Bracers
|
||||
id=521644
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Creative Technique
|
||||
id=521645
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Cursed Mirror
|
||||
id=521646
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Fiery Encore
|
||||
id=521647
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Inferno Project
|
||||
id=521648
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Laelia, the Blade Reforged
|
||||
id=521649
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Radiant Performer
|
||||
id=521650
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Rionya, Fire Dancer
|
||||
id=521651
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Rousing Refrain
|
||||
id=521652
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Ruin Grinder
|
||||
id=521653
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Surge to Victory
|
||||
id=521654
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Blossoming Bogbeast
|
||||
id=521655
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Ezzaroot Channeler
|
||||
id=521656
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Fractal Harness
|
||||
id=521657
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Guardian Augmenter
|
||||
id=521658
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Healing Technique
|
||||
id=521659
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Paradox Zone
|
||||
id=521660
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Pest Infestation
|
||||
id=521661
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Ruxa, Patient Professor
|
||||
id=521662
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Sequence Engine
|
||||
id=521663
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Sproutback Trudge
|
||||
id=521664
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Trudge Garden
|
||||
id=521665
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Yedora, Grave Gardener
|
||||
id=521666
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Inkshield
|
||||
id=521667
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Oversimplify
|
||||
id=521668
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Reinterpret
|
||||
id=521669
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Revival Experiment
|
||||
id=521670
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Wake the Past
|
||||
id=521671
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Elementalist's Palette
|
||||
id=521672
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Geometric Nexus
|
||||
id=521673
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Tempting Contract
|
||||
id=521674
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Triplicate Titan
|
||||
id=521675
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Witch's Clinic
|
||||
id=521676
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Tranquil Thicket
|
||||
id=519363
|
||||
rarity=C
|
||||
|
||||
@@ -362,7 +362,7 @@ rarity=U
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Nighteyes the Desecrator
|
||||
id=446807
|
||||
id=446808
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
|
||||
@@ -1191,7 +1191,7 @@ rarity=M
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Ajani, Nacatl Avenger
|
||||
id=661754
|
||||
id=661755
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
@@ -1291,7 +1291,7 @@ rarity=M
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Ral, Leyline Prodigy
|
||||
id=661774
|
||||
id=661775
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
@@ -1331,7 +1331,7 @@ rarity=M
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Grist, the Plague Swarm
|
||||
id=661782
|
||||
id=661783
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,136 +0,0 @@
|
||||
[meta]
|
||||
author=Wagic Team
|
||||
name=Ugin's Fate
|
||||
year=2015-01-17
|
||||
total=26
|
||||
[/meta]
|
||||
[card]
|
||||
primitive=Ugin, the Spirit Dragon
|
||||
id=394086
|
||||
rarity=M
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Mastery of the Unseen
|
||||
id=394079
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Smite the Monstrous
|
||||
id=394083
|
||||
rarity=C
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Soul Summons
|
||||
id=394084
|
||||
rarity=C
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Watcher of the Roost
|
||||
id=394088
|
||||
rarity=U
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Jeskai Infiltrator
|
||||
id=394078
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Reality Shift
|
||||
id=394081
|
||||
rarity=U
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Mystic of the Hidden Way
|
||||
id=394080
|
||||
rarity=C
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Write into Being
|
||||
id=394090
|
||||
rarity=C
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Debilitating Injury
|
||||
id=394070
|
||||
rarity=C
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Grim Haruspex
|
||||
id=394075
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Sultai Emissary
|
||||
id=394085
|
||||
rarity=C
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Ruthless Ripper
|
||||
id=394082
|
||||
rarity=U
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Ainok Tracker
|
||||
id=394065
|
||||
rarity=C
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Arc Lightning
|
||||
id=394068
|
||||
rarity=U
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Fierce Invocation
|
||||
id=394072
|
||||
rarity=C
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Jeering Instigator
|
||||
id=394077
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Arashin War Beast
|
||||
id=394067
|
||||
rarity=U
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Formless Nurturing
|
||||
id=394073
|
||||
rarity=C
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Dragonscale Boon
|
||||
id=394071
|
||||
rarity=C
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Wildcall
|
||||
id=394089
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Hewed Stone Retainers
|
||||
id=394076
|
||||
rarity=U
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Ugin's Construct
|
||||
id=394087
|
||||
rarity=U
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Altar of the Brood
|
||||
id=394066
|
||||
rarity=R
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Briber's Purse
|
||||
id=394069
|
||||
rarity=U
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Ghostfire Blade
|
||||
id=394074
|
||||
rarity=R
|
||||
[/card]
|
||||
@@ -226,7 +226,7 @@
|
||||
#AUTO_DEFINE _FIGHT_ transforms((,newability[target(creature|opponentbattlefield) dynamicability<!powerstrike eachother!>])) oneshot
|
||||
|
||||
# Must be blocked this turn if able
|
||||
#AUTO_DEFINE _MUST_BE_BLOCKD_ newability[@combat(attacking) source(this):ability$! notatarget(creature[-tapped]|myBattlefield) transforms((,newability[mustblock])) ueot!$ opponent]
|
||||
#AUTO_DEFINE _MUST_BE_BLOCKD_ newability[@combat(attacking) source(this):ability$! notatarget(creature|myBattlefield) transforms((,newability[mustblock])) ueot!$ opponent]
|
||||
|
||||
# Suspect it. It has menace and can't block.
|
||||
#AUTO_DEFINE _SUSPECT_IT_ name(Suspect it) transforms((suspect,menace,cantblock)) forever
|
||||
@@ -240,7 +240,7 @@
|
||||
#AUTO_DEFINE _ENLIST_ @combat(attacking) source(this) restriction{type(creature[-fresh]|mybattlefield)~morethan~0}:transforms((,newability[{T(creature[-attacking;-fresh]|mybattlefield)}:storedpower/0 ueot limit:1])) ueot
|
||||
|
||||
# Add one mana of any color.
|
||||
#AUTO_DEFINE _MANAOFANYCOLOR_ name(Add one mana of any color) ability$! choice Add{W} _ choice Add{U} _ choice Add{B} _ choice Add{R} _ choice Add{G} !$ controller
|
||||
#AUTO_DEFINE _MANAOFANYCOLOR_ ability$! choice Add{W} _ choice Add{U} _ choice Add{B} _ choice Add{R} _ choice Add{G} !$ controller
|
||||
|
||||
# Manifest dread. Look at the top two cards of your library. Put one onto the battlefield face down as a 2/2 creature and the other into your graveyard. Turn it face up any time for its mana cost if it's a creature card.
|
||||
#AUTO_DEFINE _MANIFEST_DREAD_ name(Manifest dread) reveal:2 optionone name(Manifest) target(*|reveal) manifest optiononeend optiontwo all(*|reveal) moveto(mygraveyard) optiontwoend revealend
|
||||
@@ -249,31 +249,8 @@
|
||||
|
||||
#AUTO_DEFINE _CREW1_ {crew(other creature[power>=1]|myBattlefield)}:name(crew 1 [1 creature]) becomes(Artifact Creature) ueot restriction{type(other creature[-tapped;power>=1]|mybattlefield)~morethan~0,compare(crewtotalpower)~morethan~0}
|
||||
|
||||
#AUTO_DEFINE _CREW2_ {crew(other creature[power>=2]|myBattlefield)}:name(crew 2 [1 creature]) becomes(Artifact Creature) ueot restriction{type(other creature[-tapped;power>=2]|mybattlefield)~morethan~0,compare(crewtotalpower)~morethan~1}
|
||||
|
||||
#AUTO_DEFINE _CREW2COMPLEMENT_ {crew(other creature[power>=1]|myBattlefield)}{crew(other creature[power>=1]|myBattlefield)}:name(crew 2 [2 creature]) becomes(Artifact Creature) ueot restriction{type(other creature[-tapped;power>=1]|mybattlefield)~morethan~1,compare(crewtotalpower)~morethan~1}
|
||||
|
||||
# Endure
|
||||
#AUTO_DEFINE _ENDURE1_ transforms((,newability[choice counter(1/1)],newability[choice create(Spirit:Creature:1/1:white)])) ueot
|
||||
#AUTO_DEFINE _ENDURE2_ transforms((,newability[choice counter(1/1.2)],newability[choice create(Spirit:Creature:2/2:white)])) ueot
|
||||
#AUTO_DEFINE _ENDURE3_ transforms((,newability[choice counter(1/1.3)],newability[choice create(Spirit:Creature:3/3:white)])) ueot
|
||||
#AUTO_DEFINE _ENDURE4_ transforms((,newability[choice counter(1/1.4)],newability[choice create(Spirit:Creature:4/4:white)])) ueot
|
||||
#AUTO_DEFINE _ENDURE5_ transforms((,newability[choice counter(1/1.5)],newability[choice create(Spirit:Creature:5/5:white)])) ueot
|
||||
#AUTO_DEFINE _ENDURE6_ transforms((,newability[choice counter(1/1.6)],newability[choice create(Spirit:Creature:6/6:white)])) ueot
|
||||
#AUTO_DEFINE _ENDURE7_ transforms((,newability[choice counter(1/1.7)],newability[choice create(Spirit:Creature:7/7:white)])) ueot
|
||||
#AUTO_DEFINE _ENDURE8_ transforms((,newability[choice counter(1/1.8)],newability[choice create(Spirit:Creature:8/8:white)])) ueot
|
||||
#AUTO_DEFINE _ENDURE9_ transforms((,newability[choice counter(1/1.9)],newability[choice create(Spirit:Creature:9/9:white)])) ueot
|
||||
#AUTO_DEFINE _ENDURE10_ transforms((,newability[choice counter(1/1.10)],newability[choice create(Spirit:Creature:10/10:white)])) ueot
|
||||
#AUTO_DEFINE _ENDURE11_ transforms((,newability[choice counter(1/1.11)],newability[choice create(Spirit:Creature:11/11:white)])) ueot
|
||||
#AUTO_DEFINE _ENDURE12_ transforms((,newability[choice counter(1/1.12)],newability[choice create(Spirit:Creature:12/12:white)])) ueot
|
||||
#AUTO_DEFINE _ENDURE13_ transforms((,newability[choice counter(1/1.13)],newability[choice create(Spirit:Creature:13/13:white)])) ueot
|
||||
#AUTO_DEFINE _ENDURE14_ transforms((,newability[choice counter(1/1.14)],newability[choice create(Spirit:Creature:14/14:white)])) ueot
|
||||
#AUTO_DEFINE _ENDURE15_ transforms((,newability[choice counter(1/1.15)],newability[choice create(Spirit:Creature:15/15:white)])) ueot
|
||||
#AUTO_DEFINE _ENDURE16_ transforms((,newability[choice counter(1/1.16)],newability[choice create(Spirit:Creature:16/16:white)])) ueot
|
||||
#AUTO_DEFINE _ENDURE17_ transforms((,newability[choice counter(1/1.17)],newability[choice create(Spirit:Creature:17/17:white)])) ueot
|
||||
#AUTO_DEFINE _ENDURE18_ transforms((,newability[choice counter(1/1.18)],newability[choice create(Spirit:Creature:18/18:white)])) ueot
|
||||
#AUTO_DEFINE _ENDURE19_ transforms((,newability[choice counter(1/1.19)],newability[choice create(Spirit:Creature:19/19:white)])) ueot
|
||||
#AUTO_DEFINE _ENDURE20_ transforms((,newability[choice counter(1/1.20)],newability[choice create(Spirit:Creature:20/20:white)])) ueot
|
||||
#AUTO_DEFINE _ENDURE_($c) transforms((,newability[choice counter(1/1.$c)],newability[choice create(Spirit:Creature:$c/$c:white)])) ueot
|
||||
|
||||
# Flurry
|
||||
#AUTO_DEFINE _FLURRY_ @movedto(*|mystack) restriction{thisturn(*|mystack)~equalto~1}:
|
||||
@@ -375,13 +352,13 @@
|
||||
#AUTO_DEFINE _ZOMBIETOKEN_ create(zombie:creature zombie:2/2:black)
|
||||
|
||||
# Clue Token
|
||||
#AUTO_DEFINE _CLUE_ token(Clue^Clue Artifact^0/0) and!( transforms((,newability[{2}{S}:draw:1])) forever )!
|
||||
#AUTO_DEFINE _CLUE_ token(Clue,Clue Artifact,0/0) and!( transforms((,newability[{2}{S}:draw:1])) forever )!
|
||||
|
||||
# Food Token
|
||||
#AUTO_DEFINE _FOOD_ token(Food^Food Artifact^0/0) and!( transforms((,newability[{2}{T}{S}:life:3])) forever )!
|
||||
#AUTO_DEFINE _FOOD_ token(Food,Food Artifact,0/0) and!( transforms((,newability[{2}{T}{S}:life:3])) forever )!
|
||||
|
||||
# Treasure Token
|
||||
#AUTO_DEFINE _TREASURE_ token(Treasure^Treasure Artifact^0/0) and!( transforms((,newability[{T}{S}:Add{W}],newability[{T}{S}:Add{U}],newability[{T}{S}:Add{B}],newability[{T}{S}:Add{R}],newability[{T}{S}:Add{G}])) forever )!
|
||||
#AUTO_DEFINE _TREASURE_ token(Treasure,Treasure Artifact,0/0) and!( transforms((,newability[{T}{S}:Add{W}],newability[{T}{S}:Add{U}],newability[{T}{S}:Add{B}],newability[{T}{S}:Add{R}],newability[{T}{S}:Add{G}])) forever )!
|
||||
|
||||
# Vehicle Token
|
||||
#AUTO_DEFINE _VEHICLE_ token(Vehicle^Artifact Vehicle^3/2) and!( transforms((,newability[{crew(other creature[power>=1]|myBattlefield)}:name(crew 1 [1 creature]) becomes(Artifact Creature) ueot restriction{type(other creature[-tapped;power>=1]|mybattlefield)~morethan~0,compare(crewtotalpower)~morethan~0}])) forever )!
|
||||
#AUTO_DEFINE _VEHICLE_ token(Vehicle,Artifact Vehicle,3/2) and!( transforms((,newability[{crew(other creature[power>=1]|myBattlefield)}:name(crew 1 [1 creature]) becomes(Artifact Creature) ueot restriction{type(other creature[-tapped;power>=1]|mybattlefield)~morethan~0,compare(crewtotalpower)~morethan~0}])) forever )!
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
#Planeswalkers Primitives Pack for Wagic the Homebrew.
|
||||
#Please keep these card alphabetized, and try to have the "name=" line at the top of each card
|
||||
#Sorted this programmatically - Thanks to Vitty85 29-04-2024
|
||||
#Sorted this programmatically - Thanks to Vitty85 28-03-2024
|
||||
[card]
|
||||
name=Abian, Luvion Usurper
|
||||
auto=counter(0/0,5,loyalty)
|
||||
@@ -192,7 +192,7 @@ subtype=Aminatou
|
||||
name=Angrath, Captain of Chaos
|
||||
auto=counter(0/0,5,loyalty)
|
||||
auto=lord(creature|myBattlefield) menace
|
||||
auto={C(0/0,-2,Loyalty)}:name(-2: Amass 2) ability$! _AMASSZOMBIE2_ !$ controller
|
||||
auto={C(0/0,-2,Loyalty)}:name(-2: Amass 2) _AMASSZOMBIE2_
|
||||
text=Creatures you control have menace. -- -2: Amass 2. (Put two +1/+1 counters on an Army you control. If you don't control one, create a 0/0 black Zombie Army creature token first.)
|
||||
mana={2}{BR}{BR}
|
||||
type=Legendary Planeswalker
|
||||
@@ -452,7 +452,7 @@ subtype=Chandra
|
||||
[/card]
|
||||
[card]
|
||||
name=Chandra, Awakened Inferno
|
||||
abilities=nofizzle
|
||||
auto=nofizzle
|
||||
auto=counter(0/0,6,loyalty)
|
||||
auto={C(0/0,2,Loyalty)}:name(+2: Emblem: "1 damage each upkeep") emblem transforms((,newability[@each opponent upkeep:damage:1 opponent])) forever dontremove
|
||||
auto={C(0/0,-3,Loyalty)}:name(-3: Deals 3 damage to each non-elemental) damage:3 all(creature[-elemental])
|
||||
@@ -595,7 +595,7 @@ auto=counter(0/0,5,loyalty)
|
||||
auto=@movedTo(*[instant;sorcery]|mystack) turnlimited:name(Copy spell) name(Copy spell) all(trigger[to]) transforms((,newability[name(Copy spell) activate castcard(copied noevent)])) oneshot
|
||||
auto={C(0/0,+2,Loyalty)}:name(+2: Add 2 mana) thisforeach(variable{2}) ability$!name(Choose one) choice name(Add white) add{W} _ choice name(Add blue) add{U} _ choice name(Add red) add{B} _ choice name(Add green) add{R} _ choice name(Add black) add{G}!$ controller
|
||||
auto={C(0/0,+1,Loyalty)}:name(+1: Exile top 5 cards) all(*[zpos<=5]|mylibrary) moveto(myexile) and!( if cantargetcard(*[instant;sorcery]|*) then transforms((,newability[canplayfromexile])) ueot )!
|
||||
auto={C(0/0,-1,Loyalty)}:name(-1: Damage one target) ability$!name(Damage target) name(Damage target) target(anytarget) damage:1!$ controller
|
||||
auto={C(0/0,-1,Loyalty)}:name(-1: Damage one target) ability$!name(Damage target) name(Damage target) target(anytarget) damage:1!$ controller
|
||||
auto={C(0/0,-1,Loyalty)}:name(-1: Damage two target) ability$!name(Damage targets) name(Damage targets) target(<2>anytarget) damage:1!$ controller
|
||||
auto={C(0/0,-2,Loyalty)}:name(-2: Damage one target) ability$!name(Damage target) name(Damage target) target(anytarget) damage:2!$ controller
|
||||
auto={C(0/0,-2,Loyalty)}:name(-2: Damage two target) ability$!name(Damage targets) name(Damage targets) target(<2>anytarget) damage:2!$ controller
|
||||
@@ -983,18 +983,6 @@ type=Legendary Planeswalker
|
||||
subtype=Elspeth
|
||||
[/card]
|
||||
[card]
|
||||
name=Elspeth, Storm Slayer
|
||||
auto=counter(0/0,5,loyalty)
|
||||
auto=@tokencreated(*|myBattlefield):name(Double the token) all(trigger) clone options(notrigger)
|
||||
auto={C(0/0,+1,Loyalty)}:create(soldier:creature soldier:1/1:white)
|
||||
auto={C(0/0,0,Loyalty)}:all(creature|myBattlefield) transforms((,newability[counter(1/1)],flying)) uynt
|
||||
auto={C(0/0,-3,Loyalty)}:destroy target(creature[manacost>=3]|opponentBattlefield)
|
||||
text=If one or more tokens would be created under your control, twice that many of those tokens are created instead. -- [+1]: Create a 1/1 white Soldier creature token. -- [0]: Put a +1/+1 counter on each creature you control. Those creatures gain flying until your next turn. -- [-3]: Destroy target creature an opponent controls with mana value 3 or greater.
|
||||
mana={3}{W}{W}
|
||||
type=Legendary Planeswalker
|
||||
subtype=Elspeth
|
||||
[/card]
|
||||
[card]
|
||||
name=Elspeth, Sun's Champion
|
||||
auto=counter(0/0,4,loyalty)
|
||||
auto={C(0/0,1,Loyalty)}:name(+1: Create three 1/1 Soldier) _SOLDIERTOKEN_*3
|
||||
@@ -1281,7 +1269,7 @@ auto=counter(0/0,5,loyalty)
|
||||
auto={C(0/0,2,Loyalty)}:name(+2: Untap all creatures and get +1/+1) all(creature|mybattlefield) 1/1 && all(creature|mybattlefield) untap ueot
|
||||
auto={C(0/0,0,Loyalty)}:name(+0: Transforms to Human Soldier 5/5) transforms((Creature Human Soldier,setpower=5,settoughness=5,indestructible,newability[preventAllDamage to(this)])) ueot
|
||||
auto={C(0/0,-10,Loyalty)}:name(10: Tap all creatures and +2/+2) all(creature|opponentbattlefield) tap && all(creature|mybattlefield) 2/2 ueot
|
||||
text=+2: Untap all creatures you control. Those creatures get +1/+1 until end of turn. -- 0: Until end of turn, Gideon, Martial Paragon becomes a 5/5 Human Soldier creature with indestructible that's still a planeswalker. Prevent all damage that would be dealt to him this turn. -- -10: Creatures you control get +2/+2 until end of turn. Tap all creatures your opponents control.
|
||||
text=+2: Untap all creatures you control. Those creatures get +1/+1 until end of turn. -- 0: Until end of turn, Gideon, Martial Paragon becomes a 5/5 Human Soldier creature with indestructible that's still a planeswalker. Prevent all damage that would be dealt to him this turn. -- -10: Creatures you control get +2/+2 until end of turn. Tap all creatures your opponents control.
|
||||
mana={4}{W}
|
||||
type=Legendary Planeswalker
|
||||
subtype=Gideon
|
||||
@@ -1570,7 +1558,7 @@ subtype=Jace
|
||||
[/card]
|
||||
[card]
|
||||
name=Jace, the Perfected Mind
|
||||
auto=alternative counter(0/0,3,loyalty)
|
||||
auto=if paid(alternative) then counter(0/0,3,loyalty)
|
||||
auto=ifnot paid(alternative) then counter(0/0,5,loyalty)
|
||||
auto={C(0/0,+1,Loyalty)}:name(+1: Target creature gains -3/-0) target(creature|battlefield) transforms((,newability[-3/-0])) uynt
|
||||
auto={C(0/0,+1,Loyalty)}:name(+1: Don't target any creature) donothing
|
||||
@@ -1737,7 +1725,7 @@ name=Kaito, Bane of Nightmares
|
||||
auto=counter(0/0,4,loyalty)
|
||||
autohand={1}{U}{B}{N}:ninjutsu
|
||||
auto=this(variable{controllerturn}>0) becomes(Ninja Creature,3/4,hexproof)
|
||||
auto={C(0/0,+1,Loyalty)}:name(emblem) emblem transforms((,newability[lord(ninja|myBattlefield) 1/1])) forever dontremove
|
||||
auto={C(0/0,+1,Loyalty)}:name(emblem) emblem transforms((,newability[all(ninja|myBattlefield) 1/1])) forever dontremove
|
||||
auto={C(0/0,0,Loyalty)}:name(Surveil 2) reveal:psurveiloffsetplus2plusend optionone name(put in graveyard) target(<upto:psurveiloffsetplus2plusend>*|reveal) moveto(ownergraveyard) optiononeend optiontwo name(put in library) target(<psurveiloffsetplus2plusend>*|reveal) moveto(ownerlibrary) optiontwoend afterrevealed all(*[zpos=1]|mylibrary) transforms((,newability[draw:1 controller])) oneshot afterrevealedend revealend
|
||||
auto={C(0/0,-2,Loyalty)}:name(-2 Tap target creature) target(creature) transforms((,newability[tap],newability[counter(0/0.2.Stun)]))
|
||||
text=Ninjutsu {1}{U}{B} ({1}{U}{B}, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand tapped and attacking.) -- During your turn, as long as Kaito has one or more loyalty counters on him, he's a 3/4 Ninja creature and has hexproof. -- [+1]: You get an emblem with "Ninjas you control get +1/+1." -- [0]: Surveil 2. Then draw a card for each opponent who lost life this turn. -- [-2]: Tap target creature. Put two stun counters on it.
|
||||
@@ -2191,7 +2179,7 @@ subtype=Windgrace
|
||||
[card]
|
||||
name=Lukka, Bound to Ruin
|
||||
auto=ifnot paid(alternative) then counter(0/0,5,loyalty)
|
||||
auto=alternative counter(0/0,3,loyalty)
|
||||
auto=if paid(alternative) then counter(0/0,3,loyalty)
|
||||
auto=aslongas(creature|mybattlefield,myrestrictedcastingzone) {C(0/0,+1,Loyalty)}:name(+1: Add mana) name(+1: Add mana) add{R}{G}
|
||||
auto={C(0/0,-1,Loyalty)}:name(-1: Create beast) token(Phyrexian Beast,Creature Phyrexian Beast,3/3,green,poisontoxic)
|
||||
auto=aslongas(creature[power=1]|mybattlefield) {C(0/0,-4,Loyalty)}:name(-4: Deal 1 damage) name(-4: Deal 1 damage) thisforeach(variable{1}) ability$!name(Deal 1 damage) damage:1 target(*[creature;planeswalker]|battlefield)!$ controller
|
||||
@@ -2363,7 +2351,7 @@ subtype=Nahiri
|
||||
[card]
|
||||
name=Nahiri, the Unforgiving
|
||||
auto=ifnot paid(alternative) then counter(0/0,5,loyalty)
|
||||
auto=alternative counter(0/0,3,loyalty)
|
||||
auto=if paid(alternative) then counter(0/0,3,loyalty)
|
||||
auto={C(0/0,+1,Loyalty)}:name(+1: Creature must attack) target(creature|battlefield) transforms((,newability[mustattack])) uynt
|
||||
auto={C(0/0,+1,Loyalty)}:name(+1: Don't target any creature) donothing
|
||||
auto={C(0/0,+1,Loyalty)}:name(+1: Discard and draw) _DISCARD&DRAW_
|
||||
@@ -2552,7 +2540,7 @@ subtype=Nissa
|
||||
[card]
|
||||
name=Nissa, Ascended Animist
|
||||
auto=ifnot paid(kicker) then ifnot paid(alternative) then counter(0/0,7,loyalty)
|
||||
auto=alternative counter(0/0,5,loyalty)
|
||||
auto=if paid(alternative) then counter(0/0,5,loyalty)
|
||||
auto=if paid(kicker) then counter(0/0,3,loyalty)
|
||||
auto={C(0/0,+1,Loyalty)}:name(+1: Create horror) token(Phyrexian Horror,Creature Phyrexian Horror,hascntloyalty/hascntloyalty,green)
|
||||
auto={C(0/0,-1,Loyalty)}:name(-1: Destroy artifact or enchantment) destroy target(*[artifact;enchantment]|battlefield)
|
||||
@@ -2815,7 +2803,7 @@ otherrestriction=can play planeswalker,compare(isflipped)~equalto~1
|
||||
restriction=compare(isflipped)~equalto~0
|
||||
anyzone={0}:doubleside(Will, Scholar of Frost)
|
||||
autostack=if paid(alternative) then name(Will, Scholar of Frost) name(Will, Scholar of Frost) flip(Will, Scholar of Frost) forcetype(Legendary Planeswalker)
|
||||
auto=alternative counter(0/0,4,Loyalty) else counter(0/0,2,loyalty)
|
||||
auto=if paid(alternative) then counter(0/0,4,Loyalty) else counter(0/0,2,loyalty)
|
||||
auto=this(variable{isflipped}<1) lord(instant,sorcery|mycastingzone) altercost(colorless,-1)
|
||||
auto=this(variable{isflipped}<1) {C(0/0,1,Loyalty)}:name(+1: Deals damage) name(+1: Deals damage) if compare(pdrewcount)~lessthan~3 then damage:1 opponent else damage:3 opponent
|
||||
auto=this(variable{isflipped}<1) {C(0/0,-4,Loyalty)}:name(-4: Emblem copy spells) name(-4: Emblem copy spells) emblem transforms((,newability[@movedto(*[instant;sorcery]|mystack):all(trigger[to]<1>) transforms((,newability[pay[[{2}]] name(copy spell) activate name(copy spell) castcard(copied noevent)])) forever])) forever dontremove
|
||||
@@ -3148,7 +3136,7 @@ subtype=Tamiyo
|
||||
[card]
|
||||
name=Tamiyo, Compleated Sage
|
||||
auto=ifnot paid(alternative) then counter(0/0,5,loyalty)
|
||||
auto=alternative counter(0/0,3,loyalty)
|
||||
auto=if paid(alternative) then counter(0/0,3,loyalty)
|
||||
auto={C(0/0,+1,Loyalty)}:name(+1: Tap artifact or creature) target(*[artifact;creature]|battlefield) freeze
|
||||
auto={C(0/0,+1,Loyalty)}:name(+1: Don't tap anything) donothing
|
||||
auto={C(0/0,0,Loyalty)}:name(0: Exile and copy with cost 0) target(*[-land&manacost=0]|mygraveyard) moveto(myexile) and!( clone )!
|
||||
@@ -3666,19 +3654,6 @@ type=Legendary Planeswalker
|
||||
subtype=Tyvar
|
||||
[/card]
|
||||
[card]
|
||||
name=Ugin, Eye of the Storms
|
||||
auto=counter(0/0,7,loyalty)
|
||||
autostack=may moveTo(exile) target(*[white;blue;black;red;green])
|
||||
auto=@movedTo(*[colorless]|mystack):may moveTo(exile) target(*[white;blue;black;red;green])
|
||||
auto={C(0/0,+2,Loyalty)}:life:3 && draw:1
|
||||
auto={C(0/0,0,Loyalty)}:Add{C}{C}{C}
|
||||
auto={C(0/0,-11,Loyalty)}:target(<anyAmount>*[colorless]|myLibrary) moveTo(exile) and!( transforms((,newability[zerocast],newability[canplayfromexile])) ueot )!
|
||||
text=When you cast this spell, exile up to one target permanent that's one or more colors. -- Whenever you cast a colorless spell, exile up to one target permanent that's one or more colors. -- [+2]: You gain 3 life and draw a card. -- [0]: Add {C}{C}{C}. -- [-11]: Search your library for any number of colorless nonland cards, exile them, then shuffle. Until end of turn, you may cast those cards without paying their mana costs.
|
||||
mana={7}
|
||||
type=Legendary Planeswalker
|
||||
subtype=Ugin
|
||||
[/card]
|
||||
[card]
|
||||
name=Ugin, the Ineffable
|
||||
auto=counter(0/0,4,loyalty)
|
||||
auto=lord(*[colorless]|mycastingzone) altercost(colorless,-2)
|
||||
@@ -3745,7 +3720,7 @@ subtype=Venser
|
||||
name=Vivien Reid
|
||||
auto=counter(0/0,5,loyalty)
|
||||
aicode=activate moveto(myhand) target(*[creature;land;zpos<=4]|mylibrary)
|
||||
auto={C(0/0,+1,Loyalty)}:name(+1: Look four and put creature or land in hand) name(look) reveal:4 optionone name(Get a creature or land) target(<1>*[creature;land]|reveal) moveto(myhand) optiononeend optiontwo name(put on bottom) all(*|reveal) bottomoflibrary optiontwoend revealend
|
||||
auto={C(0/0,+1,Loyalty)}:name(+1: Look four and put creature or land in hand) name(look) reveal:4 optionone name(Get a creature or land) target(<1>*[creature;land]|reveal) moveto(myhand) optiononeend optiontwo name(put on bottom) target(<4>*|reveal) bottomoflibrary optiontwoend revealend
|
||||
auto={C(0/0,-3,Loyalty)}:name(-3: Destroy target artifact) destroy target(artifact)
|
||||
auto={C(0/0,-3,Loyalty)}:name(-3: Destroy target enchantment) destroy target(enchantment)
|
||||
auto={C(0/0,-3,Loyalty)}:name(-3: Destroy target creature with flying) destroy target(creature[flying])
|
||||
@@ -3826,7 +3801,7 @@ subtype=Vraska
|
||||
[/card]
|
||||
[card]
|
||||
name=Vraska, Betrayal's Sting
|
||||
auto=alternative counter(0/0,4,loyalty)
|
||||
auto=if paid(alternative) then counter(0/0,4,loyalty)
|
||||
auto=ifnot paid(alternative) then counter(0/0,6,loyalty)
|
||||
auto={C(0/0,0,Loyalty)}:name(0: Draw card and lose life) draw:1 controller && life:-1 controller && _PROLIFERATE_
|
||||
auto={C(0/0,-2,Loyalty)}:name(-2: Creature becomes treasure) target(creature|battlefield) transforms((removeallsubtypes,removeallcolors,newability[becomes(Treasure artifact)],,newability[{T}{S}:Add{W}],newability[{T}{S}:Add{U}],newability[{T}{S}:Add{B}],newability[{T}{S}:Add{R}],newability[{T}{S}:Add{G}])) forever
|
||||
|
||||
@@ -4,15 +4,13 @@ import zipfile
|
||||
from pyjavaproperties import Properties
|
||||
from optparse import OptionParser
|
||||
|
||||
def createWindowsZipFile(filename):
|
||||
def createWindowsZipFile(filename, buildpath):
|
||||
utilities = ZipUtilities()
|
||||
zip_file = zipfile.ZipFile(filename, 'w', zipfile.ZIP_STORED)
|
||||
zip_file.write('../../../LICENSE')
|
||||
zip_file.write('libpng13.dll')
|
||||
zip_file.write('SDL.dll')
|
||||
zip_file.write('fmod.dll')
|
||||
zip_file.write('zlib1.dll')
|
||||
zip_file.write('Wagic.exe')
|
||||
zip_file.write(buildpath + '/../LICENSE')
|
||||
zip_file.write(buildpath + '/lib/Release/SDL2.dll', 'SDL2.dll')
|
||||
zip_file.write(buildpath + '/lib/Release/zlib.dll', 'zlib.dll')
|
||||
zip_file.write(buildpath + '/bin/Release/wagic.exe', 'wagic.exe')
|
||||
zip_file.write('Res/' + getFilename('core') + '.zip')
|
||||
zip_file.close()
|
||||
|
||||
@@ -25,8 +23,7 @@ def getFilename(filename):
|
||||
filename = filename + '-' + major + minor + point
|
||||
return filename
|
||||
|
||||
def createStandardResFile():
|
||||
#print("Creating Resource File")
|
||||
def createStandardResFile(buildpath):
|
||||
print "Creating Resource File"
|
||||
cmd = 'python createResourceZip.py -n ' + getFilename('core') + '.zip'
|
||||
os.chdir("Res")
|
||||
@@ -35,8 +32,8 @@ def createStandardResFile():
|
||||
#print("Creating Windows Package File")
|
||||
print "Creating Windows Package File"
|
||||
filename = 'Wagic-windows.zip'
|
||||
createWindowsZipFile( filename )
|
||||
#print(sys.stderr, 'Created Windows Package: {0}'.format( filename))
|
||||
createWindowsZipFile( filename, buildpath )
|
||||
print >> sys.stderr, 'Created Windows Package: {0}'.format( filename)
|
||||
|
||||
class ZipUtilities:
|
||||
|
||||
@@ -65,11 +62,11 @@ def main():
|
||||
## using optparse instead of argParse for now since python 2.7 may not be installed.
|
||||
|
||||
parser = OptionParser()
|
||||
parser.add_option("-p", "--platform", help="PLATFORM: specify custom build. (eg ios, android, etc)", metavar="PLATFORM", dest="platform")
|
||||
parser.add_option("-b", "--build", help="BUILD: specify the build directory", metavar="BUILD", dest="build")
|
||||
|
||||
(options, args) = parser.parse_args()
|
||||
|
||||
createStandardResFile()
|
||||
createStandardResFile(options.build)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
@@ -2,5 +2,5 @@
|
||||
#Sun, 20 May 2020 11:56:35 +0200
|
||||
build.major=0
|
||||
build.minor=25
|
||||
build.point=5
|
||||
build.point=3
|
||||
|
||||
|
||||
+21
-21
@@ -60,13 +60,12 @@
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
|
||||
|
||||
typedef struct dirent {
|
||||
/* name of current directory entry (a multi-byte character string) */
|
||||
char d_name[MAX_PATH + 1];
|
||||
|
||||
/* file attributes */
|
||||
WIN32_FIND_DATAA data;
|
||||
WIN32_FIND_DATAW data;
|
||||
} dirent;
|
||||
|
||||
|
||||
@@ -81,7 +80,7 @@ typedef struct DIR {
|
||||
HANDLE search_handle;
|
||||
|
||||
/* search pattern (3 = zero terminator + pattern "\\*") */
|
||||
char patt[MAX_PATH + 3];
|
||||
wchar_t patt[MAX_PATH + 3];
|
||||
} DIR;
|
||||
|
||||
|
||||
@@ -91,12 +90,7 @@ static int closedir (DIR *dirp);
|
||||
|
||||
|
||||
/* use the new safe string functions introduced in Visual Studio 2005 */
|
||||
#if defined(_MSC_VER) && _MSC_VER >= 1400
|
||||
# define STRNCPY(dest,src,size) strncpy_s((dest),(size),(src),_TRUNCATE)
|
||||
#else
|
||||
# define STRNCPY(dest,src,size) strncpy((dest),(src),(size))
|
||||
#endif
|
||||
|
||||
# define STRNCPY(dest,src,size) wcsncpy_s((dest),(size),(src),_TRUNCATE)
|
||||
|
||||
/*
|
||||
* Open directory stream DIRNAME for read and return a pointer to the
|
||||
@@ -114,23 +108,29 @@ opendir(
|
||||
/* construct new DIR structure */
|
||||
dirp = (DIR*) malloc (sizeof (struct DIR));
|
||||
if (dirp != NULL) {
|
||||
char *p;
|
||||
wchar_t *p;
|
||||
|
||||
/* take directory name... */
|
||||
STRNCPY (dirp->patt, dirname, sizeof(dirp->patt));
|
||||
dirp->patt[MAX_PATH] = '\0';
|
||||
MultiByteToWideChar( CP_ACP, MB_ERR_INVALID_CHARS, dirname, -1,dirp->patt, strlen(dirname)+1 );
|
||||
dirp->patt[MAX_PATH] = L'\0';
|
||||
|
||||
/* ... and append search pattern to it */
|
||||
p = strchr (dirp->patt, '\0');
|
||||
if (dirp->patt < p && *(p-1) != '\\' && *(p-1) != ':') {
|
||||
*p++ = '\\';
|
||||
p = wcschr (dirp->patt, L'\0');
|
||||
if (dirp->patt < p && *(p-1) != L'\\' && *(p-1) != L':') {
|
||||
*p++ = L'\\';
|
||||
}
|
||||
*p++ = '*';
|
||||
*p = '\0';
|
||||
*p++ = L'*';
|
||||
*p = L'\0';
|
||||
|
||||
/* open stream and retrieve first file */
|
||||
dirp->search_handle = FindFirstFileA (dirp->patt, &dirp->current.data);
|
||||
if (dirp->search_handle == INVALID_HANDLE_VALUE) {
|
||||
dirp->search_handle = FindFirstFileExW( dirp->patt,
|
||||
FindExInfoStandard,
|
||||
&dirp->current.data,
|
||||
FindExSearchNameMatch,
|
||||
NULL,
|
||||
0 );;
|
||||
|
||||
if (dirp->search_handle == INVALID_HANDLE_VALUE) {
|
||||
/* invalid search pattern? */
|
||||
free (dirp);
|
||||
return NULL;
|
||||
@@ -168,7 +168,7 @@ readdir(
|
||||
dirp->cached = 0;
|
||||
} else {
|
||||
/* read next directory entry from disk */
|
||||
if (FindNextFileA (dirp->search_handle, &dirp->current.data) == FALSE) {
|
||||
if (FindNextFileW (dirp->search_handle, &dirp->current.data) == FALSE) {
|
||||
/* the very last file has been processed or an error occured */
|
||||
FindClose (dirp->search_handle);
|
||||
dirp->search_handle = INVALID_HANDLE_VALUE;
|
||||
@@ -177,7 +177,7 @@ readdir(
|
||||
}
|
||||
|
||||
/* copy as a multibyte character string */
|
||||
STRNCPY (dirp->current.d_name, dirp->current.data.cFileName, sizeof(dirp->current.d_name));
|
||||
WideCharToMultiByte(CP_ACP, 0, dirp->current.data.cFileName, -1, dirp->current.d_name, wcslen(dirp->current.data.cFileName)+1, NULL, NULL);
|
||||
dirp->current.d_name[MAX_PATH] = '\0';
|
||||
|
||||
return &dirp->current;
|
||||
|
||||
@@ -1,232 +0,0 @@
|
||||
// ISO C9x compliant stdint.h for Microsoft Visual Studio
|
||||
// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124
|
||||
//
|
||||
// Copyright (c) 2006-2008 Alexander Chemeris
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// 2. Redistributions in binary form must reproduce the above copyright
|
||||
// notice, this list of conditions and the following disclaimer in the
|
||||
// documentation and/or other materials provided with the distribution.
|
||||
//
|
||||
// 3. The name of the author may be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||
// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef _MSC_VER // [
|
||||
#error "Use this header only with Microsoft Visual C++ compilers!"
|
||||
#endif // _MSC_VER ]
|
||||
|
||||
#ifndef _MSC_STDINT_H_ // [
|
||||
#define _MSC_STDINT_H_
|
||||
|
||||
#if _MSC_VER > 1000
|
||||
#pragma once
|
||||
#endif
|
||||
|
||||
#include <limits.h>
|
||||
|
||||
// For Visual Studio 6 in C++ mode wrap <wchar.h> include with 'extern "C++" {}'
|
||||
// or compiler give many errors like this:
|
||||
// error C2733: second C linkage of overloaded function 'wmemchr' not allowed
|
||||
#if (_MSC_VER < 1300) && defined(__cplusplus)
|
||||
extern "C++" {
|
||||
#endif
|
||||
# include <wchar.h>
|
||||
#if (_MSC_VER < 1300) && defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
||||
// Define _W64 macros to mark types changing their size, like intptr_t.
|
||||
#ifndef _W64
|
||||
# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300
|
||||
# define _W64 __w64
|
||||
# else
|
||||
# define _W64
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
// 7.18.1 Integer types
|
||||
|
||||
// 7.18.1.1 Exact-width integer types
|
||||
typedef __int8 int8_t;
|
||||
typedef __int16 int16_t;
|
||||
typedef __int32 int32_t;
|
||||
typedef __int64 int64_t;
|
||||
typedef unsigned __int8 uint8_t;
|
||||
typedef unsigned __int16 uint16_t;
|
||||
typedef unsigned __int32 uint32_t;
|
||||
typedef unsigned __int64 uint64_t;
|
||||
|
||||
// 7.18.1.2 Minimum-width integer types
|
||||
typedef int8_t int_least8_t;
|
||||
typedef int16_t int_least16_t;
|
||||
typedef int32_t int_least32_t;
|
||||
typedef int64_t int_least64_t;
|
||||
typedef uint8_t uint_least8_t;
|
||||
typedef uint16_t uint_least16_t;
|
||||
typedef uint32_t uint_least32_t;
|
||||
typedef uint64_t uint_least64_t;
|
||||
|
||||
// 7.18.1.3 Fastest minimum-width integer types
|
||||
typedef int8_t int_fast8_t;
|
||||
typedef int16_t int_fast16_t;
|
||||
typedef int32_t int_fast32_t;
|
||||
typedef int64_t int_fast64_t;
|
||||
typedef uint8_t uint_fast8_t;
|
||||
typedef uint16_t uint_fast16_t;
|
||||
typedef uint32_t uint_fast32_t;
|
||||
typedef uint64_t uint_fast64_t;
|
||||
|
||||
// 7.18.1.4 Integer types capable of holding object pointers
|
||||
#ifdef _WIN64 // [
|
||||
typedef __int64 intptr_t;
|
||||
typedef unsigned __int64 uintptr_t;
|
||||
#else // _WIN64 ][
|
||||
typedef _W64 int intptr_t;
|
||||
typedef _W64 unsigned int uintptr_t;
|
||||
#endif // _WIN64 ]
|
||||
|
||||
// 7.18.1.5 Greatest-width integer types
|
||||
typedef int64_t intmax_t;
|
||||
typedef uint64_t uintmax_t;
|
||||
|
||||
|
||||
// 7.18.2 Limits of specified-width integer types
|
||||
|
||||
#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259
|
||||
|
||||
// 7.18.2.1 Limits of exact-width integer types
|
||||
#define INT8_MIN ((int8_t)_I8_MIN)
|
||||
#define INT8_MAX _I8_MAX
|
||||
#define INT16_MIN ((int16_t)_I16_MIN)
|
||||
#define INT16_MAX _I16_MAX
|
||||
#define INT32_MIN ((int32_t)_I32_MIN)
|
||||
#define INT32_MAX _I32_MAX
|
||||
#define INT64_MIN ((int64_t)_I64_MIN)
|
||||
#define INT64_MAX _I64_MAX
|
||||
#define UINT8_MAX _UI8_MAX
|
||||
#define UINT16_MAX _UI16_MAX
|
||||
#define UINT32_MAX _UI32_MAX
|
||||
#define UINT64_MAX _UI64_MAX
|
||||
|
||||
// 7.18.2.2 Limits of minimum-width integer types
|
||||
#define INT_LEAST8_MIN INT8_MIN
|
||||
#define INT_LEAST8_MAX INT8_MAX
|
||||
#define INT_LEAST16_MIN INT16_MIN
|
||||
#define INT_LEAST16_MAX INT16_MAX
|
||||
#define INT_LEAST32_MIN INT32_MIN
|
||||
#define INT_LEAST32_MAX INT32_MAX
|
||||
#define INT_LEAST64_MIN INT64_MIN
|
||||
#define INT_LEAST64_MAX INT64_MAX
|
||||
#define UINT_LEAST8_MAX UINT8_MAX
|
||||
#define UINT_LEAST16_MAX UINT16_MAX
|
||||
#define UINT_LEAST32_MAX UINT32_MAX
|
||||
#define UINT_LEAST64_MAX UINT64_MAX
|
||||
|
||||
// 7.18.2.3 Limits of fastest minimum-width integer types
|
||||
#define INT_FAST8_MIN INT8_MIN
|
||||
#define INT_FAST8_MAX INT8_MAX
|
||||
#define INT_FAST16_MIN INT16_MIN
|
||||
#define INT_FAST16_MAX INT16_MAX
|
||||
#define INT_FAST32_MIN INT32_MIN
|
||||
#define INT_FAST32_MAX INT32_MAX
|
||||
#define INT_FAST64_MIN INT64_MIN
|
||||
#define INT_FAST64_MAX INT64_MAX
|
||||
#define UINT_FAST8_MAX UINT8_MAX
|
||||
#define UINT_FAST16_MAX UINT16_MAX
|
||||
#define UINT_FAST32_MAX UINT32_MAX
|
||||
#define UINT_FAST64_MAX UINT64_MAX
|
||||
|
||||
// 7.18.2.4 Limits of integer types capable of holding object pointers
|
||||
#ifdef _WIN64 // [
|
||||
# define INTPTR_MIN INT64_MIN
|
||||
# define INTPTR_MAX INT64_MAX
|
||||
# define UINTPTR_MAX UINT64_MAX
|
||||
#else // _WIN64 ][
|
||||
# define INTPTR_MIN INT32_MIN
|
||||
# define INTPTR_MAX INT32_MAX
|
||||
# define UINTPTR_MAX UINT32_MAX
|
||||
#endif // _WIN64 ]
|
||||
|
||||
// 7.18.2.5 Limits of greatest-width integer types
|
||||
#define INTMAX_MIN INT64_MIN
|
||||
#define INTMAX_MAX INT64_MAX
|
||||
#define UINTMAX_MAX UINT64_MAX
|
||||
|
||||
// 7.18.3 Limits of other integer types
|
||||
|
||||
#ifdef _WIN64 // [
|
||||
# define PTRDIFF_MIN _I64_MIN
|
||||
# define PTRDIFF_MAX _I64_MAX
|
||||
#else // _WIN64 ][
|
||||
# define PTRDIFF_MIN _I32_MIN
|
||||
# define PTRDIFF_MAX _I32_MAX
|
||||
#endif // _WIN64 ]
|
||||
|
||||
#define SIG_ATOMIC_MIN INT_MIN
|
||||
#define SIG_ATOMIC_MAX INT_MAX
|
||||
|
||||
#ifndef SIZE_MAX // [
|
||||
# ifdef _WIN64 // [
|
||||
# define SIZE_MAX _UI64_MAX
|
||||
# else // _WIN64 ][
|
||||
# define SIZE_MAX _UI32_MAX
|
||||
# endif // _WIN64 ]
|
||||
#endif // SIZE_MAX ]
|
||||
|
||||
// WCHAR_MIN and WCHAR_MAX are also defined in <wchar.h>
|
||||
#ifndef WCHAR_MIN // [
|
||||
# define WCHAR_MIN 0
|
||||
#endif // WCHAR_MIN ]
|
||||
#ifndef WCHAR_MAX // [
|
||||
# define WCHAR_MAX _UI16_MAX
|
||||
#endif // WCHAR_MAX ]
|
||||
|
||||
#define WINT_MIN 0
|
||||
#define WINT_MAX _UI16_MAX
|
||||
|
||||
#endif // __STDC_LIMIT_MACROS ]
|
||||
|
||||
|
||||
// 7.18.4 Limits of other integer types
|
||||
|
||||
#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260
|
||||
|
||||
// 7.18.4.1 Macros for minimum-width integer constants
|
||||
|
||||
#define INT8_C(val) val##i8
|
||||
#define INT16_C(val) val##i16
|
||||
#define INT32_C(val) val##i32
|
||||
#define INT64_C(val) val##i64
|
||||
|
||||
#define UINT8_C(val) val##ui8
|
||||
#define UINT16_C(val) val##ui16
|
||||
#define UINT32_C(val) val##ui32
|
||||
#define UINT64_C(val) val##ui64
|
||||
|
||||
// 7.18.4.2 Macros for greatest-width integer constants
|
||||
#define INTMAX_C INT64_C
|
||||
#define UINTMAX_C UINT64_C
|
||||
|
||||
#endif // __STDC_CONSTANT_MACROS ]
|
||||
|
||||
|
||||
#endif // _MSC_STDINT_H_ ]
|
||||
@@ -76,7 +76,7 @@ class AIPlayerBaka: public AIPlayer{
|
||||
virtual int chooseBlockers();
|
||||
virtual int canFirstStrikeKill(MTGCardInstance * card, MTGCardInstance *ennemy);
|
||||
virtual int effectBadOrGood(MTGCardInstance * card, int mode = MODE_PUTINTOPLAY, TargetChooser * tc = NULL);
|
||||
virtual bool shouldAIForceAttack(MTGCardInstance* card, bool globalAttack);
|
||||
|
||||
|
||||
// returns 1 if the AI algorithm supports a given cost (ex:simple mana cost), 0 otherwise (ex: cost involves Sacrificing a target)
|
||||
virtual int CanHandleCost(ManaCost * cost, MTGCardInstance * card = NULL);
|
||||
|
||||
@@ -21,10 +21,10 @@
|
||||
|
||||
#include "GameOptions.h"
|
||||
|
||||
#if !defined(WP8) && !defined(QT_CONFIG)
|
||||
#include <boost/shared_ptr.hpp>
|
||||
#include <boost/scoped_ptr.hpp>
|
||||
#endif
|
||||
//#if !defined(WP8) && !defined(QT_CONFIG)
|
||||
//#include <boost/shared_ptr.hpp>
|
||||
//#include <boost/scoped_ptr.hpp>
|
||||
//#endif
|
||||
|
||||
#if defined (WP8) || defined (IOS) || defined (ANDROID) || defined (QT_CONFIG) || defined (SDL_CONFIG)
|
||||
#define TOUCH_ENABLED
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#include <map>
|
||||
#include <vector>
|
||||
using namespace std;
|
||||
#include "../../../JGE/src/tinyxml/tinyxml.h"
|
||||
#include "tinyxml.h"
|
||||
#include <JGui.h>
|
||||
class GameObserver;
|
||||
class MTGDeck;
|
||||
|
||||
@@ -26,7 +26,7 @@ public:
|
||||
TYPE_EQUIPMENT = 11,
|
||||
TYPE_AURA = 12,
|
||||
TYPE_PLANESWALKER = 13,
|
||||
TYPE_KINDRED = 14,
|
||||
TYPE_TRIBAL = 14,
|
||||
TYPE_PLANE = 15,
|
||||
TYPE_SCHEME = 16,
|
||||
TYPE_VANGUARD = 17,
|
||||
|
||||
@@ -315,7 +315,7 @@ public:
|
||||
|
||||
int loadMatches(WSrcCards* src, bool all = false)
|
||||
{
|
||||
return loadMatches(src, all);
|
||||
return active->loadMatches(src, all);
|
||||
}
|
||||
|
||||
int addRandomCards(MTGDeck * i, int howmany = 1)
|
||||
|
||||
@@ -201,4 +201,7 @@ public:
|
||||
void FormatText(string &s, vector<string>& output, int customLen = 0);
|
||||
};
|
||||
|
||||
#if defined (PSP)
|
||||
void SwizzlePlot(u8* out, PIXEL_TYPE color, int i, int j, unsigned int width);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#ifndef WRESOURCE_FWD_H
|
||||
#define WRESOURCE_FWD_H
|
||||
|
||||
#if (__cplusplus > 199711L)
|
||||
#if (__cplusplus > 199711L) || (_MSC_VER >= 1700)
|
||||
#include <memory>
|
||||
typedef std::shared_ptr<JQuad> JQuadPtr;
|
||||
#elif defined(QT_CONFIG)
|
||||
|
||||
@@ -14,7 +14,7 @@ Mod by: Vitty85
|
||||
/* Wagic versions */
|
||||
#define WAGIC_VERSION_MAJOR 0
|
||||
#define WAGIC_VERSION_MEDIUM 25
|
||||
#define WAGIC_VERSION_MINOR 5
|
||||
#define WAGIC_VERSION_MINOR 3
|
||||
|
||||
#define VERSION_DOT(a, b, c) a ##.## b ##.## c
|
||||
#define VERSION_WITHOUT_DOT(a, b, c) a ## b ## c
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
|
||||
#include "limits.h"
|
||||
|
||||
#if defined (_DEBUG) && defined (WIN32) && (!defined LINUX)
|
||||
#if defined (_DEBUG) && defined (WIN32) && (!defined LINUX) && (!defined __GNUG__)
|
||||
#include "crtdbg.h"
|
||||
#define NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
|
||||
#else
|
||||
|
||||
+152
-325
@@ -46,9 +46,9 @@ int OrderedAIAction::getEfficiency(AADamager * aad)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(p && target)
|
||||
if(p == target->controller())
|
||||
return 0;
|
||||
if(p && target)
|
||||
if(p == target->controller())
|
||||
return 0;
|
||||
|
||||
if (dTarget && aad && (aad->getDamage() == dTarget->toughness))
|
||||
return 100;
|
||||
@@ -126,13 +126,13 @@ int OrderedAIAction::getEfficiency()
|
||||
break;
|
||||
|
||||
if (!coreAbilityCardTarget->regenerateTokens && currentPhase == MTG_PHASE_COMBATBLOCKERS
|
||||
&& (coreAbilityCardTarget->defenser || coreAbilityCardTarget->blockers.size())
|
||||
)
|
||||
&& (coreAbilityCardTarget->defenser || coreAbilityCardTarget->blockers.size())
|
||||
)
|
||||
{
|
||||
efficiency = 95;
|
||||
}
|
||||
//TODO If the card is the target of a damage spell
|
||||
break;
|
||||
//TODO If the card is the target of a damage spell
|
||||
break;
|
||||
}
|
||||
case MTGAbility::STANDARD_PREVENT:
|
||||
{
|
||||
@@ -272,7 +272,7 @@ int OrderedAIAction::getEfficiency()
|
||||
}
|
||||
case MTGAbility::STANDARD_PUMP:
|
||||
{
|
||||
efficiency = 0;
|
||||
efficiency = 0;
|
||||
if(!coreAbilityCardTarget)
|
||||
break;
|
||||
if(!target && !dynamic_cast<ALord*> (a) && (((MTGCardInstance *)a->source)->hasSubtype(Subtypes::TYPE_AURA) || ((MTGCardInstance *)a->source)->hasSubtype(Subtypes::TYPE_EQUIPMENT)))
|
||||
@@ -296,9 +296,9 @@ int OrderedAIAction::getEfficiency()
|
||||
int suggestion = af.abilityEfficiency(a, p, MODE_ABILITY);
|
||||
//i do not set a starting eff. on this ability, this allows Ai to sometimes randomly do it as it normally does.
|
||||
int currentPhase = g->getCurrentGamePhase();
|
||||
if ((currentPhase == MTG_PHASE_COMBATBLOCKERS) || (currentPhase == MTG_PHASE_COMBATATTACKERS))
|
||||
if ((currentPhase == MTG_PHASE_COMBATBLOCKERS) || (currentPhase == MTG_PHASE_COMBATATTACKERS))
|
||||
{
|
||||
if (suggestion == BAKA_EFFECT_GOOD && target->controller() == p)
|
||||
if (suggestion == BAKA_EFFECT_GOOD && target->controller() == p)
|
||||
{
|
||||
if(coreAbilityCardTarget->defenser || coreAbilityCardTarget->blockers.size())
|
||||
{
|
||||
@@ -350,23 +350,23 @@ int OrderedAIAction::getEfficiency()
|
||||
break;
|
||||
}
|
||||
case MTGAbility::MANA_PRODUCER://only way to hit this condition is nested manaabilities, ai skips manaproducers by defualt when finding an ability to use.
|
||||
{
|
||||
AManaProducer * manamaker = dynamic_cast<AManaProducer*>(a);
|
||||
GenericActivatedAbility * GAA = dynamic_cast<GenericActivatedAbility*>(ability);
|
||||
if(GAA)
|
||||
{
|
||||
AForeach * forMana = dynamic_cast<AForeach*>(GAA->ability);
|
||||
if (manamaker && forMana)
|
||||
{
|
||||
int outPut = forMana->checkActivation();
|
||||
if (ability->getCost() && outPut > int(ability->getCost()->getConvertedCost() +1) && currentPhase == MTG_PHASE_FIRSTMAIN && ability->source->controller()->game->hand->nb_cards > 1)
|
||||
efficiency = 60;//might be a bit random, but better than never using them.
|
||||
}
|
||||
}
|
||||
else
|
||||
efficiency = 0;
|
||||
break;
|
||||
}
|
||||
{
|
||||
AManaProducer * manamaker = dynamic_cast<AManaProducer*>(a);
|
||||
GenericActivatedAbility * GAA = dynamic_cast<GenericActivatedAbility*>(ability);
|
||||
if(GAA)
|
||||
{
|
||||
AForeach * forMana = dynamic_cast<AForeach*>(GAA->ability);
|
||||
if (manamaker && forMana)
|
||||
{
|
||||
int outPut = forMana->checkActivation();
|
||||
if (ability->getCost() && outPut > int(ability->getCost()->getConvertedCost() +1) && currentPhase == MTG_PHASE_FIRSTMAIN && ability->source->controller()->game->hand->nb_cards > 1)
|
||||
efficiency = 60;//might be a bit random, but better than never using them.
|
||||
}
|
||||
}
|
||||
else
|
||||
efficiency = 0;
|
||||
break;
|
||||
}
|
||||
case MTGAbility::STANDARDABILITYGRANT:
|
||||
{
|
||||
efficiency = 0;
|
||||
@@ -391,8 +391,8 @@ int OrderedAIAction::getEfficiency()
|
||||
}
|
||||
|
||||
if (!target->has(a->abilitygranted) && g->getCurrentGamePhase() == MTG_PHASE_COMBATBEGIN
|
||||
&& p == target->controller()
|
||||
)
|
||||
&& p == target->controller()
|
||||
)
|
||||
{
|
||||
efficiency += efficiencyModifier;
|
||||
}
|
||||
@@ -404,8 +404,8 @@ int OrderedAIAction::getEfficiency()
|
||||
}
|
||||
|
||||
if ((suggestion == BAKA_EFFECT_BAD && p == target->controller())
|
||||
|| (suggestion == BAKA_EFFECT_GOOD && p != target->controller())
|
||||
)
|
||||
|| (suggestion == BAKA_EFFECT_GOOD && p != target->controller())
|
||||
)
|
||||
{
|
||||
efficiency = 0;
|
||||
//stop giving trample to the players creatures.
|
||||
@@ -547,13 +547,13 @@ int OrderedAIAction::getEfficiency()
|
||||
}
|
||||
}
|
||||
if ((suggestion == BAKA_EFFECT_BAD && p == target->controller())
|
||||
|| (suggestion == BAKA_EFFECT_GOOD && p != target->controller()))
|
||||
|| (suggestion == BAKA_EFFECT_GOOD && p != target->controller()))
|
||||
{
|
||||
efficiency = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
//without a base to start with Wrand % 5 almost always returns 0.
|
||||
//without a base to start with Wrand % 5 almost always returns 0.
|
||||
efficiency = 10 + (owner->getRandomGenerator()->random() % 20); //Small percentage of chance for unknown abilities
|
||||
}
|
||||
}
|
||||
@@ -684,7 +684,7 @@ int OrderedAIAction::getEfficiency()
|
||||
{
|
||||
AIPlayer * chk = (AIPlayer*)p;
|
||||
if(may->ability && may->ability->getActionTc() && chk->chooseTarget(may->ability->getActionTc(),NULL,NULL,true))
|
||||
efficiency = 50 + (owner->getRandomGenerator()->random() % 50);
|
||||
efficiency = 50 + (owner->getRandomGenerator()->random() % 50);
|
||||
}
|
||||
if (p->game->hand->nb_cards == 0)
|
||||
efficiency = (int) ((float) efficiency * 1.3); //increase chance of using ability if hand is empty
|
||||
@@ -726,12 +726,12 @@ int OrderedAIAction::getEfficiency()
|
||||
if(ability->source->hasType(Subtypes::TYPE_PLANESWALKER) || ability->source->hasType(Subtypes::TYPE_BATTLE))
|
||||
efficiency += 50;
|
||||
else if(ability->source->hasType(Subtypes::TYPE_LAND))
|
||||
{ // probably a shockland, don't pay life if hand is empty
|
||||
if (p->life<=2)
|
||||
// check that's not a manland(like Celestial Colonnade)
|
||||
if(efficiency < 50)
|
||||
efficiency = 0;
|
||||
}
|
||||
{ // probably a shockland, don't pay life if hand is empty
|
||||
if (p->life<=2)
|
||||
// check that's not a manland(like Celestial Colonnade)
|
||||
if(efficiency < 50)
|
||||
efficiency = 0;
|
||||
}
|
||||
}
|
||||
|
||||
SAFE_DELETE(transAbility);
|
||||
@@ -800,8 +800,8 @@ int OrderedAIAction::getRevealedEfficiency(MTGAbility * ability2)
|
||||
break;
|
||||
|
||||
if (!coreAbilityCardTarget->regenerateTokens && currentPhase == MTG_PHASE_COMBATBLOCKERS
|
||||
&& (coreAbilityCardTarget->defenser || coreAbilityCardTarget->blockers.size())
|
||||
)
|
||||
&& (coreAbilityCardTarget->defenser || coreAbilityCardTarget->blockers.size())
|
||||
)
|
||||
{
|
||||
eff2 = 95;
|
||||
}
|
||||
@@ -1010,20 +1010,20 @@ int OrderedAIAction::getRevealedEfficiency(MTGAbility * ability2)
|
||||
break;
|
||||
}
|
||||
case MTGAbility::MANA_PRODUCER://only way to hit this condition is nested manaabilities, ai skips manaproducers by defualt when finding an ability to use.
|
||||
{
|
||||
AManaProducer * manamaker = dynamic_cast<AManaProducer*>(a);
|
||||
GenericActivatedAbility * GAA = dynamic_cast<GenericActivatedAbility*>(ability2);
|
||||
AForeach * forMana = dynamic_cast<AForeach*>(GAA->ability);
|
||||
if (manamaker && forMana)
|
||||
{
|
||||
AManaProducer * manamaker = dynamic_cast<AManaProducer*>(a);
|
||||
GenericActivatedAbility * GAA = dynamic_cast<GenericActivatedAbility*>(ability2);
|
||||
AForeach * forMana = dynamic_cast<AForeach*>(GAA->ability);
|
||||
if (manamaker && forMana)
|
||||
{
|
||||
int outPut = forMana->checkActivation();
|
||||
if (ability2->getCost() && outPut > int(ability2->getCost()->getConvertedCost() +1) && currentPhase == MTG_PHASE_FIRSTMAIN && ability2->source->controller()->game->hand->nb_cards > 1)
|
||||
eff2 = 60;//might be a bit random, but better than never using them.
|
||||
}
|
||||
else
|
||||
eff2 = 0;
|
||||
break;
|
||||
int outPut = forMana->checkActivation();
|
||||
if (ability2->getCost() && outPut > int(ability2->getCost()->getConvertedCost() +1) && currentPhase == MTG_PHASE_FIRSTMAIN && ability2->source->controller()->game->hand->nb_cards > 1)
|
||||
eff2 = 60;//might be a bit random, but better than never using them.
|
||||
}
|
||||
else
|
||||
eff2 = 0;
|
||||
break;
|
||||
}
|
||||
case MTGAbility::STANDARDABILITYGRANT:
|
||||
{
|
||||
eff2 = 0;
|
||||
@@ -1048,8 +1048,8 @@ int OrderedAIAction::getRevealedEfficiency(MTGAbility * ability2)
|
||||
}
|
||||
|
||||
if (!target->has(a->abilitygranted) && g->getCurrentGamePhase() == MTG_PHASE_COMBATBEGIN
|
||||
&& p == target->controller()
|
||||
)
|
||||
&& p == target->controller()
|
||||
)
|
||||
{
|
||||
eff2 += eff2Modifier;
|
||||
}
|
||||
@@ -1061,8 +1061,8 @@ int OrderedAIAction::getRevealedEfficiency(MTGAbility * ability2)
|
||||
}
|
||||
|
||||
if ((suggestion == BAKA_EFFECT_BAD && p == target->controller())
|
||||
|| (suggestion == BAKA_EFFECT_GOOD && p != target->controller())
|
||||
)
|
||||
|| (suggestion == BAKA_EFFECT_GOOD && p != target->controller())
|
||||
)
|
||||
{
|
||||
eff2 = 0;
|
||||
//stop giving trample to the players creatures.
|
||||
@@ -1203,13 +1203,13 @@ int OrderedAIAction::getRevealedEfficiency(MTGAbility * ability2)
|
||||
}
|
||||
}
|
||||
if ((suggestion == BAKA_EFFECT_BAD && p == target->controller())
|
||||
|| (suggestion == BAKA_EFFECT_GOOD && p != target->controller()))
|
||||
|| (suggestion == BAKA_EFFECT_GOOD && p != target->controller()))
|
||||
{
|
||||
eff2 = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
//without a base to start with Wrand % 5 almost always returns 0.
|
||||
//without a base to start with Wrand % 5 almost always returns 0.
|
||||
eff2 = 10 + (owner->getRandomGenerator()->random() % 20); //Small percentage of chance for unknown abilities
|
||||
}
|
||||
}
|
||||
@@ -1299,7 +1299,7 @@ int OrderedAIAction::getRevealedEfficiency(MTGAbility * ability2)
|
||||
{
|
||||
AIPlayer * chk = (AIPlayer*)p;
|
||||
if(may->ability && may->ability->getActionTc() && chk->chooseTarget(may->ability->getActionTc(),NULL,NULL,true))
|
||||
eff2 = 50 + (owner->getRandomGenerator()->random() % 50);
|
||||
eff2 = 50 + (owner->getRandomGenerator()->random() % 50);
|
||||
}
|
||||
if (p->game->hand->nb_cards == 0)
|
||||
eff2 = (int) ((float) eff2 * 1.3); //increase chance of using ability if hand is empty
|
||||
@@ -1351,7 +1351,7 @@ MTGCardInstance * AIPlayerBaka::chooseCard(TargetChooser * tc, MTGCardInstance *
|
||||
MTGPlayerCards * playerZones = source->controller()->game;
|
||||
if (comboHint && comboHint->cardTargets.size())
|
||||
{
|
||||
tc = GetComboTc(observer,tc);
|
||||
tc = GetComboTc(observer,tc);
|
||||
}
|
||||
for(int players = 0; players < 2;++players)
|
||||
{
|
||||
@@ -1376,9 +1376,9 @@ MTGCardInstance * AIPlayerBaka::chooseCard(TargetChooser * tc, MTGCardInstance *
|
||||
|
||||
bool AIPlayerBaka::payTheManaCost(ManaCost * cost, int anytypeofmana, MTGCardInstance * target,vector<MTGAbility*>gotPayments)
|
||||
{
|
||||
DebugTrace("AIPlayerBaka: AI attempting to pay a mana cost." << endl
|
||||
<< "- Target: " << (target ? target->name : "None" ) << endl
|
||||
<< "- Cost: " << (cost ? cost->toString() : "NULL") );
|
||||
DebugTrace("AIPlayerBaka: AI attempting to pay a mana cost." << endl
|
||||
<< "- Target: " << (target ? target->name : "None" ) << endl
|
||||
<< "- Cost: " << (cost ? cost->toString() : "NULL") );
|
||||
|
||||
if (!cost)
|
||||
{
|
||||
@@ -1450,7 +1450,7 @@ bool AIPlayerBaka::payTheManaCost(ManaCost * cost, int anytypeofmana, MTGCardIns
|
||||
}
|
||||
}
|
||||
if(k == gotPayments.size()-1)//only add it once, and at the end.
|
||||
paid->add(this->getManaPool());//incase some of our payments were mana already in the pool/.
|
||||
paid->add(this->getManaPool());//incase some of our payments were mana already in the pool/.
|
||||
if(paid->canAfford(cost, anytypeofmana))
|
||||
{
|
||||
if((!cost->hasX() && !cost->hasAnotherCost()) || k == gotPayments.size()-1)
|
||||
@@ -1902,7 +1902,7 @@ int AIPlayerBaka::CanHandleCost(ManaCost * cost, MTGCardInstance * card)
|
||||
{
|
||||
ec->costs[i]->setSource(card);
|
||||
if(!ec->costs[i]->tc->countValidTargets())
|
||||
return 0;
|
||||
return 0;
|
||||
if(!chooseCard(ec->costs[i]->tc,card))
|
||||
return 0;
|
||||
}
|
||||
@@ -1981,7 +1981,7 @@ int AIPlayerBaka::createAbilityTargets(MTGAbility * a, MTGCardInstance * c, Rank
|
||||
|
||||
MTGCardInstance * cTargeting = dynamic_cast<MTGCardInstance*>(potentialTargets[0]);
|
||||
if(cTargeting)
|
||||
check = NEW OrderedAIAction(this, a,c,cTargeting);
|
||||
check = NEW OrderedAIAction(this, a,c,cTargeting);
|
||||
|
||||
Player * pTargeting = dynamic_cast<Player*>(potentialTargets[0]);
|
||||
if(pTargeting)
|
||||
@@ -2084,17 +2084,17 @@ int AIPlayerBaka::selectAbility()
|
||||
}
|
||||
}
|
||||
}
|
||||
// Try Deck hints first
|
||||
if (selectHintAbility())
|
||||
// Try Deck hints first
|
||||
if (selectHintAbility())
|
||||
return 1;
|
||||
|
||||
if(observer->mLayers->stackLayer()->lastActionController == this)
|
||||
{
|
||||
//this is here for 2 reasons, MTG rules state that priority is passed with each action.
|
||||
//without this ai is able to chain cast {t}:damage:1 target(creature) from everything it can all at once.
|
||||
//this not only is illegal but cause ai to waste abilities ei:all damage:1 on a single 1/1 creature.
|
||||
return 1;
|
||||
}
|
||||
if(observer->mLayers->stackLayer()->lastActionController == this)
|
||||
{
|
||||
//this is here for 2 reasons, MTG rules state that priority is passed with each action.
|
||||
//without this ai is able to chain cast {t}:damage:1 target(creature) from everything it can all at once.
|
||||
//this not only is illegal but cause ai to waste abilities ei:all damage:1 on a single 1/1 creature.
|
||||
return 1;
|
||||
}
|
||||
|
||||
RankingContainer ranking;
|
||||
list<int>::iterator it;
|
||||
@@ -2504,8 +2504,8 @@ int AIPlayerBaka::chooseTarget(TargetChooser * _tc, Player * forceTarget,MTGCard
|
||||
{
|
||||
if(observer->mExtraPayment)
|
||||
{
|
||||
observer->mExtraPayment->action->CheckUserInput(JGE_BTN_SEC);
|
||||
observer->mExtraPayment = NULL;
|
||||
observer->mExtraPayment->action->CheckUserInput(JGE_BTN_SEC);
|
||||
observer->mExtraPayment = NULL;
|
||||
}
|
||||
//there should never be a case where a extra cost target selection is happening at the same time as this..
|
||||
//extracost uses "chooseCard()" to determine its targets.
|
||||
@@ -2522,7 +2522,7 @@ int AIPlayerBaka::chooseTarget(TargetChooser * _tc, Player * forceTarget,MTGCard
|
||||
assert(tc);
|
||||
if (comboHint && comboHint->cardTargets.size())
|
||||
{
|
||||
tc = GetComboTc(observer,tc);
|
||||
tc = GetComboTc(observer,tc);
|
||||
}
|
||||
if(!checkOnly && tc->maxtargets > 1)
|
||||
{
|
||||
@@ -2619,7 +2619,7 @@ int AIPlayerBaka::chooseTarget(TargetChooser * _tc, Player * forceTarget,MTGCard
|
||||
}
|
||||
}
|
||||
if(playerTargetedZone > 1)
|
||||
target = target->opponent();
|
||||
target = target->opponent();
|
||||
playerTargetedZone--;
|
||||
}
|
||||
if (potentialTargets.size())
|
||||
@@ -2757,8 +2757,8 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
|
||||
payAlternative = NONE;
|
||||
gotPayments = vector<MTGAbility*>();
|
||||
//canplayfromgraveyard
|
||||
while ((card = cd.nextmatch(game->graveyard, card)))
|
||||
{
|
||||
while ((card = cd.nextmatch(game->graveyard, card)))
|
||||
{
|
||||
bool hasFlashback = false;
|
||||
|
||||
if(card->getManaCost())
|
||||
@@ -2784,11 +2784,11 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
|
||||
|
||||
/*// Case were manacost is equal to flashback cost, if they are different the AI hangs
|
||||
if (hasFlashback && (card->getManaCost() != card->getManaCost()->getFlashback()))
|
||||
continue;
|
||||
continue;
|
||||
|
||||
// Case were manacost is equal to retrace cost, if they are different the AI hangs
|
||||
if (hasRetrace && (card->getManaCost() != card->getManaCost()->getRetrace()))
|
||||
continue;*/
|
||||
continue;*/
|
||||
|
||||
if (card->hasType(Subtypes::TYPE_LAND))
|
||||
{
|
||||
@@ -2834,7 +2834,7 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
|
||||
else
|
||||
{
|
||||
nextCardToPlay = NULL;
|
||||
continue;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
int currentCost = card->getManaCost()->getConvertedCost();
|
||||
@@ -3005,7 +3005,7 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
|
||||
else
|
||||
{
|
||||
nextCardToPlay = NULL;
|
||||
continue;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
int currentCost = card->getManaCost()->getConvertedCost();
|
||||
@@ -3013,7 +3013,7 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
|
||||
gotPayments.clear();
|
||||
if((!pMana->canAfford(card->getManaCost(),0) || card->getManaCost()->getKicker()))
|
||||
gotPayments = canPayMana(card,card->getManaCost(),card->has(Constants::ANYTYPEOFMANA));
|
||||
//for preformence reason we only look for specific mana if the payment couldn't be made with pmana.
|
||||
//for preformence reason we only look for specific mana if the payment couldn't be made with pmana.
|
||||
if ((currentCost > maxCost || hasX) && (gotPayments.size() || pMana->canAfford(card->getManaCost(),card->has(Constants::ANYTYPEOFMANA))))
|
||||
{
|
||||
TargetChooserFactory tcf(observer);
|
||||
@@ -3143,7 +3143,7 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
|
||||
else
|
||||
{
|
||||
nextCardToPlay = NULL;
|
||||
continue;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
int currentCost = card->getManaCost()->getConvertedCost();
|
||||
@@ -3151,7 +3151,7 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
|
||||
gotPayments.clear();
|
||||
if((!pMana->canAfford(card->getManaCost(),0) || card->getManaCost()->getKicker()))
|
||||
gotPayments = canPayMana(card,card->getManaCost(),card->has(Constants::ANYTYPEOFMANA));
|
||||
//for preformence reason we only look for specific mana if the payment couldn't be made with pmana.
|
||||
//for preformence reason we only look for specific mana if the payment couldn't be made with pmana.
|
||||
if ((currentCost > maxCost || hasX) && (gotPayments.size() || pMana->canAfford(card->getManaCost(),card->has(Constants::ANYTYPEOFMANA))))
|
||||
{
|
||||
TargetChooserFactory tcf(observer);
|
||||
@@ -3275,7 +3275,7 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
|
||||
|
||||
//PLaneswalkers are now legendary so this is redundant
|
||||
//if (card->hasType(Subtypes::TYPE_PLANESWALKER) && card->types.size() > 0 && game->inPlay->hasTypeSpecificInt(Subtypes::TYPE_PLANESWALKER,card->types[1]))
|
||||
//continue;
|
||||
//continue;
|
||||
|
||||
if(hints && hints->HintSaysItsForCombo(observer,card))
|
||||
{
|
||||
@@ -3294,7 +3294,7 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
|
||||
else
|
||||
{
|
||||
nextCardToPlay = NULL;
|
||||
continue;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
int currentCost = card->getManaCost()->getConvertedCost();
|
||||
@@ -3487,7 +3487,7 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
|
||||
if(hints && hints->HintSaysItsForCombo(observer,nextCardToPlay))
|
||||
{
|
||||
DebugTrace(" AI wants to play a card that belongs to a combo.");
|
||||
nextCardToPlay = NULL;
|
||||
nextCardToPlay = NULL;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -3574,7 +3574,7 @@ int AIPlayerBaka::computeActions()
|
||||
if(doThis >= 0)
|
||||
{
|
||||
if(object->abilitiesMenu->isMultipleChoice)
|
||||
observer->mLayers->actionLayer()->ButtonPressedOnMultipleChoice(doThis);
|
||||
observer->mLayers->actionLayer()->ButtonPressedOnMultipleChoice(doThis);
|
||||
else
|
||||
observer->mLayers->actionLayer()->doReactTo(doThis);
|
||||
}
|
||||
@@ -3985,16 +3985,16 @@ int AIPlayerBaka::getCreaturesInfo(Player * player, int neededInfo, int untapMod
|
||||
|
||||
int AIPlayerBaka::chooseAttackers()
|
||||
{
|
||||
int myCreatures = getCreaturesInfo(this, INFO_NBCREATURES, -1, 1);
|
||||
if (myCreatures < 1)
|
||||
return 0;
|
||||
int myCreatures = getCreaturesInfo(this, INFO_NBCREATURES, -1, 1);
|
||||
if (myCreatures < 1)
|
||||
return 0;
|
||||
//Attack with all creatures
|
||||
//How much damage can the other player do during his next Attack ?
|
||||
int opponentForce = getCreaturesInfo(opponent(), INFO_CREATURESPOWER);
|
||||
int opponentCreatures = getCreaturesInfo(opponent(), INFO_NBCREATURES);
|
||||
int myForce = getCreaturesInfo(this, INFO_CREATURESPOWER, -1, 1);
|
||||
if(opponent()->life < 5)
|
||||
agressivity += 31;
|
||||
if(opponent()->life < 5)
|
||||
agressivity += 31;
|
||||
|
||||
bool attack = ((myCreatures > opponentCreatures) || (myForce > opponentForce) || (myForce > 2 * opponent()->life));
|
||||
if (agressivity > 80 && !attack && life > opponentForce)
|
||||
@@ -4002,7 +4002,7 @@ int AIPlayerBaka::chooseAttackers()
|
||||
opponentCreatures = getCreaturesInfo(opponent(), INFO_NBCREATURES, -1);
|
||||
opponentForce = getCreaturesInfo(opponent(), INFO_CREATURESPOWER, -1);
|
||||
attack = (myCreatures >= opponentCreatures && myForce > opponentForce)
|
||||
|| (myForce > opponentForce) || (myForce > opponent()->life) || ((life - opponentForce) > 30) ;
|
||||
|| (myForce > opponentForce) || (myForce > opponent()->life) || ((life - opponentForce) > 30) ;
|
||||
}
|
||||
printf("Choose attackers : %i %i %i %i -> %i\n", opponentForce, opponentCreatures, myForce, myCreatures, attack);
|
||||
|
||||
@@ -4012,13 +4012,16 @@ int AIPlayerBaka::chooseAttackers()
|
||||
MTGCardInstance * card = NULL;
|
||||
while ((card = cd.nextmatch(game->inPlay, card)))
|
||||
{
|
||||
if (shouldAIForceAttack(card, attack))
|
||||
if ((hints && hints->HintSaysAlwaysAttack(observer, card)) || card->has(Constants::UNBLOCKABLE))
|
||||
{
|
||||
if (card->attackCost)
|
||||
if (!card->isAttacker())
|
||||
{
|
||||
MTGAbility* a = observer->mLayers->actionLayer()->getAbility(MTGAbility::ATTACK_COST);
|
||||
doAbility(a, card);
|
||||
observer->cardClick(card, MTGAbility::ATTACK_COST);
|
||||
if (card->attackCost)
|
||||
{
|
||||
MTGAbility * a = observer->mLayers->actionLayer()->getAbility(MTGAbility::ATTACK_COST);
|
||||
doAbility(a,card);
|
||||
observer->cardClick(card, MTGAbility::ATTACK_COST);
|
||||
}
|
||||
}
|
||||
observer->cardClick(card, MTGAbility::MTG_ATTACK_RULE);
|
||||
}
|
||||
@@ -4049,76 +4052,6 @@ int AIPlayerBaka::chooseAttackers()
|
||||
return 1;
|
||||
}
|
||||
|
||||
bool AIPlayerBaka::shouldAIForceAttack(MTGCardInstance* card, bool globalAttack)
|
||||
{
|
||||
if (globalAttack)
|
||||
return true;
|
||||
|
||||
if (!card || card->isAttacker())
|
||||
return false;
|
||||
|
||||
if (hints)
|
||||
{
|
||||
if (hints->HintSaysDontAttack(observer, card))
|
||||
return false;
|
||||
if (hints->HintSaysAlwaysAttack(observer, card))
|
||||
return true;
|
||||
}
|
||||
|
||||
if (card->has(Constants::UNBLOCKABLE))
|
||||
return true;
|
||||
|
||||
// Flags for opponent defenses
|
||||
bool oppHasShadow = false;
|
||||
bool oppHasAirDefense = false;
|
||||
bool oppHasHorsemanship = false;
|
||||
bool oppHasBlackOrArtifact = false;
|
||||
bool oppHasMatchingColorOrArtifact = false;
|
||||
|
||||
MTGCardInstance* oppCard = NULL;
|
||||
CardDescriptor desc;
|
||||
desc.init();
|
||||
desc.setType("creature");
|
||||
|
||||
while ((oppCard = desc.nextmatch(opponent()->game->inPlay, oppCard)))
|
||||
{
|
||||
if (oppCard->isTapped())
|
||||
continue;
|
||||
|
||||
if (oppCard->has(Constants::SHADOW))
|
||||
oppHasShadow = true;
|
||||
if (oppCard->has(Constants::FLYING) || oppCard->has(Constants::REACH))
|
||||
oppHasAirDefense = true;
|
||||
if (oppCard->has(Constants::HORSEMANSHIP))
|
||||
oppHasHorsemanship = true;
|
||||
|
||||
if (oppCard->hasColor(Constants::MTG_COLOR_BLACK) || oppCard->hasType("Artifact"))
|
||||
oppHasBlackOrArtifact = true;
|
||||
|
||||
// Intimidate check: artifact or shares color
|
||||
if (oppCard->hasType("Artifact") || (oppCard->colors & card->colors))
|
||||
oppHasMatchingColorOrArtifact = true;
|
||||
}
|
||||
|
||||
// Decision logic based on evasion
|
||||
if ((card->has(Constants::SHADOW) && !oppHasShadow) ||
|
||||
(card->has(Constants::FLYING) && !oppHasAirDefense) ||
|
||||
(card->has(Constants::HORSEMANSHIP) && !oppHasHorsemanship) ||
|
||||
(card->has(Constants::FEAR) && !oppHasBlackOrArtifact) ||
|
||||
(card->has(Constants::INTIMIDATE) && !oppHasMatchingColorOrArtifact))
|
||||
return true;
|
||||
|
||||
// Landwalk abilities
|
||||
if ((card->has(Constants::SWAMPWALK) && opponent()->game->inPlay->hasType("Swamp")) ||
|
||||
(card->has(Constants::ISLANDWALK) && opponent()->game->inPlay->hasType("Island")) ||
|
||||
(card->has(Constants::FORESTWALK) && opponent()->game->inPlay->hasType("Forest")) ||
|
||||
(card->has(Constants::MOUNTAINWALK) && opponent()->game->inPlay->hasType("Mountain")) ||
|
||||
(card->has(Constants::PLAINSWALK) && opponent()->game->inPlay->hasType("Plains")))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Can I first strike my oponent and get away with murder ? */
|
||||
int AIPlayerBaka::canFirstStrikeKill(MTGCardInstance * card, MTGCardInstance *ennemy)
|
||||
{
|
||||
@@ -4140,16 +4073,14 @@ int AIPlayerBaka::chooseBlockers()
|
||||
//Should not block during my own turn...
|
||||
if (observer->currentPlayer == this)
|
||||
return 0;
|
||||
|
||||
map<MTGCardInstance*, int> opponentsToughness;
|
||||
map<MTGCardInstance *, int> opponentsToughness;
|
||||
int opponentForce = getCreaturesInfo(opponent(), INFO_CREATURESPOWER);
|
||||
|
||||
//Initialize the list of opponent's attacking cards toughness
|
||||
CardDescriptor cdAttackers;
|
||||
cdAttackers.init();
|
||||
cdAttackers.setType("Creature");
|
||||
MTGCardInstance* card = NULL;
|
||||
|
||||
// Gather all attacking creatures and store their toughness
|
||||
MTGCardInstance * card = NULL;
|
||||
while ((card = cdAttackers.nextmatch(opponent()->game->inPlay, card)))
|
||||
{
|
||||
if (card->isAttacker())
|
||||
@@ -4163,12 +4094,11 @@ int AIPlayerBaka::chooseBlockers()
|
||||
cd.unsecureSetTapped(-1);
|
||||
card = NULL;
|
||||
|
||||
// First pass: auto-block top 3 threats if can be killed
|
||||
// We first try to block the major threats, those that are marked in the Top 3 of our stats
|
||||
while ((card = cd.nextmatch(game->inPlay, card)))
|
||||
{
|
||||
if (hints && hints->HintSaysDontBlock(observer, card))
|
||||
if(hints && hints->HintSaysDontBlock(observer,card))
|
||||
continue;
|
||||
|
||||
observer->cardClick(card, MTGAbility::MTG_BLOCK_RULE);
|
||||
int set = 0;
|
||||
while (!set)
|
||||
@@ -4179,8 +4109,8 @@ int AIPlayerBaka::chooseBlockers()
|
||||
}
|
||||
else
|
||||
{
|
||||
MTGCardInstance* attacker = card->defenser;
|
||||
map<MTGCardInstance*, int>::iterator it = opponentsToughness.find(attacker);
|
||||
MTGCardInstance * attacker = card->defenser;
|
||||
map<MTGCardInstance *, int>::iterator it = opponentsToughness.find(attacker);
|
||||
if (it == opponentsToughness.end())
|
||||
{
|
||||
opponentsToughness[attacker] = attacker->toughness;
|
||||
@@ -4195,7 +4125,7 @@ int AIPlayerBaka::chooseBlockers()
|
||||
{
|
||||
if (card->blockCost)
|
||||
{
|
||||
MTGAbility* a = observer->mLayers->actionLayer()->getAbility(MTGAbility::BLOCK_COST);
|
||||
MTGAbility * a = observer->mLayers->actionLayer()->getAbility(MTGAbility::BLOCK_COST);
|
||||
doAbility(a, card);
|
||||
observer->cardClick(card, MTGAbility::BLOCK_COST);
|
||||
}
|
||||
@@ -4205,13 +4135,13 @@ int AIPlayerBaka::chooseBlockers()
|
||||
}
|
||||
}
|
||||
|
||||
// Second pass: unassign if attacker is not expected to die
|
||||
//If blocking one of the major threats is not enough to kill it,
|
||||
// We change strategy, first we unassign its blockers that where assigned above
|
||||
card = NULL;
|
||||
while ((card = cd.nextmatch(game->inPlay, card)))
|
||||
{
|
||||
if (hints && hints->HintSaysDontBlock(observer, card))
|
||||
if(hints && hints->HintSaysDontBlock(observer,card))
|
||||
continue;
|
||||
|
||||
if (card->defenser && opponentsToughness[card->defenser] > 0)
|
||||
{
|
||||
while (card->defenser)
|
||||
@@ -4221,151 +4151,48 @@ int AIPlayerBaka::chooseBlockers()
|
||||
}
|
||||
}
|
||||
|
||||
// Third pass: intelligent blocking
|
||||
//Assign the "free" potential blockers to attacking creatures that are not blocked enough
|
||||
card = NULL;
|
||||
while ((card = cd.nextmatch(game->inPlay, card)))
|
||||
{
|
||||
if (hints && hints->HintSaysDontBlock(observer, card))
|
||||
if(hints && hints->HintSaysDontBlock(observer,card))
|
||||
continue;
|
||||
if (card->defenser)
|
||||
continue;
|
||||
|
||||
MTGCardInstance* bestAttacker = NULL;
|
||||
int bestScore = -1;
|
||||
|
||||
for (map<MTGCardInstance*, int>::iterator it = opponentsToughness.begin(); it != opponentsToughness.end(); ++it)
|
||||
if (!card->defenser)
|
||||
{
|
||||
MTGCardInstance* attacker = it->first;
|
||||
if (!attacker)
|
||||
continue;
|
||||
|
||||
int currentBlockers = (int)attacker->blockers.size();
|
||||
int totalAssignedDamage = 0;
|
||||
|
||||
std::list<MTGCardInstance*>::iterator itb;
|
||||
for (itb = attacker->blockers.begin(); itb != attacker->blockers.end(); ++itb)
|
||||
if (card->blockCost)
|
||||
{
|
||||
MTGCardInstance* blocker = *itb;
|
||||
if (blocker)
|
||||
totalAssignedDamage += blocker->power;
|
||||
MTGAbility * a = observer->mLayers->actionLayer()->getAbility(MTGAbility::BLOCK_COST);
|
||||
doAbility(a, card);
|
||||
}
|
||||
|
||||
int maxBlockers = 1;
|
||||
if (attacker->basicAbilities[Constants::MENACE]) maxBlockers = 2;
|
||||
if (attacker->basicAbilities[Constants::THREEBLOCKERS]) maxBlockers = 3;
|
||||
|
||||
if (totalAssignedDamage >= attacker->toughness || currentBlockers >= maxBlockers)
|
||||
continue;
|
||||
|
||||
bool canKill = (card->power >= attacker->toughness);
|
||||
bool survives = (card->toughness > attacker->power);
|
||||
|
||||
// Always block if can kill, regardless of survivability or damage
|
||||
if (canKill)
|
||||
observer->cardClick(card, MTGAbility::MTG_BLOCK_RULE);
|
||||
int set = 0;
|
||||
while (!set)
|
||||
{
|
||||
int score = attacker->power * 2 + attacker->toughness;
|
||||
if (getStats() && getStats()->isInTop(attacker, 3, false))
|
||||
score += 100;
|
||||
|
||||
if (score > bestScore)
|
||||
if (!card->defenser)
|
||||
{
|
||||
bestScore = score;
|
||||
bestAttacker = attacker;
|
||||
set = 1;
|
||||
}
|
||||
}
|
||||
// Block even if can't kill, but we survive and reduce damage
|
||||
else if (survives && attacker->power < life)
|
||||
{
|
||||
int score = attacker->power;
|
||||
if (getStats() && getStats()->isInTop(attacker, 3, false))
|
||||
score += 50;
|
||||
|
||||
if (score > bestScore)
|
||||
else
|
||||
{
|
||||
bestScore = score;
|
||||
bestAttacker = attacker;
|
||||
}
|
||||
}
|
||||
// Block to prevent lethal damage, even if we die
|
||||
else if (!survives && attacker->power >= life)
|
||||
{
|
||||
int score = attacker->power;
|
||||
if (getStats() && getStats()->isInTop(attacker, 3, false))
|
||||
score += 75;
|
||||
|
||||
if (score > bestScore)
|
||||
{
|
||||
bestScore = score;
|
||||
bestAttacker = attacker;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (bestAttacker)
|
||||
{
|
||||
int requiredBlockers = 1;
|
||||
if (bestAttacker->basicAbilities[Constants::MENACE]) requiredBlockers = 2;
|
||||
if (bestAttacker->basicAbilities[Constants::THREEBLOCKERS]) requiredBlockers = 3;
|
||||
|
||||
int currentBlockers = (int)bestAttacker->blockers.size();
|
||||
int currentBlockPower = 0;
|
||||
|
||||
std::list<MTGCardInstance*>::iterator itb;
|
||||
for (itb = bestAttacker->blockers.begin(); itb != bestAttacker->blockers.end(); ++itb)
|
||||
{
|
||||
MTGCardInstance* blocker = *itb;
|
||||
if (blocker)
|
||||
currentBlockPower += blocker->power;
|
||||
}
|
||||
|
||||
if (currentBlockers >= requiredBlockers || currentBlockPower >= bestAttacker->toughness)
|
||||
continue;
|
||||
|
||||
vector<MTGCardInstance*> extraBlockers;
|
||||
if (requiredBlockers > 1)
|
||||
{
|
||||
CardDescriptor cd2;
|
||||
cd2.init();
|
||||
cd2.setType("Creature");
|
||||
cd2.unsecureSetTapped(-1);
|
||||
MTGCardInstance* c2 = NULL;
|
||||
while ((c2 = cd2.nextmatch(game->inPlay, c2)))
|
||||
{
|
||||
if (c2 == card || c2->defenser || (hints && hints->HintSaysDontBlock(observer, c2)))
|
||||
continue;
|
||||
|
||||
int combinedPower = c2->power + card->power;
|
||||
bool combinedCanKill = (combinedPower >= bestAttacker->toughness);
|
||||
|
||||
if (combinedCanKill)
|
||||
MTGCardInstance * attacker = card->defenser;
|
||||
if (opponentsToughness[attacker] <= 0 || (card->toughness <= attacker->power && opponentForce * 2 < life && !canFirstStrikeKill(card, attacker)) || attacker->nbOpponents() > 1)
|
||||
{
|
||||
extraBlockers.push_back(c2);
|
||||
if ((int)extraBlockers.size() + currentBlockers + 1 >= requiredBlockers)
|
||||
break;
|
||||
if (card->blockCost)
|
||||
{
|
||||
MTGAbility * a = observer->mLayers->actionLayer()->getAbility(MTGAbility::BLOCK_COST);
|
||||
doAbility(a, card);
|
||||
}
|
||||
if((!attacker->basicAbilities[Constants::MENACE] && !attacker->basicAbilities[Constants::THREEBLOCKERS]) ||
|
||||
(attacker->basicAbilities[Constants::MENACE] && attacker->blockers.size() > 2) ||
|
||||
(attacker->basicAbilities[Constants::THREEBLOCKERS] && attacker->blockers.size() > 3))
|
||||
observer->cardClick(card, MTGAbility::MTG_BLOCK_RULE);
|
||||
else
|
||||
set = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (currentBlockers + (int)extraBlockers.size() + 1 >= requiredBlockers)
|
||||
{
|
||||
if (card->blockCost)
|
||||
{
|
||||
MTGAbility* a = observer->mLayers->actionLayer()->getAbility(MTGAbility::BLOCK_COST);
|
||||
doAbility(a, card);
|
||||
}
|
||||
observer->cardClick(card, MTGAbility::MTG_BLOCK_RULE);
|
||||
opponentsToughness[bestAttacker] -= card->power;
|
||||
|
||||
for (size_t i = 0; i < extraBlockers.size(); ++i)
|
||||
{
|
||||
MTGCardInstance* extra = extraBlockers[i];
|
||||
if (extra->blockCost)
|
||||
else
|
||||
{
|
||||
MTGAbility* a = observer->mLayers->actionLayer()->getAbility(MTGAbility::BLOCK_COST);
|
||||
doAbility(a, extra);
|
||||
set = 1;
|
||||
}
|
||||
observer->cardClick(extra, MTGAbility::MTG_BLOCK_RULE);
|
||||
opponentsToughness[bestAttacker] -= extra->power;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4442,7 +4269,7 @@ int AIPlayerBaka::receiveEvent(WEvent * event)
|
||||
|
||||
|
||||
AIPlayerBaka::AIPlayerBaka(GameObserver *observer, string file, string fileSmall, string avatarFile, MTGDeck * deck) :
|
||||
AIPlayer(observer, file, fileSmall, deck)
|
||||
AIPlayer(observer, file, fileSmall, deck)
|
||||
{
|
||||
|
||||
nextCardToPlay = NULL;
|
||||
@@ -4552,17 +4379,17 @@ int AIPlayerBaka::Act(float dt)
|
||||
else
|
||||
{
|
||||
if (observer->currentActionPlayer == this)//if im not the action player why would i requestnextphase?
|
||||
observer->userRequestNextGamePhase();
|
||||
observer->userRequestNextGamePhase();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
while(clickstream.size())
|
||||
{
|
||||
AIAction * action = clickstream.front();
|
||||
action->Act();
|
||||
SAFE_DELETE(action);
|
||||
clickstream.pop();
|
||||
AIAction * action = clickstream.front();
|
||||
action->Act();
|
||||
SAFE_DELETE(action);
|
||||
clickstream.pop();
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
|
||||
@@ -227,7 +227,7 @@ void Credits::compute(GameObserver* g, GameApp * _app)
|
||||
|
||||
if (p1->game->hand->nb_cards == 7)
|
||||
{
|
||||
CreditBonus * b = NEW CreditBonus(77, _("'Library of Alexandria' Bonus"));
|
||||
CreditBonus * b = NEW CreditBonus(77, _("'Seven-Tail Mentor' Bonus"));
|
||||
bonus.push_back(b);
|
||||
}
|
||||
|
||||
@@ -685,7 +685,7 @@ void Credits::Render()
|
||||
{
|
||||
f2->DrawString(_("There's more!").c_str(), 10, y + 15);
|
||||
f->DrawString(_("Mods, additional cards, updates and more at:").c_str(), 10, y + 30);
|
||||
f2->DrawString("Discord and GitHub: Wagic game", 10, y + 42);
|
||||
f2->DrawString("-> Discord: Wagic - MTG Game", 10, y + 42);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -8,10 +8,10 @@
|
||||
#include "Counters.h"
|
||||
#include "AllAbilities.h"
|
||||
|
||||
#if !defined(QT_CONFIG)
|
||||
#include <boost/scoped_ptr.hpp>
|
||||
typedef boost::scoped_ptr<ManaCost> ManaCostPtr;
|
||||
#else
|
||||
#if (__cplusplus > 199711L) || (_MSC_VER >= 1700)
|
||||
//#include <unique_ptr>
|
||||
typedef std::unique_ptr<ManaCost> ManaCostPtr;
|
||||
#elif defined(QT_CONFIG)
|
||||
#include <QScopedPointer>
|
||||
class ManaCostPtr : public QScopedPointer<ManaCost>
|
||||
{
|
||||
@@ -21,6 +21,9 @@ public:
|
||||
ManaCost* get() const {return data();};
|
||||
|
||||
};
|
||||
#else
|
||||
#include <boost/scoped_ptr.hpp>
|
||||
typedef boost::scoped_ptr<ManaCost> ManaCostPtr;
|
||||
#endif
|
||||
|
||||
SUPPORT_OBJECT_ANALYTICS(ExtraCost)
|
||||
|
||||
@@ -91,7 +91,7 @@ void GameApp::Create()
|
||||
{
|
||||
srand((unsigned int) time(0)); // initialize random
|
||||
#if !defined(QT_CONFIG) && !defined(IOS)
|
||||
#if defined (WIN32)
|
||||
#if defined (WIN32) && (!defined __GNUG__)
|
||||
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
|
||||
#elif defined (PSP)
|
||||
pspFpuSetEnable(0); //disable FPU Exceptions until we find where the FPU errors come from
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
#include "ModRules.h"
|
||||
#include "GameApp.h"
|
||||
|
||||
#include <random>
|
||||
|
||||
#ifdef TESTSUITE
|
||||
#include "TestSuiteAI.h"
|
||||
#endif
|
||||
@@ -2259,6 +2261,9 @@ std::string Tournament::exportTournamentDescription()
|
||||
|
||||
void Tournament::enableTournamantMode(int tournamentMode,int player)
|
||||
{
|
||||
std::random_device rd;
|
||||
std::mt19937 g(rd());
|
||||
|
||||
if (mTournamentMode!=tournamentMode && tournamentMode>0)
|
||||
{
|
||||
|
||||
@@ -2302,9 +2307,9 @@ void Tournament::enableTournamantMode(int tournamentMode,int player)
|
||||
//shuffle remaining decks
|
||||
// human player is always on first place
|
||||
if (player>0)
|
||||
std::random_shuffle ( TournamentsDecks.begin()+1, TournamentsDecks.end() );
|
||||
std::shuffle ( TournamentsDecks.begin()+1, TournamentsDecks.end(), g );
|
||||
else
|
||||
std::random_shuffle ( TournamentsDecks.begin(), TournamentsDecks.end() );
|
||||
std::shuffle ( TournamentsDecks.begin(), TournamentsDecks.end(), g );
|
||||
Deck[0]=TournamentsDecks[0];
|
||||
Deck[1]=TournamentsDecks[1];
|
||||
}
|
||||
@@ -2322,7 +2327,7 @@ void Tournament::enableTournamantMode(int tournamentMode,int player)
|
||||
for (unsigned int i=0;i<nmbDecks;i++)
|
||||
TournamentsDecks.push_back(TDeck(i+1,PLAYER_TYPE_CPU));
|
||||
//shuffle remaining decks
|
||||
std::random_shuffle ( TournamentsDecks.begin(), TournamentsDecks.end() );
|
||||
std::shuffle ( TournamentsDecks.begin(), TournamentsDecks.end(), g );
|
||||
Deck[0]=TournamentsDecks[0];
|
||||
Deck[1]=TournamentsDecks[1];
|
||||
}
|
||||
|
||||
@@ -605,7 +605,7 @@ int AbilityFactory::parseCastRestrictions(MTGCardInstance * card, Player * playe
|
||||
if (grave->hasType("artifact")) checkTypesAmount++;
|
||||
if (grave->hasType("planeswalker")) checkTypesAmount++;
|
||||
if (grave->hasType("battle")) checkTypesAmount++;
|
||||
if (grave->hasType("kindred")) checkTypesAmount++;
|
||||
if (grave->hasType("tribal")) checkTypesAmount++;
|
||||
if (checkTypesAmount < 4)
|
||||
return 0;
|
||||
}
|
||||
@@ -625,7 +625,7 @@ int AbilityFactory::parseCastRestrictions(MTGCardInstance * card, Player * playe
|
||||
if (grave->hasType("artifact")) checkTypesAmount++;
|
||||
if (grave->hasType("planeswalker")) checkTypesAmount++;
|
||||
if (grave->hasType("battle")) checkTypesAmount++;
|
||||
if (grave->hasType("kindred")) checkTypesAmount++;
|
||||
if (grave->hasType("tribal")) checkTypesAmount++;
|
||||
if (checkTypesAmount > 3)
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -347,17 +347,12 @@ void MTGCardInstance::initMTGCI()
|
||||
data = this; //an MTGCardInstance point to itself for data, allows to update it without killing the underlying database item
|
||||
|
||||
if (observer && basicAbilities[(int)Constants::CHANGELING])
|
||||
{
|
||||
//if the card is a changeling, it gains all creature subtypes except "Equipment"
|
||||
{//if the card is a changeling, it gains all creature subtypes
|
||||
vector<string> values = MTGAllCards::getCreatureValuesById();
|
||||
for (size_t i = 0; i < values.size(); ++i)
|
||||
{
|
||||
const string& subtype = values[i];
|
||||
if (subtype == "Clue" || subtype == "Equipment" || subtype == "Food" || subtype == "Treasure")
|
||||
continue;
|
||||
|
||||
// Don't send any event to the gameObserver inside of initMCGI, so calling the parent setSubtype method instead
|
||||
CardPrimitive::setSubtype(subtype.c_str());
|
||||
//Don' want to send any event to the gameObserver inside of initMCGI, so calling the parent setSubtype method instead of mine
|
||||
CardPrimitive::setSubtype(values[i].c_str());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1152,8 +1147,8 @@ int MTGCardInstance::canBlock(MTGCardInstance * opponent)
|
||||
return 0;
|
||||
if (opponent->basicAbilities[(int)Constants::FEAR] && !(this->hasType(Subtypes::TYPE_ARTIFACT) || this->hasColor(Constants::MTG_COLOR_BLACK)))
|
||||
return 0;
|
||||
//if (opponent->controller()->game->battlefield->hasAbility(Constants::LURE) && !opponent->has(Constants::LURE))
|
||||
//return 0; Doesn't consider if the lure creature is attacking
|
||||
if (opponent->controller()->game->battlefield->hasAbility(Constants::LURE) && !opponent->has(Constants::LURE))
|
||||
return 0;
|
||||
//intimidate
|
||||
if (opponent->basicAbilities[(int)Constants::INTIMIDATE] && !(this->hasType(Subtypes::TYPE_ARTIFACT)))
|
||||
{
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user