Compare commits
158 Commits
wagic-v0.2
...
latest-cma
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
af0c423359 | ||
|
|
45253e0008 | ||
|
|
e32e5c2a47 | ||
|
|
3a4f9f06cb | ||
|
|
a563030440 | ||
|
|
80d43896ff | ||
|
|
1c5949411f | ||
|
|
699b151939 | ||
|
|
e6af1a08b9 | ||
|
|
7eac02f8d4 | ||
|
|
58e70e2500 | ||
|
|
56ca2021dc | ||
|
|
e4e431dcee | ||
|
|
abfff205ee | ||
|
|
6416e4e0d9 | ||
|
|
86f4730db7 | ||
|
|
33a5479512 | ||
|
|
891859f4ca | ||
|
|
d5bfb8201b | ||
|
|
f49ef92f90 | ||
|
|
02d004b5bf | ||
|
|
55f8a8a1d0 | ||
|
|
068a69c80b | ||
|
|
375e66489f | ||
|
|
cbbd034862 | ||
|
|
f7fe948da5 | ||
|
|
478ce0863b | ||
|
|
329011460f | ||
|
|
48ec51a923 | ||
|
|
9936962c56 | ||
|
|
15111d1b20 | ||
|
|
2b342ca33b | ||
|
|
97e6df7f59 | ||
|
|
a2bb67a828 | ||
|
|
d14e28d7b3 | ||
|
|
0a0ee3cc98 | ||
|
|
99e6a254e1 | ||
|
|
68714ebad8 | ||
|
|
48ef4144bc | ||
|
|
78a4da4945 | ||
|
|
af0861877a | ||
|
|
a23b96ba75 | ||
|
|
47704f7591 | ||
|
|
755f90f38b | ||
|
|
8a56406c19 | ||
|
|
887ea94a4d | ||
|
|
499b3ddf3e | ||
|
|
83e55b1074 | ||
|
|
1f87ed77e4 | ||
|
|
93b7d210dc | ||
|
|
10d9d84f84 | ||
|
|
fc9a4d5431 | ||
|
|
4b3a2531a6 | ||
|
|
ed4871548e | ||
|
|
1284b8da8b | ||
|
|
95455603a1 | ||
|
|
813c54a166 | ||
|
|
fa2a2d51a5 | ||
|
|
4b68b636ce | ||
|
|
0a01b0af69 | ||
|
|
e4e809f3fe | ||
|
|
1667b79fa8 | ||
|
|
31272ff0fe | ||
|
|
9335063d68 | ||
|
|
39dfaf3acb | ||
|
|
3e7ecd51fd | ||
|
|
c9ee4a304e | ||
|
|
2f1bf7bdbe | ||
|
|
41890f6bb4 | ||
|
|
24cd7cab58 | ||
|
|
473d9387d4 | ||
|
|
f5495adce1 | ||
|
|
d802ec4b59 | ||
|
|
8f69e2a204 | ||
|
|
c3fc579907 | ||
|
|
cc06370bcd | ||
|
|
ed15ec2469 | ||
|
|
3f7d5ff041 | ||
|
|
d5bcf40cbb | ||
|
|
49c196814f | ||
|
|
c4282ce936 | ||
|
|
cd1c09127f | ||
|
|
9afebe0851 | ||
|
|
9a7382ea06 | ||
|
|
7a7e723009 | ||
|
|
9d772284cc | ||
|
|
a981761deb | ||
|
|
fc13ffa242 | ||
|
|
878b2cd639 | ||
|
|
995922d2d7 | ||
|
|
0d100aa9be | ||
|
|
d4fabed317 | ||
|
|
9eff781103 | ||
|
|
0353da3d27 | ||
|
|
3cbdc6e9fe | ||
|
|
ce71afd704 | ||
|
|
603d491bed | ||
|
|
20a792f135 | ||
|
|
87f5e7f3a6 | ||
|
|
e272925f3d | ||
|
|
19091ade7b | ||
|
|
e62c065e2c | ||
|
|
2312381b82 | ||
|
|
639942d444 | ||
|
|
55a5b9d0ba | ||
|
|
a33517e5d0 | ||
|
|
c981586bcf | ||
|
|
b473238f02 | ||
|
|
1d9b92080f | ||
|
|
7f89d4d39f | ||
|
|
4f00ec2277 | ||
|
|
26db10a083 | ||
|
|
3ec2ceb725 | ||
|
|
667ac39e06 | ||
|
|
993d62a8c8 | ||
|
|
09a70d4573 | ||
|
|
3afa730751 | ||
|
|
3245ddbfe7 | ||
|
|
def55943ed | ||
|
|
4accc9c018 | ||
|
|
579d612397 | ||
|
|
daabce1d2f | ||
|
|
5885829585 | ||
|
|
3e7b9e68d5 | ||
|
|
4a52139457 | ||
|
|
79ea403273 | ||
|
|
397d7fa6c8 | ||
|
|
ac787a6f51 | ||
|
|
0418e77d34 | ||
|
|
a2c6a3669b | ||
|
|
b8d22240a8 | ||
|
|
b458d570a1 | ||
|
|
5022df0d14 | ||
|
|
220b48b144 | ||
|
|
8aeed46181 | ||
|
|
38b34eae2f | ||
|
|
648b21f972 | ||
|
|
09717a966b | ||
|
|
eef46fe743 | ||
|
|
5f91566fa7 | ||
|
|
c83a476ebe | ||
|
|
954bba274c | ||
|
|
d370a5c13d | ||
|
|
181189bee0 | ||
|
|
c678f5e85a | ||
|
|
0fabf83c62 | ||
|
|
b7e8d19290 | ||
|
|
d0db71602a | ||
|
|
112efddb4e | ||
|
|
4cea81e564 | ||
|
|
3a40a34566 | ||
|
|
a4ff87a7d5 | ||
|
|
797077c47b | ||
|
|
075d950249 | ||
|
|
22d14b2a4f | ||
|
|
4272e2e2b2 | ||
|
|
34279cfacf | ||
|
|
85f4a4c36a |
6
.gitmodules
vendored
Normal file
6
.gitmodules
vendored
Normal 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
|
||||
169
.travis.yml
169
.travis.yml
@@ -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
239
CMakeLists.txt
Normal 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()
|
||||
373
CMakeModules/DetectAndroidSDK.cmake
Normal file
373
CMakeModules/DetectAndroidSDK.cmake
Normal file
@@ -0,0 +1,373 @@
|
||||
if(EXISTS "${ANDROID_EXECUTABLE}")
|
||||
set(ANDROID_SDK_DETECT_QUIET TRUE)
|
||||
endif()
|
||||
|
||||
file(TO_CMAKE_PATH "$ENV{ProgramFiles}" ProgramFiles_ENV_PATH)
|
||||
file(TO_CMAKE_PATH "$ENV{HOME}" HOME_ENV_PATH)
|
||||
|
||||
if(CMAKE_HOST_WIN32)
|
||||
set(ANDROID_SDK_OS windows)
|
||||
elseif(CMAKE_HOST_APPLE)
|
||||
set(ANDROID_SDK_OS macosx)
|
||||
else()
|
||||
set(ANDROID_SDK_OS linux)
|
||||
endif()
|
||||
|
||||
#find android SDK: search in ANDROID_SDK first
|
||||
find_host_program(ANDROID_EXECUTABLE
|
||||
NAMES android.bat android
|
||||
PATH_SUFFIXES tools
|
||||
PATHS
|
||||
ENV ANDROID_SDK
|
||||
DOC "Android SDK location"
|
||||
NO_DEFAULT_PATH
|
||||
)
|
||||
|
||||
# Now search default paths
|
||||
find_host_program(ANDROID_EXECUTABLE
|
||||
NAMES android.bat android
|
||||
PATH_SUFFIXES android-sdk-${ANDROID_SDK_OS}/tools
|
||||
android-sdk-${ANDROID_SDK_OS}_x86/tools
|
||||
android-sdk-${ANDROID_SDK_OS}_86/tools
|
||||
android-sdk/tools
|
||||
PATHS /opt
|
||||
"${HOME_ENV_PATH}/NVPACK"
|
||||
"$ENV{SystemDrive}/NVPACK"
|
||||
"${ProgramFiles_ENV_PATH}/Android"
|
||||
DOC "Android SDK location"
|
||||
)
|
||||
|
||||
if(ANDROID_EXECUTABLE)
|
||||
if(NOT ANDROID_SDK_DETECT_QUIET)
|
||||
message(STATUS "Found android tool: ${ANDROID_EXECUTABLE}")
|
||||
endif()
|
||||
|
||||
get_filename_component(ANDROID_SDK_TOOLS_PATH "${ANDROID_EXECUTABLE}" PATH)
|
||||
|
||||
#read source.properties
|
||||
if(EXISTS "${ANDROID_SDK_TOOLS_PATH}/source.properties")
|
||||
file(STRINGS "${ANDROID_SDK_TOOLS_PATH}/source.properties" ANDROID_SDK_TOOLS_SOURCE_PROPERTIES_LINES REGEX "^[ ]*[^#].*$")
|
||||
foreach(line ${ANDROID_SDK_TOOLS_SOURCE_PROPERTIES_LINES})
|
||||
string(REPLACE "\\:" ":" line ${line})
|
||||
string(REPLACE "=" ";" line ${line})
|
||||
list(GET line 0 line_name)
|
||||
list(GET line 1 line_value)
|
||||
string(REPLACE "." "_" line_name ${line_name})
|
||||
SET(ANDROID_TOOLS_${line_name} "${line_value}" CACHE INTERNAL "from ${ANDROID_SDK_TOOLS_PATH}/source.properties")
|
||||
MARK_AS_ADVANCED(ANDROID_TOOLS_${line_name})
|
||||
endforeach()
|
||||
endif()
|
||||
|
||||
#fix missing revision (SDK tools before r9 don't set revision number correctly)
|
||||
if(NOT ANDROID_TOOLS_Pkg_Revision)
|
||||
SET(ANDROID_TOOLS_Pkg_Revision "Unknown" CACHE INTERNAL "")
|
||||
MARK_AS_ADVANCED(ANDROID_TOOLS_Pkg_Revision)
|
||||
endif()
|
||||
|
||||
#fix missing description
|
||||
if(NOT ANDROID_TOOLS_Pkg_Desc)
|
||||
SET(ANDROID_TOOLS_Pkg_Desc "Android SDK Tools, revision ${ANDROID_TOOLS_Pkg_Revision}." CACHE INTERNAL "")
|
||||
MARK_AS_ADVANCED(ANDROID_TOOLS_Pkg_Desc)
|
||||
endif()
|
||||
|
||||
#warn about outdated SDK
|
||||
if(NOT ANDROID_TOOLS_Pkg_Revision GREATER 13)
|
||||
SET(ANDROID_TOOLS_Pkg_Desc "${ANDROID_TOOLS_Pkg_Desc} It is recommended to update your SDK tools to revision 14 or newer." CACHE INTERNAL "")
|
||||
endif()
|
||||
|
||||
if(ANDROID_TOOLS_Pkg_Revision GREATER 13)
|
||||
SET(ANDROID_PROJECT_PROPERTIES_FILE project.properties)
|
||||
SET(ANDROID_ANT_PROPERTIES_FILE ant.properties)
|
||||
else()
|
||||
SET(ANDROID_PROJECT_PROPERTIES_FILE default.properties)
|
||||
SET(ANDROID_ANT_PROPERTIES_FILE build.properties)
|
||||
endif()
|
||||
|
||||
set(ANDROID_MANIFEST_FILE AndroidManifest.xml)
|
||||
set(ANDROID_LIB_PROJECT_FILES build.xml local.properties proguard-project.txt ${ANDROID_PROJECT_PROPERTIES_FILE})
|
||||
set(ANDROID_PROJECT_FILES ${ANDROID_LIB_PROJECT_FILES})
|
||||
|
||||
#get installed targets
|
||||
if(ANDROID_TOOLS_Pkg_Revision GREATER 11)
|
||||
execute_process(COMMAND ${ANDROID_EXECUTABLE} list target -c
|
||||
RESULT_VARIABLE ANDROID_PROCESS
|
||||
OUTPUT_VARIABLE ANDROID_SDK_TARGETS
|
||||
ERROR_VARIABLE ANDROID_PROCESS_ERRORS
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
string(REGEX MATCHALL "[^\n]+" ANDROID_SDK_TARGETS "${ANDROID_SDK_TARGETS}")
|
||||
else()
|
||||
#old SDKs (r11 and older) don't provide compact list
|
||||
execute_process(COMMAND ${ANDROID_EXECUTABLE} list target
|
||||
RESULT_VARIABLE ANDROID_PROCESS
|
||||
OUTPUT_VARIABLE ANDROID_SDK_TARGETS_FULL
|
||||
ERROR_VARIABLE ANDROID_PROCESS_ERRORS
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
string(REGEX MATCHALL "(^|\n)id: [0-9]+ or \"([^\n]+[0-9+])\"(\n|$)" ANDROID_SDK_TARGETS_FULL "${ANDROID_SDK_TARGETS_FULL}")
|
||||
|
||||
SET(ANDROID_SDK_TARGETS "")
|
||||
if(ANDROID_PROCESS EQUAL 0)
|
||||
foreach(line ${ANDROID_SDK_TARGETS_FULL})
|
||||
string(REGEX REPLACE "(^|\n)id: [0-9]+ or \"([^\n]+[0-9+])\"(\n|$)" "\\2" line "${line}")
|
||||
list(APPEND ANDROID_SDK_TARGETS "${line}")
|
||||
endforeach()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NOT ANDROID_PROCESS EQUAL 0)
|
||||
message(ERROR "Failed to get list of installed Android targets.")
|
||||
set(ANDROID_EXECUTABLE "ANDROID_EXECUTABLE-NOTFOUND")
|
||||
endif()
|
||||
|
||||
# clear ANDROID_SDK_TARGET if no target is provided by user
|
||||
if(NOT ANDROID_SDK_TARGET)
|
||||
set(ANDROID_SDK_TARGET "" CACHE STRING "Android SDK target for the Wagic Java API and samples")
|
||||
endif()
|
||||
if(ANDROID_SDK_TARGETS)
|
||||
set_property( CACHE ANDROID_SDK_TARGET PROPERTY STRINGS ${ANDROID_SDK_TARGETS} )
|
||||
endif()
|
||||
endif(ANDROID_EXECUTABLE)
|
||||
|
||||
# finds minimal installed SDK target compatible with provided names or API levels
|
||||
# usage:
|
||||
# get_compatible_android_api_level(VARIABLE [level1] [level2] ...)
|
||||
macro(android_get_compatible_target VAR)
|
||||
set(${VAR} "${VAR}-NOTFOUND")
|
||||
if(ANDROID_SDK_TARGETS)
|
||||
list(GET ANDROID_SDK_TARGETS 0 __lvl)
|
||||
string(REGEX MATCH "[0-9]+$" __lvl "${__lvl}")
|
||||
|
||||
#find minimal level mathing to all provided levels
|
||||
foreach(lvl ${ARGN})
|
||||
string(REGEX MATCH "[0-9]+$" __level "${lvl}")
|
||||
if(__level GREATER __lvl)
|
||||
set(__lvl ${__level})
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
#search for compatible levels
|
||||
foreach(lvl ${ANDROID_SDK_TARGETS})
|
||||
string(REGEX MATCH "[0-9]+$" __level "${lvl}")
|
||||
if(__level EQUAL __lvl)
|
||||
#look for exact match
|
||||
foreach(usrlvl ${ARGN})
|
||||
if("${usrlvl}" STREQUAL "${lvl}")
|
||||
set(${VAR} "${lvl}")
|
||||
break()
|
||||
endif()
|
||||
endforeach()
|
||||
if("${${VAR}}" STREQUAL "${lvl}")
|
||||
break() #exact match was found
|
||||
elseif(NOT ${VAR})
|
||||
set(${VAR} "${lvl}")
|
||||
endif()
|
||||
elseif(__level GREATER __lvl)
|
||||
if(NOT ${VAR})
|
||||
set(${VAR} "${lvl}")
|
||||
endif()
|
||||
break()
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
unset(__lvl)
|
||||
unset(__level)
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
unset(__android_project_chain CACHE)
|
||||
|
||||
# add_android_project(target_name ${path} NATIVE_DEPS opencv_core LIBRARY_DEPS ${Wagic_BINARY_DIR} SDK_TARGET 11)
|
||||
macro(add_android_project target path)
|
||||
# parse arguments
|
||||
set(android_proj_arglist NATIVE_DEPS LIBRARY_DEPS SDK_TARGET IGNORE_JAVA IGNORE_MANIFEST)
|
||||
set(__varname "android_proj_")
|
||||
foreach(v ${android_proj_arglist})
|
||||
set(${__varname}${v} "")
|
||||
endforeach()
|
||||
foreach(arg ${ARGN})
|
||||
set(__var "${__varname}")
|
||||
foreach(v ${android_proj_arglist})
|
||||
if("${v}" STREQUAL "${arg}")
|
||||
set(__varname "android_proj_${v}")
|
||||
break()
|
||||
endif()
|
||||
endforeach()
|
||||
if(__var STREQUAL __varname)
|
||||
list(APPEND ${__var} "${arg}")
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
# get compatible SDK target
|
||||
android_get_compatible_target(android_proj_sdk_target ${ANDROID_NATIVE_API_LEVEL} ${android_proj_SDK_TARGET})
|
||||
|
||||
if(NOT android_proj_sdk_target)
|
||||
message(WARNING "Can not find any SDK target compatible with: ${ANDROID_NATIVE_API_LEVEL} ${android_proj_SDK_TARGET}
|
||||
The project ${target} will not be build")
|
||||
endif()
|
||||
|
||||
# check native dependencies
|
||||
if(android_proj_IGNORE_JAVA)
|
||||
ocv_check_dependencies(${android_proj_NATIVE_DEPS})
|
||||
else()
|
||||
ocv_check_dependencies(${android_proj_NATIVE_DEPS} opencv_java)
|
||||
endif()
|
||||
|
||||
if(EXISTS "${path}/jni/Android.mk" )
|
||||
# find if native_app_glue is used
|
||||
file(STRINGS "${path}/jni/Android.mk" NATIVE_APP_GLUE REGEX ".*(call import-module,android/native_app_glue)" )
|
||||
if(NATIVE_APP_GLUE)
|
||||
if(ANDROID_NATIVE_API_LEVEL LESS 9 OR NOT EXISTS "${ANDROID_NDK}/sources/android/native_app_glue")
|
||||
set(OCV_DEPENDENCIES_FOUND FALSE)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(OCV_DEPENDENCIES_FOUND AND android_proj_sdk_target AND ANDROID_EXECUTABLE AND ANT_EXECUTABLE AND ANDROID_TOOLS_Pkg_Revision GREATER 13 AND EXISTS "${path}/${ANDROID_MANIFEST_FILE}")
|
||||
|
||||
project(${target})
|
||||
set(android_proj_bin_dir "${CMAKE_CURRENT_BINARY_DIR}/.build")
|
||||
|
||||
# get project sources
|
||||
file(GLOB_RECURSE android_proj_files RELATIVE "${path}" "${path}/res/*" "${path}/src/*")
|
||||
|
||||
if(NOT android_proj_IGNORE_MANIFEST)
|
||||
list(APPEND android_proj_files ${ANDROID_MANIFEST_FILE})
|
||||
endif()
|
||||
|
||||
# copy sources out from the build tree
|
||||
set(android_proj_file_deps "")
|
||||
foreach(f ${android_proj_files})
|
||||
add_custom_command(
|
||||
OUTPUT "${android_proj_bin_dir}/${f}"
|
||||
COMMAND ${CMAKE_COMMAND} -E copy "${path}/${f}" "${android_proj_bin_dir}/${f}"
|
||||
MAIN_DEPENDENCY "${path}/${f}"
|
||||
COMMENT "Copying ${f}")
|
||||
list(APPEND android_proj_file_deps "${path}/${f}" "${android_proj_bin_dir}/${f}")
|
||||
endforeach()
|
||||
|
||||
set(android_proj_lib_deps_commands "")
|
||||
set(android_proj_target_files ${ANDROID_PROJECT_FILES})
|
||||
ocv_list_add_prefix(android_proj_target_files "${android_proj_bin_dir}/")
|
||||
|
||||
# process Android library dependencies
|
||||
foreach(dep ${android_proj_LIBRARY_DEPS})
|
||||
file(RELATIVE_PATH __dep "${android_proj_bin_dir}" "${dep}")
|
||||
list(APPEND android_proj_lib_deps_commands
|
||||
COMMAND ${ANDROID_EXECUTABLE} --silent update project --path "${android_proj_bin_dir}" --library "${__dep}")
|
||||
endforeach()
|
||||
|
||||
# fix Android project
|
||||
add_custom_command(
|
||||
OUTPUT ${android_proj_target_files}
|
||||
COMMAND ${CMAKE_COMMAND} -E remove ${android_proj_target_files}
|
||||
COMMAND ${ANDROID_EXECUTABLE} --silent update project --path "${android_proj_bin_dir}" --target "${android_proj_sdk_target}" --name "${target}"
|
||||
${android_proj_lib_deps_commands}
|
||||
MAIN_DEPENDENCY "${android_proj_bin_dir}/${ANDROID_MANIFEST_FILE}"
|
||||
DEPENDS "${path}/${ANDROID_MANIFEST_FILE}"
|
||||
COMMENT "Updating Android project at ${path}. SDK target: ${android_proj_sdk_target}"
|
||||
)
|
||||
|
||||
list(APPEND android_proj_file_deps ${android_proj_target_files})
|
||||
|
||||
# build native part
|
||||
file(GLOB_RECURSE android_proj_jni_files "${path}/jni/*.c" "${path}/jni/*.h" "${path}/jni/*.cpp" "${path}/jni/*.hpp")
|
||||
ocv_list_filterout(android_proj_jni_files "\\\\.svn")
|
||||
|
||||
if(android_proj_jni_files AND EXISTS ${path}/jni/Android.mk AND NOT DEFINED JNI_LIB_NAME)
|
||||
# find local module name in Android.mk file to build native lib
|
||||
file(STRINGS "${path}/jni/Android.mk" JNI_LIB_NAME REGEX "LOCAL_MODULE[ ]*:=[ ]*.*" )
|
||||
string(REGEX REPLACE "LOCAL_MODULE[ ]*:=[ ]*([a-zA-Z_][a-zA-Z_0-9]*)[ ]*" "\\1" JNI_LIB_NAME "${JNI_LIB_NAME}")
|
||||
|
||||
if(JNI_LIB_NAME)
|
||||
ocv_include_modules_recurse(${android_proj_NATIVE_DEPS})
|
||||
ocv_include_directories("${path}/jni")
|
||||
|
||||
if(NATIVE_APP_GLUE)
|
||||
include_directories(${ANDROID_NDK}/sources/android/native_app_glue)
|
||||
list(APPEND android_proj_jni_files ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c)
|
||||
ocv_warnings_disable(CMAKE_C_FLAGS -Wstrict-prototypes -Wunused-parameter -Wmissing-prototypes)
|
||||
set(android_proj_NATIVE_DEPS ${android_proj_NATIVE_DEPS} android)
|
||||
endif()
|
||||
|
||||
add_library(${JNI_LIB_NAME} MODULE ${android_proj_jni_files})
|
||||
target_link_libraries(${JNI_LIB_NAME} ${OPENCV_LINKER_LIBS} ${android_proj_NATIVE_DEPS})
|
||||
|
||||
set_target_properties(${JNI_LIB_NAME} PROPERTIES
|
||||
OUTPUT_NAME "${JNI_LIB_NAME}"
|
||||
LIBRARY_OUTPUT_DIRECTORY "${android_proj_bin_dir}/libs/${ANDROID_NDK_ABI_NAME}"
|
||||
)
|
||||
|
||||
get_target_property(android_proj_jni_location "${JNI_LIB_NAME}" LOCATION)
|
||||
if (NOT (CMAKE_BUILD_TYPE MATCHES "debug"))
|
||||
add_custom_command(TARGET ${JNI_LIB_NAME} POST_BUILD COMMAND ${CMAKE_STRIP} --strip-unneeded "${android_proj_jni_location}")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# build java part
|
||||
if(android_proj_IGNORE_JAVA)
|
||||
add_custom_command(
|
||||
OUTPUT "${android_proj_bin_dir}/bin/${target}-debug.apk"
|
||||
COMMAND ${ANT_EXECUTABLE} -q -noinput -k debug
|
||||
COMMAND ${CMAKE_COMMAND} -E touch "${android_proj_bin_dir}/bin/${target}-debug.apk" # needed because ant does not update the timestamp of updated apk
|
||||
WORKING_DIRECTORY "${android_proj_bin_dir}"
|
||||
MAIN_DEPENDENCY "${android_proj_bin_dir}/${ANDROID_MANIFEST_FILE}"
|
||||
DEPENDS ${android_proj_file_deps} ${JNI_LIB_NAME})
|
||||
else()
|
||||
add_custom_command(
|
||||
OUTPUT "${android_proj_bin_dir}/bin/${target}-debug.apk"
|
||||
COMMAND ${ANT_EXECUTABLE} -q -noinput -k debug
|
||||
COMMAND ${CMAKE_COMMAND} -E touch "${android_proj_bin_dir}/bin/${target}-debug.apk" # needed because ant does not update the timestamp of updated apk
|
||||
WORKING_DIRECTORY "${android_proj_bin_dir}"
|
||||
MAIN_DEPENDENCY "${android_proj_bin_dir}/${ANDROID_MANIFEST_FILE}"
|
||||
DEPENDS "${Wagic_BINARY_DIR}/bin/classes.jar.dephelper" opencv_java # as we are part of Wagic we can just force this dependency
|
||||
DEPENDS ${android_proj_file_deps} ${JNI_LIB_NAME})
|
||||
endif()
|
||||
|
||||
unset(JNI_LIB_NAME)
|
||||
|
||||
add_custom_target(${target} ALL SOURCES "${android_proj_bin_dir}/bin/${target}-debug.apk" )
|
||||
if(NOT android_proj_IGNORE_JAVA)
|
||||
add_dependencies(${target} opencv_java)
|
||||
endif()
|
||||
if(android_proj_native_deps)
|
||||
add_dependencies(${target} ${android_proj_native_deps})
|
||||
endif()
|
||||
|
||||
if(__android_project_chain)
|
||||
add_dependencies(${target} ${__android_project_chain})
|
||||
endif()
|
||||
set(__android_project_chain ${target} CACHE INTERNAL "auxiliary variable used for Android progects chaining")
|
||||
|
||||
# put the final .apk to the Wagic's bin folder
|
||||
add_custom_command(TARGET ${target} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy "${android_proj_bin_dir}/bin/${target}-debug.apk" "${Wagic_BINARY_DIR}/bin/${target}.apk")
|
||||
if(INSTALL_ANDROID_EXAMPLES AND "${target}" MATCHES "^example-")
|
||||
#apk
|
||||
install(FILES "${Wagic_BINARY_DIR}/bin/${target}.apk" DESTINATION "samples" COMPONENT main)
|
||||
get_filename_component(sample_dir "${path}" NAME)
|
||||
#java part
|
||||
list(REMOVE_ITEM android_proj_files ${ANDROID_MANIFEST_FILE})
|
||||
foreach(f ${android_proj_files} ${ANDROID_MANIFEST_FILE})
|
||||
get_filename_component(install_subdir "${f}" PATH)
|
||||
install(FILES "${android_proj_bin_dir}/${f}" DESTINATION "samples/${sample_dir}/${install_subdir}" COMPONENT main)
|
||||
endforeach()
|
||||
#jni part + eclipse files
|
||||
file(GLOB_RECURSE jni_files RELATIVE "${path}" "${path}/jni/*" "${path}/.cproject")
|
||||
ocv_list_filterout(jni_files "\\\\.svn")
|
||||
foreach(f ${jni_files} ".classpath" ".project" ".settings/org.eclipse.jdt.core.prefs")
|
||||
get_filename_component(install_subdir "${f}" PATH)
|
||||
install(FILES "${path}/${f}" DESTINATION "samples/${sample_dir}/${install_subdir}" COMPONENT main)
|
||||
endforeach()
|
||||
#update proj
|
||||
if(android_proj_lib_deps_commands)
|
||||
set(inst_lib_opt " --library ../../sdk/java")
|
||||
endif()
|
||||
install(CODE "EXECUTE_PROCESS(COMMAND ${ANDROID_EXECUTABLE} --silent update project --path . --target \"${android_proj_sdk_target}\" --name \"${target}\" ${inst_lib_opt}
|
||||
WORKING_DIRECTORY \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/samples/${sample_dir}\"
|
||||
)" COMPONENT main)
|
||||
#empty 'gen'
|
||||
install(CODE "MAKE_DIRECTORY(\"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/samples/${sample_dir}/gen\")" COMPONENT main)
|
||||
endif()
|
||||
endif()
|
||||
endmacro()
|
||||
13
CMakeModules/FindAnt.cmake
Normal file
13
CMakeModules/FindAnt.cmake
Normal file
@@ -0,0 +1,13 @@
|
||||
find_host_program(ANT_EXECUTABLE "ant")
|
||||
|
||||
if(ANT_EXECUTABLE)
|
||||
set(ANT_FOUND ON)
|
||||
else()
|
||||
set(ANT_FOUND OFF)
|
||||
endif()
|
||||
|
||||
|
||||
INCLUDE(FindPackageHandleStandardArgs)
|
||||
|
||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(ANT REQUIRED_VARS ANT_EXECUTABLE)
|
||||
mark_as_advanced(ANT_EXECUTABLE ANT_FOUND)
|
||||
29
CMakeModules/FindOpenSL.cmake
Normal file
29
CMakeModules/FindOpenSL.cmake
Normal 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)
|
||||
231
CMakeModules/FindOrBuild.cmake
Normal file
231
CMakeModules/FindOrBuild.cmake
Normal 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()
|
||||
|
||||
62
CMakeModules/FindPSPSDK.cmake
Normal file
62
CMakeModules/FindPSPSDK.cmake
Normal 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
181
CMakeModules/FindSDL2.cmake
Normal 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
26
CMakeModules/FindTinyXML.cmake
Executable 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 )
|
||||
1693
CMakeModules/android.toolchain.cmake
Normal file
1693
CMakeModules/android.toolchain.cmake
Normal file
File diff suppressed because it is too large
Load Diff
48
CMakeModules/ios-theos.toolchain.cmake
Normal file
48
CMakeModules/ios-theos.toolchain.cmake
Normal 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)
|
||||
62
CMakeModules/psp.toolchain.cmake
Normal file
62
CMakeModules/psp.toolchain.cmake
Normal 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
57
CMakeModules/utils.cmake
Normal 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
165
JGE/CMakeLists.txt
Normal 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)
|
||||
@@ -25,6 +25,7 @@ std::string ToHex(T* pointer)
|
||||
|
||||
#ifdef LINUX
|
||||
#define OutputDebugString(val) (std::cerr << val);
|
||||
#define OutputDebugStringA(val) (std::cerr << val);
|
||||
#endif
|
||||
|
||||
#ifdef _DEBUG
|
||||
|
||||
@@ -41,7 +41,7 @@ class DownloadRequest
|
||||
private slots:
|
||||
#endif
|
||||
void fileDownloaded();
|
||||
void downloadProgress(qint64 bytesReceived, qint64 bytesTotal);
|
||||
void downloadProgress(int64_t bytesReceived, int64_t bytesTotal);
|
||||
|
||||
#ifdef QT_CONFIG
|
||||
signals:
|
||||
@@ -72,7 +72,13 @@ protected:
|
||||
QNetworkReply* mNetworkReply;
|
||||
static QNetworkAccessManager networkAccessManager;
|
||||
#endif
|
||||
|
||||
#ifdef __EMSCRIPTEN__
|
||||
static void onLoadCb(unsigned int handle, DownloadRequest* req, const char *buffer, unsigned int size);
|
||||
static void onErrorCb(unsigned int handle, DownloadRequest* req, int errorCode, const char* errorText);
|
||||
static void onProgressCb(unsigned int handle, DownloadRequest* req, int bytesReceived, int bytesTotal);
|
||||
#endif
|
||||
void processError(int errorCode, const char* errorText);
|
||||
void processBufferDownloaded(unsigned int size, const char*buffer);
|
||||
|
||||
public:
|
||||
DownloadRequest(string localPath="",
|
||||
|
||||
@@ -31,7 +31,7 @@ typedef u32 LocalKeySym;
|
||||
|
||||
#elif defined(SDL_CONFIG)
|
||||
#include <SDL.h>
|
||||
typedef SDLKey LocalKeySym;
|
||||
typedef SDL_Keycode LocalKeySym;
|
||||
#define LOCAL_KEY_NONE SDLK_UNKNOWN
|
||||
|
||||
#elif defined(WIN32)
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#if (!defined IOS) && (!defined ANDROID) && (!defined QT_CONFIG)
|
||||
#if (!defined IOS) && (!defined ANDROID) && (!defined QT_CONFIG) && (!defined SDL_CONFIG)
|
||||
#include <gif_lib.h>
|
||||
#endif //IOS ANDROID
|
||||
|
||||
@@ -567,7 +567,7 @@ private:
|
||||
#if (!defined IOS) && (!defined QT_CONFIG)
|
||||
void LoadJPG(TextureInfo &textureInfo, const char *filename, int mode = 0, int TextureFormat = TEXTURE_FORMAT);
|
||||
int LoadPNG(TextureInfo &textureInfo, const char *filename, int mode = 0, int TextureFormat = TEXTURE_FORMAT);
|
||||
#if (!defined ANDROID) && (!defined QT_CONFIG)
|
||||
#if (!defined ANDROID) && (!defined QT_CONFIG) && (!defined SDL_CONFIG)
|
||||
void LoadGIF(TextureInfo &textureInfo, const char *filename, int mode = 0, int TextureFormat = TEXTURE_FORMAT);
|
||||
int image_readgif(void * handle, TextureInfo &textureInfo, DWORD * bgcolor, InputFunc readFunc,int mode = 0, int TextureFormat = TEXTURE_FORMAT);
|
||||
#endif // (ANDROID) How can we get gif support for android ?
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
29
JGE/include/PrecompiledHeader.h
Normal file
29
JGE/include/PrecompiledHeader.h
Normal 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
|
||||
@@ -1,7 +1,7 @@
|
||||
#ifndef THREADING_H
|
||||
#define THREADING_H
|
||||
|
||||
#if !defined(PSP) && !defined(QT_CONFIG) && !(__cplusplus > 199711L)
|
||||
#if !defined(PSP) && !defined(QT_CONFIG) && !(__cplusplus > 199711L) && !(_MSC_VER >= 1700)
|
||||
#include <boost/date_time.hpp>
|
||||
|
||||
#ifdef WIN32
|
||||
@@ -537,7 +537,7 @@ namespace boost
|
||||
}
|
||||
}
|
||||
|
||||
#elif (__cplusplus > 199711L)
|
||||
#elif (__cplusplus > 199711L) || (_MSC_VER >= 1700)
|
||||
|
||||
#include <thread>
|
||||
#include <mutex>
|
||||
|
||||
@@ -33,6 +33,7 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
void* vrelptr( void *ptr ); // make a pointer relative to memory base address (ATTENTION: A NULL rel ptr is not illegal/invalid!)
|
||||
|
||||
void* vabsptr( void *ptr ); // make a pointer absolute (default return type of valloc)
|
||||
|
||||
void* valloc( size_t size );
|
||||
|
||||
@@ -7,6 +7,9 @@
|
||||
#ifdef QT_CONFIG
|
||||
QNetworkAccessManager DownloadRequest::networkAccessManager;
|
||||
#endif
|
||||
#ifdef __EMSCRIPTEN__
|
||||
#include "emscripten.h"
|
||||
#endif
|
||||
|
||||
DownloadRequest::DownloadRequest(string localPath,
|
||||
string remoteResourceURL,
|
||||
@@ -48,15 +51,71 @@ void DownloadRequest::startGet()
|
||||
JFileSystem::GetInstance()->Remove(getTempLocalPath());
|
||||
JFileSystem::GetInstance()->openForWrite(mFile, getTempLocalPath());
|
||||
#ifdef QT_CONFIG
|
||||
connect(mNetworkReply, SIGNAL(downloadProgress(qint64, qint64)),
|
||||
SLOT(downloadProgress(qint64, qint64)));
|
||||
connect(mNetworkReply, SIGNAL(downloadProgress(int64_t, int64_t)),
|
||||
SLOT(downloadProgress(int64_t, int64_t)));
|
||||
connect(mNetworkReply, SIGNAL(finished()), SLOT(fileDownloaded()));
|
||||
#endif
|
||||
|
||||
#ifdef __EMSCRIPTEN__
|
||||
emscripten_async_wget2_data(mRemoteResourceURL.c_str(), "GET", 0, this, 1,
|
||||
(em_async_wget2_data_onload_func)DownloadRequest::onLoadCb,
|
||||
(em_async_wget2_data_onerror_func)DownloadRequest::onErrorCb,
|
||||
(em_async_wget2_data_onprogress_func)DownloadRequest::onProgressCb);
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
#ifdef __EMSCRIPTEN__
|
||||
void DownloadRequest::onLoadCb(unsigned int handle, DownloadRequest* req, const char *buffer, unsigned int size)
|
||||
{
|
||||
|
||||
DebugTrace("DownloadRequest::onLoadCb: " << size);
|
||||
req->processBufferDownloaded(size, buffer);
|
||||
Downloader::GetInstance()->Update();
|
||||
}
|
||||
|
||||
void DownloadRequest::onErrorCb(unsigned int handle, DownloadRequest* req, int errorCode, const char* errorText)
|
||||
{
|
||||
DebugTrace("DownloadRequest::onErrorCb");
|
||||
req->processError(errorCode, errorText);
|
||||
Downloader::GetInstance()->Update();
|
||||
}
|
||||
|
||||
void DownloadRequest::onProgressCb(unsigned int handle, DownloadRequest* req, int bytesReceived, int bytesTotal)
|
||||
{
|
||||
DebugTrace("DownloadRequest::onProgressCb");
|
||||
req->DownloadRequest::downloadProgress(bytesReceived, bytesTotal);
|
||||
}
|
||||
#endif
|
||||
|
||||
void DownloadRequest::processError(int errorCode, const char* errorText)
|
||||
{
|
||||
DebugTrace(errorText);
|
||||
mDownloadStatus = DownloadRequest::DOWNLOAD_ERROR;
|
||||
mFile.close();
|
||||
JFileSystem::GetInstance()->Remove(getTempLocalPath());
|
||||
}
|
||||
|
||||
void DownloadRequest::processBufferDownloaded(unsigned int size, const char*buffer)
|
||||
{
|
||||
if(mFile.is_open())
|
||||
{
|
||||
mTotalSize = size;
|
||||
mFile.write(buffer, size);
|
||||
mFile.close();
|
||||
if(!JFileSystem::GetInstance()->Rename(getTempLocalPath(), mLocalPath)) {
|
||||
mDownloadStatus = DownloadRequest::DOWNLOAD_ERROR;
|
||||
return;
|
||||
}
|
||||
}
|
||||
mDownloadStatus = DownloadRequest::DOWNLOADED;
|
||||
}
|
||||
|
||||
void DownloadRequest::fileDownloaded()
|
||||
{
|
||||
do {
|
||||
#ifdef QT_CONFIG
|
||||
do {
|
||||
QByteArray eTagByteArray = mNetworkReply->rawHeader("ETag");
|
||||
if(!eTagByteArray.isEmpty()) {
|
||||
string oldETag = mETag;
|
||||
@@ -67,10 +126,7 @@ void DownloadRequest::fileDownloaded()
|
||||
|
||||
// let's check some error
|
||||
if(mNetworkReply->error() != QNetworkReply::NoError) {
|
||||
DebugTrace(mNetworkReply->errorString().toStdString());
|
||||
mDownloadStatus = DownloadRequest::DOWNLOAD_ERROR;
|
||||
mFile.close();
|
||||
JFileSystem::GetInstance()->Remove(getTempLocalPath());
|
||||
processError((int)mNetworkReply->error(), mNetworkReply->errorString().toStdString().c_str());
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -89,35 +145,31 @@ void DownloadRequest::fileDownloaded()
|
||||
return;
|
||||
}
|
||||
|
||||
if(mFile.is_open())
|
||||
{
|
||||
QByteArray byteArray = mNetworkReply->readAll();
|
||||
mFile.write(byteArray.constData(), byteArray.size());
|
||||
mFile.close();
|
||||
if(!JFileSystem::GetInstance()->Rename(getTempLocalPath(), mLocalPath)) {
|
||||
mDownloadStatus = DownloadRequest::DOWNLOAD_ERROR;
|
||||
break;
|
||||
}
|
||||
}
|
||||
mDownloadStatus = DownloadRequest::DOWNLOADED;
|
||||
QByteArray byteArray = mNetworkReply->readAll();
|
||||
processBufferDownloaded(byteArray.size(), byteArray.constData());
|
||||
} while(0);
|
||||
|
||||
Downloader::GetInstance()->Update();
|
||||
mNetworkReply->deleteLater();
|
||||
|
||||
mNetworkReply->deleteLater();
|
||||
emit statusChanged((int)mDownloadStatus);
|
||||
#endif
|
||||
}
|
||||
|
||||
void DownloadRequest::downloadProgress(qint64 bytesReceived, qint64 bytesTotal)
|
||||
void DownloadRequest::downloadProgress(int64_t bytesReceived, int64_t bytesTotal)
|
||||
{
|
||||
QByteArray byteArray = mNetworkReply->readAll();
|
||||
#ifdef QT_CONFIG
|
||||
QByteArray byteArray = mNetworkReply->readAll();
|
||||
mFile.write(byteArray.constData(), byteArray.size());
|
||||
#endif
|
||||
mCurrentSize = bytesReceived;
|
||||
mTotalSize = bytesTotal;
|
||||
int percent = 0;
|
||||
if(bytesTotal)
|
||||
percent = (bytesReceived/bytesTotal)*100;
|
||||
#ifdef QT_CONFIG
|
||||
emit percentChanged(percent);
|
||||
#endif
|
||||
}
|
||||
|
||||
Downloader* Downloader::mInstance = 0;
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
#include "../include/JSprite.h"
|
||||
#include "../include/JAnimator.h"
|
||||
|
||||
#include "tinyxml/tinyxml.h"
|
||||
#include "tinyxml.h"
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
#if defined (WIN32) // WIN32 specific code
|
||||
#include "../../Dependencies/include/fmod.h"
|
||||
#include "fmod.h"
|
||||
|
||||
u8 JGE::GetAnalogX()
|
||||
{
|
||||
@@ -54,7 +54,7 @@ u8 JGE::GetAnalogY()
|
||||
#elif defined (LINUX) // Unix specific code
|
||||
#include <sys/time.h>
|
||||
#ifdef WITH_FMOD
|
||||
#include "../Dependencies/include/fmod.h"
|
||||
#include "fmod.h"
|
||||
#endif //WITH_FMOD
|
||||
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#include <pspaudio.h>
|
||||
#include <pspmp3.h>
|
||||
#include <psputility.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#else
|
||||
#define PSP_AUDIO_VOLUME_MAX 100
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
#include "../include/JFileSystem.h"
|
||||
#include "../include/JResourceManager.h"
|
||||
|
||||
#include "tinyxml/tinyxml.h"
|
||||
#include "tinyxml.h"
|
||||
|
||||
//-------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
#include "../include/JFileSystem.h"
|
||||
#include "../include/JSpline.h"
|
||||
|
||||
#include "tinyxml/tinyxml.h"
|
||||
#include "tinyxml.h"
|
||||
|
||||
#define SMALL_NUMBER 0.0001f
|
||||
|
||||
|
||||
@@ -19,7 +19,8 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "../include/decoder_prx.h"
|
||||
#include "decoder_prx.h"
|
||||
#include <psputility.h>
|
||||
|
||||
char *prx_static_init()
|
||||
{
|
||||
@@ -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;
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
182
JGE/src/windows/JSfx.cpp
Normal 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);
|
||||
}
|
||||
}
|
||||
|
||||
17
appveyor.yml
17
appveyor.yml
@@ -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
|
||||
|
||||
3
platforms/android/configure.cmake
Normal file
3
platforms/android/configure.cmake
Normal 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")
|
||||
18
platforms/android/package/AndroidManifest.xml
Normal file
18
platforms/android/package/AndroidManifest.xml
Normal 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>
|
||||
121
platforms/android/package/CMakeLists.txt
Normal file
121
platforms/android/package/CMakeLists.txt
Normal 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)
|
||||
BIN
platforms/android/package/assets/_keystore/wagic-release.keystore
Executable file
BIN
platforms/android/package/assets/_keystore/wagic-release.keystore
Executable file
Binary file not shown.
BIN
platforms/android/package/res/drawable-hdpi/icon.png
Normal file
BIN
platforms/android/package/res/drawable-hdpi/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 8.5 KiB |
BIN
platforms/android/package/res/drawable-ldpi/icon.png
Normal file
BIN
platforms/android/package/res/drawable-ldpi/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.8 KiB |
BIN
platforms/android/package/res/drawable-mdpi/icon.png
Normal file
BIN
platforms/android/package/res/drawable-mdpi/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.4 KiB |
14
platforms/android/package/res/layout/main.xml
Normal file
14
platforms/android/package/res/layout/main.xml
Normal 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>
|
||||
|
||||
6
platforms/android/package/res/values/strings.xml
Normal file
6
platforms/android/package/res/values/strings.xml
Normal 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>
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
771
platforms/android/package/src/org/libsdl/app/SDLActivity.java
Normal file
771
platforms/android/package/src/org/libsdl/app/SDLActivity.java
Normal 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);
|
||||
|
||||
}
|
||||
|
||||
8
platforms/emscripten/configure.cmake
Normal file
8
platforms/emscripten/configure.cmake
Normal file
@@ -0,0 +1,8 @@
|
||||
set(CMAKE_CXX_FLAGS "-s USE_SDL=2 -s USE_ZLIB=1 -s FULL_ES2=1 -std=c++11 -s TOTAL_MEMORY=16777216 -O0 --preload-file ../../../projects/mtg/bin/Res@/")
|
||||
#set(CMAKE_CXX_FLAGS "-s USE_SDL=2 -s FULL_ES2=1 -std=c++11 -g4 -s ALLOW_MEMORY_GROWTH=1 --preload-file ../../../projects/mtg/bin/Res@/")
|
||||
set(CMAKE_EXECUTABLE_SUFFIX ".html")
|
||||
add_definitions(-DLINUX)
|
||||
add_definitions(-D_DEBUG)
|
||||
add_definitions(-DUSERDIR=".wagic")
|
||||
add_definitions(-DRESDIR="/")
|
||||
add_definitions(-DGL_ES_VERSION_2_0)
|
||||
5
platforms/macosx/configure.cmake
Normal file
5
platforms/macosx/configure.cmake
Normal file
@@ -0,0 +1,5 @@
|
||||
add_definitions(-DLINUX)
|
||||
add_definitions(-DUSERDIR=".wagic")
|
||||
add_definitions(-DRESDIR="Res")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++ -std=c++0x")
|
||||
set(CMAKE_PREFIX_PATH "/usr/local/opt/qt5")
|
||||
5
platforms/psp/configure.cmake
Normal file
5
platforms/psp/configure.cmake
Normal file
@@ -0,0 +1,5 @@
|
||||
add_definitions(-DPSP -G0)
|
||||
add_definitions(-D_PSP_FW_VERSION=371)
|
||||
add_definitions(-DDEVHOOK -DPSPFW3XX)
|
||||
|
||||
include_directories(${PSPSDK_PATH}/include)
|
||||
4
platforms/unix/configure.cmake
Normal file
4
platforms/unix/configure.cmake
Normal file
@@ -0,0 +1,4 @@
|
||||
add_definitions(-DLINUX)
|
||||
add_definitions(-DUSERDIR=".wagic")
|
||||
add_definitions(-DRESDIR="Res")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
|
||||
3
platforms/win/configure.cmake
Normal file
3
platforms/win/configure.cmake
Normal 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
233
projects/mtg/CMakeLists.txt
Normal 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()
|
||||
@@ -1,4 +1,4 @@
|
||||
name=Mode Blitzkrieg
|
||||
name=Blitzkrieg
|
||||
unlock=prx_geirkztilb
|
||||
[INIT]
|
||||
mode=mtg
|
||||
|
||||
@@ -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]
|
||||
@@ -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
|
||||
@@ -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)
|
||||
@@ -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
|
||||
@@ -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}
|
||||
@@ -1,9 +0,0 @@
|
||||
include mtg.txt
|
||||
name=Random 3 Colors
|
||||
unlock=prx_rnddeck
|
||||
[INIT]
|
||||
mode=random3
|
||||
|
||||
[PLAYERS]
|
||||
auto=shuffle
|
||||
auto=draw:7
|
||||
@@ -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}
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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]
|
||||
@@ -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]
|
||||
@@ -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
@@ -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]
|
||||
@@ -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]
|
||||
@@ -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]
|
||||
@@ -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
@@ -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]
|
||||
3210
projects/mtg/bin/Res/sets/PPR/_cards.dat
Normal file
3210
projects/mtg/bin/Res/sets/PPR/_cards.dat
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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
@@ -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]
|
||||
412
projects/mtg/bin/Res/sets/SVC/_cards.dat
Normal file
412
projects/mtg/bin/Res/sets/SVC/_cards.dat
Normal 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
@@ -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]
|
||||
@@ -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
@@ -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]
|
||||
@@ -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]
|
||||
@@ -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
Reference in New Issue
Block a user