158 Commits

Author SHA1 Message Date
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
3234 changed files with 10986 additions and 48892 deletions

6
.gitmodules vendored Normal file
View File

@@ -0,0 +1,6 @@
[submodule "thirdparty/zlib"]
path = thirdparty/zlib
url = https://github.com/madler/zlib
[submodule "thirdparty/SDL2"]
path = thirdparty/SDL2
url = https://github.com/spurious/SDL-mirror.git

View File

@@ -2,58 +2,129 @@ language: cpp
branches:
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
# Only building on Mac when not handling pull request
- if [ "$TRAVIS_PULL_REQUEST" == "false" ]; then
export BUILD_MAC=YES;
- 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
- sudo apt-get update -qq
- 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 -O sdk.lzma http://downloads.sourceforge.net/project/minpspw/SDK%20%2B%20devpak/pspsdk%200.11.2/minpspw_0.11.2-amd64.tar.lzma;
fi
# Building for Qt here
- if [ "$BUILD_Qt" == "YES" ]; 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 apt-get -qq update &&
sudo apt-get -qq install qt5-qmake qtbase5-dev qtdeclarative5-dev qttools5-dev qtmultimedia5-dev pulseaudio libpulse-dev &&
export QMAKE="qmake -qt=qt5";
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_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; fi &&
- if [ "$BUILD_TYPE" == "ANDROID" ]; then
export ANDROID="/usr/local/android-sdk-linux/tools/android" &&
export PATH=$PATH:"/usr/local/android-sdk-linux/tools" &&
wget http://dl.google.com/android/ndk/android-ndk-r9-linux-x86_64.tar.bz2 -nv &&
wget http://dl.google.com/android/android-sdk_r24.3.4-linux.tgz -nv;
wget https://bitbucket.org/ewing/sdl_androidcmake/get/4e9e88c03f04.zip -nv;
fi
# Building for Qt here
- 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 apt-get install -qq qt5-qmake qtbase5-dev qtdeclarative5-dev qttools5-dev qtmultimedia5-dev pulseaudio libpulse-dev &&
export QMAKE="qmake -qt=qt5";
fi
# 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
tar --absolute-names -jxf android-ndk-r9-linux-x86_64.tar.bz2 &&
tar -zxf android-sdk_r24.3.4-linux.tgz &&
$ANDROID list sdk --extended -a &&
echo yes | $ANDROID update sdk -a -t tools,platform-tools,build-tools-23.0.1,android-10 --no-ui --force --no-https;
fi
- sudo pip install pyjavaproperties
- sudo pip install github3.py
- sudo pip install cpp-coveralls
- |
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="
@@ -61,8 +132,22 @@ env:
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'
- 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 projects/mtg/Android/bin/Wagic-debug.apk -r Wagic-android.apk -b $TRAVIS_BRANCH
- python tools/upload-binaries.py -t $GH_TOKEN -s $TRAVIS_COMMIT -l projects/mtg/psprelease.zip -r Wagic-psp.zip -b $TRAVIS_BRANCH
- python tools/upload-binaries.py -t $GH_TOKEN -s $TRAVIS_COMMIT -l qt-gui-build/linuxqtrelease.zip -r Wagic-linux-QT.zip -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

239
CMakeLists.txt Normal file
View File

@@ -0,0 +1,239 @@
cmake_minimum_required(VERSION 2.8.7)
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" 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)))
#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()
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()

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()

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)

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)

View File

@@ -0,0 +1,231 @@
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)
set(SDL_SHARED FALSE)
endif()
add_subdirectory(${CMAKE_SOURCE_DIR}/thirdparty/SDL2)
set(SDL2_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/thirdparty/SDL2/include ${CMAKE_BINARY_DIR}/thirdparty/SDL2)
if(EMSCRIPTEN)
set(SDL2_LIBRARY SDL2-static)
else()
set(SDL2_LIBRARY SDL2)
endif()
elseif(NOT EMSCRIPTEN)
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)
set(ZLIB_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/thirdparty/zlib ${CMAKE_BINARY_DIR}/thirdparty/zlib)
set(ZLIB_LIBRARIES zlib)
else()
if(WIN32)
set(ZLIB_ROOT ${CMAKE_SOURCE_DIR}/thirdparty/binary/win)
find_package(ZLIB)
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()
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(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()

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
CMakeModules/FindSDL2.cmake Normal file
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
CMakeModules/FindTinyXML.cmake Executable file
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

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)

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
CMakeModules/utils.cmake Normal file
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
JGE/CMakeLists.txt Normal file
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)

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

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="",

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)

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 ?

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
};

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
@@ -140,9 +148,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

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

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>

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 );

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;

View File

@@ -15,7 +15,7 @@
#include "../include/JSprite.h"
#include "../include/JAnimator.h"
#include "tinyxml/tinyxml.h"
#include "tinyxml.h"
//////////////////////////////////////////////////////////////////////////

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()->getFileSystemLocation();
systemPath = "";
@@ -145,9 +143,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");
@@ -302,6 +300,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;
@@ -412,7 +411,6 @@ bool JFileSystem::OpenFile(const string &filename)
mCurrentFileInZip = &(it2->second);
mFileSize = it2->second.m_Size;
return true;
}

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

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

View File

@@ -19,7 +19,7 @@
#include "../include/JFileSystem.h"
#include "../include/JResourceManager.h"
#include "tinyxml/tinyxml.h"
#include "tinyxml.h"
//-------------------------------------------------------------------------------------

View File

@@ -14,7 +14,7 @@
#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)
#include "crtdbg.h"

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

View File

@@ -19,7 +19,8 @@
*
*/
#include "../include/decoder_prx.h"
#include "decoder_prx.h"
#include <psputility.h>
char *prx_static_init()
{

View File

@@ -96,8 +96,7 @@ hgeParticleSystem::hgeParticleSystem(hgeParticleSystemInfo *psi)
{
//hge=hgeCreate(HGE_VERSION);
if (psi)
memcpy(&info, psi, sizeof(hgeParticleSystemInfo));
memcpy(&info, psi, sizeof(hgeParticleSystemInfo));
vecLocation.x=vecPrevLocation.x=0.0f;
vecLocation.y=vecPrevLocation.y=0.0f;

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>

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
JGE/src/windows/JSfx.cpp Normal file
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);
}
}

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:
- "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

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")

View File

@@ -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>

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.

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

View File

@@ -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>

View File

@@ -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>

View File

@@ -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();
}
}

View File

@@ -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);
}

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)

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")

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)

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")

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")

233
projects/mtg/CMakeLists.txt Normal file
View File

@@ -0,0 +1,233 @@
#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
)
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 ${JGE_LIBRARY} ${SDL2_LIBRARY} ${OPENGL_LIBRARIES} ${TINYXML_LIBRARIES} ${BOOST_date_time} ${HGE_LIBRARY} ${ZLIB_LIBRARIES})
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()

View File

@@ -1,4 +1,4 @@
name=Mode Blitzkrieg
name=Blitzkrieg
unlock=prx_geirkztilb
[INIT]
mode=mtg

View File

@@ -34,58 +34,4 @@ unlock_text=Blitzkrieg Mode Unlocked
teaser=Like to play fast? Unlock Blitzkrieg Mode :)
trophyroom_text=Won with more than 18 lands.
unlock_condition=type(land|myBattlefield)~morethan~18
[/award]
[award]
name=Paradise
id=prx_paradise
unlock_img=
unlock_text=Birds of Paradise Mode Unlocked
teaser=Utopia! Bring me down to the Paradise City.
Lands you control have "{T}: Add one mana of any color."
trophyroom_text=Won with Birds of Paradise on the battlefield.
unlock_condition=type(Birds of Paradise|mybattlefield)~morethan~0
[/award]
[award]
name=Morinfen Mode
id=prx_morinfen
unlock_img=
unlock_text=Morinfen Mode Unlocked
teaser="I looked into its eyes, and its soul was so empty I saw no reflection, no light there." — Crovax
At the beginning of your upkeep, you lose 1 life for each permanent you control.
trophyroom_text=Won with less than 5 life.
unlock_condition=this(controllerlife<=6)
[/award]
[award]
name=Horde
id=prx_horde
unlock_img=
unlock_text=Tribal Horde Mode Unlocked
teaser="From shards and splinters I call forth my living horde." -Molimo, maro-sorcerer
trophyroom_text=Won with more than 25 life.
unlock_condition=this(controllerlife>=26)
[/award]
[award]
name=False God
id=prx_karona
unlock_img=
unlock_text=False God Mode Unlocked
teaser=At the beginning of your upkeep, exchange control of a permanent you control chosen at random and a permanent target opponent controls chosen at random.
trophyroom_text=Devotion to red more than 7.
unlock_condition=this(variable{type:manar}>7)
[/award]
[award]
name=Titania Mode
id=prx_titania
unlock_img=
unlock_text=Titania Mode Unlocked
teaser=Voice of the Argoth forest, defender of its creatures, and enforcer of its laws, Titania is literally an aspect of the forest itself.
You may play an additional land on each of your turns.
trophyroom_text=Devotion to green more than 7.
unlock_condition=this(variable{type:manag}>7)
[/award]
[/award]

View File

@@ -1,15 +0,0 @@
include mtg.txt
name=False God
unlock=prx_karona
[INIT]
mode=mtg
[PLAYERS]
life:28
auto=shuffle
auto=draw:6
auto=@each myupkeep:auto=moverandom(*) from(opponentBattlefield) to(myBattlefield)
auto=@each myupkeep:auto=moverandom(*) from(myBattlefield) to(opponentBattlefield)
auto=maxPlay(land)+1

View File

@@ -1,13 +0,0 @@
include mtg.txt
name=Tribal Wars
unlock=prx_horde
[INIT]
mode=horde
[PLAYERS]
life:20
auto=shuffle
auto=draw:7
auto=@each my upkeep:if type(creature[manacost<=2]|mylibrary)~lessthan~1 then moverandom(creature[manacost<=4]) from(library) to(battlefield)
auto=@each my upkeep:moverandom(creature[manacost<=2]) from(library) to(battlefield)

View File

@@ -1,12 +0,0 @@
include mtg.txt
name=Morifen
unlock=prx_morinfen
[INIT]
mode=mtg
[PLAYERS]
life:50
auto=shuffle
auto=draw:7
auto=@each myupkeep:foreach(*|mybattlefield) life:-1

View File

@@ -1,20 +0,0 @@
include mtg.txt
name=Paradise
unlock=prx_paradise
[INIT]
mode=mtg
[PLAYERS]
life:17
auto=shuffle
auto=draw:7
auto=lord(*[-noactivatedability;-nomanaability;-notapability;land]|MyBattlefield) {T}:Add{W}
auto=lord(*[-noactivatedability;-nomanaability;-notapability;land]|MyBattlefield) {T}:Add{U}
auto=lord(*[-noactivatedability;-nomanaability;-notapability;land]|MyBattlefield) {T}:Add{R}
auto=lord(*[-noactivatedability;-nomanaability;-notapability;land]|MyBattlefield) {T}:Add{B}
auto=lord(*[-noactivatedability;-nomanaability;-notapability;land]|MyBattlefield) {T}:Add{G}

View File

@@ -1,9 +0,0 @@
include mtg.txt
name=Random 3 Colors
unlock=prx_rnddeck
[INIT]
mode=random3
[PLAYERS]
auto=shuffle
auto=draw:7

View File

@@ -1,16 +0,0 @@
include mtg.txt
name=Random 5 Colors
unlock=prx_rnddeck
[INIT]
mode=random5
[PLAYERS]
life:20
auto=shuffle
auto=draw:7
auto=lord(*[-noactivatedability;-nomanaability;-notapability;land]|MyBattlefield) {T}:Add{W}
auto=lord(*[-noactivatedability;-nomanaability;-notapability;land]|MyBattlefield) {T}:Add{U}
auto=lord(*[-noactivatedability;-nomanaability;-notapability;land]|MyBattlefield) {T}:Add{R}
auto=lord(*[-noactivatedability;-nomanaability;-notapability;land]|MyBattlefield) {T}:Add{B}
auto=lord(*[-noactivatedability;-nomanaability;-notapability;land]|MyBattlefield) {T}:Add{G}

View File

@@ -1,11 +0,0 @@
include mtg.txt
name=Set Limited
unlock=prx_rnddeck
[INIT]
mode=set_limited
[PLAYERS]
life:20
auto=shuffle
auto=draw:7

View File

@@ -1,17 +0,0 @@
include mtg.txt
name=Titania
unlock=prx_titania
[INIT]
mode=mtg
[PLAYERS]
life:15
auto=shuffle
auto=draw:9
auto=maxPlay(land)+1
#auto=@each myupkeep:auto=moverandom(*) from(myBattlefield) to #(opponentBattlefield)
#auto=@each myupkeep:auto=moverandom(*) from(opponentBattlefield) #to(myBattlefield)
#auto=@each myupkeep:draw:1
#auto=@each myupkeep:life:-1

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,331 +0,0 @@
[meta]
author=Wagic Team
name=Duel Decks: Mind vs. Might
year=2017-03-31
total=65
[/meta]
[card]
primitive=Jhoira of the Ghitu
id=426573
rarity=M
[/card]
[card]
primitive=Beacon of Tomorrows
id=426574
rarity=R
[/card]
[card]
primitive=Deep-Sea Kraken
id=426575
rarity=R
[/card]
[card]
primitive=Mind's Desire
id=426576
rarity=R
[/card]
[card]
primitive=Peer Through Depths
id=426577
rarity=C
[/card]
[card]
primitive=Quicken
id=426578
rarity=R
[/card]
[card]
primitive=Reach Through Mists
id=426579
rarity=C
[/card]
[card]
primitive=Sage-Eye Avengers
id=426580
rarity=R
[/card]
[card]
primitive=Sift Through Sands
id=426581
rarity=C
[/card]
[card]
primitive=Snap
id=426582
rarity=C
[/card]
[card]
primitive=Talrand, Sky Summoner
id=426583
rarity=R
[/card]
[card]
primitive=Temporal Fissure
id=426584
rarity=C
[/card]
[card]
primitive=The Unspeakable
id=426585
rarity=R
[/card]
[card]
primitive=Desperate Ritual
id=426586
rarity=U
[/card]
[card]
primitive=Empty the Warrens
id=426587
rarity=C
[/card]
[card]
primitive=Grapeshot
id=426588
rarity=C
[/card]
[card]
primitive=Rift Bolt
id=426589
rarity=C
[/card]
[card]
primitive=Shivan Meteor
id=426590
rarity=U
[/card]
[card]
primitive=Volcanic Vision
id=426591
rarity=R
[/card]
[card]
primitive=Young Pyromancer
id=426592
rarity=U
[/card]
[card]
primitive=Firemind's Foresight
id=426593
rarity=R
[/card]
[card]
primitive=Goblin Electromancer
id=426594
rarity=C
[/card]
[card]
primitive=Jori En, Ruin Diver
id=426595
rarity=R
[/card]
[card]
primitive=Nivix Cyclops
id=426596
rarity=C
[/card]
[card]
primitive=Spellheart Chimera
id=426597
rarity=U
[/card]
[card]
primitive=Nucklavee
id=426598
rarity=U
[/card]
[card]
primitive=Swiftwater Cliffs
id=426599
rarity=C
[/card]
[card]
primitive=Island
id=426600
rarity=L
[/card]
[card]
primitive=Island
id=426601
rarity=L
[/card]
[card]
primitive=Island
id=426602
rarity=L
[/card]
[card]
primitive=Mountain
id=426603
rarity=L
[/card]
[card]
primitive=Mountain
id=426604
rarity=L
[/card]
[card]
primitive=Mountain
id=426605
rarity=L
[/card]
[card]
primitive=Lovisa Coldeyes
id=426606
rarity=M
[/card]
[card]
primitive=Beacon of Destruction
id=426607
rarity=R
[/card]
[card]
primitive=Boldwyr Intimidator
id=426608
rarity=U
[/card]
[card]
primitive=Firebolt
id=426609
rarity=C
[/card]
[card]
primitive=Gorehorn Minotaurs
id=426610
rarity=C
[/card]
[card]
primitive=Kamahl, Pit Fighter
id=426611
rarity=R
[/card]
[card]
primitive=Kruin Striker
id=426612
rarity=C
[/card]
[card]
primitive=Zo-Zu the Punisher
id=426613
rarity=R
[/card]
[card]
primitive=Ambassador Oak
id=426614
rarity=C
[/card]
[card]
primitive=Beast Attack
id=426615
rarity=U
[/card]
[card]
primitive=Call of the Herd
id=426616
rarity=R
[/card]
[card]
primitive=Cloudcrown Oak
id=426617
rarity=C
[/card]
[card]
primitive=Harmonize
id=426618
rarity=U
[/card]
[card]
primitive=Increasing Savagery
id=426619
rarity=R
[/card]
[card]
primitive=Rampant Growth
id=426620
rarity=C
[/card]
[card]
primitive=Roar of the Wurm
id=426621
rarity=U
[/card]
[card]
primitive=Skarrgan Pit-Skulk
id=426622
rarity=C
[/card]
[card]
primitive=Sylvan Might
id=426623
rarity=C
[/card]
[card]
primitive=Talara's Battalion
id=426624
rarity=R
[/card]
[card]
primitive=Radha, Heir to Keld
id=426625
rarity=R
[/card]
[card]
primitive=Relentless Hunter
id=426626
rarity=U
[/card]
[card]
primitive=Burning-Tree Emissary
id=426627
rarity=U
[/card]
[card]
primitive=Guttural Response
id=426628
rarity=U
[/card]
[card]
primitive=Rubblebelt Raiders
id=426629
rarity=R
[/card]
[card]
primitive=Coat of Arms
id=426630
rarity=R
[/card]
[card]
primitive=Rugged Highlands
id=426631
rarity=C
[/card]
[card]
primitive=Mountain
id=426632
rarity=L
[/card]
[card]
primitive=Mountain
id=426633
rarity=L
[/card]
[card]
primitive=Mountain
id=426634
rarity=L
[/card]
[card]
primitive=Forest
id=426635
rarity=L
[/card]
[card]
primitive=Forest
id=426636
rarity=L
[/card]
[card]
primitive=Forest
id=426637
rarity=L
[/card]

