Compare commits

..

166 Commits

Author SHA1 Message Date
xawotihs 00e076fca4 Fixed compilation with SDL/mingw 2025-05-11 17:08:37 +02:00
xawotihs 0023c4a086 Fixed compilation with latest mingw64 2025-04-25 18:48:02 +02:00
xawotihs 7c9fd90903 Merge branch 'master' into cmake 2025-04-22 20:37:50 +02:00
xawotihs d95e9e1155 Fix compilation with latest cmake 2025-04-11 21:58:54 +02:00
Eduardo MG d4cb3e8384 Merge pull request #1078 from fogobogo/cmake
Cmake update
2022-10-04 16:07:12 -05:00
fogobogo d566524499 cmake build fixes
this brings the cmake branch in line with commit
8e551bb287 from the main branch.

This adds a few boons, most notably it allows compiling on Linux with
SDL2 instead of SDL.

That also allows for mouse support and can now be run without X, which
is mostly interesting in case you want to play some Wagic on say, a
Raspberry Pi.
2022-01-11 20:51:49 +01:00
fogobogo f3bb5ccef9 Merge branch 'master' into cmake 2022-01-11 19:19:09 +01:00
xawotihs 4709295598 Adds ios cmake toolchain 2017-09-08 22:47:29 +02:00
Xawotihs af0c423359 Switch back to java oracle 8 to build android app 2017-09-08 18:23:09 +02:00
Xawotihs 45253e0008 Reupdate pip calls to use them for osx as well 2017-09-08 17:56:20 +02:00
Xawotihs e32e5c2a47 Readding sudo pip ... lalala ... 2017-09-07 22:12:25 +02:00
Xawotihs 3a4f9f06cb reordered pip install 2017-09-07 22:01:36 +02:00
Xawotihs a563030440 Removing pip cache 2017-09-07 21:44:55 +02:00
Xawotihs 80d43896ff Reordered pip installs around 2017-09-07 20:56:37 +02:00
Xawotihs 1c5949411f Fixed some ] and space 2017-09-07 20:22:25 +02:00
Xawotihs 699b151939 With a couple of ; 2017-09-07 20:15:32 +02:00
Xawotihs e6af1a08b9 Use sudo pip for Android and pip with linux without Android 2017-09-07 20:09:56 +02:00
Xawotihs 7eac02f8d4 Trying pip install without sudo 2017-09-06 19:44:00 +02:00
Xawotihs 58e70e2500 replacing sudo pip by sudo -H pip 2017-09-06 19:36:12 +02:00
Xawotihs 56ca2021dc Let's try with openjdk7 2017-09-06 19:18:13 +02:00
Xawotihs e4e431dcee Let's try jdk_switcher 2017-09-06 00:21:24 +02:00
Xawotihs abfff205ee Readding ant, it seems the android worker needs it 2017-09-06 00:05:16 +02:00
Xawotihs 6416e4e0d9 Removed ant installation 2017-09-05 23:37:47 +02:00
Xawotihs 86f4730db7 Removings traces and ant errors 2017-09-05 23:06:22 +02:00
Xawotihs 33a5479512 Sounds like JAVA_HOME is wrong, let's try to use the default one 2017-09-05 22:59:06 +02:00
Xawotihs 891859f4ca Let's display ant errors 2017-09-05 22:48:06 +02:00
Xawotihs d5bfb8201b Some echo traces 2017-09-05 22:36:19 +02:00
Xawotihs f49ef92f90 sudo required on linux 2017-09-05 22:26:38 +02:00
Xawotihs 02d004b5bf Fixed os in build matrix for Android 2017-09-05 22:11:24 +02:00
Xawotihs 55f8a8a1d0 Only used brew if osx is defined 2017-09-04 20:16:31 +02:00
Xawotihs 068a69c80b Adding ant as it somehow disappeared ... 2017-09-04 19:43:41 +02:00
Xawotihs 375e66489f Changed memory to be 16 MB 2017-09-03 23:55:43 +02:00
Xawotihs cbbd034862 Removed chmod on binary 2017-09-03 14:44:45 +02:00
Xawotihs f7fe948da5 Update psp sdk link, don't install theos for all mac builds 2017-09-03 14:21:15 +02:00
Xawotihs 478ce0863b Replace cmake installation script 2017-09-03 14:04:32 +02:00
Xawotihs 329011460f Update .travis.yml 2017-09-03 13:55:39 +02:00
xawotihs 48ec51a923 Shold fix travis script 2017-09-03 12:49:31 +02:00
xawotihs 9936962c56 Should fix cmake issues on linux 2017-09-03 12:44:30 +02:00
xawotihs 15111d1b20 Merge branch 'master' of https://github.com/WagicProject/wagic into cmake 2017-09-02 21:15:47 +02:00
Xawotihs 2b342ca33b Fixed typo 2016-07-05 23:57:53 +02:00
xawotihs 97e6df7f59 Should fix PSP artifact build and upload 2016-07-05 23:49:33 +02:00
xawotihs a2bb67a828 Removed duplicate blacklist and added some cache 2016-07-04 23:21:34 +02:00
Xawotihs d14e28d7b3 Should fix android package upload 2016-07-04 04:18:26 +02:00
xawotihs 0a0ee3cc98 Merge branch 'master' into cmake 2016-07-03 16:44:21 +02:00
Xawotihs 99e6a254e1 Update android package upload 2016-07-01 00:18:44 +02:00
Xawotihs 68714ebad8 Added android SDK tools to path 2016-06-30 23:08:56 +02:00
Xawotihs 48ef4144bc Update .travis.yml 2016-06-30 22:04:08 +02:00
Xawotihs 78a4da4945 Avoid rebuilding after targging 2016-06-30 22:01:17 +02:00
xawotihs af0861877a Merge branch 'master' into cmake 2016-06-29 21:36:47 +02:00
xawotihs a23b96ba75 Merge branch 'master' into cmake 2016-06-26 11:25:23 +02:00
Xawotihs 47704f7591 Changed git add cmd 2016-06-26 10:28:50 +02:00
Xawotihs 755f90f38b Updated repo cleanup 2016-06-25 22:53:18 +02:00
Xawotihs 8a56406c19 Added missing REPO variable 2016-06-25 21:03:43 +02:00
xawotihs 887ea94a4d Add execution right to the new script 2016-06-25 20:11:24 +02:00
xawotihs 499b3ddf3e Added a script to upload emscripten build automatically to gh_pages 2016-06-25 16:54:35 +02:00
xawotihs 83e55b1074 Merge branch 'cmake' of https://github.com/WagicProject/wagic into cmake 2016-06-25 11:50:54 +02:00
xawotihs 1f87ed77e4 Fixed windows package and but in SDL frontend 2016-06-25 11:50:07 +02:00
Xawotihs 93b7d210dc Should fix indentation issue 2016-06-24 19:32:32 +02:00
xawotihs 10d9d84f84 Fixed emscripten memory and updated python upload script to include cmake branch 2016-06-23 23:32:57 +02:00
xawotihs fc9a4d5431 Removed redudant builds and removed -j4 to try to compile emscripten 2016-06-23 21:20:12 +02:00
Xawotihs 4b3a2531a6 Switched to debug emscripten build 2016-06-23 08:20:24 +02:00
Xawotihs ed4871548e Decreased optimisation level to avoid crashes 2016-06-23 07:48:11 +02:00
xawotihs 1284b8da8b Should fix emscripten build in Travis 2016-06-22 22:19:09 +02:00
Xawotihs 95455603a1 Tries to build emscripten on linux as macosx fails 2016-06-21 23:45:37 +02:00
xawotihs 813c54a166 Removed GL_CLAMP usage, update of the Android cmake package file 2016-06-19 12:46:17 +02:00
xawotihs fa2a2d51a5 Fixed Downloader. 2016-06-19 12:08:45 +02:00
xawotihs 4b68b636ce Merge branch 'master' into cmake 2016-06-19 11:39:56 +02:00
xawotihs 0a01b0af69 Tries to fix SDL and Qt builds, introduces Emscripten in Travis. 2016-06-19 10:25:22 +02:00
xawotihs e4e809f3fe Emscripten seems to work, should also fix PSP and Qt builds 2016-06-19 00:41:35 +02:00
xawotihs 1667b79fa8 Improved Emscripten port... still not there yet. 2016-06-18 17:24:51 +02:00
Xawotihs 31272ff0fe Removed suspicious references to thirdparty libs 2016-06-11 14:29:48 +02:00
xawotihs 9335063d68 Should fix PSP build and Windows ZIP creation 2016-06-09 21:26:11 +02:00
xawotihs 39dfaf3acb Forgot this file 2016-06-08 23:47:53 +02:00
xawotihs 3e7ecd51fd Fixed windows SDL2 build, finished removing fmod dependency 2016-06-08 23:45:42 +02:00
xawotihs c9ee4a304e Merge branch 'master' into cmake 2016-06-07 23:35:26 +02:00
xawotihs 2f1bf7bdbe Fixed iOS build 2016-06-07 23:31:42 +02:00
xawotihs 41890f6bb4 Removed main() function in zipFS 2016-06-07 22:49:59 +02:00
xawotihs 24cd7cab58 Merges iOS modifications with Windows modifications 2016-06-07 22:48:02 +02:00
xawotihs 473d9387d4 Removed references to fmod libs for Windows builds 2016-06-07 21:00:15 +02:00
Xawotihs f5495adce1 Enable _DEBUG in debug only 2016-06-06 22:52:39 +02:00
Xawotihs d802ec4b59 Fixed theos path 2016-06-04 22:05:04 +02:00
xawotihs 8f69e2a204 Should fix iOS build 2016-06-04 21:44:35 +02:00
xawotihs c3fc579907 Pulled down update for SDL2 2016-05-29 18:01:51 +02:00
Xawotihs cc06370bcd Update CMakeLists.txt 2015-11-24 00:14:48 +01:00
Xawotihs ed15ec2469 Fixed issue in SDL2 replacement. 2015-11-23 10:15:47 +01:00
Xawotihs 3f7d5ff041 Decreased -j option for Android 2015-11-22 22:37:55 +01:00
Xawotihs d5bcf40cbb Replaced SDL2 flavor when compiling for Android 2015-11-22 21:30:58 +01:00
ubuntu 49c196814f Couple of fixed around Android build with cmake. 2015-11-22 02:22:44 +01:00
Xawotihs c4282ce936 Update android.toolchain.cmake 2015-11-21 14:02:06 +01:00
Xawotihs cd1c09127f Removed dependencies on Boost on Android 2015-11-20 12:59:26 +01:00
xawotihs 9afebe0851 Removed sdl_main_android.cpp 2015-11-19 22:38:06 +01:00
Xawotihs 9a7382ea06 Added ANDROID_NDK variable for cmake toolchain 2015-11-18 23:57:55 +01:00
Xawotihs 7a7e723009 Fixed android cmake usage 2015-11-18 23:36:39 +01:00
Xawotihs 9d772284cc Removed any sudo actions on Android 2015-11-18 23:22:45 +01:00
Xawotihs a981761deb Trying to activate android build in matrix 2015-11-18 22:59:17 +01:00
Xawotihs fc13ffa242 Update appveyor.yml 2015-11-17 23:31:33 +01:00
Xawotihs 878b2cd639 Update FindOrBuild.cmake 2015-11-17 23:16:51 +01:00
Xawotihs 995922d2d7 Update appveyor.yml 2015-11-17 22:54:53 +01:00
Xawotihs 0d100aa9be Update appveyor.yml 2015-11-17 22:54:18 +01:00
Xawotihs d4fabed317 Split android sdk update in 4 2015-11-17 22:01:54 +01:00
Xawotihs 9eff781103 Update travis-script.sh 2015-11-16 23:20:20 +01:00
Xawotihs 0353da3d27 Update travis-script.sh 2015-11-16 22:56:30 +01:00
xawotihs 3cbdc6e9fe Merge branch 'cmake' of https://github.com/WagicProject/wagic into cmake 2015-11-04 22:33:26 +01:00
xawotihs ce71afd704 Tries to activate zlib compiling on mac 2015-11-04 22:32:49 +01:00
Xawotihs 603d491bed Without quotes 2015-11-03 23:06:14 +01:00
Xawotihs 20a792f135 Refering DXSDK and not windows SDK 2015-11-03 23:02:12 +01:00
xawotihs 87f5e7f3a6 Emscripten flavor now compiles correctly 2015-11-02 23:00:57 +01:00
xawotihs e272925f3d Removed extra/stdint.h 2015-11-02 00:00:26 +01:00
xawotihs 19091ade7b Updated appveyor to use SDL2.0.3 release and not SDL head. 2015-11-01 23:51:07 +01:00
xawotihs e62c065e2c Should fix git submodules 2015-11-01 23:34:03 +01:00
xawotihs 2312381b82 Updated git submodules 2015-11-01 23:26:03 +01:00
xawotihs 639942d444 Merge branch 'master' into cmake 2015-11-01 22:55:08 +01:00
xawotihs 55a5b9d0ba Now uses unofficial SDL mirror 2015-11-01 22:49:14 +01:00
Xawotihs a33517e5d0 Added prefix variable so that QT5 is found with brew 2015-10-31 23:02:31 +01:00
Xawotihs c981586bcf Moved apt-get of Qt into linux part 2015-10-31 21:45:36 +01:00
Xawotihs b473238f02 Replaced all " 2015-10-31 21:02:29 +01:00
Xawotihs 1d9b92080f Missed on " 2015-10-31 20:56:23 +01:00
Xawotihs 7f89d4d39f Uses "" everywhere 2015-10-31 20:51:12 +01:00
Xawotihs 4f00ec2277 Added matrix subsection in env 2015-10-31 20:37:54 +01:00
Xawotihs 26db10a083 Removed empty lines 2015-10-31 20:32:18 +01:00
xawotihs 3ec2ceb725 Activate matrix and multi-os in travis 2015-10-31 20:15:47 +01:00
xawotihs 667ac39e06 Removed reference to x64 platform 2015-10-25 18:07:30 +01:00
xawotihs 993d62a8c8 Added checkout of modules 2015-10-25 17:59:40 +01:00
xawotihs 09a70d4573 Merge branch 'cmake' of https://github.com/WagicProject/wagic into cmake 2015-10-25 17:30:59 +01:00
xawotihs 3afa730751 Updated appveyor to use cmake 2015-10-25 17:29:33 +01:00
Xawotihs 3245ddbfe7 Reducing the -j parameter to try helping g++ internal compiler issues 2015-10-25 10:51:34 +01:00
xawotihs def55943ed Activated building SDL2 directly from submodule on Unix as well 2015-10-25 10:18:21 +01:00
xawotihs 4accc9c018 Merge branch 'master' into cmake 2015-10-25 00:22:57 +02:00
xawotihs 579d612397 Worked on windows and emscripten builds, still not perfect. 2015-10-24 23:33:31 +02:00
Xawotihs daabce1d2f Merge pull request #647 from ZobyTwo/opencv_leftovers
Remove some leftovers from OpenCV
2015-10-17 21:46:47 +02:00
Tobias Loose 5885829585 Remove some leftovers from OpenCV 2015-10-17 18:12:31 +02:00
xawotihs 3e7b9e68d5 Fixed compilation issue with Qt. 2015-10-13 23:32:56 +02:00
Xawotihs 4a52139457 Update g++ to 4.8 2015-10-13 23:04:58 +02:00
xawotihs 79ea403273 Commented out GLUT dependency 2015-10-11 15:54:32 +02:00
xawotihs 397d7fa6c8 Added build of SDL2 in UNIX config 2015-10-11 15:31:58 +02:00
xawotihs ac787a6f51 Added SDL2DIR env variable. 2015-10-11 15:20:27 +02:00
xawotihs 0418e77d34 Removed tabs 2015-10-11 14:29:59 +02:00
xawotihs a2c6a3669b Reactivated SDL2 download 2015-10-11 14:27:40 +02:00
xawotihs b8d22240a8 Fixed typo 2015-10-11 14:21:09 +02:00
xawotihs b458d570a1 Deactivated again Android build, added a SDL build 2015-10-11 14:15:43 +02:00
xawotihs 5022df0d14 Moved tgz unpackaging away from android SDK update. 2015-10-11 12:34:52 +02:00
xawotihs 220b48b144 Updated android SDK and build tools versions 2015-10-11 12:14:58 +02:00
xawotihs 8aeed46181 Reactivates android build 2015-10-11 11:54:40 +02:00
xawotihs 38b34eae2f Split macosx config from unix one. 2015-10-11 11:38:32 +02:00
xawotihs 648b21f972 Trying something else with new repositories 2015-10-11 10:38:40 +02:00
xawotihs 09717a966b Added install of cmake 3.3 on Travis. 2015-10-11 10:08:33 +02:00
xawotihs eef46fe743 Revert previous change and just removed inline on the function 2015-10-10 18:41:43 +02:00
xawotihs 5f91566fa7 Move vrelptr implementation in header file so that it can be used outside of JGE lib 2015-10-10 18:35:33 +02:00
xawotihs c83a476ebe Put SwizzlePlot in the WFont header. 2015-10-10 18:23:59 +02:00
xawotihs 954bba274c Tries to fix includes 2015-10-10 18:08:45 +02:00
xawotihs d370a5c13d Fixed png include in JGE 2015-10-10 16:15:45 +02:00
xawotihs 181189bee0 Fixed boost include path 2015-10-10 16:05:34 +02:00
xawotihs c678f5e85a Fixed vram 2015-10-10 15:32:01 +02:00
xawotihs 0fabf83c62 Fixed decoder_prx 2015-10-10 15:25:08 +02:00
xawotihs b7e8d19290 Fix for travis build 2015-10-10 15:15:43 +02:00
Xawotihs d0db71602a Deactive android build as travis does not like it those days 2015-10-10 14:51:40 +02:00
Xawotihs 112efddb4e Removed typo 2015-10-09 13:32:51 +02:00
Xawotihs 4cea81e564 Moved SDL2 download away from the Android SDK download 2015-10-09 07:56:44 +02:00
Xawotihs 3a40a34566 should fix script syntax 2015-10-08 23:33:17 +02:00
Xawotihs a4ff87a7d5 Replaced libsdl2-dev dependency by a direct download 2015-10-08 23:29:47 +02:00
xawotihs 797077c47b Various fixes and activated cmake in travis. 2015-10-08 23:08:09 +02:00
xawotihs 075d950249 Got SDL2 version compiling on Mac. 2015-10-06 23:25:40 +02:00
xawotihs 22d14b2a4f - Updated SDL dependency to SDL2
- fixed compilation issues with cmake and visual studio 2015
2015-10-04 23:10:45 +02:00
xawotihs 4272e2e2b2 Activated zlib build only on windows 2015-09-28 19:39:26 +02:00
xawotihs 34279cfacf Additional work with cmake on Windows, still does not work 2015-09-27 23:23:31 +02:00
xawotihs 85f4a4c36a Started to merge @ZobyTwo cmake branch 2015-09-26 21:52:07 +02:00
3196 changed files with 8181 additions and 11963 deletions
+9
View File
@@ -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
+135 -55
View File
@@ -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
View File
@@ -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()
+373
View File
@@ -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()
+13
View File
@@ -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)
+29
View File
@@ -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)
+267
View File
@@ -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()
+62
View File
@@ -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)
+181
View File
@@ -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)
+26
View File
@@ -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
+48
View File
@@ -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)
+333
View File
@@ -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)
+62
View File
@@ -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)
+57
View File
@@ -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()
+165
View File
@@ -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)
+1
View File
@@ -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
+8 -2
View File
@@ -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
View File
@@ -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)
+2 -2
View File
@@ -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 ?
+2 -2
View File
@@ -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
View File
@@ -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
View File
@@ -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
+29
View File
@@ -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
+2 -2
View File
@@ -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>
+1
View File
@@ -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
View File
@@ -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;
+1 -1
View File
@@ -15,7 +15,7 @@
#include "../include/JSprite.h"
#include "../include/JAnimator.h"
#include "tinyxml/tinyxml.h"
#include "tinyxml.h"
//////////////////////////////////////////////////////////////////////////
+11 -13
View File
@@ -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
View File
@@ -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
+1
View File
@@ -10,6 +10,7 @@
#include <pspaudio.h>
#include <pspmp3.h>
#include <psputility.h>
#include <unistd.h>
#else
#define PSP_AUDIO_VOLUME_MAX 100
+1 -1
View File
@@ -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() <<
+1 -1
View File
@@ -19,7 +19,7 @@
#include "../include/JFileSystem.h"
#include "../include/JResourceManager.h"
#include "tinyxml/tinyxml.h"
#include "tinyxml.h"
//-------------------------------------------------------------------------------------
+2 -2
View File
@@ -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
View File
@@ -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
View File
@@ -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");
+1 -1
View File
@@ -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);
}
+182
View File
@@ -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
View File
@@ -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
+3
View File
@@ -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>
+121
View File
@@ -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);
}
+8
View File
@@ -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)
+5
View File
@@ -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")
+5
View File
@@ -0,0 +1,5 @@
add_definitions(-DPSP -G0)
add_definitions(-D_PSP_FW_VERSION=371)
add_definitions(-DDEVHOOK -DPSPFW3XX)
include_directories(${PSPSDK_PATH}/include)
+4
View File
@@ -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")
+3
View File
@@ -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")
+244
View File
@@ -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()
File diff suppressed because it is too large Load Diff
+72 -37
View File
@@ -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
+22 -16
View File
@@ -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
Wheel of Fortune (VMA) * 1
# Artifact(s)
Black Vise (V10) * 4
Howling Mine (8ED) * 3
# Instant(s)
Lightning Bolt (M10) * 4
# Sorcery(s)
Wheel of Fortune (VMA) * 1
+62 -24
View File
@@ -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
+28 -22
View File
@@ -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
+61 -26
View File
@@ -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
+74 -36
View File
@@ -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
+63 -28
View File
@@ -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
+17 -18
View File
@@ -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
Wrath of God (8ED) * 3
# Enchantment(s)
Crusade (DDF) * 4
# Instant(s)
Swords to Plowshares (DDF) * 4
# Sorcery(s)
Armageddon (VMA) * 4
Wrath of God (8ED) * 3
+63 -26
View File
@@ -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
+14 -15
View File
@@ -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
+214 -404
View File
@@ -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
+1 -1
View File
@@ -362,7 +362,7 @@ rarity=U
[/card]
[card]
primitive=Nighteyes the Desecrator
id=446807
id=446808
rarity=T
[/card]
[card]
+3 -3
View File
@@ -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
-136
View File
@@ -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
@@ -3992,4 +3967,4 @@ text=+1: Creatures you control get +1/+0 and gain haste until end of turn. -- 0:
mana={2}{R}{R}
type=Legendary Planeswalker
subtype=Zariel
[/card]
[/card]
+10 -13
View File
@@ -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()
+1 -1
View File
@@ -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
View File
@@ -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;
-232
View File
@@ -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_ ]
+1 -1
View File
@@ -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);
+4 -4
View File
@@ -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
+1 -1
View File
@@ -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;
+1 -1
View File
@@ -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,
+1 -1
View File
@@ -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)
+3
View File
@@ -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 -1
View File
@@ -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)
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+171 -344
View File
@@ -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;
@@ -107,7 +107,7 @@ int OrderedAIAction::getEfficiency()
{
target = a->source;
}
AACastCard * CC = dynamic_cast<AACastCard*> (a);
if (CC)
return 99;
@@ -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,30 +350,30 @@ 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;
if (!target)
break;
//ensuring that Ai grants abilities to creatures during first main, so it can actually use them in combat.
//quick note: the eff is multiplied by creatures ranking then divided by the number of cards in hand.
//the reason i do this is to encourage more casting and less waste of mana on abilities.
@@ -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
}
}
@@ -650,7 +650,7 @@ int OrderedAIAction::getEfficiency()
}
if(p->game->battlefield->countByType("token") >= 25)
efficiency = 0;
}
else if (GenericRevealAbility * grA = dynamic_cast<GenericRevealAbility *>(a))
{
@@ -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
@@ -720,18 +720,18 @@ int OrderedAIAction::getEfficiency()
{
efficiency += 55;
}
if (ability->source)
{
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);
@@ -781,7 +781,7 @@ int OrderedAIAction::getRevealedEfficiency(MTGAbility * ability2)
{
target = a->source;
}
AACastCard * CC = dynamic_cast<AACastCard*> (a);
if (CC)
return 99;
@@ -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,27 +1010,27 @@ 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;
if (!target)
break;
//ensuring that Ai grants abilities to creatures during first main, so it can actually use them in combat.
//quick note: the eff is multiplied by creatures ranking then divided by the number of cards in hand.
//the reason i do this is to encourage more casting and less waste of mana on abilities.
@@ -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
}
}
@@ -1290,7 +1290,7 @@ int OrderedAIAction::getRevealedEfficiency(MTGAbility * ability2)
}
if(p->game->battlefield->countByType("token") >= 25)
eff2 = 0;
}
//At this point the "basic" eff2 is computed, we further tweak it depending on general decisions, independent of theAbility type
@@ -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)
@@ -1575,7 +1575,7 @@ vector<MTGAbility*> AIPlayerBaka::canPayMana(MTGCardInstance * target, ManaCost
if(!cost || (cost && !cost->getConvertedCost()) || !target)
return vector<MTGAbility*>();
map<MTGCardInstance*, bool> usedCards;
return canPayMana(target, cost, anytypeofmana, usedCards);
}
@@ -1857,7 +1857,7 @@ vector<MTGAbility*> AIPlayerBaka::canPaySunBurst(ManaCost * cost)
}
}
}
for(int i = fullColor;i < cost->getConvertedCost();i++)
{
for (size_t i = 0; i < observer->mLayers->actionLayer()->manaObjects.size(); i++)
@@ -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())
@@ -2665,10 +2665,10 @@ int AIPlayerBaka::getEfficiency(MTGAbility * ability)
check = NEW OrderedAIAction(this, ability, pTarget, ability->source);
else
check = NEW OrderedAIAction(this, ability, ability->source);
if (!check)
return -1;
int result = getEfficiency(check);
SAFE_DELETE(check);
return result;
@@ -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))
{
@@ -2816,7 +2816,7 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
if (card->hasType(Subtypes::TYPE_BATTLE) && card->types.size() > 0 && game->inPlay->hasTypeSpecificInt(Subtypes::TYPE_BATTLE,card->types[1]))
continue;
if(hints && hints->HintSaysItsForCombo(observer,card))
{
if(hints->canWeCombo(observer,card,this))
@@ -2834,7 +2834,7 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
else
{
nextCardToPlay = NULL;
continue;
continue;
}
}
int currentCost = card->getManaCost()->getConvertedCost();
@@ -2987,7 +2987,7 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
if (card->hasType(Subtypes::TYPE_BATTLE) && card->types.size() > 0 && game->inPlay->hasTypeSpecificInt(Subtypes::TYPE_BATTLE,card->types[1]))
continue;
if(hints && hints->HintSaysItsForCombo(observer,card))
{
if(hints->canWeCombo(observer,card,this))
@@ -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);
@@ -3122,10 +3122,10 @@ MTGCardInstance * AIPlayerBaka::FindCardToPlay(ManaCost * pMana, const char * ty
if (game->playRestrictions->canPutIntoZone(card, game->stack) == PlayRestriction::CANT_PLAY)
continue;
if (card->hasType(Subtypes::TYPE_LEGENDARY) && game->inPlay->findByName(card->name))
continue;
if(hints && hints->HintSaysItsForCombo(observer,card))
{
if(hints->canWeCombo(observer,card,this))
@@ -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,8 +3275,8 @@ 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))
{
if(hints->canWeCombo(observer,card,this))
@@ -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;
}
}
@@ -3521,7 +3521,7 @@ MTGCardInstance * AIPlayerBaka::activateCombo()
if(comboCards.size())
{
nextCardToPlay = comboCards.back();
DebugTrace("ai is doing a combo:" << nextCardToPlay->getName());
DebugTrace("ai is doing a combo:" << nextCardToPlay->getName());
DebugTrace("ai is doing a combo:" << nextCardToPlay->getName());
@@ -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,156 +4151,53 @@ 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;
}
}
}
}
return 1;
}
@@ -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;
@@ -4485,7 +4312,7 @@ AIPlayer(observer, file, fileSmall, deck)
if (fileSmall == "ai_baka_eviltwin")
mAvatar->SetHFlip(true);
initTimer();
}
@@ -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;
+2 -2
View File
@@ -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);
}
}
+7 -4
View File
@@ -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)
+1 -1
View File
@@ -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
+9 -4
View File
@@ -16,6 +16,8 @@
#include "ModRules.h"
#include "GameApp.h"
#include <random>
#ifdef TESTSUITE
#include "TestSuiteAI.h"
#endif
@@ -2258,7 +2260,10 @@ 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];
}
+2 -2
View File
@@ -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;
}
+5 -10
View File
@@ -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