View File

@@ -1,321 +0,0 @@
[meta]
author=Wagic Team
name=Duel Decks: Merfolk vs. Goblins
year=2017-10-24
total=63
[/meta]
[card]
primitive=Master of Waves
id=438441
rarity=M
[/card]
[card]
primitive=Aquitect's Will
id=438442
rarity=C
[/card]
[card]
primitive=Claustrophobia
id=438443
rarity=C
[/card]
[card]
primitive=Concentrate
id=438444
rarity=U
[/card]
[card]
primitive=Engulf the Shore
id=438445
rarity=R
[/card]
[card]
primitive=Essence Scatter
id=438446
rarity=C
[/card]
[card]
primitive=Harbinger of the Tides
id=438447
rarity=R
[/card]
[card]
primitive=Inkfathom Divers
id=438448
rarity=C
[/card]
[card]
primitive=Master of the Pearl Trident
id=438449
rarity=R
[/card]
[card]
primitive=Merfolk Looter
id=438450
rarity=U
[/card]
[card]
primitive=Merfolk Sovereign
id=438451
rarity=R
[/card]
[card]
primitive=Merfolk Wayfinder
id=438452
rarity=U
[/card]
[card]
primitive=Merrow Reejerey
id=438453
rarity=U
[/card]
[card]
primitive=Mind Spring
id=438454
rarity=R
[/card]
[card]
primitive=Misdirection
id=438455
rarity=R
[/card]
[card]
primitive=Rootwater Hunter
id=438456
rarity=U
[/card]
[card]
primitive=Scroll Thief
id=438457
rarity=C
[/card]
[card]
primitive=Streambed Aquitects
id=438458
rarity=C
[/card]
[card]
primitive=Tidal Courier
id=438459
rarity=U
[/card]
[card]
primitive=Tidal Warrior
id=438460
rarity=C
[/card]
[card]
primitive=Tidal Wave
id=438461
rarity=C
[/card]
[card]
primitive=Tidebinder Mage
id=438462
rarity=R
[/card]
[card]
primitive=Triton Tactics
id=438463
rarity=U
[/card]
[card]
primitive=Wake Thrasher
id=438464
rarity=R
[/card]
[card]
primitive=Cold-Eyed Selkie
id=438465
rarity=R
[/card]
[card]
primitive=Blighted Cataract
id=438466
rarity=U
[/card]
[card]
primitive=Lonely Sandbar
id=438467
rarity=C
[/card]
[card]
primitive=Island
id=438468
rarity=L
[/card]
[card]
primitive=Island
id=438469
rarity=L
[/card]
[card]
primitive=Island
id=438470
rarity=L
[/card]
[card]
primitive=Island
id=438471
rarity=L
[/card]
[card]
primitive=Warren Instigator
id=438472
rarity=M
[/card]
[card]
primitive=Battle Squadron
id=438473
rarity=U
[/card]
[card]
primitive=Boggart Brute
id=438474
rarity=C
[/card]
[card]
primitive=Brute Strength
id=438475
rarity=C
[/card]
[card]
primitive=Cleaver Riot
id=438476
rarity=U
[/card]
[card]
primitive=Ember Hauler
id=438477
rarity=U
[/card]
[card]
primitive=Foundry Street Denizen
id=438478
rarity=C
[/card]
[card]
primitive=Gempalm Incinerator
id=438479
rarity=U
[/card]
[card]
primitive=Ghostfire
id=438480
rarity=C
[/card]
[card]
primitive=Goblin Chieftain
id=438481
rarity=R
[/card]
[card]
primitive=Goblin Diplomats
id=438482
rarity=R
[/card]
[card]
primitive=Goblin Glory Chaser
id=438483
rarity=U
[/card]
[card]
primitive=Goblin Goon
id=438484
rarity=R
[/card]
[card]
primitive=Goblin Grenade
id=438485
rarity=U
[/card]
[card]
primitive=Goblin Rabblemaster
id=438486
rarity=R
[/card]
[card]
primitive=Goblin Razerunners
id=438487
rarity=R
[/card]
[card]
primitive=Goblin Ringleader
id=438488
rarity=U
[/card]
[card]
primitive=Goblin Tunneler
id=438489
rarity=C
[/card]
[card]
primitive=Goblin Wardriver
id=438490
rarity=U
[/card]
[card]
primitive=Hordeling Outburst
id=438491
rarity=U
[/card]
[card]
primitive=Krenko, Mob Boss
id=438492
rarity=R
[/card]
[card]
primitive=Krenko's Command
id=438493
rarity=C
[/card]
[card]
primitive=Relentless Assault
id=438494
rarity=R
[/card]
[card]
primitive=Tarfire
id=438495
rarity=C
[/card]
[card]
primitive=Brittle Effigy
id=438496
rarity=R
[/card]
[card]
primitive=Goblin Charbelcher
id=438497
rarity=R
[/card]
[card]
primitive=Blighted Gorge
id=438498
rarity=U
[/card]
[card]
primitive=Forgotten Cave
id=438499
rarity=C
[/card]
[card]
primitive=Mountain
id=438500
rarity=L
[/card]
[card]
primitive=Mountain
id=438501
rarity=L
[/card]
[card]
primitive=Mountain
id=438502
rarity=L
[/card]
[card]
primitive=Mountain
id=438503
rarity=L
[/card]

View File

@@ -1,386 +0,0 @@
[meta]
author=Wagic Team
name=Duel Decks: Elves vs. Inventors
year=2018-04-06
total=76
[/meta]
[card]
primitive=Ezuri, Renegade Leader
id=442737
rarity=M
[/card]
[card]
primitive=Dwynen, Gilt-Leaf Daen
id=442738
rarity=R
[/card]
[card]
primitive=Dwynen's Elite
id=442739
rarity=U
[/card]
[card]
primitive=Elvish Aberration
id=442740
rarity=C
[/card]
[card]
primitive=Elvish Archdruid
id=442741
rarity=R
[/card]
[card]
primitive=Elvish Branchbender
id=442742
rarity=C
[/card]
[card]
primitive=Elvish Mystic
id=442743
rarity=C
[/card]
[card]
primitive=Elvish Vanguard
id=442744
rarity=C
[/card]
[card]
primitive=Ezuri's Archers
id=442745
rarity=C
[/card]
[card]
primitive=Fierce Empath
id=442746
rarity=C
[/card]
[card]
primitive=Gladehart Cavalry
id=442747
rarity=R
[/card]
[card]
primitive=Ivy Lane Denizen
id=442748
rarity=C
[/card]
[card]
primitive=Jagged-Scar Archers
id=442749
rarity=U
[/card]
[card]
primitive=Krosan Tusker
id=442750
rarity=C
[/card]
[card]
primitive=Kujar Seedsculptor
id=442751
rarity=C
[/card]
[card]
primitive=Lead the Stampede
id=442752
rarity=C
[/card]
[card]
primitive=Leaf Gilder
id=442753
rarity=C
[/card]
[card]
primitive=Llanowar Empath
id=442754
rarity=C
[/card]
[card]
primitive=Naturalize
id=442755
rarity=C
[/card]
[card]
primitive=Nature's Way
id=442756
rarity=U
[/card]
[card]
primitive=Nissa's Judgment
id=442757
rarity=U
[/card]
[card]
primitive=Regal Force
id=442758
rarity=R
[/card]
[card]
primitive=Sylvan Advocate
id=442759
rarity=R
[/card]
[card]
primitive=Talara's Battalion
id=442760
rarity=R
[/card]
[card]
primitive=Viridian Shaman
id=442761
rarity=U
[/card]
[card]
primitive=Wildheart Invoker
id=442762
rarity=C
[/card]
[card]
primitive=Yeva, Nature's Herald
id=442763
rarity=R
[/card]
[card]
primitive=Oran-Rief, the Vastwood
id=442764
rarity=R
[/card]
[card]
primitive=Tranquil Thicket
id=442765
rarity=C
[/card]
[card]
primitive=Treetop Village
id=442766
rarity=U
[/card]
[card]
primitive=Forest
id=442767
rarity=L
[/card]
[card]
primitive=Forest
id=442768
rarity=L
[/card]
[card]
primitive=Forest
id=442769
rarity=L
[/card]
[card]
primitive=Forest
id=442770
rarity=L
[/card]
[card]
primitive=Goblin Welder
id=442771
rarity=M
[/card]
[card]
primitive=Artificer's Epiphany
id=442772
rarity=C
[/card]
[card]
primitive=Etherium Sculptor
id=442773
rarity=C
[/card]
[card]
primitive=Faerie Mechanist
id=442774
rarity=C
[/card]
[card]
primitive=Riddlesmith
id=442775
rarity=U
[/card]
[card]
primitive=Treasure Mage
id=442776
rarity=U
[/card]
[card]
primitive=Trinket Mage
id=442777
rarity=C
[/card]
[card]
primitive=Trophy Mage
id=442778
rarity=U
[/card]
[card]
primitive=Whirler Rogue
id=442779
rarity=U
[/card]
[card]
primitive=Barrage Ogre
id=442780
rarity=U
[/card]
[card]
primitive=Galvanic Blast
id=442781
rarity=C
[/card]
[card]
primitive=Ghirapur Gearcrafter
id=442782
rarity=C
[/card]
[card]
primitive=Pia and Kiran Nalaar
id=442783
rarity=R
[/card]
[card]
primitive=Shrapnel Blast
id=442784
rarity=U
[/card]
[card]
primitive=Welding Sparks
id=442785
rarity=C
[/card]
[card]
primitive=Maverick Thopterist
id=442786
rarity=U
[/card]
[card]
primitive=Reclusive Artificer
id=442787
rarity=U
[/card]
[card]
primitive=Darksteel Plate
id=442788
rarity=R
[/card]
[card]
primitive=Filigree Familiar
id=442789
rarity=U
[/card]
[card]
primitive=Ichor Wellspring
id=442790
rarity=C
[/card]
[card]
primitive=Inventor's Goggles
id=442791
rarity=C
[/card]
[card]
primitive=Mycosynth Wellspring
id=442792
rarity=C
[/card]
[card]
primitive=Myr Battlesphere
id=442793
rarity=R
[/card]
[card]
primitive=Myr Sire
id=442794
rarity=C
[/card]
[card]
primitive=Neurok Replica
id=442795
rarity=C
[/card]
[card]
primitive=Pyrite Spellbomb
id=442796
rarity=C
[/card]
[card]
primitive=Scuttling Doom Engine
id=442797
rarity=R
[/card]
[card]
primitive=Solemn Simulacrum
id=442798
rarity=R
[/card]
[card]
primitive=Thopter Assembly
id=442799
rarity=R
[/card]
[card]
primitive=Voyager Staff
id=442800
rarity=U
[/card]
[card]
primitive=Darksteel Citadel
id=442801
rarity=U
[/card]
[card]
primitive=Foundry of the Consuls
id=442802
rarity=U
[/card]
[card]
primitive=Great Furnace
id=442803
rarity=C
[/card]
[card]
primitive=Phyrexia's Core
id=442804
rarity=U
[/card]
[card]
primitive=Seat of the Synod
id=442805
rarity=C
[/card]
[card]
primitive=Shivan Reef
id=442806
rarity=R
[/card]
[card]
primitive=Swiftwater Cliffs
id=442807
rarity=C
[/card]
[card]
primitive=Temple of Epiphany
id=442808
rarity=R
[/card]
[card]
primitive=Island
id=442809
rarity=L
[/card]
[card]
primitive=Island
id=442810
rarity=L
[/card]
[card]
primitive=Mountain
id=442811
rarity=L
[/card]
[card]
primitive=Mountain
id=442812
rarity=L
[/card]

File diff suppressed because it is too large Load Diff

View File

@@ -1,536 +0,0 @@
[meta]
author=Wagic Team
name=Archenemy: Nicol Bolas
year=2017-06-16
total=106
[/meta]
[card]
primitive=Aegis Angel
id=430540
rarity=R
[/card]
[card]
primitive=Aerial Responder
id=430541
rarity=U
[/card]
[card]
primitive=Anointer of Champions
id=430542
rarity=U
[/card]
[card]
primitive=Doomed Traveler
id=430543
rarity=C
[/card]
[card]
primitive=Excoriate
id=430544
rarity=C
[/card]
[card]
primitive=Expedition Raptor
id=430545
rarity=C
[/card]
[card]
primitive=Fencing Ace
id=430546
rarity=U
[/card]
[card]
primitive=Fiendslayer Paladin
id=430547
rarity=R
[/card]
[card]
primitive=Flickerwisp
id=430548
rarity=U
[/card]
[card]
primitive=Gideon Jura
id=430549
rarity=M
[/card]
[card]
primitive=Gideon's Lawkeeper
id=430550
rarity=C
[/card]
[card]
primitive=Grand Abolisher
id=430551
rarity=R
[/card]
[card]
primitive=Grasp of the Hieromancer
id=430552
rarity=C
[/card]
[card]
primitive=Lightwielder Paladin
id=430553
rarity=R
[/card]
[card]
primitive=Mentor of the Meek
id=430554
rarity=R
[/card]
[card]
primitive=Moment of Heroism
id=430555
rarity=C
[/card]
[card]
primitive=Odric, Master Tactician
id=430556
rarity=R
[/card]
[card]
primitive=Precinct Captain
id=430557
rarity=R
[/card]
[card]
primitive=Relief Captain
id=430558
rarity=U
[/card]
[card]
primitive=Shoulder to Shoulder
id=430559
rarity=C
[/card]
[card]
primitive=Sun Titan
id=430560
rarity=M
[/card]
[card]
primitive=Youthful Knight
id=430561
rarity=C
[/card]
[card]
primitive=Compulsive Research
id=430562
rarity=C
[/card]
[card]
primitive=Icefall Regent
id=430563
rarity=R
[/card]
[card]
primitive=Ior Ruin Expedition
id=430564
rarity=C
[/card]
[card]
primitive=Prognostic Sphinx
id=430565
rarity=R
[/card]
[card]
primitive=Reckless Scholar
id=430566
rarity=U
[/card]
[card]
primitive=Sphinx of Jwar Isle
id=430567
rarity=R
[/card]
[card]
primitive=Vision Skeins
id=430568
rarity=C
[/card]
[card]
primitive=Windrider Eel
id=430569
rarity=C
[/card]
[card]
primitive=Archfiend of Depravity
id=430570
rarity=R
[/card]
[card]
primitive=Deathbringer Regent
id=430571
rarity=R
[/card]
[card]
primitive=Doom Blade
id=430572
rarity=U
[/card]
[card]
primitive=Harvester of Souls
id=430573
rarity=R
[/card]
[card]
primitive=Nightscape Familiar
id=430574
rarity=C
[/card]
[card]
primitive=Overseer of the Damned
id=430575
rarity=R
[/card]
[card]
primitive=Reckless Spite
id=430576
rarity=U
[/card]
[card]
primitive=Vampire Nighthawk
id=430577
rarity=U
[/card]
[card]
primitive=Avatar of Fury
id=430578
rarity=R
[/card]
[card]
primitive=Battle-Rattle Shaman
id=430579
rarity=C
[/card]
[card]
primitive=Blood Ogre
id=430580
rarity=C
[/card]
[card]
primitive=Chandra, Pyromaster
id=430581
rarity=M
[/card]
[card]
primitive=Chandra's Outrage
id=430582
rarity=C
[/card]
[card]
primitive=Chandra's Phoenix
id=430583
rarity=R
[/card]
[card]
primitive=Coordinated Assault
id=430584
rarity=U
[/card]
[card]
primitive=Dualcaster Mage
id=430585
rarity=R
[/card]
[card]
primitive=Fiery Fall
id=430586
rarity=C
[/card]
[card]
primitive=Flametongue Kavu
id=430587
rarity=U
[/card]
[card]
primitive=Gorehorn Minotaurs
id=430588
rarity=C
[/card]
[card]
primitive=Grim Lavamancer
id=430589
rarity=R
[/card]
[card]
primitive=Guttersnipe
id=430590
rarity=U
[/card]
[card]
primitive=Hammerhand
id=430591
rarity=C
[/card]
[card]
primitive=Inferno Titan
id=430592
rarity=M
[/card]
[card]
primitive=Lightning Bolt
id=430593
rarity=U
[/card]
[card]
primitive=Obsidian Fireheart
id=430594
rarity=M
[/card]
[card]
primitive=Searing Spear
id=430595
rarity=C
[/card]
[card]
primitive=Skarrgan Firebird
id=430596
rarity=U
[/card]
[card]
primitive=Stormblood Berserker
id=430597
rarity=U
[/card]
[card]
primitive=Sudden Demise
id=430598
rarity=R
[/card]
[card]
primitive=Torchling
id=430599
rarity=R
[/card]
[card]
primitive=Volcanic Geyser
id=430600
rarity=U
[/card]
[card]
primitive=Cultivate
id=430601
rarity=C
[/card]
[card]
primitive=Explore
id=430602
rarity=C
[/card]
[card]
primitive=Fertilid
id=430603
rarity=C
[/card]
[card]
primitive=Forgotten Ancient
id=430604
rarity=R
[/card]
[card]
primitive=Hunter's Prowess
id=430605
rarity=R
[/card]
[card]
primitive=Khalni Heart Expedition
id=430606
rarity=C
[/card]
[card]
primitive=Nissa, Worldwaker
id=430607
rarity=M
[/card]
[card]
primitive=Oran-Rief Hydra
id=430608
rarity=R
[/card]
[card]
primitive=Press the Advantage
id=430609
rarity=U
[/card]
[card]
primitive=Rampaging Baloths
id=430610
rarity=M
[/card]
[card]
primitive=Retreat to Kazandu
id=430611
rarity=U
[/card]
[card]
primitive=Scute Mob
id=430612
rarity=R
[/card]
[card]
primitive=Sylvan Bounty
id=430613
rarity=C
[/card]
[card]
primitive=Thragtusk
id=430614
rarity=R
[/card]
[card]
primitive=Turntimber Basilisk
id=430615
rarity=U
[/card]
[card]
primitive=Vastwood Zendikon
id=430616
rarity=C
[/card]
[card]
primitive=Vines of the Recluse
id=430617
rarity=C
[/card]
[card]
primitive=Woodborn Behemoth
id=430618
rarity=U
[/card]
[card]
primitive=Baleful Strix
id=430619
rarity=U
[/card]
[card]
primitive=Blood Tyrant
id=430620
rarity=R
[/card]
[card]
primitive=Cruel Ultimatum
id=430621
rarity=R
[/card]
[card]
primitive=Dreadbore
id=430622
rarity=R
[/card]
[card]
primitive=Extract from Darkness
id=430623
rarity=U
[/card]
[card]
primitive=Nicol Bolas, Planeswalker
id=430624
rarity=M
[/card]
[card]
primitive=Slave of Bolas
id=430625
rarity=U
[/card]
[card]
primitive=Soul Ransom
id=430626
rarity=U
[/card]
[card]
primitive=Obelisk of Grixis
id=430627
rarity=C
[/card]
[card]
primitive=Sword of the Animist
id=430628
rarity=R
[/card]
[card]
primitive=Talisman of Dominance
id=430629
rarity=U
[/card]
[card]
primitive=Talisman of Indulgence
id=430630
rarity=U
[/card]
[card]
primitive=Crumbling Necropolis
id=430631
rarity=U
[/card]
[card]
primitive=Dragonskull Summit
id=430632
rarity=R
[/card]
[card]
primitive=Drowned Catacomb
id=430633
rarity=R
[/card]
[card]
primitive=Grixis Panorama
id=430634
rarity=C
[/card]
[card]
primitive=Smoldering Spires
id=430635
rarity=C
[/card]
[card]
primitive=Plains
id=430636
rarity=L
[/card]
[card]
primitive=Island
id=430637
rarity=L
[/card]
[card]
primitive=Swamp
id=430638
rarity=L
[/card]
[card]
primitive=Mountain
id=430639
rarity=L
[/card]
[card]
primitive=Forest
id=430640
rarity=L
[/card]
[card]
primitive=Plains
id=430641
rarity=L
[/card]
[card]
primitive=Island
id=430642
rarity=L
[/card]
[card]
primitive=Swamp
id=430643
rarity=L
[/card]
[card]
primitive=Mountain
id=430644
rarity=L
[/card]
[card]
primitive=Forest
id=430645
rarity=L
[/card]

View File

@@ -1,241 +0,0 @@
[meta]
author=Wagic Team
name=Explorers of Ixalan
year=2017-11-24
total=48
[/meta]
[card]
primitive=Beacon of Immortality
id=439343
rarity=R
[/card]
[card]
primitive=Day of Judgment
id=439344
rarity=R
[/card]
[card]
primitive=Path to Exile
id=439345
rarity=U
[/card]
[card]
primitive=Shielded by Faith
id=439346
rarity=R
[/card]
[card]
primitive=Veteran's Reflexes
id=439347
rarity=C
[/card]
[card]
primitive=Vow of Duty
id=439348
rarity=U
[/card]
[card]
primitive=Aether Gale
id=439349
rarity=R
[/card]
[card]
primitive=Blatant Thievery
id=439350
rarity=R
[/card]
[card]
primitive=Concentrate
id=439351
rarity=U
[/card]
[card]
primitive=Merfolk Sovereign
id=439352
rarity=R
[/card]
[card]
primitive=Threads of Disloyalty
id=439353
rarity=R
[/card]
[card]
primitive=Time Warp
id=439354
rarity=M
[/card]
[card]
primitive=Unsummon
id=439355
rarity=C
[/card]
[card]
primitive=Vow of Flight
id=439356
rarity=U
[/card]
[card]
primitive=Bloodbond Vampire
id=439357
rarity=U
[/card]
[card]
primitive=Child of Night
id=439358
rarity=C
[/card]
[card]
primitive=Coat with Venom
id=439359
rarity=C
[/card]
[card]
primitive=Doom Blade
id=439360
rarity=U
[/card]
[card]
primitive=Innocent Blood
id=439361
rarity=C
[/card]
[card]
primitive=Necropolis Regent
id=439362
rarity=M
[/card]
[card]
primitive=Urge to Feed
id=439363
rarity=U
[/card]
[card]
primitive=Vampire Interloper
id=439364
rarity=C
[/card]
[card]
primitive=Vampire Nighthawk
id=439365
rarity=U
[/card]
[card]
primitive=Vampire Noble
id=439366
rarity=C
[/card]
[card]
primitive=Aggravated Assault
id=439367
rarity=R
[/card]
[card]
primitive=Disaster Radius
id=439368
rarity=R
[/card]
[card]
primitive=Mass Mutiny
id=439369
rarity=R
[/card]
[card]
primitive=Rush of Adrenaline
id=439370
rarity=C
[/card]
[card]
primitive=Shared Animosity
id=439371
rarity=R
[/card]
[card]
primitive=Vow of Lightning
id=439372
rarity=U
[/card]
[card]
primitive=Borderland Ranger
id=439373
rarity=C
[/card]
[card]
primitive=Giant Growth
id=439374
rarity=C
[/card]
[card]
primitive=Hunter's Prowess
id=439375
rarity=R
[/card]
[card]
primitive=Prey Upon
id=439376
rarity=C
[/card]
[card]
primitive=Rancor
id=439377
rarity=U
[/card]
[card]
primitive=Soul of the Harvest
id=439378
rarity=R
[/card]
[card]
primitive=Vow of Wildness
id=439379
rarity=U
[/card]
[card]
primitive=Jungle Barrier
id=439380
rarity=U
[/card]
[card]
primitive=Lightning Helix
id=439381
rarity=U
[/card]
[card]
primitive=Mortify
id=439382
rarity=U
[/card]
[card]
primitive=Zealous Persecution
id=439383
rarity=U
[/card]
[card]
primitive=Adaptive Automaton
id=439384
rarity=R
[/card]
[card]
primitive=Prismatic Lens
id=439385
rarity=U
[/card]
[card]
primitive=Quicksilver Amulet
id=439386
rarity=R
[/card]
[card]
primitive=Crumbling Necropolis
id=439387
rarity=U
[/card]
[card]
primitive=Jungle Shrine
id=439388
rarity=U
[/card]
[card]
primitive=Tainted Field
id=439389
rarity=U
[/card]

View File

@@ -1,646 +0,0 @@
[meta]
author=Wagic Team
name=GRN Guild Kit
year=2018-11-02
total=127
[/meta]
[card]
primitive=Etrata, the Silencer
id=455904
rarity=R
[/card]
[card]
primitive=Stolen Identity
id=455905
rarity=R
[/card]
[card]
primitive=Syncopate
id=455906
rarity=U
[/card]
[card]
primitive=Telling Time
id=455907
rarity=U
[/card]
[card]
primitive=Last Gasp
id=455908
rarity=C
[/card]
[card]
primitive=Netherborn Phalanx
id=455909
rarity=U
[/card]
[card]
primitive=Ribbons of Night
id=455910
rarity=U
[/card]
[card]
primitive=Call of the Nightwing
id=455911
rarity=U
[/card]
[card]
primitive=Circu, Dimir Lobotomist
id=455912
rarity=R
[/card]
[card]
primitive=Consuming Aberration
id=455913
rarity=R
[/card]
[card]
primitive=Dimir Charm
id=455914
rarity=U
[/card]
[card]
primitive=Dimir Doppelganger
id=455915
rarity=R
[/card]
[card]
primitive=Dimir Guildmage
id=455916
rarity=U
[/card]
[card]
primitive=Dinrova Horror
id=455917
rarity=U
[/card]
[card]
primitive=Glimpse the Unthinkable
id=455918
rarity=R
[/card]
[card]
primitive=Lazav, Dimir Mastermind
id=455919
rarity=M
[/card]
[card]
primitive=Mirko Vosk, Mind Drinker
id=455920
rarity=R
[/card]
[card]
primitive=Moroii
id=455921
rarity=U
[/card]
[card]
primitive=Nightveil Specter
id=455922
rarity=R
[/card]
[card]
primitive=Szadek, Lord of Secrets
id=455923
rarity=R
[/card]
[card]
primitive=Warped Physique
id=455924
rarity=U
[/card]
[card]
primitive=Dimir Signet
id=455925
rarity=C
[/card]
[card]
primitive=Dimir Aqueduct
id=455926
rarity=C
[/card]
[card]
primitive=Island
id=455927
rarity=L
[/card]
[card]
primitive=Swamp
id=455928
rarity=L
[/card]
[card]
primitive=Niv-Mizzet, the Firemind
id=456216
rarity=R
[/card]
[card]
primitive=Thunderheads
id=456217
rarity=U
[/card]
[card]
primitive=Char
id=456218
rarity=R
[/card]
[card]
primitive=Electrickery
id=456219
rarity=C
[/card]
[card]
primitive=Goblin Rally
id=456220
rarity=U
[/card]
[card]
primitive=Guttersnipe
id=456221
rarity=U
[/card]
[card]
primitive=Mizzium Mortars
id=456222
rarity=R
[/card]
[card]
primitive=Pyromatics
id=456223
rarity=C
[/card]
[card]
primitive=Shattering Spree
id=456224
rarity=U
[/card]
[card]
primitive=Cerebral Vortex
id=456225
rarity=R
[/card]
[card]
primitive=Djinn Illuminatus
id=456226
rarity=R
[/card]
[card]
primitive=Electrolyze
id=456227
rarity=U
[/card]
[card]
primitive=Gelectrode
id=456228
rarity=U
[/card]
[card]
primitive=Hypersonic Dragon
id=456229
rarity=R
[/card]
[card]
primitive=Invoke the Firemind
id=456230
rarity=R
[/card]
[card]
primitive=Izzet Charm
id=456231
rarity=U
[/card]
[card]
primitive=Nivix Guildmage
id=456232
rarity=U
[/card]
[card]
primitive=Stitch in Time
id=456233
rarity=R
[/card]
[card]
primitive=Tibor and Lumia
id=456234
rarity=R
[/card]
[card]
primitive=Burn
id=456235
rarity=U
[/card]
[card]
primitive=Turn
id=456235
rarity=U
[/card]
[card]
primitive=Izzet Signet
id=456236
rarity=C
[/card]
[card]
primitive=Izzet Boilerworks
id=456237
rarity=C
[/card]
[card]
primitive=Island
id=456238
rarity=L
[/card]
[card]
primitive=Mountain
id=456239
rarity=L
[/card]
[card]
primitive=Izoni, Thousand-Eyed
id=456054
rarity=R
[/card]
[card]
primitive=Darkblast
id=456055
rarity=U
[/card]
[card]
primitive=Slum Reaper
id=456056
rarity=U
[/card]
[card]
primitive=Stinkweed Imp
id=456057
rarity=C
[/card]
[card]
primitive=Vigor Mortis
id=456058
rarity=U
[/card]
[card]
primitive=Deadbridge Goliath
id=456059
rarity=R
[/card]
[card]
primitive=Elves of Deep Shadow
id=456060
rarity=C
[/card]
[card]
primitive=Abrupt Decay
id=456061
rarity=R
[/card]
[card]
primitive=Deadbridge Chant
id=456062
rarity=M
[/card]
[card]
primitive=Deathrite Shaman
id=456063
rarity=R
[/card]
[card]
primitive=Drown in Filth
id=456064
rarity=C
[/card]
[card]
primitive=Gaze of Granite
id=456065
rarity=R
[/card]
[card]
primitive=Golgari Charm
id=456066
rarity=U
[/card]
[card]
primitive=Grave-Shell Scarab
id=456067
rarity=R
[/card]
[card]
primitive=Grisly Salvage
id=456068
rarity=C
[/card]
[card]
primitive=Jarad, Golgari Lich Lord
id=456069
rarity=M
[/card]
[card]
primitive=Korozda Guildmage
id=456070
rarity=U
[/card]
[card]
primitive=Lotleth Troll
id=456071
rarity=R
[/card]
[card]
primitive=Putrefy
id=456072
rarity=U
[/card]
[card]
primitive=Savra, Queen of the Golgari
id=456073
rarity=R
[/card]
[card]
primitive=Shambling Shell
id=456074
rarity=C
[/card]
[card]
primitive=Sisters of Stone Death
id=456075
rarity=R
[/card]
[card]
primitive=Treasured Find
id=456076
rarity=U
[/card]
[card]
primitive=Golgari Signet
id=456077
rarity=C
[/card]
[card]
primitive=Golgari Rot Farm
id=456078
rarity=C
[/card]
[card]
primitive=Swamp
id=456079
rarity=L
[/card]
[card]
primitive=Forest
id=456080
rarity=L
[/card]
[card]
primitive=Aurelia, the Warleader
id=455754
rarity=M
[/card]
[card]
primitive=Boros Elite
id=455755
rarity=U
[/card]
[card]
primitive=Daring Skyjek
id=455756
rarity=C
[/card]
[card]
primitive=Bomber Corps
id=455757
rarity=C
[/card]
[card]
primitive=Frenzied Goblin
id=455758
rarity=U
[/card]
[card]
primitive=Legion Loyalist
id=455759
rarity=R
[/card]
[card]
primitive=Agrus Kos, Wojek Veteran
id=455760
rarity=R
[/card]
[card]
primitive=Boros Charm
id=455761
rarity=U
[/card]
[card]
primitive=Boros Reckoner
id=455762
rarity=R
[/card]
[card]
primitive=Boros Swiftblade
id=455763
rarity=U
[/card]
[card]
primitive=Brightflame
id=455764
rarity=R
[/card]
[card]
primitive=Firemane Angel
id=455765
rarity=R
[/card]
[card]
primitive=Firemane Avenger
id=455766
rarity=R
[/card]
[card]
primitive=Lightning Helix
id=455767
rarity=U
[/card]
[card]
primitive=Martial Glory
id=455768
rarity=C
[/card]
[card]
primitive=Master Warcraft
id=455769
rarity=R
[/card]
[card]
primitive=Razia, Boros Archangel
id=455770
rarity=R
[/card]
[card]
primitive=Spark Trooper
id=455771
rarity=R
[/card]
[card]
primitive=Sunhome Guildmage
id=455772
rarity=U
[/card]
[card]
primitive=Boros Keyrune
id=455773
rarity=U
[/card]
[card]
primitive=Boros Signet
id=455774
rarity=C
[/card]
[card]
primitive=Boros Garrison
id=455775
rarity=C
[/card]
[card]
primitive=Sunhome, Fortress of the Legion
id=455776
rarity=U
[/card]
[card]
primitive=Plains
id=455777
rarity=L
[/card]
[card]
primitive=Mountain
id=455778
rarity=L
[/card]
[card]
primitive=Trostani, Selesnya's Voice
id=456360
rarity=M
[/card]
[card]
primitive=Devouring Light
id=456361
rarity=U
[/card]
[card]
primitive=Hour of Reckoning
id=456362
rarity=R
[/card]
[card]
primitive=Gather Courage
id=456363
rarity=C
[/card]
[card]
primitive=Scatter the Seeds
id=456364
rarity=C
[/card]
[card]
primitive=Advent of the Wurm
id=456365
rarity=R
[/card]
[card]
primitive=Armada Wurm
id=456366
rarity=M
[/card]
[card]
primitive=Call of the Conclave
id=456367
rarity=U
[/card]
[card]
primitive=Centaur Healer
id=456368
rarity=C
[/card]
[card]
primitive=Dryad Militant
id=456369
rarity=U
[/card]
[card]
primitive=Glare of Subdual
id=456370
rarity=R
[/card]
[card]
primitive=Growing Ranks
id=456371
rarity=R
[/card]
[card]
primitive=Loxodon Hierarch
id=456372
rarity=R
[/card]
[card]
primitive=Pollenbright Wings
id=456373
rarity=U
[/card]
[card]
primitive=Privileged Position
id=456374
rarity=R
[/card]
[card]
primitive=Selesnya Charm
id=456375
rarity=U
[/card]
[card]
primitive=Selesnya Evangel
id=456376
rarity=C
[/card]
[card]
primitive=Selesnya Guildmage
id=456377
rarity=U
[/card]
[card]
primitive=Sundering Growth
id=456378
rarity=C
[/card]
[card]
primitive=Tolsimir Wolfblood
id=456379
rarity=R
[/card]
[card]
primitive=Watchwolf
id=456380
rarity=U
[/card]
[card]
primitive=Selesnya Signet
id=456381
rarity=C
[/card]
[card]
primitive=Grove of the Guardian
id=456382
rarity=R
[/card]
[card]
primitive=Selesnya Sanctuary
id=456383
rarity=C
[/card]
[card]
primitive=Plains
id=456384
rarity=L
[/card]
[card]
primitive=Forest
id=456385
rarity=L
[/card]

View File

@@ -1,671 +0,0 @@
[meta]
author=Wagic Team
name=RNA Guild Kit
year=2019-02-15
total=133
[/meta]
[card]
primitive=Isperia, Supreme Judge
id=460130
rarity=M
[/card]
[card]
primitive=Azorius Herald
id=460131
rarity=U
[/card]
[card]
primitive=Azorius Justiciar
id=460132
rarity=U
[/card]
[card]
primitive=Stoic Ephemera
id=460133
rarity=U
[/card]
[card]
primitive=Court Hussar
id=460134
rarity=U
[/card]
[card]
primitive=Hover Barrier
id=460135
rarity=U
[/card]
[card]
primitive=Archon of the Triumvirate
id=460136
rarity=R
[/card]
[card]
primitive=Azorius Charm
id=460137
rarity=U
[/card]
[card]
primitive=Azorius Guildmage
id=460138
rarity=U
[/card]
[card]
primitive=Detention Sphere
id=460139
rarity=R
[/card]
[card]
primitive=Dovescape
id=460140
rarity=R
[/card]
[card]
primitive=Dramatic Rescue
id=460141
rarity=C
[/card]
[card]
primitive=Isperia the Inscrutable
id=460142
rarity=R
[/card]
[card]
primitive=Judge's Familiar
id=460143
rarity=U
[/card]
[card]
primitive=Lavinia of the Tenth
id=460144
rarity=R
[/card]
[card]
primitive=Lyev Skyknight
id=460145
rarity=U
[/card]
[card]
primitive=Pride of the Clouds
id=460146
rarity=R
[/card]
[card]
primitive=Render Silent
id=460147
rarity=R
[/card]
[card]
primitive=Sky Hussar
id=460148
rarity=U
[/card]
[card]
primitive=Skymark Roc
id=460149
rarity=U
[/card]
[card]
primitive=Sphinx's Revelation
id=460150
rarity=M
[/card]
[card]
primitive=Windreaver
id=460151
rarity=R
[/card]
[card]
primitive=Azorius Keyrune
id=460152
rarity=U
[/card]
[card]
primitive=Azorius Signet
id=460153
rarity=U
[/card]
[card]
primitive=Azorius Chancery
id=460154
rarity=U
[/card]
[card]
primitive=Plains
id=460155
rarity=L
[/card]
[card]
primitive=Island
id=460156
rarity=L
[/card]
[card]
primitive=Teysa, Orzhov Scion
id=460454
rarity=R
[/card]
[card]
primitive=Belfry Spirit
id=460455
rarity=U
[/card]
[card]
primitive=Martyred Rusalka
id=460456
rarity=U
[/card]
[card]
primitive=Keening Banshee
id=460457
rarity=U
[/card]
[card]
primitive=Plagued Rusalka
id=460458
rarity=U
[/card]
[card]
primitive=Pontiff of Blight
id=460459
rarity=R
[/card]
[card]
primitive=Skeletal Vampire
id=460460
rarity=R
[/card]
[card]
primitive=Stab Wound
id=460461
rarity=U
[/card]
[card]
primitive=Ultimate Price
id=460462
rarity=U
[/card]
[card]
primitive=Angel of Despair
id=460463
rarity=R
[/card]
[card]
primitive=Deathpact Angel
id=460464
rarity=M
[/card]
[card]
primitive=Debtors' Knell
id=460465
rarity=R
[/card]
[card]
primitive=Ghost Council of Orzhova
id=460466
rarity=R
[/card]
[card]
primitive=One Thousand Lashes
id=460467
rarity=U
[/card]
[card]
primitive=Orzhov Charm
id=460468
rarity=U
[/card]
[card]
primitive=Orzhov Pontiff
id=460469
rarity=R
[/card]
[card]
primitive=Pillory of the Sleepless
id=460470
rarity=U
[/card]
[card]
primitive=Sin Collector
id=460471
rarity=U
[/card]
[card]
primitive=Treasury Thrull
id=460472
rarity=R
[/card]
[card]
primitive=Vizkopa Guildmage
id=460473
rarity=U
[/card]
[card]
primitive=Orzhov Signet
id=460474
rarity=C
[/card]
[card]
primitive=Orzhov Basilica
id=460475
rarity=C
[/card]
[card]
primitive=Plains
id=460476
rarity=L
[/card]
[card]
primitive=Swamp
id=460477
rarity=L
[/card]
[card]
primitive=Rakdos, Lord of Riots
id=460598
rarity=M
[/card]
[card]
primitive=Crypt Champion
id=460599
rarity=U
[/card]
[card]
primitive=Thrill-Kill Assassin
id=460600
rarity=U
[/card]
[card]
primitive=Cackling Flames
id=460601
rarity=C
[/card]
[card]
primitive=Demonfire
id=460602
rarity=R
[/card]
[card]
primitive=Rakdos Pit Dragon
id=460603
rarity=R
[/card]
[card]
primitive=Splatter Thug
id=460604
rarity=C
[/card]
[card]
primitive=Utvara Hellkite
id=460605
rarity=M
[/card]
[card]
primitive=Auger Spree
id=460606
rarity=C
[/card]
[card]
primitive=Avatar of Discord
id=460607
rarity=R
[/card]
[card]
primitive=Carnival Hellsteed
id=460608
rarity=R
[/card]
[card]
primitive=Dreadbore
id=460609
rarity=R
[/card]
[card]
primitive=Jagged Poppet
id=460610
rarity=U
[/card]
[card]
primitive=Lyzolda, the Blood Witch
id=460611
rarity=R
[/card]
[card]
primitive=Master of Cruelties
id=460612
rarity=M
[/card]
[card]
primitive=Rakdos Cackler
id=460613
rarity=U
[/card]
[card]
primitive=Rakdos Charm
id=460614
rarity=U
[/card]
[card]
primitive=Rakdos Guildmage
id=460615
rarity=U
[/card]
[card]
primitive=Rakdos Shred-Freak
id=460616
rarity=C
[/card]
[card]
primitive=Rakdos the Defiler
id=460617
rarity=R
[/card]
[card]
primitive=Rakdos's Return
id=460618
rarity=M
[/card]
[card]
primitive=Riot Spikes
id=460619
rarity=C
[/card]
[card]
primitive=Wrecking Ball
id=460620
rarity=C
[/card]
[card]
primitive=Rakdos Keyrune
id=460621
rarity=U
[/card]
[card]
primitive=Rakdos Signet
id=460622
rarity=U
[/card]
[card]
primitive=Rakdos Carnarium
id=460623
rarity=C
[/card]
[card]
primitive=Swamp
id=460624
rarity=L
[/card]
[card]
primitive=Mountain
id=460625
rarity=L
[/card]
[card]
primitive=Ruric Thar, the Unbowed
id=460292
rarity=R
[/card]
[card]
primitive=Skarrgan Firebird
id=460293
rarity=R
[/card]
[card]
primitive=Birds of Paradise
id=460294
rarity=R
[/card]
[card]
primitive=Protean Hulk
id=460295
rarity=R
[/card]
[card]
primitive=Skarrgan Pit-Skulk
id=460296
rarity=C
[/card]
[card]
primitive=Wasteland Viper
id=460297
rarity=U
[/card]
[card]
primitive=Wurmweaver Coil
id=460298
rarity=R
[/card]
[card]
primitive=Borborygmos
id=460299
rarity=R
[/card]
[card]
primitive=Burning-Tree Emissary
id=460300
rarity=U
[/card]
[card]
primitive=Burning-Tree Shaman
id=460301
rarity=R
[/card]
[card]
primitive=Ghor-Clan Rampager
id=460302
rarity=U
[/card]
[card]
primitive=Giant Solifuge
id=460303
rarity=R
[/card]
[card]
primitive=Gruul Charm
id=460304
rarity=U
[/card]
[card]
primitive=Pit Fight
id=460305
rarity=C
[/card]
[card]
primitive=Rubblebelt Raiders
id=460306
rarity=R
[/card]
[card]
primitive=Rubblehulk
id=460307
rarity=R
[/card]
[card]
primitive=Rumbling Slum
id=460308
rarity=R
[/card]
[card]
primitive=Savage Twister
id=460309
rarity=U
[/card]
[card]
primitive=Savageborn Hydra
id=460310
rarity=M
[/card]
[card]
primitive=Scab-Clan Mauler
id=460311
rarity=C
[/card]
[card]
primitive=Ulasht, the Hate Seed
id=460312
rarity=R
[/card]
[card]
primitive=Zhur-Taa Druid
id=460313
rarity=C
[/card]
[card]
primitive=Zhur-Taa Swine
id=460314
rarity=C
[/card]
[card]
primitive=Gruul Signet
id=460315
rarity=U
[/card]
[card]
primitive=Gruul Turf
id=460316
rarity=C
[/card]
[card]
primitive=Mountain
id=460317
rarity=L
[/card]
[card]
primitive=Forest
id=460318
rarity=L
[/card]
[card]
primitive=Zegana, Utopian Speaker
id=460766
rarity=R
[/card]
[card]
primitive=Cloudfin Raptor
id=460767
rarity=C
[/card]
[card]
primitive=Rapid Hybridization
id=460768
rarity=U
[/card]
[card]
primitive=Cytoplast Root-Kin
id=460769
rarity=R
[/card]
[card]
primitive=Experiment One
id=460770
rarity=U
[/card]
[card]
primitive=Gyre Sage
id=460771
rarity=R
[/card]
[card]
primitive=Miming Slime
id=460772
rarity=C
[/card]
[card]
primitive=Vinelasher Kudzu
id=460773
rarity=R
[/card]
[card]
primitive=Coiling Oracle
id=460774
rarity=C
[/card]
[card]
primitive=Elusive Krasis
id=460775
rarity=U
[/card]
[card]
primitive=Experiment Kraj
id=460776
rarity=R
[/card]
[card]
primitive=Fathom Mage
id=460777
rarity=R
[/card]
[card]
primitive=Momir Vig, Simic Visionary
id=460778
rarity=R
[/card]
[card]
primitive=Nimbus Swimmer
id=460779
rarity=U
[/card]
[card]
primitive=Omnibian
id=460780
rarity=R
[/card]
[card]
primitive=Plaxcaster Frogling
id=460781
rarity=U
[/card]
[card]
primitive=Progenitor Mimic
id=460782
rarity=M
[/card]
[card]
primitive=Simic Sky Swallower
id=460783
rarity=R
[/card]
[card]
primitive=Trygon Predator
id=460784
rarity=U
[/card]
[card]
primitive=Urban Evolution
id=460785
rarity=U
[/card]
[card]
primitive=Voidslime
id=460786
rarity=R
[/card]
[card]
primitive=Vorel of the Hull Clade
id=460787
rarity=R
[/card]
[card]
primitive=Zameck Guildmage
id=460788
rarity=U
[/card]
[card]
primitive=Simic Signet
id=460789
rarity=U
[/card]
[card]
primitive=Simic Growth Chamber
id=460790
rarity=U
[/card]
[card]
primitive=Island
id=460791
rarity=L
[/card]
[card]
primitive=Forest
id=460792
rarity=L
[/card]

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,276 +0,0 @@
[meta]
author=Wagic Team
name=Amonkhet Invocations
year=2017-04-28
total=54
[/meta]
[card]
primitive=Austere Command
id=429860
rarity=M
[/card]
[card]
primitive=Aven Mindcensor
id=429861
rarity=M
[/card]
[card]
primitive=Containment Priest
id=429862
rarity=M
[/card]
[card]
primitive=Loyal Retainers
id=429863
rarity=M
[/card]
[card]
primitive=Oketra the True
id=429864
rarity=M
[/card]
[card]
primitive=Worship
id=429865
rarity=M
[/card]
[card]
primitive=Wrath of God
id=429866
rarity=M
[/card]
[card]
primitive=Consecrated Sphinx
id=429867
rarity=M
[/card]
[card]
primitive=Counterbalance
id=429868
rarity=M
[/card]
[card]
primitive=Counterspell
id=429869
rarity=M
[/card]
[card]
primitive=Cryptic Command
id=429870
rarity=M
[/card]
[card]
primitive=Daze
id=429871
rarity=M
[/card]
[card]
primitive=Divert
id=429872
rarity=M
[/card]
[card]
primitive=Force of Will
id=429873
rarity=M
[/card]
[card]
primitive=Kefnet the Mindful
id=429874
rarity=M
[/card]
[card]
primitive=Pact of Negation
id=429875
rarity=M
[/card]
[card]
primitive=Spell Pierce
id=429876
rarity=M
[/card]
[card]
primitive=Stifle
id=429877
rarity=M
[/card]
[card]
primitive=Attrition
id=429878
rarity=M
[/card]
[card]
primitive=Bontu the Glorified
id=429879
rarity=M
[/card]
[card]
primitive=Dark Ritual
id=429880
rarity=M
[/card]
[card]
primitive=Diabolic Intent
id=429881
rarity=M
[/card]
[card]
primitive=Entomb
id=429882
rarity=M
[/card]
[card]
primitive=Mind Twist
id=429883
rarity=M
[/card]
[card]
primitive=Aggravated Assault
id=429884
rarity=M
[/card]
[card]
primitive=Chain Lightning
id=429885
rarity=M
[/card]
[card]
primitive=Hazoret the Fervent
id=429886
rarity=M
[/card]
[card]
primitive=Rhonas the Indomitable
id=429887
rarity=M
[/card]
[card]
primitive=Maelstrom Pulse
id=429888
rarity=M
[/card]
[card]
primitive=Vindicate
id=429889
rarity=M
[/card]
[card]
primitive=Armageddon
id=430666
rarity=M
[/card]
[card]
primitive=Capsize
id=430667
rarity=M
[/card]
[card]
primitive=Forbid
id=430668
rarity=M
[/card]
[card]
primitive=Omniscience
id=430669
rarity=M
[/card]
[card]
primitive=Opposition
id=430670
rarity=M
[/card]
[card]
primitive=Sunder
id=430671
rarity=M
[/card]
[card]
primitive=Threads of Disloyalty
id=430672
rarity=M
[/card]
[card]
primitive=Avatar of Woe
id=430673
rarity=M
[/card]
[card]
primitive=Damnation
id=430674
rarity=M
[/card]
[card]
primitive=Desolation Angel
id=430675
rarity=M
[/card]
[card]
primitive=Diabolic Edict
id=430676
rarity=M
[/card]
[card]
primitive=Doomsday
id=430677
rarity=M
[/card]
[card]
primitive=No Mercy
id=430678
rarity=M
[/card]
[card]
primitive=Slaughter Pact
id=430679
rarity=M
[/card]
[card]
primitive=Thoughtseize
id=430680
rarity=M
[/card]
[card]
primitive=Blood Moon
id=430681
rarity=M
[/card]
[card]
primitive=Boil
id=430682
rarity=M
[/card]
[card]
primitive=Shatterstorm
id=430683
rarity=M
[/card]
[card]
primitive=Through the Breach
id=430684
rarity=M
[/card]
[card]
primitive=Choke
id=430685
rarity=M
[/card]
[card]
primitive=The Locust God
id=430686
rarity=M
[/card]
[card]
primitive=Lord of Extinction
id=430687
rarity=M
[/card]
[card]
primitive=The Scarab God
id=430688
rarity=M
[/card]
[card]
primitive=The Scorpion God
id=430689
rarity=M
[/card]

File diff suppressed because it is too large Load Diff

View File

@@ -1,206 +0,0 @@
[meta]
author=Wagic Team
name=Ultimate Box Topper
year=2018-12-07
total=40
[/meta]
[card]
primitive=Emrakul, the Aeons Torn
id=457105
rarity=M
[/card]
[card]
primitive=Karn Liberated
id=457106
rarity=M
[/card]
[card]
primitive=Kozilek, Butcher of Truth
id=457107
rarity=M
[/card]
[card]
primitive=Ulamog, the Infinite Gyre
id=457108
rarity=M
[/card]
[card]
primitive=Snapcaster Mage
id=457109
rarity=M
[/card]
[card]
primitive=Temporal Manipulation
id=457110
rarity=M
[/card]
[card]
primitive=Bitterblossom
id=457111
rarity=M
[/card]
[card]
primitive=Demonic Tutor
id=457112
rarity=M
[/card]
[card]
primitive=Goryo's Vengeance
id=457113
rarity=M
[/card]
[card]
primitive=Liliana of the Veil
id=457114
rarity=M
[/card]
[card]
primitive=Mikaeus, the Unhallowed
id=457115
rarity=M
[/card]
[card]
primitive=Reanimate
id=457116
rarity=M
[/card]
[card]
primitive=Tasigur, the Golden Fang
id=457117
rarity=M
[/card]
[card]
primitive=Balefire Dragon
id=457118
rarity=M
[/card]
[card]
primitive=Through the Breach
id=457119
rarity=M
[/card]
[card]
primitive=Eternal Witness
id=457120
rarity=M
[/card]
[card]
primitive=Life from the Loam
id=457121
rarity=M
[/card]
[card]
primitive=Noble Hierarch
id=457122
rarity=M
[/card]
[card]
primitive=Tarmogoyf
id=457123
rarity=M
[/card]
[card]
primitive=Vengevine
id=457124
rarity=M
[/card]
[card]
primitive=Gaddock Teeg
id=457125
rarity=M
[/card]
[card]
primitive=Leovold, Emissary of Trest
id=457126
rarity=M
[/card]
[card]
primitive=Lord of Extinction
id=457127
rarity=M
[/card]
[card]
primitive=Maelstrom Pulse
id=457128
rarity=M
[/card]
[card]
primitive=Sigarda, Host of Herons
id=457129
rarity=M
[/card]
[card]
primitive=Fulminator Mage
id=457130
rarity=M
[/card]
[card]
primitive=Kitchen Finks
id=457131
rarity=M
[/card]
[card]
primitive=Engineered Explosives
id=457132
rarity=M
[/card]
[card]
primitive=Mana Vault
id=457133
rarity=M
[/card]
[card]
primitive=Platinum Emperion
id=457134
rarity=M
[/card]
[card]
primitive=Ancient Tomb
id=457135
rarity=M
[/card]
[card]
primitive=Cavern of Souls
id=457136
rarity=M
[/card]
[card]
primitive=Celestial Colonnade
id=457137
rarity=M
[/card]
[card]
primitive=Creeping Tar Pit
id=457138
rarity=M
[/card]
[card]
primitive=Dark Depths
id=457139
rarity=M
[/card]
[card]
primitive=Karakas
id=457140
rarity=M
[/card]
[card]
primitive=Lavaclaw Reaches
id=457141
rarity=M
[/card]
[card]
primitive=Raging Ravine
id=457142
rarity=M
[/card]
[card]
primitive=Stirring Wildwood
id=457143
rarity=M
[/card]
[card]
primitive=Urborg, Tomb of Yawgmoth
id=457144
rarity=M
[/card]

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,46 +0,0 @@
[meta]
author=Wagic Team
name=Signature Spellbook: Jace
year=2018-06-15
total=8
[/meta]
[card]
primitive=Jace Beleren
id=447129
rarity=M
[/card]
[card]
primitive=Blue Elemental Blast
id=447130
rarity=R
[/card]
[card]
primitive=Brainstorm
id=447131
rarity=R
[/card]
[card]
primitive=Counterspell
id=447132
rarity=R
[/card]
[card]
primitive=Gifts Ungiven
id=447133
rarity=R
[/card]
[card]
primitive=Mystical Tutor
id=447134
rarity=R
[/card]
[card]
primitive=Negate
id=447135
rarity=R
[/card]
[card]
primitive=Threads of Disloyalty
id=447136
rarity=R
[/card]

View File

@@ -0,0 +1,412 @@
[meta]
author=Wagic Team
name=Duel Decks: Speed vs. Cunning
block=Duel
year=2014
total=81
[/meta]
[card]
primitive=Act of Treason
id=386299
rarity=C
[/card]
[card]
primitive=Aquamorph Entity
id=386300
rarity=C
[/card]
[card]
primitive=Arc Trail
id=386301
rarity=U
[/card]
[card]
primitive=Arcanis the Omnipotent
id=386302
rarity=M
[/card]
[card]
primitive=Arrow Volley Trap
id=386303
rarity=U
[/card]
[card]
primitive=Banefire
id=386304
rarity=R
[/card]
[card]
primitive=Beetleback Chief
id=386305
rarity=U
[/card]
[card]
primitive=Bone Splinters
id=386306
rarity=C
[/card]
[card]
primitive=Coral Trickster
id=386307
rarity=C
[/card]
[card]
primitive=Dauntless Onslaught
id=386308
rarity=U
[/card]
[card]
primitive=Dregscape Zombie
id=386309
rarity=C
[/card]
[card]
primitive=Echo Tracer
id=386310
rarity=C
[/card]
[card]
primitive=Evolving Wilds
id=386311
rarity=C
[/card]
[card]
primitive=Faerie Impostor
id=386312
rarity=U
[/card]
[card]
primitive=Faerie Invaders
id=386313
rarity=C
[/card]
[card]
primitive=Fathom Seer
id=386314
rarity=C
[/card]
[card]
primitive=Fiery Fall
id=386315
rarity=C
[/card]
[card]
primitive=Flame-Kin Zealot
id=386316
rarity=U
[/card]
[card]
primitive=Fleeting Distraction
id=386317
rarity=C
[/card]
[card]
primitive=Fleshbag Marauder
id=386318
rarity=U
[/card]
[card]
primitive=Frenzied Goblin
id=386319
rarity=U
[/card]
[card]
primitive=Fury of the Horde
id=386320
rarity=R
[/card]
[card]
primitive=Ghitu Encampment
id=386321
rarity=U
[/card]
[card]
primitive=Goblin Bombardment
id=386323
rarity=U
[/card]
[card]
primitive=Goblin Deathraiders
id=386324
rarity=C
[/card]
[card]
primitive=Goblin Warchief
id=386325
rarity=U
[/card]
[card]
primitive=Hell's Thunder
id=386326
rarity=R
[/card]
[card]
primitive=Hellraiser Goblin
id=386327
rarity=U
[/card]
[card]
primitive=Hold the Line
id=386328
rarity=R
[/card]
[card]
primitive=Hussar Patrol
id=386329
rarity=C
[/card]
[card]
primitive=Impulse
id=386330
rarity=C
[/card]
[card]
primitive=Infantry Veteran
id=386331
rarity=C
[/card]
[card]
primitive=Inferno Trap
id=386332
rarity=U
[/card]
[card]
primitive=Island
id=386333
rarity=L
[/card]
[card]
primitive=Island
id=386334
rarity=L
[/card]
[card]
primitive=Island
id=386335
rarity=L
[/card]
[card]
primitive=Jeskai Elder
id=386336
rarity=U
[/card]
[card]
primitive=Kathari Bomber
id=386337
rarity=C
[/card]
[card]
primitive=Kor Hookmaster
id=386338
rarity=C
[/card]
[card]
primitive=Krenko's Command
id=386340
rarity=C
[/card]
[card]
primitive=Krenko, Mob Boss
id=386339
rarity=R
[/card]
[card]
primitive=Leonin Snarecaster
id=386341
rarity=C
[/card]
[card]
primitive=Lightning Angel
id=386342
rarity=R
[/card]
[card]
primitive=Lightning Helix
id=386343
rarity=U
[/card]
[card]
primitive=Lone Missionary
id=386344
rarity=C
[/card]
[card]
primitive=Mana Leak
id=386345
rarity=C
[/card]
[card]
primitive=Mardu Heart-Piercer
id=386346
rarity=U
[/card]
[card]
primitive=Master Decoy
id=386347
rarity=C
[/card]
[card]
primitive=Mountain
id=386348
rarity=L
[/card]
[card]
primitive=Mountain
id=386349
rarity=L
[/card]
[card]
primitive=Mountain
id=386350
rarity=L
[/card]
[card]
primitive=Mountain
id=386351
rarity=L
[/card]
[card]
primitive=Mystic Monastery
id=386352
rarity=U
[/card]
[card]
primitive=Nomad Outpost
id=386353
rarity=U
[/card]
[card]
primitive=Ogre Battledriver
id=386354
rarity=R
[/card]
[card]
primitive=Oni of Wild Places
id=386355
rarity=U
[/card]
[card]
primitive=Orcish Cannonade
id=386356
rarity=C
[/card]
[card]
primitive=Plains
id=386357
rarity=L
[/card]
[card]
primitive=Plains
id=386358
rarity=L
[/card]
[card]
primitive=Plains
id=386359
rarity=L
[/card]
[card]
primitive=Plains
id=386360
rarity=L
[/card]
[card]
primitive=Reckless Abandon
id=386361
rarity=C
[/card]
[card]
primitive=Repeal
id=386362
rarity=C
[/card]
[card]
primitive=Scourge Devil
id=386363
rarity=U
[/card]
[card]
primitive=Shambling Remains
id=386364
rarity=U
[/card]
[card]
primitive=Shock
id=386365
rarity=C
[/card]
[card]
primitive=Sparkmage Apprentice
id=386366
rarity=C
[/card]
[card]
primitive=Sphinx of Uthuun
id=386367
rarity=R
[/card]
[card]
primitive=Stave Off
id=386368
rarity=C
[/card]
[card]
primitive=Steam Augury
id=386369
rarity=R
[/card]
[card]
primitive=Stonecloaker
id=386370
rarity=U
[/card]
[card]
primitive=Swamp
id=386371
rarity=L
[/card]
[card]
primitive=Swamp
id=386372
rarity=L
[/card]
[card]
primitive=Swamp
id=386373
rarity=L
[/card]
[card]
primitive=Swift Justice
id=386374
rarity=C
[/card]
[card]
primitive=Terramorphic Expanse
id=386375
rarity=C
[/card]
[card]
primitive=Thousand Winds
id=386376
rarity=R
[/card]
[card]
primitive=Traumatic Visions
id=386377
rarity=C
[/card]
[card]
primitive=Whiplash Trap
id=386378
rarity=C
[/card]
[card]
primitive=Willbender
id=386379
rarity=U
[/card]
[card]
primitive=Zurgo Helmsmasher
id=386380
rarity=M
[/card]

File diff suppressed because it is too large Load Diff

View File

@@ -1,31 +0,0 @@
[meta]
author=Wagic Team
name=Unstable
year=2017-12-08
total=5
[/meta]
[card]
primitive=Plains
id=439601
rarity=M
[/card]
[card]
primitive=Island
id=439602
rarity=M
[/card]
[card]
primitive=Swamp
id=439603
rarity=M
[/card]
[card]
primitive=Mountain
id=439604
rarity=M
[/card]
[card]
primitive=Forest
id=439605
rarity=M
[/card]

View File

@@ -1,151 +0,0 @@
[meta]
author=Wagic Team
name=From the Vault: Transform
year=2017-11-24
total=16
[/meta]
[card]
primitive=Avacyn, the Purifier
id=439315
rarity=T
[/card]
[card]
primitive=Archangel Avacyn
id=439314
rarity=M
[/card]
[card]
primitive=Temple of Aclazotz
id=439317
rarity=T
[/card]
[card]
primitive=Arguel's Blood Fast
id=439316
rarity=M
[/card]
[card]
primitive=Arlinn, Embraced by the Moon
id=439319
rarity=T
[/card]
[card]
primitive=Arlinn Kord
id=439318
rarity=M
[/card]
[card]
primitive=Lord of Lineage
id=439321
rarity=T
[/card]
[card]
primitive=Bloodline Keeper
id=439320
rarity=M
[/card]
[card]
primitive=Bruna, the Fading Light
id=439322
rarity=M
[/card]
[card]
primitive=Brisela, Voice of Nightmares
id=439323
rarity=T
[/card]
[card]
primitive=Chandra, Roaring Flame
id=439325
rarity=T
[/card]
[card]
primitive=Chandra, Fire of Kaladesh
id=439324
rarity=M
[/card]
[card]
primitive=Insectile Aberration
id=439327
rarity=T
[/card]
[card]
primitive=Delver of Secrets
id=439326
rarity=M
[/card]
[card]
primitive=Withengar Unbound
id=439329
rarity=T
[/card]
[card]
primitive=Elbrus, the Binding Blade
id=439328
rarity=M
[/card]
[card]
primitive=Garruk, the Veil-Cursed
id=439331
rarity=T
[/card]
[card]
primitive=Garruk Relentless
id=439330
rarity=M
[/card]
[card]
primitive=Gisela, the Broken Blade
id=439332
rarity=M
[/card]
[card]
primitive=Ravager of the Fells
id=439334
rarity=T
[/card]
[card]
primitive=Huntmaster of the Fells
id=439333
rarity=M
[/card]
[card]
primitive=Jace, Telepath Unbound
id=439336
rarity=T
[/card]
[card]
primitive=Jace, Vryn's Prodigy
id=439335
rarity=M
[/card]
[card]
primitive=Gideon, Battle-Forged
id=439338
rarity=T
[/card]
[card]
primitive=Kytheon, Hero of Akros
id=439337
rarity=M
[/card]
[card]
primitive=Liliana, Defiant Necromancer
id=439340
rarity=T
[/card]
[card]
primitive=Liliana, Heretical Healer
id=439339
rarity=M
[/card]
[card]
primitive=Nissa, Sage Animist
id=439342
rarity=T
[/card]
[card]
primitive=Nissa, Vastwood Seer
id=439341
rarity=M
[/card]

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,674 +0,0 @@
grade=borderline
[card]
name=Regna, the Redeemer
abilities=flying
auto=may moveto(myhand) notatarget(krav, the unredeemed|mylibrary)
auto=@each endofturn restriction{compare(lifegain)~morethan~0}:create(warrior:creature warrior:1/1:white:)*2
text=Partner with Krav, the Unredeemed (When this creature enters the battlefield, target player may put Krav into their hand from their library, then shuffle.) -- Flying -- At the beginning of each end step, if your team gained life this turn, create two 1/1 white Warrior creature tokens.
mana={5}{W}
type=Legendary Creature
subtype=Angel
power=4
toughness=4
[/card]
[card]
name=Virtus the Veiled
abilities=deathtouch
auto=may moveto(myhand) notatarget(gorm the great|mylibrary)
auto=@combatdamaged(player) from(this):life:-halfdownopponentlifetotal opponent
text=Partner with Gorm the Great (When this creature enters the battlefield, target player may put Gorm into their hand from their library, then shuffle.) -- Deathtouch -- Whenever Virtus the Veiled deals combat damage to a player, that player loses half their life, rounded up.
mana={2}{B}
type=Legendary Creature
subtype=Azra Assassin
power=1
toughness=1
[/card]
[card]
name=Khorvath Brightflame
abilities=flying,haste
auto=may moveto(myhand) notatarget(sylvia brightspear|mylibrary)
auto=lord(knight|myBattlefield) flying
auto=lord(knight|myBattlefield) haste
text=Partner with Sylvia Brightspear (When this creature enters the battlefield, target player may put Sylvia into their hand from their library, then shuffle.) -- Flying, haste -- Knights your team controls have flying and haste.
mana={5}{R}
type=Legendary Creature
subtype=Dragon
power=3
toughness=4
[/card]
[card]
name=Sylvia Brightspear
abilities=double strike
auto=lord(dragon|myBattlefield) haste double strike
auto=may moveto(myhand) notatarget(khorvath brightflame|mylibrary)
text=Partner with Khorvath Brightflame (When this creature enters the battlefield, target player may put Khorvath into their hand from their library, then shuffle.) -- Double strike -- Dragons your team controls have double strike.
mana={2}{W}
type=Legendary Creature
subtype=Human Knight
power=2
toughness=2
[/card]
[card]
name=Toothy, Imaginary Friend
auto=may moveto(myhand) notatarget(pir, imaginative rascal|mylibrary)
auto=@drawof(player):counter(1/1)
auto=@movedTo(this|nonbattlezone) from(myBattlefield):thisforeach(counter{1/1,1}) draw:1 controller
text=Partner with Pir, Imaginative Rascal (When this creature enters the battlefield, target player may put Pir into their hand from their library, then shuffle.) -- Whenever you draw a card, put a +1/+1 counter on Toothy, Imaginary Friend. -- When Toothy leaves the battlefield, draw a card for each +1/+1 counter on it.
mana={3}{U}
type=Legendary Creature
subtype=Illusion
power=1
toughness=1
[/card]
[card]
name=Blaring Recruiter
auto=may moveto(myhand) notatarget(blaring captain|mylibrary)
auto={2}{W}:create(warrior:creature warrior:1/1:white:)
text=Partner with Blaring Captain (When this creature enters the battlefield, target player may put Blaring Captain into their hand from their library, then shuffle.) -- {2}{W}: Create a 1/1 white Warrior creature token.
mana={3}{W}
type=Creature
subtype=Elf Warrior
power=2
toughness=2
[/card]
[card]
name=Blaring Captain
auto=may moveto(myhand) notatarget(blaring recruiter|mylibrary)
auto=@combat(attacking) source(this):all(warrior[attacking]) 1/1
text=Partner with Blaring Recruiter (When this creature enters the battlefield, target player may put Blaring Recruiter into their hand from their library, then shuffle.) -- Whenever Blaring Captain attacks, attacking Warriors get +1/+1 until end of turn.
mana={3}{B}
type=Creature
subtype=Azra Warrior
power=2
toughness=2
[/card]
[card]
name=Chakram Retriever
auto=may moveto(myhand) notatarget(chakram slinger|mylibrary)
auto=@movedTo(*|mystack) restriction{myturnonly}:untap target(creature)
text=Partner with Chakram Slinger (When this creature enters the battlefield, target player may put Chakram Slinger into their hand from their library, then shuffle.) -- Whenever you cast a spell during your turn, untap target creature.
mana={4}{U}
type=Creature
subtype=Elemental Hound
power=2
toughness=4
[/card]
[card]
name=Chakram Slinger
auto=may moveto(myhand) notatarget(chakram retriever|mylibrary)
auto={R}{T}:damage:2 target(player)
text=Partner with Chakram Retriever (When this creature enters the battlefield, target player may put Chakram Retriever into their hand from their library, then shuffle.) -- {R}, {T}: Chakram Slinger deals 2 damage to target player or planeswalker.
mana={4}{R}
type=Creature
subtype=Human Warrior
power=2
toughness=4
[/card]
[card]
name=Soulblade Corrupter
abilities=deathtouch
auto=may moveto(myhand) notatarget(soulblade renewer|mylibrary)
auto=@combat(attacking) source(creature[counter{1/1.1}]|mybattlefield):deathtouch ueot
text=Partner with Soulblade Renewer (When this creature enters the battlefield, target player may put Soulblade Renewer into their hand from their library, then shuffle.) -- Deathtouch -- Whenever a creature with a +1/+1 counter on it attacks one of your opponents, that creature gains deathtouch until end of turn.
mana={4}{B}
type=Creature
subtype=Human Warrior
power=3
toughness=3
[/card]
[card]
name=Soulblade Renewer
auto=may moveto(myhand) notatarget(soulblade corrupter|mylibrary)
auto=target(<upto:2>other creature|battlefield) counter(1/1)
text=Partner with Soulblade Corrupter (When this creature enters the battlefield, target player may put Soulblade Corrupter into their hand from their library, then shuffle.) -- When Soulblade Renewer enters the battlefield, support 2. (Put a +1/+1 counter on each of up to two other target creatures.)
mana={4}{G}
type=Creature
subtype=Elf Warrior
power=2
toughness=2
[/card]
[card]
name=Proud Mentor
auto=may moveto(myhand) notatarget(impetuous protege|mylibrary)
auto={W}{T}:tap target(creature)
text=Partner with Impetuous Protege (When this creature enters the battlefield, target player may put Impetuous Protege into their hand from their library, then shuffle.) -- {W}, {T}: Tap target creature.
mana={2}{W}
type=Creature
subtype=Human Warrior
power=1
toughness=1
[/card]
[card]
name=Ley Weaver
auto=may moveto(myhand) notatarget(lore weaver|mylibrary)
auto={T}:untap <2>target(land)
text=Partner with Lore Weaver (When this creature enters the battlefield, target player may put Lore Weaver into their hand from their library, then shuffle.) -- {T}: Untap two target lands.
mana={3}{G}
type=Creature
subtype=Human Druid
power=2
toughness=2
[/card]
[card]
name=Lore Weaver
auto=may moveto(myhand) notatarget(ley weaver|mylibrary)
auto={5}{U}{U}:draw:2 target(player)
text=Partner with Ley Weaver (When this creature enters the battlefield, target player may put Ley Weaver into their hand from their library, then shuffle.) -- {5}{U}{U}: Target player draws two cards.
mana={3}{U}
type=Creature
subtype=Human Wizard
power=2
toughness=2
[/card]
[card]
name=Arena Rector
auto=@movedTo(this|graveyard) from(battlefield):may all(trigger[to]) moveto(exile) and! moveTo(myBattlefield) target(planeswalker|myLibrary)!
text=When Arena Rector dies, you may exile it. If you do, search your library for a planeswalker card, put it onto the battlefield, then shuffle your library.
mana={3}{W}
type=Creature
subtype=Human Cleric
power=1
toughness=2
[/card]
[card]
name=Aurora Champion
auto=@combat(attacking) source(this) aslongas(other warrior|myBattlefield):tap target(creature)
text=Whenever Aurora Champion attacks, if your team controls another Warrior, tap target creature.
mana={2}{W}
type=Creature
subtype=Elf Warrior
power=3
toughness=2
[/card]
[card]
name=Brightling
auto={W}:vigilance ueot
auto={W}:lifelink ueot
auto={W}:moveTo(ownerHand)
auto={1}:1/-1 ueot
auto={1}:-1/1 ueot
text={W}: Brightling gains vigilance until end of turn. -- {W}: Brightling gains lifelink until end of turn. -- {W}: Return Brightling to its owner's hand. -- {1}: Brightling gets +1/-1 or -1/+1 until end of turn.
mana={1}{W}{W}
type=Creature
subtype=Shapeshifter
power=3
toughness=3
[/card]
[card]
name=Bring Down
target=creature[power>=4]
auto=destroy
text=Assist (Another player can pay up to {3} of this spell's cost.) -- Destroy target creature with power 4 or greater.
mana={3}{W}
type=Sorcery
[/card]
[card]
name=Dwarven Lightsmith
auto=all(creature|myBattlefield) 1/1
text=Assist (Another player can pay up to {5} of this spell's cost.) -- When Dwarven Lightsmith enters the battlefield, creatures your team controls get +1/+1 until end of turn.
mana={5}{W}
type=Creature
subtype=Dwarf Cleric
power=3
toughness=4
[/card]
[card]
name=Jubilant Mascot
auto=@each my combatbegins:may pay({3}{w}):target(<upto:2>other creature|battlefield) counter(1/1)
text=At the beginning of combat on your turn, you may pay {3}{W}. If you do, support 2. (Put a +1/+1 counter on each of up to two other target creatures.)
mana={2}{W}
type=Creature
subtype=Homunculus
power=1
toughness=1
[/card]
[card]
name=Play of the Game
auto=moveto(exile) all(*[-land])
text=Assist (Another player can pay up to {6} of this spell's cost.) -- Exile all nonland permanents.
mana={6}{W}{W}
type=Sorcery
[/card]
[card]
name=Regna's Sanction
auto=counter(1/1) all(creature|myBattlefield)
auto=ability$!name(select untapped creature) notatarget(creature[-tapped]|mybattlefield) transforms((,newability[all(other creature|myBattlefield) tap]))!$ opponent
text=For each player, choose friend or foe. Each friend puts a +1/+1 counter on each creature they control. Each foe chooses one untapped creature they control, then taps the rest.
mana={3}{W}
type=Sorcery
[/card]
[card]
name=Skystreamer
abilities=flying
auto=target(player) life:4
text=Assist (Another player can pay up to {4} of this spell's cost.) -- Flying -- When Skystreamer enters the battlefield, target player gains 4 life.
mana={4}{W}
type=Creature
subtype=Griffin
power=3
toughness=2
[/card]
[card]
name=Together Forever
auto=target(<upto:2>other creature|battlefield) counter(1/1)
auto={1}:target(creature[counter{any}]) transforms((,newability[@movedTo(this|graveyard) from(battlefield):all(trigger[to]) moveTo(ownerHand)])) ueot
text=When Together Forever enters the battlefield, support 2. (Put a +1/+1 counter on each of up to two other target creatures.) -- {1}: Choose target creature with a counter on it. When that creature dies this turn, return that card to its owner's hand.
mana={W}{W}
type=Enchantment
[/card]
[card]
name=Game Plan
auto=moveto(opponentlibrary) all(*|opponenthand)
auto=moveto(opponentlibrary) all(*|opponentgraveyard) && shuffle
auto=draw:7 opponent
auto=moveto(mylibrary) all(*|myhand)
auto=moveto(mylibrary) all(*|mygraveyard) && shuffle
auto=draw:7 controller
auto=moveto(exile) all(this)
text=Assist (Another player can pay up to {5} of this spell's cost.) -- Each player shuffles their hand and graveyard into their library, then draws seven cards. Exile Game Plan.
mana={5}{U}
type=Sorcery
[/card]
[card]
name=Huddle Up
auto=draw:2
auto=draw:2 target(opponent)
text=Assist (Another player can pay up to {2} of this spell's cost.) -- Two target players each draw a card.
mana={2}{U}
type=Sorcery
[/card]
[card]
name=Nimbus Champion
abilities=flying
auto=@combat(attacking) source(this):may moveto(ownerHand) target(creature) if that creature's power is less than,equal the number of warriors your team controls
text=Flying -- Whenever Nimbus Champion attacks, you may return target creature to its owner's hand if that creature's power is less than or equal to the number of Warriors your team controls.
mana={5}{U}
type=Creature
subtype=Avatar Warrior
power=4
toughness=4
[/card]
[card]
name=Out of Bounds
target=*|stack
auto=fizzle
auto=Counter target spell
text=Assist (Another player can pay up to {3} of this spell's cost.) -- Counter target spell.
mana={3}{U}
type=Instant
[/card]
[card]
name=Saltwater Stalwart
auto=@damagefoeof(player) from(this):draw:1 target(player)
text=Whenever Saltwater Stalwart deals damage to an opponent, target player draws a card.
mana={3}{U}
type=Creature
subtype=Merfolk Warrior
power=2
toughness=4
[/card]
[card]
name=Soaring Show-Off
abilities=flying
auto=draw:1
auto=draw:1 opponent
text=Flying -- When Soaring Show-Off enters the battlefield, each player draws a card.
mana={2}{U}
type=Creature
subtype=Bird Warrior
power=2
toughness=2
[/card]
[card]
name=Spellseeker
auto=may moveTo(myHand) target(*[instant;sorcery;manacost<=2]|myLibrary)
text=When Spellseeker enters the battlefield, you may search your library for an instant or sorcery card with converted mana cost 2 or less, reveal it, put it into your hand, then shuffle your library.
mana={2}{U}
type=Creature
subtype=Human Wizard
power=1
toughness=1
[/card]
[card]
name=Spellweaver Duo
auto=may target(creature[tapped]) moveto(ownerhand)
text=Assist (Another player can pay up to {6} of this spell's cost.) -- When Spellweaver Duo enters the battlefield, you may return target tapped creature to its owner's hand.
mana={6}{U}
type=Creature
subtype=Human Wizard
power=4
toughness=4
[/card]
[card]
name=Archfiend of Despair
abilities=flying,nolifegainopponent
auto=@each endofturn:life:-oplifelost opponent
text=Flying -- Your opponents can't gain life. -- At the beginning of each end step, each opponent loses life equal to the life that player lost this turn. (Damage causes loss of life.)
mana={6}{B}{B}
type=Creature
subtype=Demon
power=6
toughness=6
[/card]
[card]
name=Bloodborn Scoundrels
auto=target(opponent) life:-2
auto=life:2
text=Assist (Another player can pay up to {5} of this spell's cost.) -- When Bloodborn Scoundrels enters the battlefield, target opponent loses 2 life and you gain 2 life.
mana={5}{B}
type=Creature
subtype=Vampire Rogue
power=4
toughness=4
[/card]
[card]
name=Fan Favorite
auto={2}:1/1 ueot
text=Assist (Another player can pay up to {3} of this spell's cost.) -- {2}: Fan Favorite gets +1/+1 until end of turn. Any player may activate this ability.
mana={3}{B}
type=Creature
subtype=Human Rogue
power=2
toughness=2
[/card]
[card]
name=Gang Up
target=creature[power<=prex]
auto=destroy
text=Assist (Another player can pay up to {X} of this spell's cost. You choose the value of X.) -- Destroy target creature with power X or less.
mana={X}{B}
type=Instant
[/card]
[card]
name=Inner Demon
target=creature
auto=teach(creature) +2/+2
auto=teach(creature) flying
auto=transforms((Demon))
auto=all(creature[-Demon]) -2/-2
text=Enchant creature -- Enchanted creature gets +2/+2, has flying, and is a Demon in addition to its other types. -- When Inner Demon enters the battlefield, all non-Demon creatures get -2/-2 until end of turn.
mana={2}{B}{B}
type=Enchantment
subtype=Aura
[/card]
[card]
name=Sickle Dancer
auto=@combat(attacking) source(this) aslongas(other warrior|myBattlefield) :1/1 ueot
text=Whenever Sickle Dancer attacks, if your team controls another Warrior, Sickle Dancer gets +1/+1 until end of turn.
mana={2}{B}
type=Creature
subtype=Human Warrior
power=3
toughness=2
[/card]
[card]
name=Thrasher Brute
auto=@movedTo(Warrior|mybattlefield) life:-1 opponent
auto=@movedTo(Warrior|mybattlefield) life:1
text=Whenever Thrasher Brute or another Warrior enters the battlefield under your team's control, target opponent loses 1 life and you gain 1 life.
mana={3}{B}
type=Creature
subtype=Orc Warrior
power=4
toughness=3
[/card]
[card]
name=Thrilling Encore
auto=moveTo(myBattlefield) all(creature[fresh]|graveyard)
text=Put onto the battlefield under your control all creature cards in all graveyards that were put there from the battlefield this turn.
mana={4}{B}
type=Instant
[/card]
[card]
name=Azra Bladeseeker
auto=may ability$!name(discard) reject notatarget(*|myhand)!$ and!(draw:1)!
text=When Azra Bladeseeker enters the battlefield, each player on your team may discard a card, then each player who discarded a card this way draws a card.
mana={2}{R}
type=Creature
subtype=Azra Warrior
power=3
toughness=2
[/card]
[card]
name=Bull-Rush Bruiser
auto=@combat(attacking) source(this) aslongas(other warrior|myBattlefield):first strike ueot
text=Whenever Bull-Rush Bruiser attacks, if your team controls another Warrior, Bull-Rush Bruiser gains first strike until end of turn.
mana={3}{R}
type=Creature
subtype=Minotaur Warrior
power=4
toughness=3
[/card]
[card]
name=Lava-Field Overlord
abilities=flying
auto=damage:4 target(creature|opponentBattlefield)
text=Assist (Another player can pay up to {7} of this spell's cost.) -- Flying -- When Lava-Field Overlord enters the battlefield, it deals 4 damage to target creature an opponent controls.
mana={7}{R}{R}
type=Creature
subtype=Dragon
power=5
toughness=4
[/card]
[card]
name=Magma Hellion
abilities=trample, haste
text=Assist (Another player can pay up to {6} of this spell's cost.) -- Trample, haste
mana={6}{R}
type=Creature
subtype=Hellion
power=5
toughness=4
[/card]
[card]
name=Najeela, the Blade-Blossom
auto=@combat(attacking) source(creature[warrior]):create(warrior:creature warrior:1/1:white:battleready)
auto={W}{U}{B}{R}{G}:untap all attacking creature they) trample, lifelink, && haste ueot after this phase, there is an additional combat phase activate this ability only during combat
text=Whenever a Warrior attacks, you may have its controller create a 1/1 white Warrior creature token that's tapped and attacking. -- {W}{U}{B}{R}{G}: Untap all attacking creatures. They gain trample, lifelink, and haste until end of turn. After this phase, there is an additional combat phase. Activate this ability only during combat.
mana={2}{R}
type=Legendary Creature
subtype=Human Warrior
power=3
toughness=2
[/card]
[card]
name=Stadium Vendors
auto=choice Add{R}{R}
auto=choice Add{W}{W}
auto=choice Add{U}{U}
auto=choice Add{B}{B}
auto=choice Add{G}{G}
text=When Stadium Vendors enters the battlefield, choose a player. That player adds two mana of any one color they choose.
mana={3}{R}
type=Creature
subtype=Goblin
power=3
toughness=3
[/card]
[card]
name=Bramble Sovereign
auto=@movedto(creature[-token]|mybattlefield):all(trigger[to]) pay[[{1}{G}]] clone
text=Whenever another nontoken creature enters the battlefield, you may pay {1}{G}. If you do, that creature's controller creates a token that's a copy of that creature.
mana={2}{G}{G}
type=Creature
subtype=Dryad
power=4
toughness=4
[/card]
[card]
name=Charging Binox
abilities=trample
text=Assist (Another player can pay up to {7} of this spell's cost.) -- Trample
mana={7}{G}
type=Creature
subtype=Beast
power=7
toughness=5
[/card]
[card]
name=The Crowd Goes Wild
auto=target(<upto:X>creature|battlefield) counter(1/1,1)
auto=all(creature[counter{1/1.1}]) trample
text=Assist (Another player can pay up to {X} of this spell's cost. You choose the value of X.) -- Support X. (Put a +1/+1 counter on each of up to X target creatures.) -- Each creature with a +1/+1 counter on it gains trample until end of turn.
mana={X}{G}
type=Sorcery
[/card]
[card]
name=Decorated Champion
auto=@movedTo(other warrior|myBattlefield):counter(1/1)
text=Whenever another Warrior enters the battlefield under your team's control, put a +1/+1 counter on Decorated Champion.
mana={1}{G}
type=Creature
subtype=Elf Warrior
power=2
toughness=2
[/card]
[card]
name=Jungle Wayfinder
auto=ability$!moveto(ownerhand) notatarget(land[basic]|mylibrary)!$ opponent
auto=ability$!moveto(ownerhand) notatarget(land[basic]|mylibrary)!$ controller
text=When Jungle Wayfinder enters the battlefield, each player may search their library for a basic land card, reveal it, put it into their hand, then shuffle their library.
mana={2}{G}
type=Creature
subtype=Elf Warrior
power=3
toughness=3
[/card]
[card]
name=Azra Oddsmaker
auto=@each my combatbegins may ability$!name(discard) reject notatarget(*|myhand)!$:target(creature) transforms((,newability[@combatdamaged(player) from(this):draw:2 controller])) ueot
text=At the beginning of combat on your turn, you may discard a card. If you do, choose a creature. Whenever that creature deals combat damage to a player this turn, you draw two cards.
mana={1}{B}{R}
type=Creature
subtype=Azra Warrior
power=3
toughness=3
[/card]
[card]
name=Rushblade Commander
auto=lord(warrior|mybattlefield) haste
text=Warriors your team controls have haste.
mana={B}{R}
type=Creature
subtype=Azra Warrior
power=2
toughness=2
[/card]
[card]
name=Vampire Charmseeker
abilities=flying
auto=target(instant,sorcery,creature|graveyard) moveTo(ownerHand)
text=Assist (Another player can pay up to {6} of this spell's cost.) -- Flying -- When Vampire Charmseeker enters the battlefield, return target instant, sorcery, or creature card from a graveyard to its owner's hand.
mana={6}{U}{B}
type=Creature
subtype=Vampire Wizard
power=3
toughness=4
[/card]
[card]
name=Victory Chimes
auto=@each upkeep:untap
auto={T}:target(player) add{c}
text=Untap Victory Chimes during each other player's untap step. -- {T}: A player of your choice adds {C}.
mana={3}
type=Artifact
[/card]
[card]
name=Bountiful Promenade
auto=tap(noevent)
auto={T}:Add{G}
auto={T}:Add{W}
text=Bountiful Promenade enters the battlefield tapped unless you have two or more opponents. -- {T}: Add {G} or {W}.
type=Land
[/card]
[card]
name=Luxury Suite
auto=tap(noevent)
auto={T}:Add{B}
auto={T}:Add{R}
text=Luxury Suite enters the battlefield tapped unless you have two or more opponents. -- {T}: Add {B} or {R}.
type=Land
[/card]
[card]
name=Morphic Pool
auto=tap(noevent)
auto={T}:Add{U}
auto={T}:Add{B}
text=Morphic Pool enters the battlefield tapped unless you have two or more opponents. -- {T}: Add {U} or {B}.
type=Land
[/card]
[card]
name=Sea of Clouds
auto=tap(noevent)
auto={T}:Add{W}
auto={T}:Add{U}
text=Sea of Clouds enters the battlefield tapped unless you have two or more opponents. -- {T}: Add {W} or {U}.
type=Land
[/card]
[card]
name=Spire Garden
auto=tap(noevent)
auto={T}:Add{R}
auto={T}:Add{G}
text=Spire Garden enters the battlefield tapped unless you have two or more opponents. -- {T}: Add {R} or {G}.
type=Land
[/card]

View File

@@ -1,420 +0,0 @@
grade=borderline
[card]
name=Arahbo, Roar of the World
auto=@each my combatbegins:target(other cat|myBattlefield) 3/3 ueot
auto=@combat(attacking) source(cat|mybattlefield):all(trigger[to]) pay[[{1}{G}{W}]] trample && dynamicability<!mytgt powerpumpboth!>
text=Eminence — At the beginning of combat on your turn, if Arahbo, Roar of the World is in the command zone or on the battlefield, another target Cat you control gets +3/+3 until end of turn. -- Whenever another Cat you control attacks, you may pay {1}{G}{W}. If you do, it gains trample and gets +X/+X until end of turn, where X is its power.
mana={3}{G}{W}
type=Legendary Creature
subtype=Cat Avatar
power=5
toughness=5
[/card]
[card]
name=Balan, Wandering Knight
auto=this(gear > 1) double strike
auto={1}{W}:all(equipment|mybattlefield) newhook
text=First strike -- Balan, Wandering Knight has double strike as long as two or more Equipment are attached to it. -- {1}{W}: Attach all Equipment you control to Balan.
mana={2}{W}{W}
type=Legendary Creature
subtype=Cat Knight
power=3
toughness=3
[/card]
[card]
name=Bloodforged Battle-Axe
auto=teach(creature) 2/0
auto=teach(creature) @combatdamaged(player) from(mytgt):clone all(this)
auto={2}:equip
text=Equipped creature gets +2/+0. -- Whenever equipped creature deals combat damage to a player, create a token that's a copy of Bloodforged Battle-Axe. -- Equip {2}
mana={1}
type=Artifact
subtype=Equipment
[/card]
[card]
name=Bloodline Necromancer
abilities=lifelink
auto=may target(creature[vampire;wizard]|mygraveyard) moveTo(mybattlefield)
text=Lifelink -- When Bloodline Necromancer enters the battlefield, you may return target Vampire or Wizard creature card from your graveyard to the battlefield.
mana={4}{B}
type=Creature
subtype=Vampire Wizard
power=3
toughness=2
[/card]
[card]
name=Bloodsworn Steward
abilities=flying
text=Flying -- Commander creatures you control get +2/+2 and have haste.
mana={2}{R}{R}
type=Creature
subtype=Vampire Knight
power=4
toughness=4
[/card]
[card]
name=Boneyard Scourge
abilities=flying
autograveyard=@movedTo(other Dragon|mygraveyard) from(myBattlefield):may pay({1}{b}) moveTo(mybattlefield)
text=Flying -- Whenever a Dragon you control dies while Boneyard Scourge is in your graveyard, you may pay {1}{B}. If you do, return Boneyard Scourge from your graveyard to the battlefield.
mana={2}{B}{B}
type=Creature
subtype=Zombie Dragon
power=4
toughness=3
[/card]
[card]
name=Crimson Honor Guard
abilities=trample
auto=@each my end:damage:4 controller
auto=@each opponent end:damage:4 opponent
text=Trample -- At the beginning of each player's end step, Crimson Honor Guard deals 4 damage to that player unless they control a commander.
mana={3}{R}{R}
type=Creature
subtype=Vampire Knight
power=4
toughness=5
[/card]
[card]
name=Curse of Bounty
target=player
auto=@combat(attacking) source(creature|myBattlefield) restriction(once):untap all(*[-land]|myBattlefield)
text=Enchant player -- Whenever enchanted player is attacked, untap all nonland permanents you control. Each opponent attacking that player untaps all nonland permanents they control.
mana={1}{G}
type=Enchantment
subtype=Aura Curse
[/card]
[card]
name=Curse of Disturbance
target=player
auto=@combat(attacking) source(creature|myBattlefield) restriction(once):create(zombie:creature zombie:2/2:black)
text=Enchant player -- Whenever enchanted player is attacked, create a 2/2 black Zombie creature token. Each opponent attacking that player does the same.
mana={2}{B}
type=Enchantment
subtype=Aura Curse
[/card]
[card]
name=Curse of Opulence
target=player
auto=@combat(attacking) source(creature|myBattlefield) restriction(once):token(435451)
text=Enchant player -- Whenever enchanted player is attacked, create a colorless artifact token named Gold. It has "Sacrifice this artifact: Add one mana of any color." Each opponent attacking that player does the same.
mana={R}
type=Enchantment
subtype=Aura Curse
[/card]
[card]
name=Curse of Verbosity
target=player
auto=@combat(attacking) source(creature|myBattlefield) restriction(once):draw:1
text=Enchant player -- Whenever enchanted player is attacked, you draw a card. Each opponent attacking that player does the same.
mana={2}{U}
type=Enchantment
subtype=Aura Curse
[/card]
[card]
name=Curse of Vitality
target=player
auto=@combat(attacking) source(creature|myBattlefield) restriction(once):life:2
text=Enchant player -- Whenever enchanted player is attacked, you gain 2 life. Each opponent attacking that player does the same.
mana={2}{W}
type=Enchantment
subtype=Aura Curse
[/card]
[card]
name=Disrupt Decorum
auto=mustattack all(creature|opponentBattlefield) uynt
text=Goad all creatures you don't control. (Until your next turn, those creatures attack each combat if able and attack a player other than you if able.)
mana={2}{R}{R}
type=Sorcery
[/card]
[card]
name=Edgar Markov
abilities=first strike,haste
auto=@movedTo(nother Vampire|mystack):create(vampire:creature vampire:1/1:black)
auto=@combat(attacking) source(this):counter(1/1) all(vampire|myBattlefield)
text=Eminence — Whenever you cast another Vampire spell, if Edgar Markov is in the command zone or on the battlefield, create a 1/1 black Vampire creature token. -- First strike, haste -- Whenever Edgar Markov attacks, put a +1/+1 counter on each Vampire you control.
mana={3}{R}{W}{B}
type=Legendary Creature
subtype=Vampire Knight
power=4
toughness=4
[/card]
[card]
name=Fractured Identity
target=*[-land]
auto=moveto(exile)
auto=clone
text=Exile target nonland permanent. Each player other than its controller creates a token that's a copy of it.
mana={3}{W}{U}
type=Sorcery
[/card]
[card]
name=Galecaster Colossus
auto={T(wizard|myBattlefield)}:target(*[-land]|opponentBattlefield) moveTo(ownerHand)
text=Tap an untapped Wizard you control: Return target nonland permanent you don't control to its owner's hand.
mana={5}{U}{U}
type=Creature
subtype=Giant Wizard
power=5
toughness=6
[/card]
[card]
name=Hammer of Nazahn
auto=may rehook target(creature)
auto=@movedTo(equipment|mybattlefield):
auto=teach(creature) 2/0
auto=teach(creature) indestructible
auto={4}:equip
text=Whenever Hammer of Nazahn or another Equipment enters the battlefield under your control, you may attach that Equipment to target creature you control. -- Equipped creature gets +2/+0 and has indestructible. -- Equip {4}
mana={4}
type=Legendary Artifact
subtype=Equipment
[/card]
[card]
name=Hungry Lynx
abilities=deathtouch
auto=lord(cat|myBattlefield) protection from(rat)
auto=@each my endofturn:create(rat:rat creature:1/1:black:deathtouch) opponent
auto=@movedTo(rat|graveyard) from(battlefield):counter(1/1) all(cat|myBattlefield)
text=Cats you control have protection from Rats. (They can't be blocked, targeted, or dealt damage by Rats.) -- At the beginning of your end step, target opponent creates a 1/1 black Rat creature token with deathtouch. -- Whenever a Rat dies, put a +1/+1 counter on each Cat you control.
mana={1}{G}
type=Creature
subtype=Cat
power=2
toughness=2
[/card]
[card]
name=Inalla, Archmage Ritualist
auto=@movedto(other wizard[-token]|mybattlefield):all(trigger[to]) pay[[{1}]] clone with(unearth,haste)
auto={T(wizard|myBattlefield)}{T(wizard|myBattlefield)}{T(wizard|myBattlefield)}{T(wizard|myBattlefield)}{T(wizard|myBattlefield)}:target(player) life:-7
text=Eminence — Whenever another nontoken Wizard enters the battlefield under your control, if Inalla, Archmage Ritualist is in the command zone or on the battlefield, you may pay {1}. If you do, create a token that's a copy of that Wizard. The token gains haste. Exile it at the beginning of the next end step. -- Tap five untapped Wizards you control: Target player loses 7 life.
mana={2}{U}{B}{R}
type=Legendary Creature
subtype=Human Wizard
power=4
toughness=5
[/card]
[card]
name=Kess, Dissident Mage
abilities=flying
auto={0}:target(instant,sorcery|mygraveyard) tempflashback ueot myTurnOnly limit:1
text=Flying -- During each of your turns, you may cast an instant or sorcery card from your graveyard. If a card cast this way would be put into your graveyard, exile it instead.
mana={1}{U}{B}{R}
type=Legendary Creature
subtype=Human Wizard
power=3
toughness=4
[/card]
[card]
name=Kindred Boon
auto=chooseatype transforms((,newability[{1}{W}:target(creature[chosentype]|myBattlefield) counter(0/0.1.divinity)])) forever chooseend
auto=lord(creature[counter{0/0.1.divinity}]) indestructible
text=As Kindred Boon enters the battlefield, choose a creature type. -- {1}{W}: Put a divinity counter on target creature you control of the chosen type. -- Each creature you control with a divinity counter on it has indestructible.
mana={2}{W}{W}
type=Enchantment
[/card]
[card]
name=Kindred Charge
auto=chooseatype clone with(treason,haste) all(creature[chosentype]|mybattlefield) chooseend
text=Choose a creature type. For each creature you control of the chosen type, create a token that's a copy of that creature. Those tokens gain haste. Exile them at the beginning of the next end step.
mana={4}{R}{R}
type=Sorcery
[/card]
[card]
name=Kindred Discovery
auto=chooseatype transforms((,newability[@movedTo(creature[chosentype]|mybattlefield)}:draw:1], newability[@combat(attacking) source(creature[chosentype]|mybattlefield)}:draw:1])) forever chooseend
text=As Kindred Discovery enters the battlefield, choose a creature type. -- Whenever a creature you control of the chosen type enters the battlefield or attacks, draw a card.
mana={3}{U}{U}
type=Enchantment
[/card]
[card]
name=Kindred Dominance
auto=chooseatype destroy all(creature[-chosentype]) chooseend
text=Choose a creature type. Destroy all creatures that aren't of the chosen type.
mana={5}{B}{B}
type=Sorcery
[/card]
[card]
name=Licia, Sanguine Tribune
abilities=first strike,lifelink
anyzone=this(variable{lifegain}=1) changecost(colorless:-1) forcedalive
anyzone=this(variable{lifegain}=2) changecost(colorless:-2) forcedalive
anyzone=this(variable{lifegain}=3) changecost(colorless:-3) forcedalive
anyzone=this(variable{lifegain}=4) changecost(colorless:-4) forcedalive
anyzone=this(variable{lifegain}=5) changecost(colorless:-5) forcedalive
anyzone=this(variable{lifegain}=6) changecost(colorless:-6) forcedalive
anyzone=this(variable{lifegain}=7) changecost(colorless:-7) forcedalive
anyzone=this(variable{lifegain}=8) changecost(colorless:-8) forcedalive
anyzone=this(variable{lifegain}=9) changecost(colorless:-9) forcedalive
auto={L:5}:counter(1/1,3) myTurnOnly limit:1
text=This spell costs {1} less to cast for each 1 life you gained this turn. -- First strike, lifelink -- Pay 5 life: Put three +1/+1 counters on Licia, Sanguine Tribune. Activate this ability only during your turn and only once each turn.
mana={5}{R}{W}{B}
type=Legendary Creature
subtype=Vampire Soldier
power=4
toughness=4
[/card]
[card]
name=Mathas, Fiend Seeker
abilities=menace
auto=@each my endofturn:target(creature|opponentBattlefield) (transforms((,newability[counter(0/0.1.Bounty)], newability[@movedto(this|mygraveyard):draw:1 opponent && life:2 opponent)]))
text=Menace -- At the beginning of your end step, put a bounty counter on target creature an opponent controls. For as long as that creature has a bounty counter on it, it has "When this creature dies, each opponent draws a card and gains 2 life."
mana={R}{W}{B}
type=Legendary Creature
subtype=Vampire
power=3
toughness=3
[/card]
[card]
name=Mirri, Weatherlight Duelist
abilities=first strike
auto=aslongas(this[tapped]) lord(creature[-attacking]|opponentbattlefield) cantattack
auto=aslongas(this[tapped]) lord(creature[-attacking]|opponentbattlefield) cantpwattack
auto=@combat(attacking) source(this):aslongas(creature[blocking]|opponentBattlefield) lord(creature[-blocking]|opponentbattlefield) cantblock
text=First strike -- Whenever Mirri, Weatherlight Duelist attacks, each opponent can't block with more than one creature this combat. -- As long as Mirri, Weatherlight Duelist is tapped, no more than one creature can attack you each combat.
mana={1}{G}{W}
type=Legendary Creature
subtype=Cat Warrior
power=3
toughness=2
[/card]
[card]
name=Nazahn, Revered Bladesmith
auto=choice moveTo(myHand) target(equipment[-Hammer of Nazahn]|myLibrary)
auto=choice moveTo(myBattlefield) target(Hammer of Nazahn|myLibrary)
auto=@combat(attacking) source(creature[geared]|mybattlefield):may tap target(creature|opponentBattlefield)
text=When Nazahn, Revered Bladesmith enters the battlefield, search your library for an Equipment card and reveal it. If you reveal a card named Hammer of Nazahn this way, put it onto the battlefield. Otherwise, put that card into your hand. Then shuffle your library. -- Whenever an equipped creature you control attacks, you may tap target creature defending player controls.
mana={4}{G}{W}
type=Legendary Creature
subtype=Cat Artificer
power=5
toughness=4
[/card]
[card]
name=Patron of the Vein
abilities=flying
auto=destroy target(creature|opponentBattlefield)
auto=@movedTo(creature|graveyard) from(opponentbattlefield):all(trigger[from]) moveto(exile) && counter(1/1)all(vampire|myBattlefield)
text=Flying -- When Patron of the Vein enters the battlefield, destroy target creature an opponent controls. -- Whenever a creature an opponent controls dies, exile it and put a +1/+1 counter on each Vampire you control.
mana={4}{B}{B}
type=Creature
subtype=Vampire Shaman
power=4
toughness=4
[/card]
[card]
name=Qasali Slingers
abilities=reach
auto=may destroy target(artifact,enchantment)
auto=@movedTo(cat|myBattlefield):may destroy target(artifact,enchantment)
text=Reach -- Whenever Qasali Slingers or another Cat enters the battlefield under your control, you may destroy target artifact or enchantment.
mana={4}{G}
type=Creature
subtype=Cat Warrior
power=3
toughness=5
[/card]
[card]
name=Ramos, Dragon Engine
abilities=flying
auto=@movedTo(*[white]|mystack):counter(1/1)
auto=@movedTo(*[blue]|mystack):counter(1/1)
auto=@movedTo(*[black]|mystack):counter(1/1)
auto=@movedTo(*[red]|mystack):counter(1/1)
auto=@movedTo(*[green]|mystack):counter(1/1)
auto={C(1/1,-5)}:Add {W}{W}{U}{U}{B}{B}{R}{R}{G}{G} limit:1
text=Flying -- Whenever you cast a spell, put a +1/+1 counter on Ramos, Dragon Engine for each of that spell's colors. -- Remove five +1/+1 counters from Ramos: Add {W}{W}{U}{U}{B}{B}{R}{R}{G}{G}. Activate this ability only once each turn.
mana={6}
type=Legendary Artifact Creature
subtype=Dragon
power=4
toughness=4
[/card]
[card]
name=Scalelord Reckoner
abilities=flying
auto=@targeted(dragon|mybattlefield) from(*|opponentbattlefield,opponenthand,opponentstack,opponentgraveyard,opponentexile,opponentlibrary):destroy target(*[-land]|opponentBattlefield)
text=Flying -- Whenever a Dragon you control becomes the target of a spell or ability an opponent controls, destroy target nonland permanent that player controls.
mana={3}{W}{W}
type=Creature
subtype=Dragon
power=4
toughness=4
[/card]
[card]
name=Territorial Hellkite
abilities=flying,haste
auto=@combat(attacking) source(this):frozen
text=Flying, haste -- At the beginning of combat on your turn, choose an opponent at random that Territorial Hellkite didn't attack during your last combat. Territorial Hellkite attacks that player this combat if able. If you can't choose an opponent this way, tap Territorial Hellkite.
mana={2}{R}{R}
type=Creature
subtype=Dragon
power=6
toughness=5
[/card]
[card]
name=The Ur-Dragon
abilities=flying
auto=lord(dragon|mycastingzone) altercost(colorless, -1)
auto=@combat(attacking) source(dragon|myBattlefield) restriction(once):may moveTo(myBattlefield) target(*[-instant;-sorcery]|myHand)
auto=@combat(attacking) source(dragon|myBattlefield):draw:1
text=Eminence — As long as The Ur-Dragon is in the command zone or on the battlefield, other Dragon spells you cast cost {1} less to cast. -- Flying -- Whenever one or more Dragons you control attack, draw that many cards, then you may put a permanent card from your hand onto the battlefield.
mana={4}{W}{U}{B}{R}{G}
type=Legendary Creature
subtype=Dragon Avatar
power=10
toughness=10
[/card]
[card]
name=Traverse the Outlands
auto=moveTo(myBattlefield) and!(tap(noevent))! target(<upto:power:highest:*:mybattlefield>land[basic]|myLibrary)
text=Search your library for up to X basic land cards, where X is the greatest power among creatures you control. Put those cards onto the battlefield tapped, then shuffle your library.
mana={4}{G}
type=Sorcery
[/card]
[card]
name=Wasitora, Nekoru Queen
abilities=flying,trample
auto=@combatdamaged(player) from(this):if type(creature|opponentBattlefield)~morethan~0 then ability$!sacrifice notatarget(creature|mybattlefield)!$ opponent else create(cat dragon:creature cat dragon:3/3:black:red:green:flying)
text=Flying, trample -- Whenever Wasitora, Nekoru Queen deals combat damage to a player, that player sacrifices a creature. If the player can't, you create a 3/3 black, red, and green Cat Dragon creature token with flying.
mana={2}{B}{R}{G}
type=Legendary Creature
subtype=Cat Dragon
power=5
toughness=4
[/card]

View File

@@ -1,331 +0,0 @@
grade=borderline
[card]
name=Empyrial Storm
auto=create(Angel:creature Angel:4/4:white:flying)
text=When you cast this spell, copy it for each time you've cast your commander from the command zone this game. -- Create a 4/4 white Angel creature token with flying.
mana={4}{W}{W}
type=Sorcery
[/card]
[card]
name=Heavenly Blademaster
abilities=flying, double strike
auto=may target(<anyamount>aura|battlefield) newhook
auto=may target(<anyamount>equipment|battlefield) newhook
auto=thisforeach(aura) lord(other creature|myBattlefield) 1/1
auto=thisforeach(gear) lord(other creature|myBattlefield) 1/1
auto=lord(other creature|myBattlefield) +1/+1 for each aura and equipment attached to heavenly blademaster
text=Flying, double strike -- When Heavenly Blademaster enters the battlefield, you may attach any number of Auras and Equipment you control to it. -- Other creatures you control get +1/+1 for each Aura and Equipment attached to Heavenly Blademaster.
mana={5}{W}
type=Creature
subtype=Angel
power=3
toughness=6
[/card]
[card]
name=Loyal Unicorn
abilities=vigilance
text=Vigilance -- Lieutenant — At the beginning of combat on your turn, if you control your commander, prevent all combat damage that would be dealt to creatures you control this turn. Other creatures you control gain vigilance until end of turn.
mana={3}{W}
type=Creature
subtype=Unicorn
power=3
toughness=4
[/card]
[card]
name=Magus of the Balance
auto={4}{W}{T}{S}:auto=if type(land|mybattlefield)~morethan~type(land|opponentbattlefield) then ability$! sacrifice notatarget(<type:land:mybattlefieldminustype:land:opponentbattlefieldminusend>land|mybattlefield) !$ controller && if type(land|opponentbattlefield)~morethan~type(land|mybattlefield) then ability$! sacrifice notatarget(<type:land:mybattlefieldminustype:land:opponentbattlefieldminusend>land|mybattlefield) !$ opponent && if type(creature|mybattlefield)~morethan~type(creature|opponentbattlefield) then ability$! sacrifice notatarget(<type:creature:mybattlefieldminustype:creature:opponentbattlefieldminusend>creature|mybattlefield) !$ controller && if type(creature|opponentbattlefield)~morethan~type(creature|mybattlefield) then ability$! sacrifice notatarget(<type:creature:mybattlefieldminustype:creature:opponentbattlefieldminusend>creature|mybattlefield) !$ opponent && if type(*|myhand)~morethan~type(*|opponenthand) then ability$! reject notatarget(<type:*:myhandminustype:*:opponenthandminusend>*|myhand) !$ controller && if type(*|opponenthand)~morethan~type(*|myhand) then ability$! reject notatarget(<type:*:myhandminustype:*:opponenthandminusend>*|myhand) !$ opponent
text={4}{W}, {T}, Sacrifice Magus of the Balance: Each player chooses a number of lands they control equal to the number of lands controlled by the player who controls the fewest, then sacrifices the rest. Players discard cards and sacrifice creatures the same way.
mana={1}{W}
type=Creature
subtype=Human Wizard
power=2
toughness=2
[/card]
[card]
name=Echo Storm
target=artifact
auto=clone
text=When you cast this spell, copy it for each time you've cast your commander from the command zone this game. You may choose new targets for the copies. -- Create a token that's a copy of target artifact.
mana={3}{U}{U}
type=Sorcery
[/card]
[card]
name=Ever-Watching Threshold
auto=auto=@each blockers restriction{type(creature[attacking]|opponentbattlefield)~morethan~0} draw:1
text=Whenever an opponent attacks you and/or a planeswalker you control with one or more creatures, draw a card.
mana={2}{U}
type=Enchantment
[/card]
[card]
name=Loyal Drake
abilities=flying
text=Flying -- Lieutenant — At the beginning of combat on your turn, if you control your commander, draw a card.
mana={2}{U}
type=Creature
subtype=Drake
power=2
toughness=2
[/card]
[card]
name=Octopus Umbra
abilities=totemarmor
target=creature
auto=teach(creature) transforms((,newability[@combat(attacking) source(this):may tap target(creature)]))
auto=teach(creature) becomes(,8/8)
text=Enchant creature -- Enchanted creature has base power and toughness 8/8 and has "Whenever this creature attacks, you may tap target creature with power 8 or less." -- Totem armor (If enchanted creature would be destroyed, instead remove all damage from it and destroy this Aura.)
mana={3}{U}{U}
type=Enchantment
subtype=Aura
[/card]
[card]
name=Bloodtracker
abilities=flying
auto={B}{L:2}:counter(1/1)
auto=@movedTo(this|nonbattlezone) from(battlefield):thisforeach(counter{1/1,1}) draw:1 controller
text=Flying -- {B}, Pay 2 life: Put a +1/+1 counter on Bloodtracker. -- When Bloodtracker leaves the battlefield, draw a card for each +1/+1 counter on it.
mana={3}{B}
type=Creature
subtype=Vampire Wizard
power=2
toughness=2
[/card]
[card]
name=Loyal Subordinate
abilities=menace
text=Menace -- Lieutenant — At the beginning of combat on your turn, if you control your commander, each opponent loses 3 life.
mana={2}{B}
type=Creature
subtype=Zombie
power=3
toughness=1
[/card]
[card]
name=Night Incarnate
abilities=deathtouch
other={3}{B} name(Evoke)
auto=@movedTo(this|nonbattlezone) from(battlefield):all(creature) -3/-3 ueot
auto=alternative sacrifice
text=Deathtouch -- When Night Incarnate leaves the battlefield, all creatures get -3/-3 until end of turn. -- Evoke {3}{B} (You may cast this spell for its evoke cost. If you do, it's sacrificed when it enters the battlefield.)
mana={4}{B}
type=Creature
subtype=Elemental
power=3
toughness=4
[/card]
[card]
name=Fury Storm
target=*[instant;sorcery]|stack
auto=castcard(copied noevent)
text=When you cast this spell, copy it for each time you've cast your commander from the command zone this game. You may choose new targets for the copies. -- Copy target instant or sorcery spell. You may choose new targets for the copy.
mana={2}{R}{R}
type=Instant
[/card]
[card]
name=Loyal Apprentice
abilities=flying, haste
text=Haste -- Lieutenant — At the beginning of combat on your turn, if you control your commander, create a 1/1 colorless Thopter artifact creature token with flying. That token gains haste until end of turn.
mana={1}{R}
type=Creature
subtype=Human Artificer
power=2
toughness=1
[/card]
[card]
name=Nesting Dragon
abilities=flying
auto=@movedTo(land|myBattlefield):token(dragon egg)
text=Flying -- Landfall — Whenever a land enters the battlefield under your control, create a 0/2 red Dragon Egg creature token with defender and "When this creature dies, create a 2/2 red Dragon creature token with flying and '{R}: This creature gets +1/+0 until end of turn.'"
mana={3}{R}{R}
type=Creature
subtype=Dragon
power=5
toughness=4
[/card]
[card]
name=Varchild, Betrayer of Kjeldor
auto=@combatdamaged(player) from(this):create(Survivor:Creature Survivor:1/1:red)*thatmuch opponent
auto=lord(survivor|opponentBattlefield) cantblock
auto=lord(survivor|opponentBattlefield) cantattack
auto=@movedTo(this|nonbattlezone) from(mybattlefield):moveTo(myBattlefield) all(survivor)
text=Whenever Varchild, Betrayer of Kjeldor deals combat damage to a player, that player creates that many 1/1 red Survivor creature tokens. -- Survivors your opponents control can't block, and they can't attack you or a planeswalker you control. -- When Varchild leaves the battlefield, gain control of all Survivors.
mana={2}{R}
type=Legendary Creature
subtype=Human Knight
power=3
toughness=3
[/card]
[card]
name=Crash of Rhino Beetles
abilities=trample
auto=aslongas(land|myBattlefield)~morethan~9 10/10
text=Trample -- Crash of Rhino Beetles gets +10/+10 as long as you control ten or more lands.
mana={4}{G}
type=Creature
subtype=Insect
power=5
toughness=5
[/card]
[card]
name=Loyal Guardian
abilities=trample
text=Trample -- Lieutenant — At the beginning of combat on your turn, if you control your commander, put a +1/+1 counter on each creature you control.
mana={4}{G}
type=Creature
subtype=Rhino
power=4
toughness=4
[/card]
[card]
name=Turntimber Sower
auto=@@movedto(land|mygraveyard):create(plant:creature plant:0/1:green:)
auto={G}{S(creature|myBattlefield)}{S(creature|myBattlefield)}{S(creature|myBattlefield)}:target(land|mygraveyard) moveto(ownerhand)
text=Whenever one or more land cards are put into your graveyard from anywhere, create a 0/1 green Plant creature token. -- {G}, Sacrifice three creatures: Return target land card from your graveyard to your hand.
mana={2}{G}
type=Creature
subtype=Elf Druid
power=3
toughness=3
[/card]
[card]
name=Whiptongue Hydra
abilities=reach
auto=@movedto(creature[flying]|graveyard):counter(1/1) oneshot
auto=destroy all(creature[flying])
text=Reach -- When Whiptongue Hydra enters the battlefield, destroy all creatures with flying. Put a +1/+1 counter on Whiptongue Hydra for each creature destroyed this way.
mana={5}{G}
type=Creature
subtype=Lizard Hydra
power=4
toughness=4
[/card]
[card]
name=Arixmethes, Slumbering Isle
auto=tap(noevent)
auto=counter(0/0,5,Slumber)
auto=this(counter{0/0.1.Slumber}>=1) transforms((removetypes,newability[becomes(Legendary Land)]))
auto=this(counter{0/0.1.Slumber}<1) transforms((Legendary Creature))
auto=@movedTo(*|mystack):may counter(0/0,-1,Slumber)
auto={T}:Add{G}{U}
text=Arixmethes, Slumbering Isle enters the battlefield tapped with five slumber counters on it. -- As long as Arixmethes has a slumber counter on it, it's a land. (It's not a creature.) -- Whenever you cast a spell, you may remove a slumber counter from Arixmethes. -- {T}: Add {G}{U}.
mana={2}{G}{U}
type=Legendary Creature
subtype=Kraken
power=12
toughness=12
[/card]
[card]
name=Kestia, the Cultivator
bestow={3}{G}{W}{U}
auto=bestow bstw
auto=bestow teach(creature) 4/4
auto=@combat(attacking) source(creature[enchanted]|myBattlefield):draw:1
auto=@combat(attacking) source(creature[enchantment]|myBattlefield):draw:1
text=Bestow {3}{G}{W}{U} (If you cast this card for its bestow cost, it's an Aura spell with enchant creature. It becomes a creature again if it's not attached to a creature.) -- Enchanted creature gets +4/+4. -- Whenever an enchanted creature or enchantment creature you control attacks, draw a card.
mana={1}{G}{W}{U}
type=Legendary Enchantment Creature
subtype=Nymph
power=4
toughness=4
[/card]
[card]
name=Thantis, the Warweaver
abilities=vigilance, reach
auto=lord(creature) mustattack
auto=@combat(attacking) source(creature|opponentBattlefield):counter(1/1)
text=Vigilance, reach -- All creatures attack each combat if able. -- Whenever a creature attacks you or a planeswalker you control, put a +1/+1 counter on Thantis, the Warweaver.
mana={3}{B}{R}{G}
type=Legendary Creature
subtype=Spider
power=5
toughness=5
[/card]
[card]
name=Tuvasa the Sunlit
auto=foreach(enchantment|mybattlefield) 1/1
auto=@movedTo(*[enchantment]|mystack) turnlimited:draw:1
text=Tuvasa the Sunlit gets +1/+1 for each enchantment you control. -- Whenever you cast your first enchantment spell each turn, draw a card.
mana={G}{W}{U}
type=Legendary Creature
subtype=Merfolk Shaman
power=1
toughness=1
[/card]
[card]
name=Varina, Lich Queen
auto=@each my blockers restriction{type(Zombie[attacking]|myBattlefield)~morethan~0}:draw:type:zombie[attacking]:myBattlefield && transforms((,newability[target(<type:zombie[attacking]:myBattlefield>*|myhand) reject])) forever
auto=@each my blockers restriction{type(Zombie[attacking]|myBattlefield)~morethan~0}:life:type:zombie[attacking]:myBattlefield
auto={2}{E(*|mygraveyard)}{E(*|mygraveyard)}:create(black zombie:creature black zombie:2/2) and!( tap(noevent) )!
text=Whenever you attack with one or more Zombies, draw that many cards, then discard that many cards. You gain that much life. -- {2}, Exile two cards from your graveyard: Create a tapped 2/2 black Zombie creature token.
mana={1}{W}{U}{B}
type=Legendary Creature
subtype=Zombie Wizard
power=4
toughness=4
[/card]
[card]
name=Windgrace's Judgment
target=*[-land]|opponentBattlefield
auto=destroy
text=For any number of opponents, destroy target nonland permanent that player controls.
mana={3}{B}{G}
type=Instant
[/card]
[card]
name=Ancient Stone Idol
abilities=flash, trample
anyzone=foreach(creature[attacking]|battlefield) changecost(colorless:-1) forcedalive
auto=@movedTo(this|graveyard) from(battlefield):create(construct artifact:creature construct artifact:6/12:colorless:trample)
text=Flash -- This spell costs {1} less to cast for each attacking creature. -- Trample -- When Ancient Stone Idol dies, create a 6/12 colorless Construct artifact creature token with trample.
mana={10}
type=Artifact Creature
subtype=Golem
power=12
toughness=12
[/card]
[card]
name=Geode Golem
abilities=trample
text=Trample -- Whenever Geode Golem deals combat damage to a player, you may cast your commander from the command zone without paying its mana cost. (You still pay any additional costs.)
mana={5}
type=Artifact Creature
subtype=Golem
power=5
toughness=3
[/card]
[card]
name=Retrofitter Foundry
auto={3}:untap
auto={2}{T}:create(servo artifact:creature servo artifact:1/1:colorless:)
auto={1}{T}[S(Servo|myBattlefield)}:create(thopter artifact:creature thopter artifact:1/1:colorless:flying)
auto={T}[S(Thopter|myBattlefield)}:create(construct artifact:creature construct artifact:4/4:colorless:)
text={3}: Untap Retrofitter Foundry. -- {2}, {T}: Create a 1/1 colorless Servo artifact creature token. -- {1}, {T}, Sacrifice a Servo: Create a 1/1 colorless Thopter artifact creature token with flying. -- {T}, Sacrifice a Thopter: Create a 4/4 colorless Construct artifact creature token.
mana={1}
type=Artifact
[/card]

Some files were not shown because too many files have changed in this diff Show More