diff --git a/JGE/src/SDLmain.cpp b/JGE/src/SDLmain.cpp index 063657644..c6d349708 100644 --- a/JGE/src/SDLmain.cpp +++ b/JGE/src/SDLmain.cpp @@ -53,6 +53,7 @@ JGameLauncher* g_launcher = NULL; #ifdef ANDROID JNIEnv * mJNIEnv = NULL; jclass * mJNIClass = NULL; +int SDL_ResumeSyncTime = 0; #endif class SdlApp; @@ -78,6 +79,7 @@ extern "C" void Java_org_libsdl_app_SDLActivity_nativeResume( { if (!g_engine) return; + SDL_ResumeSyncTime = 100000; g_engine->Resume(); } @@ -136,8 +138,16 @@ public: if(!g_engine->IsPaused()) OnEvent(&Event); } - if(!g_engine->IsPaused()) + if(!g_engine->IsPaused()){ + #ifdef ANDROID + // Fix for SDL crash on resuming Android app from background. + if(SDL_ResumeSyncTime){ + usleep(SDL_ResumeSyncTime); + SDL_ResumeSyncTime = 0; + } + #endif OnUpdate(); + } } } diff --git a/projects/mtg/Android/AndroidManifest.xml b/projects/mtg/Android/AndroidManifest.xml index 5a0404986..ca2a98ace 100644 --- a/projects/mtg/Android/AndroidManifest.xml +++ b/projects/mtg/Android/AndroidManifest.xml @@ -1,5 +1,5 @@ - + diff --git a/projects/mtg/Android/res/layout/main.xml b/projects/mtg/Android/res/layout/main.xml index 704434a18..fb4da7202 100644 --- a/projects/mtg/Android/res/layout/main.xml +++ b/projects/mtg/Android/res/layout/main.xml @@ -4,6 +4,7 @@ android:id="@+id/mainLayout" android:layout_width="fill_parent" android:layout_height="fill_parent" + android:keepScreenOn="true" > Wagic - 0.22.2 - Wagic v0.22.2\\nAll Rights Reserved. + 0.22.3 + All Rights Reserved. diff --git a/projects/mtg/Android/src/net/wagic/utils/ImgDownloader.java b/projects/mtg/Android/src/net/wagic/utils/ImgDownloader.java index 43886e7cf..93377cabb 100644 --- a/projects/mtg/Android/src/net/wagic/utils/ImgDownloader.java +++ b/projects/mtg/Android/src/net/wagic/utils/ImgDownloader.java @@ -1382,7 +1382,13 @@ public class ImgDownloader { cardurl = "https://img.scryfall.com/cards/large/front/1/d/1dee8c94-cdc8-42b2-a393-0c0c8e439125.jpg?1586453065"; else if(id.equals("484902t") || id.equals("484904t")) cardurl = "https://img.scryfall.com/cards/large/front/7/2/720f3e68-84c0-462e-a0d1-90236ccc494a.jpg?1562539782"; - + else if(id.equals("294690t")) + cardurl = "https://img.scryfall.com/cards/large/front/0/8/082c3bad-3fea-4c3f-8263-4b16139bb32a.jpg?1562701890"; + else if(id.equals("47963911t")) + cardurl = "https://img.scryfall.com/cards/large/front/f/9/f918b740-1984-4090-8886-9e290a698b95.jpg?1586451994"; + else if(id.equals("479634t")) + cardurl = "https://img.scryfall.com/cards/large/front/a/9/a9cc7c63-5d13-4fd6-af9d-4a26c2bab8e6.jpg?1588521003"; + return cardurl; } @@ -1824,7 +1830,7 @@ public class ImgDownloader { id.equals("470620") || id.equals("470754") || id.equals("470750") || id.equals("470739") || id.equals("470708") || id.equals("470581") || id.equals("470578") || id.equals("470571") || id.equals("470552") || id.equals("394490") || id.equals("114921") || id.equals("49775") || id.equals("473123") || id.equals("473160") || id.equals("16743") || id.equals("16741") || id.equals("294493") || id.equals("293253") || - id.equals("293198") || id.equals("479634") || id.equals("479702")) + id.equals("293198") || id.equals("479634") || id.equals("479702")) return false; return true; } @@ -2071,11 +2077,6 @@ public class ImgDownloader { ThumbY = 64; } - if(borderless){ - Border = (int)Math.round(ImgX*0.04); - BorderThumb = (int)Math.round(ThumbX*0.04); - } - File baseFolder = new File(basePath); File[] listOfFiles = baseFolder.listFiles(); Map mappa = new HashMap(); @@ -2132,6 +2133,29 @@ public class ImgDownloader { int lastIndex = lines.indexOf(findStr); String totals = lines.substring(lastIndex, lines.indexOf("\n", lastIndex)); totalcards = Integer.parseInt(totals.split("=")[1]); + + if(borderless){ + findStr = "year="; + lastIndex = lines.indexOf(findStr); + String date = lines.substring(lastIndex, lines.indexOf("\n", lastIndex)); + int year = Integer.parseInt(date.split("=")[1].split("-")[0]); + int month = 1; + int day = 1; + if(date.split("=")[1].split("-").length > 1) { + month = Integer.parseInt(date.split("=")[1].split("-")[1]); + if(date.split("=")[1].split("-").length > 2) { + day = Integer.parseInt(date.split("=")[1].split("-")[2]); + } + } + if(year > 2014 || (year == 2014 && month > 6) || (year == 2014 && month == 6 && day > 15)){ + Border = (int)Math.round(ImgX*0.02); + BorderThumb = (int)Math.round(ThumbX*0.02); + } else { + Border = (int)Math.round(ImgX*0.04); + BorderThumb = (int)Math.round(ThumbX*0.04); + } + } + while (lines.contains("[card]")) { findStr = "[card]"; lastIndex = lines.indexOf(findStr); @@ -2388,7 +2412,7 @@ public class ImgDownloader { || scryset.equals("PMPS08") || scryset.equals("PMPS09") || scryset.equals("PMPS10") || scryset.equals("PMPS11") || scryset.equals("GN2") || scryset.equals("PAL00") || scryset.equals("PAL01") || scryset.equals("PAL02") || scryset.equals("PAL03") || scryset.equals("PAL04") || scryset.equals("PAL05") || scryset.equals("PAL06") || scryset.equals("PAL99") || scryset.equals("PARL") || scryset.equals("HA1") - || scryset.equals("SLD") || scryset.equals("MB1") || scryset.equals("HA2")){ + || scryset.equals("SLD") || scryset.equals("MB1") || scryset.equals("HA2") || scryset.equals("HA3")){ try { doc = Jsoup.connect(imageurl + scryset.toLowerCase()).get(); Elements outlinks = doc.select("body a"); @@ -2577,7 +2601,7 @@ public class ImgDownloader { && !scryset.equals("PMPS08") && !scryset.equals("PMPS09") && !scryset.equals("PMPS10") && !scryset.equals("PMPS11") && !scryset.equals("GN2") && !scryset.equals("PAL00") && !scryset.equals("PAL01") && !scryset.equals("PAL02") && !scryset.equals("PAL03") && !scryset.equals("PAL04") && !scryset.equals("PAL05") && !scryset.equals("PAL06") && !scryset.equals("PAL99") && !scryset.equals("PARL") && !scryset.equals("HA1") - && !scryset.equals("SLD") && !scryset.equals("MB1") && !scryset.equals("HA2")){ + && !scryset.equals("SLD") && !scryset.equals("MB1") && !scryset.equals("HA2") && !scryset.equals("HA3")){ try { doc = Jsoup.connect(imageurl + scryset.toLowerCase()).get(); Elements outlinks = doc.select("body a"); @@ -2690,7 +2714,7 @@ public class ImgDownloader { && !scryset.equals("PMPS08") && !scryset.equals("PMPS09") && !scryset.equals("PMPS10") && !scryset.equals("PMPS11") && !scryset.equals("GN2") && !scryset.equals("PAL00") && !scryset.equals("PAL01") && !scryset.equals("PAL02") && !scryset.equals("PAL03") && !scryset.equals("PAL04") && !scryset.equals("PAL05") && !scryset.equals("PAL06") && !scryset.equals("PAL99") && !scryset.equals("PARL") && !scryset.equals("HA1") - && !scryset.equals("SLD") && !scryset.equals("MB1") && !scryset.equals("HA2")){ + && !scryset.equals("SLD") && !scryset.equals("MB1") && !scryset.equals("HA2") && !scryset.equals("HA3")){ try { doc = Jsoup.connect(imageurl + scryset.toLowerCase()).get(); } catch (Exception e) { @@ -2855,7 +2879,7 @@ public class ImgDownloader { || scryset.equals("PMPS09") || scryset.equals("PMPS10") || scryset.equals("PMPS11") || scryset.equals("GN2") || scryset.equals("PAL00") || scryset.equals("PAL01") || scryset.equals("PAL02") || scryset.equals("PAL03") || scryset.equals("PAL04") || scryset.equals("PAL05") || scryset.equals("PAL06") || scryset.equals("PAL99") || scryset.equals("PARL") || scryset.equals("HA1") || scryset.equals("SLD") - || scryset.equals("MB1") || scryset.equals("HA2")){ + || scryset.equals("MB1") || scryset.equals("HA2") || scryset.equals("HA3")){ Elements metadata = doc.select("head meta"); if(metadata != null) { for (int j = 0; j < metadata.size(); j++){ diff --git a/projects/mtg/Android/src/net/wagic/utils/StorageOptions.java b/projects/mtg/Android/src/net/wagic/utils/StorageOptions.java index 8ab6d2090..37b015cfc 100644 --- a/projects/mtg/Android/src/net/wagic/utils/StorageOptions.java +++ b/projects/mtg/Android/src/net/wagic/utils/StorageOptions.java @@ -23,7 +23,7 @@ public class StorageOptions public static int count = 0; public static String defaultMountPoint; - public static void determineStorageOptions() + public static void determineStorageOptions(android.content.Context mContext) { initializeMountPoints(); if (findForcemount()){ @@ -36,6 +36,16 @@ public class StorageOptions } compareMountsWithVold(); testAndCleanMountsList(); + File[] externalStorageVolumes = mContext.getExternalFilesDirs(""); + for(int i = 0; i < externalStorageVolumes.length; i++){ + mMounts.add(externalStorageVolumes[i].getAbsolutePath()); + } + for(int i = 0; i < mMounts.size(); i++){ + for(int j = 0; j < mMounts.size(); j++){ + if(i!=j && mMounts.get(i).startsWith(mMounts.get(j))) + mMounts.remove(i); + } + } setProperties(); } @@ -264,22 +274,22 @@ public class StorageOptions for (String path : mMounts) {//with forcemount menu if ("/mnt/sdcard".equalsIgnoreCase(path) || "/storage/sdcard0".equalsIgnoreCase(path)) - mLabels.add("Internal SD " + "[" + path + "]"); + mLabels.add("Internal SD " + "[" + path + "/]"); else if (path.contains("emulated")) - mLabels.add("Emulated SD " + " [" + path + "]"); + mLabels.add("Emulated SD " + " [" + path + "/]"); else - mLabels.add("External SD " + " [" + path + "]"); + mLabels.add("External SD " + " [" + path + "/]"); } } else { 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"); + // TODO: /mnt/sdcard and emulated are assumed to always mean internal storage. Use this comparison until there is a better way to do this + if ("/mnt/sdcard".equalsIgnoreCase(path) || path.contains("emulated")) + mLabels.add("Built-in Storage " + "[" + path + "/]"); else - mLabels.add("External SD Card " + i++); + mLabels.add("External SD Card " + "[" + path + "/]"); } } diff --git a/projects/mtg/Android/src/org/libsdl/app/SDLActivity.java b/projects/mtg/Android/src/org/libsdl/app/SDLActivity.java index 6fd67cf27..228b9fa1e 100644 --- a/projects/mtg/Android/src/org/libsdl/app/SDLActivity.java +++ b/projects/mtg/Android/src/org/libsdl/app/SDLActivity.java @@ -1,1541 +1,1907 @@ -package org.libsdl.app; - -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; -import java.util.Enumeration; - -import android.os.StrictMode; - -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.io.InputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.net.URL; -import java.net.URLConnection; -import java.util.ArrayList; - -import javax.microedition.khronos.egl.EGL10; -import javax.microedition.khronos.egl.EGLConfig; -import javax.microedition.khronos.egl.EGLContext; -import javax.microedition.khronos.egl.EGLDisplay; -import javax.microedition.khronos.egl.EGLSurface; - -import net.wagic.app.R; -import net.wagic.utils.StorageOptions; -import net.wagic.utils.DeckImporter; -import net.wagic.utils.ImgDownloader; -import android.app.Activity; -import android.app.AlertDialog; -import android.app.Dialog; -import android.app.ProgressDialog; -import android.content.Context; -import android.content.DialogInterface; -import android.content.SharedPreferences; -import android.content.pm.PackageManager.NameNotFoundException; -import android.content.res.Configuration; -import android.graphics.Canvas; -import android.graphics.PixelFormat; -import android.hardware.Sensor; -import android.hardware.SensorEvent; -import android.hardware.SensorEventListener; -import android.hardware.SensorManager; -import android.media.AudioFormat; -import android.media.AudioManager; -import android.media.AudioTrack; -import android.os.AsyncTask; -import android.os.Bundle; -import android.os.Environment; -import android.os.Handler; -import android.os.Message; -import android.util.Log; -import android.view.KeyEvent; -import android.view.Menu; -import android.view.MenuItem; -import android.view.MotionEvent; -import android.view.SubMenu; -import android.view.SurfaceHolder; -import android.view.SurfaceView; -import android.view.VelocityTracker; -import android.view.View; -import android.view.View.OnKeyListener; -import android.widget.FrameLayout; -import android.widget.FrameLayout.LayoutParams; - -/** - * SDL Activity - */ -public class SDLActivity extends Activity implements OnKeyListener { - private static final String TAG = SDLActivity.class.getCanonicalName(); - - //import deck globals - public ArrayList myresult = new ArrayList(); - public String myclickedItem = ""; - - // Main components - private static SDLActivity mSingleton; - private static SDLSurface mSurface; - - // Audio - private static Thread mAudioThread; - private static AudioTrack mAudioTrack; - - // Resource download - public static final int DIALOG_DOWNLOAD_PROGRESS = 0; - public static final int DIALOG_DOWNLOAD_ERROR = 1; - private ProgressDialog mProgressDialog; - private AlertDialog mErrorDialog; - public String mErrorMessage = ""; - public Boolean mErrorHappened = false; - public final static String RES_FOLDER = Environment.getExternalStorageDirectory().getPath() + "/Wagic/Res/"; - public static String RES_FILENAME = ""; - public static String databaseurl = "https://github.com/WagicProject/wagic/releases/download/wagic-v0.22.2/CardImageLinks.csv"; - - public String systemFolder = Environment.getExternalStorageDirectory().getPath() + "/Wagic/Res/"; - private String userFolder = Environment.getExternalStorageDirectory().getPath() + "/Wagic/User/"; - - // path to the onboard sd card that is not removable (typically /mnt/sdcard ) - private String internalPath = ""; - // path to removable sd card (on motorala devices /mnt/sdcard-ext, samsung devices: /mnt/sdcard/external_sd ) - private String sdcardPath = ""; - - // Android only supports internal memory and internal sdcard. removable media is not currently accessible via API - // using StorageOptions for now gives us a temporary interface to scan all available mounted drives. - private Context mContext; - - // Preferences - public static final String kWagicSharedPreferencesKey = "net.wagic.app.preferences.wagic"; - public static final String kStoreDataOnRemovableSdCardPreference = "StoreDataOnRemovableStorage"; - public static final String kSaveDataPathPreference = "StorageDataLocation"; - public static final String kWagicDataStorageOptionsKey = "dataStorageOptions"; - public static final int kStorageDataOptionsMenuId = 2000; - public static final int kOtherOptionsMenuId = 3000; - - // Accessors - public String getSystemStorageLocation() { - return systemFolder; - } - - public String getUserStorageLocation() { - return userFolder; - } - - // setters - public void updateStorageLocations() { - boolean usesInternalSdCard = (!getSharedPreferences(kWagicSharedPreferencesKey, MODE_PRIVATE).getBoolean(kStoreDataOnRemovableSdCardPreference, false)) && Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()); - - systemFolder = (usesInternalSdCard ? internalPath : sdcardPath) + "/Res/"; - userFolder = (usesInternalSdCard ? internalPath : sdcardPath) + "/User/"; - } - - /** - * checks to see if the device has a memory card to write to that is in a valid state. - * - * @return true if the device can write to the sdcard, false if not. - */ - public boolean checkStorageState() { - SharedPreferences settings = getSharedPreferences(kWagicSharedPreferencesKey, MODE_PRIVATE); - boolean mExternalStorageAvailable = false; - boolean mExternalStorageWriteable = false; - String state = Environment.getExternalStorageState(); - boolean useSdCard = (!settings.getBoolean(kStoreDataOnRemovableSdCardPreference, false)) && mExternalStorageWriteable; - String systemStoragePath = getSystemStorageLocation(); - - if (useSdCard && (systemStoragePath.indexOf(sdcardPath) != -1)) { - Log.i(TAG, "Data will be written to sdcard."); - return true; - } - - if (!useSdCard && (systemStoragePath.indexOf(internalPath) != -1)) { - Log.i(TAG, "Data will be written to internal storage."); - return true; - } - - if (Environment.MEDIA_MOUNTED.equals(state)) { - // We can read and write the media - mExternalStorageAvailable = mExternalStorageWriteable = true; - } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { - // We can only read the media - mExternalStorageAvailable = true; - mExternalStorageWriteable = false; - } else { - // Something else is wrong. It may be one of many other states, but all we need - // to know is we can neither read nor write - mExternalStorageAvailable = mExternalStorageWriteable = false; - } - - return (mExternalStorageAvailable && mExternalStorageWriteable); - } - - private boolean getRemovableMediaStorageState() { - for (String extMediaPath : StorageOptions.paths) { - File mediaPath = new File(extMediaPath); - if (mediaPath.canWrite()) - return true; - } - - return false; - } - - private void displayStorageOptions() { - AlertDialog.Builder setStorage = new AlertDialog.Builder(this); - setStorage.setTitle("Where would you like to store your data? On your removable SD Card or the built-in memory?"); - StorageOptions.determineStorageOptions(); - setStorage.setSingleChoiceItems(StorageOptions.labels, -1, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int item) { - savePathPreference(item); - } - }); - - setStorage.setPositiveButton("OK", new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - initStorage(); - if (mSurface == null) - mSingleton.initializeGame(); - } - }); - - setStorage.create().show(); - } - - private void importDeckOptions() { - AlertDialog.Builder importDeck = new AlertDialog.Builder(this); - importDeck.setTitle("Choose Deck to Import:"); - File root = new File(System.getenv("EXTERNAL_STORAGE") + "/Download"); - File[] files = root.listFiles(); - for (File f : files) { - if (!myresult.contains(f.toString()) && (f.toString().contains(".txt") || f.toString().contains(".dck") || f.toString().contains(".dec"))) - myresult.add(f.toString()); - } - - //get first item? - if (!myresult.isEmpty()) - myclickedItem = myresult.get(0).toString(); - - importDeck.setSingleChoiceItems(myresult.toArray(new String[myresult.size()]), 0, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int item) { - myclickedItem = myresult.get(item).toString(); - } - }); - - importDeck.setPositiveButton("Import Deck", new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - processSelectedDeck(myclickedItem); - if (mSurface == null) - mSingleton.initializeGame(); - } - }); - - importDeck.create().show(); - } - - private void processSelectedDeck(String mypath) { - AlertDialog.Builder infoDialog = new AlertDialog.Builder(this); - infoDialog.setTitle("Imported Deck:"); - String activePath = sdcardPath; - if (activePath == "") { - activePath = internalPath; - } - - File f = new File(mypath); - //Call the deck importer.... - String state = DeckImporter.importDeck(f, mypath, activePath); - infoDialog.setMessage(state); - infoDialog.show(); - } - - private void checkStorageLocationPreference() { - SharedPreferences settings = getSharedPreferences(kWagicSharedPreferencesKey, MODE_PRIVATE); - final SharedPreferences.Editor prefsEditor = settings.edit(); - boolean hasRemovableMediaMounted = getRemovableMediaStorageState(); - - if (!settings.contains(kStoreDataOnRemovableSdCardPreference)) { - if (hasRemovableMediaMounted) { - displayStorageOptions(); - } else { - prefsEditor.putBoolean(kStoreDataOnRemovableSdCardPreference, false); - prefsEditor.commit(); - initStorage(); - mSingleton.initializeGame(); - } - } else { - boolean storeOnRemovableMedia = settings.getBoolean(kStoreDataOnRemovableSdCardPreference, false); - if (storeOnRemovableMedia && !hasRemovableMediaMounted) { - AlertDialog setStorage = new AlertDialog.Builder(this).create(); - setStorage.setTitle("Storage Preference"); - setStorage.setMessage("Removable Sd Card not detected. Saving data to internal memory."); - - prefsEditor.putBoolean(kStoreDataOnRemovableSdCardPreference, false); - prefsEditor.commit(); - - initStorage(); - mSingleton.initializeGame(); - setStorage.show(); - } else { - initStorage(); - mSingleton.initializeGame(); - } - } - } - - private void initStorage() { - // check the state of the external storage to ensure we can even write to it. - // we are going to assume that if an external location exists, and can be written to, use it. - // Otherwise use internal storage - try { - // - // initialize where all the files are going to be stored. - // - File wagicMediaPath = null; - - // String packageName = mContext.getPackageName(); // possibly use this to differentiate between different mods of Wagic. - File externalFilesDir = Environment.getExternalStorageDirectory(); - if (externalFilesDir != null) { - internalPath = externalFilesDir.getAbsolutePath() + "/Wagic"; - } - - String state = Environment.getExternalStorageState(); - if (Environment.MEDIA_MOUNTED.equals(state)) { - wagicMediaPath = new File(internalPath); - if (wagicMediaPath.canWrite()) - wagicMediaPath.mkdirs(); - } - - // initialize the external mount - SharedPreferences settings = getSharedPreferences(kWagicSharedPreferencesKey, MODE_PRIVATE); - String selectedRemovableCardPath = settings.getString(kSaveDataPathPreference, internalPath); - if (selectedRemovableCardPath != null && !internalPath.equalsIgnoreCase(selectedRemovableCardPath)) { - wagicMediaPath = new File(selectedRemovableCardPath); - if (!wagicMediaPath.exists() || !wagicMediaPath.canWrite()) { - Log.e(TAG, "Error in initializing system folder: " + selectedRemovableCardPath); - } else { // found a removable media location - sdcardPath = selectedRemovableCardPath + "/Wagic"; - } - } - - updateStorageLocations(); - } catch (Exception ioex) { - Log.e(TAG, "An error occurred in setting up the storage locations."); - } - } - - private void savePathPreference(int selectedOption) { - SharedPreferences settings = getSharedPreferences(kWagicSharedPreferencesKey, MODE_PRIVATE); - String selectedMediaPath = StorageOptions.paths[selectedOption]; - final SharedPreferences.Editor prefsEditor = settings.edit(); - boolean saveToRemovableMedia = !"/mnt/sdcard".equalsIgnoreCase(selectedMediaPath); - - prefsEditor.putBoolean(kStoreDataOnRemovableSdCardPreference, saveToRemovableMedia); - prefsEditor.putString(kSaveDataPathPreference, selectedMediaPath); - prefsEditor.commit(); - - } - - private void startDownload() { - String url = getResourceUrl(); - if (!checkStorageState()) { - Log.e(TAG, "Error in initializing storage space."); - mSingleton.downloadError("Failed to initialize storage space for game. Please verify that your sdcard or internal memory is mounted properly."); - } - new DownloadFileAsync().execute(url); - } - - public void downloadError(String errorMessage) { - mErrorHappened = true; - mErrorMessage = errorMessage; - } - - private void buildStorageOptionsMenu(Menu menu) { - StorageOptions.determineStorageOptions(); - for (int idx = 0; idx < StorageOptions.count; idx++) { - menu.add(kStorageDataOptionsMenuId, kStorageDataOptionsMenuId + idx, idx, StorageOptions.labels[idx]); - } - } - - String set = ""; - String[] availableSets; - ArrayList selectedSets; - boolean[] checkedSet; - Integer totalset = 0; - boolean finished = false; - boolean loadResInProgress = false; - ProgressDialog progressBarDialogRes; - boolean fast = false; - - private void loadAvailableSets() { - final Handler mHandler = new Handler(); - progressBarDialogRes = new ProgressDialog(this); - progressBarDialogRes.setTitle("Loading all available sets..."); - progressBarDialogRes.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); - progressBarDialogRes.setProgress(0); - new Thread(new Runnable() { - public void run() { - ArrayList sets = new ArrayList(); - if (availableSets == null) { - loadResInProgress = true; - File baseFolder = new File(getSystemStorageLocation()); - File[] listOfFiles = baseFolder.listFiles(); - ZipFile zipFile = null; - try { - zipFile = new ZipFile(baseFolder + "/" + RES_FILENAME); - Enumeration e = zipFile.entries(); - while (e.hasMoreElements()) { - ZipEntry entry = e.nextElement(); - String entryName = entry.getName(); - if (entryName != null && entryName.contains("sets/")) { - if (!entryName.equalsIgnoreCase("sets/") && !entryName.contains("primitives") && !entryName.contains(".")) { - String[] names = entryName.split("/"); - sets.add(names[1]); - } - } - } - } catch (IOException ioe) { - System.out.println("Error opening zip file" + ioe); - } finally { - try { - if (zipFile != null) { - zipFile.close(); - } - } catch (IOException ioe) { - System.out.println("Error while closing zip file" + ioe); - } - } - - availableSets = new String[sets.size()]; - checkedSet = new boolean[sets.size()]; - progressBarDialogRes.setMax(sets.size()); - for (int i = 0; i < availableSets.length; i++) { - availableSets[i] = sets.get(i) + " - " + ImgDownloader.getSetInfo(sets.get(i), true, getSystemStorageLocation()); - checkedSet[i] = false; - progressBarDialogRes.incrementProgressBy((int) (1)); - } - } - finished = true; - loadResInProgress = false; - progressBarDialogRes.dismiss(); - mHandler.post(new Runnable() { - public void run() { - while (!finished) { - try { - Thread.sleep(1000); - } catch (Exception e) { - } - } - selectedSets = new ArrayList(); - showWarningFast(); - } - }); - } - }).start(); - - new Thread(new Runnable() { - public void run() { - fast = ImgDownloader.loadDatabase(getSystemStorageLocation(), databaseurl); - } - }).start(); - - progressBarDialogRes.show(); - } - - private void showWarningFast() { - AlertDialog.Builder infoDialog = new AlertDialog.Builder(this); - if(!fast) { - infoDialog.setTitle("Problem downloading the images database file"); - infoDialog.setMessage("The program will use the slow (not indexed) method, so the images download may take really long time..."); - - infoDialog.setNegativeButton("Retry", new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - fast = ImgDownloader.loadDatabase(getSystemStorageLocation(), databaseurl); - showWarningFast(); - } - }); - } - else { - infoDialog.setTitle("Images Database correctly downloaded"); - infoDialog.setMessage("The program will use the fast (indexed) method, so the images download will not take long time!"); - } - - infoDialog.setPositiveButton("Continue", new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - downloadCardImages(); - } - }); - - infoDialog.create().show(); - } - - private void downloadCardImages() { - AlertDialog.Builder cardDownloader = new AlertDialog.Builder(this); - cardDownloader.setTitle("Which Sets would you like to download?"); - - cardDownloader.setMultiChoiceItems(availableSets, checkedSet, new DialogInterface.OnMultiChoiceClickListener() { - public void onClick(DialogInterface dialog, int which, boolean isChecked) { - checkedSet[which] = isChecked; - if (checkedSet[which]) - selectedSets.add(availableSets[which].split(" - ")[0]); - else - selectedSets.remove(availableSets[which].split(" - ")[0]); - } - }); - - cardDownloader.setNeutralButton("Download All", new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - selectedSets.clear(); - for (int i = 0; i < availableSets.length; i++) { - selectedSets.add(availableSets[i].split(" - ")[0]); - } - chooseResolution(); - } - }); - - cardDownloader.setPositiveButton("Download Selected", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - } - }); - - final AlertDialog dialog = cardDownloader.create(); - dialog.show(); - - dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (selectedSets.size() > 0) { - chooseResolution(); - dialog.dismiss(); - } - } - }); - } - - String targetRes = "High"; - - private void chooseResolution() { - AlertDialog.Builder resChooser = new AlertDialog.Builder(this); - - resChooser.setTitle("Which resolution would you like to use?"); - final String[] availableRes = new String[]{"High - (672x936)", "High - (672x936) - Borderless", "Medium - (488x680)", "Medium - (488x680) - Borderless", - "Low - (244x340)", "Low - (244x340) - Borderless", "Tiny - (180x255)", "Tiny - (180x255) - Borderless"}; - - resChooser.setSingleChoiceItems(availableRes, 0, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int item) { - targetRes = availableRes[item].split(" - ")[0]; - borderless = (availableRes[item].split(" - ").length > 2); - } - }); - - resChooser.setPositiveButton("Start Download", new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - skipDownloadedSets(); - } - }); - - resChooser.setNegativeButton("Change Selection", new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - downloadCardImages(); - } - }); - - resChooser.create().show(); - } - - private void skipDownloadedSets() { - AlertDialog.Builder skipChooser = new AlertDialog.Builder(this); - - skipChooser.setTitle("Do you want to overwrite existing sets?"); - - skipChooser.setPositiveButton("Yes", new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - skipDownloaded = false; - downloadCardImagesStart(); - } - }); - - skipChooser.setNegativeButton("No", new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - skipDownloaded = true; - downloadCardImagesStart(); - } - }); - - skipChooser.create().show(); - } - - boolean error = false; - boolean skipDownloaded = false; - boolean borderless = false; - String res = ""; - public volatile boolean downloadInProgress = false; - public volatile boolean paused = false; - ProgressDialog cardDownloader; - volatile int currentIndex = 0; - private void downloadCardImagesStart() { - final SDLActivity parent = this; - final Handler mHandler = new Handler(); - cardDownloader = new ProgressDialog(this); - cardDownloader.setTitle("Downloading now set: " + set); - cardDownloader.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); - cardDownloader.setProgress(0); - if (selectedSets.size() == 1) - cardDownloader.setMessage("You choose to download just 1 set: Please don't quit Wagic or turn off Internet connection, you can hide this window and continue to play, a pop-up will notify the completion of download process."); - else - cardDownloader.setMessage("You choose to download " + selectedSets.size() + " sets: Please don't quit Wagic or turn off Internet connection, you can hide this window and continue to play, a pop-up will notify the completion of download process."); - - new Thread(new Runnable() { - public void run() { - downloadInProgress = true; - paused = false; - if (selectedSets != null) { - for (currentIndex = 0; currentIndex < selectedSets.size() && downloadInProgress; currentIndex++) { - while (paused) { - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - } - if (!downloadInProgress) - break; - } - try { - set = selectedSets.get(currentIndex); - mHandler.post(new Runnable() { - public void run() { - cardDownloader.setTitle("Downloading set: " + set + " (" + (currentIndex + 1) + " of " + selectedSets.size() + ")"); - } - }); - String details = ImgDownloader.DownloadCardImages(set, availableSets, targetRes, getSystemStorageLocation(), getUserStorageLocation() + "sets/", cardDownloader, parent, skipDownloaded, borderless); - if (!details.isEmpty()) { - if (!res.isEmpty()) - res = res + "\nSET " + set + ":\n" + details; - else - res = "SET " + set + ":\n" + details; - } - } catch (Exception e) { - res = res + "\n" + e.getMessage(); - error = true; - } - } - mHandler.post(new Runnable() { - public void run() { - if (downloadInProgress) { - downloadSelectedSetsCompleted(error, res); - downloadInProgress = false; - paused = false; - } - cardDownloader.dismiss(); - } - }); - } - } - }).start(); - - cardDownloader.setButton(DialogInterface.BUTTON_POSITIVE, "Hide", new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - cardDownloader.hide(); - } - }); - - cardDownloader.setButton(DialogInterface.BUTTON_NEGATIVE, "Stop", new DialogInterface.OnClickListener() { - public void onClick(final DialogInterface dialog, int which) { - mHandler.post(new Runnable() { - public void run() { - downloadCardInterruped(set, cardDownloader.getProgress(), cardDownloader.getMax()); - downloadInProgress = false; - paused = false; - AlertDialog d = (AlertDialog) dialog; - d.getButton(AlertDialog.BUTTON_NEUTRAL).setText("Pause"); - cardDownloader.setTitle("Downloading now set: " + set + " - Interrupted"); - cardDownloader.dismiss(); - } - }); - } - }); - - cardDownloader.setButton(DialogInterface.BUTTON_NEUTRAL, "Pause", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - } - }); - - final AlertDialog dialog = (AlertDialog) cardDownloader; - cardDownloader.show(); - - dialog.getButton(AlertDialog.BUTTON_NEUTRAL).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (!paused) { - paused = true; - AlertDialog d = (AlertDialog) dialog; - d.getButton(AlertDialog.BUTTON_NEUTRAL).setText("Resume"); - cardDownloader.setTitle("Downloading now set: " + set + " - Paused"); - } else { - paused = false; - AlertDialog d = (AlertDialog) dialog; - d.getButton(AlertDialog.BUTTON_NEUTRAL).setText("Pause"); - cardDownloader.setTitle("Downloading now set: " + set); - } - } - }); - } - - private void downloadCardInterruped(String set, int cardsDownloaded, int total) { - AlertDialog.Builder infoDialog = new AlertDialog.Builder(this); - infoDialog.setTitle("Download of " + set + " has been interrupted!"); - infoDialog.setMessage("WARNING: Only " + cardsDownloaded + " of " + total + " total cards have been downloaded and zip archive (" + set + ".zip) has not been created. You have to start the download again in order to complete the entire set."); - - infoDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - downloadCardImages(); - } - }); - - res = ""; - set = ""; - targetRes = "High"; - skipDownloaded = false; - borderless = false; - currentIndex = 0; - selectedSets = new ArrayList(); - for (int i = 0; i < checkedSet.length; i++) { - checkedSet[i] = false; - } - error = false; - - infoDialog.create().show(); - } - - private void downloadSelectedSetsCompleted(boolean error, String res) { - AlertDialog.Builder infoDialog = new AlertDialog.Builder(this); - if (!error) { - infoDialog.setTitle("The download process has completed without any error"); - if (!res.isEmpty()) - infoDialog.setMessage("Following cards could not be downloaded:\n" + res); - } else { - infoDialog.setTitle("Some errors occurred during the process!"); - infoDialog.setMessage(res); - } - - res = ""; - set = ""; - targetRes = "High"; - skipDownloaded = false; - borderless = false; - currentIndex = 0; - selectedSets = new ArrayList(); - for (int i = 0; i < checkedSet.length; i++) { - checkedSet[i] = false; - } - error = false; - - infoDialog.create().show(); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - SubMenu settingsMenu = menu.addSubMenu(Menu.NONE, 1, 1, "Settings"); - menu.add(Menu.NONE, 2, 2, "Import Decks"); - menu.add(Menu.NONE, 3, 3, "Download Cards"); - menu.add(Menu.NONE, 4, 4, "About"); - settingsMenu.add(kStorageDataOptionsMenuId, kStorageDataOptionsMenuId, Menu.NONE, "Storage Data Options"); - // buildStorageOptionsMenu(settingsMenu); - return true; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - // Handle item selection - int itemId = item.getItemId(); - if (itemId == kStorageDataOptionsMenuId) { - displayStorageOptions(); - } else if (itemId == 2) { - importDeckOptions(); - } else if (itemId == 3) { - if (availableSets == null) - loadAvailableSets(); - else { - if (loadResInProgress) { - progressBarDialogRes.show(); - progressBarDialogRes.show(); - } else if (downloadInProgress) { - cardDownloader.show(); - cardDownloader.show(); - } else - downloadCardImages(); - } - } else if (itemId == 4) { - // display some info about the app - AlertDialog.Builder infoDialog = new AlertDialog.Builder(this); - infoDialog.setTitle("Wagic Info"); - infoDialog.setMessage("Version " + getResources().getString(R.string.app_version)); - infoDialog.show(); - - } else - return super.onOptionsItemSelected(item); - return true; - } - - @Override - protected Dialog onCreateDialog(int id) { - switch (id) { - case DIALOG_DOWNLOAD_PROGRESS: - mProgressDialog = new ProgressDialog(this); - mProgressDialog.setMessage("Downloading resource files (" + RES_FILENAME + ")"); - mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); - mProgressDialog.setCancelable(false); - mProgressDialog.show(); - return mProgressDialog; - case DIALOG_DOWNLOAD_ERROR: - // prepare alertDialog - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setMessage(mErrorMessage).setCancelable(false).setPositiveButton("Exit", new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - System.exit(0); - } - }); - mErrorDialog = builder.create(); - mErrorDialog.show(); - return mErrorDialog; - default: - return null; - } - } - - // Load the .so - static { - System.loadLibrary("SDL"); - // System.loadLibrary("SDL_image"); - // System.loadLibrary("SDL_mixer"); - // System.loadLibrary("SDL_ttf"); - System.loadLibrary("main"); - } - - // create main application - public void mainDisplay() { - FrameLayout _videoLayout = new FrameLayout(this); - - // mGLView = new DemoGLSurfaceView(this); - - // Set up the surface - mSurface = new SDLSurface(getApplication()); - - // setContentView(mSurface); - SurfaceHolder holder = mSurface.getHolder(); - holder.setType(SurfaceHolder.SURFACE_TYPE_GPU); - - _videoLayout.addView(mSurface, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); - // mGLView.setFocusableInTouchMode(true); - // mGLView.setFocusable(true); - // adView.requestFreshAd(); - setContentView(_videoLayout, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); - mSurface.requestFocus(); - } - - // Setup - @Override - protected void onCreate(Bundle savedInstanceState) { - //Log.d(TAG, "onCreate()"); - super.onCreate(savedInstanceState); - StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); - StrictMode.setThreadPolicy(policy); - // So we can call stuff from static callbacks - mSingleton = this; - mContext = this.getApplicationContext(); - RES_FILENAME = getResourceName(); - StorageOptions.determineStorageOptions(); - checkStorageLocationPreference(); - } - - public void initializeGame() { - String coreFileLocation = getSystemStorageLocation() + RES_FILENAME; - - File file = new File(coreFileLocation); - - if (file.exists()) { - mainDisplay(); - } else { - FrameLayout _videoLayout = new FrameLayout(this); - setContentView(_videoLayout, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); - startDownload(); - } - } - - // Events - @Override - protected void onPause() { - // Log.d(TAG, "onPause()"); - super.onPause(); - SDLActivity.nativePause(); - } - - @Override - protected void onResume() { - // Log.d(TAG, "onResume()"); - super.onResume(); - SDLActivity.nativeResume(); - } - - @Override - public void onDestroy() { - // Log.d(TAG, "onDestroy()"); - super.onDestroy(); - mSurface.onDestroy(); - } - - // Handler for Messages coming from JGE - // Suggested syntax for JGE messages is a string separated by the ":" symbol - protected void processJGEMsg(String command) { - if (null == command) { - return; - } - } - - // Messages from the SDLMain thread - static int COMMAND_CHANGE_TITLE = 1; - static int COMMAND_JGE_MSG = 2; - - // Handler for the messages - Handler commandHandler = new Handler() { - public void handleMessage(Message msg) { - if (msg.arg1 == COMMAND_CHANGE_TITLE) { - setTitle((String) msg.obj); - } else if (msg.arg1 == COMMAND_JGE_MSG) { - processJGEMsg((String) msg.obj); - } - } - }; - - // Send a message from the SDLMain thread - void sendCommand(int command, Object data) { - Message msg = commandHandler.obtainMessage(); - msg.arg1 = command; - msg.obj = data; - commandHandler.sendMessage(msg); - } - - // C functions we call - public static native String getResourceUrl(); - - public static native String getResourceName(); - - public static native void nativeInit(); - - 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 onNativeTouch(int index, int action, float x, float y, float p); - - public static native void onNativeFlickGesture(float xVelocity, float yVelocity); - - public static native void onNativeAccel(float x, float y, float z); - - public static native void nativeRunAudioThread(); - - // Java functions called from C - // Receive a message from the SDLMain thread - public static String getSystemFolderPath() { - return mSingleton.getSystemStorageLocation(); - } - - public static String getUserFolderPath() { - return mSingleton.getUserStorageLocation(); - } - - public static void jgeSendCommand(String command) { - mSingleton.sendCommand(COMMAND_JGE_MSG, command); - } - - public static boolean createGLContext(int majorVersion, int minorVersion) { - return mSurface.initEGL(majorVersion, minorVersion); - } - - public static void flipBuffers() { - mSurface.flipEGL(); - } - - public static void setActivityTitle(String title) { - // Called from SDLMain() thread and can't directly affect the view - mSingleton.sendCommand(COMMAND_CHANGE_TITLE, title); - } - - // Audio - private static Object buf; - - public static Object 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.d(TAG, "SDL audio: wanted " + (isStereo ? "stereo" : "mono") + " " + (is16Bit ? "16-bit" : "8-bit") + " " + ((float)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); - - mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, channelConfig, audioFormat, desiredFrames * frameSize, AudioTrack.MODE_STREAM); - - audioStartThread(); - - // Log.d(TAG, "SDL audio: got " + ((mAudioTrack.getChannelCount() >= 2) ? "stereo" : "mono") + " " + ((mAudioTrack.getAudioFormat() == AudioFormat.ENCODING_PCM_16BIT) ? "16-bit" : "8-bit") + " " + ((float)mAudioTrack.getSampleRate() / 1000f) + - // "kHz, " + desiredFrames + " frames buffer"); - - if (is16Bit) { - buf = new short[desiredFrames * (isStereo ? 2 : 1)]; - } else { - buf = new byte[desiredFrames * (isStereo ? 2 : 1)]; - } - return buf; - } - - public static void audioStartThread() { - mAudioThread = new Thread(new Runnable() { - public void run() { - mAudioTrack.play(); - nativeRunAudioThread(); - } - }); - - // I'd take REALTIME if I could get it! - mAudioThread.setPriority(Thread.MAX_PRIORITY); - mAudioThread.start(); - } - - 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(TAG, "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(TAG, "SDL audio: error return from write(short)"); - return; - } - } - } - - public static void audioQuit() { - if (mAudioThread != null) { - try { - mAudioThread.join(); - } catch (Exception e) { - Log.e(TAG, "Problem stopping audio thread: " + e); - } - mAudioThread = null; - - // Log.d(TAG, "Finished waiting for audio thread"); - } - - if (mAudioTrack != null) { - mAudioTrack.stop(); - mAudioTrack = null; - } - } - - class DownloadFileAsync extends AsyncTask { - private final String TAG = DownloadFileAsync.class.getCanonicalName(); - - @Override - protected void onPreExecute() { - super.onPreExecute(); - showDialog(DIALOG_DOWNLOAD_PROGRESS); - } - - @Override - protected Long doInBackground(String... aurl) { - int count; - long totalBytes = 0; - OutputStream output = null; - InputStream input = null; - - try { - // - // Prepare the sdcard folders in order to download the resource file - // - - String storageLocation = mSingleton.getSystemStorageLocation(); - - File resDirectory = new File(storageLocation); - File userDirectory = new File(mSingleton.getUserStorageLocation()); - - if (!resDirectory.exists() && !resDirectory.mkdirs() || (!userDirectory.exists() && !userDirectory.mkdirs())) { - throw new Exception("Failed to initialize system and user directories."); - } - - URL url = new URL(aurl[0]); - String filename = url.getPath().substring(url.getPath().lastIndexOf('/') + 1); - URLConnection conexion = url.openConnection(); - conexion.connect(); - - int lengthOfFile = conexion.getContentLength(); - // Log.d(TAG, " Length of file: " + lengthOfFile); - - input = new BufferedInputStream(url.openStream()); - // create a File object for the output file - File outputFile = new File(resDirectory, filename); - - output = new FileOutputStream(outputFile); - - byte data[] = new byte[1024]; - while ((count = input.read(data)) != -1) { - totalBytes += count; - publishProgress((int) ((totalBytes * 100) / lengthOfFile)); - output.write(data, 0, count); - } - - output.flush(); - output.close(); - input.close(); - } catch (Exception e) { - String errorMessage = "An error happened while downloading the resources. It could be that our server is temporarily down, that your device is not connected to a network, or that we cannot write to " + mSingleton.getSystemStorageLocation() + ". Please check your phone settings and try again. For more help please go to http://wololo.net/forum/"; - mSingleton.downloadError(errorMessage); - Log.e(TAG, errorMessage); - Log.e(TAG, e.getMessage()); - } - - return Long.valueOf(totalBytes); - } - - protected void onProgressUpdate(Integer... progress) { - if (progress[0] != mProgressDialog.getProgress()) { - // Log.d(TAG, "current progress : " + progress[0]); - mProgressDialog.setProgress(progress[0]); - } - } - - @Override - protected void onPostExecute(Long unused) { - if (mErrorHappened) { - dismissDialog(DIALOG_DOWNLOAD_PROGRESS); - showDialog(DIALOG_DOWNLOAD_ERROR); - return; - } - // rename the temporary file into the final filename - String storageLocation = getSystemStorageLocation(); - - File preFile = new File(storageLocation + RES_FILENAME + ".tmp"); - File postFile = new File(storageLocation + RES_FILENAME); - - if (preFile.exists()) - preFile.renameTo(postFile); - - dismissDialog(DIALOG_DOWNLOAD_PROGRESS); - // Start game; - mSingleton.mainDisplay(); - } - } - - public boolean onKey(View v, int keyCode, KeyEvent event) { - if ((keyCode == KeyEvent.KEYCODE_MENU) && (KeyEvent.ACTION_DOWN == event.getAction())) { - super.onKeyDown(keyCode, event); - return true; - } else if ((keyCode == KeyEvent.KEYCODE_MENU) && (KeyEvent.ACTION_UP == event.getAction())) { - super.onKeyUp(keyCode, event); - return true; - } - - return false; - } - - private String getApplicationCode() { - int v = 0; - try { - v = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode; - } catch (NameNotFoundException e) { - // Huh? Really? - v = 184; // shouldn't really happen but we need to default to something - } - return "0" + v; - } - - // Empty onConfigurationChanged to stop the Activity from destroying/recreating on screen off - @Override - public void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - } -} - -/** - * 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 { - private static final String TAG = SDLSurface.class.getCanonicalName(); - - // This is what SDL runs in. It invokes SDL_main(), eventually - private Thread mSDLThread; - - // EGL private objects - private EGLContext mEGLContext; - private EGLSurface mEGLSurface; - private EGLDisplay mEGLDisplay; - private EGLConfig mEGLConfig; - - // Sensors - private static SensorManager mSensorManager; - - private static VelocityTracker mVelocityTracker; - - final private Object mSemSurface; - private Boolean mSurfaceValid; - - void startSDLThread() { - if (mSDLThread == null) { - mSDLThread = new Thread(new SDLMain(), "SDLThread"); - mSDLThread.start(); - } - } - - /** - * Simple nativeInit() runnable - */ - class SDLMain implements Runnable { - public void run() { - // Runs SDL_main() - SDLActivity.nativeInit(); - - SDLActivity.nativeQuit(); - - Log.d(TAG, "SDL thread terminated"); - - // On exit, tear everything down for a fresh restart next time. - System.exit(0); - } - } - - // Startup - public SDLSurface(Context context) { - super(context); - mSemSurface = new Object(); - mSurfaceValid = false; - getHolder().addCallback(this); - - setFocusable(true); - setFocusableInTouchMode(true); - requestFocus(); - setOnKeyListener(this); - setOnTouchListener(this); - - mSensorManager = (SensorManager) context.getSystemService("sensor"); - } - - // Called when we have a valid drawing surface - public void surfaceCreated(SurfaceHolder holder) { - //Log.d(TAG, "surfaceCreated()"); - - enableSensor(Sensor.TYPE_ACCELEROMETER, true); - } - - public void onDestroy() { - // Send a quit message to the application - // should that be in SDLActivity "onDestroy" instead ? - - SDLActivity.nativeQuit(); - - // Now wait for the SDL thread to quit - if (mSDLThread != null) { - try { - mSDLThread.join(); - } catch (Exception e) { - Log.e(TAG, "Problem stopping thread: " + e); - } - mSDLThread = null; - - // Log.d(TAG, "Finished waiting for SDL thread"); - } - } - - // Called when we lose the surface - public void surfaceDestroyed(SurfaceHolder holder) { - Log.d(TAG, "surfaceDestroyed()"); - synchronized (mSemSurface) { - mSurfaceValid = false; - mSemSurface.notifyAll(); - } - enableSensor(Sensor.TYPE_ACCELEROMETER, false); - } - - // Called when the surface is resized - public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { - Log.d(TAG, "surfaceChanged()"); - - int sdlFormat = 0x85151002; // SDL_PIXELFORMAT_RGB565 by default - switch (format) { - case PixelFormat.A_8: - Log.d("TAG", "pixel format A_8"); - break; - case PixelFormat.LA_88: - Log.d("TAG", "pixel format LA_88"); - break; - case PixelFormat.L_8: - Log.d("TAG", "pixel format L_8"); - break; - case PixelFormat.RGBA_4444: - Log.d("TAG", "pixel format RGBA_4444"); - sdlFormat = 0x85421002; // SDL_PIXELFORMAT_RGBA4444 - break; - case PixelFormat.RGBA_5551: - Log.d(TAG, "pixel format RGBA_5551"); - sdlFormat = 0x85441002; // SDL_PIXELFORMAT_RGBA5551 - break; - case PixelFormat.RGBA_8888: - Log.d(TAG, "pixel format RGBA_8888"); - sdlFormat = 0x86462004; // SDL_PIXELFORMAT_RGBA8888 - break; - case PixelFormat.RGBX_8888: - Log.d(TAG, "pixel format RGBX_8888"); - sdlFormat = 0x86262004; // SDL_PIXELFORMAT_RGBX8888 - break; - case PixelFormat.RGB_332: - Log.d(TAG, "pixel format RGB_332"); - sdlFormat = 0x84110801; // SDL_PIXELFORMAT_RGB332 - break; - case PixelFormat.RGB_565: - Log.d(TAG, "pixel format RGB_565"); - sdlFormat = 0x85151002; // SDL_PIXELFORMAT_RGB565 - break; - case PixelFormat.RGB_888: - Log.d(TAG, "pixel format RGB_888"); - // Not sure this is right, maybe SDL_PIXELFORMAT_RGB24 instead? - sdlFormat = 0x86161804; // SDL_PIXELFORMAT_RGB888 - break; - default: - Log.d(TAG, "pixel format unknown " + format); - break; - } - SDLActivity.onNativeResize(width, height, sdlFormat); - - // Now start up the C app thread - startSDLThread(); - } - - // unused - public void onDraw(Canvas canvas) { - } - - // EGL functions - public boolean initEGL(int majorVersion, int minorVersion) { - Log.d(TAG, "Starting up OpenGL ES " + majorVersion + "." + minorVersion); - - try { - EGL10 egl = (EGL10) EGLContext.getEGL(); - - EGLDisplay dpy = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); - - int[] version = new int[2]; - egl.eglInitialize(dpy, version); - - int EGL_OPENGL_ES_BIT = 1; - int EGL_OPENGL_ES2_BIT = 4; - int renderableType = 0; - if (majorVersion == 2) { - renderableType = EGL_OPENGL_ES2_BIT; - } else if (majorVersion == 1) { - renderableType = EGL_OPENGL_ES_BIT; - } - int[] configSpec = - { - // EGL10.EGL_DEPTH_SIZE, 16, - EGL10.EGL_RENDERABLE_TYPE, renderableType, EGL10.EGL_NONE}; - EGLConfig[] configs = new EGLConfig[1]; - int[] num_config = new int[1]; - if (!egl.eglChooseConfig(dpy, configSpec, configs, 1, num_config) || num_config[0] == 0) { - Log.e(TAG, "No EGL config available"); - return false; - } - mEGLConfig = configs[0]; - - EGLContext ctx = egl.eglCreateContext(dpy, mEGLConfig, EGL10.EGL_NO_CONTEXT, null); - if (ctx == EGL10.EGL_NO_CONTEXT) { - Log.e(TAG, "Couldn't create context"); - return false; - } - - mEGLContext = ctx; - mEGLDisplay = dpy; - - if (!createSurface(this.getHolder())) { - return false; - } - - } catch (Exception e) { - Log.e(TAG, e + ""); - for (StackTraceElement s : e.getStackTrace()) { - Log.e(TAG, s.toString()); - } - } - - return true; - } - - public Boolean createSurface(SurfaceHolder holder) { - /* - * The window size has changed, so we need to create a new surface. - */ - EGL10 egl = (EGL10) EGLContext.getEGL(); - if (mEGLSurface != null) { - /* - * Unbind and destroy the old EGL surface, if there is one. - */ - egl.eglMakeCurrent(mEGLDisplay, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT); - egl.eglDestroySurface(mEGLDisplay, mEGLSurface); - } - - /* - * Create an EGL surface we can render into. - */ - mEGLSurface = egl.eglCreateWindowSurface(mEGLDisplay, mEGLConfig, holder, null); - if (mEGLSurface == EGL10.EGL_NO_SURFACE) { - Log.e(TAG, "Couldn't create surface"); - return false; - } - - /* - * Before we can issue GL commands, we need to make sure the context is current and bound to a surface. - */ - if (!egl.eglMakeCurrent(mEGLDisplay, mEGLSurface, mEGLSurface, mEGLContext)) { - Log.e(TAG, "Couldn't make context current"); - return false; - } - - mSurfaceValid = true; - - return true; - } - - // EGL buffer flip - public void flipEGL() { - if (!mSurfaceValid) { - createSurface(this.getHolder()); - } - - try { - EGL10 egl = (EGL10) EGLContext.getEGL(); - - egl.eglWaitNative(EGL10.EGL_CORE_NATIVE_ENGINE, null); - - // drawing here - - egl.eglWaitGL(); - - egl.eglSwapBuffers(mEGLDisplay, mEGLSurface); - - } catch (Exception e) { - Log.e(TAG, "flipEGL(): " + e); - for (StackTraceElement s : e.getStackTrace()) { - Log.e(TAG, s.toString()); - } - } - } - - // Key events - public boolean onKey(View v, int keyCode, KeyEvent event) { - if (keyCode == KeyEvent.KEYCODE_MENU) - return false; - - if (keyCode == KeyEvent.KEYCODE_VOLUME_UP || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) - return false; - - if (event.getAction() == KeyEvent.ACTION_DOWN) { - // Log.d(TAG, "key down: " + keyCode); - SDLActivity.onNativeKeyDown(keyCode); - return true; - } else if (event.getAction() == KeyEvent.ACTION_UP) { - // Log.d(TAG, "key up: " + keyCode); - SDLActivity.onNativeKeyUp(keyCode); - return true; - } - - return false; - } - - // Touch events - public boolean onTouch(View v, MotionEvent event) { - for (int index = 0; index < event.getPointerCount(); ++index) { - int action = event.getActionMasked(); - float x = event.getX(index); - float y = event.getY(index); - float p = event.getPressure(index); - - // TODO: Anything else we need to pass? - SDLActivity.onNativeTouch(index, action, x, y, p); - } - - // account for 'flick' type gestures by monitoring velocity - if (event.getActionIndex() == 0) { - if (event.getAction() == MotionEvent.ACTION_DOWN) { - mVelocityTracker = VelocityTracker.obtain(); - mVelocityTracker.clear(); - mVelocityTracker.addMovement(event); - } else if (event.getAction() == MotionEvent.ACTION_MOVE) { - mVelocityTracker.addMovement(event); - } else if (event.getAction() == MotionEvent.ACTION_UP) { - mVelocityTracker.addMovement(event); - - // calc velocity - mVelocityTracker.computeCurrentVelocity(1000); - float xVelocity = mVelocityTracker.getXVelocity(0); - float yVelocity = mVelocityTracker.getYVelocity(0); - if (Math.abs(xVelocity) > 300 || Math.abs(yVelocity) > 300) - SDLActivity.onNativeFlickGesture(xVelocity, yVelocity); - - mVelocityTracker.recycle(); - } - } - - 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)); - } - } - - public void onAccuracyChanged(Sensor sensor, int accuracy) { - // TODO - } - - public void onSensorChanged(SensorEvent event) { - if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { - SDLActivity.onNativeAccel(event.values[0], event.values[1], event.values[2]); - } - } -} - +package org.libsdl.app; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.ProgressDialog; + +import android.content.Context; +import android.content.DialogInterface; +import android.content.SharedPreferences; + +import android.content.pm.PackageManager.NameNotFoundException; + +import android.content.res.Configuration; + +import android.graphics.Canvas; +import android.graphics.PixelFormat; + +import android.hardware.Sensor; +import android.hardware.SensorEvent; +import android.hardware.SensorEventListener; +import android.hardware.SensorManager; + +import android.media.AudioFormat; +import android.media.AudioManager; +import android.media.AudioTrack; + +import android.os.AsyncTask; +import android.os.Bundle; +import android.os.Environment; +import android.os.Handler; +import android.os.Message; +import android.os.StrictMode; + +import android.util.Log; + +import android.view.KeyEvent; +import android.view.Menu; +import android.view.MenuItem; +import android.view.MotionEvent; +import android.view.SubMenu; +import android.view.SurfaceHolder; +import android.view.SurfaceView; +import android.view.VelocityTracker; +import android.view.View; + +import android.view.View.OnKeyListener; + +import android.view.WindowManager; + +import android.widget.FrameLayout; + +import android.widget.FrameLayout.LayoutParams; + +import android.widget.PopupMenu; + +import net.wagic.app.R; + +import net.wagic.utils.DeckImporter; +import net.wagic.utils.ImgDownloader; +import net.wagic.utils.StorageOptions; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import java.net.URL; +import java.net.URLConnection; + +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +import javax.microedition.khronos.egl.EGL10; +import javax.microedition.khronos.egl.EGLConfig; +import javax.microedition.khronos.egl.EGLContext; +import javax.microedition.khronos.egl.EGLDisplay; +import javax.microedition.khronos.egl.EGLSurface; + + +/** + * SDL Activity + */ +public class SDLActivity extends Activity implements OnKeyListener { + private static final String TAG = SDLActivity.class.getCanonicalName(); + + // Main components + private static SDLActivity mSingleton; + private static SDLSurface mSurface; + + // Audio + private static Thread mAudioThread; + private static AudioTrack mAudioTrack; + + // Resource download + public static final int DIALOG_DOWNLOAD_PROGRESS = 0; + public static final int DIALOG_DOWNLOAD_ERROR = 1; + + //public final static String RES_FOLDER = Environment.getExternalStorageDirectory().getPath() + "/Wagic/Res/"; + public static String RES_FILENAME = ""; + public static String databaseurl = "https://github.com/WagicProject/wagic/releases/latest/download/CardImageLinks.csv"; + + // Preferences + public static final String kWagicSharedPreferencesKey = "net.wagic.app.preferences.wagic"; + public static final String kStoreDataOnRemovableSdCardPreference = "StoreDataOnRemovableStorage"; + public static final String kSaveDataPathPreference = "StorageDataLocation"; + public static final String kWagicDataStorageOptionsKey = "dataStorageOptions"; + public static final int kStorageDataOptionsMenuId = 2000; + public static final int kOtherOptionsMenuId = 3000; + + static { + System.loadLibrary("SDL"); + // System.loadLibrary("SDL_image"); + // System.loadLibrary("SDL_mixer"); + // System.loadLibrary("SDL_ttf"); + System.loadLibrary("main"); + } + + // Messages from the SDLMain thread + static int COMMAND_CHANGE_TITLE = 1; + static int COMMAND_JGE_MSG = 2; + + // Audio + private static Object buf; + + //import deck globals + public ArrayList myresult = new ArrayList(); + public String myclickedItem = ""; + private ProgressDialog mProgressDialog; + private AlertDialog mErrorDialog; + public String mErrorMessage = ""; + public Boolean mErrorHappened = false; + public String systemFolder = Environment.getExternalStorageDirectory() + .getPath() + "/Wagic/Res/"; + private String userFolder = Environment.getExternalStorageDirectory() + .getPath() + "/Wagic/User/"; + + // path to the onboard sd card that is not removable (typically /mnt/sdcard ) + private String internalPath = ""; + + // path to removable sd card (on motorala devices /mnt/sdcard-ext, samsung devices: /mnt/sdcard/external_sd ) + private String sdcardPath = ""; + + // Android only supports internal memory and internal sdcard. removable media is not currently accessible via API + // using StorageOptions for now gives us a temporary interface to scan all available mounted drives. + private Context mContext; + String set = ""; + String[] availableSets; + ArrayList selectedSets; + boolean[] checkedSet; + Integer totalset = 0; + boolean finished = false; + boolean loadResInProgress = false; + ProgressDialog progressBarDialogRes; + boolean fast = false; + String targetRes = "High"; + boolean error = false; + boolean skipDownloaded = false; + boolean borderless = false; + String res = ""; + public volatile boolean downloadInProgress = false; + public volatile boolean paused = false; + ProgressDialog cardDownloader; + volatile int currentIndex = 0; + MenuItem importDecks; + MenuItem downloader; + MenuItem about; + MenuItem storage; + + // Handler for the messages + Handler commandHandler = new Handler() { + public void handleMessage(Message msg) { + if (msg.arg1 == COMMAND_CHANGE_TITLE) { + setTitle((String) msg.obj); + } else if (msg.arg1 == COMMAND_JGE_MSG) { + processJGEMsg((String) msg.obj); + } + } + }; + + // Accessors + public String getSystemStorageLocation() { + return systemFolder; + } + + public String getUserStorageLocation() { + return userFolder; + } + + // setters + public void updateStorageLocations() { + boolean usesInternalSdCard = (!getSharedPreferences(kWagicSharedPreferencesKey, + MODE_PRIVATE) + .getBoolean(kStoreDataOnRemovableSdCardPreference, + false)) && + Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()); + + systemFolder = (usesInternalSdCard ? internalPath : sdcardPath) + + "/Res/"; + userFolder = (usesInternalSdCard ? internalPath : sdcardPath) + + "/User/"; + } + + /** + * checks to see if the device has a memory card to write to that is in a valid state. + * + * @return true if the device can write to the sdcard, false if not. + */ + public boolean checkStorageState() { + SharedPreferences settings = getSharedPreferences(kWagicSharedPreferencesKey, + MODE_PRIVATE); + boolean mExternalStorageAvailable = false; + boolean mExternalStorageWriteable = false; + String state = Environment.getExternalStorageState(); + boolean useSdCard = (!settings.getBoolean(kStoreDataOnRemovableSdCardPreference, + false)) && mExternalStorageWriteable; + String systemStoragePath = getSystemStorageLocation(); + + if (useSdCard && (systemStoragePath.indexOf(sdcardPath) != -1)) { + Log.i(TAG, "Data will be written to sdcard."); + + return true; + } + + if (!useSdCard && (systemStoragePath.indexOf(internalPath) != -1)) { + Log.i(TAG, "Data will be written to internal storage."); + + return true; + } + + if (Environment.MEDIA_MOUNTED.equals(state)) { + // We can read and write the media + mExternalStorageAvailable = mExternalStorageWriteable = true; + } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { + // We can only read the media + mExternalStorageAvailable = true; + mExternalStorageWriteable = false; + } else { + // Something else is wrong. It may be one of many other states, but all we need + // to know is we can neither read nor write + mExternalStorageAvailable = mExternalStorageWriteable = false; + } + + return (mExternalStorageAvailable && mExternalStorageWriteable); + } + + private boolean getRemovableMediaStorageState() { + for (String extMediaPath : StorageOptions.paths) { + File mediaPath = new File(extMediaPath); + + if (mediaPath.canWrite()) { + return true; + } + } + + return false; + } + + private void displayStorageOptions() { + AlertDialog.Builder setStorage = new AlertDialog.Builder(this); + setStorage.setTitle( + "Where would you like to store your data? On your removable SD Card or the built-in memory?"); + StorageOptions.determineStorageOptions(mContext); + + SharedPreferences settings = getSharedPreferences(kWagicSharedPreferencesKey, + MODE_PRIVATE); + String selectedPath = settings.getString(kSaveDataPathPreference, ""); + int selectedIndex = -1; + + for (int i = 0; i < StorageOptions.labels.length; i++) { + if (StorageOptions.labels[i].contains(selectedPath)) { + selectedIndex = i; + + break; + } + } + + setStorage.setSingleChoiceItems(StorageOptions.labels, selectedIndex, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int item) { + savePathPreference(item); + } + }); + + setStorage.setPositiveButton("OK", + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + initStorage(); + + if (mSurface == null) { + mSingleton.initializeGame(); + } + } + }); + + setStorage.create().show(); + } + + private void importDeckOptions() { + AlertDialog.Builder importDeck = new AlertDialog.Builder(this); + importDeck.setTitle("Choose Deck to Import:"); + + File root = new File(System.getenv("EXTERNAL_STORAGE") + "/Download"); + File[] files = root.listFiles(); + + for (File f : files) { + if (!myresult.contains(f.toString()) && + (f.toString().contains(".txt") || + f.toString().contains(".dck") || + f.toString().contains(".dec"))) { + myresult.add(f.toString()); + } + } + + //get first item? + if (!myresult.isEmpty()) { + myclickedItem = myresult.get(0).toString(); + } + + importDeck.setSingleChoiceItems(myresult.toArray( + new String[myresult.size()]), 0, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int item) { + myclickedItem = myresult.get(item).toString(); + } + }); + + importDeck.setPositiveButton("Import Deck", + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + processSelectedDeck(myclickedItem); + + if (mSurface == null) { + mSingleton.initializeGame(); + } + } + }); + + importDeck.create().show(); + } + + private void processSelectedDeck(String mypath) { + AlertDialog.Builder infoDialog = new AlertDialog.Builder(this); + infoDialog.setTitle("Imported Deck:"); + + String activePath = sdcardPath; + + if (activePath == "") { + activePath = internalPath; + } + + File f = new File(mypath); + + //Call the deck importer.... + String state = DeckImporter.importDeck(f, mypath, activePath); + infoDialog.setMessage(state); + infoDialog.show(); + } + + private void checkStorageLocationPreference() { + SharedPreferences settings = getSharedPreferences(kWagicSharedPreferencesKey, + MODE_PRIVATE); + final SharedPreferences.Editor prefsEditor = settings.edit(); + boolean hasRemovableMediaMounted = getRemovableMediaStorageState(); + + if (!settings.contains(kStoreDataOnRemovableSdCardPreference)) { + if (hasRemovableMediaMounted) { + displayStorageOptions(); + } else { + prefsEditor.putBoolean(kStoreDataOnRemovableSdCardPreference, + false); + prefsEditor.commit(); + initStorage(); + mSingleton.initializeGame(); + } + } else { + boolean storeOnRemovableMedia = settings.getBoolean(kStoreDataOnRemovableSdCardPreference, + false); + + if (storeOnRemovableMedia && !hasRemovableMediaMounted) { + AlertDialog setStorage = new AlertDialog.Builder(this).create(); + setStorage.setTitle("Storage Preference"); + setStorage.setMessage( + "Removable Sd Card not detected. Saving data to internal memory."); + + prefsEditor.putBoolean(kStoreDataOnRemovableSdCardPreference, + false); + prefsEditor.commit(); + + initStorage(); + mSingleton.initializeGame(); + setStorage.show(); + } else { + initStorage(); + mSingleton.initializeGame(); + } + } + } + + private void initStorage() { + // check the state of the external storage to ensure we can even write to it. + // we are going to assume that if an external location exists, and can be written to, use it. + // Otherwise use internal storage + try { + // + // initialize where all the files are going to be stored. + // + File wagicMediaPath = null; + + // String packageName = mContext.getPackageName(); // possibly use this to differentiate between different mods of Wagic. + File externalFilesDir = Environment.getExternalStorageDirectory(); + + if (externalFilesDir != null) { + internalPath = externalFilesDir.getAbsolutePath() + "/Wagic"; + } + + String state = Environment.getExternalStorageState(); + + if (Environment.MEDIA_MOUNTED.equals(state)) { + wagicMediaPath = new File(internalPath); + + if (wagicMediaPath.canWrite()) { + wagicMediaPath.mkdirs(); + } + } + + // initialize the external mount + SharedPreferences settings = getSharedPreferences(kWagicSharedPreferencesKey, + MODE_PRIVATE); + String selectedRemovableCardPath = settings.getString(kSaveDataPathPreference, + internalPath); + + if ((selectedRemovableCardPath != null) && + !internalPath.equalsIgnoreCase(selectedRemovableCardPath)) { + wagicMediaPath = new File(selectedRemovableCardPath); + + if (!wagicMediaPath.exists() || !wagicMediaPath.canWrite()) { + Log.e(TAG, + "Error in initializing system folder: " + + selectedRemovableCardPath); + } else { // found a removable media location + sdcardPath = selectedRemovableCardPath + "/Wagic"; + } + } + + updateStorageLocations(); + } catch (Exception ioex) { + Log.e(TAG, "An error occurred in setting up the storage locations."); + } + } + + private void savePathPreference(int selectedOption) { + SharedPreferences settings = getSharedPreferences(kWagicSharedPreferencesKey, + MODE_PRIVATE); + String selectedMediaPath = StorageOptions.paths[selectedOption]; + final SharedPreferences.Editor prefsEditor = settings.edit(); + boolean saveToRemovableMedia = !"/mnt/sdcard".equalsIgnoreCase(selectedMediaPath); + + prefsEditor.putBoolean(kStoreDataOnRemovableSdCardPreference, + saveToRemovableMedia); + prefsEditor.putString(kSaveDataPathPreference, selectedMediaPath); + prefsEditor.commit(); + } + + private void startDownload() { + String url = getResourceUrl(); + + if (!checkStorageState()) { + Log.e(TAG, "Error in initializing storage space."); + mSingleton.downloadError( + "Failed to initialize storage space for game. Please verify that your sdcard or internal memory is mounted properly."); + } + + new DownloadFileAsync().execute(url); + } + + public void downloadError(String errorMessage) { + mErrorHappened = true; + mErrorMessage = errorMessage; + } + + private void buildStorageOptionsMenu(Menu menu) { + StorageOptions.determineStorageOptions(mContext); + + for (int idx = 0; idx < StorageOptions.count; idx++) { + menu.add(kStorageDataOptionsMenuId, + kStorageDataOptionsMenuId + idx, idx, StorageOptions.labels[idx]); + } + } + + private void loadAvailableSets() { + final Handler mHandler = new Handler(); + progressBarDialogRes = new ProgressDialog(this); + progressBarDialogRes.setTitle("Loading all available sets..."); + progressBarDialogRes.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + progressBarDialogRes.setProgress(0); + new Thread(new Runnable() { + public void run() { + ArrayList sets = new ArrayList(); + + if (availableSets == null) { + loadResInProgress = true; + + File baseFolder = new File(getSystemStorageLocation()); + File[] listOfFiles = baseFolder.listFiles(); + ZipFile zipFile = null; + + try { + zipFile = new ZipFile(baseFolder + "/" + + RES_FILENAME); + + Enumeration e = zipFile.entries(); + + while (e.hasMoreElements()) { + ZipEntry entry = e.nextElement(); + String entryName = entry.getName(); + + if ((entryName != null) && + entryName.contains("sets/")) { + if (!entryName.equalsIgnoreCase("sets/") && + !entryName.contains("primitives") && + !entryName.contains(".")) { + String[] names = entryName.split("/"); + sets.add(names[1]); + } + } + } + } catch (IOException ioe) { + System.out.println("Error opening zip file" + ioe); + } finally { + try { + if (zipFile != null) { + zipFile.close(); + } + } catch (IOException ioe) { + System.out.println( + "Error while closing zip file" + ioe); + } + } + + availableSets = new String[sets.size()]; + checkedSet = new boolean[sets.size()]; + progressBarDialogRes.setMax(sets.size()); + + for (int i = 0; i < availableSets.length; i++) { + availableSets[i] = sets.get(i) + " - " + + ImgDownloader.getSetInfo(sets.get(i), true, + getSystemStorageLocation()); + checkedSet[i] = false; + progressBarDialogRes.incrementProgressBy((int) (1)); + } + } + + finished = true; + loadResInProgress = false; + progressBarDialogRes.dismiss(); + mHandler.post(new Runnable() { + public void run() { + while (!finished) { + try { + Thread.sleep(1000); + } catch (Exception e) { + } + } + + selectedSets = new ArrayList(); + showWarningFast(); + } + }); + } + }).start(); + + new Thread(new Runnable() { + public void run() { + fast = ImgDownloader.loadDatabase(getSystemStorageLocation(), + databaseurl); + } + }).start(); + + progressBarDialogRes.show(); + } + + private void showWarningFast() { + AlertDialog.Builder infoDialog = new AlertDialog.Builder(this); + + if (!fast) { + infoDialog.setTitle("Problem downloading the images database file"); + infoDialog.setMessage( + "The program will use the slow (not indexed) method, so the images download may take really long time..."); + + infoDialog.setNegativeButton("Retry", + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + fast = ImgDownloader.loadDatabase(getSystemStorageLocation(), + databaseurl); + showWarningFast(); + } + }); + } else { + infoDialog.setTitle("Images Database correctly downloaded"); + infoDialog.setMessage( + "The program will use the fast (indexed) method, so the images download will not take long time!"); + } + + infoDialog.setPositiveButton("Continue", + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + downloadCardImages(); + } + }); + + infoDialog.create().show(); + } + + private void downloadCardImages() { + AlertDialog.Builder cardDownloader = new AlertDialog.Builder(this); + cardDownloader.setTitle("Which Sets would you like to download?"); + + cardDownloader.setMultiChoiceItems(availableSets, checkedSet, + new DialogInterface.OnMultiChoiceClickListener() { + public void onClick(DialogInterface dialog, int which, + boolean isChecked) { + checkedSet[which] = isChecked; + + if (checkedSet[which]) { + selectedSets.add(availableSets[which].split(" - ")[0]); + } else { + selectedSets.remove(availableSets[which].split(" - ")[0]); + } + } + }); + + cardDownloader.setNeutralButton("Download All", + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + selectedSets.clear(); + + for (int i = 0; i < availableSets.length; i++) { + selectedSets.add(availableSets[i].split(" - ")[0]); + } + + chooseResolution(); + } + }); + + cardDownloader.setPositiveButton("Download Selected", + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + } + }); + + final AlertDialog dialog = cardDownloader.create(); + dialog.show(); + + dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (selectedSets.size() > 0) { + chooseResolution(); + dialog.dismiss(); + } + } + }); + } + + private void chooseResolution() { + AlertDialog.Builder resChooser = new AlertDialog.Builder(this); + + resChooser.setTitle("Which resolution would you like to use?"); + + final String[] availableRes = new String[] { + "High - (672x936)", "High - (672x936) - Borderless", + "Medium - (488x680)", "Medium - (488x680) - Borderless", + "Low - (244x340)", "Low - (244x340) - Borderless", + "Tiny - (180x255)", "Tiny - (180x255) - Borderless" + }; + + resChooser.setSingleChoiceItems(availableRes, 0, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int item) { + targetRes = availableRes[item].split(" - ")[0]; + borderless = (availableRes[item].split(" - ").length > 2); + } + }); + + resChooser.setPositiveButton("Start Download", + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + skipDownloadedSets(); + } + }); + + resChooser.setNegativeButton("Change Selection", + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + downloadCardImages(); + } + }); + + resChooser.create().show(); + } + + private void skipDownloadedSets() { + AlertDialog.Builder skipChooser = new AlertDialog.Builder(this); + + skipChooser.setTitle("Do you want to overwrite existing sets?"); + + skipChooser.setPositiveButton("Yes", + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + skipDownloaded = false; + downloadCardImagesStart(); + } + }); + + skipChooser.setNegativeButton("No", + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + skipDownloaded = true; + downloadCardImagesStart(); + } + }); + + skipChooser.create().show(); + } + + private void downloadCardImagesStart() { + final SDLActivity parent = this; + final Handler mHandler = new Handler(); + cardDownloader = new ProgressDialog(this); + cardDownloader.setTitle("Downloading now set: " + set); + cardDownloader.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + cardDownloader.setProgress(0); + + if (selectedSets.size() == 1) { + cardDownloader.setMessage( + "You choose to download just 1 set: Please don't quit Wagic or turn off Internet connection, you can hide this window and continue to play, a pop-up will notify the completion of download process."); + } else { + cardDownloader.setMessage("You choose to download " + + selectedSets.size() + + " sets: Please don't quit Wagic or turn off Internet connection, you can hide this window and continue to play, a pop-up will notify the completion of download process."); + } + + new Thread(new Runnable() { + public void run() { + downloadInProgress = true; + paused = false; + + if (selectedSets != null) { + for (currentIndex = 0; + (currentIndex < selectedSets.size()) && + downloadInProgress; currentIndex++) { + while (paused) { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + + if (!downloadInProgress) { + break; + } + } + + try { + set = selectedSets.get(currentIndex); + mHandler.post(new Runnable() { + public void run() { + cardDownloader.setTitle( + "Downloading set: " + set + + " (" + (currentIndex + 1) + + " of " + selectedSets.size() + + ")"); + } + }); + + String details = ImgDownloader.DownloadCardImages(set, + availableSets, targetRes, + getSystemStorageLocation(), + getUserStorageLocation() + "sets/", + cardDownloader, parent, skipDownloaded, + borderless); + + if (!details.isEmpty()) { + if (!res.isEmpty()) { + res = res + "\nSET " + set + ":\n" + + details; + } else { + res = "SET " + set + ":\n" + details; + } + } + } catch (Exception e) { + res = res + "\n" + e.getMessage(); + error = true; + } + } + + mHandler.post(new Runnable() { + public void run() { + if (downloadInProgress) { + downloadSelectedSetsCompleted(error, res); + downloadInProgress = false; + paused = false; + } + + cardDownloader.dismiss(); + } + }); + } + } + }).start(); + + cardDownloader.setButton(DialogInterface.BUTTON_POSITIVE, "Hide", + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + cardDownloader.hide(); + } + }); + + cardDownloader.setButton(DialogInterface.BUTTON_NEGATIVE, "Stop", + new DialogInterface.OnClickListener() { + public void onClick(final DialogInterface dialog, int which) { + mHandler.post(new Runnable() { + public void run() { + downloadCardInterruped(set, + cardDownloader.getProgress(), + cardDownloader.getMax()); + downloadInProgress = false; + paused = false; + + AlertDialog d = (AlertDialog) dialog; + d.getButton(AlertDialog.BUTTON_NEUTRAL) + .setText("Pause"); + cardDownloader.setTitle("Downloading now set: " + + set + " - Interrupted"); + cardDownloader.dismiss(); + } + }); + } + }); + + cardDownloader.setButton(DialogInterface.BUTTON_NEUTRAL, "Pause", + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + } + }); + + final AlertDialog dialog = (AlertDialog) cardDownloader; + cardDownloader.show(); + + dialog.getButton(AlertDialog.BUTTON_NEUTRAL).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (!paused) { + paused = true; + + AlertDialog d = (AlertDialog) dialog; + d.getButton(AlertDialog.BUTTON_NEUTRAL).setText("Resume"); + cardDownloader.setTitle("Downloading now set: " + set + + " - Paused"); + } else { + paused = false; + + AlertDialog d = (AlertDialog) dialog; + d.getButton(AlertDialog.BUTTON_NEUTRAL).setText("Pause"); + cardDownloader.setTitle("Downloading now set: " + set); + } + } + }); + } + + private void downloadCardInterruped(String set, int cardsDownloaded, + int total) { + AlertDialog.Builder infoDialog = new AlertDialog.Builder(this); + infoDialog.setTitle("Download of " + set + " has been interrupted!"); + infoDialog.setMessage("WARNING: Only " + cardsDownloaded + " of " + + total + " total cards have been downloaded and zip archive (" + + set + + ".zip) has not been created. You have to start the download again in order to complete the entire set."); + + infoDialog.setPositiveButton("OK", + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + downloadCardImages(); + } + }); + + res = ""; + set = ""; + targetRes = "High"; + skipDownloaded = false; + borderless = false; + currentIndex = 0; + selectedSets = new ArrayList(); + + for (int i = 0; i < checkedSet.length; i++) { + checkedSet[i] = false; + } + + error = false; + + infoDialog.create().show(); + } + + private void downloadSelectedSetsCompleted(boolean error, String res) { + AlertDialog.Builder infoDialog = new AlertDialog.Builder(this); + + if (!error) { + infoDialog.setTitle( + "The download process has completed without any error"); + + if (!res.isEmpty()) { + infoDialog.setMessage( + "Following cards could not be downloaded:\n" + res); + } + } else { + infoDialog.setTitle("Some errors occurred during the process!"); + infoDialog.setMessage(res); + } + + res = ""; + set = ""; + targetRes = "High"; + skipDownloaded = false; + borderless = false; + currentIndex = 0; + selectedSets = new ArrayList(); + + for (int i = 0; i < checkedSet.length; i++) { + checkedSet[i] = false; + } + + error = false; + + infoDialog.create().show(); + } + + public void prepareOptionMenu(Menu menu) { + if (menu == null) { + PopupMenu p = new PopupMenu(mContext, null); + menu = p.getMenu(); + } + SubMenu settingsMenu = menu.addSubMenu(Menu.NONE, 1, 1, "Settings"); + importDecks = menu.add(Menu.NONE, 2, 2, "Import Decks"); + downloader = menu.add(Menu.NONE, 3, 3, "Download Cards"); + about = menu.add(Menu.NONE, 4, 4, "About"); + storage = settingsMenu.add(kStorageDataOptionsMenuId, + kStorageDataOptionsMenuId, Menu.NONE, "Storage Data Options"); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + prepareOptionMenu(menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + // Handle item selection + int itemId = item.getItemId(); + + if (itemId == kStorageDataOptionsMenuId) { + displayStorageOptions(); + } else if (itemId == 2) { + importDeckOptions(); + } else if (itemId == 3) { + if (availableSets == null) { + loadAvailableSets(); + } else { + if (loadResInProgress) { + progressBarDialogRes.show(); + progressBarDialogRes.show(); + } else if (downloadInProgress) { + cardDownloader.show(); + cardDownloader.show(); + } else { + downloadCardImages(); + } + } + } else if (itemId == 4) { + // display some info about the app + AlertDialog.Builder infoDialog = new AlertDialog.Builder(this); + infoDialog.setTitle("Wagic Info"); + infoDialog.setMessage("Version: " + + getResources().getString(R.string.app_version) + "\r\n" + + getResources().getString(R.string.info_text)); + infoDialog.show(); + } else { + return super.onOptionsItemSelected(item); + } + + return true; + } + + public void showSettingsSubMenu() { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle("Settings Menu"); + String[] choices = { "Storage Data Options" }; + builder.setItems(choices, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + switch (which) { + case 0: + onOptionsItemSelected(storage); + break; + } + } + }); + AlertDialog dialog = builder.create(); + dialog.show(); + } + + public void showOptionMenu() { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle("Options Menu"); + String[] choices = { "Settings", "Import Decks", "Download Cards", "About" }; + builder.setItems(choices, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + switch (which) { + case 0: + showSettingsSubMenu(); + break; + case 1: + onOptionsItemSelected(importDecks); + break; + case 2: + onOptionsItemSelected(downloader); + break; + case 3: + onOptionsItemSelected(about); + break; + } + } + }); + AlertDialog dialog = builder.create(); + dialog.show(); + } + + @Override + protected Dialog onCreateDialog(int id) { + switch (id) { + case DIALOG_DOWNLOAD_PROGRESS: + mProgressDialog = new ProgressDialog(this); + mProgressDialog.setMessage("Downloading resource files (" + + RES_FILENAME + ")"); + mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + mProgressDialog.setCancelable(false); + mProgressDialog.show(); + + return mProgressDialog; + + case DIALOG_DOWNLOAD_ERROR: + + // prepare alertDialog + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setMessage(mErrorMessage).setCancelable(false).setPositiveButton("Exit", + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + System.exit(0); + } + }); + + + mErrorDialog = builder.create(); + mErrorDialog.show(); + + return mErrorDialog; + + default: + return null; + } + } + + // create main application + public void mainDisplay() { + FrameLayout _videoLayout = new FrameLayout(this); + + // mGLView = new DemoGLSurfaceView(this); + + // Set up the surface + mSurface = new SDLSurface(getApplication(), this); + + // setContentView(mSurface); + SurfaceHolder holder = mSurface.getHolder(); + holder.setType(SurfaceHolder.SURFACE_TYPE_GPU); + + _videoLayout.addView(mSurface, + new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); + // mGLView.setFocusableInTouchMode(true); + // mGLView.setFocusable(true); + // adView.requestFreshAd(); + setContentView(_videoLayout, + new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); + mSurface.requestFocus(); + } + + // Setup + @Override + protected void onCreate(Bundle savedInstanceState) { + //Log.d(TAG, "onCreate()"); + super.onCreate(savedInstanceState); + + StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll() + .build(); + StrictMode.setThreadPolicy(policy); + setContentView(R.layout.main); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + // So we can call stuff from static callbacks + mSingleton = this; + mContext = this.getApplicationContext(); + RES_FILENAME = getResourceName(); + StorageOptions.determineStorageOptions(mContext); + checkStorageLocationPreference(); + prepareOptionMenu(null); + } + + public void initializeGame() { + String coreFileLocation = getSystemStorageLocation() + RES_FILENAME; + + File file = new File(coreFileLocation); + + if (file.exists()) { + mainDisplay(); + } else { + FrameLayout _videoLayout = new FrameLayout(this); + setContentView(_videoLayout, + new LayoutParams(LayoutParams.FILL_PARENT, + LayoutParams.FILL_PARENT)); + startDownload(); + } + } + + // Events + @Override + protected void onPause() { + // Log.d(TAG, "onPause()"); + super.onPause(); + SDLActivity.nativePause(); + } + + @Override + protected void onResume() { + // Log.d(TAG, "onResume()"); + super.onResume(); + SDLActivity.nativeResume(); + } + + @Override + public void onDestroy() { + // Log.d(TAG, "onDestroy()"); + super.onDestroy(); + mSurface.onDestroy(); + } + + // Handler for Messages coming from JGE + // Suggested syntax for JGE messages is a string separated by the ":" symbol + protected void processJGEMsg(String command) { + if (null == command) { + return; + } + } + + // Send a message from the SDLMain thread + void sendCommand(int command, Object data) { + Message msg = commandHandler.obtainMessage(); + msg.arg1 = command; + msg.obj = data; + commandHandler.sendMessage(msg); + } + + // C functions we call + public static native String getResourceUrl(); + + public static native String getResourceName(); + + public static native void nativeInit(); + + 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 onNativeTouch(int index, int action, float x, + float y, float p); + + public static native void onNativeFlickGesture(float xVelocity, + float yVelocity); + + public static native void onNativeAccel(float x, float y, float z); + + public static native void nativeRunAudioThread(); + + // Java functions called from C + // Receive a message from the SDLMain thread + public static String getSystemFolderPath() { + return mSingleton.getSystemStorageLocation(); + } + + public static String getUserFolderPath() { + return mSingleton.getUserStorageLocation(); + } + + public static void jgeSendCommand(String command) { + mSingleton.sendCommand(COMMAND_JGE_MSG, command); + } + + public static boolean createGLContext(int majorVersion, int minorVersion) { + return mSurface.initEGL(majorVersion, minorVersion); + } + + public static void flipBuffers() { + mSurface.flipEGL(); + } + + public static void setActivityTitle(String title) { + // Called from SDLMain() thread and can't directly affect the view + mSingleton.sendCommand(COMMAND_CHANGE_TITLE, title); + } + + public static Object 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.d(TAG, "SDL audio: wanted " + (isStereo ? "stereo" : "mono") + " " + (is16Bit ? "16-bit" : "8-bit") + " " + ((float)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); + + mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, + channelConfig, audioFormat, desiredFrames * frameSize, + AudioTrack.MODE_STREAM); + + audioStartThread(); + + // Log.d(TAG, "SDL audio: got " + ((mAudioTrack.getChannelCount() >= 2) ? "stereo" : "mono") + " " + ((mAudioTrack.getAudioFormat() == AudioFormat.ENCODING_PCM_16BIT) ? "16-bit" : "8-bit") + " " + ((float)mAudioTrack.getSampleRate() / 1000f) + + // "kHz, " + desiredFrames + " frames buffer"); + if (is16Bit) { + buf = new short[desiredFrames * (isStereo ? 2 : 1)]; + } else { + buf = new byte[desiredFrames * (isStereo ? 2 : 1)]; + } + + return buf; + } + + public static void audioStartThread() { + mAudioThread = new Thread(new Runnable() { + public void run() { + mAudioTrack.play(); + nativeRunAudioThread(); + } + }); + + // I'd take REALTIME if I could get it! + mAudioThread.setPriority(Thread.MAX_PRIORITY); + mAudioThread.start(); + } + + 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(TAG, "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(TAG, "SDL audio: error return from write(short)"); + + return; + } + } + } + + public static void audioQuit() { + if (mAudioThread != null) { + try { + mAudioThread.join(); + } catch (Exception e) { + Log.e(TAG, "Problem stopping audio thread: " + e); + } + + mAudioThread = null; + + // Log.d(TAG, "Finished waiting for audio thread"); + } + + if (mAudioTrack != null) { + mAudioTrack.stop(); + mAudioTrack = null; + } + } + + public boolean onKey(View v, int keyCode, KeyEvent event) { + if ((keyCode == KeyEvent.KEYCODE_MENU) && + (KeyEvent.ACTION_DOWN == event.getAction())) { + super.onKeyDown(keyCode, event); + + return true; + } else if ((keyCode == KeyEvent.KEYCODE_MENU) && + (KeyEvent.ACTION_UP == event.getAction())) { + super.onKeyUp(keyCode, event); + + return true; + } + + return false; + } + + private String getApplicationCode() { + int v = 0; + + try { + v = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode; + } catch (NameNotFoundException e) { + // Huh? Really? + v = 184; // shouldn't really happen but we need to default to something + } + + return "0" + v; + } + + // Empty onConfigurationChanged to stop the Activity from destroying/recreating on screen off + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + } + + class DownloadFileAsync extends AsyncTask { + private final String TAG = DownloadFileAsync.class.getCanonicalName(); + + @Override + protected void onPreExecute() { + super.onPreExecute(); + showDialog(DIALOG_DOWNLOAD_PROGRESS); + } + + @Override + protected Long doInBackground(String... aurl) { + int count; + long totalBytes = 0; + OutputStream output = null; + InputStream input = null; + + try { + // + // Prepare the sdcard folders in order to download the resource file + // + String storageLocation = mSingleton.getSystemStorageLocation(); + + File resDirectory = new File(storageLocation); + File userDirectory = new File(mSingleton.getUserStorageLocation()); + + if ((!resDirectory.exists() && !resDirectory.mkdirs()) || + (!userDirectory.exists() && !userDirectory.mkdirs())) { + throw new Exception( + "Failed to initialize system and user directories."); + } + + URL url = new URL(aurl[0]); + String filename = url.getPath() + .substring(url.getPath().lastIndexOf('/') + + 1); + URLConnection conexion = url.openConnection(); + conexion.connect(); + + int lengthOfFile = conexion.getContentLength(); + // Log.d(TAG, " Length of file: " + lengthOfFile); + input = new BufferedInputStream(url.openStream()); + + // create a File object for the output file + File outputFile = new File(resDirectory, filename); + + output = new FileOutputStream(outputFile); + + byte[] data = new byte[1024]; + + while ((count = input.read(data)) != -1) { + totalBytes += count; + publishProgress((int) ((totalBytes * 100) / lengthOfFile)); + output.write(data, 0, count); + } + + output.flush(); + output.close(); + input.close(); + } catch (Exception e) { + String errorMessage = "An error happened while downloading the resources. It could be that our server is temporarily down, that your device is not connected to a network, or that we cannot write to " + + mSingleton.getSystemStorageLocation() + + ". Please check your phone settings and try again. For more help please go to http://wololo.net/forum/"; + mSingleton.downloadError(errorMessage); + Log.e(TAG, errorMessage); + Log.e(TAG, e.getMessage()); + } + + return Long.valueOf(totalBytes); + } + + protected void onProgressUpdate(Integer... progress) { + if (progress[0] != mProgressDialog.getProgress()) { + // Log.d(TAG, "current progress : " + progress[0]); + mProgressDialog.setProgress(progress[0]); + } + } + + @Override + protected void onPostExecute(Long unused) { + if (mErrorHappened) { + dismissDialog(DIALOG_DOWNLOAD_PROGRESS); + showDialog(DIALOG_DOWNLOAD_ERROR); + + return; + } + + // rename the temporary file into the final filename + String storageLocation = getSystemStorageLocation(); + + File preFile = new File(storageLocation + RES_FILENAME + ".tmp"); + File postFile = new File(storageLocation + RES_FILENAME); + + if (preFile.exists()) { + preFile.renameTo(postFile); + } + + dismissDialog(DIALOG_DOWNLOAD_PROGRESS); + // Start game; + mSingleton.mainDisplay(); + } + } +} + + +/** + * 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 { + private static final String TAG = SDLSurface.class.getCanonicalName(); + + // Sensors + private static SensorManager mSensorManager; + private static VelocityTracker mVelocityTracker; + private static SDLActivity parent; + + // This is what SDL runs in. It invokes SDL_main(), eventually + private Thread mSDLThread; + + // EGL private objects + private EGLContext mEGLContext; + private EGLSurface mEGLSurface; + private EGLDisplay mEGLDisplay; + private EGLConfig mEGLConfig; + final private Object mSemSurface; + private Boolean mSurfaceValid; + + // Variables for touch events + public float y1; + + // Variables for touch events + public float y2; + public final int DELTA_Y = 300; + + // Startup + public SDLSurface(Context context, SDLActivity app) { + super(context); + mSemSurface = new Object(); + mSurfaceValid = false; + getHolder().addCallback(this); + + setFocusable(true); + setFocusableInTouchMode(true); + requestFocus(); + setOnKeyListener(this); + setOnTouchListener(this); + + mSensorManager = (SensorManager) context.getSystemService("sensor"); + parent = app; + } + + void startSDLThread() { + if (mSDLThread == null) { + mSDLThread = new Thread(new SDLMain(), "SDLThread"); + mSDLThread.start(); + } + } + + // Called when we have a valid drawing surface + public void surfaceCreated(SurfaceHolder holder) { + //Log.d(TAG, "surfaceCreated()"); + enableSensor(Sensor.TYPE_ACCELEROMETER, true); + } + + public void onDestroy() { + // Send a quit message to the application + // should that be in SDLActivity "onDestroy" instead ? + SDLActivity.nativeQuit(); + + // Now wait for the SDL thread to quit + if (mSDLThread != null) { + try { + mSDLThread.join(); + } catch (Exception e) { + Log.e(TAG, "Problem stopping thread: " + e); + } + + mSDLThread = null; + + // Log.d(TAG, "Finished waiting for SDL thread"); + } + } + + // Called when we lose the surface + public void surfaceDestroyed(SurfaceHolder holder) { + Log.d(TAG, "surfaceDestroyed()"); + + synchronized (mSemSurface) { + mSurfaceValid = false; + mSemSurface.notifyAll(); + } + + enableSensor(Sensor.TYPE_ACCELEROMETER, false); + } + + // Called when the surface is resized + public void surfaceChanged(SurfaceHolder holder, int format, int width, + int height) { + Log.d(TAG, "surfaceChanged()"); + + int sdlFormat = 0x85151002; // SDL_PIXELFORMAT_RGB565 by default + + switch (format) { + case PixelFormat.A_8: + Log.d("TAG", "pixel format A_8"); + + break; + + case PixelFormat.LA_88: + Log.d("TAG", "pixel format LA_88"); + + break; + + case PixelFormat.L_8: + Log.d("TAG", "pixel format L_8"); + + break; + + case PixelFormat.RGBA_4444: + Log.d("TAG", "pixel format RGBA_4444"); + sdlFormat = 0x85421002; // SDL_PIXELFORMAT_RGBA4444 + + break; + + case PixelFormat.RGBA_5551: + Log.d(TAG, "pixel format RGBA_5551"); + sdlFormat = 0x85441002; // SDL_PIXELFORMAT_RGBA5551 + + break; + + case PixelFormat.RGBA_8888: + Log.d(TAG, "pixel format RGBA_8888"); + sdlFormat = 0x86462004; // SDL_PIXELFORMAT_RGBA8888 + + break; + + case PixelFormat.RGBX_8888: + Log.d(TAG, "pixel format RGBX_8888"); + sdlFormat = 0x86262004; // SDL_PIXELFORMAT_RGBX8888 + + break; + + case PixelFormat.RGB_332: + Log.d(TAG, "pixel format RGB_332"); + sdlFormat = 0x84110801; // SDL_PIXELFORMAT_RGB332 + + break; + + case PixelFormat.RGB_565: + Log.d(TAG, "pixel format RGB_565"); + sdlFormat = 0x85151002; // SDL_PIXELFORMAT_RGB565 + + break; + + case PixelFormat.RGB_888: + Log.d(TAG, "pixel format RGB_888"); + // Not sure this is right, maybe SDL_PIXELFORMAT_RGB24 instead? + sdlFormat = 0x86161804; // SDL_PIXELFORMAT_RGB888 + + break; + + default: + Log.d(TAG, "pixel format unknown " + format); + + break; + } + + SDLActivity.onNativeResize(width, height, sdlFormat); + + // Now start up the C app thread + startSDLThread(); + } + + // unused + public void onDraw(Canvas canvas) { + } + + // EGL functions + public boolean initEGL(int majorVersion, int minorVersion) { + Log.d(TAG, "Starting up OpenGL ES " + majorVersion + "." + + minorVersion); + + try { + EGL10 egl = (EGL10) EGLContext.getEGL(); + + EGLDisplay dpy = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); + + int[] version = new int[2]; + egl.eglInitialize(dpy, version); + + int EGL_OPENGL_ES_BIT = 1; + int EGL_OPENGL_ES2_BIT = 4; + int renderableType = 0; + + if (majorVersion == 2) { + renderableType = EGL_OPENGL_ES2_BIT; + } else if (majorVersion == 1) { + renderableType = EGL_OPENGL_ES_BIT; + } + + int[] configSpec = { + // EGL10.EGL_DEPTH_SIZE, 16, + EGL10.EGL_RENDERABLE_TYPE, renderableType, EGL10.EGL_NONE + }; + EGLConfig[] configs = new EGLConfig[1]; + int[] num_config = new int[1]; + + if (!egl.eglChooseConfig(dpy, configSpec, configs, 1, num_config) || + (num_config[0] == 0)) { + Log.e(TAG, "No EGL config available"); + + return false; + } + + mEGLConfig = configs[0]; + + EGLContext ctx = egl.eglCreateContext(dpy, mEGLConfig, + EGL10.EGL_NO_CONTEXT, null); + + if (ctx == EGL10.EGL_NO_CONTEXT) { + Log.e(TAG, "Couldn't create context"); + + return false; + } + + mEGLContext = ctx; + mEGLDisplay = dpy; + + if (!createSurface(this.getHolder())) { + return false; + } + } catch (Exception e) { + Log.e(TAG, e + ""); + + for (StackTraceElement s : e.getStackTrace()) { + Log.e(TAG, s.toString()); + } + } + + return true; + } + + public Boolean createSurface(SurfaceHolder holder) { + /* + * The window size has changed, so we need to create a new surface. + */ + EGL10 egl = (EGL10) EGLContext.getEGL(); + + if (mEGLSurface != null) { + /* + * Unbind and destroy the old EGL surface, if there is one. + */ + egl.eglMakeCurrent(mEGLDisplay, EGL10.EGL_NO_SURFACE, + EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT); + egl.eglDestroySurface(mEGLDisplay, mEGLSurface); + } + + /* + * Create an EGL surface we can render into. + */ + mEGLSurface = egl.eglCreateWindowSurface(mEGLDisplay, mEGLConfig, + holder, null); + + if (mEGLSurface == EGL10.EGL_NO_SURFACE) { + Log.e(TAG, "Couldn't create surface"); + + return false; + } + + /* + * Before we can issue GL commands, we need to make sure the context is current and bound to a surface. + */ + if (!egl.eglMakeCurrent(mEGLDisplay, mEGLSurface, mEGLSurface, + mEGLContext)) { + Log.e(TAG, "Couldn't make context current"); + + return false; + } + + mSurfaceValid = true; + + return true; + } + + // EGL buffer flip + public void flipEGL() { + if (!mSurfaceValid) { + createSurface(this.getHolder()); + } + + try { + EGL10 egl = (EGL10) EGLContext.getEGL(); + + egl.eglWaitNative(EGL10.EGL_CORE_NATIVE_ENGINE, null); + + // drawing here + egl.eglWaitGL(); + + egl.eglSwapBuffers(mEGLDisplay, mEGLSurface); + } catch (Exception e) { + Log.e(TAG, "flipEGL(): " + e); + + for (StackTraceElement s : e.getStackTrace()) { + Log.e(TAG, s.toString()); + } + } + } + + // Key events + public boolean onKey(View v, int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_MENU) { + return false; + } + + if ((keyCode == KeyEvent.KEYCODE_VOLUME_UP) || + (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN)) { + return false; + } + + if (event.getAction() == KeyEvent.ACTION_DOWN) { + // Log.d(TAG, "key down: " + keyCode); + SDLActivity.onNativeKeyDown(keyCode); + + return true; + } else if (event.getAction() == KeyEvent.ACTION_UP) { + // Log.d(TAG, "key up: " + keyCode); + SDLActivity.onNativeKeyUp(keyCode); + + return true; + } + + return false; + } + + // Touch events + public boolean onTouch(View v, MotionEvent event) { + // Show Menu for devices without sidebar (e.g. Android 10) + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + case MotionEvent.ACTION_POINTER_DOWN: + y1 = event.getY(); + break; + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_POINTER_UP: + y2 = event.getY(); + float deltaY = y2 - y1; + if (deltaY > DELTA_Y) + parent.showOptionMenu(); + break; + } + + for (int index = 0; index < event.getPointerCount(); ++index) { + int action = event.getActionMasked(); + float x = event.getX(index); + float y = event.getY(index); + float p = event.getPressure(index); + + // TODO: Anything else we need to pass? + SDLActivity.onNativeTouch(index, action, x, y, p); + } + + // account for 'flick' type gestures by monitoring velocity + if (event.getActionIndex() == 0) { + if (event.getAction() == MotionEvent.ACTION_DOWN) { + mVelocityTracker = VelocityTracker.obtain(); + mVelocityTracker.clear(); + mVelocityTracker.addMovement(event); + } else if (event.getAction() == MotionEvent.ACTION_MOVE) { + mVelocityTracker.addMovement(event); + } else if (event.getAction() == MotionEvent.ACTION_UP) { + mVelocityTracker.addMovement(event); + + // calc velocity + mVelocityTracker.computeCurrentVelocity(1000); + + float xVelocity = mVelocityTracker.getXVelocity(0); + float yVelocity = mVelocityTracker.getYVelocity(0); + + if ((Math.abs(xVelocity) > 300) || (Math.abs(yVelocity) > 300)) { + SDLActivity.onNativeFlickGesture(xVelocity, yVelocity); + } + + mVelocityTracker.recycle(); + } + } + + 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)); + } + } + + public void onAccuracyChanged(Sensor sensor, int accuracy) { + // TODO + } + + public void onSensorChanged(SensorEvent event) { + if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { + SDLActivity.onNativeAccel(event.values[0], event.values[1], + event.values[2]); + } + } + + /** + * Simple nativeInit() runnable + */ + class SDLMain implements Runnable { + public void run() { + // Runs SDL_main() + SDLActivity.nativeInit(); + + SDLActivity.nativeQuit(); + + Log.d(TAG, "SDL thread terminated"); + + // On exit, tear everything down for a fresh restart next time. + System.exit(0); + } + } +} diff --git a/projects/mtg/bin/Res/sets/BNG/_cards.dat b/projects/mtg/bin/Res/sets/BNG/_cards.dat index 6060f502f..3cb126700 100644 --- a/projects/mtg/bin/Res/sets/BNG/_cards.dat +++ b/projects/mtg/bin/Res/sets/BNG/_cards.dat @@ -2,7 +2,7 @@ author=Wagic Team name=Born of the Gods block=Theros -year=2014 +year=2014-02-07 total=165 [/meta] [card] diff --git a/projects/mtg/bin/Res/sets/C14/_cards.dat b/projects/mtg/bin/Res/sets/C14/_cards.dat index 2183b563e..61a5dec30 100644 --- a/projects/mtg/bin/Res/sets/C14/_cards.dat +++ b/projects/mtg/bin/Res/sets/C14/_cards.dat @@ -1,7 +1,7 @@ [meta] author=Wagic Team name=Commander 2014 -year=2014 +year=2014-11-07 total=337 [/meta] [card] diff --git a/projects/mtg/bin/Res/sets/CNS/_cards.dat b/projects/mtg/bin/Res/sets/CNS/_cards.dat index 9dd09fd10..da2c360f5 100644 --- a/projects/mtg/bin/Res/sets/CNS/_cards.dat +++ b/projects/mtg/bin/Res/sets/CNS/_cards.dat @@ -1,7 +1,7 @@ [meta] author=Wagic Team name=Magic: The Gathering—Conspiracy -year=2014 +year=2014-06-06 total=197 [/meta] [card] diff --git a/projects/mtg/bin/Res/sets/DDR/_cards.dat b/projects/mtg/bin/Res/sets/DDR/_cards.dat index 9c1baee6f..85a3258ee 100644 --- a/projects/mtg/bin/Res/sets/DDR/_cards.dat +++ b/projects/mtg/bin/Res/sets/DDR/_cards.dat @@ -359,7 +359,6 @@ primitive=Eldrazi Scion id=-417465 rarity=T [/card] -[/card] [card] primitive=Demon id=-417480 diff --git a/projects/mtg/bin/Res/sets/HA3/_cards.dat b/projects/mtg/bin/Res/sets/HA3/_cards.dat new file mode 100644 index 000000000..e8defd296 --- /dev/null +++ b/projects/mtg/bin/Res/sets/HA3/_cards.dat @@ -0,0 +1,161 @@ +[meta] +author=Wagic Team +name=Historic Anthology 3 +year=2020-05-21 +total=31 +[/meta] +[card] +primitive=Soldier +id=-294701 +rarity=T +[/card] +[card] +primitive=Bird +id=-294700 +rarity=T +[/card] +[card] +primitive=Wurm +id=-294698 +rarity=T +[/card] +[card] +primitive=Spirit +id=-294690 +rarity=T +[/card] +[card] +primitive=Akroma's Memorial +id=294680 +rarity=M +[/card] +[card] +primitive=Ancient Ziggurat +id=294681 +rarity=U +[/card] +[card] +primitive=Body Double +id=294682 +rarity=R +[/card] +[card] +primitive=Chainer's Edict +id=294683 +rarity=U +[/card] +[card] +primitive=Devil's Play +id=294684 +rarity=R +[/card] +[card] +primitive=Enchantress's Presence +id=294685 +rarity=R +[/card] +[card] +primitive=Gempalm Incinerator +id=294686 +rarity=U +[/card] +[card] +primitive=Gempalm Polluter +id=294687 +rarity=C +[/card] +[card] +primitive=Honden of Cleansing Fire +id=294688 +rarity=U +[/card] +[card] +primitive=Honden of Infinite Rage +id=294689 +rarity=U +[/card] +[card] +primitive=Honden of Life's Web +id=294690 +rarity=U +[/card] +[card] +primitive=Honden of Night's Reach +id=294691 +rarity=U +[/card] +[card] +primitive=Honden of Seeing Winds +id=294692 +rarity=U +[/card] +[card] +primitive=Krosan Tusker +id=294693 +rarity=C +[/card] +[card] +primitive=Momentary Blink +id=294694 +rarity=C +[/card] +[card] +primitive=Maze's End +id=294695 +rarity=M +[/card] +[card] +primitive=Mirari's Wake +id=294696 +rarity=R +[/card] +[card] +primitive=Ratchet Bomb +id=294697 +rarity=R +[/card] +[card] +primitive=Roar of the Wurm +id=294698 +rarity=U +[/card] +[card] +primitive=Silent Departure +id=294699 +rarity=C +[/card] +[card] +primitive=Swan Song +id=294700 +rarity=R +[/card] +[card] +primitive=Timely Reinforcements +id=294701 +rarity=U +[/card] +[card] +primitive=Tectonic Reformation +id=294702 +rarity=R +[/card] +[card] +primitive=Tempered Steel +id=294703 +rarity=R +[/card] +[card] +primitive=Unburial Rites +id=294704 +rarity=U +[/card] +[card] +primitive=Ulamog, the Ceaseless Hunger +id=294705 +rarity=M +[/card] +[card] +primitive=Phyrexian Obliterator +id=294706 +rarity=M +[/card] diff --git a/projects/mtg/bin/Res/sets/IKO/_cards.dat b/projects/mtg/bin/Res/sets/IKO/_cards.dat new file mode 100644 index 000000000..d3364c9f0 --- /dev/null +++ b/projects/mtg/bin/Res/sets/IKO/_cards.dat @@ -0,0 +1,1456 @@ +[meta] +author=Wagic Team +name=Ikoria: Lair of Behemoths +year=2020-04-24 +total=290 +[/meta] +[card] +primitive=Beast Tru +id=-479733 +rarity=T +[/card] +[card] +primitive=Cat Bird Sky +id=-479727 +rarity=T +[/card] +[card] +primitive=Dinosaur Beast Qua +id=-479721 +rarity=T +[/card] +[card] +primitive=Human Soldier Gen +id=-479708 +rarity=T +[/card] +[card] +primitive=Beast Viv +id=-479695 +rarity=T +[/card] +[card] +primitive=Dinosaur For +id=-47963911 +rarity=T +[/card] +[card] +primitive=Human Soldier For +id=-479639 +rarity=T +[/card] +[card] +primitive=Feather Eve +id=-479634 +rarity=T +[/card] +[card] +primitive=Human Soldier Nig +id=-479618 +rarity=T +[/card] +[card] +primitive=Human Soldier Bas +id=-479593 +rarity=T +[/card] +[card] +primitive=Shark +id=-479587 +rarity=T +[/card] +[card] +primitive=Kraken Omi +id=-479581 +rarity=T +[/card] +[card] +primitive=Human Soldier Val +id=-479556 +rarity=T +[/card] +[card] +primitive=Human Soldier Gar +id=-479534 +rarity=T +[/card] +[card] +primitive=Human Soldier Day +id=-479528 +rarity=T +[/card] +[card] +primitive=Cat Cub +id=-479527 +rarity=T +[/card] +[card] +primitive=Adaptive Shimmerer +id=479521 +rarity=C +[/card] +[card] +primitive=Farfinder +id=479522 +rarity=C +[/card] +[card] +primitive=Mysterious Egg +id=479523 +rarity=C +[/card] +[card] +primitive=Blade Banish +id=479524 +rarity=C +[/card] +[card] +primitive=Checkpoint Officer +id=479525 +rarity=C +[/card] +[card] +primitive=Coordinated Charge +id=479526 +rarity=C +[/card] +[card] +primitive=Cubwarden +id=479527 +rarity=R +[/card] +[card] +primitive=Daysquad Marshal +id=479528 +rarity=C +[/card] +[card] +primitive=Divine Arrow +id=479529 +rarity=C +[/card] +[card] +primitive=Drannith Healer +id=479530 +rarity=C +[/card] +[card] +primitive=Drannith Magistrate +id=479531 +rarity=R +[/card] +[card] +primitive=Fight as One +id=479532 +rarity=U +[/card] +[card] +primitive=Flourishing Fox +id=479533 +rarity=U +[/card] +[card] +primitive=Garrison Cat +id=479534 +rarity=C +[/card] +[card] +primitive=Helica Glider +id=479535 +rarity=C +[/card] +[card] +primitive=Huntmaster Liger +id=479536 +rarity=U +[/card] +[card] +primitive=Imposing Vantasaur +id=479537 +rarity=C +[/card] +[card] +primitive=Keensight Mentor +id=479538 +rarity=U +[/card] +[card] +primitive=Lavabrink Venturer +id=479539 +rarity=R +[/card] +[card] +primitive=Light of Hope +id=479540 +rarity=C +[/card] +[card] +primitive=Luminous Broodmoth +id=479541 +rarity=M +[/card] +[card] +primitive=Majestic Auricorn +id=479542 +rarity=U +[/card] +[card] +primitive=Maned Serval +id=479543 +rarity=C +[/card] +[card] +primitive=Mythos of Snapdax +id=479544 +rarity=R +[/card] +[card] +primitive=Pacifism +id=479545 +rarity=C +[/card] +[card] +primitive=Patagia Tiger +id=479546 +rarity=C +[/card] +[card] +primitive=Perimeter Sergeant +id=479547 +rarity=C +[/card] +[card] +primitive=Sanctuary Lockdown +id=479548 +rarity=U +[/card] +[card] +primitive=Savai Sabertooth +id=479549 +rarity=C +[/card] +[card] +primitive=Snare Tactician +id=479550 +rarity=C +[/card] +[card] +primitive=Solid Footing +id=479551 +rarity=C +[/card] +[card] +primitive=Splendor Mare +id=479552 +rarity=U +[/card] +[card] +primitive=Spontaneous Flight +id=479553 +rarity=C +[/card] +[card] +primitive=Stormwild Capridor +id=479554 +rarity=U +[/card] +[card] +primitive=Swallow Whole +id=479555 +rarity=U +[/card] +[card] +primitive=Valiant Rescuer +id=479556 +rarity=U +[/card] +[card] +primitive=Vulpikeet +id=479557 +rarity=C +[/card] +[card] +primitive=Will of the All-Hunter +id=479558 +rarity=U +[/card] +[card] +primitive=Aegis Turtle +id=479559 +rarity=C +[/card] +[card] +primitive=Anticipate +id=479560 +rarity=C +[/card] +[card] +primitive=Archipelagore +id=479561 +rarity=U +[/card] +[card] +primitive=Avian Oddity +id=479562 +rarity=U +[/card] +[card] +primitive=Boon of the Wish-Giver +id=479563 +rarity=U +[/card] +[card] +primitive=Capture Sphere +id=479564 +rarity=C +[/card] +[card] +primitive=Convolute +id=479565 +rarity=C +[/card] +[card] +primitive=Crystacean +id=479566 +rarity=C +[/card] +[card] +primitive=Dreamtail Heron +id=479567 +rarity=C +[/card] +[card] +primitive=Escape Protocol +id=479568 +rarity=U +[/card] +[card] +primitive=Essence Scatter +id=479569 +rarity=C +[/card] +[card] +primitive=Facet Reader +id=479570 +rarity=C +[/card] +[card] +primitive=Frost Lynx +id=479571 +rarity=C +[/card] +[card] +primitive=Frostveil Ambush +id=479572 +rarity=C +[/card] +[card] +primitive=Glimmerbell +id=479573 +rarity=C +[/card] +[card] +primitive=Gust of Wind +id=479574 +rarity=C +[/card] +[card] +primitive=Hampering Snare +id=479575 +rarity=C +[/card] +[card] +primitive=Keep Safe +id=479576 +rarity=C +[/card] +[card] +primitive=Mystic Subdual +id=479577 +rarity=U +[/card] +[card] +primitive=Mythos of Illuna +id=479578 +rarity=R +[/card] +[card] +primitive=Neutralize +id=479579 +rarity=U +[/card] +[card] +primitive=Of One Mind +id=479580 +rarity=C +[/card] +[card] +primitive=Ominous Seas +id=479581 +rarity=U +[/card] +[card] +primitive=Phase Dolphin +id=479582 +rarity=C +[/card] +[card] +primitive=Pollywog Symbiote +id=479583 +rarity=U +[/card] +[card] +primitive=Pouncing Shoreshark +id=479584 +rarity=U +[/card] +[card] +primitive=Reconnaissance Mission +id=479585 +rarity=U +[/card] +[card] +primitive=Sea-Dasher Octopus +id=479586 +rarity=R +[/card] +[card] +primitive=Shark Typhoon +id=479587 +rarity=R +[/card] +[card] +primitive=Startling Development +id=479588 +rarity=C +[/card] +[card] +primitive=Thieving Otter +id=479589 +rarity=C +[/card] +[card] +primitive=Voracious Greatshark +id=479590 +rarity=R +[/card] +[card] +primitive=Wingfold Pteron +id=479591 +rarity=C +[/card] +[card] +primitive=Wingspan Mentor +id=479592 +rarity=U +[/card] +[card] +primitive=Bastion of Remembrance +id=479593 +rarity=U +[/card] +[card] +primitive=Blitz Leech +id=479594 +rarity=C +[/card] +[card] +primitive=Blood Curdle +id=479595 +rarity=C +[/card] +[card] +primitive=Boot Nipper +id=479596 +rarity=C +[/card] +[card] +primitive=Bushmeat Poacher +id=479597 +rarity=C +[/card] +[card] +primitive=Call of the Death-Dweller +id=479598 +rarity=U +[/card] +[card] +primitive=Cavern Whisperer +id=479599 +rarity=C +[/card] +[card] +primitive=Chittering Harvester +id=479600 +rarity=U +[/card] +[card] +primitive=Corpse Churn +id=479601 +rarity=C +[/card] +[card] +primitive=Dark Bargain +id=479602 +rarity=C +[/card] +[card] +primitive=Dead Weight +id=479603 +rarity=C +[/card] +[card] +primitive=Dirge Bat +id=479604 +rarity=R +[/card] +[card] +primitive=Durable Coilbug +id=479605 +rarity=C +[/card] +[card] +primitive=Duskfang Mentor +id=479606 +rarity=U +[/card] +[card] +primitive=Easy Prey +id=479607 +rarity=U +[/card] +[card] +primitive=Extinction Event +id=479608 +rarity=R +[/card] +[card] +primitive=Gloom Pangolin +id=479609 +rarity=C +[/card] +[card] +primitive=Grimdancer +id=479610 +rarity=U +[/card] +[card] +primitive=Heartless Act +id=479611 +rarity=U +[/card] +[card] +primitive=Hunted Nightmare +id=479612 +rarity=R +[/card] +[card] +primitive=Insatiable Hemophage +id=479613 +rarity=U +[/card] +[card] +primitive=Lurking Deadeye +id=479614 +rarity=C +[/card] +[card] +primitive=Memory Leak +id=479615 +rarity=C +[/card] +[card] +primitive=Mutual Destruction +id=479616 +rarity=C +[/card] +[card] +primitive=Mythos of Nethroi +id=479617 +rarity=R +[/card] +[card] +primitive=Nightsquad Commando +id=479618 +rarity=C +[/card] +[card] +primitive=Serrated Scorpion +id=479619 +rarity=C +[/card] +[card] +primitive=Suffocating Fumes +id=479620 +rarity=C +[/card] +[card] +primitive=Unbreakable Bond +id=479621 +rarity=U +[/card] +[card] +primitive=Unexpected Fangs +id=479622 +rarity=C +[/card] +[card] +primitive=Unlikely Aid +id=479623 +rarity=C +[/card] +[card] +primitive=Void Beckoner +id=479624 +rarity=U +[/card] +[card] +primitive=Whisper Squad +id=479625 +rarity=C +[/card] +[card] +primitive=Zagoth Mamba +id=479626 +rarity=U +[/card] +[card] +primitive=Blazing Volley +id=479627 +rarity=C +[/card] +[card] +primitive=Blisterspit Gremlin +id=479628 +rarity=C +[/card] +[card] +primitive=Blitz of the Thunder-Raptor +id=479629 +rarity=U +[/card] +[card] +primitive=Cathartic Reunion +id=479630 +rarity=C +[/card] +[card] +primitive=Clash of Titans +id=479631 +rarity=U +[/card] +[card] +primitive=Cloudpiercer +id=479632 +rarity=C +[/card] +[card] +primitive=Drannith Stinger +id=479633 +rarity=C +[/card] +[card] +primitive=Everquill Phoenix +id=479634 +rarity=R +[/card] +[card] +primitive=Ferocious Tigorilla +id=479635 +rarity=C +[/card] +[card] +primitive=Fire Prophecy +id=479636 +rarity=C +[/card] +[card] +primitive=Flame Spill +id=479637 +rarity=U +[/card] +[card] +primitive=Footfall Crater +id=479638 +rarity=U +[/card] +[card] +primitive=Forbidden Friendship +id=479639 +rarity=C +[/card] +[card] +primitive=Frenzied Raptor +id=479640 +rarity=C +[/card] +[card] +primitive=Frillscare Mentor +id=479641 +rarity=U +[/card] +[card] +primitive=Go for Blood +id=479642 +rarity=C +[/card] +[card] +primitive=Heightened Reflexes +id=479643 +rarity=C +[/card] +[card] +primitive=Lava Serpent +id=479644 +rarity=C +[/card] +[card] +primitive=Lukka, Coppercoat Outcast +id=479645 +rarity=M +[/card] +[card] +primitive=Momentum Rumbler +id=479646 +rarity=U +[/card] +[card] +primitive=Mythos of Vadrok +id=479647 +rarity=R +[/card] +[card] +primitive=Porcuparrot +id=479648 +rarity=U +[/card] +[card] +primitive=Prickly Marmoset +id=479649 +rarity=C +[/card] +[card] +primitive=Pyroceratops +id=479650 +rarity=C +[/card] +[card] +primitive=Raking Claws +id=479651 +rarity=C +[/card] +[card] +primitive=Reptilian Reflection +id=479652 +rarity=U +[/card] +[card] +primitive=Rooting Moloch +id=479653 +rarity=U +[/card] +[card] +primitive=Rumbling Rockslide +id=479654 +rarity=C +[/card] +[card] +primitive=Sanctuary Smasher +id=479655 +rarity=U +[/card] +[card] +primitive=Shredded Sails +id=479656 +rarity=C +[/card] +[card] +primitive=Spelleater Wolverine +id=479657 +rarity=C +[/card] +[card] +primitive=Tentative Connection +id=479658 +rarity=C +[/card] +[card] +primitive=Unpredictable Cyclone +id=479659 +rarity=R +[/card] +[card] +primitive=Weaponize the Monsters +id=479660 +rarity=U +[/card] +[card] +primitive=Yidaro, Wandering Monster +id=479661 +rarity=R +[/card] +[card] +primitive=Adventurous Impulse +id=479662 +rarity=C +[/card] +[card] +primitive=Almighty Brushwagg +id=479663 +rarity=C +[/card] +[card] +primitive=Auspicious Starrix +id=479664 +rarity=U +[/card] +[card] +primitive=Barrier Breach +id=479665 +rarity=U +[/card] +[card] +primitive=Bristling Boar +id=479666 +rarity=C +[/card] +[card] +primitive=Charge of the Forever-Beast +id=479667 +rarity=U +[/card] +[card] +primitive=Colossification +id=479668 +rarity=R +[/card] +[card] +primitive=Essence Symbiote +id=479669 +rarity=C +[/card] +[card] +primitive=Excavation Mole +id=479670 +rarity=C +[/card] +[card] +primitive=Exuberant Wolfbear +id=479671 +rarity=U +[/card] +[card] +primitive=Fertilid +id=479672 +rarity=C +[/card] +[card] +primitive=Flycatcher Giraffid +id=479673 +rarity=C +[/card] +[card] +primitive=Fully Grown +id=479674 +rarity=C +[/card] +[card] +primitive=Gemrazer +id=479675 +rarity=R +[/card] +[card] +primitive=Glowstone Recluse +id=479676 +rarity=U +[/card] +[card] +primitive=Greater Sandwurm +id=479677 +rarity=C +[/card] +[card] +primitive=Honey Mammoth +id=479678 +rarity=C +[/card] +[card] +primitive=Hornbash Mentor +id=479679 +rarity=U +[/card] +[card] +primitive=Humble Naturalist +id=479680 +rarity=C +[/card] +[card] +primitive=Ivy Elemental +id=479681 +rarity=U +[/card] +[card] +primitive=Kogla, the Titan Ape +id=479682 +rarity=R +[/card] +[card] +primitive=Lead the Stampede +id=479683 +rarity=U +[/card] +[card] +primitive=Migration Path +id=479684 +rarity=U +[/card] +[card] +primitive=Migratory Greathorn +id=479685 +rarity=C +[/card] +[card] +primitive=Monstrous Step +id=479686 +rarity=U +[/card] +[card] +primitive=Mosscoat Goriak +id=479687 +rarity=C +[/card] +[card] +primitive=Mythos of Brokkos +id=479688 +rarity=R +[/card] +[card] +primitive=Plummet +id=479689 +rarity=C +[/card] +[card] +primitive=Ram Through +id=479690 +rarity=C +[/card] +[card] +primitive=Sudden Spinnerets +id=479691 +rarity=C +[/card] +[card] +primitive=Survivors' Bond +id=479692 +rarity=C +[/card] +[card] +primitive=Thwart the Enemy +id=479693 +rarity=C +[/card] +[card] +primitive=Titanoth Rex +id=479694 +rarity=U +[/card] +[card] +primitive=Vivien, Monsters' Advocate +id=479695 +rarity=M +[/card] +[card] +primitive=Wilt +id=479696 +rarity=C +[/card] +[card] +primitive=Back for More +id=479697 +rarity=U +[/card] +[card] +primitive=Boneyard Lurker +id=479698 +rarity=U +[/card] +[card] +primitive=Brokkos, Apex of Forever +id=479699 +rarity=M +[/card] +[card] +primitive=Channeled Force +id=479700 +rarity=U +[/card] +[card] +primitive=Chevill, Bane of Monsters +id=479701 +rarity=M +[/card] +[card] +primitive=Death's Oasis +id=479702 +rarity=R +[/card] +[card] +primitive=Dire Tactics +id=479703 +rarity=U +[/card] +[card] +primitive=Eerie Ultimatum +id=479704 +rarity=R +[/card] +[card] +primitive=Emergent Ultimatum +id=479705 +rarity=R +[/card] +[card] +primitive=Frondland Felidar +id=479706 +rarity=R +[/card] +[card] +primitive=General Kudro of Drannith +id=479707 +rarity=M +[/card] +[card] +primitive=General's Enforcer +id=479708 +rarity=U +[/card] +[card] +primitive=Genesis Ultimatum +id=479709 +rarity=R +[/card] +[card] +primitive=Illuna, Apex of Wishes +id=479710 +rarity=M +[/card] +[card] +primitive=Inspired Ultimatum +id=479711 +rarity=R +[/card] +[card] +primitive=Kinnan, Bonder Prodigy +id=479712 +rarity=M +[/card] +[card] +primitive=Labyrinth Raptor +id=479713 +rarity=R +[/card] +[card] +primitive=Lore Drakkis +id=479714 +rarity=U +[/card] +[card] +primitive=Narset of the Ancient Way +id=479715 +rarity=M +[/card] +[card] +primitive=Necropanther +id=479716 +rarity=U +[/card] +[card] +primitive=Nethroi, Apex of Death +id=479717 +rarity=M +[/card] +[card] +primitive=Offspring's Revenge +id=479718 +rarity=R +[/card] +[card] +primitive=Parcelbeast +id=479719 +rarity=U +[/card] +[card] +primitive=Primal Empathy +id=479720 +rarity=U +[/card] +[card] +primitive=Quartzwood Crasher +id=479721 +rarity=R +[/card] +[card] +primitive=Regal Leosaur +id=479722 +rarity=U +[/card] +[card] +primitive=Rielle, the Everwise +id=479723 +rarity=M +[/card] +[card] +primitive=Ruinous Ultimatum +id=479724 +rarity=R +[/card] +[card] +primitive=Savai Thundermane +id=479725 +rarity=U +[/card] +[card] +primitive=Skull Prophet +id=479726 +rarity=U +[/card] +[card] +primitive=Skycat Sovereign +id=479727 +rarity=R +[/card] +[card] +primitive=Slitherwisp +id=479728 +rarity=R +[/card] +[card] +primitive=Snapdax, Apex of the Hunt +id=479729 +rarity=M +[/card] +[card] +primitive=Song of Creation +id=479730 +rarity=R +[/card] +[card] +primitive=Sprite Dragon +id=479731 +rarity=U +[/card] +[card] +primitive=Titans' Nest +id=479732 +rarity=R +[/card] +[card] +primitive=Trumpeting Gnarr +id=479733 +rarity=U +[/card] +[card] +primitive=Vadrok, Apex of Thunder +id=479734 +rarity=M +[/card] +[card] +primitive=Whirlwind of Thought +id=479735 +rarity=R +[/card] +[card] +primitive=Winota, Joiner of Forces +id=479736 +rarity=M +[/card] +[card] +primitive=Zenith Flare +id=479737 +rarity=U +[/card] +[card] +primitive=Alert Heedbonder +id=479738 +rarity=U +[/card] +[card] +primitive=Cunning Nightbonder +id=479739 +rarity=U +[/card] +[card] +primitive=Fiend Artisan +id=479740 +rarity=M +[/card] +[card] +primitive=Gyruda, Doom of Depths +id=479741 +rarity=R +[/card] +[card] +primitive=Jegantha, the Wellspring +id=479742 +rarity=R +[/card] +[card] +primitive=Jubilant Skybonder +id=479743 +rarity=U +[/card] +[card] +primitive=Kaheera, the Orphanguard +id=479744 +rarity=R +[/card] +[card] +primitive=Keruga, the Macrosage +id=479745 +rarity=R +[/card] +[card] +primitive=Lurrus of the Dream-Den +id=479746 +rarity=R +[/card] +[card] +primitive=Lutri, the Spellchaser +id=479747 +rarity=R +[/card] +[card] +primitive=Obosh, the Preypiercer +id=479748 +rarity=R +[/card] +[card] +primitive=Proud Wildbonder +id=479749 +rarity=U +[/card] +[card] +primitive=Sonorous Howlbonder +id=479750 +rarity=U +[/card] +[card] +primitive=Umori, the Collector +id=479751 +rarity=R +[/card] +[card] +primitive=Yorion, Sky Nomad +id=479752 +rarity=R +[/card] +[card] +primitive=Zirda, the Dawnwaker +id=479753 +rarity=R +[/card] +[card] +primitive=Crystalline Giant +id=479754 +rarity=R +[/card] +[card] +primitive=Indatha Crystal +id=479755 +rarity=U +[/card] +[card] +primitive=Ketria Crystal +id=479756 +rarity=U +[/card] +[card] +primitive=The Ozolith +id=479757 +rarity=R +[/card] +[card] +primitive=Raugrin Crystal +id=479758 +rarity=U +[/card] +[card] +primitive=Savai Crystal +id=479759 +rarity=U +[/card] +[card] +primitive=Sleeper Dart +id=479760 +rarity=C +[/card] +[card] +primitive=Springjaw Trap +id=479761 +rarity=C +[/card] +[card] +primitive=Zagoth Crystal +id=479762 +rarity=U +[/card] +[card] +primitive=Bloodfell Caves +id=479763 +rarity=C +[/card] +[card] +primitive=Blossoming Sands +id=479764 +rarity=C +[/card] +[card] +primitive=Bonders' Enclave +id=479765 +rarity=R +[/card] +[card] +primitive=Dismal Backwater +id=479766 +rarity=C +[/card] +[card] +primitive=Evolving Wilds +id=479767 +rarity=C +[/card] +[card] +primitive=Indatha Triome +id=479768 +rarity=R +[/card] +[card] +primitive=Jungle Hollow +id=479769 +rarity=C +[/card] +[card] +primitive=Ketria Triome +id=479770 +rarity=R +[/card] +[card] +primitive=Raugrin Triome +id=479771 +rarity=R +[/card] +[card] +primitive=Rugged Highlands +id=479772 +rarity=C +[/card] +[card] +primitive=Savai Triome +id=479773 +rarity=R +[/card] +[card] +primitive=Scoured Barrens +id=479774 +rarity=C +[/card] +[card] +primitive=Swiftwater Cliffs +id=479775 +rarity=C +[/card] +[card] +primitive=Thornwood Falls +id=479776 +rarity=C +[/card] +[card] +primitive=Tranquil Cove +id=479777 +rarity=C +[/card] +[card] +primitive=Wind-Scarred Crag +id=479778 +rarity=C +[/card] +[card] +primitive=Zagoth Triome +id=479779 +rarity=R +[/card] +[card] +primitive=Plains +id=482535 +rarity=C +[/card] +[card] +primitive=Plains +id=482536 +rarity=C +[/card] +[card] +primitive=Plains +id=482537 +rarity=C +[/card] +[card] +primitive=Island +id=482538 +rarity=C +[/card] +[card] +primitive=Island +id=482539 +rarity=C +[/card] +[card] +primitive=Island +id=482540 +rarity=C +[/card] +[card] +primitive=Swamp +id=482541 +rarity=C +[/card] +[card] +primitive=Swamp +id=482542 +rarity=C +[/card] +[card] +primitive=Swamp +id=482543 +rarity=C +[/card] +[card] +primitive=Mountain +id=482544 +rarity=C +[/card] +[card] +primitive=Mountain +id=482545 +rarity=C +[/card] +[card] +primitive=Mountain +id=482546 +rarity=C +[/card] +[card] +primitive=Forest +id=482547 +rarity=C +[/card] +[card] +primitive=Forest +id=482548 +rarity=C +[/card] +[card] +primitive=Forest +id=482549 +rarity=C +[/card] \ No newline at end of file diff --git a/projects/mtg/bin/Res/sets/JOU/_cards.dat b/projects/mtg/bin/Res/sets/JOU/_cards.dat index 476ee11f6..4940e604e 100644 --- a/projects/mtg/bin/Res/sets/JOU/_cards.dat +++ b/projects/mtg/bin/Res/sets/JOU/_cards.dat @@ -2,7 +2,7 @@ author=Wagic Team name=Journey into Nyx block=Theros -year=2014 +year=2014-05-02 total=165 [/meta] [card] diff --git a/projects/mtg/bin/Res/sets/JVV/_cards.dat b/projects/mtg/bin/Res/sets/JVV/_cards.dat index a716cfaec..ef948539e 100644 --- a/projects/mtg/bin/Res/sets/JVV/_cards.dat +++ b/projects/mtg/bin/Res/sets/JVV/_cards.dat @@ -2,7 +2,7 @@ author=Wagic Team name=Duel Decks: Jace vs. Vraska block=Duel -year=2014 +year=2014-03-14 total=88 [/meta] [card] diff --git a/projects/mtg/bin/Res/sets/KTK/_cards.dat b/projects/mtg/bin/Res/sets/KTK/_cards.dat index 7b0d31c12..1f28a4149 100644 --- a/projects/mtg/bin/Res/sets/KTK/_cards.dat +++ b/projects/mtg/bin/Res/sets/KTK/_cards.dat @@ -2,7 +2,7 @@ author=Wagic Team name=Khans of Tarkir block=Khans of Tarkir -year=2014 +year=2014-09-26 total=269 [/meta] [card] diff --git a/projects/mtg/bin/Res/sets/M15/_cards.dat b/projects/mtg/bin/Res/sets/M15/_cards.dat index 61b037e1b..f40a2dccc 100644 --- a/projects/mtg/bin/Res/sets/M15/_cards.dat +++ b/projects/mtg/bin/Res/sets/M15/_cards.dat @@ -1,7 +1,7 @@ [meta] author=Wagic Team name=Magic 2015 Core Set -year=2014 +year=2014-07-18 total=284 [/meta] [card] diff --git a/projects/mtg/bin/Res/sets/TD2/_cards.dat b/projects/mtg/bin/Res/sets/TD2/_cards.dat index ab5d0fe32..733f78956 100644 --- a/projects/mtg/bin/Res/sets/TD2/_cards.dat +++ b/projects/mtg/bin/Res/sets/TD2/_cards.dat @@ -117,7 +117,7 @@ rarity=U [card] primitive=Dispatch id=16672 -rarityU +rarity=U [/card] [card] primitive=Steelshaper's Gift diff --git a/projects/mtg/bin/Res/sets/V14/_cards.dat b/projects/mtg/bin/Res/sets/V14/_cards.dat index e7ceeee6e..08d926415 100644 --- a/projects/mtg/bin/Res/sets/V14/_cards.dat +++ b/projects/mtg/bin/Res/sets/V14/_cards.dat @@ -2,7 +2,7 @@ author=Wagic Team name=From the Vault: Annihilation block=Vault -year=2014 +year=2014-08-22 total=15 [/meta] [card] diff --git a/projects/mtg/bin/Res/sets/primitives/borderline.txt b/projects/mtg/bin/Res/sets/primitives/borderline.txt index 0b9433919..788807cd3 100644 --- a/projects/mtg/bin/Res/sets/primitives/borderline.txt +++ b/projects/mtg/bin/Res/sets/primitives/borderline.txt @@ -1,12 +1,28 @@ #Bordeline Primitives Pack for Wagic the Homebrew. #Please keep these card alphabetized, and try to have the "name=" line at the top of each card -#I sorted this programatically so the other comments are removed except for AUTO_DEFINE - Vitty85 09-05-2020 +#I sorted this programatically - Vitty85 09-06-2020 grade=borderline [card] +name=AEther Tide +target=creature|myhand +auto=reject && target(creature|battlefield) moveTo(ownerhand) +text=As an additional cost to cast AEther Tide, discard X creature cards. -- Return X target creatures to their owners' hands. +mana={X}{U} +type=Sorcery +[/card] +[card] +name=Abandon Hope +auto=reject target(*|myhand) +auto=reject target(*|opponenthand) +text=As an additional cost to cast Abandon Hope, discard X cards. -- Look at target opponent's hand and choose X cards from it. That player discards those cards. +mana={X}{1}{B} +type=Sorcery +[/card] +[card] name=Abominable Treefolk abilities=trample anyzone=type:*[snow]:myBattlefield/type:*[snow]:myBattlefield cdaactive -target(creature|opponentbattlefield) transforms((,newability[tap],newability[frozen])) +auto=target(creature|opponentbattlefield) transforms((,newability[tap],newability[frozen])) text=Trample -- Abominable Treefolk's power and toughness are each equal to the number of snow permanents you control. -- When Abominable Treefolk enters the battlefield, tap target creature an opponent controls. That creature doesn't untap during its controller's next untap step. mana={2}{G}{U} type=Snow Creature @@ -23,6 +39,16 @@ mana={1}{R} type=Instant [/card] [card] +name=Abu Ja'far +auto=@movedto(this|graveyard) from(battlefield):bury all(creature[blocking;blocked]) +text=When Abu Ja'far dies, destroy all creatures blocking or blocked by it. They can't be regenerated. +mana={W} +type=Creature +subtype=Human +power=0 +toughness=1 +[/card] +[card] name=Abu Jafar auto=@movedto(this|graveyard) from(battlefield):bury all(creature[blocking;blocked]) text=When Abu Ja'far dies, destroy all creatures blocking or blocked by it. They can’t be regenerated. @@ -33,6 +59,15 @@ power=0 toughness=1 [/card] [card] +name=Abuna's Chant +other={5}{R} name(Entwine) +auto=ifnot paid(alternative) then transforms((,newability[choice life:5 controller],newability[choice prevent:5 target(creature|battlefield)])) +auto=if paid(alternative) then life:5 controller && prevent:5 target(creature|battlefield) +text=Choose one — You gain 5 life; or prevent the next 5 damage that would be dealt to target creature this turn. -- Entwine {2} (Choose both if you pay the entwine cost.) +mana={3}{W} +type=Instant +[/card] +[card] name=Academy Drake abilities=flying kicker={4} @@ -87,6 +122,15 @@ power=2 toughness=3 [/card] [card] +name=Act of Authority +auto=may (blink) target(artifact,enchantment) +auto=@each my upkeep:choice name(Do Nothing) donothing +auto=@each my upkeep:choice name(Exile and Give Control) (blink) target(artifact,enchantment) && moveto(opponentBattlefield) +text=When Act of Authority enters the battlefield, you may exile target artifact or enchantment. -- At the beginning of your upkeep, you may exile target artifact or enchantment. If you do, its controller gains control of Act of Authority. +mana={1}{W}{W} +type=Enchantment +[/card] +[card] name=Act of Heroism target=creature auto=untap @@ -123,6 +167,28 @@ text=(Transforms from Legion's Landing.) -- {T}: Add {W} to your mana pool. -- { type=Legendary Land [/card] [card] +name=Adaptive Shimmerer +abilities=flash +auto=counter(1/1.3) +text=Flash -- Adaptive Shimmerer enters the battlefield with three +1/+1 counters on it. +mana={5} +type=Creature +subtype=Insect +power=0 +toughness=0 +[/card] +[card] +name=Adarkar Unicorn +auto={T}:Add{U} +auto={T}:Add{1}{U} +text={T}: Add {U} or {1}{U} to your mana pool. Spend this mana only to pay cumulative upkeep costs. +mana={1}{W}{W} +type=Creature +subtype=Unicorn +power=2 +toughness=2 +[/card] +[card] name=Adeliz, the Cinder Wind abilities=flying, haste auto=@movedTo(instant,sorcery|mystack): all(wizard|myBattlefield)) +1/+1 ueot @@ -183,6 +249,14 @@ mana={G} type=Sorcery [/card] [card] +name=Aegis Turtle +mana={U} +type=Creature +subtype=Turtle +power=0 +toughness=5 +[/card] +[card] name=Aegis of the Heavens target=creature auto=+1/+7 @@ -222,6 +296,18 @@ power=2 toughness=2 [/card] [card] +name=Aerial Volley +target=creature[flying] +auto=damage:1 +auto=damage:1 target(creature[flying]) +auto=ability$!name(damage) choice target(creature[flying]) damage:1!$ controller +auto=ability$!name(damage) choice target(creature[flying]) damage:1!$ controller +auto=ability$!name(damage) choice target(creature[flying]) damage:1!$ controller +text=Aerial Volley deals 3 damage divided as you choose among one, two, or three target creatures with flying. +mana={G} +type=Instant +[/card] +[card] name=Aeromunculus abilities=flying auto=this(counter{1/1}<1) {2}{G}{U}:counter(1/1) @@ -233,6 +319,14 @@ power=2 toughness=3 [/card] [card] +name=Aether Gust +target=*[red;green]|battlefield,stack +auto=transforms((,newability[Choice name(Top) moveto(library)],newability[Choice name(Bottom) bottomoflibrary])) controller +text=Choose target spell or permanent that's red or green. Its owner puts it on the top or bottom of their library. +mana={1}{U} +type=Instant +[/card] +[card] name=Aether Storm auto=maxCast(creature)0 opponent auto=maxCast(creature)0 controller @@ -263,6 +357,18 @@ power=3 toughness=3 [/card] [card] +name=Aetherstorm Roc +abilities=flying +auto=alterenergy:1 controller +auto=@combat(attacking) source(this):pay({e:2}) counter(1/1,1) && tap(noevent) target(creature|opponentbattlefield) +text=Flying -- Whenever Aetherstorm Roc or another creature enters the battlefield under your control, you get {E} (an energy counter). -- Whenever Aetherstorm Roc attacks, you may pay {E}{E}. If you do, put a +1/+1 counter on it and tap up to one target creature defending player controls. +mana={2}{W}{W} +type=Creature +subtype=Bird +power=3 +toughness=3 +[/card] +[card] name=Affectionate Indrik auto=may target(creature|opponentbattlefield) dynamicability text=When Affectionate Indrik enters the battlefield, you may have it fight target creature you don't control. (Each deals damage equal to its power to the other.) @@ -366,6 +472,13 @@ power=2 toughness=2 [/card] [card] +name=Aid from the Cowl +auto=@each my endofturn:if revolt then reveal:1 optionone if type(*[-instant;-sorcery]|reveal)~morethan~0 then may moveto(mybattlefield) optiononeend optiontwo name(Put Back On Bottom) target(<1>*|reveal) may bottomoflibrary optiontwoend revealend +text=Revolt — At the beginning of your end step, if a permanent you controlled left the battlefield this turn, reveal the top card of your library. If it's a permanent card, you may put it onto the battlefield. Otherwise, you may put it on the bottom of your library. +mana={3}{G}{G} +type=Enchantment +[/card] +[card] name=Aid the Fallen auto=name(creature and planeswalker) moveTo(ownerHand) target(creature|mygraveyard) and!(may moveTo(ownerHand) target(planeswalker|mygraveyard))! auto=moveTo(ownerHand) target(planeswalker|mygraveyard) @@ -374,6 +487,15 @@ mana={1}{B} type=Sorcery [/card] [card] +name=Ajani's Aid +auto=moveto(myhand) target(Ajani, Valiant Protector|mylibrary) +auto=moveto(myhand) target(Ajani, Valiant Protector|mygraveyard) +auto={S}:target(creature) preventAllCombatDamage to(mytgt) ueot +text=When Ajani's Aid enters the battlefield, you may search your library and/or graveyard for a card named Ajani, Valiant Protector, reveal it, and put it into your hand. If you search your library this way, shuffle it. -- Sacrifice Ajani's Aid: Prevent all combat damage a creature of your choice would deal this turn. +mana={2}{G}{W} +type=Enchantment +[/card] +[card] name=Ajani's Welcome auto=@movedTo(creature|myBattlefield):life:1 text=Whenever a creature enters the battlefield under your control, you gain 1 life. @@ -403,6 +525,28 @@ type=Legendary Planeswalker subtype=Ajani [/card] [card] +name=Ajani, Mentor of Heroes +auto=counter(0/0,4,loyalty) +auto={C(0/0,1,Loyalty)}:name(+1: Distribute counters) ability$!counter(1/1,1) target(creature)!$ controller && ability$!counter(1/1,1) target(creature)!$ controller && ability$!counter(1/1,1) target(creature)!$ controller +auto={C(0/0,1,Loyalty)}:name(+1: Look 4 cards) reveal:4 optionone name(Get a card) target(<1>*[creature;planeswalker;aura]|reveal) moveto(myhand) optiononeend optiontwo name(put on bottom) target(<4>*|reveal) bottomoflibrary optiontwoend revealend +auto={C(0/0,-8,Loyalty)}:name(-8: Earn 100 life) life:100 controller +text=+1: Distribute three +1/+1 counters among one, two, or three target creatures you control. -- +1: Look at the top four cards of your library. You may reveal an Aura, creature, or planeswalker card from among them and put it into your hand. Put the rest on the bottom of your library in any order. -- -8: You gain 100 life. +mana={3}{G}{W} +type=Planeswalker +subtype=Ajani +[/card] +[card] +name=Ajani, Strength of the Pride +auto=counter(0/0,5,loyalty) +auto={C(0/0,1,Loyalty)}:name(+1: Gain Life) life:type:creature:myBattlefield controller && life:type:planeswalkers:myBattlefield controller +auto={C(0/0,-2,Loyalty)}:name(-2: Create Ajani's Pridemate) token(447141) +auto={C(0/0,0,Loyalty)}:name(0: Exile) if compare(lifetotal)~morethan~34 then moveto(exile) all(this) && moveto(exile) all(creature,artifact|opponentbattlefield) +text=+1: You gain life equal to the number of creatures you control plus the number of planeswalkers you control. -- -2: Create a 2/2 white Cat Soldier creature token named Ajani's Pridemate with "Whenever you gain life, put a +1/+1 counter on Ajani's Pridemate." -- 0: If you have at least 15 life more than your starting life total, exile Ajani, Strength of the Pride and each artifact and creature your opponents control. +mana={2}{W}{W} +type=Legendary Planeswalker +subtype=Ajani +[/card] +[card] name=Ajani, the Greathearted auto=counter(0/0,5,loyalty) auto=lord(creature|myBattlefield) vigilance @@ -449,6 +593,25 @@ power=2 toughness=3 [/card] [card] +name=Alert Heedbonder +abilities=vigilance +auto=@each my end:life:type:creature[vigilance]|myBattlefield +text=Vigilance -- At the beginning of your end step, you gain 1 life for each creature you control with vigilance. +mana={1}{GW}{GW} +type=Creature +subtype=Human Scout +power=2 +toughness=4 +[/card] +[card] +name=Alhammarret's Archive +auto=@lifeof(player) except(Alhammarret's Archive): life:thatmuch +auto=replacedraw draw:2 noreplace +text=If you would gain life, you gain twice that much life instead. -- If you would draw a card except the first one you draw in each of your draw steps, draw two cards instead. +mana={5} +type=Legendary Artifact +[/card] +[card] name=Alirios, Enraptured auto=tap(noevent) auto=aslongas(creature[Reflection]|mybattlefield) doesnotuntap @@ -461,6 +624,17 @@ power=2 toughness=3 [/card] [card] +name=Alive // Well +other={W} name(Well) +kicker={W} +auto=if paid (alternative) then life:twicetype:creature:mybattlefield +auto=ifnot paid(alternative) then token(Centaur,Creature Centaur,3/3,green) +auto=kicker ifnot paid(alternative) then life:twicetype:creature:mybattlefield +text=Put a 3/3 green Centaur creature token onto the battlefield. // You gain 2 life for each creature you control. -- Fuse (You may cast one or both halves of this card from your hand.) +mana={3}{G} +type=Sorcery +[/card] +[card] name=All That Glitters target=creature auto=type:*[artifact,enchantment]:mybattlefield/type:*[artifact,enchantment]:mybattlefield nonstatic @@ -470,6 +644,45 @@ type=Enchantment subtype=Aura [/card] [card] +name=Ally Encampment +auto={T}:add{1} +auto={T}:add{U} +auto={T}:add{B} +auto={T}:add{G} +auto={T}:add{R} +auto={T}:add{W} +auto={1}{T}{S}:target(creature[ally]|myBattlefield) moveTo(ownerhand) +text={T}: Add {C} to your mana pool. -- {T}: Add one mana of any color to your mana pool. Spend this mana only to cast an Ally spell. -- {1}, {T}, Sacrifice Ally Encampment: Return target Ally you control to its owner's hand. +type=Land +[/card] +[card] +name=Almighty Brushwagg +abilities=trample +auto={3}{G}:all(this) 3/3 ueot +text=Trample -- {3}{G}: Almighty Brushwagg gets +3/+3 until end of turn. +mana={G} +type=Creature +subtype=Brushwagg +power=1 +toughness=1 +[/card] +[card] +name=Alms +auto={1}:moveto(exile) all(*[zpos=1]|mygraveyard) && prevent:1 target(creature) +text={1}, Exile the top card of your graveyard: Prevent the next 1 damage that would be dealt to target creature this turn. +mana={W} +type=Enchantment +[/card] +[card] +name=Alpha Status +target=creature +auto=teach(creature) foreach(other creature[share!subtype!]|battlefield) 2/2 +text=Enchant creature -- Enchanted creature gets +2/+2 for each other creature on the battlefield that shares a creature type with it. +mana={2}{G} +type=Enchantment +subtype=Aura +[/card] +[card] name=Alpine Guide auto=target(land[mountain]|mylibrary) moveto(myhand) auto=@movedTo(this|nonbattlezone) from(battlefield):target(land[mountain]|mybattlefield) sacrifice @@ -503,6 +716,23 @@ mana={2} type=Artifact [/card] [card] +name=Altar of the Lost +auto=tap(noevent) +auto={T}:Add{W}{B} +auto={T}:Add{W}{R} +auto={T}:Add{W}{G} +auto={T}:Add{W}{U} +auto={T}:Add{B}{R} +auto={T}:Add{B}{G} +auto={T}:Add{B}{U} +auto={T}:Add{R}{G} +auto={T}:Add{R}{U} +auto={T}:Add{U}{G} +text=Altar of the Lost enters the battlefield tapped. -- {T}: Add two mana in any combination of colors to your mana pool. Spend this mana only to cast spells with flashback from a graveyard. +mana={3} +type=Artifact +[/card] +[card] name=Amaranthine Wall abilities=defender auto={2}:indestructible ueot @@ -514,6 +744,16 @@ power=0 toughness=6 [/card] [card] +name=Amateur Auteur +auto={S}:destroy target(enchantment) +text=Sacrifice Amateur Auteur: Destroy target enchantment. +mana={1}{W} +type=Creature +subtype=Human +power=2 +toughness=2 +[/card] +[card] name=Ambuscade target=creature|myBattlefield auto=1/0 @@ -619,6 +859,16 @@ power=12 toughness=12 [/card] [card] +name=Ancient Ziggurat +auto={T}:Add{B} +auto={T}:Add{R} +auto={T}:Add{G} +auto={T}:Add{W} +auto={T}:Add{U} +text={T}: Add one mana of any color to your mana pool. Spend this mana only to cast a creature spell. +type=Land +[/card] +[card] name=Angel Dec abilities=flying type=Creature @@ -653,6 +903,22 @@ power=5 toughness=4 [/card] [card] +name=Angel of Salvation +abilities=flash,flying +other={convoke} name(Convoke) +auto=prevent:1 target(creature,player) +auto=ability$!name(prevent) choice target(creature,player) prevent:1!$ controller +auto=ability$!name(prevent) choice target(creature,player) prevent:1!$ controller +auto=ability$!name(prevent) choice target(creature,player) prevent:1!$ controller +auto=ability$!name(prevent) choice target(creature,player) prevent:1!$ controller +text=Flash; convoke (Each creature you tap while casting this spell reduces its cost by {1} or by one mana of that creature's color.) -- Flying -- When Angel of Salvation enters the battlefield, prevent the next 5 damage that would be dealt this turn to any number of target creatures and/or players, divided as you choose. +mana={6}{W}{W} +type=Creature +subtype=Angel +power=5 +toughness=5 +[/card] +[card] name=Angel of Sanctions abilities=flying auto=may (blink)forsrc target(*[-land]|opponentbattlefield) @@ -729,6 +995,17 @@ type=Enchantment subtype=Aura [/card] [card] +name=Angelic Rocket +abilities=flying +auto=may destroy target(*[-land]) +text=Flying -- When this creature enters the battlefield, you may destroy target nonland permanent. +mana={8} +type=Host Artifact Creature +subtype=Angel +power=4 +toughness=4 +[/card] +[card] name=Angler Drake abilities=flying auto=may moveto(ownerhand) target(creature) @@ -762,7 +1039,7 @@ toughness=3 [/card] [card] name=Angrath's Marauders -auto=@damaged(creature,player,planeswalker):damage:thatmuch all(trigger[to]) +auto=@damaged(creature,player,planeswalker) once:damage:thatmuch all(trigger[to]) text=If a source you control would deal damage to a permanent or player, it deals double that damage to that permanent or player instead. mana={5}{R}{R} type=Creature @@ -792,19 +1069,30 @@ subtype=Angrath [/card] [card] name=Animating Faerie // Bring to Life -abilities=canplayfromexile,flying -target=*[artifact,-creature]|myBattlefield,player +abilities=canplayfromexile,flying,adventure other={2}{U} name(Adventure) -auto=if paid(alternative) then transforms((,newability[counter(1/1,4)],Artifact Creature,setpower=0,settoughness=0)) +auto=if paid(alternative) then target(artifact[-creature]|myBattlefield) transforms((Artifact Creature,newability[counter(1/1.4)])) forever auto=if paid(alternative) then moveto(exile) all(this) text=Flying -- Target noncreature artifact you control becomes a 0/0 artifact creature. Put four +1/+1 counters on it. mana={2}{U} type=Creature -subtype=Faerie Adventure +subtype=Faerie power=2 toughness=2 [/card] [card] +name=Anje Falkenrath +abilities=haste +auto={T}{D(*|myhand)}:draw:1 controller +auto=@movedto(*[madness]|mygraveyard) from(myhand):untap +text=Haste -- {T}, Discard a card: Draw a card. -- Whenever you discard a card, if it has madness, untap Anje Falkenrath. +mana={1}{B}{R} +type=Legendary Creature +subtype=Vampire +power=1 +toughness=3 +[/card] +[card] name=Anje's Ravager abilities=madness,mustattack autoexile=restriction{discarded} pay({1}{r}) name(pay 1R to cast) activate name(pay 1R to cast) castcard(normal)?name(put in graveyard) moveto(ownergraveyard) @@ -853,6 +1141,24 @@ mana={1}{W}{W} type=Enchantment [/card] [card] +name=Anthem of Rakdos +auto=@damage(from) notatarget(*|myBattlefield,myStack,myGraveyard,mySideboard) aslongas(*|myhand) transforms((,newability[@damage:twicethatmuch])) <1 +auto=lord(creature[attacking]|myBattlefield) 2/0 ueot && damage:1 controller +text=Whenever a creature you control attacks, it gets +2/+0 until end of turn and Anthem of Rakdos deals 1 damage to you. -- Hellbent — As long as you have no cards in hand, if a source you control would deal damage to a creature or player, it deals double that damage to that creature or player instead. +mana={2}{B}{R}{R} +type=Enchantment +[/card] +[card] +name=Anti-Magic Aura +target=creature +auto=teach(creature) opponentshroud +auto=teach(creature) cantbetargetof(aura) +text=Enchant creature -- Enchanted creature can't be the target of spells and can't be enchanted. This effect doesn't remove Anti-Magic Aura. +mana={2}{U} +type=Enchantment +subtype=Aura +[/card] +[card] name=Aphemia, the Cacophony abilities=flying auto=@each my endofturn:may moveto(exile) target(enchantment|myGraveyrad) && token(Zombie,Aph) @@ -915,6 +1221,18 @@ mana={3}{U} type=Enchantment [/card] [card] +name=Arachnus Spinner +abilities=reach +aicode=activate moveTo(myBattlefield) target(Arachnus Web|myLibrary) +auto={T(spider|myBattlefield)}:name(search card) reveal:plibrarycount optionone name(choose card) target(Arachnus Web|reveal) moveto(ownerlibrary) and!( becomes(tobecast) ueot )! optiononeend optiontwo name(put back) target(<1>*|reveal) moveto(ownerlibrary) and!( all(*|reveal) moveto(ownerlibrary) and!(shuffle)! )! optiontwoend afterrevealed all(tobecast|mylibrary) moveto(ownerlibrary) and!(activate castcard(putinplay))! afterrevealedend revealend +text=Reach (This creature can block creatures with flying.) -- Tap an untapped Spider you control: Search your graveyard and/or library for a card named Arachnus Web and put it onto the battlefield attached to target creature. If you search your library this way, shuffle it. +mana={5}{G} +type=Creature +subtype=Spider +power=5 +toughness=7 +[/card] +[card] name=Arachnus Web target=creature auto=cantattack @@ -1028,6 +1346,13 @@ type=Enchantment subtype=Aura [/card] [card] +name=Arcane Lighthouse +auto={T}:add{1} +auto={1}{T}: all(creature|opponentbattlefield) -hexproof ueot && all(creature|opponentbattlefield) -shroud ueot +text={T}: Add {C} to your mana pool. -- {1}, {T}: Until end of turn, creatures your opponents control lose hexproof and shroud and can't have hexproof or shroud. +type=Land +[/card] +[card] name=Arcanist's Owl abilities=flying auto=name(look) reveal:4 optionone name(Get an artifact card) target(<1>*[artifact;enchantment]|reveal) moveto(myhand) optiononeend optiontwo name(put on bottom) target(<4>*|reveal) bottomoflibrary optiontwoend revealend @@ -1048,6 +1373,18 @@ text=Ascend (If you control ten or more permanents, you get the city's blessing type=Land [/card] [card] +name=Archangel of Strife +abilities=flying +auto=choice name(War) all(creature|myBattlefield) 3/0 && flipacoin winability all(creature|opponentBattlefield) 3/0 winabilityend loseability all(creature|opponentBattlefield) 0/3 loseabilityend flipend +auto=choice name(Peace) all(creature|myBattlefield) 0/3 && flipacoin winability all(creature|opponentBattlefield) 3/0 winabilityend loseability all(creature|opponentBattlefield) 0/3 loseabilityend flipend +text=Flying -- As Archangel of Strife enters the battlefield, each player chooses war or peace. -- Creatures controlled by players who chose war get +3/+0. -- Creatures controlled by players who chose peace get +0/+3. +mana={5}{W}{W} +type=Creature +subtype=Angel +power=6 +toughness=6 +[/card] +[card] name=Archfiend of Despair abilities=flying,nolifegainopponent auto=@each endofturn:life:-oplifelost opponent @@ -1083,6 +1420,27 @@ power=6 toughness=6 [/card] [card] +name=Archipelagore +abilities=mutate +otherrestriction=type(creature[-human]|mybattlefield)~morethan~0 +auto=@movedTo(mytgt|graveyard) from(battlefield):all(this) moveTo(myGraveyard) +auto=@movedTo(mytgt|hand) from(battlefield):all(this) moveTo(myHand) +auto=@movedTo(mytgt|exile) from(battlefield):all(this) moveTo(myExile) +auto=@movedTo(mytgt|library) from(battlefield):all(this) moveTo(myLibrary) +auto=@movedTo(mytgt|sideboard) from(battlefield):all(this) moveTo(mySideboard) +auto={9999}:equip +other={5}{U} name(Mutate) +auto=transforms((,newability[@mutated(this):name(Tap X creatures) thisforeach(mutations) may target(creature) freeze])) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Over) choice name(Mutate Over) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-deathtouch])) forever all(this) && mutateover target(other creature[-human]|mybattlefield) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Under) choice name(Mutate Under) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-deathtouch])) forever all(this) && mutateunder target(other creature[-human]|mybattlefield) +text=Mutate {5}{U} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- Whenever this creature mutates, tap up to X target creatures, where X is the number of times this creature has mutated. Those creatures don't untap during their controller's next untap step. +mana={5}{U}{U} +type=Creature +subtype=Leviathan +power=7 +toughness=7 +[/card] +[card] name=Archmage's Charm auto=choice name(counter) target(*|stack) fizzle auto=choice name(draw) target(player) draw:2 @@ -1171,6 +1529,16 @@ mana={9999} type=Snow Artifact [/card] [card] +name=Arcum's Weathervane +auto={2}{T}:target(land[snow]) transforms((removetypes,newability[becomes(Land)])) forever +auto={2}{T}:target(land[basic,snow]) transforms((removetypes,newability[becomes(Basic Land)])) forever +auto={2}{T}:target(land[legendary,snow]) transforms((removetypes,newability[becomes(Legendary Land)])) forever +auto={2}{T}:target(land[basic,-snow]) transforms((Snow)) forever +text={2}, {T}: Target snow land is no longer snow. -- {2}, {T}: Target nonsnow basic land becomes snow. +mana={2} +type=Artifact +[/card] +[card] name=Ardenvale Paladin other={1}{W}{W}{W} name(Adamant) auto=if paid(alternative) then counter(1/1,1) @@ -1183,15 +1551,15 @@ toughness=5 [/card] [card] name=Ardenvale Tactician // Dizzying Swoop -abilities=canplayfromexile,flying,flash -target=creature|battlefield,player +abilities=canplayfromexile,flying,flash,adventure +restriction=myturnonly other={1}{W} name(Adventure) -auto=if paid(alternative) then tap(noevent) +auto=if paid(alternative) then target(creature|battlefield) tap(noevent) auto=if paid(alternative) then moveto(exile) all(this) text=Flying -- Tap up to two target creatures. (Then exile this card. You may cast the creature later from exile.) mana={1}{W}{W} type=Creature -subtype=Human Knight Adventure +subtype=Human Knight power=2 toughness=3 [/card] @@ -1224,6 +1592,14 @@ mana={1}{B} type=Legendary Enchantment [/card] [card] +name=Aria of Flame +auto=life:10 opponent +auto=@movedTo(instant,sorcery|mystack):counter(0/0,1,Verse) && thisforeach(counter{0/0.1.Verse}) damage:1 target(planeswalker,player) +text=When Aria of Flame enters the battlefield, each opponent gains 10 life. -- Whenever you cast an instant or sorcery spell, put a verse counter on Aria of Flame, then it deals damage equal to the number of verse counters on it to target player or planeswalker. +mana={2}{R} +type=Enchantment +[/card] +[card] name=Arisen Gorgon auto=aslongas(planeswalker[liliana]|myBattlefield) deathtouch text=Arisen Gorgon has deathtouch as long as you control a Liliana planeswalker. (Any amount of damage this deals to a creature is enough to destroy it.) @@ -1269,6 +1645,18 @@ type=Legendary Planeswalker subtype=Arlinn [/card] [card] +name=Armed // Dangerous +target=creature +other={3}{G} name(Dangerous) +kicker={3}{G} +auto=if paid (alternative) then lure ueot +auto=ifnot paid(alternative) then 1/1 ueot && first strike ueot +auto=kicker ifnot paid(alternative) then lure ueot +text=Target creature gets +1/+1 and gains double strike until end of turn. // All creatures able to block target creature this turn do so. -- Fuse (You may cast one or both halves of this card from your hand.) +mana={1}{R} +type=Sorcery +[/card] +[card] name=Armored Whirl Turtle mana={2}{U} type=Creature @@ -1295,6 +1683,30 @@ mana={W} type=Instant [/card] [card] +name=Arrow Storm +target=creature,player +auto=ifnot raid then damage:4 +auto=if raid then damage:5 +text=Arrow Storm deals 4 damage to target creature or player. -- Raid — If you attacked with a creature this turn, instead Arrow Storm deals 5 damage to that creature or player and the damage can't be prevented. +mana={3}{R}{R} +type=Sorcery +[/card] +[card] +name=Arrow Volley Trap +other={1}{W} +target=creature[attacking]|battlefield +auto=damage:1 +auto=damage:1 target(creature[attacking]|battlefield) +auto=ability$!name(damage) choice target(creature[attacking]|battlefield) damage:1!$ controller +auto=ability$!name(damage) choice target(creature[attacking]|battlefield) damage:1!$ controller +auto=ability$!name(damage) choice target(creature[attacking]|battlefield) damage:1!$ controller +otherrestriction=type(creature[attacking]|battlefield)~morethan~3 +text=If four or more creatures are attacking, you may pay {1}{W} rather than pay Arrow Volley Trap's mana cost. -- Arrow Volley Trap deals 5 damage divided as you choose among any number of target attacking creatures. +mana={3}{W}{W} +type=Instant +subtype=Trap +[/card] +[card] name=Arterial Flow auto=ability$!name(discard 2 cards) target(*|myhand) reject!$ opponent auto=aslongas(vampire|myBattlefield) life:-2 opponent @@ -1456,6 +1868,15 @@ mana={B}{G} type=Instant [/card] [card] +name=Assault // Battery +other={3}{G} name(Battery) +auto=if paid (alternative) then token(Elephant,creature elephant, 3/3,green) +auto=ifnot paid(alternative) then damage:2 target(creature,player) +text=Assault deals 2 damage to target creature or player. // Put a 3/3 green Elephant creature token onto the battlefield. +mana={R} +type=Sorcery +[/card] +[card] name=Astral Cornucopia auto=kicker counter(0/0,kicked,Charge) auto={T}:name(Add X white mana) thisforeach(counter{0/0,1,Charge}) add{W} @@ -1585,6 +2006,29 @@ power=2 toughness=5 [/card] [card] +name=Auriok Siege Sled +auto={1}:setblocker target(creature[artifact]) +auto={1}:target(creature) cantbeblockerof(this) ueot +text={1}: Target artifact creature blocks Auriok Siege Sled this turn if able. -- {1}: Target artifact creature can't block Auriok Siege Sled this turn. +mana={6} +type=Artifact Creature +subtype=Juggernaut +power=3 +toughness=5 +[/card] +[card] +name=Auriok Steelshaper +auto=lord(*[Equipment]|mycastingzone) altercost(colorless,-1) +auto=this(gear > 0) lord(creature[Soldier]|myBattlefield) 1/1 +auto=this(gear > 0) lord(creature[Knight]|myBattlefield) 1/1 +text=Equip costs you pay cost {1} less. -- As long as Auriok Steelshaper is equipped, Soldier and/or Knight creatures you control get +1/+1. +mana={1}{W} +type=Creature +subtype=Human Soldier +power=1 +toughness=1 +[/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. @@ -1595,6 +2039,28 @@ power=3 toughness=2 [/card] [card] +name=Auspicious Starrix +abilities=mutate +otherrestriction=type(creature[-human]|mybattlefield)~morethan~0 +auto=@movedTo(mytgt|graveyard) from(battlefield):all(this) moveTo(myGraveyard) +auto=@movedTo(mytgt|hand) from(battlefield):all(this) moveTo(myHand) +auto=@movedTo(mytgt|exile) from(battlefield):all(this) moveTo(myExile) +auto=@movedTo(mytgt|library) from(battlefield):all(this) moveTo(myLibrary) +auto=@movedTo(mytgt|sideboard) from(battlefield):all(this) moveTo(mySideboard) +auto={9999}:equip +other={5}{G} name(Mutate) +auto=transforms((,newability[@mutated(this):thisforeach(mutations) ability$!name(Reveal) reveal:1 optionone name(Exile top card) target(<1>*[sorcery;instant]|myreveal) moveto(myexile) optiononeend optiontwo name(Play exiled card) target(<1>*[-sorcery;-instant]|myreveal) activate castcard(normal) optiontwoend revealend!$ controller])) +auto=ifnot paid(alternative) then transforms((,newability[becomes(,,green)])) forever all(this) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Over) choice name(Mutate Over) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)])) forever all(this) && mutateover target(other creature[-human]|mybattlefield) && transforms((,newability[becomes(,,green)])) forever +auto=if paid(alternative) then name(Mutate Under) this(mutations<1) name(Mutate Under) choice name(Mutate Under) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)])) forever all(this) && mutateunder target(other creature[-human]|mybattlefield) +text=Mutate {5}{G} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- Whenever this creature mutates, exile cards from the top of your library until you exile X permanent cards, where X is the number of times this creature has mutated. Put those permanent cards onto the battlefield. +mana={4}{G} +type=Creature +subtype=Elk Beast +power=6 +toughness=6 +[/card] +[card] name=Autumn Willow abilities=opponentshroud,shroud auto={G}:-shroud @@ -1607,6 +2073,16 @@ power=4 toughness=4 [/card] [card] +name=Avalanche Tusker +auto=@combat(attacking) source(this):setblocker target(creature|opponentbattlefield) +text=Whenever Avalanche Tusker attacks, target creature defending player controls blocks it this combat if able. +mana={2}{G}{U}{R} +type=Creature +subtype=Elephant Warrior +power=6 +toughness=4 +[/card] +[card] name=Avatar of Growth abilities=Trample anyzone=changecost(colorless:-1) @@ -1699,7 +2175,7 @@ toughness=3 [card] name=Avenging Huntbonder abilities=Double Strike -auto=@combat(attacking) source(this):newability[counter(0/0,1,Double Strike) && (double strike)forever target(other creature[attacking])] +auto=@combat(attacking) source(this):transforms((,newability[counter(0/0,1,Double Strike)],newability[this(counter{0/0.1.Double Strike}>=1) double strike])) target(other creature[attacking]) text=Double strike -- Whenever Avenging Huntbonder attacks, put a double strike counter on another target attacking creature. mana={3}{W}{W} type=Creature @@ -1708,6 +2184,18 @@ power=3 toughness=3 [/card] [card] +name=Avian Oddity +abilities=flying +autohand=__CYCLING__({2}{U}) +autohand=@cycled(this|myHand):transforms((,newability[counter(0/0,1,Flying],newability[this(counter{0/0.1.Flying}>=1) flying target(creature|myBattlefield)])) +text=Flying -- Cycling {2}{U} ({2}{U}, Discard this card: Draw a card.) -- When you cycle Avian Oddity, put a flying counter on target creature you control. +mana={3}{U} +type=Creature +subtype=Bird +power=2 +toughness=4 +[/card] +[card] name=Aviation Pioneer auto=create(thopter artifact:creature thopter artifact:1/1:colorless:flying) text=When Aviation Pioneer enters the battlefield, create a 1/1 colorless Thopter artifact creature token with flying. @@ -1729,6 +2217,14 @@ power=2 toughness=2 [/card] [card] +name=Avoid Fate +target=instant,*[aura]|opponentstack +auto=fizzle +text=Counter target instant or Aura spell that targets a permanent you control. +mana={G} +type=Instant +[/card] +[card] name=Awaken the Sky Tyrant auto=@damageof(player) from(*|opponentstack,opponentbattlefield,opponentgraveyard,opponenthand,opponentexile,opponentsideboard):ability$!name(Create a 5/5 red Dragon) [S(this)]:token(Dragon,Creature Dragon,5/5,red,flying) text=When a source an opponent controls deals damage to you, sacrifice Awaken the Sky Tyrant. If you do, create a 5/5 red Dragon creature token with flying. @@ -1839,7 +2335,7 @@ toughness=2 [/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 +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 @@ -1859,6 +2355,15 @@ power=3 toughness=3 [/card] [card] +name=Back for More +target=creature|myGraveyard +auto=moveTo(myBattlefield) +auto=transforms((,newablility[target(creature|opponentBattlefield) dynamicability])) ueot +text=Return target creature card from your graveyard to the battlefield. When you do, it fights up to one target creature you don't control. (Each deals damage equal to its power to the other.) +mana={4}{B}{G} +type=Instant +[/card] +[card] name=Backdraft Hellkite abilities=flying auto=@combat(attacking) all(instant,sorcery|mygraveyard) tempflashback ueot @@ -1870,7 +2375,7 @@ power=4 toughness=4 [/card] [card] -name=Baffling End +name=Baffling End auto=target(creature[manacost<=3]|opponentbattlefield) moveto(exile) auto=@movedTo(this|nonbattlezone) from(battlefield): token(Dinosaur,creature Dinosaur,3/3,green,trample) opponent text=When Baffling End enters the battlefield, exile target creature an opponent controls with converted mana cost 3 or less. -- When Baffling End leaves the battlefield, target opponent creates a 3/3 green Dinosaur creature token with trample. @@ -1939,6 +2444,15 @@ mana={2}{G} type=Instant [/card] [card] +name=Banefire +target=creature,player +auto=this(X>4) nofizzle +auto=damage:X +text=Banefire deals X damage to target creature or player. -- If X is 5 or more, Banefire can't be countered by spells or abilities and the damage can't be prevented. +mana={X}{R} +type=Sorcery +[/card] +[card] name=Banehound abilities=lifelink,haste text=Lifelink, haste @@ -1976,6 +2490,36 @@ mana={S(creature|myBattlefield)}{S(creature|myBattlefield)}{1}{B} type=Sorcery [/card] [card] +name=Barbed Lightning +target=player +other={4}{R} name(Entwine) +auto=ifnot paid(alternative) then transforms((,newability[choice damage:3],newability[choice damage:3 target(creature)])) +auto=if paid(alternative) then damage:3 && damage:3 target(creature) +text=Choose one — Barbed Lightning deals 3 damage to target creature; or Barbed Lightning deals 3 damage to target player. -- Entwine {2} (Choose both if you pay the entwine cost.) +mana={2}{R} +type=Instant +[/card] +[card] +name=Barbed Wire +auto=@each opponent upkeep:damage:1 opponent +auto=@each my upkeep:damage:1 controller +auto=@each opponent upkeep:pay({2}) prevent:1 target(player) limit:1 +auto=@each my upkeep:pay({2}) prevent:1 target(player) limit:1 +text=At the beginning of each player's upkeep, Barbed Wire deals 1 damage to that player. -- {2}: Prevent the next 1 damage that would be dealt by Barbed Wire this turn. +mana={3} +type=Artifact +[/card] +[card] +name=Barbed-Back Wurm +auto={B}:-1/-1 target(creature[green,blocking]) ueot +text={B}: Target green creature blocking Barbed-Back Wurm gets -1/-1 until end of turn. +mana={4}{B} +type=Creature +subtype=Wurm +power=4 +toughness=3 +[/card] +[card] name=Barge In auto=target(creature[attacking]) 2/2 ueot auto=all(creature[-human,attacking]) trample ueot @@ -2006,6 +2550,15 @@ power=2 toughness=2 [/card] [card] +name=Barrier Breach +target= enchantment +auto=moveTo(exile) +autohand=__CLYCLING__({2}) +text=Exile up to three target enchantments. -- Cycling {2} ({2}, Discard this card: Draw a card.) +mana={2}{G} +type=Instant +[/card] +[card] name=Barrier of Bones abilities=defender aicode=name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=1]|mylibrary) moverandom(*[zpos<=1]) from(mylibrary) to(mylibrary)])) ueot @@ -2018,6 +2571,15 @@ power=0 toughness=3 [/card] [card] +name=Barrin's Spite +target=creature +auto=destroy +auto=moveto(ownerhand) target(creature) +text=Choose two target creatures controlled by the same player. Their controller chooses and sacrifices one of them. Return the other to its owner's hand. +mana={2}{U}{B} +type=Sorcery +[/card] +[card] name=Barrow Witches auto=moveto(myhand) target(creature[knight]|mygraveyard) text=When Barrow Witches enters the battlefield, return target Knight card from your graveyard to your hand. @@ -2060,6 +2622,25 @@ power=3 toughness=4 [/card] [card] +name=Bastion Protector +auto=all(creature[commander]) 2/2 +auto=all(creature[commander]) indestructible +text=Commander creatures you control get +2/+2 and have indestructible. +mana={2}{W} +type=Creature +subtype=Human Soldier +power=3 +toughness=3 +[/card] +[card] +name=Bastion of Remembrance +auto=token(Human Soldier Bas) +auto=@moveTo(creature|myGraveyard) from(myBattlefield):life:-1 opponent && life:1 controller +text=When Bastion of Remembrance enters the battlefield, create a 1/1 white Human Soldier creature token. -- Whenever a creature you control dies, each opponent loses 1 life and you gain 1 life. +mana={2}{B} +type=Enchantment +[/card] +[card] name=Battalion Foot Soldier auto=may moveto(myhand) target(Battalion Foot Soldier|mylibrary) text=When Battalion Foot Soldier enters the battlefield, you may search your library for any number of cards named Battalion Foot Soldier, reveal them, put them into your hand, then shuffle your library. @@ -2070,6 +2651,16 @@ power=2 toughness=2 [/card] [card] +name=Battle at the Bridge +target=creature +other={improvise} name(Improvise) +auto=life:X controller +auto=-X/-X ueot +text=Improvise (Your artifacts can help cast this spell. Each artifact you tap after you're done activating mana abilities pays for {1}.) -- Target creature gets -X/-X until end of turn. You gain X life. +mana={X}{B} +type=Sorcery +[/card] +[card] name=Battlefield Promotion target=creature auto=counter(1/1) @@ -2091,6 +2682,38 @@ power=2 toughness=2 [/card] [card] +name=Battlefield Scrounger +auto={0}{restriction type(*|mygraveyard)~morethan~6}:bottomoflibrary target(<3>*|mygraveyard) && 3/3 ueot limit:1 +text=Threshold — Put three cards from your graveyard on the bottom of your library: Battlefield Scrounger gets +3/+3 until end of turn. Activate this ability only once each turn, and only if seven or more cards are in your graveyard. +mana={3}{G}{G} +type=Creature +subtype=Centaur +power=3 +toughness=3 +[/card] +[card] +name=Battlefield Thaumaturge +auto=lord(instant,sorcery|myhand) altercost(colorless,-1) +auto=@targeted(this) from(*[instant;sorcery;enchantment]|mycastingzone):hexproof ueot +text=Each instant and sorcery spell you cast costs {1} less to cast for each creature it targets. -- Heroic — Whenever you cast a spell that targets Battlefield Thaumaturge, Battlefield Thaumaturge gains hexproof until end of turn. +mana={1}{U} +type=Creature +subtype=Human Wizard +power=2 +toughness=1 +[/card] +[card] +name=Battletide Alchemist +auto=@damaged(player) from(*|opponentbattlefield,opponentstack,opponenthand,opponentgraveyard,opponentlibrary,opponentexile]):may foreach(cleric|mybattlefield) prevent:1 controller +auto=@damaged(player) from(*|mybattlefield,mystack,myhand,mygraveyard,mylibrary,myexile]):may foreach(cleric|mybattlefield) prevent:1 opponent +text=If a source would deal damage to a player, you may prevent X of that damage, where X is the number of Clerics you control. +mana={3}{W}{W} +type=Creature +subtype=Kithkin Cleric +power=3 +toughness=4 +[/card] +[card] name=Bazaar Trademage abilities=flying auto=draw:2 && transforms((,newability[target(<3>*|myhand) reject])) forever @@ -2103,16 +2726,15 @@ toughness=4 [/card] [card] name=Beanstalk Giant // Fertile Footsteps -abilities=canplayfromexile -target=land[basic]|mylibrary +abilities=canplayfromexile,adventure other={2}{G} name(Adventure) anyzone=type:land:myBattlefield/type:land:myBattlefield cdaactive -auto=if paid(alternative) then moveto(mybattlefield) +auto=if paid(alternative) then target(land[basic]|mylibrary) moveto(mybattlefield) auto=if paid(alternative) then moveto(exile) all(this) text=Beanstalk Giant's power and toughness are each equal to the number of lands you control. -- Search your library for a basic land card, put it onto the battlefield, then shuffle your library. (Then exile this card. You may cast the creature later from exile.) mana={6}{G} type=Creature -subtype=Giant Adventure +subtype=Giant power=* toughness=* [/card] @@ -2141,7 +2763,7 @@ name=Beast Hun type=Creature subtype=Beast power=4 -toughnss=4 +toughness=4 color=green [/card] [card] @@ -2149,7 +2771,29 @@ name=Beast Saw type=Creature subtype=Beast power=3 -toughnss=3 +toughness=3 +color=green +[/card] +[card] +name=Beast Tru +type=Creature +subttype=Beast +power=3 +toughness=3 +color=green +[/card] +[card] +name=Beast Viv +auto=this(counter{0/0.1.Vigilance}>=1) vigilance +auto=this(counter{0/0.1.Reach}>=1) reach +auto=this(counter{0/0.1.Trample}>=1) trample +auto=choice name(Vigilance) counter(0/0,1,Vigilance) +auto=choice name(Reach) counter(0/0,1,Reach) +auto=choice name(Trample) counter(0/0,1,Trample) +type=Creature +subttype=Beast +power=3 +toughness=3 color=green [/card] [card] @@ -2171,6 +2815,42 @@ toughness=3 color=green [/card] [card] +name=Beast in Show +abilities=trample +text=Trample +mana={4}{G}{G} +type=Creature +subtype=Beast +power=6 +toughness=4 +[/card] +[card] +name=Beastcaller Savant +abilities=haste +auto={T}:add{W} +auto={T}:add{G} +auto={T}:add{B} +auto={T}:add{U} +auto={T}:add{R} +text=Haste -- {T}: Add one mana of any color to your mana pool. Spend this mana only to cast a creature spell. +mana={1}{G} +type=Creature +subtype=Elf Shaman Ally +power=1 +toughness=1 +[/card] +[card] +name=Beck // Call +other={4}{W}{U} name(Call) +kicker={4}{W}{U} +auto=if paid (alternative) then create(Bird:Creature Bird:1/1:white:flying)*4 +auto=ifnot paid(alternative) then may draw:1 +auto=kicker ifnot paid(alternative) then create(Bird:Creature Bird:1/1:white:flying)*4 +text=Whenever a creature enters the battlefield this turn, you may draw a card. // Put four 1/1 white Bird creature tokens with flying onto the battlefield. -- -- Fuse (You may cast one or both halves of this card from your hand.) +mana={G}{U} +type=Sorcery +[/card] +[card] name=Bedevil target=artifact,creature,planeswalker auto=destroy @@ -2259,6 +2939,16 @@ power=3 toughness=3 [/card] [card] +name=Benalish Missionary +auto={1}{W}{T}:name(prevent all combat damage from target creature) donothing target(creature[blocked]) && fog from(mytgt)fog from(mytgt) oneshot +text={1}{W}, {T}: Prevent all combat damage that would be dealt by target blocked creature this turn. +mana={W} +type=Creature +subtype=Human Cleric +power=1 +toughness=1 +[/card] +[card] name=Beneath the Sands auto=moveto(mybattlefield) target(land[basic]|mylibrary) and!(tap(noevent))! autohand=__CYCLING__({2}) @@ -2300,6 +2990,24 @@ power=2 toughness=4 [/card] [card] +name=Besmirch +target=creature +auto=moveto(mybattlefield) and!(transforms((,newability[phaseaction[endofturn sourceinplay] moveTo(previousbattlefield)],newability[untap],haste,mustattack)) ueot)! +text=Until end of turn, gain control of target creature and it gains haste. Untap and goad that creature. (Until your next turn, that creature attacks each combat if able and attacks a player other than you if able.) +mana={1}{R}{R} +type=Sorcery +[/card] +[card] +name=Betrayal of Flesh +target=creature +other={S(land|myBattlefield)}{S(land|myBattlefield)}{S(land|myBattlefield)} name(Entwine) +auto=if paid(alternative) then destroy && moveTo(myBattlefield) target(creature|mygraveyard) +auto=ifnot paid(alternative) then transforms((,newability[choice name(Destroy) destroy],newability[choice name(Return) moveTo(myBattlefield) target(creature|mygraveyard)])) +text=Choose one — Destroy target creature; or return target creature card from your graveyard to the battlefield. -- Entwine—Sacrifice three lands. (Choose both if you pay the entwine cost.) +mana={5}{B} +type=Instant +[/card] +[card] name=Binding Mummy auto=@movedto(other zombie|mybattlefield):may tap target(artifact,creature) text=Whenever another Zombie enters the battlefield under your control, you may tap target artifact or creature. @@ -2339,7 +3047,7 @@ abilities=flying type=Creature subtype=Bird power=1 -toughnss=1 +toughness=1 color=white [/card] [card] @@ -2434,6 +3142,14 @@ power=3 toughness=1 [/card] [card] +name=Blade Banish +target=creature[power>=4] +auto=moveTo(exile) +text=Exile target creature with power 4 or greater. +mana={3}{W} +type=Instant +[/card] +[card] name=Blade Instructor auto=_MENTOR_ text=Mentor (Whenever this creature attacks, put a +1/+1 counter on target attacking creature with lesser power.) @@ -2524,6 +3240,17 @@ mana={W} type=Instant [/card] [card] +name=Blazing Torch +auto={1}:equip +auto=teach(creature) cantbeblockedby(creature[Zombie]) +auto=teach(creature) cantbeblockedby(creature[Vampire]) +auto=teach(creature) {T}{S(Blazing Torch)}:damage:2 target(player,creature) +text=Equipped creature can't be blocked by Vampires or Zombies. -- Equipped creature has "{T}, Sacrifice Blazing Torch: Blazing Torch deals 2 damage to target creature or player." -- Equip {1} ({1}: Attach to target creature you control. Equip only as a sorcery.) +mana={1} +type=Artifact +subtype=Equipment +[/card] +[card] name=Blazing Volley auto=damage:1 all(creature|opponentbattlefield) text=Blazing Volley deals 1 damage to each creature your opponents control. @@ -2564,7 +3291,8 @@ type=Instant name=Blessed Reincarnation target=creature|opponentbattlefield auto=moveto(exile) and!( transforms((,newability[Reveal:1 revealzone(mylibrary) revealuntil(creature|mylibrary) optionone all(creature|reveal) moveto(mybattlefield) optiononeend optiontwo all(*|myreveal) bottomoflibrary optiontwoend revealend])) oneshot )! -auto=if rebound then moveto(exile) and!( transforms((,newability[@rebounded:may activate castcard(normal)])) forever )! +auto=if rebound then moveto(exile) +autoexile=@rebounded:may activate castcard(normal) text=Exile target creature an opponent controls. That player reveals cards from the top of his or her library until a creature card is revealed. The player puts that card onto the battlefield, then shuffles the rest into his or her library. -- Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) mana={3}{U} type=Instant @@ -2631,6 +3359,16 @@ mana={2}{R} type=Instant [/card] [card] +name=Blinding Beam +target=player +other={3}{W} name(Entwine) +auto=if paid(alternative) then target(<2>creature) tap(noevent) && lord(creature|targetedpersonsbattlefield) frozen +auto=ifnot paid(alternative) then transforms((,newability[choice target(<2>creature) tap(noevent)],newability[choice lord(creature|targetedpersonsbattlefield) frozen])) +text=Choose one — Tap two target creatures; or creatures don't untap during target player's next untap step. -- Entwine {1} (Choose both if you pay the entwine cost.) +mana={2}{W} +type=Instant +[/card] +[card] name=Blinding Fog auto=preventalldamage to(creature) auto=all(creature|mybattlefield) opponentshroud @@ -2656,6 +3394,35 @@ mana={1}{U} type=Instant [/card] [card] +name=Blisterspit Gremlin +auto={1}{T}:damage:1 opponent +auto=@moveTo(*[-creature]|myStak):untap(this) +text={1}, {T}: Blisterspit Gremlin deals 1 damage to each opponent. -- Whenever you cast a noncreature spell, untap Blisterspit Gremlin. +mana={R} +type=Creature +subtype=Gremlin +power=1 +toughness=1 +[/card] +[card] +name=Blitz Leech +abilities=flash +auto=-2/-2 target(creature|opponentbattlefield) ueot && removeallcounters(all) +text=Flash -- When Blitz Leech enters the battlefield, target creature an opponent controls gets -2/-2 until end of turn. Remove all counters from that creature. +mana={5}{B} +type=Creature +subtype=Leech +power=5 +toughness=2 +[/card] +[card] +name=Blitz of the Thunder-Raptor +auto=foreach(*[instant,sorcery]|myGraveyard)) damage:1 target(creature,player,planeswalker) exiledeath +text=Blitz of the Thunder-Raptor deals damage to target creature or planeswalker equal to the number of instant and sorcery cards in your graveyard. If that creature or planeswalker would die this turn, exile it instead. +mana={1}{R} +type=Instant +[/card] +[card] name=Blizzard Strix abilities=flash,flying auto=restriction type(other *[snow]|mybattlefield)~morethan~0 moveTo(exile) target(other *|battlefield) && (blink)ueot target(other *|battlefield) @@ -2688,6 +3455,16 @@ power=2 toughness=2 [/card] [card] +name=Blood Curdle +target=creature +auto=destroy +auto=counter(0/0,1,Menace) +auto=transforms((,newability[this(counter{0/0.1.Menace}>=1) menace])) +text=Destroy target creature. Put a menace counter on a creature you control. (It can't be blocked except by two or more creatures.) +mana={3}{B} +type=Instant +[/card] +[card] name=Blood Divination auto=draw:3 text=As an additional cost to cast this spell, sacrifice a creature. -- Draw three cards. @@ -2978,6 +3755,14 @@ mana={2}{R} type=Instant [/card] [card] +name=Bond of Agony +auto=life:-X controller +auto=life:-X opponent +text=As an additional cost to cast Bond of Agony, pay X life. -- Each other player loses X life. +mana={X}{B} +type=Sorcery +[/card] +[card] name=Bond of Discipline auto=all(creature|opponentBattlefield) tap auto=all(creature|myBattlefield) lifelink @@ -3044,6 +3829,12 @@ mana={3} type=Artifact [/card] [card] +name=Bonders' Enclave +auto={3}{T} restriction{type(creature[power>=4]|mybattlefield)~morethan~0}:draw:1 controller +text={T}: Add {1}. -- {3}, {T}: Draw a card. Activate this ability only if you control a creature with power 4 or greater. +type=Land +[/card] +[card] name=Bone Dragon abilities=flying auto={3}{B}{B}:moveto(exile) notatarget(<7>*|mygraveyard):moveto(myBattlefield) && tap @@ -3089,21 +3880,42 @@ toughness=3 [/card] [card] name=Bonecrusher Giant // Stomp -abilities=canplayfromexile,flash -target=player,creature,planeswalker +abilities=canplayfromexile,flash,adventure +restriction=myturnonly other={1}{R} name(Adventure) #MISSING: damage can't be prevented -auto=if paid(alternative) then damage:2 +auto=if paid(alternative) then ability$! name(2 damages to player) choice name(2 damages to player) damage:2 target(player) _ choice name(2 damages to planeswalker) damage:2 target(planeswalker) _ choice name(2 damages to creature) damage:2 target(creature) !$ controller auto=if paid(alternative) then moveto(exile) all(this) auto=@targeted(this):damage:2 opponent text=Whenever Bonecrusher Giant becomes the target of a spell, Bonecrusher Giant deals 2 damage to that spell's controller. -- Damage can't be prevented this turn. Stomp deals 2 damage to any target. mana={2}{R} type=Creature -subtype=Giant Adventure +subtype=Giant power=4 toughness=3 [/card] [card] +name=Boneyard Lurker +abilities=mutate +otherrestriction=type(creature[-human]|mybattlefield)~morethan~0 +auto=@movedTo(mytgt|graveyard) from(battlefield):all(this) moveTo(myGraveyard) +auto=@movedTo(mytgt|hand) from(battlefield):all(this) moveTo(myHand) +auto=@movedTo(mytgt|exile) from(battlefield):all(this) moveTo(myExile) +auto=@movedTo(mytgt|library) from(battlefield):all(this) moveTo(myLibrary) +auto=@movedTo(mytgt|sideboard) from(battlefield):all(this) moveTo(mySideboard) +auto={9999}:equip +other={2}{BG}{BG} name(Mutate) +auto=transforms((,newability[@mutated(this):moveto(myhand) target(*|mygraveyard)])) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Over) choice name(Mutate Over) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)])) forever all(this) && mutateover target(other creature[-human]|mybattlefield) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Under) choice name(Mutate Under) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)])) forever all(this) && mutateunder target(other creature[-human]|mybattlefield) +text=Mutate {2}{BG}{BG} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- Whenever this creature mutates, return target permanent card from your graveyard to your hand. +mana={2}{B}{G} +type=Creature +subtype=Nightmare Beast +power=4 +toughness=4 +[/card] +[card] name=Boneyard Mycodrax anyzone=type:creature:myGraveyard/type:creature:myGraveyard cdaactive autograveyard={4}{G}{G}{E}:name(scavenge) counter(1/1,type:creature:myGraveyard) target(creature) asSorcery @@ -3174,6 +3986,44 @@ power=4 toughness=5 [/card] [card] +name=Boom // Bust +target=land|myBattlefield +other={5}{R} name(Bust) +auto=if paid(alternative) then destroy all(land) +auto=ifnot paid(alternative) then destroy && target(land|opponentBattlefield) destroy +text=Destroy target land you control and target land you don't control. // Destroy all lands. +mana={1}{R} +type=Sorcery +[/card] +[card] +name=Boon Reflection +auto=@lifeof(player) except(Boon Reflection): life:thatmuch +text=If you would gain life, you gain twice that much life instead. +mana={4}{W} +type=Enchantment +[/card] +[card] +name=Boon of the Wish-Giver +auto=draw:4 controller +autohand=__CYCLING__({1}) +text=Draw four cards. -- Cycling {1} ({1}, Discard this card: Draw a card.) +mana={4}{U}{U} +type=Sorcery +[/card] +[card] +name=Boot Nipper +auto=this(counter{0/0.1.Deathtouch}>=1) deathtouch +auto=this(counter{0/0.1.Lifelink}>=1) lifelink +auto=choice name(Deathtouch) counter(0/0,1,Deathtouch) +auto=choice name(Lifelink) counter(0/0,1,Lifelink) +text=Boot Nipper enters the battlefield with your choice of a deathtouch counter or a lifelink counter on it. +mana={1}{B} +type=Creature +subtype=Beast +power=2 +toughness=1 +[/card] +[card] name=Boreal Elemental abilities=flying auto=@targeted(this) from(opponentstack):add{2} opponent @@ -3229,6 +4079,13 @@ mana={B} type=Instant [/card] [card] +name=Boseiju, Who Shelters All +auto=tap(noevent) +auto={T}{L:2}:add{1} && target(*|mystack) nofizzle +text=Boseiju, Who Shelters All enters the battlefield tapped. -- {T}, Pay 2 life: Add {1} to your mana pool. If that mana is spent on an instant or sorcery spell, that spell can't be countered by spells or abilities. +type=Legendary Land +[/card] +[card] name=Bountiful Promenade auto=tap(noevent) auto={T}:Add{G} @@ -3311,6 +4168,16 @@ power=6 toughness=6 [/card] [card] +name=Branching Bolt +target=creature +other={1}{R}{R} name(Both) +auto=if paid(alternative) then damage:3 && damage:3 target(creature[flying]) +auto=ifnot paid(alternative) then transforms((,newability[choice name(Damage Non-Flying) damage:3],newability[choice name(Damage Flying) target(creature[flying] damage:3])) +text=Choose one or both — Branching Bolt deals 3 damage to target creature with flying; and/or Branching Bolt deals 3 damage to target creature without flying. +mana={1}{R}{G} +type=Instant +[/card] +[card] name=Brass's Bounty auto=foreach(land|mybattlefield) token(Treasure,Artifact) and!( transforms((,newability[{T}{S}:Add{W}])(,newability[{T}{S}:Add{R}])(,newability[{T}{S}:Add{G}])(,newability[{T}{S}:Add{U}])(,newability[{T}{S}:Add{B}])) forever )! text=For each land you control, create a Treasure token. (It’s an artifact with “{T}, Sacrifice this artifact: Add one mana of any color.”) @@ -3318,6 +4185,13 @@ mana={6}{R} type=Sorcery [/card] [card] +name=Brave the Sands +auto=lord(creature|myBattlefield) vigilance +text=Creatures you control have vigilance. -- Each creature you control can block an additional creature each combat. +mana={1}{W} +type=Enchantment +[/card] +[card] name=Brawl-Bash Ogre abilities=menace auto=@combat(attacking) source(this):may {S(other creature|mybattlefield)} 2/2 ueot @@ -3330,15 +4204,14 @@ toughness=3 [/card] [card] name=Brazen Borrower // Petty Theft -abilities=canplayfromexile,flash,flying,cloud -target=*[-land]|opponentbattlefield,player +abilities=canplayfromexile,flash,flying,cloud,adventure other={1}{U} name(Adventure) -auto=if paid(alternative) then moveTo(ownerHand) +auto=if paid(alternative) then target(*[-land]|opponentbattlefield) moveTo(ownerHand) auto=if paid(alternative) then moveto(exile) all(this) text=Flash -- Flying -- Brazen Borrower can block only creatures with flying. -- Return target nonland permanent an opponent controls to its owner's hand. mana={1}{U}{U} type=Creature -subtype=Faerie Rogue Adventure +subtype=Faerie Rogue power=3 toughness=1 [/card] @@ -3412,6 +4285,18 @@ power=3 toughness=4 [/card] [card] +name=Brimaz, King of Oreskos +abilities=vigilance +auto=@combat(attacking) source(this):token(Cat Soldier,Creature Cat Soldier,1/1,white,vigilance,battleready) controller +auto=@combat(blocking) source(this) from(creature|opponentbattlefield):token(Cat Soldier,Creature Cat Soldier,1/1,white,vigilance) controller +text=Vigilance -- Whenever Brimaz, King of Oreskos attacks, put a 1/1 white Cat Soldier creature token with vigilance onto the battlefield attacking. -- Whenever Brimaz blocks a creature, put a 1/1 white Cat Soldier creature token with vigilance onto the battlefield blocking that creature. +mana={1}{W}{W} +type=Legendary Creature +subtype=Cat Soldier +power=3 +toughness=4 +[/card] +[card] name=Brimstone Trebuchet text=defender,reach auto={T}:damage:1 opponent @@ -3480,10 +4365,50 @@ mana={1}{G} type=Sorcery [/card] [card] +name=Broken Visage +target=creature[attacking,-artifact] +auto=destroy && token(Spirit,Creature Spirit,storedpower/storedtoughness,black,treason) +text=Destroy target nonartifact attacking creature. It can't be regenerated. Put a black Spirit creature token with that creature's power and toughness onto the battlefield. Sacrifice the token at the beginning of the next end step. +mana={4}{B} +type=Instant +[/card] +[card] +name=Brokkos, Apex of Forever +abilities=trample,mutate +otherrestriction=type(creature[-human]|mybattlefield)~morethan~0 +auto=@movedTo(mytgt|graveyard) from(battlefield):all(this) moveTo(myGraveyard) +auto=@movedTo(mytgt|hand) from(battlefield):all(this) moveTo(myHand) +auto=@movedTo(mytgt|exile) from(battlefield):all(this) moveTo(myExile) +auto=@movedTo(mytgt|library) from(battlefield):all(this) moveTo(myLibrary) +auto=@movedTo(mytgt|sideboard) from(battlefield):all(this) moveTo(mySideboard) +auto={9999}:equip +other={2}{UB}{G}{G} name(Mutate) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Over) choice name(Mutate Over) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-trample])) forever all(this) && mutateover target(other creature[-human]|mybattlefield) && transforms((,newability[trample])) forever +auto=if paid(alternative) then name(Mutate Under) this(mutations<1) name(Mutate Under) choice name(Mutate Under) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-trample])) forever all(this) && mutateunder target(other creature[-human]|mybattlefield) && transforms((,newability[trample])) forever +autograveyard={2}{UB}{G}{G}:name(Mutate from graveyard) activate castcard(alternative) +text=Mutate {2}{UB}{G}{G} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- Trample -- You may cast Brokkos, Apex of Forever from your graveyard using its mutate ability. +mana={2}{B}{G}{U} +type=Legendary Creature +subtype=Nightmare Beast Elemental +power=6 +toughness=6 +[/card] +[card] +name=Bronze Horse +abilities=trample +auto=aslongas(creature|myBattlefield)~morethan~1 preventalldamage to(this) from(*|myStack,opponentStack) +text=Trample -- As long as you control another creature, prevent all damage that would be dealt to Bronze Horse by spells that target it. +mana={7} +type=Artifact Creature +subtype=Horse +power=4 +toughness=4 +[/card] +[card] name=Bronze Sword auto={3}:equip auto=teach(creature) 2/0 -text=Equipped creature gets +2/+0. -- Equip 3 ( 3 : Attach to target creature you control. Equip only as a sorcery.) +text=Equipped creature gets +2/+0. -- Equip {3} ({3}: Attach to target creature you control. Equip only as a sorcery.) mana={1} type=Artifact subtype=Equipment @@ -3549,6 +4474,16 @@ power=3 toughness=6 [/card] [card] +name=Bumbling Pangolin +auto=may destroy target(artifact) +text=When this creature enters the battlefield, you may destroy target artifact. +mana={3}{R} +type=Host Creature +subtype=Pangolin Beast +power=2 +toughness=2 +[/card] +[card] name=Burglar Rat auto=ability$!name(discard) reject notatarget(*|myhand)!$ opponent text=When Burglar Rat enters the battlefield, each opponent discards a card. @@ -3629,6 +4564,16 @@ mana={B}{S(creature|mybattlefield)} type=Instant [/card] [card] +name=Bushmeat Poacher +auto={1}{T}{S(other creature|myBattlefield)}:life:storedtoughness && draw:1 controller +text={1}, {T}, Sacrifice another creature: You gain life equal to that creature's toughness. Draw a card. +mana={3}{B} +type=Creature +subtype=Human Soldier +power=2 +toughness=4 +[/card] +[card] name=By Force target=artifact auto=destroy @@ -3637,6 +4582,16 @@ mana={X}{R} type=Sorcery [/card] [card] +name=Cabal Conditioning +target=opponent +auto=choice name(Opponent Discards) reject notatarget(*|targetedpersonshand) +auto=choice name(You Discard) reject target(*|myhand) +auto=choice name(Both Discard) reject notatarget(*|targetedpersonshand) && reject target(*|myhand) +text=Any number of target players each discard a number of cards equal to the highest converted mana cost among permanents you control. +mana={6}{B} +type=Sorcery +[/card] +[card] name=Cabal Evangel mana={1}{B} type=Creature @@ -3655,6 +4610,16 @@ power=4 toughness=2 [/card] [card] +name=Cabal Shrine +auto=lord(*|opponentgraveyard) transforms((,newability[@movedTo(*[share!name!]|mystack):reject target(*|myhand) controller])) +auto=lord(*|opponentgraveyard) transforms((,newability[@movedTo(*[share!name!]|opponentstack):reject notatarget(*|opponenthand) opponent])) +auto=lord(*|mygraveyard) transforms((,newability[@movedTo(*[share!name!]|mystack):reject target(*|myhand) controller])) +auto=lord(*|mygraveyard) transforms((,newability[@movedTo(*[share!name!]|opponentstack):reject notatarget(*|opponenthand) opponent])) +text=Whenever a player casts a spell, that player discards X cards, where X is the number of cards in all graveyards with the same name as that spell. +mana={1}{B}{B} +type=Enchantment +[/card] +[card] name=Cabal Stronghold auto={3}{T}:foreach(swamp[basic]|myBattlefield) Add{B} auto={T}:Add{C} @@ -3672,6 +4637,14 @@ power=2 toughness=5 [/card] [card] +name=Calciform Pools +auto={T}:add {1} +auto={1}{T}:counter(0/0,1,Storage) +auto={1}{C(0/0,-1,Storage)}: ability$! _ choice add{U} _ choice add{W} !$ controller +text={T}: Add {1} to your mana pool. -- {1}, {T}: Put a storage counter on Calciform Pools. -- {1}, Remove X storage counters from Calciform Pools: Add X mana in any combination of {W} and/or {U} to your mana pool. +type=Land +[/card] +[card] name=Calculated Dismissal target=*|stack auto=transforms((,newability[pay[[{3}]] name(pay 3 mana) donothing?fizzle])) oneshot @@ -3726,6 +4699,16 @@ type=Legendary Planeswalker subtype=Calix [/card] [card] +name=Call of the Death-Dweller +target=creature[manacost<=3]|myGraveyard +auto=moveTo(myBattlefield) +auto=counter(0/0,1,Menace) target(creature[manacost<=3] +auto=transforms((,newability[this(counter{0/0.1.Menace}>=1) menace target(creature[manacost<=3])])) +text=Return up to two target creature cards with total converted mana cost 3 or less from your graveyard to the battlefield. Put a deathtouch counter on either of them. Then put a menace counter on either of them. +mana={2}{B} +type=Sorcery +[/card] +[card] name=Call the Cavalry auto=create(Knight:creature Knight:2/2:white:vigilance)*2 text=Create two 2/2 white Knight creature tokens with vigilance. @@ -3793,6 +4776,17 @@ type=Enchantment subtype=Aura [/card] [card] +name=Cankerous Thirst +target=creature +other={2}{B}{G} name(Both) +auto=if paid(alternative) then -3/-3 ueot +auto=if paid(alternative) then target(creature) 3/3 ueot +auto=ifnot paid(alternative) then transforms((,newability[choice name(Pay Black) pay[[{B}]] -3/-3 ueot],newability[choice name(Pay Green) pay[[{G}]] 3/3 ueot])) +text=If {B} was spent to cast Cankerous Thirst, you may have target creature get -3/-3 until end of turn. If {G} was spent to cast Cankerous Thirst, you may have target creature get +3/+3 until end of turn. (Do both if {B}{G} was spent.) +mana={3} +type=Instant +[/card] +[card] name=Cannibalize auto=choice name(Opponent's creatures) moveTo(exile) target(creature|opponentbattlefield) && counter(1/1,2) target(other creature|oppponentbattlefield) auto=choice name(my creatures) moveTo(exile) target(creature|mybattlefield) && counter(1/1,2) target(other creature|mybattlefield) @@ -3832,6 +4826,15 @@ power=2 toughness=2 [/card] [card] +name=Captain's Maneuver +target=creature,player +auto=prevent:X ueot +auto=damage:X target(creature,player) +text=The next X damage that would be dealt to target creature or player this turn is dealt to another target creature or player instead. +mana={X}{R}{W} +type=Instant +[/card] +[card] name=Captivating Crew auto={3}{R}:target(creature) untap && haste && alias=129767 text={3}{R}: Gain control of target creature an opponent controls until end of turn. Untap that creature. It gains haste until end of turn. Activate this ability only any time you could cast a sorcery. @@ -3891,6 +4894,16 @@ power=7 toughness=6 [/card] [card] +name=Carom +target=creature +auto=absorb ueot +auto=damage:1 target(other creature) +auto=draw:1 controller +text=The next 1 damage that would be dealt to target creature this turn is dealt to another target creature instead. -- Draw a card. +mana={1}{W} +type=Instant +[/card] +[card] name=Carrion Imp abilities=flying auto=may target(creature|graveyard) moveto(exile) && life:2 controller @@ -3912,6 +4925,16 @@ power=3 toughness=1 [/card] [card] +name=Carrionette +autograveyard={2}{B}{B}{E}:ability$!name(pay or exile) pay[[{2}]] name(pay 2 mana) donothing?all(opponent) moveTo(exile) target(creature)!$ opponent +text={2}{B}{B}: Exile Carrionette and target creature unless that creature's controller pays {2}. Activate this ability only if Carrionette is in your graveyard. +mana={1}{B} +type=Creature +subtype=Skeleton +power=1 +toughness=1 +[/card] +[card] name=Cartographer's Hawk abilities=flying aicode=activate moveTo(myBattlefield) and!(tap(noevent))! target(plains|myLibrary) @@ -4076,6 +5099,33 @@ mana={2}{B}{B}{G}{G} type=Sorcery [/card] [card] +name=Cat +abilities=lifelink +type=Creature +subtype=Cat +power=1 +toughness=1 +color=white +[/card] +[card] +name=Cat Bird Sky +abilities=flying +type=Creature +subttype=Cat Bird +power=1 +toughness=1 +color=white +[/card] +[card] +name=Cat Cub +abilities=lifelink +type=Creature +subttype=Cat +power=1 +toughness=1 +color=white +[/card] +[card] name=Catacomb Crocodile mana={4}{B} type=Creature @@ -4094,6 +5144,22 @@ power=2 toughness=2 [/card] [card] +name=Cathedral Membrane +abilities=defender +other={1}{L:2} name(Pay 2 Life) +auto=@movedTo(this|graveyard) from(mybattlefield) restriction{combatbeginsonly}:damage:6 target(creature[blocking]|opponentbattlefield) +auto=@movedTo(this|graveyard) from(mybattlefield) restriction{attackersonly}:damage:6 target(creature[blocking]|opponentbattlefield) +auto=@movedTo(this|graveyard) from(mybattlefield) restriction{blockersonly}:damage:6 target(creature[blocking]|opponentbattlefield) +auto=@movedTo(this|graveyard) from(mybattlefield) restriction{combatdamageonly}:damage:6 target(creature[blocking]|opponentbattlefield) +auto=@movedTo(this|graveyard) from(mybattlefield) restriction{combatendsonly}:damage:6 target(creature[blocking]|opponentbattlefield) +text=({PW} can be paid with either {W} or 2 life.) -- Defender -- When Cathedral Membrane dies during combat, it deals 6 damage to each creature it blocked this combat. +mana={1}{W} +type=Artifact Creature +subtype=Wall +power=0 +toughness=3 +[/card] +[card] name=Cauldron Familiar auto=life:1 auto=life:-1 opponent @@ -4208,6 +5274,27 @@ text={T}: Add {1}. -- {1}, {T}: Add one mana of any color. -- {4}, {T}, Sacrific type=Land [/card] [card] +name=Cavern Whisperer +abilities=menace,mutate +otherrestriction=type(creature[-human]|mybattlefield)~morethan~0 +auto=@movedTo(mytgt|graveyard) from(battlefield):all(this) moveTo(myGraveyard) +auto=@movedTo(mytgt|hand) from(battlefield):all(this) moveTo(myHand) +auto=@movedTo(mytgt|exile) from(battlefield):all(this) moveTo(myExile) +auto=@movedTo(mytgt|library) from(battlefield):all(this) moveTo(myLibrary) +auto=@movedTo(mytgt|sideboard) from(battlefield):all(this) moveTo(mySideboard) +auto={9999}:equip +other={3}{B} name(Mutate) +auto=transforms((,newability[@mutated(this):ability$!name(discard) target(*|myhand) reject!$ opponent])) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Over) choice name(Mutate Over) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-menace])) forever all(this) && mutateover target(other creature[-human]|mybattlefield) && transforms((,newability[menace])) forever +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Under) choice name(Mutate Under) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-menace])) forever all(this) && mutateunder target(other creature[-human]|mybattlefield) && transforms((,newability[menace])) forever +text=Mutate {3}{B} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- Menace (This creature can't be blocked except by two or more creatures.) -- Whenever this creature mutates, each opponent discards a card. +mana={4}{B} +type=Creature +subtype=Nightmare +power=4 +toughness=4 +[/card] +[card] name=Cazur, Ruthless Stalker abilities=hiddenface aicode=activate moveTo(myhand) target(Ukkima, Stalking Shadow|mylibrary) @@ -4232,6 +5319,16 @@ power=3 toughness=2 [/card] [card] +name=Cenn's Tactician +auto={w}{T}:counter(1/1,1) target(creature[soldieri]) +text={W}, {T}: Put a +1/+1 counter on target Soldier creature. -- Each creature you control with a +1/+1 counter on it can block an additional creature. +mana={W} +type=Creature +subtype=Kithkin Soldier +power=1 +toughness=1 +[/card] +[card] name=Censor target=*|stack auto=transforms((,newability[pay[[{1}]] name(pay 1 mana) donothing?fizzle])) forever @@ -4287,6 +5384,19 @@ power=1 toughness=1 [/card] [card] +name=Cetavolver +other={2}{U}{R} name(Red Kicker) +kicker={G} +auto=if paid(alternative) then counter(1/1,2) && first strike +auto=kicker counter(1/1,1) && trample +text=Kicker {1}{R} and/or {G} (You may pay an additional {1}{R} and/or {G} as you cast this spell.) -- If Cetavolver was kicked with its {1}{R} kicker, it enters the battlefield with two +1/+1 counters on it and with first strike. -- If Cetavolver was kicked with its {G} kicker, it enters the battlefield with a +1/+1 counter on it and with trample. +mana={1}{U} +type=Creature +subtype=Volver +power=1 +toughness=1 +[/card] +[card] name=Chain Lightning target=creature,player,planeswalker auto=damage:3 && transforms((,newability[pay[[{R}{R}]],newability[may name(copy chain lightning) activate name(copy chain lightning) castcard(copied noevent named!:chain lightning:!)])) forever @@ -4426,6 +5536,26 @@ power=3 toughness=3 [/card] [card] +name=Champion of Stray Souls +autograveyard={5}{B}{B}:moveTo(mylibrary) target(this) +auto={3}{B}{B}{T}{S(creature|mybattlefield)}:moveTo(myBattlefield) target(creature|myGraveyard) +auto={3}{B}{B}{T}{S(creature|mybattlefield)}{S(creature|mybattlefield)}:moveTo(myBattlefield) target(<2>creature|myGraveyard) +auto={3}{B}{B}{T}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}:moveTo(myBattlefield) target(<3>creature|myGraveyard) +auto={3}{B}{B}{T}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}:moveTo(myBattlefield) target(<4>creature|myGraveyard) +auto={3}{B}{B}{T}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}:moveTo(myBattlefield) target(<5>creature|myGraveyard) +auto={3}{B}{B}{T}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}:moveTo(myBattlefield) target(<6>creature|myGraveyard) +auto={3}{B}{B}{T}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}:moveTo(myBattlefield) target(<7>creature|myGraveyard) +auto={3}{B}{B}{T}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}:moveTo(myBattlefield) target(<8>creature|myGraveyard) +auto={3}{B}{B}{T}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}:moveTo(myBattlefield) target(<9>creature|myGraveyard) +auto={3}{B}{B}{T}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}{S(creature|mybattlefield)}:moveTo(myBattlefield) target(<10>creature|myGraveyard) +text={3}{B}{B}, {T}, Sacrifice X other creatures: Return X target creature cards from your graveyard to the battlefield. -- {5}{B}{B}: Put Champion of Stray Souls on top of your library from your graveyard. +mana={4}{B}{B} +type=Creature +subtype=Skeleton Warrior +power=4 +toughness=4 +[/card] +[card] name=Champion of Wits auto=may draw:power controller && && transforms((,newability[target(<2>*|myhand) reject])) ueot autograveyard={5}{U}{U}{E}:name(Eternalize) clone and!( transforms((Zombie,removemc,setpower=4,settoughness=4,black)) forever )! assorcery @@ -4559,6 +5689,27 @@ type=Legendary Planeswalker subtype=Chandra [/card] [card] +name=Chandra, Roaring Flame +auto=counter(0/0,4,loyalty) +auto={C(0/0,1,Loyalty)}:damage:2 target(player) +auto={C(0/0,-2,Loyalty)}:damage:2 target(creature) +auto={C(0/0,-7,Loyalty)}:damage:6 opponent && @each opponent upkeep:damage:3 target(opponent) forever +text=+1: Chandra, Roaring Flame deals 2 damage to target player. -- -2: Chandra, Roaring Flame deals 2 damage to target creature. -- -7: Chandra, Roaring Flame deals 6 damage to each opponent. Each player dealt damage this way gets an emblem with "At the beginning of your upkeep, this emblem deals 3 damage to you." +type=Planeswalker +subtype=Chandra +[/card] +[card] +name=Chandra, the Firebrand +auto=counter(0/0,3,loyalty) +auto={C(0/0,1,Loyalty)}:damage:1 target(creature,player) +auto={C(0/0,-2,Loyalty)}:@moveTo(*[instant;sorcery]|myStack): castcard(copied noevent) target(*[instant;sorcery]|mystack) +auto={C(0/0,-6,Loyalty)}:damage:6 target(creature,player) +text=+1: Chandra, the Firebrand deals 1 damage to target creature or player. -- -2: When you cast your next instant or sorcery spell this turn, copy that spell. You may choose new targets for the copy. -- -6: Chandra, the Firebrand deals 6 damage to each of up to six target creatures and/or players. +mana={3}{R} +type=Planeswalker +subtype=Chandra +[/card] +[card] name=Changeling Outcast abilities=changeling,cantblock,unblockable text=Changeling (This card is every creature type.) -- Changeling Outcast can't block and can't be blocked. @@ -4576,6 +5727,52 @@ mana={G}{G} type=Sorcery [/card] [card] +name=Channeled Force +auto=if type(*|myHand)~morethan~0 then choice ability$!name(X=1, you draw) target(*|myhand) reject and!(draw:1)! !$ controller && damage:1 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~0 then choice ability$!name(X=1, opponent draw) target(*|myhand) reject !$ controller && draw:1 opponent && damage:1 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~1 then choice ability$!name(X=2, you draw) target(<2>*|myhand) reject and!(draw:1)! !$ controller && damage:2 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~1 then choice ability$!name(X=2, opponent draw) target(<2>*|myhand) reject !$ controller && draw:1 opponent && damage:2 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~2 then choice ability$!name(X=3, you draw) target(<3>*|myhand) reject and!(draw:1)! !$ controller && damage:3 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~2 then choice ability$!name(X=3, opponent draw) target(<3>*|myhand) reject !$ controller && draw:1 opponent && damage:3 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~3 then choice ability$!name(X=4, you draw) target(<4>*|myhand) reject and!(draw:1)! !$ controller && damage:4 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~3 then choice ability$!name(X=4, opponent draw) target(<4>*|myhand) reject !$ controller && draw:1 opponent && damage:4 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~4 then choice ability$!name(X=5, you draw) target(<5>*|myhand) reject and!(draw:1)! !$ controller && damage:5 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~4 then choice ability$!name(X=5, opponent draw) target(<5>*|myhand) reject !$ controller && draw:1 opponent && damage:5 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~5 then choice ability$!name(X=6, you draw) target(<6>*|myhand) reject and!(draw:1)! !$ controller && damage:6 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~5 then choice ability$!name(X=6, opponent draw) target(<6>*|myhand) reject !$ controller && draw:1 opponent && damage:6 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~6 then choice ability$!name(X=7, you draw) target(<7>*|myhand) reject and!(draw:1)! !$ controller && damage:7 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~6 then choice ability$!name(X=7, opponent draw) target(<7>*|myhand) reject !$ controller && draw:1 opponent && damage:7 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~7 then choice ability$!name(X=8, you draw) target(<8>*|myhand) reject and!(draw:1)! !$ controller && damage:8 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~7 then choice ability$!name(X=8, opponent draw) target(<8>*|myhand) reject !$ controller && draw:1 opponent && damage:8 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~8 then choice ability$!name(X=9, you draw) target(<9>*|myhand) reject and!(draw:1)! !$ controller && damage:9 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~8 then choice ability$!name(X=9, opponent draw) target(<9>*|myhand) reject !$ controller && draw:1 opponent && damage:9 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~9 then choice ability$!name(X=10, you draw) target(<10>*|myhand) reject and!(draw:1)! !$ controller && damage:10 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~9 then choice ability$!name(X=10, opponent draw) target(<10>*|myhand) reject !$ controller && draw:1 opponent && damage:10 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~10 then choice ability$!name(X=11, you draw) target(<11>*|myhand) reject and!(draw:1)! !$ controller && damage:11 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~10 then choice ability$!name(X=11, opponent draw) target(<11>*|myhand) reject !$ controller && draw:1 opponent && damage:11 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~11 then choice ability$!name(X=12, you draw) target(<12>*|myhand) reject and!(draw:1)! !$ controller && damage:12 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~11 then choice ability$!name(X=12, opponent draw) target(<12>*|myhand) reject !$ controller && draw:1 opponent && damage:12 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~12 then choice ability$!name(X=13, you draw) target(<13>*|myhand) reject and!(draw:1)! !$ controller && damage:13 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~12 then choice ability$!name(X=13, opponent draw) target(<13>*|myhand) reject !$ controller && draw:1 opponent && damage:13 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~13 then choice ability$!name(X=14, you draw) target(<14>*|myhand) reject and!(draw:1)! !$ controller && damage:14 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~13 then choice ability$!name(X=14, opponent draw) target(<14>*|myhand) reject !$ controller && draw:1 opponent && damage:14 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~14 then choice ability$!name(X=15, you draw) target(<15>*|myhand) reject and!(draw:1)! !$ controller && damage:15 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~14 then choice ability$!name(X=15, opponent draw) target(<15>*|myhand) reject !$ controller && draw:1 opponent && damage:15 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~15 then choice ability$!name(X=16, you draw) target(<16>*|myhand) reject and!(draw:1)! !$ controller && damage:16 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~15 then choice ability$!name(X=16, opponent draw) target(<16>*|myhand) reject !$ controller && draw:1 opponent && damage:16 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~16 then choice ability$!name(X=17, you draw) target(<17>*|myhand) reject and!(draw:1)! !$ controller && damage:17 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~16 then choice ability$!name(X=17, opponent draw) target(<17>*|myhand) reject !$ controller && draw:1 opponent && damage:17 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~17 then choice ability$!name(X=18, you draw) target(<18>*|myhand) reject and!(draw:1)! !$ controller && damage:18 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~17 then choice ability$!name(X=18, opponent draw) target(<18>*|myhand) reject !$ controller && draw:1 opponent && damage:18 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~18 then choice ability$!name(X=19, you draw) target(<19>*|myhand) reject and!(draw:1)! !$ controller && damage:19 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~18 then choice ability$!name(X=19, opponent draw) target(<19>*|myhand) reject !$ controller && draw:1 opponent && damage:19 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~19 then choice ability$!name(X=20, you draw) target(<20>*|myhand) reject and!(draw:1)! !$ controller && damage:20 target(creature,planeswalker) +auto=if type(*|myHand)~morethan~19 then choice ability$!name(X=20, opponent draw) target(<20>*|myhand) reject !$ controller && draw:1 opponent && damage:20 target(creature,planeswalker) +text=As an additional cost to cast this spell, discard X cards. -- Target player draws X cards. Channeled Force deals X damage to up to one target creature or planeswalker. +mana={2}{U}{R} +type=Instant +[/card] +[card] name=Channeler Initiate auto=counter(-1/-1,3) target(creature|mybattlefield) auto={T}{restriction type(this[counter(-1/-1)])~morethan~0}:name(add green) counter(-1/-1,-1) && add{G} @@ -4591,6 +5788,25 @@ power=3 toughness=4 [/card] [card] +name=Chant of Vitu-Ghazi +other={convoke} name(Convoke) +auto=preventalldamage from(creature) ueot +auto=life:pdcount controller ueot +text=Convoke (Each creature you tap while casting this spell reduces its cost by {1} or by one mana of that creature's color.) -- Prevent all damage that would be dealt by creatures this turn. You gain life equal to the damage prevented this way. +mana={6}{W}{W} +type=Instant +[/card] +[card] +name=Chaos Harlequin +auto={R}:reveal:1 optionone if type(land|reveal)~lessthan~1 then transforms((,newability[2/0],newability[target(<1>*|reveal) moveto(exile)])) optiononeend optiontwo if type(land|reveal)~morethan~0 then transforms((,newability[-4/0],newability[target(<1>*|reveal) moveto(exile)])) optiontwoend revealend +text={R}: Exile the top card of your library. If that card is a land card, Chaos Harlequin gets -4/-0 until end of turn. Otherwise, Chaos Harlequin gets +2/+0 until end of turn. +mana={2}{R}{R} +type=Creature +subtype=Human +power=2 +toughness=4 +[/card] +[card] name=Chaos Maw auto=damage:3 all(other creature) text=When Chaos Maw enters the battlefield, it deals 3 damage to each other creature. @@ -4608,6 +5824,13 @@ mana={W} type=Instant [/card] [card] +name=Charge of the Forever-Beast +auto=target(creature|myhand) transforms((,newability[damage:power target(creature|planeswalker) ueot])) +text=As an additional cost to cast this spell, reveal a creature card from your hand. -- Charge of the Forever-Beast deals damage to target creature or planeswalker equal to the revealed card's power. +mana={2}{G} +type=Sorcery +[/card] +[card] name=Charging Binox abilities=trample text=Assist (Another player can pay up to {7} of this spell's cost.) -- Trample @@ -4662,6 +5885,16 @@ power=1 toughness=5 [/card] [card] +name=Charm Peddler +auto={W}{T}{D(*|myHand)}:preventalldamage target(creature) +text={W}, {T}, Discard a card: The next time a source of your choice would deal damage to target creature this turn, prevent that damage. +mana={W} +type=Creature +subtype=Human Spellshaper +power=1 +toughness=1 +[/card] +[card] name=Charmed Sleep target=creature auto=tap(mytgt) @@ -4703,6 +5936,16 @@ mana={1}{U} type=Sorcery [/card] [card] +name=Checkpoint Officer +auto={1}{W}{T}:tap target(creature) +text={1}{W}, {T}: Tap target creature. +mana={1}{W} +type=Creature +subtype=Human Soldier +power=1 +toughness=2 +[/card] +[card] name=Chemister's Insight auto=draw:2 flashback={3}{U}{D(*|myhand)} @@ -4711,6 +5954,18 @@ mana={3}{U} type=Instant [/card] [card] +name=Chevill, Bane of Monsters +abilities=deathtouch +auto=@each my upkeep restriction{type(*[counter{0/0.1.Bounty}]|opponentBattlefield)~morethan~0}:counter(0/0,1,Bounty) target(creature,planeswalker|opponentBattlefield) +auto=@movedto(graveyard) from(*[counter{0/0.1.Bounty}]|opponentbattlefield):life:3 controller && draw:1 controller +text=Deathtouch -- At the beginning of your upkeep, if your opponents control no permanents with bounty counters on them, put a bounty counter on target creature or planeswalker an opponent controls. -- Whenever a permanent an opponent controls with a bounty counter on it dies, you gain 3 life and draw a card. +mana={B}{G} +type=Legendary Creature +subtype=Human Rogue +power=1 +toughness=3 +[/card] +[card] name=Chief Engineer auto=lord(artifact|myhand,mylibrary,mygraveyard,myexile,mysideboard) convoke text=Artifact spells you cast have convoke. (Your creatures can help cast those spells. Each creature you tap while casting an artifact spell pays for {1} or one mana of that creature’s color.) @@ -4721,6 +5976,23 @@ power=1 toughness=3 [/card] [card] +name=Chill Haunting +target=creature +auto={E(*|myhand)}:-1/-1 ueot +auto={E(*|myhand)}{E(*|myhand)}:-2/-2 ueot +auto={E(*|myhand)}{E(*|myhand)}{E(*|myhand)}:-3/-3 ueot +auto={E(*|myhand)}{E(*|myhand)}{E(*|myhand)}{E(*|myhand)}:-4/-4 ueot +auto={E(*|myhand)}{E(*|myhand)}{E(*|myhand)}{E(*|myhand)}{E(*|myhand)}:-5/-5 ueot +auto={E(*|myhand)}{E(*|myhand)}{E(*|myhand)}{E(*|myhand)}{E(*|myhand)}{E(*|myhand)}:-6/-6 ueot +auto={E(*|myhand)}{E(*|myhand)}{E(*|myhand)}{E(*|myhand)}{E(*|myhand)}{E(*|myhand)}{E(*|myhand)}:-7/-7 ueot +auto={E(*|myhand)}{E(*|myhand)}{E(*|myhand)}{E(*|myhand)}{E(*|myhand)}{E(*|myhand)}{E(*|myhand)}{E(*|myhand)}:-8/-8 ueot +auto={E(*|myhand)}{E(*|myhand)}{E(*|myhand)}{E(*|myhand)}{E(*|myhand)}{E(*|myhand)}{E(*|myhand)}{E(*|myhand)}{E(*|myhand)}:-9/-9 ueot +auto={E(*|myhand)}{E(*|myhand)}{E(*|myhand)}{E(*|myhand)}{E(*|myhand)}{E(*|myhand)}{E(*|myhand)}{E(*|myhand)}{E(*|myhand)}{E(*|myhand)}:-10/-10 ueot +text=As an additional cost to cast Chill Haunting, exile X creature cards from your graveyard. -- Target creature gets -X/-X until end of turn. +mana={1}{B} +type=Instant +[/card] +[card] name=Chillbringer abilities=flying auto=freeze target(creature|opponentbattlefield) @@ -4742,6 +6014,27 @@ power=3 toughness=3 [/card] [card] +name=Chittering Harvester +abilities=mutate +otherrestriction=type(creature[-human]|mybattlefield)~morethan~0 +auto=@movedTo(mytgt|graveyard) from(battlefield):all(this) moveTo(myGraveyard) +auto=@movedTo(mytgt|hand) from(battlefield):all(this) moveTo(myHand) +auto=@movedTo(mytgt|exile) from(battlefield):all(this) moveTo(myExile) +auto=@movedTo(mytgt|library) from(battlefield):all(this) moveTo(myLibrary) +auto=@movedTo(mytgt|sideboard) from(battlefield):all(this) moveTo(mySideboard) +auto={9999}:equip +other={4}{B} name(Mutate) +auto=transforms((,newability[@mutated(this):ability$!sacrifice name(opponent sacrifices creature) notatarget(creature|mybattlefield)!$ opponent])) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Over) choice name(Mutate Over) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)])) forever all(this) && mutateover target(other creature[-human]|mybattlefield) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Under) choice name(Mutate Under) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)])) forever all(this) && mutateunder target(other creature[-human]|mybattlefield) +text=Mutate {4}{B} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- Whenever this creature mutates, each opponent sacrifices a creature. +mana={5}{B} +type=Creature +subtype=Nightmare +power=4 +toughness=6 +[/card] +[card] name=Chittering Witch auto=create(Rat:creature Rat:1/1:black) auto={1}{B}{S(creature|myBattlefield)}:target(creature) -2/-2 ueot @@ -4753,6 +6046,36 @@ power=2 toughness=2 [/card] [card] +name=Choking Vines +restriction=blockersonly +target=creature[attacking] +auto=damage:1 +auto=-999/0 ueot +text=Cast Choking Vines only during the declare blockers step. -- X target attacking creatures become blocked. Choking Vines deals 1 damage to each of those creatures. (This spell works on unblockable creatures.) +mana={X}{G} +type=Instant +[/card] +[card] +name=Chord of Calling +other={convoke} name(Convoke) +aicode=activate target(creature[manacost<=x]|mylibrary) moveto(myhand) +auto=reveal:type:*:mylibrary revealzone(mylibrary) optionone name(choose card) target(<1>creature[manacost<=x]|reveal) transforms((,newability[all(other *|reveal) moveto(mylibrary) and!(shuffle)!],newability[moveto(myhand)])) optiononeend optiontwo name(shuffle) bottomoflibrary target(<1>*|reveal) and!( all(*|reveal) bottomoflibrary and!(shuffle)! )! optiontwoend revealend +text=Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.) -- Search your library for a creature card with converted mana cost X or less and put it onto the battlefield. Then shuffle your library. +mana={X}{G}{G}{G} +type=Instant +[/card] +[card] +name=Chorus of the Conclave +abilities=forestwalk +auto=counter(1/1,X) +text=Forestwalk -- As an additional cost to cast creature spells, you may pay any amount of mana. If you do, that creature enters the battlefield with that many additional +1/+1 counters on it. +mana={X}{4}{G}{G}{W}{W} +type=Legendary Creature +subtype=Dryad +power=3 +toughness=8 +[/card] +[card] name=Chromium, the Mutable abilities=flash, nofizzle, flying auto={D(*|myhand)}:transforms((Human Creature,setpower=1,settoughness=1,opponentshroud,unblockable,blue)) ueot @@ -4764,6 +6087,14 @@ power=7 toughness=7 [/card] [card] +name=Chronostutter +target=creature +auto=moveto(ownerlibrary) && ability$!moverandom(*) from(mylibrary) to(mylibrary)!$ controller +text=Put target creature into its owner's library second from the top. +mana={5}{U} +type=Instant +[/card] +[card] name=Chulane, Teller of Tales abilities=vigilance auto=@movedTo(creature|mystack):draw:1 && may moveto(myBattlefield) target(land|myHand) @@ -4776,6 +6107,25 @@ power=2 toughness=4 [/card] [card] +name=Cinder Crawler +auto=@combat(blocked) source(this):pay({R}) 1/0 ueot +auto=@combat(blocked) source(this):pay({R}{R}) 2/0 ueot +auto=@combat(blocked) source(this):pay({R}{R}{R}) 3/0 ueot +auto=@combat(blocked) source(this):pay({R}{R}{R}{R}) 4/0 ueot +auto=@combat(blocked) source(this):pay({R}{R}{R}{R}{R}) 5/0 ueot +auto=@combat(blocked) source(this):pay({R}{R}{R}{R}{R}{R}) 6/0 ueot +auto=@combat(blocked) source(this):pay({R}{R}{R}{R}{R}{R}{R}) 7/0 ueot +auto=@combat(blocked) source(this):pay({R}{R}{R}{R}{R}{R}{R}{R}) 8/0 ueot +auto=@combat(blocked) source(this):pay({R}{R}{R}{R}{R}{R}{R}{R}{R}) 9/0 ueot +auto=@combat(blocked) source(this):pay({R}{R}{R}{R}{R}{R}{R}{R}{R}{R}) 10/0 ueot +text={R}: Cinder Crawler gets +1/+0 until end of turn. Activate this ability only if Cinder Crawler is blocked. +mana={1}{R} +type=Creature +subtype=Salamander +power=1 +toughness=2 +[/card] +[card] name=Cindervines auto={1}{S}:destroy target(artifact,enchantment) && damage:2 targetcontroller auto=@movedTo(*[-creature]|opponentstack):damage:1 opponent @@ -4784,6 +6134,39 @@ mana={R}{G} type=Enchantment [/card] [card] +name=Circle of Affliction +auto=chooseacolor transforms((,newability[@damageof(player) from(*[chosencolor]): pay({1}) life:1 controller && life:-1 opponent])) forever chooseend +text=As Circle of Affliction enters the battlefield, choose a color. -- Whenever a source of the chosen color deals damage to you, you may pay {1}. If you do, target player loses 1 life and you gain 1 life. +mana={1}{B} +type=Enchantment +[/card] +[card] +name=Circle of Despair +auto={1}{S(creature|myBattlefield)}:name(prevent damage) notatarget(*|battlefield,stack,hand,graveyard) preventalldamage from(mytgt) ueot +text={1}, Sacrifice a creature: The next time a source of your choice would deal damage to target creature or player this turn, prevent that damage. +mana={1}{W}{B} +type=Enchantment +[/card] +[card] +name=Circle of Protection: Artifacts +auto={2}:name(prevent damage) notatarget(artifact|battlefield,stack,hand,graveyard) preventalldamage from(mytgt) ueot +text={2}: The next time an artifact source of your choice would deal damage to you this turn, prevent that damage. +mana={1}{W} +type=Enchantment +[/card] +[card] +name=Circling Vultures +abilities=flying,flash +other={D} name(Discard) +auto=upcost[{l2e}] sacrifice +text=Flying -- You may discard Circling Vultures any time you could cast an instant. -- At the beginning of your upkeep, sacrifice Circling Vultures unless you exile the top creature card of your graveyard. +mana={B} +type=Creature +subtype=Bird +power=3 +toughness=2 +[/card] +[card] name=Circu, Dimir Lobotomist auto=@movedTo(*[blue]|myStack):transforms((,newability[deplete:1 target (player) with counter{0/0.1.Lobotomist}])) auto=@movedTo(*[black]|myStack):transforms((,newability[deplete:1 target (player) with counter{0/0.1.Lobotomist}])) @@ -4862,6 +6245,14 @@ mana={R} type=Sorcery [/card] [card] +name=Clambassadors +auto=@damaged(player) from(this):target(*[creature;artifact;land]|mybattlefield) moveTo(opponentbattlefield) +text=If Clambassadors damages any player, choose an artifact, creature, or land you control. That player gains control of that artifact, creature, or land. +mana={3}{U} +type=Summon +subtype=Clamfolk +[/card] +[card] name=Clamor Shaman auto=choice counter(1/1) auto=choice aslongas(creature|myBattlefield) haste @@ -4874,6 +6265,20 @@ power=1 toughness=1 [/card] [card] +name=Clan Defiance +target=player +auto=choice name(Player) damage:X +auto=choice name(Flying) damage:X target(creature[-flying]) +auto=choice name(Non-Flying) damage:X target(creature[-flying]) +auto=choice name(Flying & Non-Flying) transforms((,newability[damage:X target(creature[-flying])],newability[damage:X target(creature[flying]])) +auto=choice name(Player & Non-Flying) transforms((,newability[damage:X],newability[damage:X target(creature[-flying])])) +auto=choice name(Player & Flying) transforms((,newability[damage:X],newability[damage:X target(creature[flying])])) +auto=choice name(Choose All) transforms((,newability[damage:X],newability[damage:X target(creature[-flying])],newability[damage:X target(creature[flying]])) +text=Choose one or more — -- • Clan Defiance deals X damage to target creature with flying. -- • Clan Defiance deals X damage to target creature without flying. -- • Clan Defiance deals X damage to target player. +mana={X}{R}{G} +type=Sorcery +[/card] +[card] name=Clan Guildmage auto={1}{R}{T}:cantblock target(creature) auto={2}{G}{T}:target(land|mybattlefield) transforms((Elemental Creature,setpower=4,settoughness=4,haste)) ueot @@ -4885,6 +6290,22 @@ power=2 toughness=2 [/card] [card] +name=Clash of Titans +target=creature|battlefield +auto=transforms((,newability[target(other creature|battlefield) dynamicability])) ueot +text=Target creature fights another target creature. (Each deals damage equal to its power to the other.) +mana={3}{R}{R} +type=Instant +[/card] +[card] +name=Cleansing Meditation +auto=aslongas(*|mygraveyard) destroy all(enchantment|opponentbattlefield) >6 +auto=aslongas(*|mygraveyard) destroy all(enchantment) <7 +text=Destroy all enchantments. -- Threshold — If seven or more cards are in your graveyard, instead destroy all enchantments, then return all cards in your graveyard destroyed this way to the battlefield. +mana={1}{W}{W} +type=Sorcery +[/card] +[card] name=Cleansing Nova auto=alternative destroy all(creature) auto=alternative destroy all(artifacts,enchantment) @@ -4993,6 +6414,27 @@ power=2 toughness=1 [/card] [card] +name=Cloudpiercer +abilities=reach,mutate +otherrestriction=type(creature[-human]|mybattlefield)~morethan~0 +auto=@movedTo(mytgt|graveyard) from(battlefield):all(this) moveTo(myGraveyard) +auto=@movedTo(mytgt|hand) from(battlefield):all(this) moveTo(myHand) +auto=@movedTo(mytgt|exile) from(battlefield):all(this) moveTo(myExile) +auto=@movedTo(mytgt|library) from(battlefield):all(this) moveTo(myLibrary) +auto=@movedTo(mytgt|sideboard) from(battlefield):all(this) moveTo(mySideboard) +auto={9999}:equip +other={3}{R} name(Mutate) +auto=transforms((,newability[@mutated(this):may reject notatarget(*|myhand) and!( draw:1 controller )!])) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Over) choice name(Mutate Over) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-reach])) forever all(this) && mutateover target(other creature[-human]|mybattlefield) && transforms((,newability[reach])) forever +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Under) choice name(Mutate Under) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-reach])) forever all(this) && mutateunder target(other creature[-human]|mybattlefield) && transforms((,newability[reach])) forever +text=Mutate {3}{R} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- Reach -- Whenever this creature mutates, you may discard a card. If you do, draw a card. +mana={4}{R} +type=Creature +subtype=Dinosaur +power=5 +toughness=4 +[/card] +[card] name=Cloudreader Sphinx abilities=flying auto=scry:2 scrycore delayed dontshow donothing scrycoreend scryend @@ -5015,13 +6457,30 @@ power=1 toughness=1 [/card] [card] +name=Coastline Chimera +abilities=flying +text=Flying -- {1}{W}: Coastline Chimera can block an additional creature this turn. +mana={3}{U} +type=Creature +subtype=Chimera +power=1 +toughness=5 +[/card] +[card] name=Coat of Arms -auto=lord(creature|battlefield) foreach(other creature[share!subtype!]|battlefield) 1/1 +auto=lord(creature|battlefield) transforms((,newability[foreach(other *[creature;share!types!]|battlefield) 1/1])) text=Each creature gets +1/+1 for each other creature on the battlefield that shares at least one creature type with it. (For example, it two Goblin Warriors and a Goblin Shaman are on the battlefield, each gets +2/+2.) mana={5} type=Artifact [/card] [card] +name=Coax from the Blind Eternities +auto=may moveto(myhand) target(*[eldrazi]|myexile,mysideboard) +text=You may choose an Eldrazi card you own from outside the game or in exile, reveal that card, and put it into your hand. +mana={2}{U} +type=Sorcery +[/card] +[card] name=Code of Constraint target=creature auto=-4/-0 @@ -5032,6 +6491,16 @@ mana={2}{U} type=Instant [/card] [card] +name=Coils of the Medusa +target=creature +auto=1/-1 +auto={S}:destroy target(creature[-wall,blocking]) +text=Enchant creature -- Enchanted creature gets +1/-1. -- Sacrifice Coils of the Medusa: Destroy all non-Wall creatures blocking enchanted creature. +mana={1}{B} +type=Enchantment +subtype=Aura +[/card] +[card] name=Cold-Water Snapper abilities=opponentshroud text=Hexproof (This creature can't be the target of spells or abilities your opponents control.) @@ -5114,6 +6583,17 @@ power=2 toughness=2 [/card] [card] +name=Collector Protector +auto={W}:moveTo(opponentbattlefield) target(*[-land]|mysideboard) && prevent:1 controller +auto={W}:moveTo(opponentbattlefield) target(*[-land]|mysideboard) && prevent:1 +text={W}, Give an opponent a nonland card you own from outside the game: Prevent the next 1 damage that would be dealt to you or Collector Protector this turn. +mana={3}{W}{W} +type=Creature +subtype=Human Gamer +power=2 +toughness=5 +[/card] +[card] name=Colorful Feiyi Sparrow abilities=flying text=Flying. (This creature can't be blocked except by creatures with flying or reach.) @@ -5149,6 +6629,16 @@ power=5 toughness=5 [/card] [card] +name=Colossification +target=creature +auto=teach(creature) transforms((,newability[tap])) +auto=teach(creature) 20/20 +text=Enchant creature / When Colossification enters the battlefield, tap enchanted creature. / Enchanted creature gets +20/+20. +mana={5}{G}{G} +type=Enchantment +subtype=Aura +[/card] +[card] name=Colossus Hammer target=creature auto=teach(creature) 10/10 @@ -5192,6 +6682,19 @@ mana={X}{R}{R} type=Instant [/card] [card] +name=Command Beacon +auto={T}:add{1} +auto={T}{S}:target(*[commander]|sideboard) moveto(myhand) +text={T}: Add {C} to your mana pool. -- {T}, Sacrifice Command Beacon: Put your commander into your hand from the command zone. +type=Land +[/card] +[card] +name=Command Tower +auto=chooseacolor transforms((,newability[{T}:add{chosencolor}])) forever chooseend +text={T}: Add to your mana pool one mana of any color in your commander's color identity. +type=Land +[/card] +[card] name=Command the Dreadhorde target=creature,planeswalker|myGraveyard auto=life:-manacost controller @@ -5209,6 +6712,14 @@ mana={4}{R} type=Instant [/card] [card] +name=Commander's Sphere +auto=chooseacolor transforms((,newability[{T}:add{chosencolor}])) forever chooseend +auto={S}:draw:1 controller +text={T}: Add to your mana pool one mana of any color in your commander's color identity. -- Sacrifice Commander's Sphere: Draw a card. +mana={3} +type=Artifact +[/card] +[card] name=Commanding Presence target=creature auto=first strike @@ -5238,6 +6749,16 @@ mana={3}{U} type=Instant [/card] [card] +name=Common Iguana +auto=may name(discard and draw) reject notatarget(*|myhand) && transforms((,newability[draw:1 controller])) forever +text=When this creature enters the battlefield, you may discard a card. If you do, draw a card. +mana={1}{R} +type=Host Creature +subtype=Lizard +power=1 +toughness=3 +[/card] +[card] name=Commune with Dinosaurs auto=choice name(dinosaur) moverandom(dinosaur) from(mylibrary) to(myhand) auto=choice name(land) moverandom(land) from(mylibrary) to(myhand) @@ -5266,6 +6787,16 @@ mana={1}{U} type=Sorcery [/card] [card] +name=Complicate +target=*|stack +auto=transforms((,newability[pay[[{3}]] name(pay 3 mana) donothing?fizzle])) oneshot +autohand=__CYCLING__({2}{U}) +auto=@discarded(this):transforms((,newability[pay[[{1}]] name(pay 3 mana) donothing?fizzle])) oneshot +text=Counter target spell unless its controller pays {3}. -- Cycling {2}{U} ({2}{U}, Discard this card: Draw a card.) -- When you cycle Complicate, you may counter target spell unless its controller pays {1}. +mana={2}{U} +type=Instant +[/card] +[card] name=Compulsory Rest target=creature auto=cantattack @@ -5307,6 +6838,17 @@ mana={3}{W} type=Enchantment [/card] [card] +name=Cone of Flame +target=player +auto=choice name(1 Player, 2, 3 Creature) damage:1 && damage:2 target(creature) && ability$!name(damage) choice target(other creature) damage:3!$ controller +auto=choice name(2 Player, 1, 3 Creature) damage:2 && damage:1 target(creature) && ability$!name(damage) choice target(other creature) damage:3!$ controller +auto=choice name(3 Player, 1, 2 Creature) damage:3 && damage:1 target(creature) && ability$!name(damage) choice target(other creature) damage:2!$ controller +auto=choice name(0 Player, 1, 2, 3 Creature) damage:1 target(creature) && ability$!name(damage) choice target(another creature) damage:2!$ controller && ability$!name(damage) choice target(another creature) damage:3!$ controller +text=Cone of Flame deals 1 damage to target creature or player, 2 damage to another target creature or player, and 3 damage to a third target creature or player. +mana={3}{R}{R} +type=Sorcery +[/card] +[card] name=Confidence from Strength target=creature auto=4/4 @@ -5316,6 +6858,36 @@ mana={2}{G} type=Sorcery [/card] [card] +name=Confiscation Coup +#AUTO_DEFINE _HARNESSED_CONTROL_($c) this(variable{penergy}>=$c) choice moveTo(mybattlefield) target(artifact,creature[manacost=$c]|opponentbattlefield) && alterenergy:-$c controller +target=artifact,creature +auto=alterenergy:4 controller +auto=_HARNESSED_CONTROL_(0) +auto=_HARNESSED_CONTROL_(1) +auto=_HARNESSED_CONTROL_(2) +auto=_HARNESSED_CONTROL_(3) +auto=_HARNESSED_CONTROL_(4) +auto=_HARNESSED_CONTROL_(5) +auto=_HARNESSED_CONTROL_(6) +auto=_HARNESSED_CONTROL_(7) +auto=_HARNESSED_CONTROL_(8) +auto=_HARNESSED_CONTROL_(9) +auto=_HARNESSED_CONTROL_(10) +auto=_HARNESSED_CONTROL_(11) +auto=_HARNESSED_CONTROL_(12) +auto=_HARNESSED_CONTROL_(13) +auto=_HARNESSED_CONTROL_(14) +auto=_HARNESSED_CONTROL_(15) +auto=_HARNESSED_CONTROL_(16) +auto=_HARNESSED_CONTROL_(17) +auto=_HARNESSED_CONTROL_(18) +auto=_HARNESSED_CONTROL_(19) +auto=_HARNESSED_CONTROL_(20) +text=Choose target artifact or creature. You get {E}{E}{E}{E} (four energy counters), then you may pay an amount of {E} equal to that permanent's converted mana cost. If you do, gain control of it. +mana={3}{U}{U} +type=Sorcery +[/card] +[card] name=Conflux auto=ability$!name(white card) moveto(myhand) notatarget(*[white]|mylibrary)!$ controller auto=ability$!name(blue card) moveto(myhand) notatarget(*[blue]|mylibrary)!$ controller @@ -5327,6 +6899,16 @@ mana={3}{W}{U}{B}{R}{G} type=Sorcery [/card] [card] +name=Confound +target=*|stack +auto=fizzle +auto=draw:1 controller +restriction=target(creature) +text=Counter target spell that targets one or more creatures. -- Draw a card. +mana={1}{U} +type=Instant +[/card] +[card] name=Confront the Assault restriction=type(creature[attacking]|opponentbattlefield)~morethan~0 auto=token(Spirit,Creature Spirit,1/1,flying)*3 @@ -5346,6 +6928,21 @@ power=4 toughness=4 [/card] [card] +name=Conqueror's Flail +target=creature +auto={2}:equip +auto=aslongas(*[white]|myBattlefield) teach(creature) 1/1 +auto=aslongas(*[blue]|myBattlefield) teach(creature) 1/1 +auto=aslongas(*[black]|myBattlefield) teach(creature) 1/1 +auto=aslongas(*[red]|myBattlefield) teach(creature) 1/1 +auto=aslongas(*[green]|myBattlefield) teach(creature) 1/1 +auto=teach(creature) this(variable{controllerturn}) maxCast(*)0 opponent +text=Equipped creature gets +1/+1 for each color among permanents you control. -- As long as Conqueror's Flail is attached to a creature, your opponents can't cast spells during your turn. -- Equip {2} +mana={2} +type=Artifact +subtype=Equipment +[/card] +[card] name=Conqueror's Foothold auto={T}:Add{1} auto={2}{T}:draw:1 controller && discard(*|myhand) @@ -5379,6 +6976,16 @@ mana={1}{U} type=Instant [/card] [card] +name=Consign to Dust +target=artifact,enchantment +auto=destroy +auto=kicker destroy target(*[artifact,enchantment]) +kicker=multi{2}{G} +text=Strive — Consign to Dust costs {2}{G} more to cast for each target beyond the first. -- Destroy any number of target artifacts and/or enchantments. +mana={2}{G} +type=Instant +[/card] +[card] name=Consign to the Pit target=creature auto=destroy @@ -5404,11 +7011,18 @@ power=* toughness=* [/card] [card] +name=Consulate Surveillance +auto=alterenergy:4 controller +auto={e:2}:preventalldamage to(controller) +text=When Consulate Surveillance enters the battlefield, you get {E}{E}{E}{E} (four energy counters). -- Pay {E}{E}: Prevent all damage that would be dealt to you this turn by a source of your choice. +mana={3}{W} +type=Enchantment +[/card] +[card] name=Consume Strength -#can target same creature target=creature auto=2/2 ueot -auto=target(creature) -2/-2 ueot +auto=target(another creature) -2/-2 ueot text=Target creature gets +2/+2 until end of turn. Another target creature gets -2/-2 until end of turn. mana={1}{B}{G} type=Instant @@ -5424,6 +7038,14 @@ type=Enchantment subtype=Aura [/card] [card] +name=Contamination +auto=upcost[{S(creature|mybattlefield)}] sacrifice +auto=lord(land) transforms((removetypes,newability[becomes(Swamp)])) forever +text=At the beginning of your upkeep, sacrifice Contamination unless you sacrifice a creature. -- If a land is tapped for mana, it produces {B} instead of any other type and amount. +mana={2}{B} +type=Enchantment +[/card] +[card] name=Contentious Plan auto=_PROLIFERATE_ auto=draw:1 @@ -5441,6 +7063,21 @@ mana={3}{B}{B} type=Sorcery [/card] [card] +name=Contraption Cannon +auto={2}{S}:damage:allmyname target(creature,player,planeswalker) +text={2}, Sacrifice Contraption Cannon: It deals damage to any target equal to the number of Contraptions you control. +mana={4} +type=Artifact +[/card] +[card] +name=Coordinated Charge +auto=all(creatures|myBattlefield) 2/1 ueot +autohand=__CYCLING__({2}) +text=Creatures you control get +2/+1 until end of turn. -- Cycling {2} ({2}, Discard this card: Draw a card.) +mana={4}{W} +type=Instant +[/card] +[card] name=Coral Commando mana={2}{U} type=Creature @@ -5479,6 +7116,32 @@ power=2 toughness=2 [/card] [card] +name=Corpseweft +auto={1}{B}:choice name(Exile 1 creature) moveTo(exile) target(creature|mygraveyard) && token(Zombie,creature Zombie Horror,2/2,black) and!( tap(noevent) )! +auto={1}{B}:choice name(Exile 2 creatures) moveTo(exile) target(<2>creature|mygraveyard) && token(Zombie,creature Zombie Horror,4/4,black) and!( tap(noevent) )! +auto={1}{B}:choice name(Exile 3 creatures) moveTo(exile) target(<3>creature|mygraveyard) && token(Zombie,creature Zombie Horror,6/6,black) and!( tap(noevent) )! +auto={1}{B}:choice name(Exile 4 creatures) moveTo(exile) target(<4>creature|mygraveyard) && token(Zombie,creature Zombie Horror,8/8,black) and!( tap(noevent) )! +auto={1}{B}:choice name(Exile 5 creatures) moveTo(exile) target(<5>creature|mygraveyard) && token(Zombie,creature Zombie Horror,10/10,black) and!( tap(noevent) )! +auto={1}{B}:choice name(Exile 6 creatures) moveTo(exile) target(<6>creature|mygraveyard) && token(Zombie,creature Zombie Horror,12/12,black) and!( tap(noevent) )! +auto={1}{B}:choice name(Exile 7 creatures) moveTo(exile) target(<7>creature|mygraveyard) && token(Zombie,creature Zombie Horror,14/14,black) and!( tap(noevent) )! +auto={1}{B}:choice name(Exile 8 creatures) moveTo(exile) target(<8>creature|mygraveyard) && token(Zombie,creature Zombie Horror,16/16,black) and!( tap(noevent) )! +auto={1}{B}:choice name(Exile 9 creatures) moveTo(exile) target(<9>creature|mygraveyard) && token(Zombie,creature Zombie Horror,18/18,black) and!( tap(noevent) )! +auto={1}{B}:choice name(Exile 10 creatures) moveTo(exile) target(<10>creature|mygraveyard) && token(Zombie,creature Zombie Horror,20/20,black) and!( tap(noevent) )! +auto={1}{B}:choice name(Exile 11 creatures) moveTo(exile) target(<11>creature|mygraveyard) && token(Zombie,creature Zombie Horror,22/22,black) and!( tap(noevent) )! +auto={1}{B}:choice name(Exile 12 creatures) moveTo(exile) target(<12>creature|mygraveyard) && token(Zombie,creature Zombie Horror,24/24,black) and!( tap(noevent) )! +auto={1}{B}:choice name(Exile 13 creatures) moveTo(exile) target(<13>creature|mygraveyard) && token(Zombie,creature Zombie Horror,26/26,black) and!( tap(noevent) )! +auto={1}{B}:choice name(Exile 14 creatures) moveTo(exile) target(<14>creature|mygraveyard) && token(Zombie,creature Zombie Horror,28/28,black) and!( tap(noevent) )! +auto={1}{B}:choice name(Exile 15 creatures) moveTo(exile) target(<15>creature|mygraveyard) && token(Zombie,creature Zombie Horror,30/30,black) and!( tap(noevent) )! +auto={1}{B}:choice name(Exile 16 creatures) moveTo(exile) target(<16>creature|mygraveyard) && token(Zombie,creature Zombie Horror,32/32,black) and!( tap(noevent) )! +auto={1}{B}:choice name(Exile 17 creatures) moveTo(exile) target(<17>creature|mygraveyard) && token(Zombie,creature Zombie Horror,34/34,black) and!( tap(noevent) )! +auto={1}{B}:choice name(Exile 18 creatures) moveTo(exile) target(<18>creature|mygraveyard) && token(Zombie,creature Zombie Horror,36/36,black) and!( tap(noevent) )! +auto={1}{B}:choice name(Exile 19 creatures) moveTo(exile) target(<19>creature|mygraveyard) && token(Zombie,creature Zombie Horror,38/38,black) and!( tap(noevent) )! +auto={1}{B}:choice name(Exile 20 creatures) moveTo(exile) target(<20>creature|mygraveyard) && token(Zombie,creature Zombie Horror,40/40,black) and!( tap(noevent) )! +text={1}{B}, Exile one or more creature cards from your graveyard: Put an X/X black Zombie Horror creature token onto the battlefield tapped, where X is twice the number of cards exiled this way. +mana={2}{B} +type=Enchantment +[/card] +[card] name=Corridor Monitor auto=untap target(artifact,creature|myBattlefield) text=When Corridor Monitor enters the battlefield, untap target artifact or creature you control. @@ -5499,6 +7162,17 @@ power=2 toughness=2 [/card] [card] +name=Corrupted Crossroads +auto={T}:add{1} +auto={T}{L:1}:add{W} +auto={T}{L:1}:add{B} +auto={T}{L:1}:add{R} +auto={T}{L:1}:add{U} +auto={T}{L:1}:add{G} +text={T}: Add {C} to your mana pool. ({C} represents colorless mana.) -- {T}, Pay 1 life: Add one mana of any color to your mana pool. Spend this mana only to cast a spell with devoid. +type=Land +[/card] +[card] name=Cosmotronic Wave auto=all(creature|opponentBattlefield) damage:1 && cantblock text=Cosmotronic Wave deals 1 damage to each creature your opponents control. Creatures your opponents control can't block this turn. @@ -5615,6 +7289,16 @@ mana={2}{G} type=Instant [/card] [card] +name=Crashing Boars +auto=@combat(attacking) source(this):ability$!name(block) target(creature|mybattlefield) mustblock ueot!$ opponent +text=Whenever Crashing Boars attacks, defending player chooses an untapped creature he or she controls. That creature blocks Crashing Boars this turn if able. +mana={3}{G}{G} +type=Creature +subtype=Boar +power=4 +toughness=4 +[/card] +[card] name=Crashing Drawbridge abilities=defender auto={T}:lord(creature|myBattlefield) haste @@ -5685,6 +7369,17 @@ power=5 toughness=5 [/card] [card] +name=Crime // Punishment +other={X}{B}{G} name(Punishment) +auto=if paid(alternative) then destroy all(creature[manacost=X]) +auto=if paid(alternative) then destroy all(enchantment[manacost=X]) +auto=if paid(alternative) then destroy all(artifact[manacost=X]) +auto=if not paid(alternative) then target(creature,enchantment|opponentgraveyard) moveTo(myBattlefield) +text=Put target creature or enchantment card from an opponent's graveyard onto the battlefield under your control. -- // -- Destroy each artifact, creature, and enchantment with converted mana cost X. +mana={3}{W}{B} +type=Sorcery +[/card] +[card] name=Crimson Honor Guard abilities=trample auto=@each my end:damage:4 controller @@ -5708,6 +7403,20 @@ power=5 toughness=4 [/card] [card] +name=Cromat +auto={W}{B}:destroy target(creature[blocking;attacking]) +auto={U}{R}:flying ueot +auto={B}{R}:regenerate +auto={R}{W}:1/1 ueot +auto={G}{U}:moveto(ownerlibrary) +text={W}{B}: Destroy target creature blocking or blocked by Cromat. -- {U}{R}: Cromat gains flying until end of turn. -- {B}{G}: Regenerate Cromat. -- {R}{W}: Cromat gets +1/+1 until end of turn. -- {G}{U}: Put Cromat on top of its owner's library. +mana={W}{U}{B}{R}{G} +type=Legendary Creature +subtype=Illusion +power=5 +toughness=5 +[/card] +[card] name=Crook of Condemnation auto={1}{T}:target(*|graveyard) moveto(exile) auto={1}{E}:moveto(exile) all(*|graveyard) @@ -5734,6 +7443,17 @@ mana={1}{B} type=Instant [/card] [card] +name=Cruel Feeding +target=creature +auto=1/0 ueot +auto=lifelink ueot +auto=kicker target(creature) 1/0 ueot && lifelink ueot +kicker=multi{2}{B} +text=Strive — Cruel Feeding costs {2}{B} more to cast for each target beyond the first. -- Any number of target creatures each get +1/+0 and gain lifelink until end of turn. (Damage dealt by a creature with lifelink also causes its controller to gain that much life.) +mana={B} +type=Instant +[/card] +[card] name=Cruel Reality target=player auto=if type(creature,planeswalker|opponentbattlefield)~morethan~0 ability$!name(sacrifice) notatarget(creature,planeswalker|myBattlefield) sacrifice!$ opponent else life:-5 opponent @@ -5770,6 +7490,18 @@ text=When Crypt of the Eternals enters the battlefield, you gain 1 life. -- {T}: type=Land [/card] [card] +name=Cryptic Annelid +auto=scry:1 scrycore delayed dontshow donothing scrycoreend scryend +auto=scry:2 scrycore delayed dontshow donothing scrycoreend scryend +auto=scry:3 scrycore delayed dontshow donothing scrycoreend scryend +text=When Cryptic Annelid enters the battlefield, scry 1, then scry 2, then scry 3. (To scry X, look at the top X cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) +mana={3}{U} +type=Creature +subtype=Worm Beast +power=1 +toughness=4 +[/card] +[card] name=Cryptic Caves auto={T}:add {1} auto=aslongas(land|myBattlefield){1}{T}{S}:draw:1 >4 @@ -5777,6 +7509,16 @@ text={T}: Add {1}. -- {1}, {T}, Sacrifice Cryptic Caves: Draw a card. Activate t type=Land [/card] [card] +name=Cryptic Command +auto=choice name(Counter and...) fizzle target(*|stack) && all(this) transforms((,newability[choice name(Return Permanent) moveTo(ownerhand) target(*[-instant;-sorcery])],newability[choice name(Tap all Creatures) tap(noevent) all(creature|opponentbattlefield)],newability[choice name(Draw) draw:1 controller])) +auto=choice name(Return Permanent and...) moveTo(ownerhand) target(*[-instant;-sorcery]) && all(this) transforms((,newability[choice name(Counter) fizzle target(*|stack)],newability[choice name(Tap all Creatures) tap(noevent) all(creature|opponentbattlefield)],newability[choice name(Draw) draw:1 controller])) +auto=choice name(Tap all Creatures and...) tap(noevent) all(creature|opponentbattlefield) && all(this) transforms((,newability[choice name(Counter) fizzle target(*|stack)],newability[choice name(Return Permanent) moveTo(ownerhand) target(*[-instant;-sorcery])],newability[choice name(Draw) draw:1 controller])) +auto=choice name(Draw and...) draw:1 controller && all(this) transforms((,newability[choice name(Counter) fizzle target(*|stack)],newability[choice name(Return Permanent) moveTo(ownerhand) target(*[-instant;-sorcery])],newability[choice name(Tap all Creatures) tap(noevent) all(creature|opponentbattlefield)])) +text=Choose two — Counter target spell; or return target permanent to its owner's hand; or tap all creatures your opponents control; or draw a card. +mana={1}{U}{U}{U} +type=Instant +[/card] +[card] name=Cryptic Serpent anyzone=foreach(instant,sorcery|mygraveyard) altercost(-1,colorless) text=Cryptic Serpent costs {1} less to cast for each instant and sorcery card in your graveyard. @@ -5799,6 +7541,15 @@ power=0 toughness=0 [/card] [card] +name=Crystacean +text=Flash +mana={3}{U} +type=Creature +subtype=Crab +power=1 +toughness=6 +[/card] +[card] name=Crystal Slipper auto=teach(creature) haste auto=teach(creature) 1/0 @@ -5809,6 +7560,25 @@ type=Artifact subtype=Equipment [/card] [card] +name=Crystalline Giant +auto=this(counter{0/0.1.Flying}>=1) flying +auto=this(counter{0/0.1.First Strike}>=1) first strike +auto=this(counter{0/0.1.Deathtouch}>=1) deathtouch +auto=this(counter{0/0.1.Hexproof}>=1) hexproof +auto=this(counter{0/0.1.Lifelink}>=1) lifelink +auto=this(counter{0/0.1.Menace}>=1) menace +auto=this(counter{0/0.1.Reach}>=1) reach +auto=this(counter{0/0.1.Trample}>=1) trample +auto=this(counter{0/0.1.Vigilance}>=1) vigilance +auto=@each my combatbegins:ability$!choice counter(1/1,1) target(Crystalline Giant[-counter{1/1.1}]|myBattlefield) _ choice counter(0/0,1,Vigilance) target(Crystalline Giant[-counter{0/0.1.Vigilance}]|myBattlefield) _ choice counter(0/0,1,Trample) target(Crystalline Giant[-counter{0/0.1.Trample}]|myBattlefield) _ choice counter(0/0,1,Reach) target(Crystalline Giant[-counter{0/0.1.Reach}]|myBattlefield) _ choice counter(0/0,1,Menace) target(Crystalline Giant[-counter{0/0.1.Menace}]|myBattlefield) _ choice counter(0/0,1,Lifelink) target(Crystalline Giant[-counter{0/0.1.Lifelink}]|myBattlefield) _ choice counter(0/0,1,Hexproof) target(Crystalline Giant[-counter{0/0.1.Hexproof}]|myBattlefield) _ choice counter(0/0,1,Deathtouch) target(Crystalline Giant[-counter{0/0.1.Deathtouch}]|myBattlefield) _ choice counter(0/0,1,Flying) target(Crystalline Giant[-counter{0/0.1.Flying}]|myBattlefield) _ choice counter(0/0,1,First Strike) target(Crystalline Giant[-counter{0/0.1.First Strike}]|myBattlefield) !$ controller +text=At the beginning of combat on your turn, choose a kind of counter at random that Crystalline Giant doesn't have on it from among flying, first strike, deathtouch, hexproof, lifelink, menace, reach, trample, vigilance, and +1/+1. Put a counter of that kind on Crystalline Giant. +mana={3} +type=Artifact Creature +subtype=Giant +power=3 +toughness=3 +[/card] +[card] name=Crystalline Resonance auto=@cycled(*|myHand):copy target(other *|battlefield) uynt and!( @cycled(*|myHand):copy target(other *|battlefield) uynt )! text=Whenever you cycle a card, you may have Crystalline Resonance become a copy of another target permanent until your next turn, except it has this ability. @@ -5816,6 +7586,27 @@ mana={2}{U} type=Enchantment [/card] [card] +name=Cubwarden +abilities=lifelink,mutate +otherrestriction=type(creature[-human]|mybattlefield)~morethan~0 +auto=@movedTo(mytgt|graveyard) from(battlefield):all(this) moveTo(myGraveyard) +auto=@movedTo(mytgt|hand) from(battlefield):all(this) moveTo(myHand) +auto=@movedTo(mytgt|exile) from(battlefield):all(this) moveTo(myExile) +auto=@movedTo(mytgt|library) from(battlefield):all(this) moveTo(myLibrary) +auto=@movedTo(mytgt|sideboard) from(battlefield):all(this) moveTo(mySideboard) +auto={9999}:equip +other={2}{W}{W} name(Mutate) +auto=transforms((,newability[@mutated(this):token(Cat Cub)*2])) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Over) choice name(Mutate Over) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-lifelink])) forever all(this) && mutateover target(other creature[-human]|mybattlefield) && transforms((,newability[lifelink])) forever +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Under) choice name(Mutate Under) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-lifelink])) forever all(this) && mutateunder target(other creature[-human]|mybattlefield) && transforms((,newability[lifelink])) forever +text=Mutate {2}{W}{W} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- Lifelink -- Whenever this creature mutates, create two 1/1 white Cat creature tokens with lifelink. +mana={3}{W} +type=Creature +subtype=Cat +power=3 +toughness=5 +[/card] +[card] name=Cult Guildmage auto={3}{B}{T}:target(player) ability$!name(discard) target(*|myhand) reject!$ assorcery auto={R}{T}:damage:1 target(opponent) @@ -5827,6 +7618,17 @@ power=2 toughness=2 [/card] [card] +name=Cultivator Drone +abilities=devoid +auto={T}:add{1} +text=Devoid (This card has no color.) -- {T}: Add {C} to your mana pool. Spend this mana only to cast a colorless spell, activate an ability of a colorless permanent, or pay a cost that contains {C}. ({C} represents colorless mana.) +mana={2}{U} +type=Creature +subtype=Eldrazi Drone +power=2 +toughness=3 +[/card] +[card] name=Cunning Evasion auto=@combat(blocked) source(creature|mybattlefield):all(trigger[to]) moveTo(ownerHand) text=Whenever a creature you control becomes blocked, you may return it to its owner's hand. @@ -5834,6 +7636,18 @@ mana={1}{U} type=Enchantment [/card] [card] +name=Cunning Nightbonder +abilities=flash +auto=lord(*[flash]|mycastingzone) altercost(colorless, -1) +auto=lord(*[flash]|mycastingzone) nofizzle +text=Flash -- Spells with flash you cast cost 1 less to cast and can't be countered. +mana={UB}{UB} +type=Creature +subtype=Human Rogue +power=2 +toughness=2 +[/card] +[card] name=Cunning Survivor auto=@discarded(*|myhand):1/0 ueot auto=@discarded(*|myhand):unblockable ueot @@ -5874,18 +7688,46 @@ mana={3}{G} type=Instant [/card] [card] +name=Curious Homunculus +auto={T}:add{1} +auto=@each my upkeep:aslongas(*[instant;sorcery]|myBattlefield) flip(Voracious Reader) >2 +text={T}: Add {C} to your mana pool. Spend this mana only to cast an instant or sorcery spell. -- At the beginning of your upkeep, if there are three or more instant and/or sorcery cards in your graveyard, transform Curious Homunculus. +mana={1}{U} +type=Creature +subtype=Homunculus +power=1 +toughness=1 +[/card] +[card] +name=Curious Killbot +mana={2} +type=Artifact Creature +subtype=Killbot +power=2 +toughness=1 +[/card] +[card] name=Curious Pair // Treats to Share -abilities=canplayfromexile +abilities=canplayfromexile,adventure other={G} name(Adventure) auto=if paid(alternative) then token(-473141) && moveto(exile) all(this) text=Create a Food token. (Then exile this card. You may cast the creature later from exile. A Food token is an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") mana={1}{G} type=Creature -subtype=Human Peasant Adventure +subtype=Human Peasant power=1 toughness=3 [/card] [card] +name=Curse of Bloodletting +target=player +auto=@damaged(targetedplayer) once:damage:thatmuch all(trigger[to]) +text=Enchant player -- If a source would deal damage to enchanted player, it deals double that damage to that player instead. +mana={3}{R}{R} +type=Enchantment +subtype=Aura Curse +[/card] +[card] name=Curse of Bounty target=player auto=@combat(attacking) source(creature|myBattlefield) restriction(once):untap all(*[-land]|myBattlefield) @@ -5953,6 +7795,13 @@ power=3 toughness=2 [/card] [card] +name=Cursed Rack +auto=hmodifer:-3 opponent +text=As Cursed Rack enters the battlefield, choose an opponent. -- The chosen player's maximum hand size is four. +mana={4} +type=Artifact +[/card] +[card] name=Custodi Soulcaller auto=@combat(attacking) source(this):1/1 ueot auto=@combat(attacking) source(this):moveto(mybattlefield) target(creature[manacost<=1]|mygraveyard) @@ -5973,6 +7822,16 @@ mana={1}{R} type=Sorcery [/card] [card] +name=Cyclopean Giant +auto=@movedTo(this|graveyard) from(battlefield):all(trigger[to]) moveto(exile) and!( transforms((swamp)) target(land) )! +text=When Cyclopean Giant dies, target land becomes a Swamp. Exile Cyclopean Giant. +mana={2}{B}{B} +type=Creature +subtype=Zombie Giant +power=4 +toughness=2 +[/card] +[card] name=Cyclops Electromancer auto=damage:type:*[instant;sorcery]:mygraveyard target(creature|opponentBattlefield) text=When Cyclops Electromancer enters the battlefield, it deals X damage to target creature an opponent controls, where X is the number of instant and sorcery cards in your graveyard. @@ -6024,6 +7883,18 @@ power=3 toughness=2 [/card] [card] +name=Daghatar the Adamant +abilities=vigilance +auto=counter(1/1,4) +auto={1}{BG}{BG}:target(creature) counter(1/1,-1) && transforms((,newability[target(another creature) counter(1/1,1)])) +text=Vigilance -- Daghatar the Adamant enters the battlefield with four +1/+1 counters on it. -- {1}{BG}{BG}: Move a +1/+1 counter from target creature onto a second target creature. +mana={3}{W} +type=Legendary Creature +subtype=Human Warrior +power=0 +toughness=0 +[/card] +[card] name=Dalakos, Crafter of Wonders auto={T}:Add{artifact:C}{artifact:C} auto=lord(creature[geared]|mybattlefield) flying @@ -6036,6 +7907,15 @@ power=2 toughness=4 [/card] [card] +name=Dance of the Manse +target=artifact,enchantment[-aura]|mygraveyard +auto=moveto(myBattlefield) +auto=this(X>5) becomes(creature,4/4) forever +text=Return up to X target artifact and/or non-Aura enchantment cards each with converted mana cost X or less from your graveyard to the battlefield. If X is 6 or more, those permanents are 4/4 creatures in addition to their other types. +mana={X}{W}{U} +type=Sorcery +[/card] +[card] name=Danitha Capashen, Paragon abilities=first strike, vigilance, lifelink auto=lord(aura|mycastingzone) altercost(colorless,-1) @@ -6085,7 +7965,7 @@ toughness=3 [card] name=Daring Fiendbonder abilities=haste,mustattack -autograveyard={1}{B}{E}:newability[counter(0/0,1,Indestructible) && (indestructible)forever target(creature)] +autograveyard={1}{B}{E}:target(creature) transform((,newability[counter(0/0,1,Indestructible)],newability[this(counter{0/0.1.Indestructible}>=1) indestructible])) text=Haste -- Daring Fiendbonder attacks each combat if able. -- {1}{B}, Exile Daring Fiendbonder from your graveyard: Put an indestructible counter on target creature. Activate this ability only any time you could cast a sorcery. mana={3}{B} type=Creature @@ -6160,6 +8040,14 @@ type=Enchantment subtype=Aura [/card] [card] +name=Dash Hopes +target=*|stack +auto=transforms((,newability[pay[[{L:5}]] name(pay 5 life) donothing?fizzle])) oneshot +text=When you cast Dash Hopes, any player may pay 5 life. If a player does, counter Dash Hopes. -- Counter target spell. +mana={B}{B} +type=Instant +[/card] +[card] name=Dauntless Aven abilities=flying auto=@combat(attacking) source(this):untap target(creature|myBattlefield) @@ -6199,6 +8087,25 @@ type=Legendary Planeswalker subtype=Davriel [/card] [card] +name=Dawn Charm +auto=choice name(Prevent Damage) preventAllcombatDamage ueot +auto=choice name(Regenerate Creature) regenerate target(creature) +auto=choice name(Counter Spell) target(*|stack) fizzle +text=Choose one — Prevent all combat damage that would be dealt this turn; or regenerate target creature; or counter target spell that targets you. +mana={1}{W} +type=Instant +[/card] +[card] +name=Dawn Evangel +auto=@movedTo(graveyard) from(creature[geared]|myBattlefield):moveto(myhand) target(creature[manacost<3]|mygraveyard) +text=Whenever a creature dies, if an Aura you controlled was attached to it, return target creature card with converted mana cost 2 or less from your graveyard to your hand. +mana={2}{W} +type=Enchantment Creature +subtype=Human Cleric +power=2 +toughness=3 +[/card] +[card] name=Dawn of Hope auto=@lifeof(player):pay({2}) draw:1 auto={3}{W}:create(soldier:creature soldier:1/1:white:lifelink) @@ -6207,6 +8114,16 @@ mana={1}{W} type=Enchantment [/card] [card] +name=Dawn to Dusk +target=enchantment +auto=choice name(Destroy) destroy +auto=choice name(Return) moveTo(myhand) target(enchantment|mygraveyard) +auto=choice name(Both) destroy && moveTo(myhand) target(enchantment|mygraveyard) +text=Choose one or both — Return target enchantment card from your graveyard to your hand; and/or destroy target enchantment. +mana={2}{W}{W} +type=Sorcery +[/card] +[card] name=Dawning Angel abilities=flying auto=life:4 @@ -6262,6 +8179,26 @@ power=3 toughness=3 [/card] [card] +name=Daysquad Marshal +auto=token(Human Soldier Day) +text=When Daysquad Marshal enters the battlefield, create a 1/1 white Human Soldier creature token. +mana={3}{W} +type=Creature +subtype=Human Soldier +power=3 +toughness=3 +[/card] +[card] +name=Dazzling Beauty +target=creature[attacking] +restriction=blockersonly +auto=@next upkeep:draw:1 +auto=0/0 && fog from(mytgt) oneshot +text=Cast Dazzling Beauty only during the declare blockers step. -- Target unblocked attacking creature becomes blocked. (This spell works on unblockable creatures.) -- Draw a card at the beginning of the next turn's upkeep. +mana={2}{W} +type=Instant +[/card] +[card] name=Dazzling Lights target=creature auto=-3/-0 @@ -6272,6 +8209,25 @@ mana={U} type=Instant [/card] [card] +name=Dead // Gone +other={2}{R} name(Gone) +target=creature +auto=if paid(alternative) then moveTo(ownerHand) +auto=ifnot paid(alternative) then damage:2 +text=Dead deals 2 damage to target creature. // Return target creature you don't control to its owner's hand. +mana={R} +type=Instant +[/card] +[card] +name=Dead Reckoning +target=creature|mygraveyard +auto=choice name(Move and damage) moveto(mylibrary) && transforms((,newability[dynamicability target(creature)])) ueot +auto=choice name(Don't Move) donothing +text=You may put target creature card from your graveyard on top of your library. If you do, Dead Reckoning deals damage equal to that card's power to target creature. +mana={1}{B}{B} +type=Sorcery +[/card] +[card] name=Dead Revels target=creature|mygraveyard auto=moveTo(ownerHand) @@ -6361,6 +8317,15 @@ power=1 toughness=1 [/card] [card] +name=Deadly Allure +target=creature +flashback={G} +auto=transforms((,newability[deathtouch ueot],newability[@combat (attacking,blocking) source(this): all(creature|opponentbattlefield) mustblock ueot])) ueot +text=Target creature gains deathtouch until end of turn and must be blocked this turn if able. -- Flashback {G} (You may cast this card from your graveyard for its flashback cost. Then exile it.) +mana={B} +type=Sorcery +[/card] +[card] name=Deadly Rollick target=creature auto=moveTo(exile) @@ -6398,6 +8363,34 @@ mana={W} type=Enchantment [/card] [card] +name=Death's Oasis +auto=@movedto(creature[-token;manacost=1]|mygraveyard) from(mybattlefield):transforms((,newability[deplete:2 controller],newability[name(Return creature with cost < 1) moveto(myhand) target(creature[manacost<=0]|mygraveyard)])) forever +auto=@movedto(creature[-token;manacost=2]|mygraveyard) from(mybattlefield):transforms((,newability[deplete:2 controller],newability[name(Return creature with cost < 2) moveto(myhand) target(creature[manacost<=1]|mygraveyard)])) forever +auto=@movedto(creature[-token;manacost=3]|mygraveyard) from(mybattlefield):transforms((,newability[deplete:2 controller],newability[name(Return creature with cost < 3) moveto(myhand) target(creature[manacost<=2]|mygraveyard)])) forever +auto=@movedto(creature[-token;manacost=4]|mygraveyard) from(mybattlefield):transforms((,newability[deplete:2 controller],newability[name(Return creature with cost < 4) moveto(myhand) target(creature[manacost<=3]|mygraveyard)])) forever +auto=@movedto(creature[-token;manacost=5]|mygraveyard) from(mybattlefield):transforms((,newability[deplete:2 controller],newability[name(Return creature with cost < 5) moveto(myhand) target(creature[manacost<=4]|mygraveyard)])) forever +auto=@movedto(creature[-token;manacost=6]|mygraveyard) from(mybattlefield):transforms((,newability[deplete:2 controller],newability[name(Return creature with cost < 6) moveto(myhand) target(creature[manacost<=5]|mygraveyard)])) forever +auto=@movedto(creature[-token;manacost=7]|mygraveyard) from(mybattlefield):transforms((,newability[deplete:2 controller],newability[name(Return creature with cost < 7) moveto(myhand) target(creature[manacost<=6]|mygraveyard)])) forever +auto=@movedto(creature[-token;manacost=8]|mygraveyard) from(mybattlefield):transforms((,newability[deplete:2 controller],newability[name(Return creature with cost < 8) moveto(myhand) target(creature[manacost<=7]|mygraveyard)])) forever +auto=@movedto(creature[-token;manacost=9]|mygraveyard) from(mybattlefield):transforms((,newability[deplete:2 controller],newability[name(Return creature with cost < 9) moveto(myhand) target(creature[manacost<=8]|mygraveyard)])) forever +auto=@movedto(creature[-token;manacost=10]|mygraveyard) from(mybattlefield):transforms((,newability[deplete:2 controller],newability[name(Return creature with cost < 10) moveto(myhand) target(creature[manacost<=9]|mygraveyard)])) forever +auto=@movedto(creature[-token;manacost=11]|mygraveyard) from(mybattlefield):transforms((,newability[deplete:2 controller],newability[name(Return creature with cost < 11) moveto(myhand) target(creature[manacost<=10]|mygraveyard)])) forever +auto=@movedto(creature[-token;manacost=12]|mygraveyard) from(mybattlefield):transforms((,newability[deplete:2 controller],newability[name(Return creature with cost < 12) moveto(myhand) target(creature[manacost<=11]|mygraveyard)])) forever +auto=@movedto(creature[-token;manacost=13]|mygraveyard) from(mybattlefield):transforms((,newability[deplete:2 controller],newability[name(Return creature with cost < 13) moveto(myhand) target(creature[manacost<=12]|mygraveyard)])) forever +auto=@movedto(creature[-token;manacost=14]|mygraveyard) from(mybattlefield):transforms((,newability[deplete:2 controller],newability[name(Return creature with cost < 14) moveto(myhand) target(creature[manacost<=13]|mygraveyard)])) forever +auto=@movedto(creature[-token;manacost=15]|mygraveyard) from(mybattlefield):transforms((,newability[deplete:2 controller],newability[name(Return creature with cost < 15) moveto(myhand) target(creature[manacost<=14]|mygraveyard)])) forever +auto=@movedto(creature[-token;manacost=16]|mygraveyard) from(mybattlefield):transforms((,newability[deplete:2 controller],newability[name(Return creature with cost < 16) moveto(myhand) target(creature[manacost<=15]|mygraveyard)])) forever +auto=@movedto(creature[-token;manacost=17]|mygraveyard) from(mybattlefield):transforms((,newability[deplete:2 controller],newability[name(Return creature with cost < 17) moveto(myhand) target(creature[manacost<=16]|mygraveyard)])) forever +auto=@movedto(creature[-token;manacost=18]|mygraveyard) from(mybattlefield):transforms((,newability[deplete:2 controller],newability[name(Return creature with cost < 18) moveto(myhand) target(creature[manacost<=17]|mygraveyard)])) forever +auto=@movedto(creature[-token;manacost=19]|mygraveyard) from(mybattlefield):transforms((,newability[deplete:2 controller],newability[name(Return creature with cost < 19) moveto(myhand) target(creature[manacost<=18]|mygraveyard)])) forever +auto=@movedto(creature[-token;manacost=20]|mygraveyard) from(mybattlefield):transforms((,newability[deplete:2 controller],newability[name(Return creature with cost < 20) moveto(myhand) target(creature[manacost<=19]|mygraveyard)])) forever +auto=@movedto(creature[-token;manacost>=20]|mygraveyard) from(mybattlefield):transforms((,newability[deplete:2 controller],newability[name(Return creature) moveto(myhand) target(creature|mygraveyard)])) forever +auto={1}{S}:life:convertedcost:highest:creature:myBattlefield +text=Whenever a nontoken creature you control dies, put the top two cards of your library into your graveyard. Then return a creature card with lesser converted mana cost than the creature that died from your graveyard to your hand. -- {1}, Sacrifice Death's Oasis: You gain life equal to the greatest converted mana cost among creatures you control. +mana={W}{B}{G} +type=Enchantment +[/card] +[card] name=Deathbloom Thallid auto=@movedTo(this|graveyard) from(battlefield):create(saproling:creature saproling:1/1:green:) text=When Deathbloom Thallid dies, create a 1/1 green Saproling creature token. @@ -6453,6 +8446,14 @@ mana={1}{B}{B}{G} type=Instant [/card] [card] +name=Debt of Loyalty +target=creature +auto=regenerate && moveto(mybattlefield) +text=Regenerate target creature. You gain control of that creature if it regenerates this way. +mana={1}{W}{W} +type=Instant +[/card] +[card] name=Debtors' Transport auto=@movedTo(this|graveyard) from(battlefield):create(Spirit:creature Spirit:1/1:white,black:flying)*2 text=Afterlife 2 (When this creature dies, create two 1/1 white and black Spirit creature tokens with flying.) @@ -6501,6 +8502,17 @@ power=2 toughness=2 [/card] [card] +name=Decorated Griffin +abilities=flying +auto={1}{W}:prevent:1 controller +text=Flying -- {1}{W}: Prevent the next 1 combat damage that would be dealt to you this turn. +mana={4}{W} +type=Creature +subtype=Griffin +power=2 +toughness=3 +[/card] +[card] name=Decoy Gambit auto=transforms((,newability[pay[[{Draw:1 controller}]] name(Draw a card) donothing?moveTo(ownerHand) target(creature)])) oneshot text=For each opponent, choose up to one target creature that player controls, then return that creature to its owner’s hand unless its controller has you draw a card. @@ -6630,6 +8642,24 @@ mana={2}{R} type=Instant [/card] [card] +name=Deft Dismissal +target=creature[attacking;blocking] +auto=damage:1 +auto=damage:1 target(creature[attacking;blocking]) +auto=ability$!name(damage) choice target(creature[attacking;blocking]) damage:1!$ controller +text=Deft Dismissal deals 3 damage divided as you choose among one, two, or three target attacking or blocking creatures. +mana={3}{W} +type=Instant +[/card] +[card] +name=Delighted Killbot +mana={2} +type=Artifact Creature +subtype=Killbot +power=2 +toughness=1 +[/card] +[card] name=Demanding Dragon abilities=flying auto=damage:5 target(opponent) @@ -6672,6 +8702,16 @@ power=4 toughness=4 [/card] [card] +name=Demonfire +target=creature,player +auto=aslongas(*|myhand) shadow <1 +auto=damage:X +auto=exiledeath ueot +text=Demonfire deals X damage to target creature or player. If a creature dealt damage this way would die this turn, exile it instead. -- Hellbent — If you have no cards in hand, Demonfire can't be countered by spells or abilities and the damage can't be prevented. +mana={X}{R} +type=Sorcery +[/card] +[card] name=Demonic Vigor target=creature auto=teach(creature) +1/+1 @@ -6878,6 +8918,26 @@ mana={1}{W} type=Instant [/card] [card] +name=Desperate Stand +target=creature +auto=2/0 ueot +auto=lifelink ueot +auto=vigilance ueot +auto=kicker target(creature) 2/0 ueot && first-strike ueot && vigilance ueot +kicker=multi{R}{W} +text=Strive — Desperate Stand costs {R}{W} more to cast for each target beyond the first. -- Any number of target creatures each get +2/+0 and gain first strike and vigilance until end of turn. +mana={R}{W} +type=Sorcery +[/card] +[card] +name=Despondent Killbot +mana={2} +type=Artifact Creature +subtype=Killbot +power=2 +toughness=1 +[/card] +[card] name=Destined target=creature auto=1/0 @@ -6917,6 +8977,48 @@ mana={2}{R} type=Sorcery [/card] [card] +name=Devastating Dreams +auto=if type(*|myHand)~morethan~0 then choice name(Discard 1 card) discard:1 controller && damage:1 all(creature) && ability$!sacrifice notatarget(land|mybattlefield)!$ controller && ability$!sacrifice notatarget(land|mybattlefield)!$ opponent +auto=if type(*|myHand)~morethan~1 then choice name(Discard 2 cards) discard:2 controller && damage:2 all(creature) && ability$!sacrifice notatarget(<2>land|mybattlefield)!$ controller && ability$!sacrifice notatarget(<2>land|mybattlefield)!$ opponent +auto=if type(*|myHand)~morethan~2 then choice name(Discard 3 cards) discard:3 controller && damage:3 all(creature) && ability$!sacrifice notatarget(<3>land|mybattlefield)!$ controller && ability$!sacrifice notatarget(<3>land|mybattlefield)!$ opponent +auto=if type(*|myHand)~morethan~3 then choice name(Discard 4 cards) discard:4 controller && damage:4 all(creature) && ability$!sacrifice notatarget(<4>land|mybattlefield)!$ controller && ability$!sacrifice notatarget(<4>land|mybattlefield)!$ opponent +auto=if type(*|myHand)~morethan~4 then choice name(Discard 5 cards) discard:5 controller && damage:5 all(creature) && ability$!sacrifice notatarget(<5>land|mybattlefield)!$ controller && ability$!sacrifice notatarget(<5>land|mybattlefield)!$ opponent +auto=if type(*|myHand)~morethan~5 then choice name(Discard 6 cards) discard:6 controller && damage:6 all(creature) && ability$!sacrifice notatarget(<6>land|mybattlefield)!$ controller && ability$!sacrifice notatarget(<6>land|mybattlefield)!$ opponent +auto=if type(*|myHand)~morethan~6 then choice name(Discard 7 cards) discard:7 controller && damage:7 all(creature) && ability$!sacrifice notatarget(<7>land|mybattlefield)!$ controller && ability$!sacrifice notatarget(<7>land|mybattlefield)!$ opponent +auto=if type(*|myHand)~morethan~7 then choice name(Discard 8 cards) discard:8 controller && damage:8 all(creature) && ability$!sacrifice notatarget(<8>land|mybattlefield)!$ controller && ability$!sacrifice notatarget(<8>land|mybattlefield)!$ opponent +auto=if type(*|myHand)~morethan~8 then choice name(Discard 9 cards) discard:9 controller && damage:9 all(creature) && ability$!sacrifice notatarget(<9>land|mybattlefield)!$ controller && ability$!sacrifice notatarget(<9>land|mybattlefield)!$ opponent +auto=if type(*|myHand)~morethan~9 then choice name(Discard 10 cards) discard:10 controller && damage:10 all(creature) && ability$!sacrifice notatarget(<10>land|mybattlefield)!$ controller && ability$!sacrifice notatarget(<10>land|mybattlefield)!$ opponent +text=As an additional cost to cast Devastating Dreams, discard X cards at random. -- Each player sacrifices X lands. Devastating Dreams deals X damage to each creature. +mana={R}{R} +type=Sorcery +[/card] +[card] +name=Devastating Summons +auto=if type(*[land]|myBattlefield)~morethan~0 then choice name(Sacrifice 1 land) ability$!sacrifice notatarget(land|mybattlefield)!$ controller && token(Elemental,Creature Elemental,1/1,red)*2 +auto=if type(*[land]|myBattlefield)~morethan~1 then choice name(Sacrifice 2 lands) ability$!sacrifice notatarget(<2>land|mybattlefield)!$ controller && token(Elemental,Creature Elemental,2/2,red)*2 +auto=if type(*[land]|myBattlefield)~morethan~2 then choice name(Sacrifice 3 lands) ability$!sacrifice notatarget(<3>land|mybattlefield)!$ controller && token(Elemental,Creature Elemental,3/3,red)*2 +auto=if type(*[land]|myBattlefield)~morethan~3 then choice name(Sacrifice 4 lands) ability$!sacrifice notatarget(<4>land|mybattlefield)!$ controller && token(Elemental,Creature Elemental,4/4,red)*2 +auto=if type(*[land]|myBattlefield)~morethan~4 then choice name(Sacrifice 5 lands) ability$!sacrifice notatarget(<5>land|mybattlefield)!$ controller && token(Elemental,Creature Elemental,5/5,red)*2 +auto=if type(*[land]|myBattlefield)~morethan~5 then choice name(Sacrifice 6 lands) ability$!sacrifice notatarget(<6>land|mybattlefield)!$ controller && token(Elemental,Creature Elemental,6/6,red)*2 +auto=if type(*[land]|myBattlefield)~morethan~6 then choice name(Sacrifice 7 lands) ability$!sacrifice notatarget(<7>land|mybattlefield)!$ controller && token(Elemental,Creature Elemental,7/7,red)*2 +auto=if type(*[land]|myBattlefield)~morethan~7 then choice name(Sacrifice 8 lands) ability$!sacrifice notatarget(<8>land|mybattlefield)!$ controller && token(Elemental,Creature Elemental,8/8,red)*2 +auto=if type(*[land]|myBattlefield)~morethan~8 then choice name(Sacrifice 9 lands) ability$!sacrifice notatarget(<9>land|mybattlefield)!$ controller && token(Elemental,Creature Elemental,9/9,red)*2 +auto=if type(*[land]|myBattlefield)~morethan~9 then choice name(Sacrifice 10 lands) ability$!sacrifice notatarget(<10>land|mybattlefield)!$ controller && token(Elemental,Creature Elemental,10/10,red)*2 +auto=if type(*[land]|myBattlefield)~morethan~10 then choice name(Sacrifice 11 lands) ability$!sacrifice notatarget(<11>land|mybattlefield)!$ controller && token(Elemental,Creature Elemental,11/11,red)*2 +auto=if type(*[land]|myBattlefield)~morethan~11 then choice name(Sacrifice 12 lands) ability$!sacrifice notatarget(<12>land|mybattlefield)!$ controller && token(Elemental,Creature Elemental,12/12,red)*2 +auto=if type(*[land]|myBattlefield)~morethan~12 then choice name(Sacrifice 13 lands) ability$!sacrifice notatarget(<13>land|mybattlefield)!$ controller && token(Elemental,Creature Elemental,13/13,red)*2 +auto=if type(*[land]|myBattlefield)~morethan~13 then choice name(Sacrifice 14 lands) ability$!sacrifice notatarget(<14>land|mybattlefield)!$ controller && token(Elemental,Creature Elemental,14/14,red)*2 +auto=if type(*[land]|myBattlefield)~morethan~14 then choice name(Sacrifice 15 lands) ability$!sacrifice notatarget(<15>land|mybattlefield)!$ controller && token(Elemental,Creature Elemental,15/15,red)*2 +auto=if type(*[land]|myBattlefield)~morethan~15 then choice name(Sacrifice 16 lands) ability$!sacrifice notatarget(<16>land|mybattlefield)!$ controller && token(Elemental,Creature Elemental,16/16,red)*2 +auto=if type(*[land]|myBattlefield)~morethan~16 then choice name(Sacrifice 17 lands) ability$!sacrifice notatarget(<17>land|mybattlefield)!$ controller && token(Elemental,Creature Elemental,17/17,red)*2 +auto=if type(*[land]|myBattlefield)~morethan~17 then choice name(Sacrifice 18 lands) ability$!sacrifice notatarget(<18>land|mybattlefield)!$ controller && token(Elemental,Creature Elemental,18/18,red)*2 +auto=if type(*[land]|myBattlefield)~morethan~18 then choice name(Sacrifice 19 lands) ability$!sacrifice notatarget(<19>land|mybattlefield)!$ controller && token(Elemental,Creature Elemental,19/19,red)*2 +auto=if type(*[land]|myBattlefield)~morethan~19 then choice name(Sacrifice 20 lands) ability$!sacrifice notatarget(<20>land|mybattlefield)!$ controller && token(Elemental,Creature Elemental,20/20,red)*2 +text=As an additional cost to cast Devastating Summons, sacrifice X lands. -- Put two X/X red Elemental creature tokens onto the battlefield. +mana={R} +type=Sorcery +[/card] +[card] name=Devious Cover-Up target=*|stack auto=moveto(exile) @@ -6977,6 +9079,35 @@ power=2 toughness=2 [/card] [card] +name=Devouring Rage +target=creature +auto=choice name(Sacrifice 0 spirits) 3/0 ueot +auto=if type(*[spirit]|myBattlefield)~morethan~0 then choice name(Sacrifice 1 spirit) ability$!sacrifice notatarget(spirit|mybattlefield)!$ controller && 6/0 ueot +auto=if type(*[spirit]|myBattlefield)~morethan~1 then choice name(Sacrifice 2 spirits) ability$!sacrifice notatarget(<2>spirit|mybattlefield)!$ controller && 9/0 ueot +auto=if type(*[spirit]|myBattlefield)~morethan~2 then choice name(Sacrifice 3 spirits) ability$!sacrifice notatarget(<3>spirit|mybattlefield)!$ controller && 12/0 ueot +auto=if type(*[spirit]|myBattlefield)~morethan~3 then choice name(Sacrifice 4 spirits) ability$!sacrifice notatarget(<4>spirit|mybattlefield)!$ controller && 15/0 ueot +auto=if type(*[spirit]|myBattlefield)~morethan~4 then choice name(Sacrifice 5 spirits) ability$!sacrifice notatarget(<5>spirit|mybattlefield)!$ controller && 18/0 ueot +auto=if type(*[spirit]|myBattlefield)~morethan~5 then choice name(Sacrifice 6 spirits) ability$!sacrifice notatarget(<6>spirit|mybattlefield)!$ controller && 21/0 ueot +auto=if type(*[spirit]|myBattlefield)~morethan~6 then choice name(Sacrifice 7 spirits) ability$!sacrifice notatarget(<7>spirit|mybattlefield)!$ controller && 24/0 ueot +auto=if type(*[spirit]|myBattlefield)~morethan~7 then choice name(Sacrifice 8 spirits) ability$!sacrifice notatarget(<8>spirit|mybattlefield)!$ controller && 27/0 ueot +auto=if type(*[spirit]|myBattlefield)~morethan~8 then choice name(Sacrifice 9 spirits) ability$!sacrifice notatarget(<9>spirit|mybattlefield)!$ controller && 30/0 ueot +auto=if type(*[spirit]|myBattlefield)~morethan~9 then choice name(Sacrifice 10 spirits) ability$!sacrifice notatarget(<10>spirit|mybattlefield)!$ controller && 33/0 ueot +auto=if type(*[spirit]|myBattlefield)~morethan~10 then choice name(Sacrifice 11 spirits) ability$!sacrifice notatarget(<11>spirit|mybattlefield)!$ controller && 36/0 ueot +auto=if type(*[spirit]|myBattlefield)~morethan~11 then choice name(Sacrifice 12 spirits) ability$!sacrifice notatarget(<12>spirit|mybattlefield)!$ controller && 39/0 ueot +auto=if type(*[spirit]|myBattlefield)~morethan~12 then choice name(Sacrifice 13 spirits) ability$!sacrifice notatarget(<13>spirit|mybattlefield)!$ controller && 42/0 ueot +auto=if type(*[spirit]|myBattlefield)~morethan~13 then choice name(Sacrifice 14 spirits) ability$!sacrifice notatarget(<14>spirit|mybattlefield)!$ controller && 45/0 ueot +auto=if type(*[spirit]|myBattlefield)~morethan~14 then choice name(Sacrifice 15 spirits) ability$!sacrifice notatarget(<15>spirit|mybattlefield)!$ controller && 48/0 ueot +auto=if type(*[spirit]|myBattlefield)~morethan~15 then choice name(Sacrifice 16 spirits) ability$!sacrifice notatarget(<16>spirit|mybattlefield)!$ controller && 51/0 ueot +auto=if type(*[spirit]|myBattlefield)~morethan~16 then choice name(Sacrifice 17 spirits) ability$!sacrifice notatarget(<17>spirit|mybattlefield)!$ controller && 54/0 ueot +auto=if type(*[spirit]|myBattlefield)~morethan~17 then choice name(Sacrifice 18 spirits) ability$!sacrifice notatarget(<18>spirit|mybattlefield)!$ controller && 57/0 ueot +auto=if type(*[spirit]|myBattlefield)~morethan~18 then choice name(Sacrifice 19 spirits) ability$!sacrifice notatarget(<19>spirit|mybattlefield)!$ controller && 60/0 ueot +auto=if type(*[spirit]|myBattlefield)~morethan~19 then choice name(Sacrifice 20 spirits) ability$!sacrifice notatarget(<20>spirit|mybattlefield)!$ controller && 63/0 ueot +text=As an additional cost to cast Devouring Rage, you may sacrifice any number of Spirits. -- Target creature gets +3/+0 until end of turn. For each Spirit sacrificed this way, that creature gets an additional +3/+0 until end of turn. +mana={4}{R} +type=Instant +subtype=Arcane +[/card] +[card] name=Devout Decree target=creature[red,black],planeswalker[red,black] auto=moveTo(exile) @@ -6986,6 +9117,16 @@ mana={1}{W} type=Sorcery [/card] [card] +name=Devout Harpist +auto={T}:destroy target(aura) +text={T}: Destroy target Aura attached to a creature. +mana={W} +type=Creature +subtype=Human +power=1 +toughness=1 +[/card] +[card] name=Diabolic Servitude auto=moveTo(myBattlefield) target(creature|mygraveyard) auto=soulbond @movedto(this|graveyard) from(battlefield):moveto(exile) && all(this) transforms((,newability[moveTo(ownerhand)])) @@ -7024,6 +9165,14 @@ power=1 toughness=3 [/card] [card] +name=Dictate of the Twin Gods +abilities=flash +auto=@damaged(creature,player,planeswalker) once:damage:thatmuch all(trigger[to]) +text=Flash -- If a source would deal damage to a permanent or player, it deals double that damage to that permanent or player instead. +mana={3}{R}{R} +type=Enchantment +[/card] +[card] name=Didn't Say Please target=*|stack auto=fizzle && deplete:3 targetcontroller @@ -7032,6 +9181,46 @@ mana={1}{U}{U} type=Instant [/card] [card] +name=Die Young +#AUTO_DEFINE _HARNESSED_COUNTER_($c) this(variable{penergy}>=$c) choice -$c/-$c && alterenergy:-$c controller +target=creature +auto=alterenergy:2 controller +auto=_HARNESSED_COUNTER_(0) +auto=_HARNESSED_COUNTER_(1) +auto=_HARNESSED_COUNTER_(2) +auto=_HARNESSED_COUNTER_(3) +auto=_HARNESSED_COUNTER_(4) +auto=_HARNESSED_COUNTER_(5) +auto=_HARNESSED_COUNTER_(6) +auto=_HARNESSED_COUNTER_(7) +auto=_HARNESSED_COUNTER_(8) +auto=_HARNESSED_COUNTER_(9) +auto=_HARNESSED_COUNTER_(10) +auto=_HARNESSED_COUNTER_(11) +auto=_HARNESSED_COUNTER_(12) +auto=_HARNESSED_COUNTER_(13) +auto=_HARNESSED_COUNTER_(14) +auto=_HARNESSED_COUNTER_(15) +auto=_HARNESSED_COUNTER_(16) +auto=_HARNESSED_COUNTER_(17) +auto=_HARNESSED_COUNTER_(18) +auto=_HARNESSED_COUNTER_(19) +auto=_HARNESSED_COUNTER_(20) +text=Choose target creature. You get {E}{E} (two energy counters), then you may pay any amount of {E}. The creature gets -1/-1 until end of turn for each {E} paid this way. +mana={1}{B} +type=Sorcery +[/card] +[card] +name=Diffusion Sliver +auto=@targeted(creature[sliver]|myBattlefield) from(*|opponentstack,opponentbattlefield,opponentexile,opponenthand,opponentlibrary):transforms((,newability[pay[[{2}]] name(pay 2 mana) donothing?fizzle])) oneshot +text=Whenever a Sliver creature you control becomes the target of a spell or ability an opponent controls, counter that spell or ability unless its controller pays {2}. +mana={1}{U} +type=Creature +subtype=Sliver +power=1 +toughness=1 +[/card] +[card] name=Diligent Excavator auto=@movedTo(*[artifact;legendary;saga]|mystack):target(player) deplete:2 text=Whenever you cast a historic spell, target player puts the top two cards of their library into their graveyard. (Artifacts, legendaries, and Sagas are historic.) @@ -7071,6 +9260,15 @@ mana={3} type=Artifact [/card] [card] +name=Dinosaur For +abilities=haste +type=Creature +subttype=Dinosaur +power=1 +toughness=1 +color=red +[/card] +[card] name=Dinosaur Hunter auto=@damaged(dinosaur) from(this):destroy text=Whenever Dinosaur Hunter deals damage to a Dinosaur, destroy that creature. @@ -7088,6 +9286,16 @@ mana={2}{R} type=Instant [/card] [card] +name=Diplomatic Escort +auto={U}{T}{D(*|myhand)}:fizzle target(*|stack) +text={U}, {T}, Discard a card: Counter target spell or ability that targets a creature. +mana={1}{U} +type=Creature +subtype=Human Spellshaper +power=1 +toughness=1 +[/card] +[card] name=Dire Fleet Captain auto=@combat(attacking) source(this):foreach(other pirate[attacking]) 1/1 ueot text=Whenever Dire Fleet Captain attacks, it gets +1/+1 until end of turn for each other attacking Pirate. @@ -7142,7 +9350,8 @@ toughness=2 [card] name=Dire Fleet Ravager abilities=deathtouch, menace -##auto=compare(lifetotal) life:-??? +auto=life:-thirdupopponentlifetotal opponent +auto=life:-thirduplifetotal controller text=Menace, deathtouch -- When Dire Fleet Ravager enters the battlefield, each player loses a third of his or her life, rounded up. mana={3}{B}{B} type=Creature @@ -7151,6 +9360,15 @@ power=4 toughness=4 [/card] [card] +name=Dire Tactics +target=creature +auto=moveTo(exile) +auto=restriction{(creature[-human]|myBattlefield)~equalto~0}:dynamicability +text=Exile target creature. If you don't control a Human, you lose life equal to that creature's toughness. +mana={W}{B} +type=Instant +[/card] +[card] name=Direct Current target=player,creature auto=damage:2 @@ -7161,6 +9379,52 @@ mana={1}{R}{R} type=Sorcery [/card] [card] +name=Dirge Bat +abilities=flash,flying,mutate +otherrestriction=type(creature[-human]|mybattlefield)~morethan~0 +auto=@movedTo(mytgt|graveyard) from(battlefield):all(this) moveTo(myGraveyard) +auto=@movedTo(mytgt|hand) from(battlefield):all(this) moveTo(myHand) +auto=@movedTo(mytgt|exile) from(battlefield):all(this) moveTo(myExile) +auto=@movedTo(mytgt|library) from(battlefield):all(this) moveTo(myLibrary) +auto=@movedTo(mytgt|sideboard) from(battlefield):all(this) moveTo(mySideboard) +auto={9999}:equip +other={2}{B}{B} name(Mutate) +auto=transforms((,newability[@mutated(this):target(*[creature;planeswalker]|opponentBattlefield) destroy])) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Over) choice name(Mutate Over) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-flash],newability[-flying])) forever all(this) && mutateover target(other creature[-human]|mybattlefield) && transforms((,newability[flash],newability[flying])) forever +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Under) choice name(Mutate Under) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-flash],newability[-flying])) forever all(this) && mutateunder target(other creature[-human]|mybattlefield) && transforms((,newability[flash],newability[flying])) forever +text=Mutate {4}{B}{B} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- Flash -- Flying -- Whenever this creature mutates, destroy target creature or planeswalker an opponent controls. +mana={2}{B}{B} +type=Creature +subtype=Bat +power=3 +toughness=3 +[/card] +[card] +name=Dirty Rat +auto=choice target(opponent) ability$!name(discard) notatarget(*|myhand) reject !$ targetedplayer +text=When this creature enters the battlefield, target opponent discards a card. +mana={1}{B} +type=Host Creature +subtype=Rat +power=1 +toughness=1 +[/card] +[card] +name=Disallow +target=*|stack +auto=fizzle +text=Counter target spell, activated ability, or triggered ability. (Mana abilities can't be targeted.) +mana={1}{U}{U} +type=Instant +[/card] +[card] +name=Disaster Radius +auto=target(creature|myhand) transforms((,newability[damage:manacost all(creature|opponentbattlefield) ueot])) +text=As an additional cost to cast Disaster Radius, reveal a creature card from your hand. -- Disaster Radius deals X damage to each creature your opponents control, where X is the revealed card's converted mana cost. +mana={5}{R}{R} +type=Sorcery +[/card] +[card] name=Discordant Piper auto=@movedTo(this|mygraveyard) from(Battlefield):token(Goat,Dis) text=When Discordant Piper dies, create a 0/1 white Goat creature token. @@ -7192,6 +9456,14 @@ power=2 toughness=2 [/card] [card] +name=Display of Dominance +auto=choice name(Destroy) destroy target(*[blue;black;-creature]) +auto=choice name(Protection) lord(*|mybattlefield) cantbetargetof(*[blue;black]|opponentstack) +text=Choose one — -- • Destroy target blue or black noncreature permanent. -- • Permanents you control can't be the targets of blue or black spells your opponents control this turn. +mana={1}{G} +type=Instant +[/card] +[card] name=Disposal Mummy auto=target(*|opponentgraveyard) moveTo(exile) text=When Disposal Mummy enters the battlefield, exile target card from an opponent's graveyard. @@ -7209,6 +9481,24 @@ mana={2}{R}{R} type=Sorcery [/card] [card] +name=Disrupting Shoal +other={E(other *|myhand)} name(Exile Card) +auto=if paid(alternative) then fizzle target(*[manacost=storedmanacost]|stack) +auto=ifnot paid(alternative) then fizzle target(*[manacost=prex]|stack) +text=You may exile a blue card with converted mana cost X from your hand rather than pay Disrupting Shoal's mana cost. -- Counter target spell if its converted mana cost is X. +mana={X}{U}{U} +type=Instant +subtype=Arcane +[/card] +[card] +name=Dissension in the Ranks +target=creature[blocking] +auto=transforms((,newability[target(other creature[blocking]) dynamicability])) ueot +text=Target blocking creature fights another target blocking creature. +mana={3}{R}{R} +type=Instant +[/card] +[card] name=Dissenter's Deliverance target=artifact auto=destroy @@ -7285,6 +9575,22 @@ power=4 toughness=3 [/card] [card] +name=Djinn of Infinite Deceits +abilities=flying +auto={T}:moveto(mybattlefield) target(*[-legendary]|opponentbattlefield) && moveto(opponentbattlefield) target(*[-legendary]|myBattlefield) +auto={T}:restriction{combatbeginsonly} donothing +auto={T}:restriction{attackersonly} donothing +auto={T}:restriction{blockersonly} donothing +auto={T}:restriction{combatdamageonly} donothing +auto={T}:restriction{combatendsonly} donothing +text=Flying -- {T}: Exchange control of two target nonlegendary creatures. You can't activate this ability during combat. +mana={4}{U}{U} +type=Creature +subtype=Djinn +power=2 +toughness=7 +[/card] +[card] name=Dockside Extortionist auto=foreach(type:*[artifact,enchantment]:opponentbattlefield) token(435451) text=When Dockside Extortionist enters the battlefield, create X Treasure tokens, where X is the number of artifacts and enchantments your opponents control. (Treasure tokens are artifacts with " {T}, Sacrifice this artifact: Add one mana of any color.") @@ -7390,6 +9696,18 @@ mana={2}{B} type=Sorcery [/card] [card] +name=Dormant Gomazoa +abilities=flying,doesnotuntap +auto=tap(noevent) +auto=@targeted(controller):untap +text=Flying -- Dormant Gomazoa enters the battlefield tapped. -- Dormant Gomazoa doesn't untap during your untap step. -- Whenever you become the target of a spell, you may untap Dormant Gomazoa. +mana={1}{U}{U} +type=Creature +subtype=Jellyfish +power=5 +toughness=5 +[/card] +[card] name=Doublecast auto=@moveTo(*[instant;sorcery]|myStack): castcard(copied noevent) target(*[instant;sorcery]|mystack) text=When you cast your next instant or sorcery spell this turn, copy that spell. You may choose new targets for the copy. @@ -7435,6 +9753,17 @@ type=Legendary Planeswalker subtype=Dovin [/card] [card] +name=Down // Dirty +other={2}{G} name(Dirty) +kicker={2}{G} +auto=if paid(alternative) then moveTo(myhand) target(*|mygraveyard) +auto=ifnot paid(alternative) then target(player) ability$!name(discard) target(<2>*|myhand) reject!$ targetedplayer +auto=kicker ifnot paid(alternative) then moveTo(myhand) target(*|mygraveyard) +text=Target player discards two cards. // Return target card from your graveyard to your hand. -- Fuse (You may cast one or both halves of this card from your hand.) +mana={3}{B} +type=Sorcery +[/card] +[card] name=Dowsing Dagger auto=token(Plant,creature Plant,0/2,green,defender)*2 auto=@combatdamaged(player) from(this):target(Dowsing Dagger) flip(Lost Vale) @@ -7446,6 +9775,23 @@ type=Artifact subtype=Equipment [/card] [card] +name=Draco +abilities=flying +anyzone=changecost(colorless:twicepbasiclandtypes) forcedalive +auto=this(pbasiclandtypes=0) upcost[{10}] sacrifice +auto=this(pbasiclandtypes=1) upcost[{8}] sacrifice +auto=this(pbasiclandtypes=2) upcost[{6}] sacrifice +auto=this(pbasiclandtypes=3) upcost[{4}] sacrifice +auto=this(pbasiclandtypes=4) upcost[{2}] sacrifice +auto=this(pbasiclandtypes>4) upcost[{0}] donothing +text=Domain — Draco costs {2} less to cast for each basic land type among lands you control. -- Flying -- Domain — At the beginning of your upkeep, sacrifice Draco unless you pay {10}. This cost is reduced by {2} for each basic land type among lands you control. +mana={16} +type=Artifact Creature +subtype=Dragon +power=9 +toughness=9 +[/card] +[card] name=Draconic Disciple auto={T}:Add{W} auto={T}:Add{U} @@ -7514,6 +9860,38 @@ mana={2}{W} type=Instant [/card] [card] +name=Dragonlord Atarka +abilities=flying,trample +auto=damage:1 target(creature,planeswalker|opponentbattlefield) +auto=ability$!name(damage) choice target(creature,planeswalker|opponentbattlefield) damage:1!$ controller +auto=ability$!name(damage) choice target(creature,planeswalker|opponentbattlefield) damage:1!$ controller +auto=ability$!name(damage) choice target(creature,planeswalker|opponentbattlefield) damage:1!$ controller +auto=ability$!name(damage) choice target(creature,planeswalker|opponentbattlefield) damage:1!$ controller +text=Flying, trample -- When Dragonlord Atarka enters the battlefield, it deals 5 damage divided as you choose among any number of target creatures and/or planeswalkers your opponents control. +mana={5}{R}{G} +type=Legendary Creature +subtype=Elder Dragon +power=8 +toughness=8 +[/card] +[card] +name=Dragonshift +abilities=overload +target=creature|mybattlefield +auto=ueot loseabilities +auto=flying ueot +auto=ueot transforms((,setpower=4,settoughness=4)) +auto=ueot transforms((Dragon,blue,red)) +other={3}{U}{U}{R}{R} name(Overload) +auto=overload all(creature|myBattlefield) ueot transforms((,setpower=4,settoughness=4)) +auto=overload all(creature|myBattlefield) ueot transforms((Dragon,blue,red)) +auto=overload all(creature|myBattlefield) ueot loseabilities +auto=overload all(creature|myBattlefield) flying ueot +text=Until end of turn, target creature you control becomes a 4/4 blue and red Dragon, loses all abilities, and gains flying. -- Overload {3}{U}{U}{R}{R} (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of "target" with "each.") +mana={1}{U}{R} +type=Instant +[/card] +[card] name=Drake Hav abilities=flying type=Creature @@ -7551,6 +9929,38 @@ power=7 toughness=7 [/card] [card] +name=Drannith Healer +auto=@cycled(*|myHand):life:1 controller +autohand=__CYCLING__({1}) +text=Whenever you cycle another card, you gain 1 life. -- Cycling {1} ({1}, Discard this card: Draw a card.) +mana={1}{W} +type=Creature +subtype=Human Cleric +power=2 +toughness=2 +[/card] +[card] +name=Drannith Magistrate +auto=maxCast(*|opponentbattlefield,opponentstack,opponentgraveyard,opponentlibrary,opponentexile])0 opponent +text=Your opponents can't cast spells from anywhere other than their hands. +mana={1}{W} +type=Creature +subtype=Human Wizard +power=1 +toughness=3 +[/card] +[card] +name=Drannith Stinger +auto=@cycled(*|myHand):damage:1 opponent +autohand=__CYCLING__({1}) +text=Whenever you cycle another card, Drannith Stinger deals 1 damage to each opponent. -- Cycling {1} ({1}, Discard this card: Draw a card.) +mana={1}{R} +type=Creature +subtype=Human Wizard +power=2 +toughness=2 +[/card] +[card] name=Drawn from Dreams aicode=activate target(*[zpos<=7]|mylibrary) moveto(ownerhand) auto=name(look) reveal:7 optionone name(Get two card) target(<2>*|reveal) moveto(myhand) optiononeend optiontwo name(put on bottom) target(<5>*|reveal) bottomoflibrary optiontwoend revealend @@ -7672,6 +10082,15 @@ text={T}: Add {C}. -- {1}, {T}: Put a storage counter on Dreadship Reef. -- {1}, type=Land [/card] [card] +name=Dream Coat +target=creature +auto=teach(creature) {0}:name(change color/s) ability$!name(choose color/s) choice name(white) becomes(,white) ueot _ choice name(blue) becomes(,blue) ueot _ choice name(black) becomes(,black) ueot _ choice name(red) becomes(,red) ueot _ choice name(green) becomes(,green) ueot _ choice name(white & blue) becomes(,white,blue) ueot _ choice name(blue & black) becomes(,black,blue) ueot _ choice name(black & red) becomes(,black,red) ueot _ choice name(red & green) becomes(,red,green) ueot _ choice name(green & white) becomes(,white,green) ueot _ choice name(white & black) becomes(,white,black) ueot _ choice name(blue & red) becomes(,red,blue) ueot _ choice name(black & green) becomes(,black,green) ueot _ choice name(red & white) becomes(,white,red) ueot _ choice name(green & blue) becomes(,green,blue) ueot _ choice name(green & white & blue) becomes(,green,white,blue) ueot _ choice name(white & blue & black) becomes(,black,white,blue) ueot _ choice name(blue & black & red) becomes(,black,red,blue) ueot _ choice name(black & red & green) becomes(,green,black,red) ueot _ choice name(red & green & white) becomes(,green,white,red) ueot _ choice name(white & black & green) becomes(,green,white,black) ueot _ choice name(blue & red & white) becomes(,red,white,blue) ueot _ choice name(black & green & blue) becomes(,green,black,blue) ueot _ choice name(red & white & black) becomes(,black,white,red) ueot _ choice name(green & blue & red) becomes(,green,red,blue) ueot _ choice name(green & red & blue & black) becomes(,green,red,blue,black) ueot _ choice name(green & red & blue & white) becomes(,green,red,blue,white) ueot _ choice name(white & blue & black & red) becomes(,white,red,blue,black) ueot _ choice name(white & blue & black & green) becomes(,white,green,blue,black) ueot _ choice name(all colors) becomes(,white,red,blue,black,green) ueot!$ controller limit:1 +text=Enchant creature -- {0}: Enchanted creature becomes the color or colors of your choice. Activate this ability only once each turn. +mana={U} +type=Enchantment +subtype=Aura +[/card] +[card] name=Dream Eater abilities=flash, flying auto=moveTo(ownerHand) target(*[-land]) @@ -7693,6 +10112,14 @@ mana={3}{U}{U} type=Enchantment [/card] [card] +name=Dream Tides +auto=lord(creature) doesnotuntap +auto=lord(creature[-green]) transforms((,newability[@each my upkeep:{2}:untap])) +text=Creatures don't untap during their controllers' untap steps. -- At the beginning of each player's upkeep, that player may choose any number of tapped nongreen creatures he or she controls and pay {2} for each creature chosen this way. If the player does, untap those creatures. +mana={2}{U}{U} +type=Enchantment +[/card] +[card] name=Dream Trawler abilities=flying,lifelink auto=@drawof(player):1/0 ueot @@ -7706,6 +10133,16 @@ power=3 toughness=5 [/card] [card] +name=Dream's Grip +target=*|battlefield +other={1}{U} name(Entwine) +auto=ifnot paid(alternative) then transforms((,newability[choice tap(noevent)],newability[choice untap])) +auto=if paid(alternative) then tap(noevent) && untap target(*|battlefield) +text=Choose one — Tap target permanent; or untap target permanent. -- Entwine {1} (Choose both if you pay the entwine cost.) +mana={U} +type=Instant +[/card] +[card] name=Dreamcaller Siren abilities=flash, flying, cloud auto=if type(other pirate|mybattlefield)~morethan~0 then tap target(*[-land]) @@ -7750,6 +10187,27 @@ power=1 toughness=2 [/card] [card] +name=Dreamtail Heron +abilities=flying,mutate +otherrestriction=type(creature[-human]|mybattlefield)~morethan~0 +auto=@movedTo(mytgt|graveyard) from(battlefield):all(this) moveTo(myGraveyard) +auto=@movedTo(mytgt|hand) from(battlefield):all(this) moveTo(myHand) +auto=@movedTo(mytgt|exile) from(battlefield):all(this) moveTo(myExile) +auto=@movedTo(mytgt|library) from(battlefield):all(this) moveTo(myLibrary) +auto=@movedTo(mytgt|sideboard) from(battlefield):all(this) moveTo(mySideboard) +auto={9999}:equip +other={3}{U} name(Mutate) +auto=transforms((,newability[@mutated(this):draw:1 controller])) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Over) choice name(Mutate Over) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-flying])) forever all(this) && mutateover target(other creature[-human]|mybattlefield) && transforms((,newability[flying])) forever +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Under) choice name(Mutate Under) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-flying])) forever all(this) && mutateunder target(other creature[-human]|mybattlefield) && transforms((,newability[flying])) forever +text=Mutate {3}{U} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- Flying -- Whenever this creature mutates, draw a card. +mana={4}{U} +type=Creature +subtype=Elemental Bird +power=3 +toughness=4 +[/card] +[card] name=Dredge the Mire target=creature|opponentGraveyard auto=moveTo(myBattlefield) @@ -7847,6 +10305,16 @@ power=2 toughness=3 [/card] [card] +name=Druid of the Sacred Beaker +auto={T}:foreach(Crossbreed Labs watermark|myBattlefield) add{G} +text={T}: Add {G} for each Crossbreed Labs watermark among permanents you control. +mana={2}{G} +type=Creature +subtype=Deer Bird Ape Druid +power=2 +toughness=2 +[/card] +[card] name=Dryad Greenseeker auto={T}:reveal:1 optionone if type(land|reveal)~morethan~0 then target(<1>*|reveal) moveto(hand) optiononeend optiontwo name(Put Back On Top) target(<1>*|reveal) moveto(mylibrary) optiontwoend revealend text={T}: Look at the top card of your library. If it's a land card, you may reveal it and put it into your hand. @@ -7879,6 +10347,18 @@ type=Enchantment subtype=Aura [/card] [card] +name=Dulcet Sirens +facedown={3} +autofacedown={U}:morph +autofaceup={U}{T}:mustattack target(creature) ueot +text={U}, {T}: Target creature attacks target opponent this turn if able. -- Morph {U} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) +mana={2}{U} +type=Creature +subtype=Siren +power=1 +toughness=3 +[/card] +[card] name=Dune Beetle mana={1}{B} type=Creature @@ -7905,6 +10385,16 @@ type=Land subtype=Desert [/card] [card] +name=Durable Coilbug +autograveyard={4}{B}:moveto(myhand) +text={4}{B}: Return Durable Coilbug from your graveyard to your hand. +mana={1}{B} +type=Creature +subtype=Insect +power=2 +toughness=2 +[/card] +[card] name=Dusk auto=destroy all(creature[power>=3]) autograveyard={3}{W}{W}:moveto(myhand) all(creature[power<=2]|mygraveyard) && moveto(exile) @@ -7959,6 +10449,17 @@ power=1 toughness=1 [/card] [card] +name=Duskfang Mentor +auto=target(creature[-human]|myBattlefield) transforms((,newability[counter(0/0,1,Lifelink)],newability[this(counter{0/0.1.Lifelink}>=1) lifelink])) +auto={1}{W}{T}:counter(1/1,1) all(creature[lifelink]|myBattlefield) +text=When Duskfang Mentor enters the battlefield, put a lifelink counter on target non-Human creature you control. -- {1}{B}, {T}: Put a +1/+1 counter on each creature you control with lifelink. +mana={2}{B} +type=Creature +subtype=Human Cleric +power=1 +toughness=3 +[/card] +[card] name=Duskmantle Operative auto=cantbeblockedby(creature[power>=4]) text=Duskmantle Operative can't be blocked by creatures with power 4 or greater. @@ -7977,6 +10478,16 @@ power=2 toughness=5 [/card] [card] +name=Dwarven Driller +auto={T}:name(destroy) target(land) transforms((,newability[pay[[{L:2}]] name(pay 2 life) donothing?destroy])) forever +text={T}: Destroy target land unless its controller has Dwarven Driller deal 2 damage to him or her. +mana={3}{R} +type=Creature +subtype=Dwarf +power=2 +toughness=2 +[/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. @@ -8006,6 +10517,16 @@ power=2 toughness=4 [/card] [card] +name=Dwarven Scorcher +auto={T}:name(damage) target(creature) transforms((,newability[pay[[{L:2}]] name(pay 2 life) donothing?damage:1])) forever +text=Sacrifice Dwarven Scorcher: Dwarven Scorcher deals 1 damage to target creature unless that creature's controller has Dwarven Scorcher deal 2 damage to him or her. +mana={R} +type=Creature +subtype=Dwarf +power=1 +toughness=1 +[/card] +[card] name=Dwindle target=creature auto=teach(creature) -6/-0 @@ -8016,6 +10537,16 @@ type=Enchantment subtype=Aura [/card] [card] +name=Eager Beaver +auto=may untap target(*|battlefield) +text=When this creature enters the battlefield, you may untap target permanent. +mana={2}{G} +type=Host Creature +subtype=Beaver +power=3 +toughness=2 +[/card] +[card] name=Eager Construct auto=may scry:1 scrycore delayed dontshow donothing scrycoreend scryend auto=may scry:1 scrycore delayed dontshow donothing scrycoreend scryend opponent @@ -8070,6 +10601,15 @@ power=5 toughness=5 [/card] [card] +name=Easy Prey +target=creature[manacost<=2] +auto=destroy +autohand=__CYCLING__({2}) +text=Destroy target creature with converted mana cost 2 or less. -- Cycling {2} ({2}, Discard this card: Draw a card.) +mana={1}{B} +type=Instant +[/card] +[card] name=Eat to Extinction target=creature,planeswalker auto=moveto(exile) target(creature,planeswalker) && scry:1 scrycore delayed dontshow donothing scrycoreend scryend @@ -8128,8 +10668,15 @@ mana={3} type=Artifact [/card] [card] +name=Eerie Ultimatum +auto=moveto(mybattlefield) target(*|mygraveyard) +text=Return any number of permanent cards with different names from your graveyard to the battlefield. +mana={W}{W}{B}{B}{B}{G}{G} +type=Sorcery +[/card] +[card] name=Eidolon of Inspiration -@each my combatbegins:2/0 target(creature|myBattlefield) ueot +auto=@each my combatbegins:2/0 target(creature|myBattlefield) ueot text=At the beginning of combat on your turn, target creature you control gets +2/+0 until end of turn. mana={1}{W}{W} type=Enchantment Creature @@ -8168,6 +10715,23 @@ mana={2} type=Artifact [/card] [card] +name=Eldrazi Mimic +auto=@movedto(other creature[colorless]|mybattlefield):all(trigger[to]) may becomes(storedpower/storedtoughness) ueot +text=Whenever another colorless creature enters the battlefield under your control, you may change Eldrazi Mimic's base power and toughness to that creature's power and toughness until end of turn. +mana={2} +type=Creature +subtype=Eldrazi +power=2 +toughness=1 +[/card] +[card] +name=Eldrazi Temple +auto={T}:add{1} +auto={T}:add{2} +text={T}: Add {1} to your mana pool. -- {T}: Add {2} to your mana pool. Spend this mana only to cast colorless Eldrazi spells or activate abilities of colorless Eldrazi. +type=Land +[/card] +[card] name=Electrify target=creature auto=damage:4 @@ -8184,6 +10748,13 @@ mana={X}{R}{R} type=Instant [/card] [card] +name=Electropotence +auto=@movedto(other creature[colorless]|mybattlefield):name(pay 2R for damage) pay[[{2}{R}]] name(Pay 2R):all(trigger[to]) transforms((,newability[target(creature,player) dynamicability])) ueot +text=Whenever a creature enters the battlefield under your control, you may pay {2}{R}. If you do, that creature deals damage equal to its power to target creature or player. +mana={2}{R} +type=Enchantment +[/card] +[card] name=Electrostatic Field abilities=defender auto=@movedTo(instant,sorcery|mystack):electrostatic field damage:1 each opponent @@ -8243,6 +10814,32 @@ power=1 toughness=1 [/card] [card] +name=Eliminate the Competition +auto=if type(*[creature]|myBattlefield)~morethan~0 then choice name(Sacrifice 1 creature) ability$!sacrifice notatarget(creature|mybattlefield)!$ controller && target(creature) destroy +auto=if type(*[creature]|myBattlefield)~morethan~1 then choice name(Sacrifice 2 creatures) ability$!sacrifice notatarget(<2>creature|mybattlefield)!$ controller && target(<2>creature) destroy +auto=if type(*[creature]|myBattlefield)~morethan~2 then choice name(Sacrifice 3 creatures) ability$!sacrifice notatarget(<3>creature|mybattlefield)!$ controller && target(<3>creature) destroy +auto=if type(*[creature]|myBattlefield)~morethan~3 then choice name(Sacrifice 4 creatures) ability$!sacrifice notatarget(<4>creature|mybattlefield)!$ controller && target(<4>creature) destroy +auto=if type(*[creature]|myBattlefield)~morethan~4 then choice name(Sacrifice 5 creatures) ability$!sacrifice notatarget(<5>creature|mybattlefield)!$ controller && target(<5>creature) destroy +auto=if type(*[creature]|myBattlefield)~morethan~5 then choice name(Sacrifice 6 creatures) ability$!sacrifice notatarget(<6>creature|mybattlefield)!$ controller && target(<6>creature) destroy +auto=if type(*[creature]|myBattlefield)~morethan~6 then choice name(Sacrifice 7 creatures) ability$!sacrifice notatarget(<7>creature|mybattlefield)!$ controller && target(<7>creature) destroy +auto=if type(*[creature]|myBattlefield)~morethan~7 then choice name(Sacrifice 8 creatures) ability$!sacrifice notatarget(<8>creature|mybattlefield)!$ controller && target(<8>creature) destroy +auto=if type(*[creature]|myBattlefield)~morethan~8 then choice name(Sacrifice 9 creatures) ability$!sacrifice notatarget(<9>creature|mybattlefield)!$ controller && target(<9>creature) destroy +auto=if type(*[creature]|myBattlefield)~morethan~9 then choice name(Sacrifice 10 creatures) ability$!sacrifice notatarget(<10>creature|mybattlefield)!$ controller && target(<10>creature) destroy +auto=if type(*[creature]|myBattlefield)~morethan~10 then choice name(Sacrifice 11 creatures) ability$!sacrifice notatarget(<11>creature|mybattlefield)!$ controller && target(<11>creature) destroy +auto=if type(*[creature]|myBattlefield)~morethan~11 then choice name(Sacrifice 12 creatures) ability$!sacrifice notatarget(<12>creature|mybattlefield)!$ controller && target(<12>creature) destroy +auto=if type(*[creature]|myBattlefield)~morethan~12 then choice name(Sacrifice 13 creatures) ability$!sacrifice notatarget(<13>creature|mybattlefield)!$ controller && target(<13>creature) destroy +auto=if type(*[creature]|myBattlefield)~morethan~13 then choice name(Sacrifice 14 creatures) ability$!sacrifice notatarget(<14>creature|mybattlefield)!$ controller && target(<14>creature) destroy +auto=if type(*[creature]|myBattlefield)~morethan~14 then choice name(Sacrifice 15 creatures) ability$!sacrifice notatarget(<15>creature|mybattlefield)!$ controller && target(<15>creature) destroy +auto=if type(*[creature]|myBattlefield)~morethan~15 then choice name(Sacrifice 16 creatures) ability$!sacrifice notatarget(<16>creature|mybattlefield)!$ controller && target(<16>creature) destroy +auto=if type(*[creature]|myBattlefield)~morethan~16 then choice name(Sacrifice 17 creatures) ability$!sacrifice notatarget(<17>creature|mybattlefield)!$ controller && target(<17>creature) destroy +auto=if type(*[creature]|myBattlefield)~morethan~17 then choice name(Sacrifice 18 creatures) ability$!sacrifice notatarget(<18>creature|mybattlefield)!$ controller && target(<18>creature) destroy +auto=if type(*[creature]|myBattlefield)~morethan~18 then choice name(Sacrifice 19 creatures) ability$!sacrifice notatarget(<19>creature|mybattlefield)!$ controller && target(<19>creature) destroy +auto=if type(*[creature]|myBattlefield)~morethan~19 then choice name(Sacrifice 20 creatures) ability$!sacrifice notatarget(<20>creature|mybattlefield)!$ controller && target(<20>creature) destroy +text=As an additional cost to cast Eliminate the Competition, sacrifice X creatures. -- Destroy X target creatures. +mana={4}{B} +type=Sorcery +[/card] +[card] name=Elite Arrester auto={1}{U}{T}:tap target(creature) text={1}{U}, {T}: Tap target creature. @@ -8287,6 +10884,24 @@ power=2 toughness=2 [/card] [card] +name=Elkin Bottle +auto={3}{T}:moveto(exile) and!( transforms((,canplayfromexile)) uynt )! all(*[zpos=1]|mylibrary) +text={3}, {T}: Exile the top card of your library. Until the beginning of your next upkeep, you may play that card. +mana={3} +type=Artifact +[/card] +[card] +name=Elsha of the Infinite +auto=@movedTo(*[-creature]|mystack):1/1 ueot +abilities=showfromtoplibrary,canplayartifactlibrarytop,canplayinstantsorcerylibrarytop +text=Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.) -- You may look at the top card of your library any time. -- You may cast the top card of your library if it's a noncreature, nonland card, and you may cast it as though it had flash. +mana={2}{U}{R}{W} +type=Legendary Creature +subtype=Djinn Monk +power=3 +toughness=3 +[/card] +[card] name=Elspeth Conquers Death auto=moveTo(Exile) target(*[manacost>=3]|opponentbattlefield) auto=counter(0/0,1,Lore) @@ -8405,15 +11020,14 @@ toughness=1 [/card] [card] name=Embereth Shieldbreaker // Battle Display -abilities=canplayfromexile -target=artifact|battlefield,player +abilities=canplayfromexile,adventure other={R} name(Adventure) -auto=if paid(alternative) then destroy +auto=if paid(alternative) then target(artifact|battlefield) destroy auto=if paid(alternative) then moveto(exile) all(this) text=Destroy target artifact. (Then exile this card. You may cast the creature later from exile.) mana={1}{R} type=Creature -subtype=Human Knight Adventure +subtype=Human Knight power=2 toughness=1 [/card] @@ -8461,6 +11075,15 @@ mana={5}{W}{U} type=Instant [/card] [card] +name=Emergent Ultimatum +auto=ability$! notatarget(*|opponentexile) moveto(ownerlibrary) !$ opponent +auto=transforms((,newability[choice name(Reveal 2 and cast 2) target(<2>*|mylibrary) moveTo(myBattlefield)],newability[choice name(Reveal 2 and move to exile) target(<2>*|mylibrary) moveTo(myexile)])) +auto=moveTo(exile) +text=Search your library for up to three monocolored cards with different names and exile them. An opponent chooses one of those cards. Shuffle that card into your library. You may cast the other cards without paying their mana costs. Exile Emergent Ultimatum. +mana={B}{B}{G}{G}{G}{U}{U} +type=Sorcery +[/card] +[card] name=Emissary of Sunrise abilities=first strike auto=reveal:1 optionone if type(land|reveal)~lessthan~1 then transforms((,newability[counter(1/1)])) optiononeend optiontwo if type(land|reveal)~morethan~0 then name(move to Hand) target(<1>*|reveal) moveto(myHand) else transforms((,newability[Choice name(back to library) target(<1>*|reveal) moveto(mylibrary)],newability[Choice name(put into Graveyard) target(<1>*|reveal) moveto(myGraveyard)])) optiontwoend revealend limit:1 @@ -8504,6 +11127,14 @@ mana={4} type=Artifact [/card] [card] +name=Empty the Pits +other={delve} name(Delve) +auto=token(Zombie,Creature Zombie,2/2,black) and!( tap(noevent) )!*xx +text=Delve (Each card you exile from your graveyard while casting this spell pays for {1}.) -- Put X 2/2 black Zombie creature tokens onto the battlefield tapped. +mana={X}{X}{B}{B}{B}{B} +type=Instant +[/card] +[card] name=Empyrean Eagle abilities=flying auto=lord(creature[flying]|mybattlefield) 1/1 @@ -8593,6 +11224,17 @@ power=3 toughness=3 [/card] [card] +name=Enduring Scalelord +abilities=flying +auto=@counter(1/1,1) target(creature|myBattlefield):may counter(1/1,1) +text=Flying -- Whenever one or more +1/+1 counters are placed on another creature you control, you may put a +1/+1 counter on Enduring Scalelord. +mana={4}{G}{W} +type=Creature +subtype=Dragon +power=4 +toughness=4 +[/card] +[card] name=Enduring Sliver auto={2}{T}:counter(1/1,1) asSorcery auto=lord(sliver|mybattlefield) transforms((,newability[{2}{T}:counter(1/1,1) asSorcery])) @@ -8652,6 +11294,16 @@ mana={2}{G}{U} type=Enchantment [/card] [card] +name=Enlarge +target=creates +auto=trample ueot +auto=7/7 ueot +auto=transform((,newability[@combat(attacking) source(this): all(creature|opponentbattlefield) mustblock ueot])) ueot +text=Target creature gets +7/+7 and gains trample until end of turn. It must be blocked this turn if able. (If a creature with trample would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.) +mana={3}{G}{G} +type=Sorcery +[/card] +[card] name=Enraged Ceratok auto=cantbeblockedby(creature[power<=2]) text=Enraged Ceratok can't be blocked by creatures with power 2 or less. @@ -8662,6 +11314,24 @@ power=4 toughness=4 [/card] [card] +name=Enraged Killbot +mana={2} +type=Artifact Creature +subtype=Killbot +power=2 +toughness=1 +[/card] +[card] +name=Ensouled Scimitar +auto={2}:equip +auto={3}:becomes(Artifact Creature Spirit,1/5,flying) ueot +auto=teach(creature) 1/5 +text={3}: Ensouled Scimitar becomes a 1/5 Spirit artifact creature with flying until end of turn. (Equipment that's a creature can't equip a creature.) -- Equipped creature gets +1/+5. -- Equip {2} ({2}: Attach to target creature you control. Equip only as a sorcery.) +mana={3} +type=Artifact +subtype=Equipment +[/card] +[card] name=Enter the God-Eternals target=creature auto=damage:4 @@ -8697,6 +11367,14 @@ mana={3}{W} type=Instant [/card] [card] +name=Entreat the Angels +autohand=restriction{miracle} pay[[{X}{W}{W}]] name(Miracle) activate name(Miracle) castcard(restricted) +auto=token(Angel, Creature Angel,4/4,flying,white)*XX +text=Put X 4/4 white Angel creature tokens with flying onto the battlefield. -- Miracle {X}{W}{W} (You may cast this card for its miracle cost when you draw it if it's the first card you drew this turn.) +mana={X}{X}{W}{W}{W} +type=Sorcery +[/card] +[card] name=Entreat the Dead target=creature|mygraveyard auto=moveTo(myBattlefield) @@ -8708,7 +11386,7 @@ type=Sorcery [card] name=Eon Frolicker abilities=flying -auto=if casted(this) then turns:+1 opponent && protecction from(*) uynt && all(planeswalker|myBattlefield) protecction from(*) uynt +auto=if casted(this) then turns:+1 opponent && protection from(*) uynt && all(planeswalker|myBattlefield) protection from(*) uynt text=Flying -- When Eon Frolicker enters the battlefield, if you cast it, target opponent takes an extra turn after this one. Until your next turn, you and planeswalkers you control gain protection from that player. (You and planeswalkers you control can’t be targeted, dealt damage, or enchanted by anything controlled by that player.) mana={2}{U}{U} type=Creature @@ -8719,7 +11397,8 @@ toughness=5 [card] name=Ephemerate auto=target(creature|mybattlefield) moveto(exile) and!(moveto(ownerbattlefield))! -auto=if rebound then moveto(exile) all(this) and!( transforms((,newability[@rebounded:may activate castcard(normal)])) forever )! +auto=if rebound then moveto(exile) +autoexile=@rebounded:may activate castcard(normal) text=Exile target creature you control, then return it to the battlefield under its owner's control. -- Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) mana={W} type=Instant @@ -8751,6 +11430,19 @@ mana={X}{B} type=Instant [/card] [card] +name=Erebos's Titan +auto=restriction{type(creature|opponentBattlefield)~lessthan~1}:indestructible +autograveyard=@movedTo(creature|opponentexile) from(opponentgraveyard):if type(*|myhand)~morethan~0 then ability$!may reject notatarget(*|myhand) and!(moveTo(myhand))! !$ controller +autograveyard=@movedTo(creature|opponentBattlefield) from(opponentgraveyard):if type(*|myhand)~morethan~0 then ability$!may reject notatarget(*|myhand) and!(moveTo(myhand))! !$ controller +autograveyard=@movedTo(creature|opponenthand) from(opponentgraveyard):if type(*|myhand)~morethan~0 then ability$!may reject notatarget(*|myhand) and!(moveTo(myhand))! !$ controller +text=As long as your opponents control no creatures, Erebos's Titan has indestructible. (Damage and effects that say "destroy" don't destroy it.) -- Whenever a creature card leaves an opponent's graveyard, you may discard a card. If you do, return Erebos's Titan from your graveyard to your hand. +mana={1}{B}{B}{B} +type=Creature +subtype=Giant +power=5 +toughness=5 +[/card] +[card] name=Erebos, Bleak-Hearted abilities=indestructible auto=this(variable{type:manab}<5) transforms((removetypes,newability[becomes(Legendary Enchantment God)])) @@ -8796,6 +11488,13 @@ power=2 toughness=2 [/card] [card] +name=Escape Protocol +auto=@cycled(*|myHand):may pay({1}) target(creature,artifact|myBattlefield) moveto(exile) and!(moveto(mybattlefield))! +text=Whenever you cycle a card, you may pay 1 . When you do, exile target artifact or creature you control, then return it to the battlefield under its owner's control. +mana={1}{U} +type=Enchantment +[/card] +[card] name=Escape Velocity target=creature auto=haste @@ -8824,6 +11523,17 @@ mana={U}{U} type=Instant [/card] [card] +name=Essence Symbiote +auto=@mutated(creature|mybattlefield):all(trigger[to]) counter(1/1) +auto=@mutated(creature|mybattlefield):life:2 controller +text=Whenever a creature you control mutates, put a +1/+1 counter on that creature and you gain 2 life. +mana={1}{G} +type=Creature +subtype=Beast +power=2 +toughness=2 +[/card] +[card] name=Estrid's Invocation auto=this(cantargetcard(*[enchantment|myBattlefield])) may copy notatarget(enchantment|myBattlefield) transforms((,newability[@each my upkeep:moveto(exile) and!(moveto(mybattlefield))!])) text=You may have Estrid’s Invocation enter the battlefield as a copy of any enchantment you control, except it has “At the beginning of your upkeep, you may exile this enchantment. If you do, return it to the battlefield under its owner’s control.” @@ -8942,6 +11652,14 @@ power=2 toughness=2 [/card] [card] +name=Evasive Action +target=*|stack +auto=if cantargetcard(*|opponentstack) then transforms((,newability[pay[[{pbasiclandtypes}]] name(pay {pbasiclandtypes} mana) donothing?fizzle])) forever else transforms((,newability[pay[[{pbasiclandtypes}]] name(pay {pbasiclandtypes} mana) donothing?fizzle])) forever +text=Domain — Counter target spell unless its controller pays {1} for each basic land type among lands you control. +mana={1}{U} +type=Instant +[/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. @@ -8959,6 +11677,27 @@ power=2 toughness=2 [/card] [card] +name=Everquill Phoenix +abilities=flying,mutate +otherrestriction=type(creature[-human]|mybattlefield)~morethan~0 +auto=@movedTo(mytgt|graveyard) from(battlefield):all(this) moveTo(myGraveyard) +auto=@movedTo(mytgt|hand) from(battlefield):all(this) moveTo(myHand) +auto=@movedTo(mytgt|exile) from(battlefield):all(this) moveTo(myExile) +auto=@movedTo(mytgt|library) from(battlefield):all(this) moveTo(myLibrary) +auto=@movedTo(mytgt|sideboard) from(battlefield):all(this) moveTo(mySideboard) +auto={9999}:equip +other={3}{R} name(Mutate) +auto=transforms((,newability[@mutated(this):token(Feather Eve)])) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Over) choice name(Mutate Over) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-flying])) forever all(this) && mutateover target(other creature[-human]|mybattlefield) && transforms((,newability[flying])) forever +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Under) choice name(Mutate Under) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-flying])) forever all(this) && mutateunder target(other creature[-human]|mybattlefield) && transforms((,newability[flying])) forever +text=Mutate {3}{R} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- Flying -- Whenever this creature mutates, create a red artifact token named Feather with "{1}, Sacrifice Feather: Return target Phoenix card from your graveyard to the battlefield tapped." +mana={2}{R}{R} +type=Creature +subtype=Phoenix +power=4 +toughness=4 +[/card] +[card] name=Eviscerate target=creature auto=destroy @@ -9011,6 +11750,62 @@ power=3 toughness=5 [/card] [card] +name=Excavation Mole +auto=deplete:3 controller +text=Trample -- When Excavation Mole enters the battlefield, put the top three cards of your library into your graveyard. +mana={2}{G} +type=Creature +subtype=Mole +power=3 +toughness=3 +[/card] +[card] +name=Excavator +auto={T}{S(land[basic,island]|myBattlefield)}:target(creature) islandwalk ueot +auto={T}{S(land[basic,mountain]|myBattlefield)}:target(creature) mountainwalk ueot +auto={T}{S(land[basic,plains]|myBattlefield)}:target(creature) plainswalk ueot +auto={T}{S(land[basic,forest]|myBattlefield)}:target(creature) forestwalk ueot +auto={T}{S(land[basic,swamp]|myBattlefield)}:target(creature) swampwalk ueot +auto={T}{S(land[basic,swamp,island]|myBattlefield)}:target(creature) swampwalk ueot && islandwalk ueot +auto={T}{S(land[basic,mountain,island]|myBattlefield)}:target(creature) mountainwalk ueot && islandwalk ueot +auto={T}{S(land[basic,plains,island]|myBattlefield)}:target(creature) plainswalk ueot && islandwalk ueot +auto={T}{S(land[basic,forest,island]|myBattlefield)}:target(creature) forestwalk ueot && islandwalk ueot +auto={T}{S(land[basic,mountain,swamp]|myBattlefield)}:target(creature) mountainwalk ueot && swampwalk ueot +auto={T}{S(land[basic,plains,swamp]|myBattlefield)}:target(creature) plainswalk ueot && swampwalk ueot +auto={T}{S(land[basic,forest,swamp]|myBattlefield)}:target(creature) forestwalk ueot && swampwalk ueot +auto={T}{S(land[basic,mountain,plains]|myBattlefield)}:target(creature) mountainwalk ueot && plainswalk ueot +auto={T}{S(land[basic,plains,forest]|myBattlefield)}:target(creature) plainswalk ueot && forestwalk ueot +auto={T}{S(land[basic,forest,mountain]|myBattlefield)}:target(creature) mountainwalk ueot && forestwalk ueot +auto={T}{S(land[basic,mountain,forest,island]|myBattlefield)}:target(creature) mountainwalk ueot && forestwalk ueot && islandwalk ueot +auto={T}{S(land[basic,mountain,forest,swamp]|myBattlefield)}:target(creature) mountainwalk ueot && forestwalk ueot && swampwalk ueot +auto={T}{S(land[basic,mountain,forest,plains]|myBattlefield)}:target(creature) mountainwalk ueot && forestwalk ueot && plainswalk ueot +auto={T}{S(land[basic,mountain,island,swamp]|myBattlefield)}:target(creature) mountainwalk ueot && swampwalk ueot && islandwalk ueot +auto={T}{S(land[basic,mountain,island,plains]|myBattlefield)}:target(creature) mountainwalk ueot && plainswalk ueot && islandwalk ueot +auto={T}{S(land[basic,mountain,swamp,plains]|myBattlefield)}:target(creature) mountainwalk ueot && plainswalk ueot && swampwalk ueot +auto={T}{S(land[basic,swamp,island,plains]|myBattlefield)}:target(creature) swampwalk ueot && plainswalk ueot && islandwalk ueot +auto={T}{S(land[basic,swamp,island,forest]|myBattlefield)}:target(creature) forestwalk ueot && swampwalk ueot && islandwalk ueot +auto={T}{S(land[basic,swamp,plains,forest]|myBattlefield)}:target(creature) forestwalk ueot && swampwalk ueot && plainswalk ueot +auto={T}{S(land[basic,plains,forest,island]|myBattlefield)}:target(creature) forestwalk ueot && islandwalk ueot && plainswalk ueot +auto={T}{S(land[basic,mountain,island,forest,plains]|myBattlefield)}:target(creature) mountainwalk ueot && forestwalk ueot && islandwalk ueot && plainswalk ueot +auto={T}{S(land[basic,mountain,island,forest,swamp]|myBattlefield)}:target(creature) mountainwalk ueot && forestwalk ueot && islandwalk ueot && swampwalk ueot +auto={T}{S(land[basic,mountain,island,swamp,plains]|myBattlefield)}:target(creature) mountainwalk ueot && swampwalk ueot && islandwalk ueot && plainswalk ueot +auto={T}{S(land[basic,mountain,plains,forest,swamp]|myBattlefield)}:target(creature) mountainwalk ueot && forestwalk ueot && plainswalk ueot && swampwalk ueot +auto={T}{S(land[basic,plains,island,forest,swamp]|myBattlefield)}:target(creature) plainswalk ueot && forestwalk ueot && islandwalk ueot && swampwalk ueot +auto={T}{S(land[basic,mountain,plains,island,forest,swamp]|myBattlefield)}:target(creature) mountainwalk ueot && plainswalk ueot && forestwalk ueot && islandwalk ueot && swampwalk ueot +text={T}, Sacrifice a basic land: Target creature gains landwalk of each of the land types of the sacrificed land until end of turn. +mana={2} +type=Artifact +[/card] +[card] +name=Excise +target=creature[attacking] +auto=moveTo(exile) +auto=transforms((,newability[pay[[{prex}]] name(pay {prex} mana) donothing?moveTo(exile)])) forever +text=Exile target attacking creature unless its controller pays {X}. +mana={X}{W} +type=Instant +[/card] +[card] name=Exclusion Mage auto=moveto(ownerHand) target(creature|opponentBattlefield) text=When Exclusion Mage enters the battlefield, return target creature an opponent controls to its owner's hand. @@ -9021,6 +11816,16 @@ power=2 toughness=2 [/card] [card] +name=Excruciator +#MISSING: damage can't be prevented +text=Damage that would be dealt by Excruciator can't be prevented. +mana={6}{R}{R} +type=Creature +subtype=Avatar +power=7 +toughness=7 +[/card] +[card] name=Exemplar of Strength auto=counter(-1/-1,3) target(creature|mybattlefield) auto=@combat(attacking) source(this){restriction type(this[counter(-1/-1)])~morethan~0}:counter(-1/-1,-1) && life:1 controller @@ -9032,6 +11837,17 @@ power=4 toughness=4 [/card] [card] +name=Exiled Doomsayer +auto=lord(*[morph]|mycastingzone) altercost(colorless, +2) +auto=lord(*[morph]|opponentcastingzone) altercost(colorless, +2) +text=All morph costs cost {2} more. (This doesn't affect the cost to cast creature spells face down.) +mana={1}{W} +type=Creature +subtype=Human Cleric +power=1 +toughness=2 +[/card] +[card] name=Exotic Orchard auto=this(variable{plandg}>0) {t}:out{g} auto=this(variable{plandu}>0) {t}:out{u} @@ -9071,6 +11887,17 @@ mana={2}{W} type=Instant [/card] [card] +name=Exquisite Archangel +abilities=flying +auto=@damageof(player):if compare(lifetotal)~lessthan~thatmuchplus1plusend then moveTo(exile) && lifeset:20 +text=Flying -- If you would lose the game, instead exile Exquisite Archangel and your life total becomes equal to your starting life total. +mana={5}{W}{W} +type=Creature +subtype=Angel +power=5 +toughness=5 +[/card] +[card] name=Exquisite Firecraft target=creature,player,planeswalker auto=damage:4 @@ -9080,6 +11907,16 @@ mana={1}{R}{R} type=Sorcery [/card] [card] +name=Exuberant Wolfbear +auto=@combat(attacking) source(this):may target(human|myBattlefield) becomes(p/t) ueot +text=Whenever Exuberant Wolfbear attacks, you may change the base power and toughness of target Human you control to Exuberant Wolfbear's power and toughness until end of turn. +mana={3}{G} +type=Creature +subtype=Wolf Bear +power=4 +toughness=4 +[/card] +[card] name=Exultant Skymarcher abilities=flying text=Flying @@ -9102,6 +11939,17 @@ power=1 toughness=1 [/card] [card] +name=Eyekite +abilities=flying +auto=restriction{compare(pdrewcount)~morethan~1} 2/0 ueot +text=Flying -- Eyekite gets +2/+0 as long as you've drawn two or more cards this turn. +mana={1}{U} +type=Creature +subtype=Drake +power=1 +toughness=2 +[/card] +[card] name=Eyes Everywhere auto={5}{U}:moveto(mybattlefield) target(*[-land]|opponentbattlefield) && moveto(opponentbattlefield) all(this) auto=@each my upkeep:scrycore delayed dontshow donothing scrycoreend scryend @@ -9128,6 +11976,16 @@ power=3 toughness=3 [/card] [card] +name=Fa'adiyah Seer +auto={T}:reveal:1 optionone if type(land|reveal)~morethan~0 then target(<1>*|reveal) moveto(myHand) optiononeend optiontwo if type(land|reveal)~lessthan~1 then target(<1>*|reveal) moveto(myGraveyard) optiontwoend revealend +text={T}: Draw a card and reveal it. If it isn't a land card, discard it. +mana={1}{G} +type=Creature +subtype=Human Shaman +power=1 +toughness=1 +[/card] +[card] name=Fabled Passage auto=aslongas(land|myBattlefield)~morethan~2 {T}{S}:name(search card) reveal:plibrarycount optionone name(choose card) target(land[basic]|reveal) moveto(ownerlibrary) and!( becomes(tobecast) ueot )! optiononeend optiontwo name(put back) target(<1>*|reveal) moveto(ownerlibrary) and!( all(*|reveal) moveto(ownerlibrary) and!(shuffle)! )! optiontwoend afterrevealed all(tobecast|mylibrary) moveto(ownerlibrary) and!(moveTo(myBattlefield) and!(untap(noevent))!)! afterrevealedend revealend auto=aslongas(land|myBattlefield)~lessthan~3 {T}{S}:name(search card) reveal:plibrarycount optionone name(choose card) target(land[basic]|reveal) moveto(ownerlibrary) and!( becomes(tobecast) ueot )! optiononeend optiontwo name(put back) target(<1>*|reveal) moveto(ownerlibrary) and!( all(*|reveal) moveto(ownerlibrary) and!(shuffle)! )! optiontwoend afterrevealed all(tobecast|mylibrary) moveto(ownerlibrary) and!(moveTo(myBattlefield) and!(tap(noevent))!)! afterrevealedend revealend @@ -9135,15 +11993,33 @@ text={T}, Sacrifice Fabled Passage: Search your library for a basic land card, p type=Land [/card] [card] +name=Facet Reader +auto={1}{T}:draw:1 controller && reject:1 controller +text={1}, {T}: Draw a card, then discard a card. +mana={1}{U} +type=Creature +subtype=Human Wizard +power=1 +toughness=2 +[/card] +[card] +name=Fade Away +auto=foreach(creature|myBattlefield) transforms((,newability[pay[[{1}]] name(pay 1 mana) donothing?sacrifice target(*|mybattlefield) controller])) +auto=foreach(creature|opponentBattlefield) transforms((,newability[pay[[{1}]] name(pay 1 mana) donothing?sacrifice target(*|mybattlefield) opponent])) +text=For each creature, its controller sacrifices a permanent unless he or she pays {1}. +mana={2}{U} +type=Sorcery +[/card] +[card] name=Fae of Wishes // Granted -abilities=canplayfromexile,flying +abilities=canplayfromexile,flying,adventure other={3}{U} name(Adventure) auto=if paid(alternative) then reveal:type:*:mysideboard revealzone(mysideboard) optionone name(choose card) target(<1>*[-creature]|reveal) moveto(myhand) and!(all(other *|reveal) moveto(ownersideboard))! optiononeend optiontwo name(put back) target(<1>*|reveal) moveto(ownersideboard) and!(all(other *|reveal) moveto(ownersideboard))! optiontwoend revealend && moveto(exile) all(this) auto={1}{U}{D(*|myhand)}{D(*|myhand)}:moveTo(ownerhand) text=Flying -- {1}{U}, Discard two cards: Return Fae of Wishes to its owner's hand. -- You may choose a noncreature card you own from outside the game, reveal it, and put it into your hand. mana={1}{U} type=Creature -subtype=Faerie Wizard Adventure +subtype=Faerie Wizard power=1 toughness=4 [/card] @@ -9194,16 +12070,14 @@ toughness=4 [/card] [card] name=Faerie Guidemother // Gift of the Fae -abilities=canplayfromexile,flying -target=creature|battlefield,player +abilities=canplayfromexile,flying,adventure other={1}{W} name(Adventure) -auto=if paid(alternative) then 2/1 ueot -auto=if paid(alternative) then flying ueot +auto=if paid(alternative) then target(creature) transforms((,newability[flying],newability[2/1])) ueot auto=if paid(alternative) then moveto(exile) all(this) text=Flying -- Target creature gets +2/+1 and gains flying until end of turn. (Then exile this card. You may cast the creature later from exile.) mana={W} type=Creature -subtype=Faerie Adventure +subtype=Faerie power=1 toughness=1 [/card] @@ -9230,6 +12104,16 @@ power=1 toughness=2 [/card] [card] +name=Fairgrounds Trumpeter +auto=@counteradded(1/1) from(*|mybattlefield):counter(1/1) +text=At the beginning of each end step, if a +1/+1 counter was placed on a permanent under your control this turn, put a +1/+1 counter on Fairgrounds Trumpeter. +mana={2}{G} +type=Creature +subtype=Elephant +power=2 +toughness=2 +[/card] +[card] name=Faith of the Devoted auto=@movedto(*|mygraveyard) from(myhand):pay({1}) life:2 controller && life:-2 opponent text=Whenever you cycle or discard a card, you may pay {1}. If you do, each opponent loses 2 life and you gain 2 life. @@ -9263,6 +12147,16 @@ power=5 toughness=4 [/card] [card] +name=Falling Timber +target=creature +other={2}{G}{S(land|myBattlefield)} name(Sacrifice a Land) +auto=0/0 && fog from(mytgt) oneshot +auto=if paid(alternative) then 0/0 target(other creature) && fog from(mytgt) oneshot +text=Kicker—Sacrifice a land. (You may sacrifice a land in addition to any other costs as you cast this spell.) -- Prevent all combat damage target creature would deal this turn. If Falling Timber was kicked, prevent all combat damage another target creature would deal this turn. +mana={2}{G} +type=Instant +[/card] +[card] name=Famished Paladin auto=doesnotuntap auto=@lifeof(player):untap(this) @@ -9315,6 +12209,29 @@ power=5 toughness=3 [/card] [card] +name=Far // Away +other={2}{B} name(Away) +kicker={2}{B} +auto=if paid(alternative) then target(player) ability$!name(sacrifice) notatarget(creature|mybattlefield) sacrifice!$ targetedplayer +auto=ifnot paid(alternative) then moveto(ownerhand) target(creature) +auto=kicker ifnot paid(alternative) then target(player) ability$!name(sacrifice) notatarget(creature|mybattlefield) sacrifice!$ targetedplayer +text=Return target creature to its owner's hand. // Target player sacrifices a creature. -- Fuse (You may cast one or both halves of this card from your hand.) +mana={1}{U} +type=Instant +[/card] +[card] +name=Farfinder +abilities=vigilance +aicode=activate target(land[basic]|mylibrary) moveto(myhand) +auto=name(search card) Reveal:type:*:mylibrary revealzone(mylibrary) optionone name(choose card) target(<1>land[basic]|reveal) transforms((,newability[all(other *|reveal) moveto(mylibrary) and!(shuffle)!],newability[moveto(myhand)])) optiononeend optiontwo name(shuffle) bottomoflibrary target(<1>*|reveal) and!( all(*|reveal) bottomoflibrary and!(shuffle)! )! optiontwoend revealend +text=Vigilance -- When Farfinder enters the battlefield, you may search your library for a basic land card, reveal it, put it into your hand, then shuffle your library. +mana={3} +type=Creature +subtype=Fox +power=1 +toughness=1 +[/card] +[card] name=Farm target=creature[attacking;blocking] auto=destroy @@ -9438,6 +12355,11 @@ power=7 toughness=6 [/card] [card] +name=Feather Eve +auto={1}{S}:target(*[Phoenix]|mygraveyard) moveto(myBattlefield) and!(tap(noevent))! +type=Artifact +[/card] +[card] name=Feiyi Snake abilities=reach text=Reach (This creature can block creatures with flying.) @@ -9541,6 +12463,19 @@ power=0 toughness=1 [/card] [card] +name=Ferocious Tigorilla +auto=this(counter{0/0.1.Trample}>=1) trample +auto=this(counter{0/0.1.Menace}>=1) menace +auto=choice name(Flying) counter(0/0,1,Trample) +auto=choice name(First Strike) counter(0/0,1,Menace) +text=Ferocious Tigorilla enters the battlefield with your choice of a trample counter or a menace counter on it. (A creature with menace can't be blocked except by two or more creatures.) +mana={3}{R} +type=Creature +subtype=Cat Ape +power=4 +toughness=3 +[/card] +[card] name=Ferocious Zheng mana={2}{G}{G} type=Creature @@ -9621,6 +12556,18 @@ text=Field of the Dead enters the battlefield tapped. -- {T}: Add {1}. -- Whenev type=Land [/card] [card] +name=Fiend Artisan +auto=foreach(creature|myGraveyard) 1/1 +aicode=activate target(creature[manacost<=X]|mylibrary) moveto(myBattlefield) +auto={X}{BG}{T}{S(other creature|myBattlefield}:name(search creature) Reveal:type:*:mylibrary revealzone(mylibrary) optionone name(choose creature) target(creature[manacost<=X]|reveal) transforms((,newability[all(other *|reveal) moveto(mylibrary) and!(shuffle)!],newability[moveto(myBattlefield)])) optiononeend optiontwo name(shuffle) bottomoflibrary target(<1>*|reveal) and!( all(*|reveal) bottomoflibrary and!(shuffle)! )! optiontwoend revealend asSorcery +text=Fiend Artisan gets +1/+1 for each creature card in your graveyard. -- {X}{BG}, {T}, Sacrifice another creature: Search your library for a creature card with converted mana cost X or less, put it onto the battlefield, then shuffle your library. Activate this ability only any time you could cast a sorcery. +mana={BG}{BG} +type=Creature +subtype=Nightmare +power=1 +toughness=1 +[/card] +[card] name=Fiendish Duo abilities=First strike auto=@damage(from) notatarget(*|myBattlefield,myStack,myGraveyard,mySideboard) transforms((,newability[@damage:twicethatmuch])) @@ -9684,6 +12631,17 @@ text={T}, Pay 1 life: Add {U} or {R}. -- {1}, {T}, Sacrifice Fiery Islet: Draw a type=Land [/card] [card] +name=Fight as One +target=creature|mybattlefield +other={W} name(Both) +auto=if paid(alternative) then target(creature[human]) 1/1 && indestructible ueot +auto=if paid(alternative) then target(creature[-human]) 1/1 && indestructible ueot +auto=ifnot paid(alternative) then 1/1 && indestructible ueot +text=Choose one or both — -- • Target Human creature you control gets +1/+1 and gains indestructible until end of turn. -- • Target non-Human creature you control gets +1/+1 and gains indestructible until end of turn. +mana={W} +type=Instant +[/card] +[card] name=Fight with Fire kicker={5}{R} target=creature @@ -9788,6 +12746,15 @@ mana={0} type=Instant [/card] [card] +name=Fire Prophecy +target=creature +auto=damage:3 +auto=may bottomoflibrary target(*|myHand) && draw:1 controller +text=Fire Prophecy deals 3 damage to target creature. You may put a card from your hand on the bottom of your library. If you do, draw a card. +mana={1}{R} +type=Instant +[/card] +[card] name=Fire Shrine Keeper abilities=menace auto={7}{R}{T}{S}:target(creature) damage:3 @@ -9950,6 +12917,17 @@ mana={1}{R} type=Instant [/card] [card] +name=Flame Spill +target=creature +auto=this(toughness=1) damage:1 && damage:3 targetController +auto=this(toughness=2) damage:2 && damage:2 targetController +auto=this(toughness=3) damage:3 && damage:1 targetController +auto=this(toughness>=4) damage:4 +text=Flame Spill deals 4 damage to target creature. Excess damage is dealt to that creature's controller instead. +mana={2}{R} +type=Instant +[/card] +[card] name=Flame Sweep auto=damage:2 all(creature|opponentbattlefield) auto=damage:2 all(creature[-flying]|mybattlefield) @@ -10023,14 +13001,14 @@ type=Instant [/card] [card] name=Flaxen Intruder // Welcome Home -abilities=canplayfromexile +abilities=canplayfromexile,adventure other={5}{G}{G} name(Adventure) auto=if paid(alternative) then token(Bear,Creature Bear,2/2,green)*3 && moveto(exile) all(this) auto=@combatdamaged(player) from(this):may sacrifice all(this) && destroy target(*[artifact;enchantment]|battlefield) text=Whenever Flaxen Intruder deals combat damage to a player, you may sacrifice it. When you do, destroy target artifact or enchantment. -- Create three 2/2 green Bear creature tokens. (Then exile this card. You may cast the creature later from exile.) mana={G} type=Creature -subtype=Human Berserker Adventure +subtype=Human Berserker power=1 toughness=2 [/card] @@ -10075,7 +13053,7 @@ type=Sorcery [card] name=Flood of Tears auto=moveTo(ownerhand) all(*[-land]) -auto=restriction(type(*[-token;-land;-instant;-sorcery]|myHand)~morethan~ 3): may moveTo(myBattlefield) target(*[-instant;-sorcery]|myHand) +auto=if type(*[-token;-instant;-sorcery]|myHand)~morethan~3 then may moveTo(myBattlefield) target(*[-instant;-sorcery]|myHand) text=Return all nonland permanents to their owners' hands. If you return four or more nontoken permanents you control this way, you may put a permanent card from your hand onto the battlefield. mana={4}{U}{U} type=Sorcery @@ -10090,6 +13068,17 @@ mana={4}{U}{U} type=Sorcery [/card] [card] +name=Flourishing Fox +auto=@cycled(*|myHand):all(this) counter(1/1,1) +autohand=__CYCLING__({1}) +text=Whenever you cycle another card, put a +1/+1 counter on Flourishing Fox. -- Cycling {1} ({1}, Discard this card: Draw a card.) +mana={W} +type=Creature +subtype=Fox +power=1 +toughness=1 +[/card] +[card] name=Flower // Flourish other={4}{G}{W} name(Flourish) auto=if paid(alternative) then all(creature|mybattlefield) 2/2 ueot @@ -10102,7 +13091,7 @@ type=Sorcery name=Fluctuator auto=lord(*[__CYCLING__]|mycastingzone) altercost(colorless,-2) text=Cycling abilities you activate cost up to {2} less to activate. -mana{2} +mana={2} type=Artifact [/card] [card] @@ -10147,6 +13136,19 @@ power=2 toughness=2 [/card] [card] +name=Flycatcher Giraffid +auto=this(counter{0/0.1.Vigilance}>=1) vigilance +auto=this(counter{0/0.1.Reach}>=1) reach +auto=choice name(Flying) counter(0/0,1,Vigilance) +auto=choice name(First Strike) counter(0/0,1,Reach) +text=Flycatcher Giraffid enters the battlefield with your choice of a vigilance counter or a reach counter on it. +mana={4}{G} +type=Creature +subtype=Antelope Lizard +power=3 +toughness=5 +[/card] +[card] name=Foe-Razer Regent abilities=flying auto=@movedTo(this|mybattlefield) from(myHand):all(trigger[to]) transforms((,newability[choice name(Fight target creature you don't control) dynamicability target(creature|opponentBattlefield)])) forever @@ -10175,6 +13177,16 @@ type=Artifact subtype=Food [/card] [card] +name=Footfall Crater +target=land +auto=teach(land) transforms((newability[{T}:haste && trample target(creature) ueot])) +autohand=__CYCLING__({1}) +text=Enchant land -- Enchanted land has " -- {T}: Target creature gains trample and haste until end of turn." -- Cycling {1} ({1}, Discard this card: Draw a card.) +mana={R} +type=Enchantment +subtype=Aura +[/card] +[card] name=Footlight Fiend auto=@movedTo(this|graveyard) from(battlefield):damage:1 target(creature,player) text=When Footlight Fiend dies, it deals 1 damage to any target. @@ -10185,6 +13197,14 @@ power=1 toughness=1 [/card] [card] +name=Forbidden Friendship +auto=token(Dinosaur For) +auto=token(Human Soldier For) +text=Create a 1/1 red Dinosaur creature token with haste and a 1/1 white Human Soldier creature token. +mana={1}{R} +type=Sorcery +[/card] +[card] name=Force of Despair other={E(*[black]|myhand)} target=creature[fresh] @@ -10252,7 +13272,8 @@ type=Sorcery [/card] [card] name=Forerunner of the Legion -auto=may moveTo(ownerlibrary) notatarget(creature[vampire]|mylibrary) +aicode=activate target(vampire|mylibrary) moveto(mylibrary) and!(moveto(mylibrary))! +auto=name(search card) Reveal:type:*:mylibrary revealzone(mylibrary) optionone name(choose card) target(vampire|reveal) transforms((,newability[all(other *|reveal) moveto(mylibrary) and!(shuffle)!],newability[moveto(mylibrary)])) optiononeend optiontwo bottomoflibrary target(<1>*|reveal) and!( all(*|reveal) bottomoflibrary )! optiontwoend revealend auto=@movedTo(other creature[vampire]|mybattlefield): target(creature) 1/1 ueot text=When Forerunner of the Legion enters the battlefield, you may search your library for a Vampire card, reveal it, then shuffle your library and put that card on top of it. -- Whenever another Vampire enters the battlefield under your control, target creature gets +1/+1 until end of turn. mana={2}{W} @@ -10300,13 +13321,14 @@ type=Enchantment [/card] [card] name=Foulmire Knight // Profane Insight -abilities=canplayfromexile,deathtouch,flash +abilities=canplayfromexile,deathtouch,flash,adventure +restriction=myturnonly other={2}{B} name(Adventure) auto=if paid(alternative) then draw:1 controller && life:-1 controller && moveto(exile) all(this) text=Deathtouch -- You draw a card and you lose 1 life. (Then exile this card. You may cast the creature later from exile.) mana={B} type=Creature -subtype=Zombie Knight Adventure +subtype=Zombie Knight power=1 toughness=1 [/card] @@ -10431,6 +13453,17 @@ power=4 toughness=6 [/card] [card] +name=Frillscare Mentor +auto=target(creature[-human]|myBattlefield) transforms((,newability[counter(0/0,1,Menace)],newability[this(counter{0/0.1.Menace}>=1) menace])) +auto={1}{W}{T}:counter(1/1,1) all(creature[Menace]|myBattlefield) +text=When Frillscare Mentor enters the battlefield, put a menace counter on target non-Human creature you control. (It can't be blocked except by two or more creatures.) -- {2}{R}, {T}: Put a +1/+1 counter on each creature you control with menace. +mana={2}{R} +type=Creature +subtype=Human Warrior +power=3 +toughness=2 +[/card] +[card] name=Frogify target=creature auto=teach(creature) loseabilities @@ -10442,6 +13475,17 @@ type=Enchantment subtype=Aura [/card] [card] +name=Frondland Felidar +abilities=vigilance +auto=lord(creature[vigilance]|myBattlefield) transforms((,newability[{1}{T}:tap target(creature)])) +text=Vigilance -- Creatures you control with vigilance have "{1}, {T}: Tap target creature." +mana={2}{G}{W} +type=Creature +subtype=Cat Beast +power=3 +toughness=5 +[/card] +[card] name=Frontier Warmonger auto=lord(creature[attacking]|myBattlefield) menace ueot text=Whenever one or more creatures attack an opponent or a planeswalker an opponent controls, those creatures gain menace until end of turn. @@ -10486,6 +13530,15 @@ power=6 toughness=6 [/card] [card] +name=Frostveil Ambush +target=creature +auto=tap +auto=frozen +text=Tap up to two target creatures. Those creatures don't untap during their controller's next untap step. -- Cycling {1} ({1}, Discard this card: Draw a card.) +mana={3}{U}{U} +type=Instant +[/card] +[card] name=Frostwalk Bastion auto={T}:add{1} auto={1}{i}:becomes(Creature Construct,2/3) ueot @@ -10528,6 +13581,16 @@ mana={X}{X}{G} type=Sorcery [/card] [card] +name=Fully Grown +target=creature +auto=3/3 ueot +auto=counter(0/0,1,Trample) +auto=transforms((,newability[this(counter{0/0.1.Trample}>=1) trample])) +text=Target creature gets +3/+3 until end of turn. Put a trample counter on it. +mana={2}{G} +type=Instant +[/card] +[card] name=Funeral Rites auto=draw:2 controller auto=life:-2 controller @@ -10693,15 +13756,15 @@ type=Instant [/card] [card] name=Garenbrig Carver // Shield's Might -abilities=canplayfromexile,flash -target=creature|battlefield,player +abilities=canplayfromexile,flash,adventure +restriction=myturnonly other={1}{G} name(Adventure) -auto=if paid(alternative) then 2/2 ueot +auto=if paid(alternative) then target(creature|battlefield) 2/2 ueot auto=if paid(alternative) then moveto(exile) all(this) text=Target creature gets +2/+2 until end of turn. (Then exile this card. You may cast the creature later from exile.) mana={3}{G} type=Creature -subtype=Human Warrior Adventure +subtype=Human Warrior power=3 toughness=2 [/card] @@ -10752,6 +13815,16 @@ power=3 toughness=3 [/card] [card] +name=Garrison Cat +auto=@movedto(this|graveyard) from(battlefield):token(Human Soldier Gar) +text=When Garrison Cat dies, create a 1/1 white Human Soldier creature token. +mana={W} +type=Creature +subtype=Cat +power=1 +toughness=1 +[/card] +[card] name=Garrison Griffin abilities=flying auto=@combat(attacking) source(this):target(knight|myBattlefield) flying ueot @@ -10895,6 +13968,55 @@ mana={3} type=Artifact [/card] [card] +name=Gemrazer +abilities=reach,trample,mutate +otherrestriction=type(creature[-human]|mybattlefield)~morethan~0 +auto=@movedTo(mytgt|graveyard) from(battlefield):all(this) moveTo(myGraveyard) +auto=@movedTo(mytgt|hand) from(battlefield):all(this) moveTo(myHand) +auto=@movedTo(mytgt|exile) from(battlefield):all(this) moveTo(myExile) +auto=@movedTo(mytgt|library) from(battlefield):all(this) moveTo(myLibrary) +auto=@movedTo(mytgt|sideboard) from(battlefield):all(this) moveTo(mySideboard) +auto={9999}:equip +other={1}{G}{G} name(Mutate) +auto=transforms((,newability[@mutated(this):target(*[artifact;enchantment]|opponentBattlefield) destroy])) +auto=ifnot paid(alternative) then transforms((,newability[becomes(,,green)])) forever all(this) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Over) choice name(Mutate Over) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-reach],newability[-trample])) forever all(this) && mutateover target(other creature[-human]|mybattlefield) && transforms((,newability[reach],newability[trample],newability[becomes(,,green)])) forever +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Under) choice name(Mutate Under) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-reach],newability[-trample])) forever all(this) && mutateunder target(other creature[-human]|mybattlefield) && transforms((,newability[reach],newability[trample])) forever +text=Mutate {1}{G}{G} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- Reach, trample -- Whenever this creature mutates, destroy target artifact or enchantment an opponent controls. +mana={3}{G} +type=Creature +subtype=Beast +power=4 +toughness=4 +[/card] +[card] +name=General Kudro of Drannith +auto=lord(other creature[human]|myBattlefield) 1/1 +auto=moveTo(exile) target(*|opponentGraveyard) +auto=@movedto(other human|myBattlefield):moveTo(exile) target(*|opponentGraveyard) +auto={2}{S(human|myBattlefield)}{S(human|myBattlefield)}:destroy target(creature[power>=4]) +text=Other Humans you control get +1/+1. -- Whenever General Kudro of Drannith or another Human enters the battlefield under your control, exile target card from an opponent's graveyard. -- {2}, Sacrifice two Humans: Destroy target creature with power 4 or greater. +mana={1}{W}{B} +type=Legendary Creature +subtype=Human Soldier +power=3 +toughness=3 +[/card] +[card] +name=General's Enforcer +auto=lord(human[legendary]|myBattlefield) indestructible +auto={2}{W}{B}:moveTo(exile) target(creature|mygraveyard) && token(Human Soldier Gen) +auto={2}{W}{B}:moveTo(exile) target(creature|opponentGraveyard) && token(Human Soldier Gen) +auto={2}{W}{B}:moveTo(exile) target(*[-creature]|mygraveyard) +auto={2}{W}{B}:moveTo(exile) target(*[-creature]|opponentGraveyard) +text=Legendary Humans you control have indestructible. -- {2}{W}{B}: Exile target card from a graveyard. If it was a creature card, create a 1/1 white Human Soldier creature token. +mana={W}{B} +type=Creature +subtype=Human Soldier +power=2 +toughness=3 +[/card] +[card] name=Generous Gift target=* auto=destroy @@ -10914,6 +14036,14 @@ power=1 toughness=2 [/card] [card] +name=Genesis Ultimatum +auto=name(Look) reveal:5 optionone name(Put a permanent) target(*[-instant;-sorcery]|reveal) moveto(myBattlefield) optiononeend optiontwo all(*|reveal) moveto(myHand) optiontwoend revealend +auto=moveTo(myExile) +text=Look at the top five cards of your library. Put any number of permanent cards from among them onto the battlefield and the rest into your hand. Exile Genesis Ultimatum. +mana={G}{G}{U}{U}{U}{R}{R} +type=Sorcery +[/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.) @@ -11020,16 +14150,16 @@ toughness=2 [/card] [card] name=Giant Killer // Chop Down -abilities=canplayfromexile,flash -target=creature[power>=4],player +abilities=canplayfromexile,flash,adventure +restriction=myturnonly other={2}{W} name(Adventure) -auto=if paid(alternative) then destroy +auto=if paid(alternative) then target(creature[power>=4]) destroy auto=if paid(alternative) then moveto(exile) all(this) auto={1}{W}{T}:target(creature) tap(noevent) text={1}{W}, {T}: Tap target creature. -- Destroy target creature with power 4 or greater. (Then exile this card. You may cast the creature later from exile.) mana={W} type=Creature -subtype=Human Peasant Adventure +subtype=Human Peasant power=1 toughness=2 [/card] @@ -11375,6 +14505,17 @@ mana={0} type=Artifact [/card] [card] +name=Glimmerbell +abilities=flying +auto={1}{U}:untap(this) +text=Flying -- {1}{U}: Untap Glimmerbell. +mana={1}{U} +type=Creature +subtype=Elemental Jellyfish +power=1 +toughness=3 +[/card] +[card] name=Glimpse of Freedom auto=draw:1 autograveyard=name(Escape-{2}{U},exile five) {2}{U}{E(other *|myGraveyard)}{E(other *|myGraveyard)}{E(other *|myGraveyard)}{E(other *|myGraveyard)}{E(other *|myGraveyard)}:castcard(normal) @@ -11395,6 +14536,14 @@ power=2 toughness=4 [/card] [card] +name=Gloom Pangolin +mana={2}{B} +type=Creature +subtype=Nightmare Pangolin +power=1 +toughness=5 +[/card] +[card] name=Glorifier of Dusk auto={L:2}:flying ueot auto={L:2}:vigilance ueot @@ -11449,6 +14598,27 @@ power=3 toughness=1 [/card] [card] +name=Glowstone Recluse +abilities=reach,mutate +otherrestriction=type(creature[-human]|mybattlefield)~morethan~0 +auto=@movedTo(mytgt|graveyard) from(battlefield):all(this) moveTo(myGraveyard) +auto=@movedTo(mytgt|hand) from(battlefield):all(this) moveTo(myHand) +auto=@movedTo(mytgt|exile) from(battlefield):all(this) moveTo(myExile) +auto=@movedTo(mytgt|library) from(battlefield):all(this) moveTo(myLibrary) +auto=@movedTo(mytgt|sideboard) from(battlefield):all(this) moveTo(mySideboard) +auto={9999}:equip +other={3}{G} name(Mutate) +auto=transforms((,newability[@mutated(this):counter(1/1) && counter(1/1)])) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Over) choice name(Mutate Over) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-reach])) forever all(this) && mutateover target(other creature[-human]|mybattlefield) && transforms((,newability[reach])) forever +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Under) choice name(Mutate Under) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-reach])) forever all(this) && mutateunder target(other creature[-human]|mybattlefield) && transforms((,newability[reach])) forever +text=Mutate {3}{G} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- Reach -- Whenever this creature mutates, put two +1/+1 counters on it. +mana={2}{G} +type=Creature +subtype=Spider +power=2 +toughness=3 +[/card] +[card] name=Gluttonous Slug abilities=menace auto=evolve @@ -11495,6 +14665,15 @@ power=4 toughness=4 [/card] [card] +name=Go for Blood +target=creature|myBattlefield +auto=transforms((,newability[target(creature|opponentBattlefield) dynamicability])) ueot +autohand=__CYCLING__({1}) +text=Target creature you control fights target creature you don't control. (Each deals damage equal to its power to the other.) -- Cycling {1} ({1}, Discard this card: Draw a card.) +mana={1}{R} +type=Sorcery +[/card] +[card] name=Goat,Dis type=Creature subtype=Goat @@ -12201,6 +15380,21 @@ power=6 toughness=6 [/card] [card] +name=Grimdancer +auto=this(counter{0/0.1.Deathtouch}>=1) deathtouch +auto=this(counter{0/0.1.Lifelink}>=1) lifelink +auto=this(counter{0/0.1.Menace}>=1) menace +auto=choice name(Menace & Deathtouch) counter(0/0,1,Menace) && counter(0/0,1,Deathtouch) +auto=choice name(Menace & Lifelink) counter(0/0,1,Deathtouch) && counter(0/0,1,Lifelink) +auto=choice name(Lifelink & Deathtouch) counter(0/0,1,Lifelink) && counter(0/0,1,Deathtouch) +text=Grimdancer enters the battlefield with your choice of two different counters on it from among menace, deathtouch, and lifelink. +mana={1}{B}{B} +type=Creature +subtype=Nightmare +power=3 +toughness=3 +[/card] +[card] name=Grimlock, Dinobot Leader auto=lord(creature[Vehicle,Dinosaur,other Autobot]|myBattlefield) 2/0 auto={2}:name(Transform) flip(Grimlock, Ferocious King) @@ -12451,6 +15645,16 @@ power=2 toughness=2 [/card] [card] +name=Gust of Wind +anyzone=if type(creature[flying]|myBattlefield)~morethan~0 then changecost(colorless:-2) forcedalive +target=*[-land]|opponentBattlefield +auto=moveTo(ownerHand) +auto=draw:1 controller +text=This spell costs {2} less to cast if you control a creature with flying. -- Return target nonland permanent you don't control to its owner's hand. -- Draw a card. +mana={3}{U} +type=Sorcery +[/card] +[card] name=Gutterbones auto=tap autograveyard={1}{B}:moveTo(myhand) asSorcery restriction{compare(oplifelost)~morethan~0} @@ -12557,6 +15761,14 @@ type=Legendary Artifact subtype=Equipment [/card] [card] +name=Hampering Snare +auto=all(creature|opponentBattlefield) -2/-0 ueot +autohand=__CYCLING__({2}) +text=Creatures your opponents control get -2/-0 until end of turn. -- Cycling {2} ({2}, Discard this card: Draw a card.) +mana={1}{U} +type=Instant +[/card] +[card] name=Hapatra's Mark target=creature auto=opponentshroud @@ -12788,6 +16000,15 @@ mana={1}{R}{S(creature,planeswalker|myBattlefield)} type=Instant [/card] [card] +name=Heartless Act +#To remove just 3 counter is not supported ATM, so it removes all counters from target creature +auto=choice name(Destroy):destroy target(creature[counter{notany}]) +auto=choice name(Remove three counters):removeallcounters(All) target(creature[counter{any}]) +text=Choose one — -- • Destroy target creature with no counters on it. -- • Remove up to three counters from target creature. +mana={1}{B} +type=Instant +[/card] +[card] name=Heartless Pillage target=opponent auto=ability$!discard(<2>*|myhand)!$ targetedplayer @@ -12839,6 +16060,16 @@ power=2 toughness=2 [/card] [card] +name=Heightened Reflexes +target=creature +auto=1/0 ueot +auto=counter(0/0,1,First Strike) +auto=transforms((,newability[this(counter{0/0.1.First Strike}>=1) first strike])) +text=Target creature gets +1/+0 until end of turn. Put a first strike counter on it. +mana={R} +type=Instant +[/card] +[card] name=Heirloom Blade auto=teach(creature) 3/1 auto=teach(creature) transforms((,newability[@movedto(mygraveyard) from(this|mybattlefield):Reveal:1 revealzone(mylibrary) revealuntil(creature[share!subtype!]|mylibrary) optionone name(Get Creature) target(creature|myreveal) moveto(myHand) optiononeend optiontwo choice name(Shuffle) all(*|myreveal) bottomoflibrary && shuffle controller optiontwoend revealend])) @@ -12859,6 +16090,19 @@ power=2 toughness=3 [/card] [card] +name=Helica Glider +auto=this(counter{0/0.1.Flying}>=1) flying +auto=this(counter{0/0.1.First Strike}>=1) first strike +auto=choice name(Flying) counter(0/0,1,Flying) +auto=choice name(First Strike) counter(0/0,1,First Strike) +text=Helica Glider enters the battlefield with your choice of a flying counter or a first strike counter on it. +mana={2}{W} +type=Creature +subtype=Nightmare Squirrel +power=2 +toughness=2 +[/card] +[card] name=Heliod's Intervention auto=choice name(Destroy X artifacts and/or enchantments) destroy:X target artifact,enchantment auto=choice name(Target player gains twice X life) target(player) life:X && life:X @@ -12875,7 +16119,7 @@ auto=cantpwattack auto=cantblock auto=teach(creature) loseabilities auto=teach(creature) {T}{C(0/0,-1,Task)}: donothing -auto=teach(creature) transforms((,newability[this(counter{0/0,0,Task}<1) while destroy(this)])) +auto=teach(creature) transforms((,newability[this(counter{0/0,1,Task}<1) while destroy(this)])) text=Enchant creature -- Heliod’s Punishment enters the battlefield with four task counters on it. -- Enchanted creature can’t attack or block. It loses all abilities and has “{T}: Remove a task counter from Heliod’s Punishment. Then if it has no task counters on it, destroy Heliod’s Punishment.” mana={1}{W} type=Enchantment @@ -13216,6 +16460,16 @@ type=Artifact subtype=Equipment [/card] [card] +name=Honey Mammoth +auto=life:4 controller +text=When Honey Mammoth enters the battlefield, you gain 4 life. +mana={4}{G}{G} +type=Creature +subtype=Elephant +power=6 +toughness=6 +[/card] +[card] name=Honor the God-Pharaoh auto=draw:2 auto=_AMASS_(1) @@ -13268,6 +16522,17 @@ power=2 toughness=2 [/card] [card] +name=Hornbash Mentor +auto=target(creature[-human]|myBattlefield) transforms((,newability[counter(0/0,1,Trample)],newability[this(counter{0/0.1.Trample}>=1) trample])) +auto={1}{W}{T}:counter(1/1,1) all(creature[trample]|myBattlefield) +text=When Hornbash Mentor enters the battlefield, put a trample counter on target non-Human creature you control. -- {2}{G}, {T}: Put a +1/+1 counter on each creature you control with trample. +mana={2}{G} +type=Creature +subtype=Human Warrior +power=3 +toughness=3 +[/card] +[card] name=Hornswoggle target=creature|stack auto=fizzle @@ -13483,11 +16748,67 @@ toughness=1 color=white [/card] [card] +name=Human Soldier Bas +type=Creature +subttype=Human Soldier +power=1 +toughness=1 +color=white +[/card] +[card] +name=Human Soldier Day +type=Creature +subtype=Human Soldier +power=1 +toughness=1 +color=white +[/card] +[card] +name=Human Soldier For +type=Creature +subttype=Human Soldier +power=1 +toughness=1 +color=white +[/card] +[card] +name=Human Soldier Gar +type=Creature +subtype=Human Soldier +power=1 +toughness=1 +color=white +[/card] +[card] +name=Human Soldier Gen +type=Creature +subttype=Human Soldier +power=1 +toughness=1 +color=white +[/card] +[card] name=Human Soldier Jir type=Creature subtype=Human power=1 -toughnss=1 +toughness=1 +color=white +[/card] +[card] +name=Human Soldier Nig +type=Creature +subttype=Human Soldier +power=1 +toughness=1 +color=white +[/card] +[card] +name=Human Soldier Val +type=Creature +subtype=Human Soldier +power=1 +toughness=1 color=white [/card] [card] @@ -13555,6 +16876,20 @@ toughness=1 color=white [/card] [card] +name=Humble Naturalist +auto={T}:Add{G} +auto={T}:Add{W} +auto={T}:Add{U} +auto={T}:Add{B} +auto={T}:Add{R} +text={T}: Add one mana of any color. Spend this mana only to cast a creature spell. +mana={1}{G} +type=Creature +subtype=Human Druid +power=1 +toughness=3 +[/card] +[card] name=Humility auto=lord(creature|battlefield) loseabilities forever auto=lord(creature|battlefield) transforms((,setpower=0,settoughness=1)) forever @@ -13598,6 +16933,17 @@ power=2 toughness=2 [/card] [card] +name=Hunted Nightmare +abilities=menace +auto=notatarget(creature[-human]) transforms((,newability[counter(0/0,1,Deathtouch)],newability[this(counter{0/0.1.Deathtouch}>=1) deathtouch])) opponent +text=Menace -- When Hunted Nightmare enters the battlefield, target opponent puts a deathtouch counter on a creature they control. +mana={1}{B}{B} +type=Creature +subtype=Nightmare +power=4 +toughness=5 +[/card] +[card] name=Hunted Witness auto=@movedTo(this|graveyard) from(battlefield):create(soldier:creature soldier:1/1:white:lifelink) text=When Hunted Witness dies, create a 1/1 white Soldier creature token with lifelink. @@ -13608,6 +16954,27 @@ power=1 toughness=1 [/card] [card] +name=Huntmaster Liger +abilities=mutate +otherrestriction=type(creature[-human]|mybattlefield)~morethan~0 +auto=@movedTo(mytgt|graveyard) from(battlefield):all(this) moveTo(myGraveyard) +auto=@movedTo(mytgt|hand) from(battlefield):all(this) moveTo(myHand) +auto=@movedTo(mytgt|exile) from(battlefield):all(this) moveTo(myExile) +auto=@movedTo(mytgt|library) from(battlefield):all(this) moveTo(myLibrary) +auto=@movedTo(mytgt|sideboard) from(battlefield):all(this) moveTo(mySideboard) +auto={9999}:equip +other={2}{W} name(Mutate) +auto=transforms((,newability[@mutated(this):name(All creatures X/X ueot) thisforeach(mutations) all(other creature|myBattlefield) 1/1 ueot])) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Over) choice name(Mutate Over) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-deathtouch])) forever all(this) && mutateover target(other creature[-human]|mybattlefield) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Under) choice name(Mutate Under) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-deathtouch])) forever all(this) && mutateunder target(other creature[-human]|mybattlefield) +text=Mutate {2}{W} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- Whenever this creature mutates, other creatures you control get +X/+X until end of turn, where X is the number of times this creature has mutated. +mana={3}{W} +type=Creature +subtype=Cat +power=3 +toughness=4 +[/card] +[card] name=Hushbringer abilities=flying,lifelink auto=@movedto(creature|battlefield):all(trigger) onlymanaability @@ -13663,15 +17030,15 @@ type=Sorcery [/card] [card] name=Hypnotic Sprite // Mesmeric Glare -abilities=canplayfromexile,flying,flash -target=*[manacost<=3]|stack,player +abilities=canplayfromexile,flying,flash,adventure +restriction=myturnonly other={2}{U} name(Adventure) -auto=if paid(alternative) then fizzle +auto=if paid(alternative) then target(*[manacost<=3]|stack) fizzle auto=if paid(alternative) then moveto(exile) all(this) text=Flying -- Counter target spell with converted mana cost 3 or less. (Then exile this card. You may cast the creature later from exile.) mana={U}{U} type=Creature -subtype=Faerie Adventure +subtype=Faerie power=2 toughness=1 [/card] @@ -13822,6 +17189,28 @@ mana={3}{B} type=Enchantment [/card] [card] +name=Illuna, Apex of Wishes +abilities=flying,trample,mutate +otherrestriction=type(creature[-human]|mybattlefield)~morethan~0 +auto=@movedTo(mytgt|graveyard) from(battlefield):all(this) moveTo(myGraveyard) +auto=@movedTo(mytgt|hand) from(battlefield):all(this) moveTo(myHand) +auto=@movedTo(mytgt|exile) from(battlefield):all(this) moveTo(myExile) +auto=@movedTo(mytgt|library) from(battlefield):all(this) moveTo(myLibrary) +auto=@movedTo(mytgt|sideboard) from(battlefield):all(this) moveTo(mySideboard) +auto={9999}:equip +other={3}{RG}{U}{U} name(Mutate) +auto=transforms((,newability[@mutated(this):ability$!name(Reveal) reveal:1 revealzone(mylibrary) revealuntil(*[-artifact;-land;-instant;-sorcery]|mylibrary) optionone name(Choose non land permanent) target(*[-artifact;-land;-instant;-sorcery]|myreveal) moveto(mybattlefield) optiononeend optiontwo name(Put back into library) all(*|myreveal) bottomoflibrary optiontwoend revealend!$ controller])) +auto=ifnot paid(alternative) then transforms((,newability[becomes(,,green,blue,red)])) forever all(this) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Over) choice name(Mutate Over) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-flying],newability[-trample])) forever all(this) && mutateover target(other creature[-human]|mybattlefield) && transforms((,newability[becomes(,,green,blue,red)],newability[flying],newability[trample])) forever +auto=if paid(alternative) then name(Mutate Under) this(mutations<1) name(Mutate Under) choice name(Mutate Under) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-flying],newability[-trample])) forever all(this) && mutateunder target(other creature[-human]|mybattlefield) && transforms((,newability[flying],newability[trample])) forever +text=Mutate {3}{RG}{U}{U} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- Flying, trample -- Whenever this creature mutates, exile cards from the top of your library until you exile a nonland permanent card. Put that card onto the battlefield or into your hand. +mana={2}{G}{U}{R} +type=Legendary Creature +subtype=Beast Elemental Dinosaur +power=6 +toughness=6 +[/card] +[card] name=Illusory Wrappings target=creature auto=transforms((,setpower=0,settoughness=2)) forsrc @@ -13858,9 +17247,9 @@ type=Instant name=Imminent Doom auto=counter(0/0,1,doom) auto=this(counter{0/0.1.doom}) transforms((,newability[@movedTo(*[manacost=1]|mystack):counter(0/0.1.doom)])) -auto=if this(counter{0/0.1.doom}) then transforms((,newability[@movedTo(*[manacost=1]|mystack):damage:1 target(creature;player)])) ueot +auto=this(counter{0/0.1.doom}) transforms((,newability[@movedTo(*[manacost=1]|mystack):damage:1 target(creature;player)])) ueot auto=this(counter{0/0.2.doom}) transforms((,newability[@movedTo(*[manacost=2]|mystack):counter(0/0.1.doom)])) -auto=if this(counter{0/0.2.doom}) then transforms((,newability[@movedTo(*[manacost=2]|mystack):damage:2 target(creature;player)])) ueot +auto=this(counter{0/0.2.doom}) transforms((,newability[@movedTo(*[manacost=2]|mystack):damage:2 target(creature;player)])) ueot auto=this(counter{0/0.3.doom}) transforms((,newability[@movedTo(*[manacost=3]|mystack):counter(0/0.1.doom)])) auto=this(counter{0/0.3.doom}) transforms((,newability[@movedTo(*[manacost=3]|mystack):damage:3 target(creature;player)])) ueot auto=this(counter{0/0.4.doom}) transforms((,newability[@movedTo(*[manacost=4]|mystack):counter(0/0.1.doom)])) @@ -13889,7 +17278,7 @@ auto=this(counter{0/0.15.doom}) transforms((,newability[@movedTo(*[manacost=15]| auto=this(counter{0/0.15.doom}) transforms((,newability[@movedTo(*[manacost=15]|mystack):damage:15 target(creature;player)])) ueot auto=this(counter{0/0.16.doom}) transforms((,newability[@movedTo(*[manacost=16]|mystack):counter(0/0.1.doom)])) auto=this(counter{0/0.16.doom}) transforms((,newability[@movedTo(*[manacost=16]|mystack):damage:16 target(creature;player)])) ueot -text=Imminent Doom enters the battlefield with a doom counter on #it. -- Whenever you cast a spell with converted mana cost equal to #the number of doom counters on Imminent Doom, Imminent Doom deals #that much damage to target creature or player. Then put a doom #counter on Imminent Doom. +text=Imminent Doom enters the battlefield with a doom counter on it. -- Whenever you cast a spell with converted mana cost equal to the number of doom counters on Imminent Doom, Imminent Doom deals that much damage to target creature or player. Then put a doom counter on Imminent Doom. mana={2}{R} type=Enchantment [/card] @@ -13996,6 +17385,17 @@ power=16 toughness=16 [/card] [card] +name=Imposing Vantasaur +abilities=vigilance +autohand=__CYCLING__({1}) +text=Vigilance -- Cycling {1} ({1}, Discard this card: Draw a card.) +mana={5}{W} +type=Creature +subtype=Dinosaur +power=3 +toughness=6 +[/card] +[card] name=Impostor of the Sixth Pride abilities=changeling text=Changeling (This card is every creature type.) @@ -14076,6 +17476,24 @@ power=0 toughness=2 [/card] [card] +name=Indatha Crystal +auto={T}:Add{W} +auto={T}:Add{B} +auto={T}:Add{G} +autohand=__CYCLING__({2}) +text={T}: Add {W}, {B}, or {G}. -- Cycling {2} ({2}, Discard this card: Draw a card.) +mana={3} +type=Artifact +[/card] +[card] +name=Indatha Triome +auto=tap(noevent) +autohand=__CYCLING__({3}) +text=({T}: Add {W}, {B}, or {G}.) -- Indatha Triome enters the battlefield tapped. -- Cycling {3} ({3}, Discard this card: Draw a card.) +type=Land +subtype=Plains Swamp Forest +[/card] +[card] name=Induced Amnesia auto=target(player) exiles all cards from their hand face down, then draws that many cards text=When Induced Amnesia enters the battlefield, target player exiles all cards from their hand face down, then draws that many cards. -- When Induced Amnesia is put into a graveyard from the battlefield, return the exiled cards to their owner's hand. @@ -14203,6 +17621,27 @@ mana={1}{G} type=Instant [/card] [card] +name=Insatiable Hemophage +abilities=deathtouch,mutate +otherrestriction=type(creature[-human]|mybattlefield)~morethan~0 +auto=@movedTo(mytgt|graveyard) from(battlefield):all(this) moveTo(myGraveyard) +auto=@movedTo(mytgt|hand) from(battlefield):all(this) moveTo(myHand) +auto=@movedTo(mytgt|exile) from(battlefield):all(this) moveTo(myExile) +auto=@movedTo(mytgt|library) from(battlefield):all(this) moveTo(myLibrary) +auto=@movedTo(mytgt|sideboard) from(battlefield):all(this) moveTo(mySideboard) +auto={9999}:equip +other={2}{B} name(Mutate) +auto=transforms((,newability[@mutated(this):name(Life and damage) thisforeach(mutations) life:1 controller && life:-1 opponent])) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Over) choice name(Mutate Over) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-deathtouch])) forever all(this) && mutateover target(other creature[-human]|mybattlefield) && transforms((,newability[deathtouch])) forever +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Under) choice name(Mutate Under) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-deathtouch])) forever all(this) && mutateunder target(other creature[-human]|mybattlefield) && transforms((,newability[deathtouch])) forever +text=Mutate {2}{B} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- Deathtouch -- Whenever this creature mutates, each opponent loses X life and you gain X life, where X is the number of times this creature has mutated. +mana={3}{B} +type=Creature +subtype=Nightmare +power=3 +toughness=3 +[/card] +[card] name=Insect Hor abilities=flying,deathtouch type=Creature @@ -14232,6 +17671,16 @@ power=5 toughness=5 [/card] [card] +name=Inspired Ultimatum +target=creature,planeswalker,player +auto=damage: 5 +auto=life: 5 target(player) +auto=draw: 5 controller +text=Target player gains 5 life, Inspired Ultimatum deals 5 damage to any target, then you draw five cards. +mana={U}{U}{R}{R}{R}{W}{W} +type=Sorcery +[/card] +[card] name=Inspiring Cleric auto=life:4 controller text=When Inspiring Cleric enters the battlefield, you gain 4 life. @@ -14272,8 +17721,8 @@ toughness=2 [/card] [card] name=Insult -auto=@damaged(creature,player) from(*|mybattlefield):damage:thatmuch all(trigger[to]) -auto=@damaged(creature,player) from(*|mystack):damage:thatmuch all(trigger[to]) +auto=@damaged(creature,player) from(*|mybattlefield) once:damage:thatmuch all(trigger[to]) +auto=@damaged(creature,player) from(*|mystack) once:damage:thatmuch all(trigger[to]) autograveyard={2}{R}:damage:2 target(creature) && transforms((,newability[damage:2 controller])) ueot && moveto(exile) text=Damage can't be prevented this turn. If a source you control would deal damage this turn, it deals double that damage instead. -- Aftermath (Cast this spell only from your graveyard. Then exile it.) Injury deals 2 damage to target creature and 2 damage to target player. mana={2}{R} @@ -14879,6 +18328,17 @@ power=1 toughness=1 [/card] [card] +name=Jubilant Skybonder +abilities=flying +auto=lord(creatures[flying]|myBattlefield) transforms((,newability[@targeted(this) from(*[instant;sorcery;enchantment]|opponentcastingzone):altercost(colorless, +2)])) +text=Flying -- Creatures you control with flying have "Spells your opponents cast that target this creature cost 2 more to cast." +mana={1}{WU}{WU} +type=Creature +subtype=Human Wizard +power=2 +toughness=2 +[/card] +[card] name=Judith, the Scourge Diva auto=lord(other creature|myBattlefield) +1/+0 auto=@movedto(graveyard) from(creature[-token]|myBattlefield):damage:1 target(creature,player) @@ -15074,10 +18534,10 @@ type=Legendary Sorcery name=Karn, the Great Creator auto=counter(0/0,5,loyalty) auto=lord(artifact|opponentBattlefield) noactivatedability -auto={C(0/0,1,Loyalty)}:target(artifact[-creature]) dynamicability transforms((creature,setpower=0,settoughness=0)) ueot -auto={C(0/0,1,Loyalty)}:name(+1 No targets) donothing -auto={C(0/0,-2,Loyalty)}:name(from exile) moveto(ownerhand) target(artifact|myexile) -auto={C(0/0,-2,Loyalty)}:name(from sideboard) moveto(ownerhand) target(artifact|mysideboard) +auto={C(0/0,1,Loyalty)}:name(+1 Becomes a creature) target(artifact[-creature]) dynamicability transforms((creature,setpower=0,settoughness=0)) uynt +auto={C(0/0,1,Loyalty)}:name(+1 Loyalty counter) donothing +auto={C(0/0,-2,Loyalty)}:name(-2 move a card from exile) moveto(ownerhand) target(artifact|myexile) +auto={C(0/0,-2,Loyalty)}:name(-2 move a card from sideboard) reveal:type:*:mysideboard revealzone(mysideboard) optionone name(choose card) target(<1>*[artifact]|reveal) moveto(myhand) and!(all(other *|reveal) moveto(ownersideboard))! optiononeend optiontwo name(put back) target(<1>*|reveal) moveto(ownersideboard) and!(all(other *|reveal) moveto(ownersideboard))! optiontwoend revealend text=Activated abilities of artifacts your opponents control can't be activated. -- +1: Until your next turn, up to one target noncreature artifact becomes an artifact creature with power and toughness each equal to its converted mana cost. -- -2: You may choose an artifact card you own from outside the game or in exile, reveal that card, and put it into your hand. mana={4} type=Legendary Planeswalker @@ -15167,6 +18627,27 @@ power=4 toughness=4 [/card] [card] +name=Keensight Mentor +auto=newability[counter(0/0,1,Vigilance) && (vigilance)forever target(creature[-human]|myBattlefield)] +auto={1}{W}{T}:counter(1/1,1) all(creature[vigilance]|myBattlefield) +text=When Keensight Mentor enters the battlefield, put a vigilance counter on target non-Human creature you control. -- {1}{W}, {T}: Put a +1/+1 counter on each creature you control with vigilance. +mana={2}{W} +type=Creature +subtype=Human Cleric +power=1 +toughness=4 +[/card] +[card] +name=Keep Safe +restriction=@targeted(*|mybattlefield) from(stak) +target=*|stak +auto=fizzle +auto=draw:1 controller +text=Counter target spell that targets a permanent you control. -- Draw a card. +mana={1}{U} +type=Instant +[/card] +[card] name=Keeper of Fables auto=@each combatdamage restriction{opponentdamagedbycombat}:draw:1 text=Whenever one or more non-Human creatures you control deal combat damage to a player, draw a card. @@ -15302,6 +18783,24 @@ power=4 toughness=4 [/card] [card] +name=Ketria Crystal +auto={T}:Add{G} +auto={T}:Add{U} +auto={T}:Add{R} +autohand=__CYCLING__({2}) +text={T}: Add {G}, {U}, or {R}. -- Cycling {2} ({2}, Discard this card: Draw a card.) +mana={3} +type=Artifact +[/card] +[card] +name=Ketria Triome +auto=tap(noevent) +autohand=__CYCLING__({3}) +text=({T}: Add {G}, {U}, or {R}.) -- Ketria Triome enters the battlefield tapped. -- Cycling {3} ({3}, Discard this card: Draw a card.) +type=Land +subtype=Forest Island Mountain +[/card] +[card] name=Khenra Charioteer abilities=trample auto=lord(other creature|mybattlefield) trample @@ -15415,6 +18914,18 @@ power=2 toughness=3 [/card] [card] +name=Kinnan, Bonder Prodigy +auto=@tappedformana(*[-land]|myBattlefield):ability$! choice add{1} _ choice add{G} _ choice add{R} _ choice add{U} _ choice add{B} _ choice add{W} !$ controller +aicode=activate target(creature[-human;zpos<=5]|mylibrary) moveto(mybattlefield) +auto={5}{G}{U}:name(look) reveal:5 optionone name(Get non-Human) target(creature[-human]|reveal) moveto(mybattlefield) optiononeend optiontwo name(put on bottom) target(<5>*|reveal) bottomoflibrary optiontwoend revealend +text=Whenever you tap a nonland permanent for mana, add one mana of any type that permanent produced. -- {5}{G}{U}: Look at the top five cards of your library. You may put a non-Human creature card from among them onto the battlefield. Put the rest on the bottom of your library in a random order. +mana={G}{U} +type=Legendary Creature +subtype=Human Druid +power=2 +toughness=2 +[/card] +[card] name=Kiora Bests the Sea God auto=token(Kraken,Kio) auto=counter(0/0,1,Lore) @@ -15613,6 +19124,18 @@ mana={1}{W}{B} type=Enchantment [/card] [card] +name=Kogla, the Titan Ape +auto=target(creature|opponentbattlefield) dynamicability +auto=@combat(attaking) source(this):destroy target(artifact,enchantment|opponentBattlefield) +auto={1}{G}{H(human|mybattlefield)}:indestructible ueot +text=When Kogla, the Titan Ape enters the battlefield, it fights up to one target creature you don't control. -- Whenever Kogla attacks, destroy target artifact or enchantment defending player controls. -- {1}{G}: Return target Human you control to its owner's hand. Kogla gains indestructible until end of turn. +mana={3}{G}{G}{G} +type=Legendary Creature +subtype=Ape +power=7 +toughness=6 +[/card] +[card] name=Kopala, Warden of Waves text=Spells your opponents cast that target a Merfolk you control cost {2} more to cast. -- Abilities your opponents activate that target a Merfolk you control cost {2} more to activate. mana={1}{U}{U} @@ -15635,6 +19158,14 @@ power=4 toughness=4 [/card] [card] +name=Kraken Omi +type=Creature +subttype=Kraken +power=8 +toughness=8 +color=blue +[/card] +[card] name=Kraken,Kio abilities=hexproof type=Creature @@ -15809,6 +19340,18 @@ power=2 toughness=3 [/card] [card] +name=Labyrinth Raptor +abilities=menace +auto=@combat(blocked) source(creature[menace]|mybattlefield):ability$!name(sacrifice a creature) notatarget(creature|mybattlefield) sacrifice!$ opponent +auto={B}{R}:all(creature[menace]|myBattlefield) 1/0 ueot +text=Menace -- Whenever a creature you control with menace becomes blocked, defending player sacrifices a creature blocking it. -- {B}{R}: Creatures you control with menace get +1/+0 until end of turn. +mana={B}{R} +type=Creature +subtype=Nightmare Dinosaur +power=2 +toughness=2 +[/card] +[card] name=Labyrinth of Skophos auto={T}:Add{C} auto={4}{T}:removefromcombat target(creature[attacking,blocking]|battlefield) @@ -15876,6 +19419,17 @@ mana={1}{R} type=Sorcery [/card] [card] +name=Lava Serpent +abilities=haste +autohand=__CYCLING__({2}) +text=Haste -- Cycling {2} ({2}, Discard this card: Draw a card.) +mana={5}{R} +type=Creature +subtype=Elemental Serpent +power=5 +toughness=5 +[/card] +[card] name=Lava-Field Overlord abilities=flying auto=damage:4 target(creature|opponentBattlefield) @@ -16289,6 +19843,15 @@ mana={2}{R} type=Sorcery [/card] [card] +name=Light of Hope +auto=choice life:4 controller +auto=choice destroy target(enchantment) +auto=choice counter(1/1,1) target(creature) +text=Choose one — -- • You gain 4 life. -- • Destroy target enchantment. -- • Put a +1/+1 counter on target creature. +mana={W} +type=Instant +[/card] +[card] name=Light of the Legion abilities=flying auto=_MENTOR_ @@ -16358,8 +19921,8 @@ subtype=Treefolk Aura name=Liliana of the Veil auto=counter(0/0,3,loyalty) auto={C(0/0,1,Loyalty)}:name(+1: discard) transforms((,newability[ability$!name(discard) notatarget(*|myhand) reject!$ controller],newability[ability$!name(discard) notatarget(*|myhand) reject!$ opponent])) ueot -auto={C(0/0,-2,Loyalty)}:name(-2: sacrifice creature) target(creature|opponentbattlefield) sacrifice opponent -auto={C(0/0,-6,Loyalty)}:name(-6: sacrifice half) target(*|opponentbattlefield) sacrifice opponent +auto={C(0/0,-2,Loyalty)}:name(-2: sacrifice creature) transforms((,newability[target(player) ability$!name(sacrifice creature) notatarget(creature|myBattlefield) sacrifice!$ targetedplayer])) ueot +auto={C(0/0,-6,Loyalty)}:name(-6: sacrifice half) transforms((,newability[target(player) ability$!name(sacrifice half permanents) notatarget(*|myBattlefield) sacrifice!$ targetedplayer])) ueot text=+1: each player discards a card -- -2: target player sacrifices a creature -- -6: an opponent sacrifices half the permanents they control rounded up mana={1}{B}{B} type=Planeswalker @@ -16581,13 +20144,13 @@ toughness=2 [/card] [card] name=Lonesome Unicorn // Rider in Need -abilities=canplayfromexile,vigilance +abilities=canplayfromexile,vigilance,adventure other={2}{W} name(Adventure) auto=if paid(alternative) then token(Knight,creature Knight,2/2,white,vigilance) && moveto(exile) all(this) text=Vigilance -- Create a 2/2 white Knight creature token with vigilance. (Then exile this card. You may cast the creature later from exile.) mana={4}{W} type=Creature -subtype=Unicorn Adventure +subtype=Unicorn power=3 toughness=3 [/card] @@ -16620,6 +20183,27 @@ power=2 toughness=3 [/card] [card] +name=Lore Drakkis +abilities=mutate +otherrestriction=type(creature[-human]|mybattlefield)~morethan~0 +auto=@movedTo(mytgt|graveyard) from(battlefield):all(this) moveTo(myGraveyard) +auto=@movedTo(mytgt|hand) from(battlefield):all(this) moveTo(myHand) +auto=@movedTo(mytgt|exile) from(battlefield):all(this) moveTo(myExile) +auto=@movedTo(mytgt|library) from(battlefield):all(this) moveTo(myLibrary) +auto=@movedTo(mytgt|sideboard) from(battlefield):all(this) moveTo(mySideboard) +auto={9999}:equip +other={UR}{UR} name(Mutate) +auto=transforms((,newability[@mutated(this):moveto(myhand) target(*[instant;sorcery]|mygraveyard)])) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Over) choice name(Mutate Over) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)])) forever all(this) && mutateover target(other creature[-human]|mybattlefield) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Under) choice name(Mutate Under) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)])) forever all(this) && mutateunder target(other creature[-human]|mybattlefield) +text=Mutate {UR}{UR} -- (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- Whenever this creature mutates, return target instant or sorcery card from your graveyard to your hand. +mana={1}{U}{R} +type=Creature +subtype=Lizard Beast +power=2 +toughness=3 +[/card] +[card] name=Lore Weaver auto=may moveto(myhand) notatarget(ley weaver|mylibrary) auto={5}{U}{U}:draw:2 target(player) @@ -16675,14 +20259,15 @@ type=Land [/card] [card] name=Lovestruck Beast // Heart's Desire -abilities=canplayfromexile +abilities=canplayfromexile,adventure other={G} name(Adventure) auto=if paid(alternative) then create(Human:creature Human:1/1:white) && moveto(exile) all(this) -auto=aslongas(creature[power=1,toughness=1]|mybattlefield) cantattack <1 +auto=@each my combatbegins:if type(creature[power=1]|mybattlefield)~lessthan~1 then cantattack ueot +auto=@each my combatbegins:if type(creature[toughness=1]|mybattlefield)~lessthan~1 then cantattack ueot text=Lovestruck Beast can't attack unless you control a 1/1 creature. -- Create a 1/1 white Human creature token. (Then exile this card. You may cast the creature later from exile.) mana={2}{G} type=Creature -subtype=Beast Noble Adventure +subtype=Beast Noble power=5 toughness=5 [/card] @@ -16797,6 +20382,17 @@ power=1 toughness=4 [/card] [card] +name=Lukka, Coppercoat Outcast +auto=counter(0/0,5,Loyalty) +auto={C(0/0,1,Loyalty)}:name(Exile 3 crards) moveto(exile) and!( transforms((,canplayfromexile)) )! all(*[zpos<=3]|mylibrary) +auto={C(0/0,-2,Loyalty)}{E(*[creature]|myBattlefield)}:name(Exile and reveal) reveal:1 revealzone(mylibrary) revealuntil(creature[manacost>storedmanacost]|mylibrary) optionone choice name(Get Card) target(creature[manacost>storedmanacost]|reveal) moveto(myBattlefield) optiononeend optiontwo choice name(put on bottom) all(*|reveal) bottomoflibrary optiontwoend revealend +auto={C(0/0,-7,Loyalty)}:name(Each creature deals damage) lord(creature|myBattlefield) transforms((,newability[all(opponent) dynamicability])) forever +text=+1: Exile the top three cards of your library. Creature cards exiled this way gain "You may cast this card from exile as long as you control a Lukka planeswalker." -- -2: Exile target creature you control, then reveal cards from the top of your library until you reveal a creature card with higher converted mana cost. Put that card onto the battlefield and the rest on the bottom of your library in a random order. -- -7: Each creature you control deals damage equal to its power to each opponent. +mana={3}{R}{R} +type=Legendary Planeswalker +subtype=Lukka +[/card] +[card] name=Luminous Bonds target=creature auto=cantattack @@ -16807,6 +20403,17 @@ type=Enchantment subtype=Aura [/card] [card] +name=Luminous Broodmoth +abilities=flying +auto=@movedto(creature[-flying]|myGraveyard) from(myBattlefield):all(triger[to]) moveTo(myBattlefield) && transforms((,newability[counter(0/0,1,Flying],newability[this(counter{0/0.1.Flying}>=1) flying])) +text=Flying -- Whenever a creature you control without flying dies, return it to the battlefield under its owner's control with a flying counter on it. +mana={2}{W}{W} +type=Creature +subtype=Insect +power=3 +toughness=4 +[/card] +[card] name=Lurching Rotbeast autohand=__CYCLING__({B}) text=Cycling {B} ({B}, Discard this card: Draw a card.) @@ -16838,6 +20445,17 @@ power=2 toughness=3 [/card] [card] +name=Lurking Deadeye +abilities=flash +auto=aslongas(creature[damaged]|battlefield) destroy target(creature[damaged]) oneshot +text=Flash -- When Lurking Deadeye enters the battlefield, destroy target creature that was dealt damage this turn. +mana={3}{B} +type=Creature +subtype=Human Assassin +power=4 +toughness=2 +[/card] +[card] name=Luxa River Shrine auto={1}{T}{counter(0/0,1,brick)}:life:1 controller auto={T}{restriction type(this[counter(brick)>=3])~morethan~0}:life:2 controller @@ -16935,6 +20553,27 @@ power=2 toughness=2 [/card] [card] +name=Majestic Auricorn +otherrestriction=type(creature[-human]|mybattlefield)~morethan~0 +abilities=vigilance,mutate +other={3}{W} name(Mutate) +auto=@movedTo(mytgt|graveyard) from(battlefield):all(this) moveTo(myGraveyard) +auto=@movedTo(mytgt|hand) from(battlefield):all(this) moveTo(myHand) +auto=@movedTo(mytgt|exile) from(battlefield):all(this) moveTo(myExile) +auto=@movedTo(mytgt|library) from(battlefield):all(this) moveTo(myLibrary) +auto=@movedTo(mytgt|sideboard) from(battlefield):all(this) moveTo(mySideboard) +auto={9999}:equip +auto=transforms((,newability[@mutated(this):life:4 controller])) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Over) choice name(Mutate Over) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-vigilance])) forever all(this) && mutateover target(other creature[-human]|mybattlefield) && transforms((,newability[vigilance])) forever +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Under) choice name(Mutate Under) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-vigilance])) forever all(this) && mutateunder target(other creature[-human]|mybattlefield) && transforms((,newability[vigilance])) forever +text=Mutate {3}{W} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- Vigilance -- Whenever this creature mutates, you gain 4 life. +mana={4}{W} +type=Creature +subtype=Unicorn +power=4 +toughness=4 +[/card] +[card] name=Majestic Heliopterus abilities=flying auto=@combat(attacking) source(this):target(creature[dinosaur]|mybattlefield):flying ueot @@ -17018,6 +20657,16 @@ mana={3} type=Artifact [/card] [card] +name=Maned Serval +abilities=vigilance +text=Vigilance +mana={1}{W} +type=Creature +subtype=Cat +power=1 +toughness=4 +[/card] +[card] name=Manglehorn auto=may destroy target(artifact) auto=@movedto(artifact|opponentbattlefield):tap all(trigger[to]) @@ -17194,7 +20843,7 @@ type=Instant name=Marit Lage's Slumber auto=scry:1 scrycore delayed dontshow donothing scrycoreend scryend auto=@movedTo(*[snow]|mybattlefield):scry:1 scrycore delayed dontshow donothing scrycoreend scryend -@each my upkeep restriction{type(*[snow]|myBattlefield)~morethan~9}:may sacrifice all(this) && token(Avatar,creature Avatar,20/20,black,flying,indestructible) controller +auto=@each my upkeep restriction{type(*[snow]|myBattlefield)~morethan~9}:may sacrifice all(this) && token(Avatar,creature Avatar,20/20,black,flying,indestructible) controller text=Whenever Marit Lage's Slumber or another snow permanent enters the battlefield under your control, scry 1. -- At the beginning of your upkeep, if you control ten or more snow permanents, sacrifice Marit Lage's Slumber. If you do, create Marit Lage, a legendary 20/20 black Avatar creature token with flying and indestructible. mana={1}{U} type=Legendary Snow Enchantment @@ -17444,6 +21093,16 @@ mana={2}{U}{U} type=Instant [/card] [card] +name=Memory Leak +target=opponent +aicode=activate moveTo(exile) notatarget(*[-land]|targetedpersonshand) +auto=reveal:type:*:targetedpersonshand revealzone(targetedpersonshand) optionone name(choose Exile) notatarget(<1>*[-land]|reveal) transforms((,newability[moveto(ownerhand) all(other *|reveal)],newability[moveto(ownerhand) and!(exile)!])) ueot optiononeend optiontwo name(put back) target(<1>*|reveal) moveto(ownerhand) and!( all(*|reveal) moveto(ownerhand) )! and!( moveTo(exile) target(*[-land]|opponentgraveyard) )! optiontwoend revealend +autohand=__CYCLING__({1}) +text=Target opponent reveals their hand. You choose a nonland card from that player’s graveyard or hand and exile it. -- Cycling {1} ({1}, Discard this card: Draw a card.) +mana={2}{B} +type=Sorcery +[/card] +[card] name=Memory Theft target=opponent aicode=activate reject notatarget(*[-land]|targetedpersonshand) @@ -17474,14 +21133,15 @@ type=Sorcery [/card] [card] name=Merchant of the Vale // Haggle -abilities=canplayfromexile,flash +abilities=canplayfromexile,flash,adventure +restriction=myturnonly other={R} name(Adventure) auto=if paid(alternative) then may ability$!name(discard) reject notatarget(*|myhand) and!(draw:1) controller!$ && moveto(exile) all(this) auto={2}{R}{D(*|myhand)}:draw:1 text={2}{R}, Discard a card: Draw a card. -- You may discard a card. If you do, draw a card. (Then exile this card. You may cast the creature later from exile.) mana={2}{R} type=Creature -subtype=Human Peasant Adventure +subtype=Human Peasant power=2 toughness=3 [/card] @@ -17528,15 +21188,14 @@ toughness=2 [/card] [card] name=Merfolk Secretkeeper // Venture Deeper -abilities=canplayfromexile -target=player +abilities=canplayfromexile,adventure other={U} name(Adventure) -auto=if paid(alternative) then deplete:4 +auto=if paid(alternative) then target(player) deplete:4 auto=if paid(alternative) then moveto(exile) all(this) text=Target player puts the top four cards of their library into their graveyard. (Then exile this card. You may cast the creature later from exile.) mana={U} type=Creature -subtype=Merfolk Wizard Adventure +subtype=Merfolk Wizard power=0 toughness=4 [/card] @@ -17654,6 +21313,37 @@ power=3 toughness=2 [/card] [card] +name=Migration Path +aicode=activate moveTo(myBattlefield) and!(tap(noevent))! target(land[basic]|myLibrary) +auto=name(search card) reveal:plibrarycount optionone name(choose card) target(land[basic]|reveal) moveto(ownerlibrary) and!( becomes(tobecast) ueot )! optiononeend optiontwo name(put back) target(<1>*|reveal) moveto(ownerlibrary) and!( all(*|reveal) moveto(ownerlibrary) and!(shuffle)! )! optiontwoend afterrevealed all(tobecast|mylibrary) moveto(ownerlibrary) and!(moveTo(myBattlefield) and!(tap(noevent))!)! afterrevealedend revealend +autohand=__CYCLING__({2}) +text=Search your library for up to two basic land cards, put them onto the battlefield tapped, then shuffle your library. -- Cycling {2} ({2}, Discard this card: Draw a card.) +mana={3}{G} +type=Sorcery +[/card] +[card] +name=Migratory Greathorn +abilities=mutate +otherrestriction=type(creature[-human]|mybattlefield)~morethan~0 +auto=@movedTo(mytgt|graveyard) from(battlefield):all(this) moveTo(myGraveyard) +auto=@movedTo(mytgt|hand) from(battlefield):all(this) moveTo(myHand) +auto=@movedTo(mytgt|exile) from(battlefield):all(this) moveTo(myExile) +auto=@movedTo(mytgt|library) from(battlefield):all(this) moveTo(myLibrary) +auto=@movedTo(mytgt|sideboard) from(battlefield):all(this) moveTo(mySideboard) +auto={9999}:equip +other={2}{G} name(Mutate) +auto=transforms((,newability[@mutated(this):ability$!name(Reveal) reveal:plibrarycount optionone name(choose basic land) target(<1>land[basic]|reveal) moveto(myBattlefield) optiononeend optiontwo name(put back) moveto(ownerlibrary) all(*|reveal) optiontwoend afterrevealed tap(noevent) target(basic[fresh]|myBattlefield) afterrevealedend revealend!$ controller])) +auto=ifnot paid(alternative) then transforms((,newability[becomes(,,green)])) forever all(this) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Over) choice name(Mutate Over) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)])) forever all(this) && mutateover target(other creature[-human]|mybattlefield) && transforms((,newability[becomes(,,green)])) forever +auto=if paid(alternative) then name(Mutate Under) this(mutations<1) name(Mutate Under) choice name(Mutate Under) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)])) forever all(this) && mutateunder target(other creature[-human]|mybattlefield) +text=Mutate {2}{G} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- Whenever this creature mutates, search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library. +mana={3}{G} +type=Creature +subtype=Beast +power=3 +toughness=4 +[/card] +[card] name=Militant Angel abilities=flying, lifelink auto=if (this[attacking]|mybattlefield)~morethan~0 then token(Knight,creature Knight,2/2,white,vigilance) @@ -17694,10 +21384,32 @@ mana={2}{B} type=Sorcery [/card] [card] +name=Mindleecher +abilities=flying,mutate +otherrestriction=type(creature[-human]|mybattlefield)~morethan~0 +auto=@movedTo(mytgt|graveyard) from(battlefield):all(this) moveTo(myGraveyard) +auto=@movedTo(mytgt|hand) from(battlefield):all(this) moveTo(myHand) +auto=@movedTo(mytgt|exile) from(battlefield):all(this) moveTo(myExile) +auto=@movedTo(mytgt|library) from(battlefield):all(this) moveTo(myLibrary) +auto=@movedTo(mytgt|sideboard) from(battlefield):all(this) moveTo(mySideboard) +auto={9999}:equip +other={4}{B} name(Mutate) +auto=transforms((,newability[@mutated(this):ability$!name(Reveal) reveal:1 revealzone(opponentlibrary) optionone name(Exile opponent top card?) target(*|myreveal) moveto(opponentexile) optiononeend optiontwo name(Play exiled card) target(<1>*|myreveal) activate castcard(normal) optiontwoend revealend!$ controller])) +auto=ifnot paid(alternative) then transforms((,newability[becomes(,,black)])) forever all(this) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Over) choice name(Mutate Over) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-flying])) forever all(this) && mutateover target(other creature[-human]|mybattlefield) && transforms((,newability[becomes(,,black)],newability[flying])) forever +auto=if paid(alternative) then name(Mutate Under) this(mutations<1) name(Mutate Under) choice name(Mutate Under) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-flying])) forever all(this) && mutateunder target(other creature[-human]|mybattlefield) && transforms((,newability[flying])) forever +text=Mutate {4}{B} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- Flying -- Whenever this creature mutates, exile the top card of each opponent's library face down. You may look at and play those cards for as long as they remain exiled. +mana={4}{B}{B} +type=Creature +subtype=Nightmare +power=5 +toughness=5 +[/card] +[card] name=Mindwrack Harpy abilities=Flying -@each my combatbegins:deplete:3 controller -@each my combatbegins:deplete:3 opponent +auto=@each my combatbegins:deplete:3 controller +auto=@each my combatbegins:deplete:3 opponent text=Flying -- At the beginning of combat on your turn, each player puts the top three cards of their library into their graveyard. mana={3}{B} type=Enchantment Creature @@ -18019,6 +21731,27 @@ mana={W} type=Instant [/card] [card] +name=Momentum Rumbler +auto=this(counter{0/0.1.First Strike}>=1) first strike +auto=@combat(attacking) source(this):this(counter{0/0.1.First Strike}<1) counter(0/0,1,First Strike) +auto=@combat(attacking) source(this):this(counter{0/0.1.First Strike}>0) double strike ueot +text=Whenever Momentum Rumbler attacks, if it doesn't have first strike, put a first strike counter on it. -- Whenever Momentum Rumbler attacks, if it has first strike, it gains double strike until end of turn. +mana={3}{R} +type=Creature +subtype=Dinosaur +power=3 +toughness=3 +[/card] +[card] +name=Monstrous Step +target=creature +auto=7/7 ueot +auto=target(creature) mustblock ueot +text=Target creature gets +7/+7 until end of turn. Up to one other target creature blocks it this turn if able. -- Cycling {2} ({2}, Discard this card: Draw a card.) +mana={4}{G} +type=Sorcery +[/card] +[card] name=Moon-Eating Dog auto=aslongas(planeswalker[Yanling]|mybattlefield) flying text=As long as you control a Yanling planeswalker, Moon-Eating Dog has flying. (It can't be blocked except by creatures with flying or reach.) @@ -18079,6 +21812,16 @@ power=1 toughness=1 [/card] [card] +name=Mosscoat Goriak +abilities=vigilance +text=Vigilance +mana={2}{G} +type=Creature +subtype=Beast +power=2 +toughness=4 +[/card] +[card] name=Mother Bear auto={3}{G}{E(this|mygraveyard)}:create(Bear:creature Bear:2/2:green)*2 asSorcery text={3}{G}{G}, Exile Mother Bear from your graveyard: Create two 2/2 green Bear creature tokens. Activate this ability only any time you could cast a sorcery. @@ -18233,17 +21976,17 @@ toughness=5 [/card] [card] name=Murderous Rider // Swift End -abilities=canplayfromexile,flash,lifelink -target=creature,planeswalker,player +abilities=canplayfromexile,flash,lifelink,adventure +restriction=myturnonly other={1}{B}{B} name(Adventure) -auto=if paid(alternative) then destroy +auto=if paid(alternative) then target(creature,planeswalker) destroy auto=if paid(alternative) then life:-2 controller auto=if paid(alternative) then moveto(exile) all(this) auto=@movedTo(graveyard) from(this|battlefield):all(trigger[from]) bottomoflibrary text=Lifelink -- When Murderous Rider dies, put it on the bottom of its owner's library. -- Destroy target creature or planeswalker. You lose 2 life. (Then exile this card. You may cast the creature later from exile.) mana={1}{B}{B} type=Creature -subtype=Zombie Knight Adventure +subtype=Zombie Knight power=2 toughness=3 [/card] @@ -18269,6 +22012,18 @@ power=1 toughness=3 [/card] [card] +name=Mutual Destruction +abilities=flash +target=creature +other={B}{S(creature|myBattlefield)} name(Play as Instant) +auto=ifnot paid(alternative) then destroy myturnonly +auto=if paid(alternative) then destroy +otherrestriction=type(*[flash]|mybattlefield)~morethan~0 +text=This spell has flash as long as you control a permanent with flash. -- As an additional cost to cast this spell, sacrifice a creature. -- Destroy target creature. +mana={B}{S(creature|myBattlefield)} +type=Sorcery +[/card] +[card] name=Mycosynth Lattice auto=lord(*|battlefield) transforms((artifact)) auto=lord(*|battlefield) devoid @@ -18284,6 +22039,16 @@ mana={6} type=Artifact [/card] [card] +name=Mysterious Egg +auto=@mutated(this):counter(1/1) +text=Whenever this creature mutates, put a +1/+1 counter on it. +mana={1} +type=Creature +subtype=Egg +power=0 +toughness=2 +[/card] +[card] name=Mysterious Pathlighter abilities=flying auto=lord(creature[adventure]|myBattlefield) counter(1/1,1) @@ -18331,6 +22096,17 @@ type=Land subtype=Island [/card] [card] +name=Mystic Subdual +abilities=flash +target=creature +auto=teach(creature) -2/-0 +auto=teach(creature) loseabilities +text=Flash -- Enchant creature -- Enchanted creature gets -2/-0 and loses all abilities. (Mutating onto the creature won't give it new abilities. It can gain abilities in other ways.) +mana={1}{U} +type=Enchantment +subtype=Aura +[/card] +[card] name=Mystical Dispute other={U} name(Counter Blue) auto=if paid(alternative) then name(counter blue spell) target(*[blue]|stack) transforms((,newability[pay[[{3}]] name(pay 3 mana) donothing?fizzle])) forever @@ -18340,6 +22116,54 @@ mana={2}{U} type=Instant [/card] [card] +name=Mythos of Brokkos +abilities=hiddenface +aicode=activate moveto(myGraveyard) target(*|mylibrary) +other={U}{B}{G} name(Spend U and B) +auto=if paid(alternative) then (search card) Reveal:type:*:mylibrary revealzone(mylibrary) optionone name(choose card) target(<1>*|reveal) transforms((,newability[all(other *|reveal) moveto(mylibrary) and!(shuffle)!],newability[moveto(myhand)])) optiononeend optiontwo name(shuffle) bottomoflibrary target(<1>*|reveal) and!( all(*|reveal) bottomoflibrary and!(shuffle)! )! optiontwoend revealend && moveTo(myHand) target(artifact,enchantment,land,creature,planeswalker|myGraveyard) +auto=ifnot paid(alternative) then moveTo(myHand) target(artifact,enchantment,land,creature,planeswalker|myGraveyard) +text=If {U}{B} -- was spent to cast this spell, search your library for a card, put that card into your graveyard, then shuffle your library. -- Return up to two permanent cards from your graveyard to your hand. +mana={2}{G}{G} +type=Sorcery +[/card] +[card] +name=Mythos of Illuna +target=*[-instant;-sorcery] +other={R}{G}{U}{U} name(Spend B and G) +auto=ifnot paid(alternative) then clone +auto=if paid(alternative) then clone and!( transforms((,newability[target(creature|opponentbattlefield) dynamicability])) ueot )! +text=Create a token that's a copy of target permanent. If {R}{G} was spent to cast this spell, instead create a token that's a copy of that permanent, except the token has "When this permanent enters the battlefield, if it's a creature, it fights up to one target creature you don't control." +mana={2}{U}{U} +type=Sorcery +[/card] +[card] +name=Mythos of Nethroi +other={G}{W}{B} name(Spend G and W) +auto=if paid(alternative) then destroy target(*[-land]|battlefield) +auto=ifnot paid(alternative) then destroy target(creature|battlefield) +text=Destroy target nonland permanent if it's a creature or if {G}{W} was spent to cast this spell. +mana={2}{B} +type=Instant +[/card] +[card] +name=Mythos of Vadrok +target=creature,planeswalker +other={W}{U}{R}{R} name(Spend W and U) +auto=ifnot paid(alternative) then damage:1 +auto=ifnot paid(alternative) then damage:1 target(creature,planeswalker) +auto=ifnot paid(alternative) then ability$!name(damage) choice target(creature,planeswalker) damage:1!$ controller +auto=ifnot paid(alternative) then ability$!name(damage) choice target(creature,planeswalker) damage:1!$ controller +auto=ifnot paid(alternative) then ability$!name(damage) choice target(creature,planeswalker) damage:1!$ controller +auto=if paid(alternative) then damage:1 && cantattack uynt && cantblock uynt +auto=if paid(alternative) then damage:1 target(creature,planeswalker) && cantattack uynt && cantblock uynt +auto=if paid(alternative) then ability$!name(damage) choice target(creature,planeswalker) damage:1 && cantattack uynt && cantblock uynt!$ controller +auto=if paid(alternative) then ability$!name(damage) choice target(creature,planeswalker) damage:1 && cantattack uynt && cantblock uynt!$ controller +auto=if paid(alternative) then ability$!name(damage) choice target(creature,planeswalker) damage:1 && cantattack uynt && cantblock uynt!$ controller +text=Mythos of Vadrok deals 5 damage divided as you choose among any number of target creatures and/or planeswalkers. If {W}{U} was spent to cast this spell, until your next turn, those permanents can't attack or block and their activated abilities can't be activated. +mana={2}{R}{R} +type=Sorcery +[/card] +[card] name=Naban, Dean of Iteration text=If a Wizard entering the battlefield under your control causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time. mana={1}{U} @@ -18439,6 +22263,18 @@ power=3 toughness=2 [/card] [card] +name=Narset of the Ancient Way +auto=counter(0/0,4,Loyalty) +auto={C(0/0,1,Loyalty)}:name(Gain 2 life and produce mana) life:2 controller && ability$!choice add{U} _ choice add{R} _ choice add{W}!$ controller +auto={C(0/0,-2,Loyalty)}:name(Draw and may discard land) draw:1 controller && transforms((,newability[may target(*[land]|myhand) reject])) forever +auto={C(0/0,-2,Loyalty)}{D(*[-land]|myhand)}:name(Draw, discard nonland and damage) draw:1 controller && damage:storedmanacost target(creature;planeswalker) +auto={C(0/0,-6,Loyalty)}:name(Emblem gain life) emblem transforms((,newability[@movedTo(*[-creature]|mystack):ability$! name(2 damages to player) choice name(2 damages to player) damage:2 target(player) _ choice name(2 damages to planeswalker) damage:2 target(planeswalker) _ choice name(2 damages to creature) damage:2 target(creature) !$ controller])) forever dontremove +text=+1: You gain 2 life. Add {U}, {R}, or {W}. Spend this mana only to cast a noncreature spell. -- -2: Draw a card, then you may discard a card. When you discard a nonland card this way, Narset of the Ancient Way deals damage equal to that card's converted mana cost to target creature or planeswalker. -- -6: You get an emblem with "Whenever you cast a noncreature spell, this emblem deals 2 damage to any target." +mana={1}{U}{R}{W} +type=Legendary Planeswalker +subtype=Narset +[/card] +[card] name=Narset's Reversal target=*[instant;sorcery]|stack auto=fizzleto(hand) @@ -18497,6 +22333,27 @@ power=5 toughness=4 [/card] [card] +name=Necropanther +abilities=mutate +otherrestriction=type(creature[-human]|mybattlefield)~morethan~0 +auto=@movedTo(mytgt|graveyard) from(battlefield):all(this) moveTo(myGraveyard) +auto=@movedTo(mytgt|hand) from(battlefield):all(this) moveTo(myHand) +auto=@movedTo(mytgt|exile) from(battlefield):all(this) moveTo(myExile) +auto=@movedTo(mytgt|library) from(battlefield):all(this) moveTo(myLibrary) +auto=@movedTo(mytgt|sideboard) from(battlefield):all(this) moveTo(mySideboard) +auto={9999}:equip +other={2}{WB}{WB} name(Mutate) +auto=transforms((,newability[@mutated(this):target(creature[manacost<=3]|mygraveyard) moveTo(myBattlefield)])) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Over) choice name(Mutate Over) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)])) forever all(this) && mutateover target(other creature[-human]|mybattlefield) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Under) choice name(Mutate Under) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)])) forever all(this) && mutateunder target(other creature[-human]|mybattlefield) +text=Mutate {2}{WB}{WB} -- (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- Whenever this creature mutates, return target creature card with converted mana cost 3 or less from your graveyard to the battlefield. +mana={1}{W}{B} +type=Creature +subtype=Cat Nightmare +power=3 +toughness=3 +[/card] +[card] name=Necropolis Fiend abilities=flying auto={X}{T}{E(*|myGraveyard)}: target(creature) -X/-X ueot @@ -18663,6 +22520,36 @@ mana={1}{B} type=Artifact [/card] [card] +name=Nethroi, Apex of Death +abilities=deathtouch,lifelink,mutate +otherrestriction=type(creature[-human]|mybattlefield)~morethan~0 +auto=@movedTo(mytgt|graveyard) from(battlefield):all(this) moveTo(myGraveyard) +auto=@movedTo(mytgt|hand) from(battlefield):all(this) moveTo(myHand) +auto=@movedTo(mytgt|exile) from(battlefield):all(this) moveTo(myExile) +auto=@movedTo(mytgt|library) from(battlefield):all(this) moveTo(myLibrary) +auto=@movedTo(mytgt|sideboard) from(battlefield):all(this) moveTo(mySideboard) +auto={9999}:equip +other={4}{GW}{B}{B} name(Mutate) +auto=transforms((,newability[@mutated(this):target(creature[manacost<=10]|mygraveyard) moveTo(myBattlefield)])) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Over) choice name(Mutate Over) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-deathtouch],newability[-lifelink])) forever all(this) && mutateover target(other creature[-human]|mybattlefield) && transforms((,newability[deathtouch],newability[lifelink])) forever +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Under) choice name(Mutate Under) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-deathtouch],newability[-lifelink])) forever all(this) && mutateunder target(other creature[-human]|mybattlefield) && transforms((,newability[deathtouch],newability[lifelink])) forever +text=Mutate {4}{GW}{B}{B} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- Deathtouch, lifelink -- Whenever this creature mutates, return any number of target creature cards with total power 10 or less from your graveyard to the battlefield. +mana={2}{W}{B}{G} +type=Legendary Creature +subtype=Cat Nightmare Beast +power=5 +toughness=5 +[/card] +[card] +name=Neutralize +target=*|stack +auto=fizzle +autohand=__CYCLING__({2}) +text=Counter target spell. -- Cycling {2} ({2}, Discard this card: Draw a card.) +mana={1}{U}{U} +type=Instant +[/card] +[card] name=Never target=creature,planeswalker auto=destroy @@ -18849,9 +22736,9 @@ name=Nightpack Ambusher abilities=flash auto=lord(other wolves|myBattlefield) 1/1 auto=lord(other werewolves|myBattlefield) 1/1 -auto=@each my end restriction{thisturn(*|mystack)~lessthan~1}:create(wolf:creature wolf:2/2:green) +auto=@each my endofturn restriction{thisturn(*|mystack)~lessthan~1}:create(wolf:creature wolf:2/2:green) text=Flash -- Other Wolves and Werewolves you control get +1/+1. -- At the beginning of your end step, if you didn't cast a spell this turn, create a 2/2 green Wolf creature token. -Mana={2}{G}{G} +mana={2}{G}{G} type=Creature subtype=Wolf power=4 @@ -18868,6 +22755,16 @@ power=1 toughness=1 [/card] [card] +name=Nightsquad Commando +auto=if type(creature[attacking]|mybattlefield)~morethan~0 then token(Human Soldier Nig) +text=When Nightsquad Commando enters the battlefield, if you attacked this turn, create a 1/1 white Human Soldier creature token. +mana={2}{B} +type=Creature +subtype=Human Soldier +power=2 +toughness=3 +[/card] +[card] name=Nightveil Predator abilities=flying, deathtouch, opponentshroud text=Flying, deathtouch -- Hexproof (This creature can't be the target of spells or abilities your opponents control.) @@ -19345,6 +23242,7 @@ toughness=0 [card] name=Oathsworn Vampire auto=tap(noevent) +autograveyard={1}{B}:moveTo(myBattlefield) asSorcery restriction{compare(lifegain)~morethan~0} text=Oathsworn Vampire enters the battlefield tapped. -- You may cast Oathsworn Vampire from your graveyard if you gained life this turn. mana={1}{B} type=Creature @@ -19385,7 +23283,7 @@ subtype=Nixilis [card] name=Obelisk Spider abilities=reach -auto=@combatdamaged(creature) from(this):counter(-1/-1,1) all(trigger[from]) +auto=@combatdamaged(creature) from(this):counter(-1/-1,1) all(trigger[to]) auto=@counteradded(-1/-1):life:-1 opponent && life:1 controller text=Reach -- Whenever Obelisk Spider deals combat damage to a creature, put a -1/-1 counter on that creature. -- Whenever you put one or more -1/-1 counters on a creature, each opponent loses 1 life and you gain 1 life. mana={1}{B}{G} @@ -19446,6 +23344,22 @@ power=3 toughness=4 [/card] [card] +name=Of One Mind +anyzone=if type(human|myBattlefield)~morethan~0 then changecost(colorless:-1) forcedalive +anyzone=if type(creature[-human]|myBattlefield)~morethan~0 then changecost(colorless:-1) forcedalive +auto=draw:2 controller +text=This spell costs {2} less to cast if you control a Human creature and a non-Human creature. -- Draw two cards. +mana={2}{U} +type=Sorcery +[/card] +[card] +name=Offspring's Revenge +auto=@each my combatbegins:may target(creature[red;white;black]|mygraveyard) clone and!( transforms((,setpower=1,settoughness=1,haste ueot)) forever )! && moveTo(exile) +text=At the beginning of combat on your turn, exile target red, white, or black creature card from your graveyard. Create a token that's a copy of that card, except it's 1/1. It gains haste until your next turn. +mana={2}{R}{W}{B} +type=Enchantment +[/card] +[card] name=Ogre Errant auto=@combat(attacking) source(this):target(knight[attacking]) menace ueot text=Whenever Ogre Errant attacks, another target attacking Knight gains menace until end of turn. (It can't be blocked except by two or more creatures.) @@ -19658,6 +23572,15 @@ mana={2}{W} type=Enchantment [/card] [card] +name=Ominous Seas +auto=@drawof(player):all(this) counter(0/0,1,Foreshadow) +auto={C(0/0,-1,Foreshadow)}{C(0/0,-1,Foreshadow)}{C(0/0,-1,Foreshadow)}{C(0/0,-1,Foreshadow)}{C(0/0,-1,Foreshadow)}{C(0/0,-1,Foreshadow)}{C(0/0,-1,Foreshadow)}{C(0/0,-1,Foreshadow)}:token(Kraken Omi) +autohand=__CYCLING__({2}) +text=Whenever you draw a card, put a foreshadow counter on Ominous Seas. -- Remove eight foreshadow counters from Ominous Seas: Create an 8/8 blue Kraken creature token. -- Cycling {2} ({2}, Discard this card: Draw a card.) +mana={1}{U} +type=Enchantment +[/card] +[card] name=Ominous Sphinx abilities=flying auto=@discarded(*|myhand):-2/0 target(creature|opponentBattlefield) @@ -19877,15 +23800,14 @@ toughness=1 [/card] [card] name=Order of Midnight // Alter Fate -abilities=canplayfromexile,flying,cantblock -target=creature|mygraveyard,player +abilities=canplayfromexile,flying,cantblock,adventure other={1}{B} name(Adventure) -auto=if paid(alternative) then moveto(myhand) +auto=if paid(alternative) then target(creature|mygraveyard) moveto(myhand) auto=if paid(alternative) then moveto(exile) all(this) text=Flying -- Order of Midnight can't block. -- Return target creature card from your graveyard to your hand. (Then exile this card. You may cast the creature later from exile.) mana={1}{B} type=Creature -subtype=Human Knight Adventure +subtype=Human Knight power=2 toughness=2 [/card] @@ -19985,6 +23907,27 @@ power=1 toughness=2 [/card] [card] +name=Otrimi, the Ever-Playful +abilities=trample,mutate +otherrestriction=type(creature[-human]|mybattlefield)~morethan~0 +auto=@movedTo(mytgt|graveyard) from(battlefield):all(this) moveTo(myGraveyard) +auto=@movedTo(mytgt|hand) from(battlefield):all(this) moveTo(myHand) +auto=@movedTo(mytgt|exile) from(battlefield):all(this) moveTo(myExile) +auto=@movedTo(mytgt|library) from(battlefield):all(this) moveTo(myLibrary) +auto=@movedTo(mytgt|sideboard) from(battlefield):all(this) moveTo(mySideboard) +auto={9999}:equip +other={1}{B}{G}{U} name(Mutate) +auto=transforms((,newability[@combatdamaged(player) from(this):moveto(myhand) target(creature[mutate]|mygraveyard)])) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Over) choice name(Mutate Over) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-trample])) forever all(this) && mutateover target(other creature[-human]|mybattlefield) && transforms((,newability[trample])) forever +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Under) choice name(Mutate Under) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-trample])) forever all(this) && mutateunder target(other creature[-human]|mybattlefield) && transforms((,newability[trample])) forever +text=Mutate {1}{B}{G}{U} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- Trample -- Whenever this creature deals combat damage to a player, return target creature card with mutate from your graveyard to your hand. +mana={3}{B}{G}{U} +type=Legendary Creature +subtype=Nightmare Beast +power=6 +toughness=6 +[/card] +[card] name=Out of Bounds target=*|stack auto=fizzle @@ -19996,7 +23939,7 @@ type=Instant [card] name=Outflank target=creature[attacking;blocking] -damage:type:creature:mybattlefield +auto=damage:type:creature:mybattlefield text=Outflank deals damage to target attacking or blocking creature equal to the number of creatures you control. mana={W} type=Instant @@ -20232,6 +24175,29 @@ type=Enchantment subtype=Aura [/card] [card] +name=Parcelbeast +abilities=mutate +otherrestriction=type(creature[-human]|mybattlefield)~morethan~0 +auto=@movedTo(mytgt|graveyard) from(battlefield):all(this) moveTo(myGraveyard) +auto=@movedTo(mytgt|hand) from(battlefield):all(this) moveTo(myHand) +auto=@movedTo(mytgt|exile) from(battlefield):all(this) moveTo(myExile) +auto=@movedTo(mytgt|library) from(battlefield):all(this) moveTo(myLibrary) +auto=@movedTo(mytgt|sideboard) from(battlefield):all(this) moveTo(mySideboard) +auto={9999}:equip +other={G}{U} name(Mutate) +auto=ifnot paid(alternative) then transforms((,newability[name(Look top card) {1}{T}:ability$!name(Reveal) reveal:1 optionone if type(*[-land]|reveal)~morethan~0 then name(Put card back to library) name(Put card back to library) target(<1>*|reveal) moveto(mylibrary) else name(May move to battlefield) target(*[land]|reveal) moveto(mybattlefield) optiononeend optiontwo name(Put land in hand) target(<1>*[land]|reveal) moveto(myhand) optiontwoend revealend!$ controller])) forever all(this) +auto=ifnot paid(alternative) then transforms((,newability[becomes(,,blue,green)])) forever all(this) +auto=@mutated(parents):transforms((,newability[name(Look top card) {1}{T}:ability$!name(Reveal) reveal:1 optionone if type(*[-land]|reveal)~morethan~0 then name(Put card back to library) name(Put card back to library) target(<1>*|reveal) moveto(mylibrary) else name(May move to battlefield) target(*[land]|reveal) moveto(mybattlefield) optiononeend optiontwo name(Put land in hand) target(<1>*[land]|reveal) moveto(myhand) optiontwoend revealend!$ controller])) all(parents) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Over) choice name(Mutate Over) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)])) forever all(this) && mutateover target(other creature[-human]|mybattlefield) && becomes(,,blue,green) forever +auto=if paid(alternative) then name(Mutate Under) this(mutations<1) name(Mutate Under) choice name(Mutate Under) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)])) forever all(this) && mutateunder target(other creature[-human]|mybattlefield) +text=Mutate {G}{U} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- {1}, {T}: Look at the top card of your library. If it's a land card, you may put it onto the battlefield. If you don't put the card onto the battlefield, put it into your hand. +mana={2}{G}{U} +type=Creature +subtype=Elemental Beast +power=2 +toughness=4 +[/card] +[card] name=Pardic Wanderer abilities=trample text=Trample @@ -20291,6 +24257,17 @@ power=1 toughness=3 [/card] [card] +name=Patagia Tiger +abilities=flying +auto=target(human|myBattlefield) 2/2 ueot +text=Flying -- When Patagia Tiger enters the battlefield, target Human you control gets +2/+2 until end of turn. +mana={4}{W} +type=Creature +subtype=Cat +power=3 +toughness=4 +[/card] +[card] name=Pathmaker Initiate auto={T}:target(creature[power<=2]) unblockable ueot text={T}: Target creature with power 2 or less can't be blocked this turn. @@ -20303,8 +24280,9 @@ toughness=1 [card] name=Pathrazer of Ulamog abilities=menace -abilities=oneblocker +#restriction blocking by 3 or more creature not fully supported ATM auto=@combat(attacking) source(this):name(Annihilate 3) ability$!name(sacrifice) notatarget(<3>*|mybattlefield) sacrifice!$ opponent +auto=@combat(attacking) source(this):if type(creature[blocking]|opponentBattlefield)~lessthan~3 then unblockable ueot text=Annihilator 3 (Whenever this creature attacks, defending player sacrifices three permanents.) -- Pathrazer of Ulamog can’t be blocked except by three or more creatures. mana={11} type=Creature @@ -20373,6 +24351,16 @@ mana={1}{U} type=Instant [/card] [card] +name=Perimeter Sergeant +auto=@combat(attacking) source(this):all(human|myBattlefield) 1/0 ueot +text=Whenever Perimeter Sergeant attacks, other Humans you control get +1/+0 until end of turn. +mana={2}{W} +type=Creature +subtype=Human Soldier +power=3 +toughness=2 +[/card] +[card] name=Persistent Petitioners auto={1}{T}:target(player) deplete:1 auto={T(Advisor|myBattlefield)}{T(Advisor|myBattlefield)}{T(Advisor|myBattlefield)}{T(Advisor|myBattlefield)}:deplete:12 @@ -20433,6 +24421,16 @@ power=3 toughness=4 [/card] [card] +name=Phase Dolphin +auto=@combat(attacking) source(this):target(other creature[attacking]) unblockable ueot +text=Whenever Phase Dolphin attacks, another target attacking creature can't be blocked this turn. +mana={2}{U} +type=Creature +subtype=Elemental Whale +power=1 +toughness=4 +[/card] +[card] name=Pheres-Band Brawler auto=name(Fights) transforms((,newability[dynamicability target(creature|opponentbattlefield)])) text=When Pheres-Band Brawler enters the battlefield, it fights up to one target creature you don’t control. (Each deals damage equal to its power to the other.) @@ -20708,6 +24706,17 @@ power=1 toughness=1 [/card] [card] +name=Pollywog Symbiote +auto=lord(*[mutate]|myhand) altercost(colorless,-1) +auto=@movedTo(creature[mutate]|mystack):draw:1 && transforms((,newability[target(*|myhand) reject])) forever +text=Each creature spell you cast costs {1} less to cast if it has mutate. -- Whenever you cast a creature spell, if it has mutate, draw a card, then discard a card. +mana={1}{U} +type=Creature +subtype=Frog +power=1 +toughness=3 +[/card] +[card] name=Polukranos, Unchained abilities=hydra auto=counter(1/1,6) @@ -20743,15 +24752,25 @@ power=3 toughness=4 [/card] [card] -name=Portal Mage -abilities=flash -auto=phasealter(remove,combatbhases,controller) && nextphasealter(add,combatphases,controller,after) -text=Flash -- When Portal Mage enters the battlefield during the declare attackers step, you may reselect which player or planeswalker target attacking creature is attacking. (It can’t attack its controller or its controller’s planeswalkers.) -mana={2}{U} +name=Porcuparrot +abilities=mutate +otherrestriction=type(creature[-human]|mybattlefield)~morethan~0 +auto=@movedTo(mytgt|graveyard) from(battlefield):all(this) moveTo(myGraveyard) +auto=@movedTo(mytgt|hand) from(battlefield):all(this) moveTo(myHand) +auto=@movedTo(mytgt|exile) from(battlefield):all(this) moveTo(myExile) +auto=@movedTo(mytgt|library) from(battlefield):all(this) moveTo(myLibrary) +auto=@movedTo(mytgt|sideboard) from(battlefield):all(this) moveTo(mySideboard) +auto={9999}:equip +other={2}{R} name(Mutate) +auto=ifnot paid(alternative) then transforms((,newability[name(damage target) {T}:name(damage target) thisforeach(mutations) damage:1 target(creature;player;planeswalker)])) forever +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Over) choice name(Mutate Over) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)])) forever all(this) && mutateover target(other creature[-human]|mybattlefield) && transforms((,newability[name(damage target) {T}:name(damage target) thisforeach(mutations) damage:1 target(creature;player;planeswalker)])) forever +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Under) choice name(Mutate Under) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)])) forever all(this) && mutateunder target(other creature[-human]|mybattlefield) && transforms((,newability[name(damage target) {T}:name(damage target) thisforeach(mutations) damage:1 target(creature;player;planeswalker)])) forever +text=Mutate {2}{R} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- {T}: This creature deals X damage to any target, where X is the number of times this creature has mutated. +mana={3}{R} type=Creature -subtype=Human Wizard -Power=2 -toughness=2 +subtype=Bird Beast +power=3 +toughness=4 [/card] [card] name=Portal of Sanctuary @@ -20801,6 +24820,27 @@ power=2 toughness=1 [/card] [card] +name=Pouncing Shoreshark +abilities=flash,mutate +otherrestriction=type(creature[-human]|mybattlefield)~morethan~0 +auto=@movedTo(mytgt|graveyard) from(battlefield):all(this) moveTo(myGraveyard) +auto=@movedTo(mytgt|hand) from(battlefield):all(this) moveTo(myHand) +auto=@movedTo(mytgt|exile) from(battlefield):all(this) moveTo(myExile) +auto=@movedTo(mytgt|library) from(battlefield):all(this) moveTo(myLibrary) +auto=@movedTo(mytgt|sideboard) from(battlefield):all(this) moveTo(mySideboard) +auto={9999}:equip +other={3}{U} name(Mutate) +auto=transforms((,newability[@mutated(this):may target(creature|opponentbattlefield) moveTo(opponenthand)])) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Over) choice name(Mutate Over) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-flash])) forever all(this) && mutateover target(other creature[-human]|mybattlefield) && transforms((,newability[flash])) forever +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Under) choice name(Mutate Under) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-flash])) forever all(this) && mutateunder target(other creature[-human]|mybattlefield) && transforms((,newability[flash])) forever +text=Mutate {3}{U} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- Flash -- Whenever this creature mutates, you may return target creature an opponent controls to its owner's hand. +mana={4}{U} +type=Creature +subtype=Shark Beast +power=4 +toughness=3 +[/card] +[card] name=Power Conduit auto={T}: target(*|myBattlefield) counter(0/0,1,Charge) target(artifact) auto={T}: target(*|myBattlefield) && counter(1/1,1) target(creature) @@ -20816,6 +24856,18 @@ mana={3} type=Artifact [/card] [card] +name=Pox +auto=life:-thirdupopponentlifetotal opponent +auto=life:-thirduplifetotal controller +auto=sacrifice notatarget(creature|mybattlefield) +auto=ability$! sacrifice notatarget(creature|mybattlefield) !$ opponent +auto=sacrifice notatarget(land|mybattlefield) +auto=ability$! sacrifice notatarget(land|mybattlefield) !$ opponent +text=Each player loses a third of his or her life, then discards a third of the cards in his or her hand, then sacrifices a third of the creatures he or she controls, then sacrifices a third of the lands he or she controls. Round up each time. +mana={B}{B}{B} +type=Sorcery +[/card] +[card] name=Pramikon, Sky Rampart abilities=flying,defender text=Flying, defender -- As Pramikon, Sky Rampart enters the battlefield, choose left or right. -- Each player may attack only the nearest opponent in the chosen direction and planeswalkers controlled by that opponent. @@ -20881,6 +24933,17 @@ mana={B} type=Sorcery [/card] [card] +name=Prickly Marmoset +abilities=first strike +auto=cycled(*|myHand):2/0 ueot +text=First strike -- Whenever you cycle a card, Prickly Marmoset gets +2/+0 until end of turn. +mana={2}{R} +type=Creature +subtype=Monkey +power=2 +toughness=3 +[/card] +[card] name=Pride Sovereign auto=foreach(other cat|mybattlefield) 1/1 auto=@exerted(this):token(Cat,creature Cat,1/1,white,lifelink)*2 @@ -20922,6 +24985,15 @@ mana={4} type=Artifact [/card] [card] +name=Primal Empathy +auto=@each my upkeep restriction{type(creature[power=power:highest:creature:myBattlefield]|myBattlefield)~equalto~type(creature[power=power:highest:creature:opponentBattlefield]|opponentBattlefield)}:draw:1 controller +auto=@each my upkeep restriction{type(creature[power=power:highest:creature:myBattlefield]|myBattlefield)~morethan~type(creature[power=power:highest:creature:opponentBattlefield]|opponentBattlefield)}:draw:1 controller +auto=@each my upkeep restriction{type(creature[power=power:highest:creature:myBattlefield]|myBattlefield)~lessthan~type(creature[power=power:highest:creature:opponentBattlefield]|opponentBattlefield)}:counter(1/1,1) target(creature|myBattlefield) +text=At the beginning of your upkeep, draw a card if you control a creature with the greatest power among creatures on the battlefield. Otherwise, put a +1/+1 counter on a creature you control. +mana={1}{G}{U} +type=Enchantment +[/card] +[card] name=Primal Wellspring auto={T}:add{G} && transforms((,newability[@movedto(instant,sorcery|mystack):all(trigger) castcard(noevent) auto={T}:add{B} && transforms((,newability[@movedto(instant,sorcery|mystack):all(trigger) castcard(noevent) @@ -21105,6 +25177,17 @@ power=1 toughness=1 [/card] [card] +name=Proud Wildbonder +abilities=trample +auto=lord(creature[trample]|myBattlefield) transforms((,newability[@combat(blocked,turnlimited) source(this):may name(assign combat damage to defending player) thisforeach(power>=1) damage:1 opponent && fog from(this)])) +text=Trample -- Creatures you control with trample have "You may have this creature assign its combat damage as though it weren't blocked." +mana={2}{RG}{RG} +type=Creature +subtype=Human Warrior +power=4 +toughness=3 +[/card] +[card] name=Proven Combatant autograveyard={4}{U}{U}{E}:name(Eternalize) clone and!( transforms((Zombie,removemc,setpower=4,settoughness=4,black)) forever )! assorcery text=Eternalize {4}{U}{U} ({4}{U}{U}, Exile this card from your graveyard: Create a token that's a copy of it, except it's a 4/4 black Zombie Human Warrior with no mana cost. Eternalize only as a sorcery.) @@ -21272,6 +25355,17 @@ mana={1} type=Artifact [/card] [card] +name=Pyroceratops +abilities=trample +auto=@movedTo(*[-creature]|stack):counter(1/1,1) +text=Trample -- Whenever you cast a noncreature spell, put a +1/+1 counter on Pyroceratops. +mana={3}{R} +type=Creature +subtype=Elemental Dinosaur +power=2 +toughness=3 +[/card] +[card] name=Pyroclastic Elemental auto={1}{R}{R}:damage:1 target(player) text={1}{R}{R}: Pyroclastic Elemental deals 1 damage to target player. @@ -21374,6 +25468,17 @@ power=4 toughness=3 [/card] [card] +name=Quartzwood Crasher +abilities=trample +auto=@damaged(player) from(creature[trample]|mybattlefield):create(Dinosaur Beast Qua:Creature Dinosaur Beast:thatmuch/thatmuch:green:trample) +text=Trample -- Whenever one or more creatures you control with trample deal combat damage to a player, create an X/X green Dinosaur Beast creature token with trample, where X is the amount of damage those creatures dealt to that player. +mana={2}{R}{R}{G} +type=Creature +subtype=Dinosaur Beast +power=6 +toughness=6 +[/card] +[card] name=Quasiduplicate target=creature|myBattlefield auto=clone @@ -21384,17 +25489,15 @@ type=Sorcery [/card] [card] name=Queen of Ice // Rage of Winter -abilities=canplayfromexile -target=creature|battlefield,player +abilities=canplayfromexile,adventure other={1}{U} name(Adventure) -auto=if paid(alternative) then tap -auto=if paid(alternative) then frozen +auto=if paid(alternative) then target(creature|battlefield) freeze auto=if paid(alternative) then moveto(exile) all(this) auto=@combatdamaged(creature) from(this):all(trigger[to]) tap && all(trigger[to]) frozen text=Whenever Queen of Ice deals combat damage to a creature, tap that creature. It doesn't untap during its controller's next untap step. -- Tap target creature. It doesn't untap during its controller's next untap step. (Then exile this card. You may cast the creature later from exile.) mana={2}{U} type=Creature -subtype=Human Noble Wizard Adventure +subtype=Human Noble Wizard power=2 toughness=3 [/card] @@ -21573,9 +25676,8 @@ type=Instant [card] name=Rain of Thorns auto=choice name(Destroy target artifact) destroy target(artifact) -auto=choice name(Destroy target enchantment) destroy target(enchantment) auto=choice name(Destroy target land) destroy target(land) -auto=name(More...) emblem transforms((,newability[({0}:name(Destroy target artifact) destroy target(artifact)],newability[{0}:name(Destroy target enchantment) destroy target(enchantment)],newability[{0}:name(Destroy target land) destroy target(land)])) ueot +auto=name(More...) emblem transforms((,newability[({0}:name(Destroy target artifact) destroy target(artifact)],newability[{0}:name(Destroy target land) destroy target(land)])) ueot text=Choose one or both — -- • Destroy target artifact. -- • Destroy target land. mana={4}{G}{G} type=Sorcery @@ -21655,6 +25757,15 @@ power=6 toughness=6 [/card] [card] +name=Raking Claws +target=creature +auto=double strike ueot +autohand=__CYCLYNG__({2}) +text=Target creature gains double strike until end of turn. -- Cycling {2} ({2}, Discard this card: Draw a card.) +mana={1}{R} +type=Instant +[/card] +[card] name=Ral's Dispersal target=creature auto=moveTo(ownerHand) @@ -21727,6 +25838,14 @@ mana={2}{W} type=Instant [/card] [card] +name=Ram Through +target=creature|mybattlefield +auto=transforms((,newability[dynamicability target(creature|opponentbattlefield)])) +text=Target creature you control deals damage equal to its power to target creature you don't control. If the creature you control has trample, excess damage is dealt to that creature's controller instead. +mana={1}{G} +type=Instant +[/card] +[card] name=Ramos, Dragon Engine abilities=flying auto=@movedTo(*[white]|mystack):counter(1/1) @@ -21953,6 +26072,24 @@ power=2 toughness=1 [/card] [card] +name=Raugrin Crystal +auto={T}:Add{U} +auto={T}:Add{R} +auto={T}:Add{W} +autohand=__CYCLING__({2}) +text={T}: Add {U}, {R}, or {W}. -- Cycling {2} ({2}, Discard this card: Draw a card.) +mana={3} +type=Artifact +[/card] +[card] +name=Raugrin Triome +auto=tap(noevent) +autohand=__CYCLING__({3}) +text=({T}: Add {U}, {R}, or {W}.) -- Raugrin Triome enters the battlefield tapped. -- Cycling {3} ({3}, Discard this card: Draw a card.) +type=Land +subtype=Island Mountain Plains +[/card] +[card] name=Ravenous Chupacabra auto=destroy target(creature|opponentBattlefield) text=When Ravenous Chupacabra enters the battlefield, destroy target creature an opponent controls. @@ -22018,7 +26155,7 @@ toughness=1 [card] name=Raving Dead abilities=deathtouch,mustattack -auto=@combatdamaged(player) from(this):life:-halfupopponentlifetotal opponent +auto=@combatdamaged(player) from(this):life:-halfdownopponentlifetotal opponent text=Deathtouch -- At the beginning of combat on your turn, choose an opponent at random. Raving Dead attacks that player this combat if able. -- Whenever Raving Dead deals combat damage to a player, that player loses half his or her life, rounded down. mana={4}{B} type=Creature @@ -22087,13 +26224,13 @@ type=Instant [/card] [card] name=Realm-Cloaked Giant // Cast Off -abilities=canplayfromexile,vigilance +abilities=canplayfromexile,vigilance,adventure other={3}{W}{W} name(Adventure) auto=if paid(alternative) then destroy all(creature[-giant]) && moveto(exile) all(this) text=Vigilance -- Destroy all non-Giant creatures. (Then exile this card. You may cast the creature later from exile.) mana={5}{W}{W} type=Creature -subtype=Giant Adventure +subtype=Giant power=7 toughness=7 [/card] @@ -22117,15 +26254,14 @@ type=Sorcery [/card] [card] name=Reaper of Night // Harvest Fear -abilities=canplayfromexile -target=opponent +abilities=canplayfromexile,adventure other={3}{B} name(Adventure) -auto=if paid(alternative) then ability$!name(discard 2 cards) target(<2>*|myhand) reject!$ targetedplayer && moveto(exile) all(this) -auto=@combat(attacking) source(this):aslongas(type(*|opponenthand)~lessthan~3) flying +auto=if paid(alternative) then ability$!name(discard 2 cards) target(<2>*|myhand) reject!$ opponent && moveto(exile) all(this) +auto=@combat(attacking) source(this):if type(*|opponenthand)~lessthan~3 then flying ueot text=Whenever Reaper of Night attacks, if defending player has two or fewer cards in hand, it gains flying until end of turn. -- Target opponent discards two cards. (Then exile this card. You may cast the creature later from exile.) mana={5}{B}{B} type=Creature -subtype=Specter Adventure +subtype=Specter power=4 toughness=5 [/card] @@ -22172,6 +26308,14 @@ power=2 toughness=2 [/card] [card] +name=Reconnaissance Mission +auto=@combatdamagefoeof(player) from(creature|myBattlefield):may draw:1 controller +autohand=__CYCLING__({2}) +text=Whenever a creature you control deals combat damage to a player, you may draw a card. -- Cycling {2} ({2}, Discard this card: Draw a card.) +mana={2}{U}{U} +type=Enchantment +[/card] +[card] name=Recruit the Worthy buyback={3} auto=create(soldier:creature soldier:1/1:white) @@ -22267,6 +26411,27 @@ power=3 toughness=3 [/card] [card] +name=Regal Leosaur +abilities=mutate +otherrestriction=type(creature[-human]|mybattlefield)~morethan~0 +auto=@movedTo(mytgt|graveyard) from(battlefield):all(this) moveTo(myGraveyard) +auto=@movedTo(mytgt|hand) from(battlefield):all(this) moveTo(myHand) +auto=@movedTo(mytgt|exile) from(battlefield):all(this) moveTo(myExile) +auto=@movedTo(mytgt|library) from(battlefield):all(this) moveTo(myLibrary) +auto=@movedTo(mytgt|sideboard) from(battlefield):all(this) moveTo(mySideboard) +auto={9999}:equip +other={1}{RW}{RW} name(Mutate) +auto=transforms((,newability[@mutated(this):all(other creature|myBattlefield) 2/1 ueot])) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Over) choice name(Mutate Over) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)])) forever all(this) && mutateover target(other creature[-human]|mybattlefield) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Under) choice name(Mutate Under) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)])) forever all(this) && mutateunder target(other creature[-human]|mybattlefield) +text=Mutate {1}{RW}{RW} -- (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- Whenever this creature mutates, other creatures you control get +2/+1 until end of turn. +mana={R}{W} +type=Creature +subtype=Dinosaur Cat +power=2 +toughness=2 +[/card] +[card] name=Regenesis target=*[-instant;-sorcery]|myGraveyard auto=moveTo(ownerHand) @@ -22396,6 +26561,13 @@ type=Enchantment subtype=Aura [/card] [card] +name=Reptilian Reflection +auto=cycled(*|myHand):transforms((Dinosaur Creature,setpower=5,settoughness=4,red,haste,trample)) ueot +text=Whenever you cycle a card, you may have Reptilian Reflection become a 5/4 Dinosaur creature with trample and haste in addition to its other types until end of turn. +mana={2}{R} +type=Enchantment +[/card] +[card] name=Rescuer Sphinx abilities=flying auto=may target(*[-land]|myBattlefield) moveto(ownerhand) && counter(1/1,1) all(this) @@ -22675,6 +26847,17 @@ power=5 toughness=5 [/card] [card] +name=Rielle, the Everwise +auto=foreach(*[instant,sorcery]|myGraveyard) 1/0 +auto=@discarded(*|myHand) turnlimited:draw:1 controller +text=Rielle, the Everwise gets +1/+0 for each instant and sorcery card in your graveyard. -- Whenever you discard one or more cards for the first time each turn, draw that many cards. +mana={1}{U}{R} +type=Legendary Creature +subtype=Human Wizard +power=0 +toughness=3 +[/card] +[card] name=Rienne, Angel of Rebirth abilities=flying auto=lord(creature[multicolor]|myBattlefield) 1/0 @@ -22719,15 +26902,15 @@ toughness=2 [/card] [card] name=Rimrock Knight // Boulder Rush -abilities=canplayfromexile,cantblock,flash -target=creature|battlefield,player +abilities=canplayfromexile,cantblock,flash,adventure +restriction=myturnonly other={R} name(Adventure) -auto=if paid(alternative) then 2/0 ueot +auto=if paid(alternative) then target(creature|battlefield) 2/0 ueot auto=if paid(alternative) then moveto(exile) all(this) text=Rimrock Knight can't block. -- Target creature gets +2/+0 until end of turn. (Then exile this card. You may cast the creature later from exile.) mana={1}{R} type=Creature -subtype=Dwarf Knight Adventure +subtype=Dwarf Knight power=3 toughness=1 [/card] @@ -22960,12 +27143,23 @@ toughness=2 [/card] [card] name=Root Snare -auto=preventAllcombatDamage ueot +auto=preventAllcombatDamage ueotauto=preventAllcombatDamage ueot text=Prevent all combat damage that would be dealt this turn. mana={1}{G} type=Instant [/card] [card] +name=Rooting Moloch +auto=moveTo(exile) target(*[__CYCLING__]|myGraveyard):all(trigger[to]) newability[canplayfromexile, uynt] uynt +autohand=__CYCLING__({2}) +text=When Rooting Moloch enters the battlefield, exile target card with a cycling ability from your graveyard. Until the end of your next turn, you may play that card. -- Cycling {2} ({2}, Discard this card: Draw a card.) +mana={4}{R} +type=Creature +subtype=Lizard +power=4 +toughness=4 +[/card] +[card] name=Rosemane Centaur abilities=vigilance other={convoke} name(Convoke) @@ -22978,7 +27172,7 @@ toughness=4 [/card] [card] name=Rosethorn Acolyte // Seasonal Ritual -abilities=canplayfromexile +abilities=canplayfromexile,adventure other={G} name(Adventure) auto=if paid(alternative) then transforms((,newability[activatechooseacolor add{chosencolor} activatechooseend])) forever asSorcery && moveto(exile) all(this) auto={T}:add{U} @@ -22989,7 +27183,7 @@ auto={T}:add{W} text={T}: Add one mana of any color. -- Add one mana of any color. (Then exile this card. You may cast the creature later from exile.) mana={2}{G} type=Creature -subtype=Elf Druid Adventure +subtype=Elf Druid power=2 toughness=3 [/card] @@ -23182,6 +27376,21 @@ power=2 toughness=2 [/card] [card] +name=Ruinous Ultimatum +auto=destroy all(*[-land]|opponentBattlefield) +text=Destroy all nonland permanents your opponents control. +mana={R}{R}{W}{W}{W}{B}{B} +type=Sorcery +[/card] +[card] +name=Rumbling Rockslide +target=creature +auto=damage:type:land:myBattlefield +text=Rumbling Rockslide deals damage to target creature equal to the number of lands you control. +mana={3}{R} +type=Sorcery +[/card] +[card] name=Rumbling Sentry auto=scry:1 scrycore delayed dontshow donothing scrycoreend scryend text=When Rumbling Sentry enters the battlefield, scry 1. @@ -23553,6 +27762,26 @@ type=Artifact subtype=Equipment [/card] [card] +name=Sanctuary Lockdown +auto=lord(Human|myBattlefield) 1/1 +auto={2}{T(human|myBattlefield)}{T(human|myBattlefield)}:tap target(creature|opponentBattlefield) +text=Humans you control get +1/+1. -- {2}, Tap two untapped Humans you control: Tap target creature an opponent controls. +mana={2}{W} +type=Enchantment +[/card] +[card] +name=Sanctuary Smasher +abilities=first strike +autohand=__CYCLING__({2}{R}) +autohand=@cycled(this|myHand):transforms((,newability[counter(0/0,1,First Strike],newability[this(counter{0/0.1.First Strike}>=1) first strike target(creature|myBattlefield)])) +text=First strike -- Cycling {2}{R} ({2}{R}, Discard this card: Draw a card.) -- When you cycle Sanctuary Smasher, put a first strike counter on target creature you control. +mana={4}{R}{R} +type=Creature +subtype=Rhino Beast +power=6 +toughness=4 +[/card] +[card] name=Sanctum Seeker auto=@combat(attacking) source(vampire|mybattlefield):life:-1 opponent && life:1 controller text=Whenever a Vampire you control attacks, each opponent loses 1 life and you gain 1 life. @@ -23640,7 +27869,7 @@ name=Saproling Art type=Creature subtype=Saproling power=1 -toughnss=1 +toughness=1 color=green [/card] [card] @@ -23808,6 +28037,42 @@ mana={G} type=Sorcery [/card] [card] +name=Savai Crystal +auto={T}:Add{R} +auto={T}:Add{W} +auto={T}:Add{B} +autohand=__CYCLING__({2}) +text={T}: Add {R}, {W}, or {B}. -- Cycling {2} ({2}, Discard this card: Draw a card.) +mana={3} +type=Artifact +[/card] +[card] +name=Savai Sabertooth +mana={1}{W} +type=Creature +subtype=Cat +power=3 +toughness=1 +[/card] +[card] +name=Savai Thundermane +auto=@cycled(*|myhand):may pay({2}) damage:2 target(creature) && life:2 controller +text=Whenever you cycle a card, you may pay 2 . When you do, Savai Thundermane deals 2 damage to target creature and you gain 2 life. +mana={R}{W} +type=Creature +subtype=Elemental Cat +power=3 +toughness=2 +[/card] +[card] +name=Savai Triome +auto=tap(noevent) +autohand=__CYCLING__({3}) +text=({T}: Add {R}, {W}, or {B}.) -- Savai Triome enters the battlefield tapped. -- Cycling {3} ({3}, Discard this card: Draw a card.) +type=Land +subtype=Mountain Plains Swamp +[/card] +[card] name=Savannah Sage auto=life:2 controller text=When Savannah Sage enters the battlefield, you gain 2 life. @@ -23842,6 +28107,27 @@ power=3 toughness=3 [/card] [card] +name=Sawtusk Demolisher +abilities=trample,mutate +otherrestriction=type(creature[-human]|mybattlefield)~morethan~0 +auto=@movedTo(mytgt|graveyard) from(battlefield):all(this) moveTo(myGraveyard) +auto=@movedTo(mytgt|hand) from(battlefield):all(this) moveTo(myHand) +auto=@movedTo(mytgt|exile) from(battlefield):all(this) moveTo(myExile) +auto=@movedTo(mytgt|library) from(battlefield):all(this) moveTo(myLibrary) +auto=@movedTo(mytgt|sideboard) from(battlefield):all(this) moveTo(mySideboard) +auto={9999}:equip +other={3}{G} name(Mutate) +auto=transforms((,newability[@mutated(this):name(Destroy and create token) ability$!name(Choose one) choice name(Controller) target(*[-creature]|myBattlefield) destroy && token(Beast Saw) controller _ choice name(opponent) target(*[-creature]|opponentBattlefield) destroy && token(Beast Saw) opponent!$ controller])) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Over) choice name(Mutate Over) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-trample])) forever all(this) && mutateover target(other creature[-human]|mybattlefield) && transforms((,newability[trample])) forever +auto=if paid(alternative) then name(Mutate Under) this(mutations<1) name(Mutate Under) choice name(Mutate Under) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-trample])) forever all(this) && mutateunder target(other creature[-human]|mybattlefield) && transforms((,newability[trample])) forever +text=Mutate {3}{G} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- Trample -- Whenever this creature mutates, destroy target noncreature permanent. Its controller creates a 3/3 green Beast creature token. +mana={4}{G}{G} +type=Creature +subtype=Beast +power=6 +toughness=6 +[/card] +[card] name=Scalding Cauldron auto={3}{T}{S}:damage:3 target(creature) text={3}, {T}, Sacrifice Scalding Cauldron: It deals 3 damage to target creature. @@ -24147,6 +28433,27 @@ text=Sea of Clouds enters the battlefield tapped unless you have two or more opp type=Land [/card] [card] +name=Sea-Dasher Octopus +abilities=flash,mutate +otherrestriction=type(creature[-human]|mybattlefield)~morethan~0 +auto=@movedTo(mytgt|graveyard) from(battlefield):all(this) moveTo(myGraveyard) +auto=@movedTo(mytgt|hand) from(battlefield):all(this) moveTo(myHand) +auto=@movedTo(mytgt|exile) from(battlefield):all(this) moveTo(myExile) +auto=@movedTo(mytgt|library) from(battlefield):all(this) moveTo(myLibrary) +auto=@movedTo(mytgt|sideboard) from(battlefield):all(this) moveTo(mySideboard) +auto={9999}:equip +other={1}{U} name(Mutate) +auto=transforms((,newability[@combatdamaged(player) from(this):draw:1 controller])) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Over) choice name(Mutate Over) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-flash])) forever all(this) && mutateover target(other creature[-human]|mybattlefield) && transforms((,newability[flash])) forever +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Under) choice name(Mutate Under) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-flash])) forever all(this) && mutateunder target(other creature[-human]|mybattlefield) && transforms((,newability[flash])) forever +text=Mutate {1}{U} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- Flash -- Whenever this creature deals combat damage to a player, draw a card. +mana={1}{U}{U} +type=Creature +subtype=Octopus +power=2 +toughness=2 +[/card] +[card] name=Seafloor Oracle auto=@combatdamaged(player) from(Merfolk|myBattlefield):draw:1 text=Whenever a Merfolk you control deals combat damage to a player, draw a card. @@ -24467,6 +28774,16 @@ power=5 toughness=5 [/card] [card] +name=Serrated Scorpion +auto=@moveTo(this|myGraveyard) from(myBattlefield):damage:2 target(player) && life:2 controller +text=When Serrated Scorpion dies, it deals 2 damage to each opponent and you gain 2 life. +mana={B} +type=Creature +subtype=Scorpion +power=1 +toughness=2 +[/card] +[card] name=Setessan Champion auto=@movedTo(enchantment|myBattlefield):all(this) counter(1/1,1) && draw:1 controller text=Constellation — Whenever an enchantment enters the battlefield under your control, put a +1/+1 counter on Setessan Champion and draw a card. @@ -24694,6 +29011,15 @@ mana={3}{G}{G} type=Instant [/card] [card] +name=Shark Typhoon +auto=@movedto(*[-creature]|mystack):all(trigger[to]) transforms((,newability[create(Shark:Creature Shark:manacost/manacost:blue:flying)])) oneshot +autohand=__CYCLING__({X}{1}{U}) +autohand=@cycled(this|hand):create(Shark:Creature Shark:X/X:blue:flying) +text=Whenever you cast a noncreature spell, create an X/X blue Shark creature token with flying, where X is that spell's converted mana cost. -- Cycling {X}{1}{U} ({X}{1}{U}, Discard this card: Draw a card.) -- When you cycle Shark Typhoon, create an X/X blue Shark creature token with flying. +mana={5}{U} +type=Enchantment +[/card] +[card] name=Sharktocrab auto=this(counter{1/1}<1) {2}{G}{U}:counter(1/1) auto=@counteradded(1/1) from(this):transforms((,newability[freeze target(creature|opponentbattlefield)])) forever @@ -24789,15 +29115,15 @@ type=Sorcery [/card] [card] name=Shepherd of the Flock // Usher to Safety -abilities=canplayfromexile,flash -target=*|myBattlefield +abilities=canplayfromexile,flash,adventure +restriction=myturnonly other={W} name(Adventure) -auto=if paid(alternative) then moveTo(ownerhand) +auto=if paid(alternative) then target(*|myBattlefield) moveTo(ownerhand) auto=if paid(alternative) then moveto(exile) all(this) text=Return target permanent you control to its owner's hand. (Then exile this card. You may cast the creature later from exile.) mana={1}{W} type=Creature -subtype=Human Peasant Adventure +subtype=Human Peasant power=3 toughness=1 [/card] @@ -24984,6 +29310,15 @@ type=Artifact subtype=Equipment [/card] [card] +name=Shredded Sails +auto=choice name(Destroy artifact):destroy target(artifact) +auto=choice name(Damage flying creature):damage:4 target(creature[flying]) +autohand=__CYCLING__({2}) +text=Choose one — -- • Destroy target artifact. -- • Shredded Sails deals 4 damage to target creature with flying. -- Cycling {2} ({2}, Discard this card: Draw a card.) +mana={1}{R} +type=Instant +[/card] +[card] name=Shriekdiver abilities=flying auto={1}:haste ueot @@ -25206,16 +29541,15 @@ type=Sorcery [/card] [card] name=Silverflame Squire // On Alert -abilities=canplayfromexile,flash -target=creature|battlefield,player +abilities=canplayfromexile,flash,adventure +restriction=myturnonly other={2}{W} name(Adventure) -auto=if paid(alternative) then 2/2 ueot -auto=if paid(alternative) then untap +auto=if paid(alternative) then target(creature|battlefield) transform((,newability[2/2],newability[untap])) ueot auto=if paid(alternative) then moveto(exile) all(this) text=Target creature gets +2/+2 until end of turn. Untap it. (Then exile this card. You may cast the creature later from exile.) mana={1}{W} type=Creature -subtype=Human Soldier Adventure +subtype=Human Soldier power=2 toughness=1 [/card] @@ -25512,6 +29846,18 @@ mana={B} type=Instant [/card] [card] +name=Skull Prophet +auto={T}:Add{B} +auto={T}:Add{G} +auto={T}:deplete:2 controller +text={T}: Add {B} or {G}. -- {T}: Put the top two cards of your library into your graveyard. +mana={B}{G} +type=Creature +subtype=Human Druid +power=3 +toughness=1 +[/card] +[card] name=Skullknocker Ogre auto=@damagefoeof(player) from(this):discard:1 opponent && draw:1 opponent text=Whenever Skullknocker Ogre deals damage to an opponent, that player discards a card at random. If the player does, they draw a card. @@ -25574,6 +29920,18 @@ power=1 toughness=3 [/card] [card] +name=Skycat Sovereign +abilities=flying +auto=foreach(other creature[flying]|myBattlefield) 1/1 +auto={2}{W}{U}:token(Cat Bird Sky) +text=Flying -- Skycat Sovereign gets +1/+1 for each other creature you control with flying. -- {2}{W}{U}: Create a 1/1 white Cat Bird creature token with flying. +mana={W}{U} +type=Creature +subtype=Elemental Cat +power=1 +toughness=1 +[/card] +[card] name=Skyknight Vanguard abilities=flying auto=@combat(attacking) source(this):token(Soldier,Creature Soldier,1/1,white,battleready) @@ -25702,6 +30060,14 @@ mana={U} type=Sorcery [/card] [card] +name=Sleeper Dart +auto=draw:1 controller +auto={T}{S}:frozen target (creature) +text=When Sleeper Dart enters the battlefield, draw a card. -- {T}, Sacrifice Sleeper Dart: Target creature doesn't untap during its controller's next untap step. +mana={2} +type=Artifact +[/card] +[card] name=Slimebind abilities=flash target=creature @@ -25755,6 +30121,17 @@ power=1 toughness=2 [/card] [card] +name=Slitherwisp +abilities=flash +auto=@moveTo(*[flash]|mycastingzone) restriction{thisturn(*[flash]|mycastingzone)~equalto~1}:draw:1 controller && life:-1 opponent +text=Flash -- Whenever you cast another spell that has flash, you draw a card and each opponent loses 1 life. +mana={U}{B}{B} +type=Creature +subtype=Elemental Nightmare +power=3 +toughness=2 +[/card] +[card] name=Smelt-Ward Ignus auto={2}{R}{S}:auto=target(creature[power<=3]|battlefield) transforms((,newability[moveTo(opponentbattlefield)],newability[phaseaction[endofturn sourceinplay] moveTo(ownerbattlefield)],newability[untap],haste)) ueot asSorcery text={2}{R}, Sacrifice Smelt-Ward Ignus: Gain control of target creature with power 3 or less until end of turn. Untap that creature. It gains haste until end of turn. Activate this ability only any time you could cast a sorcery. @@ -25785,13 +30162,13 @@ type=Sorcery [/card] [card] name=Smitten Swordmaster // Curry Favor -abilities=canplayfromexile,lifelink +abilities=canplayfromexile,lifelink,adventure other={B} name(Adventure) -auto=if paid(alternative) then life:type:creature[knight]:mybattlefield controller && life:-type:creature[knight]:mybattlefield opponent && moveto(exile) all(this) +auto=if paid(alternative) then life:type:creature[knight]:mybattlefieldminus1minusend controller && life:-type:creature[knight]:mybattlefieldminus1minusend opponent && moveto(exile) all(this) text=Lifelink -- You gain X life and each opponent loses X life, where X is the number of Knights you control. mana={1}{B} type=Creature -subtype=Human Knight Adventure +subtype=Human Knight power=2 toughness=1 [/card] @@ -25811,10 +30188,31 @@ name=Snake Xyr type=Creature subtype=Snake power=1 -toughnss=1 +toughness=1 color=green [/card] [card] +name=Snapdax, Apex of the Hunt +abilities=double strike,mutate +otherrestriction=type(creature[-human]|mybattlefield)~morethan~0 +auto=@movedTo(mytgt|graveyard) from(battlefield):all(this) moveTo(myGraveyard) +auto=@movedTo(mytgt|hand) from(battlefield):all(this) moveTo(myHand) +auto=@movedTo(mytgt|exile) from(battlefield):all(this) moveTo(myExile) +auto=@movedTo(mytgt|library) from(battlefield):all(this) moveTo(myLibrary) +auto=@movedTo(mytgt|sideboard) from(battlefield):all(this) moveTo(mySideboard) +auto={9999}:equip +other={2}{B}{R}{W}{W} name(Mutate) +auto=transforms((,newability[@mutated(this):life:4 controller],newability[@mutated(this):damage:4 target(*[creature;planeswalker]|opponentBattlefield)])) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Over) choice name(Mutate Over) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-double strike])) forever all(this) && mutateover target(other creature[-human]|mybattlefield) && transforms((,newability[double strike])) forever +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Under) choice name(Mutate Under) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-double strike])) forever all(this) && mutateunder target(other creature[-human]|mybattlefield) && transforms((,newability[double strike])) forever +text=Mutate {2}{B}{R}{W}{W} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- Double strike -- Whenever this creature mutates, it deals 4 damage to target creature or planeswalker an opponent controls and you gain 4 life. +mana={1}{R}{W}{B} +type=Legendary Creature +subtype=Dinosaur Cat Nightmare +power=3 +toughness=5 +[/card] +[card] name=Snapping Sailback abilities=flash auto=@damaged(this):counter(1/1,1) @@ -25826,6 +30224,16 @@ power=4 toughness=4 [/card] [card] +name=Snare Tactician +auto=@cycled(*|myHand):tap target(creature|opponentBattlefield) +text=Whenever you cycle a card, tap target creature an opponent controls. +mana={2}{W} +type=Creature +subtype=Human Soldier +power=2 +toughness=3 +[/card] +[card] name=Snarespinner abilities=reach auto=@combat(blocking) source(this) from(creature[flying]):all(this) 2/0 ueot @@ -25912,6 +30320,17 @@ mana={2}{W} type=Enchantment [/card] [card] +name=Solid Footing +abilities=flash +target=creature +auto=teach(creature) 1/1 +auto=teach(creature[vigilance]) combattoughness +text=Flash -- Enchant creature -- Enchanted creature gets +1/+1. -- As long as enchanted creature has vigilance, it assigns combat damage equal to its toughness rather than its power. +mana={W} +type=Enchantment +subtype=Aura +[/card] +[card] name=Solitary Camel auto=aslongas(Desert|mybattlefield,myGraveyard) lifelink text=Solitary Camel has lifelink as long as you control a Desert or there is a Desert card in your graveyard. (Damage dealt by this creature also causes you to gain that much life.) @@ -25922,6 +30341,15 @@ power=3 toughness=2 [/card] [card] +name=Song of Creation +auto=maxPlay(land)+1 +auto=@moveTo(*|myStak):draw:2 controller +auto=@each my end:moveTo(graveyard) all(*|myhand) +text=You may play an additional land on each of your turns. -- Whenever you cast a spell, draw two cards. -- At the beginning of your end step, discard your hand. +mana={1}{G}{U}{R} +type=Enchantment +[/card] +[card] name=Song of Freyalise auto=counter(0/0,1,Lore) auto=@each my firstmain:counter(0/0,1,Lore) @@ -25958,6 +30386,18 @@ mana={1}{U}{R} type=Instant [/card] [card] +name=Sonorous Howlbonder +abilities=menace +#The restriction blocking by 3 or more creature not fully supported ATM +auto=@combat(attacking) source(creature[menace]|myBattlefield):if type(creature[blocking]|opponentBattlefield)~lessthan~thricetype:creature[attacking,menace]:mybattlefield then lord(creature[menace]|myBattlefield) unblockable ueot +text=Menace -- Each creature you control with menace can't be blocked except by three or more creatures. +mana={1}{BR}{BR} +type=Creature +subtype=Human Warrior +power=2 +toughness=2 +[/card] +[card] name=Sorcerer of the Fang auto={5}{B}{T}:damage:2 target(opponent,planeswalker) text={5}{B}, {T}: Sorcerer of the Fang deals 2 damage to target opponent or planeswalker. @@ -26167,6 +30607,28 @@ power=4 toughness=5 [/card] [card] +name=Souvenir Snatcher +abilities=flying,mutate +otherrestriction=type(creature[-human]|mybattlefield)~morethan~0 +auto=@movedTo(mytgt|graveyard) from(battlefield):all(this) moveTo(myGraveyard) +auto=@movedTo(mytgt|hand) from(battlefield):all(this) moveTo(myHand) +auto=@movedTo(mytgt|exile) from(battlefield):all(this) moveTo(myExile) +auto=@movedTo(mytgt|library) from(battlefield):all(this) moveTo(myLibrary) +auto=@movedTo(mytgt|sideboard) from(battlefield):all(this) moveTo(mySideboard) +auto={9999}:equip +other={5}{U} name(Mutate) +auto=transforms((,newability[@mutated(this):target(artifact[-creature]|opponentbattlefield) moveTo(myBattlefield)])) +auto=ifnot paid(alternative) then transforms((,newability[becomes(,,blue)])) forever all(this) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Over) choice name(Mutate Over) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-flying])) forever all(this) && mutateover target(other creature[-human]|mybattlefield) && transforms((,newability[flying],newability[becomes(,,blue)])) forever +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Under) choice name(Mutate Under) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-flying]])) forever all(this) && mutateunder target(other creature[-human]|mybattlefield) && transforms((,newability[flying])) forever +text=Mutate {5}{U} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- Flying -- Whenever this creature mutates, gain control of target noncreature artifact. +mana={4}{U} +type=Creature +subtype=Bird +power=4 +toughness=4 +[/card] +[card] name=Sovereign's Bite target=player auto=life:-3 @@ -26324,6 +30786,16 @@ mana={3}{U}{U} type=Instant [/card] [card] +name=Spelleater Wolverine +auto=aslongas(*[instant;sorcery]|myGraveyard) double strike >2 +text=Spelleater Wolverine has double strike as long as there are three or more instant and/or sorcery cards in your graveyard. +mana={2}{R} +type=Creature +subtype=Wolverine +power=3 +toughness=2 +[/card] +[card] name=Spellgorger Weird auto=@movedTo(*[-creature]|mystack):counter(1/1) text=Whenever you cast a noncreature spell, put a +1/+1 counter on Spellgorger Weird. @@ -26486,7 +30958,7 @@ toughness=2 [/card] [card] name=Spinehorn Minotaur -auto=restriction{compare(pdrewcount)~morethan~1} double strike +auto=restriction{compare(pdrewcount)~morethan~1} double strike ueot text=As long as you've drawn two or more cards this turn, Spinehorn Minotaur has double strike. mana={2}{R} type=Creature @@ -26610,6 +31082,18 @@ mana={2}{B} type=Instant [/card] [card] +name=Splendor Mare +abilities=lifelink +autohand=__CYCLING__({1}{W}) +autohand=@cycled(this|myHand):transforms((,newability[counter(0/0,1,Lifelink],newability[this(counter{0/0.1.Lifelink}>=1) lifelink target(creature|myBattlefield)])) +text=Lifelink -- Cycling {1}{W} ({1}{W}, Discard this card: Draw a card.) -- When you cycle Splendor Mare, put a lifelink counter on target creature you control. +mana={2}{W} +type=Creature +subtype=Elk Unicorn +power=3 +toughness=3 +[/card] +[card] name=Splicer's Skill auto=token(Golem,Artifact Creature Golem,3/3) text=Create a 3/3 colorless Golem artifact creature token. -- Splice onto instant or sorcery {3}{W} (As you cast an instant or sorcery spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) @@ -26627,6 +31111,16 @@ power=3 toughness=3 [/card] [card] +name=Spontaneous Flight +target=creature +auto=2/2 ueot +auto=counter(0/0,1,Flying) +auto=transforms((,newability[this(counter{0/0.1.Flying}>=1) flying])) +text=Target creature gets +2/+2 until end of turn. Put a flying counter on it. +mana={2}{W} +type=Instant +[/card] +[card] name=Spore Swarm auto=create(Saproling:creature Saproling:1/1:green:)*3 text=Create three 1/1 green Saproling creature tokens. @@ -26673,6 +31167,25 @@ power=1 toughness=1 [/card] [card] +name=Springjaw Trap +abilities=flash +auto={4}{T}{S}:damage:3 target(creature,planeswalker,player) +text=Flash -- {4}, {T}, Sacrifice Springjaw Trap: It deals 3 damage to any target. +mana={1} +type=Artifact +[/card] +[card] +name=Sprite Dragon +abilities=flying,haste +auto=@moveTo(*[-creature]|myStak):counter(1/1,1) +text=Flying, haste -- Whenever you cast a noncreature spell, put a +1/+1 counter on Sprite Dragon. +mana={U}{R} +type=Creature +subtype=Faerie Dragon +power=1 +toughness=1 +[/card] +[card] name=Sprouting Renewal other={convoke} name(Convoke) auto=choice create(Elf Knight:creature Elf Knight:2/2:green,white:vigilance) @@ -26835,6 +31348,18 @@ mana={2}{W} type=Instant [/card] [card] +name=Startling Development +target=creature +auto=ueot transforms((removetypes)) +auto=ueot transforms((blue)) +auto=ueot transforms((Serpent)) +auto=ueot transforms((,setpower=4,settoughness=4)) +autohand=__CYCLING__({1}) +text=Until end of turn, target creature becomes a blue Serpent with base power and toughness 4/4. -- Cycling {1} ({1}, Discard this card: Draw a card.) +mana={1}{U} +type=Instant +[/card] +[card] name=Static Orb auto=@each my beginofturn sourcenottap:lord(*|battlefield) doesnotuntap && untap target(*)*2 auto=@each opponent beginofturn sourcenottap:lord(*|battlefield) doesnotuntap && untap target(*)*2 @@ -26898,7 +31423,7 @@ type=Sorcery name=Steel Hellkite abilities=flying auto={2}:1/0 ueot -@combatdamaged(player) from(this):phaseaction may {X}:destroy all(*[-land;manacost=X]) opponent limit:1 +auto=@combatdamaged(player) from(this):phaseaction may {X}:destroy all(*[-land;manacost=X]) opponent limit:1 text=Flying -- {2}: Steel Hellkite gets +1/+0 until end of turn. -- {X}: Destroy each nonland permanent with converted mana cost X whose controller was dealt combat damage by Steel Hellkite this turn. Activate this ability only once each turn. mana={6} type=Artifact Creature @@ -27204,6 +31729,17 @@ power=5 toughness=5 [/card] [card] +name=Stormwild Capridor +abilities=flying +auto=@damaged(this) from(NoncombatDamage):all(trigger[to]) vigor +text=Flying -- If noncombat damage would be dealt to Stormwild Capridor, prevent that damage. Put a +1/+1 counter on Stormwild Capridor for each 1 damage prevented this way. +mana={2}{W} +type=Creature +subtype=Bird Goat +power=1 +toughness=3 +[/card] +[card] name=Storrev, Devkarin Lich abilities=trample auto=@combatdamaged(player,planeswalker) from(this):moveto(ownerhand) target(*[creature;planeswalker;-fresh]|mygraveyard) @@ -27316,6 +31852,24 @@ mana={X}{R} type=Sorcery [/card] [card] +name=Sudden Spinnerets +target=creature +auto=1/3 ueot +auto=counter(0/0,1,Reach) +auto=transforms((,newability[this(counter{0/0.1.Reach}>=1) reach],newability[untap(this)])) +text=Target creature gets +1/+3 until end of turn. Put a reach counter on it. Untap it. +mana={G} +type=Instant +[/card] +[card] +name=Suffocating Fumes +auto=all(creature|opponentBattlefield) -1/-1 ueot +autohand=__CYCLING__({2}) +text=Creatures your opponents control get -1/-1 until end of turn. / Cycling {2} ({2}, Discard this card: Draw a card.) +mana={2}{B} +type=Instant +[/card] +[card] name=Sumala Woodshaper auto=target(*[creature;enchantment;zpos<=4]|mylibrary) moveto(myhand) text=When Sumala Woodshaper enters the battlefield, look at the top four cards of your library. You may reveal a creature or enchantment card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. @@ -27565,6 +32119,23 @@ power=0 toughness=5 [/card] [card] +name=Surgeon General Commander +#The augment trigger is not supported ATM +auto=@targeted(creature|myBattlefield) from(Aura|mycastingzone):draw:1 controller +auto=@mutated(creature|myBattlefield):draw:1 controller +auto={T}:add{W} +auto={T}:add{U} +auto={T}:add{B} +auto={T}:add{R} +auto={T}:add{G} +text=Whenever you augment, enchant, or mutate a creature you control, draw a card. -- {T}: Add {W}, {U}, {B}, {R}, or {G}. +mana={3}{G} +type=Legendary Creature +subtype=Wombat Bat Chameleon +power=3 +toughness=3 +[/card] +[card] name=Surly Badgersaur auto=@discarded(*[creature]|myHand):all(this) counter(1/1,1) auto=@discarded(*[land]|myHand):token(Treasure Sur) @@ -27590,6 +32161,16 @@ power=6 toughness=6 [/card] [card] +name=Survivors' Bond +other={1}{G} name(Both) +target=creature|myGraveyard +auto=if paid(alternative) then moveTo(myHand) && moveTo(myHand) target(creature[-human]|myGraveyard) +auto=ifnot paid(alternative) then moveTo(myHand) +text=Choose one or both — -- • Return target Human creature card from your graveyard to your hand. -- • Return target non-Human creature card from your graveyard to your hand. +mana={1}{G} +type=Sorcery +[/card] +[card] name=Survivors' Encampment auto={T}:Add{1} auto={T}{T(creature|myBattlefield)}:Add{W} @@ -27631,6 +32212,14 @@ power=2 toughness=2 [/card] [card] +name=Swallow Whole +target=creature[tapped] +auto=moveTo(exile) && counter(1/1,1) target(creature[tapped]|myBattlefield) +text=As an additional cost to cast this spell, tap an untapped creature you control. -- Exile target tapped creature. Put a +1/+1 counter on the creature tapped to pay this spell's additional cost. +mana={W}{T(creature|myBattlefield} +type=Sorcery +[/card] +[card] name=Swarm Guildmage auto={4}{B}{T}:all(creature|myBattlefield)) 1/0 && menace ueot auto={1}{G}{T}:life:2 @@ -28353,6 +32942,15 @@ toughness=1 color=blue [/card] [card] +name=Tentative Connection +anyzone=if type(creature[menace]|myBattlefield)~morethan~0 then changecost(colorless:-3) forcedalive +target=creature +auto=moveto(mybattlefield) and!(transforms((,newability[phaseaction[endofturn sourceinplay] moveTo(previousbattlefield)],newability[untap],haste)) ueot)! +text=This spell costs {3} less to cast if you control a creature with menace. -- Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. +mana={3}{R} +type=Sorcery +[/card] +[card] name=Tenth District Guard auto=target(creature) 0/1 ueot text=When Tenth District Guard enters the battlefield, target creature gets +0/+1 until end of turn. @@ -28880,6 +33478,16 @@ power=4 toughness=3 [/card] [card] +name=Thieving Otter +auto=@combatdamaged(opponent) from(this):draw:1 controller +text=Whenever Thieving Otter deals damage to an opponent, draw a card. +mana={2}{U} +type=Creature +subtype=Otter +power=2 +toughness=2 +[/card] +[card] name=Thirst for Meaning auto=ability$!draw:3 _ choice name(discard 2 cards) target(<2>*|myhand) reject _ if type(enchantment|myhand)~morethan~0 then choice name(discard an enchantment) target(enchantment|myhand) reject!$ text=Draw three cards. Then discard two cards unless you discard an enchantment card. @@ -29214,6 +33822,13 @@ mana={3} type=Artifact [/card] [card] +name=Thwart the Enemy +auto=preventAllCombatDamage from(creature|opponentbattlefield) ueot +text=Prevent all damage that would be dealt this turn by creatures your opponents control. +mana={2}{G} +type=Instant +[/card] +[card] name=Tibalt's Rager auto=_DIES_damage:1 target(creature,player) auto={1}{R}:2/0 ueot @@ -29394,6 +34009,26 @@ power=4 toughness=6 [/card] [card] +name=Titanoth Rex +abilities=trample +autohand=__CYCLING__({1}{G}) +autohand=@cycled(this|myHand):transforms((,newability[counter(0/0,1,Trample],newability[this(counter{0/0.1.Trample}>=1) trample target(creature|myBattlefield)])) +text=Trample -- Cycling {1}{G} ({1}{G}, Discard this card: Draw a card.) -- When you cycle Titanoth Rex, put a trample counter on target creature you control. +mana={7}{G}{G} +type=Creature +subtype=Dinosaur Beast +power=11 +toughness=11 +[/card] +[card] +name=Titans' Nest +auto=@each my upkeep:scry:1 scrycore delayed dontshow donothing scrycoreend scryend +auto={E(*|myGraveyard)}:Add{C} +text=At the beginning of your upkeep, look at the top card of your library. You may put that card into your graveyard. -- Exile a card from your graveyard: Add Colorless . Spend this mana only to cast a colored spell without Variable Colorless in its mana cost. +mana={1}{B}{G}{U} +type=Enchantment +[/card] +[card] name=Tithebearer Giant auto=draw:1 && life:-1 text=When Tithebearer Giant enters the battlefield, you draw a card and you lose 1 life. @@ -29950,9 +34585,31 @@ power=4 toughness=4 [/card] [card] +name=Trumpeting Gnarr +abilities=mutate +otherrestriction=type(creature[-human]|mybattlefield)~morethan~0 +auto=@movedTo(mytgt|graveyard) from(battlefield):all(this) moveTo(myGraveyard) +auto=@movedTo(mytgt|hand) from(battlefield):all(this) moveTo(myHand) +auto=@movedTo(mytgt|exile) from(battlefield):all(this) moveTo(myExile) +auto=@movedTo(mytgt|library) from(battlefield):all(this) moveTo(myLibrary) +auto=@movedTo(mytgt|sideboard) from(battlefield):all(this) moveTo(mySideboard) +auto={9999}:equip +other={3}{GU}{GU} name(Mutate) +auto=transforms((,newability[@mutated(this):token(Beast Tru)])) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Over) choice name(Mutate Over) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)])) forever all(this) && mutateover target(other creature[-human]|mybattlefield) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Under) choice name(Mutate Under) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)])) forever all(this) && mutateunder target(other creature[-human]|mybattlefield) +text=Mutate {3}{GU}{GU} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- Whenever this creature mutates, create a 3/3 green Beast creature token. +mana={1}{G}{U} +type=Creature +subtype=Beast +power=3 +toughness=3 +[/card] +[card] name=Trumpeting Herd auto=create(Elephant:creature Elephant:3/3:green) -auto=if rebound then moveto(exile) all(this) and!( transforms((,newability[@rebounded:may activate castcard(normal)])) forever )! +auto=if rebound then moveto(exile) +autoexile=@rebounded:may activate castcard(normal) text=Create a 3/3 green Elephant creature token. -- Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) mana={2}{G}{G} type=Sorcery @@ -30003,15 +34660,14 @@ toughness=3 [/card] [card] name=Tuinvale Treefolk // Oaken Boon -abilities=canplayfromexile +abilities=canplayfromexile,adventure other={3}{G} name(Adventure) -target=creature|battlefield,player -auto=if paid(alternative) then counter(1/1,2) +auto=if paid(alternative) then target(creature|battlefield) counter(1/1,2) auto=if paid(alternative) then moveto(exile) all(this) text=Put two +1/+1 counters on target creature. (Then exile this card. You may cast the creature later from exile.) mana={5}{G} type=Creature -subtype=Treefolk Druid Adventure +subtype=Treefolk Druid power=6 toughness=5 [/card] @@ -30244,6 +34900,16 @@ mana={1}{B} type=Instant [/card] [card] +name=Unbreakable Bond +target=creature|myGraveyard +auto=moveTo(myBattlefield) +auto=counter(0/0,1,Lifelink) +auto=transforms((,newability[this(counter{0/0.1.Lifelink}>=1) lifelink])) +text=Return target creature card from your graveyard to the battlefield with a lifelink counter on it. +mana={4}{B} +type=Sorcery +[/card] +[card] name=Unbreakable Formation auto=if compare(restriction{assorcery}~morethan~0) then all(creature|myBattlefield) counter(1/1) auto=if compare(restriction{assorcery}~morethan~0) then all(creature|myBattlefield) vigilance @@ -30425,6 +35091,16 @@ power=4 toughness=4 [/card] [card] +name=Unexpected Fangs +target=creature +auto=counter(1/1,1) +auto=counter(0/0,1,Lifelink) +auto=transforms((,newability[this(counter{0/0.1.Lifelink}>=1) lifelink])) +text=Put a +1/+1 counter and a lifelink counter on target creature. +mana={1}{B} +type=Instant +[/card] +[card] name=Unexpected Results auto=shuffle auto=reveal:1 optionone transforms((,newability[if type(land|reveal)~morethan~0 then moveto(ownerhand) && all(*[land]|reveal) moveto(ownerbattlefield)])) forever optiononeend optiontwo name(Put Back) target(<1>*[-land]|reveal) moveto(mylibrary) and!(transforms((,newability[may activate castcard(normal)])) oneshot)! optiontwoend revealend @@ -30628,6 +35304,27 @@ mana={2}{U} type=Sorcery [/card] [card] +name=Vadrok, Apex of Thunder +abilities=flying,first strike,mutate +otherrestriction=type(creature[-human]|mybattlefield)~morethan~0 +auto=@movedTo(mytgt|graveyard) from(battlefield):all(this) moveTo(myGraveyard) +auto=@movedTo(mytgt|hand) from(battlefield):all(this) moveTo(myHand) +auto=@movedTo(mytgt|exile) from(battlefield):all(this) moveTo(myExile) +auto=@movedTo(mytgt|library) from(battlefield):all(this) moveTo(myLibrary) +auto=@movedTo(mytgt|sideboard) from(battlefield):all(this) moveTo(mySideboard) +auto={9999}:equip +other={1}{WU}{R}{R name(Mutate) +auto=transforms((,newability[@mutated(this):may castcard(normal) target(*[-creature;manacost<=3]|mygraveyard)])) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Over) choice name(Mutate Over) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-first strike],newability[-flying])) forever all(this) && mutateover target(other creature[-human]|mybattlefield) && transforms((,newability[first strike],newability[flying])) forever +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Under) choice name(Mutate Under) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-first strike],newability[-flying])) forever all(this) && mutateunder target(other creature[-human]|mybattlefield) && transforms((,newability[first strike],newability[flying])) forever +text=Mutate {1}{WU}{R}{R} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- Flying, first strike -- Whenever this creature mutates, you may cast target noncreature card with converted mana cost 3 or less from your graveyard without paying its mana cost. +mana={U}{R}{W} +type=Legendary Creature +subtype=Elemental Dinosaur Cat +power=3 +toughness=3 +[/card] +[card] name=Valduk, Keeper of the Flame auto=@each my combatbegins:thisforeach(auras) create(elemental:creature elemental:3/1:red:trample,haste,and!( transforms((,newability[phaseaction[endofturn once] moveto(exile)])) forever )!) auto=@each my combatbegins:thisforeach(gear) create(elemental:creature elemental:3/1:red:trample,haste,and!( transforms((,newability[phaseaction[endofturn once] moveto(exile)])) forever )!) @@ -30650,6 +35347,17 @@ power=3 toughness=4 [/card] [card] +name=Valiant Rescuer +auto=@cycled(*|myHand) restriction{thisturn(*[__Cycling__]|myHand)~equalto~0}:token(Human Soldier Val) +autohand=__CYCLING__({2}) +text=Whenever you cycle another card for the first time each turn, create a 1/1 white Human Soldier creature token. -- Cycling {2} ({2}, Discard this card: Draw a card.) +mana={1}{W} +type=Creature +subtype=Human Soldier +power=3 +toughness=1 +[/card] +[card] name=Vampire Champion abilities=deathtouch text=Deathtouch (Any amount of damage this deals to a creature is enough to destroy it.) @@ -31299,6 +36007,19 @@ type=Legendary Planeswalker subtype=Vivien [/card] [card] +name=Vivien, Monsters' Advocate +abilities=showfromtoplibrary +aicode=activate moveto(myBattlefield) target(creature[manacost<=storedmanacost]|mylibrary) +auto=canplaycreaturelibrarytop +auto=counter(0/0,3,Loyalty) +auto={C(0/0,1,Loyalty)}:token(Beast Viv) +auto={C(0/0,-2,Loyalty)}:emblem transforms((,newability[@movedTo(creature|myStak):moveTo(myBattlefield) target(creature[manacost<=storedmanacost]|myLibrary) && shuffle])) oneshot +text=You may look at the top card of your library any time. -- You may cast creature spells from the top of your library. -- +1: Create a 3/3 green Beast creature token. Put your choice of a vigilance counter, a reach counter, or a trample counter on it. -- -2: When you cast your next creature spell this turn, search your library for a creature card with lesser converted mana cost, put it onto the battlefield, then shuffle your library. +mana={3}{G}{G} +type=Legendary Planeswalker +subtype=Vivien +[/card] +[card] name=Vivien, Nature's Avenger auto=counter(0/0,3,loyalty) auto={C(0/0,1,Loyalty)}:target(creature) counter(1/1,3) @@ -31376,6 +36097,18 @@ power=3 toughness=1 [/card] [card] +name=Void Beckoner +abilities=deathtouch +autohand=__CYCLING__({2}{B}) +autohand=@cycled(this|myHand):transforms((,newability[counter(0/0,1,Deathtouch)],newability[this(counter{0/0.1.Deathtouch}>=1) deathtouch])) target(creature|myBattlefield)] +text=Deathtouch -- Cycling {2}{B} ({2}{B}, Discard this card: Draw a card.) -- When you cycle Void Beckoner, put a deathtouch counter on target creature you control. +mana={6}{B}{B} +type=Creature +subtype=Nightmare Horror +power=8 +toughness=8 +[/card] +[card] name=Volatile Claws auto=all(creature|myBattlefield) 2/0 auto=all(creature|myBattlefield) transforms((allsubtypes)) @@ -31426,6 +36159,17 @@ power=4 toughness=4 [/card] [card] +name=Voracious Greatshark +abilities=flash +auto=fizzle target(*[artifact,creature]|stak) +text=Flash -- When Voracious Greatshark enters the battlefield, counter target artifact or creature spell. +mana={3}{U}{U} +type=Creature +subtype=Shark +power=5 +toughness=4 +[/card] +[card] name=Voracious Hydra abilities=trample auto=counter(1/1,X) @@ -31439,6 +36183,16 @@ power=0 toughness=1 [/card] [card] +name=Voracious Reader +auto=@movedTo(*[-creature]|mystack):1/1 ueot +auto=lord(*[instant;sorcery]|mycastingzone) altercost(colorless,-1) +text=Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.) -- Instant and sorcery spells you cast cost {1} less to cast. +type=Creature +subtype=Eldrazi Homunculus +power=3 +toughness=4 +[/card] +[card] name=Voracious Typhon autograveyard=name(Escape-{5}{G}{G},exile four) {5}{G}{G}{E(other *|myGraveyard)}{E(other *|myGraveyard)}{E(other *|myGraveyard)}{E(other *|myGraveyard)}:castcard(normal) auto=@movedTo(this|mybattlefield) from(mygraveyard):counter(1/1,3) @@ -31530,6 +36284,27 @@ type=Legendary Planeswalker subtype=Vraska [/card] [card] +name=Vulpikeet +abilities=flying,mutate +otherrestriction=type(creature[-human]|mybattlefield)~morethan~0 +auto=@movedTo(mytgt|graveyard) from(battlefield):all(this) moveTo(myGraveyard) +auto=@movedTo(mytgt|hand) from(battlefield):all(this) moveTo(myHand) +auto=@movedTo(mytgt|exile) from(battlefield):all(this) moveTo(myExile) +auto=@movedTo(mytgt|library) from(battlefield):all(this) moveTo(myLibrary) +auto=@movedTo(mytgt|sideboard) from(battlefield):all(this) moveTo(mySideboard) +auto={9999}:equip +other={2}{W} name(Mutate) +auto=transforms((,newability[@mutated(this):counter(1/1)])) +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Over) choice name(Mutate Over) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-flying])) forever all(this) && mutateover target(other creature[-human]|mybattlefield) && transforms((,newability[flying])) forever +auto=if paid(alternative) then name(Mutate Over) this(mutations<1) name(Mutate Under) choice name(Mutate Under) transforms((,newability[protection from(*)],newability[indestructible],newability[cantbetargetof(*)],newability[-flying])) forever all(this) && mutateunder target(other creature[-human]|mybattlefield) && transforms((,newability[flying])) forever +text=Mutate {2}{W} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- Flying -- Whenever this creature mutates, put a +1/+1 counter on it. +mana={3}{W} +type=Creature +subtype=Fox Bird +power=2 +toughness=3 +[/card] +[card] name=Wakening Sun's Avatar auto=if casted(this) then destroy all(creature[-dinosaur]) text=When Wakening Sun's Avatar enters the battlefield, if you cast it from your hand, destroy all non-Dinosaur creatures. @@ -31951,6 +36726,13 @@ mana={4} type=Artifact [/card] [card] +name=Weaponize the Monsters +auto={2}{S(creature|myBattlefield}:damage:2 target(creature,player,planeswalker) +text={2}, Sacrifice a creature: Weaponize the Monsters deals 2 damage to any target. +mana={R} +type=Enchantment +[/card] +[card] name=Weaselback Redcap auto={1}{R}:2/0 ueot text={1}{R}: Weaselback Redcap gets +2/+0 until end of turn. @@ -32041,6 +36823,13 @@ mana={X}{U}{U}{U} type=Instant [/card] [card] +name=Whirlwind of Thought +auto=@moveTo(*[-creature]|myStak):draw:1 controller +text=Whenever you cast a noncreature spell, draw a card. +mana={1}{U}{R}{W} +type=Enchantment +[/card] +[card] name=Whisper Agent abilities=flash aicode=name(surveil) activate name(surveil) transforms((,newability[foreach(*[zpos<=1]|mylibrary) moverandom(*[zpos<=1]) from(mylibrary) to(mylibrary)])) ueot @@ -32053,6 +36842,17 @@ power=3 toughness=2 [/card] [card] +name=Whisper Squad +aicode=activate moveTo(myBattlefield) target(Whisper Squad|myLibrary) +auto={1}{B}:name(search card) reveal:plibrarycount optionone name(choose card) target(Whisper Squad|reveal) moveto(ownerlibrary) and!( becomes(tobecast) ueot )! optiononeend optiontwo name(put back) target(<1>*|reveal) moveto(ownerlibrary) and!( all(*|reveal) moveto(ownerlibrary) and!(shuffle)! )! optiontwoend afterrevealed all(tobecast|mylibrary) moveto(ownerlibrary) and!(moveTo(myBattlefield) and! tap(noevent))! afterrevealedend revealend +text={1}{B}: Search your library for a card named Whisper Squad, put it onto the battlefield tapped, then shuffle your library. +mana={B} +type=Creature +subtype=Human Soldier +power=1 +toughness=1 +[/card] +[card] name=Whisper, Blood Liturgist auto={T}{S(creature|myBattlefield)}{S(creature|myBattlefield)}:target(creature|mygraveyard) moveTo(mybattlefield) text={T}, Sacrifice two creatures: Return target creature card from your graveyard to the battlefield. @@ -32179,6 +36979,24 @@ power=1 toughness=1 [/card] [card] +name=Will of the All-Hunter +target=creature +auto=if target(creature[blocking]) then counter(1/1,2) else target(creature) 2/2 ueot +autohand=__CYLCING__({2}) +text=Target creature gets +2/+2 until end of turn. If it's blocking, instead put two +1/+1 counters on it. -- Cycling {2} ({2}, Discard this card: Draw a card.) +mana={1}{W} +type=Instant +[/card] +[card] +name=Wilt +target=artifact,enchantment +auto=destroy +autohand=__CYCLING__({2}) +text=Destroy target artifact or enchantment. -- Cycling {2} ({2}, Discard this card: Draw a card.) +mana={1}{G} +type=Instant +[/card] +[card] name=Wily Goblin auto=token(435451) text=When Wily Goblin enters the battlefield, create a colorless Treasure artifact token with "{T}, Sacrifice this artifact: Add one mana of any color to your mana pool." @@ -32288,6 +37106,19 @@ mana={2}{U} type=Sorcery [/card] [card] +name=Wingfold Pteron +auto=this(counter{0/0.1.Flying}>=1) flying +auto=this(counter{0/0.1.Hexproof}>=1) hexproof +auto=choice name(Flying) counter(0/0,1,Flying) +auto=choice name(First Strike) counter(0/0,1,Hexproof) +text=Wingfold Pteron enters the battlefield with your choice of a flying counter or a hexproof counter on it. (A creature with hexproof can't be the target of spells or abilities your opponents control.) +mana={5}{U} +type=Creature +subtype=Dinosaur +power=3 +toughness=6 +[/card] +[card] name=Wings of Hubris auto={1}:equip auto=teach(creature) flying @@ -32309,6 +37140,27 @@ power=1 toughness=1 [/card] [card] +name=Wingspan Mentor +auto=newability[counter(0/0,1,Flying) && (flying)forever target(creature[-human]|myBattlefield)] +auto={2}{U}{T}:counter(1/1,1) all(creature[flying]|myBattlefield) +text=When Wingspan Mentor enters the battlefield, put a flying counter on target non-Human creature you control. -- {2}{U}, {T}: Put a +1/+1 counter on each creature you control with flying. +mana={2}{U} +type=Creature +subtype=Human Wizard +power=1 +toughness=3 +[/card] +[card] +name=Winota, Joiner of Forces +auto=@combat(attacking) source(creature[-human]|myBattlefield):Reveal:6 revealzone(mylibrary) optionone name(Get Creature) target(human|reveal) transforms((,newability[moveto(mybattlefield)],newability[battleready],newability[indestructible])) ueot optiononeend optiontwo choice name(Shuffle) all(*|reveal) bottomoflibrary && shuffle controller optiontwoend revealend +text=Whenever a non-Human creature you control attacks, look at the top six cards of your library. You may put a Human creature card from among them onto the battlefield tapped and attacking. It gains indestructible until end of turn. Put the rest of the cards on the bottom of your library in a random order. +mana={2}{R}{W} +type=Legendary Creature +subtype=Human Warrior +power=4 +toughness=4 +[/card] +[card] name=Winter Orb auto=aslongas sourcenottap:lord(land) doesnotuntap auto=@each my untap:untap notatarget(land|mybattlefield) @@ -32725,6 +37577,19 @@ power=2 toughness=4 [/card] [card] +name=Yidaro, Wandering Monster +abilities=trample,haste +autohand=__CYCLING__({1}{R}) +autohand=@cycled(this|hand):this(variable{pyidarocount}<3) moveto(mylibrary) && shuffle && alteryidarocount:1 controller +autohand=@cycled(this|hand):this(variable{pyidarocount}>=3) moveto(myBattlefield) +text=Trample, haste -- Cycling {1}{R} -- When you cycle Yidaro, Wandering Monster, shuffle it into your library from your graveyard. If you've cycled a card named Yidaro, Wandering Monster four or more times this game, put it onto the battlefield from your graveyard instead. (Do this before you draw.) +mana={5}{R}{R} +type=Legendary Creature +subtype=Dinosaur Turtle +power=8 +toughness=8 +[/card] +[card] name=Yixlid Jailer auto=lord(*|graveyard) loseabilities text=Cards in graveyards lose all abilities. @@ -32760,6 +37625,26 @@ power=9 toughness=9 [/card] [card] +name=Zagoth Crystal +auto={T}:Add{B} +auto={T}:Add{G} +auto={T}:Add{U} +autohand=__CYCLING__({2}) +text={T}: Add {B}, {G}, or {U}. -- Cycling {2} ({2}, Discard this card: Draw a card.) +mana={3} +type=Artifact +[/card] +[card] +name=Zagoth Mamba +auto=@mutated(this):target(creature|opponentBattlefield) -2/-2 ueot +text=Whenever this creature mutates, target creature an opponent controls gets -2/-2 until end of turn. +mana={B} +type=Creature +subtype=Nightmare Snake +power=1 +toughness=1 +[/card] +[card] name=Zahid, Djinn of the Lamp other={3}{U}{T(artifact|myBattlefield)} name(Pay and tap an artifact you control) abilities=flying @@ -32794,6 +37679,14 @@ power=4 toughness=4 [/card] [card] +name=Zenith Flare +target=creature,planeswalker,player +auto=damage:type:*[__CYCLING__]|myGraveyard && life:type:*[__CYCLING__]|myGraveyard controller +text=Zenith Flare deals X damage to any target and you gain X life, where X is the number of cards with a cycling ability in your graveyard. +mana={2}{R}{W} +type=Instant +[/card] +[card] name=Zenith Seeker abilities=flying auto=@movedto(*|mygraveyard) from(myhand):target(creature|mybattlefield) flying ueot diff --git a/projects/mtg/bin/Res/sets/primitives/mtg.txt b/projects/mtg/bin/Res/sets/primitives/mtg.txt index c0b6ac4cf..7bf05a405 100644 --- a/projects/mtg/bin/Res/sets/primitives/mtg.txt +++ b/projects/mtg/bin/Res/sets/primitives/mtg.txt @@ -6190,7 +6190,8 @@ type=Sorcery name=Artful Maneuver target=creature auto=2/2 ueot -auto=if rebound then moveto(exile) all(this) and!( transforms((,newability[@rebounded:may activate castcard(normal)])) forever )! +auto=if rebound then moveto(exile) +autoexile=@rebounded:may activate castcard(normal) text=Target creature gets +2/+2 until end of turn. -- Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) mana={1}{W} type=Instant @@ -18239,7 +18240,8 @@ auto=choice name(red) transforms((,newability[protection from red])) ueot auto=choice name(blue) transforms((,newability[protection from blue])) ueot auto=choice name(black) transforms((,newability[protection from black])) ueot auto=choice name(white) transforms((,newability[protection from white])) ueot -auto=if rebound then moveto(exile) all(this) and!( transforms((,newability[@rebounded:may activate castcard(normal)])) forever )! +auto=if rebound then moveto(exile) +autoexile=@rebounded:may activate castcard(normal) text=Target creature you control gains protection from the color of your choice until end of turn. -- Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) mana={1}{W} type=Instant @@ -22224,7 +22226,8 @@ type=Instant name=Consuming Vapors target=player auto=ability$! notatarget(creature|mybattlefield) dynamicability sacrifice ) !$ targetedplayer -auto=if rebound then moveto(exile) all(this) and!( transforms((,newability[@rebounded:may activate castcard(normal)])) forever )! +auto=if rebound then moveto(exile) +autoexile=@rebounded:may activate castcard(normal) text=Target player sacrifices a creature. You gain life equal to that creature's toughness. -- Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) mana={3}{B} type=Sorcery @@ -30317,7 +30320,8 @@ name=Distortion Strike target=creature auto=1/0 ueot auto=unblockable ueot -auto=if rebound then moveto(exile) all(this) and!( transforms((,newability[@rebounded:may activate castcard(normal)])) forever )! +auto=if rebound then moveto(exile) +autoexile=@rebounded:may activate castcard(normal) text=Target creature gets +1/+0 until end of turn and is unblockable this turn. -- Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) mana={U} type=Sorcery @@ -35600,7 +35604,8 @@ auto=choice name(red) transforms((,newability[protection from red])) ueot auto=choice name(blue) transforms((,newability[protection from blue])) ueot auto=choice name(black) transforms((,newability[protection from black])) ueot auto=choice name(white) transforms((,newability[protection from white])) ueot -auto=if rebound then moveto(exile) all(this) and!( transforms((,newability[@rebounded:may activate castcard(normal)])) forever )! +auto=if rebound then moveto(exile) +autoexile=@rebounded:may activate castcard(normal) text=Target creature you control gains protection from the color of your choice until end of turn. -- Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) mana={W} type=Instant @@ -50088,7 +50093,8 @@ toughness=3 [card] name=Great Teacher's Decree auto=all(creature|mybattlefield) 2/1 ueot -auto=if rebound then moveto(exile) all(this) and!( transforms((,newability[@rebounded:may activate castcard(normal)])) forever )! +auto=if rebound then moveto(exile) +autoexile=@rebounded:may activate castcard(normal) text=Creatures you control get +2/+1 until end of turn. -- Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) mana={3}{W} type=Sorcery @@ -80944,7 +80950,8 @@ toughness=2 [card] name=Nomads' Assembly auto=token(Kor Soldier,Creature Kor Soldier,1/1,white)*type:creature:mybattlefield -auto=if rebound then moveto(exile) all(this) and!( transforms((,newability[@rebounded:may activate castcard(normal)])) forever )! +auto=if rebound then moveto(exile) +autoexile=@rebounded:may activate castcard(normal) text=Put a 1/1 white Kor Soldier creature token onto the battlefield for each creature you control. -- Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) mana={4}{W}{W} type=Sorcery @@ -82327,7 +82334,8 @@ toughness=6 name=Ojutai's Breath target=creature auto=freeze -auto=if rebound then moveto(exile) all(this) and!( transforms((,newability[@rebounded:may activate castcard(normal)])) forever )! +auto=if rebound then moveto(exile) +autoexile=@rebounded:may activate castcard(normal) text=Tap target creature. It doesn't untap during its controller's next untap step. -- Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) mana={2}{U} type=Instant @@ -82335,7 +82343,8 @@ type=Instant [card] name=Ojutai's Summons auto=create(Djinn Monk:Creature Djinn Monk:2/2:flying:blue) -auto=if rebound then moveto(exile) all(this) and!( transforms((,newability[@rebounded:may activate castcard(normal)])) forever )! +auto=if rebound then moveto(exile) +autoexile=@rebounded:may activate castcard(normal) text=Put a 2/2 blue Djinn Monk creature token with flying onto the battlefield. -- Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) mana={3}{U}{U} type=Sorcery @@ -88605,7 +88614,8 @@ type=Sorcery name=Prey's Vengeance target=creature auto=2/2 -auto=if rebound then moveto(exile) all(this) and!( transforms((,newability[@rebounded:may activate castcard(normal)])) forever )! +auto=if rebound then moveto(exile) +autoexile=@rebounded:may activate castcard(normal) text=Target creature gets +2/+2 until end of turn. -- Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) mana={G} type=Instant @@ -89341,7 +89351,8 @@ type=Sorcery name=Profound Journey target=*[-instant;-sorcery]|mygraveyard auto=moveto(ownerbattlefield) -auto=if rebound then moveto(exile) all(this) and!( transforms((,newability[@rebounded:may activate castcard(normal)])) forever )! +auto=if rebound then moveto(exile) +autoexile=@rebounded:may activate castcard(normal) text=Return target permanent card from your graveyard to the battlefield. -- Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) mana={5}{W}{W} type=Sorcery @@ -93549,7 +93560,8 @@ type=Instant name=Recurring Insight target=opponent auto=draw:type:*:targetedpersonshand controller -auto=if rebound then moveto(exile) all(this) and!( transforms((,newability[@rebounded:may activate castcard(normal)])) forever )! +auto=if rebound then moveto(exile) +autoexile=@rebounded:may activate castcard(normal) text=Draw cards equal to the number of cards in target opponent's hand. -- Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) mana={4}{U}{U} type=Sorcery @@ -105487,7 +105499,8 @@ name=Sight Beyond Sight abilities=hiddenface aicode=activate transforms((,newability[moveto(myhand) all(*[zpos=1]|mylibrary) && bottomoflibrary all(*[zpos=2]|mylibrary)])) ueot auto=name(look) reveal:2 optionone name(Get a card) target(<1>*|reveal) moveto(myhand) optiononeend optiontwo name(put on bottom) target(<2>*|reveal) bottomoflibrary optiontwoend revealend -auto=if rebound then moveto(exile) all(this) and!( transforms((,newability[@rebounded:may activate castcard(normal)])) forever )! +auto=if rebound then moveto(exile) +autoexile=@rebounded:may activate castcard(normal) text=Look at the top two cards of your library. Put one of them into your hand and the other on the bottom of your library. -- Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) mana={3}{U} type=Sorcery @@ -112865,7 +112878,8 @@ toughness=0 name=Staggershock target=creature,player auto=damage:2 -auto=if rebound then moveto(exile) all(this) and!( transforms((,newability[@rebounded:may activate castcard(normal)])) forever )! +auto=if rebound then moveto(exile) +autoexile=@rebounded:may activate castcard(normal) text=Staggershock deals 2 damage to target creature or player. -- Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) mana={2}{R} type=Instant @@ -116556,7 +116570,8 @@ toughness=1 [card] name=Surreal Memoir auto=moverandom(instant) from(mygraveyard) to(myhand) -auto=if rebound then moveto(exile) all(this) and!( transforms((,newability[@rebounded:may activate castcard(normal)])) forever )! +auto=if rebound then moveto(exile) +autoexile=@rebounded:may activate castcard(normal) text=Return an instant card at random from your graveyard to your hand. -- Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) mana={3}{R} type=Sorcery @@ -116584,7 +116599,8 @@ type=Sorcery name=Survival Cache auto=life:2 controller auto=if compare(lifetotal)~morethan~compare(opponentlifetotal) then draw:1 controller -auto=if rebound then moveto(exile) all(this) and!( transforms((,newability[@rebounded:may activate castcard(normal)])) forever )! +auto=if rebound then moveto(exile) +autoexile=@rebounded:may activate castcard(normal) text=You gain 2 life. Then if you have more life than an opponent, draw a card. -- Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) mana={2}{W} type=Sorcery @@ -117610,7 +117626,8 @@ name=Taigam's Strike target=creature auto=2/0 ueot auto=unblockable ueot -auto=if rebound then moveto(exile) all(this) and!( transforms((,newability[@rebounded:may activate castcard(normal)])) forever )! +auto=if rebound then moveto(exile) +autoexile=@rebounded:may activate castcard(normal) text=Target creature gets +2/+0 until end of turn and can't be blocked this turn. -- Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) mana={3}{U} type=Sorcery @@ -129911,7 +129928,8 @@ name=Virulent Swipe target=creature auto=2/0 ueot auto=deathtouch ueot -auto=if rebound then moveto(exile) all(this) and!( transforms((,newability[@rebounded:may activate castcard(normal)])) forever )! +auto=if rebound then moveto(exile) +autoexile=@rebounded:may activate castcard(normal) text=Target creature gets +2/+0 and gains deathtouch until end of turn. -- Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) mana={B} type=Instant @@ -130493,7 +130511,8 @@ type=Sorcery name=Void Squall target=*[-land] auto=moveto(ownerhand) -auto=if rebound then moveto(exile) all(this) and!( transforms((,newability[@rebounded:may activate castcard(normal)])) forever )! +auto=if rebound then moveto(exile) +autoexile=@rebounded:may activate castcard(normal) text=Return target nonland permanent to its owner's hand. -- Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) mana={4}{U} type=Sorcery @@ -136122,7 +136141,8 @@ toughness=2 name=World at War auto=nextphasealter(add,combatphaseswithmain,controller,after) auto=untap all(creature[attacking]) -auto=if rebound then moveto(exile) all(this) and!( transforms((,newability[@rebounded:may activate castcard(normal)])) forever )! +auto=if rebound then moveto(exile) +autoexile=@rebounded:may activate castcard(normal) text=After the first postcombat main phase this turn, there's an additional combat phase followed by an additional main phase. At the beginning of that combat, untap all creatures that attacked this turn. -- Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) mana={3}{R}{R} type=Sorcery diff --git a/projects/mtg/bin/Res/sets/primitives/unsupported.txt b/projects/mtg/bin/Res/sets/primitives/unsupported.txt index 8976cb9d2..5ae6d038c 100644 --- a/projects/mtg/bin/Res/sets/primitives/unsupported.txt +++ b/projects/mtg/bin/Res/sets/primitives/unsupported.txt @@ -2,7 +2,7 @@ grade=unsupported #The cards in this file are not implemented/incomplete yet. #Updated Card lists not in primitives (Borderline, Crappy, Unsupported and Missing Cards up to Aether Revolt) as of 3/14/2017 #Please keep these card alphabetized, and try to have the "name=" line at the top of each card -#I sorted this programatically so the other comments are removed except for AUTO_DEFINE - Vitty85 09-05-2020 +#I sorted this programatically - Vitty85 09-06-2020 [card] name="Ach! Hans, Run!" text=At the beginning of your upkeep, you may say "Ach Hans, run It's the . . ." and name a creature card. If you do, search your library for the named card, put it into play, then shuffle your library. That creature has haste. Remove it from the game at end of turn. @@ -43,12 +43,6 @@ power=6 toughness=4 [/card] [card] -name=AEther Tide -text=As an additional cost to cast AEther Tide, discard X creature cards. -- Return X target creatures to their owners' hands. -mana={X}{U} -type=Sorcery -[/card] -[card] name=AEtherplasm text=Whenever AEtherplasm blocks a creature, you may return AEtherplasm to its owner's hand. If you do, you may put a creature card from your hand onto the battlefield blocking that creature. mana={2}{U}{U} @@ -70,12 +64,6 @@ mana={2}{W} type=Instant [/card] [card] -name=Abandon Hope -text=As an additional cost to cast Abandon Hope, discard X cards. -- Look at target opponent's hand and choose X cards from it. That player discards those cards. -mana={X}{1}{B} -type=Sorcery -[/card] -[card] name=Abandoned Sarcophagus text=You may cast spells that have cycling from your graveyard. -- If a card with cycling would be put into your graveyard from anywhere and it wasn't cycled, exile it instead. mana={3} @@ -100,21 +88,6 @@ power=1 toughness=1 [/card] [card] -name=Abu Ja'far -text=When Abu Ja'far dies, destroy all creatures blocking or blocked by it. They can't be regenerated. -mana={W} -type=Creature -subtype=Human -power=0 -toughness=1 -[/card] -[card] -name=Abuna's Chant -text=Choose one — You gain 5 life; or prevent the next 5 damage that would be dealt to target creature this turn. -- Entwine {2} (Choose both if you pay the entwine cost.) -mana={3}{W} -type=Instant -[/card] -[card] name=Academy at Tolaria West text=At the beginning of your end step, if you have no cards in hand, draw seven cards. -- Whenever you roll {C}, discard your hand. type=Plane @@ -157,21 +130,6 @@ power=3 toughness=3 [/card] [card] -name=Act of Authority -text=When Act of Authority enters the battlefield, you may exile target artifact or enchantment. -- At the beginning of your upkeep, you may exile target artifact or enchantment. If you do, its controller gains control of Act of Authority. -mana={1}{W}{W} -type=Enchantment -[/card] -[card] -name=Adarkar Unicorn -text={T}: Add {U} or {1}{U} to your mana pool. Spend this mana only to pay cumulative upkeep costs. -mana={1}{W}{W} -type=Creature -subtype=Unicorn -power=2 -toughness=2 -[/card] -[card] name=Adder-Staff Boggart text=When Adder-Staff Boggart enters the battlefield, clash with an opponent. If you win, put a +1/+1 counter on Adder-Staff Boggart. (Each clashing player reveals the top card of his or her library, then puts that card on the top or bottom. A player wins if his or her card had a higher converted mana cost.) mana={1}{R} @@ -232,24 +190,12 @@ power=3 toughness=2 [/card] [card] -name=Aerial Volley -text=Aerial Volley deals 3 damage divided as you choose among one, two, or three target creatures with flying. -mana={G} -type=Instant -[/card] -[card] name=Aesthetic Consultation text=Name an artist. Remove the top six cards of your library from the game, then reveal cards from the top of your library until you reveal a card by the named artist. Put that card in your hand, then remove all the other cards revealed this way from the game. mana={B} type=Instant [/card] [card] -name=Aether Gust -text=Choose target spell or permanent that's red or green. Its owner puts it on the top or bottom of their library. -mana={1}{U} -type=Instant -[/card] -[card] name=Aetherborn Marauder abilities=flying,lifelink text=Flying, lifelink -- When Aetherborn Marauder enters the battlefield, move any number of +1/+1 counters from other permanents you control onto Aetherborn Marauder. @@ -260,16 +206,6 @@ power=2 toughness=2 [/card] [card] -name=Aetherstorm Roc -abilities=flying -text=Flying -- Whenever Aetherstorm Roc or another creature enters the battlefield under your control, you get {E} (an energy counter). -- Whenever Aetherstorm Roc attacks, you may pay {E}{E}. If you do, put a +1/+1 counter on it and tap up to one target creature defending player controls. -mana={2}{W}{W} -type=Creature -subtype=Bird -power=3 -toughness=3 -[/card] -[card] name=Agent of Acquisitions text=Draft Agent of Acquisitions face up. -- Instead of drafting a card from a booster pack, you may draft each card in that booster pack, one at a time. If you do, turn Agent of Acquisitions face down and you can't draft cards for the rest of this draft round. (You may look at booster packs passed to you.) mana={2} @@ -292,18 +228,6 @@ type=Plane subtype=Ravnica [/card] [card] -name=Aid from the Cowl -text=Revolt — At the beginning of your end step, if a permanent you controlled left the battlefield this turn, reveal the top card of your library. If it's a permanent card, you may put it onto the battlefield. Otherwise, you may put it on the bottom of your library. -mana={3}{G}{G} -type=Enchantment -[/card] -[card] -name=Ajani's Aid -text=When Ajani's Aid enters the battlefield, you may search your library and/or graveyard for a card named Ajani, Valiant Protector, reveal it, and put it into your hand. If you search your library this way, shuffle it. -- Sacrifice Ajani's Aid: Prevent all combat damage a creature of your choice would deal this turn. -mana={2}{G}{W} -type=Enchantment -[/card] -[card] name=Ajani's Chosen text=Whenever an enchantment enters the battlefield under your control, put a 2/2 white Cat creature token onto the battlefield. If that enchantment is an Aura, you may attach it to the token. mana={2}{W}{W} @@ -319,21 +243,6 @@ mana={W} type=Instant [/card] [card] -name=Ajani, Mentor of Heroes -auto=counter(0/0,4,loyalty) -text=+1: Distribute three +1/+1 counters among one, two, or three target creatures you control. -- +1: Look at the top four cards of your library. You may reveal an Aura, creature, or planeswalker card from among them and put it into your hand. Put the rest on the bottom of your library in any order. -- -8: You gain 100 life. -mana={3}{G}{W} -type=Planeswalker -subtype=Ajani -[/card] -[card] -name=Ajani, Strength of the Pride -text=+1: You gain life equal to the number of creatures you control plus the number of planeswalkers you control. -- -2: Create a 2/2 white Cat Soldier creature token named Ajani's Pridemate with "Whenever you gain life, put a +1/+1 counter on Ajani's Pridemate." -- 0: If you have at least 15 life more than your starting life total, exile Ajani, Strength of the Pride and each artifact and creature your opponents control. -mana={2}{W}{W} -type=Legendary Planeswalker -subtype=Ajani -[/card] -[card] name=Akki Lavarunner text=Haste -- Whenever Akki Lavarunner deals damage to an opponent, flip it. -- -- ——— -- -- Tok-Tok, Volcano Born -- Legendary Creature — Goblin Shaman -- -- Protection from red -- If a red source would deal damage to a player, it deals that much damage plus 1 to that player instead. -- 2/2 mana={3}{R} @@ -358,12 +267,6 @@ power=0 toughness=4 [/card] [card] -name=Alhammarret's Archive -text=If you would gain life, you gain twice that much life instead. -- If you would draw a card except the first one you draw in each of your draw steps, draw two cards instead. -mana={5} -type=Legendary Artifact -[/card] -[card] name=Alhammarret, High Arbiter abilities=flying text=Flying -- As Alhammarret, High Arbiter enters the battlefield, each opponent reveals his or her hand. You choose the name of a nonland card revealed this way. -- Your opponents can't cast spells with the chosen name (as long as this creature is on the battlefield). @@ -374,12 +277,6 @@ power=5 toughness=5 [/card] [card] -name=Alive // Well -text=Put a 3/3 green Centaur creature token onto the battlefield. -- // -- You gain 2 life for each creature you control. -- -- Fuse (You may cast one or both halves of this card from your hand.) -mana={3}{G} // {W} -type=Sorcery // Sorcery -[/card] -[card] name=All Shall Smolder in My Wake text=When you set this scheme in motion, destroy up to one target artifact, up to one target enchantment, and up to one target nonbasic land. type=Scheme @@ -402,36 +299,12 @@ mana={3}{B}{R} type=Sorcery [/card] [card] -name=Ally Encampment -text={T}: Add {C} to your mana pool. -- {T}: Add one mana of any color to your mana pool. Spend this mana only to cast an Ally spell. -- {1}, {T}, Sacrifice Ally Encampment: Return target Ally you control to its owner's hand. -type=Land -[/card] -[card] -name=Alms -text={1}, Exile the top card of your graveyard: Prevent the next 1 damage that would be dealt to target creature this turn. -mana={W} -type=Enchantment -[/card] -[card] name=Alpha Brawl text=Target creature an opponent controls deals damage equal to its power to each other creature that player controls, then each of those creatures deals damage equal to its power to that creature. mana={6}{R}{R} type=Sorcery [/card] [card] -name=Alpha Status -text=Enchant creature -- Enchanted creature gets +2/+2 for each other creature on the battlefield that shares a creature type with it. -mana={2}{G} -type=Enchantment -subtype=Aura -[/card] -[card] -name=Altar of the Lost -text=Altar of the Lost enters the battlefield tapped. -- {T}: Add two mana in any combination of colors to your mana pool. Spend this mana only to cast spells with flashback from a graveyard. -mana={3} -type=Artifact -[/card] -[card] name=Altar of the Pantheon text=Your devotion to each color and each combination of colors is increased by one. -- {T}: Add one mana of any color. If you control a God, a Demigod, or a legendary enchantment, you gain 1 life. mana={3} @@ -444,15 +317,6 @@ mana={1}{U} type=Instant [/card] [card] -name=Amateur Auteur -text=Sacrifice Amateur Auteur: Destroy target enchantment. -mana={1}{W} -type=Creature -subtype=Human -power=2 -toughness=2 -[/card] -[card] name=Ambiguity text=Whenever a player plays a spell that counters a spell that has been played or a player plays a spell that comes into play with counters, that player may counter the next spell played or put an additional counter on a permanent that has already been played, but not countered. mana={2}{U}{U} @@ -483,21 +347,6 @@ power=3 toughness=3 [/card] [card] -name=Ancient Ziggurat -text={T}: Add one mana of any color to your mana pool. Spend this mana only to cast a creature spell. -type=Land -[/card] -[card] -name=Angel of Salvation -abilities=flash,convoke -text=Flash; convoke (Each creature you tap while casting this spell reduces its cost by {1} or by one mana of that creature's color.) -- Flying -- When Angel of Salvation enters the battlefield, prevent the next 5 damage that would be dealt this turn to any number of target creatures and/or players, divided as you choose. -mana={6}{W}{W} -type=Creature -subtype=Angel -power=5 -toughness=5 -[/card] -[card] name=Angel's Grace text=Split second (As long as this spell is on the stack, players can't cast spells or activate abilities that aren't mana abilities.) -- You can't lose the game this turn and your opponents can't win the game this turn. Until end of turn, damage that would reduce your life total to less than 1 reduces it to 1 instead. mana={W} @@ -520,15 +369,6 @@ power=3 toughness=3 [/card] [card] -name=Angelic Rocket -text=Flying -- When this creature enters the battlefield, you may destroy target nonland permanent. -mana={8} -type=Host Artifact Creature -subtype=Angel -power=4 -toughness=4 -[/card] -[card] name=Animal Magnetism text=Reveal the top five cards of your library. An opponent chooses a creature card from among them. Put that card onto the battlefield and the rest into your graveyard. mana={4}{G} @@ -543,6 +383,7 @@ subtype=Aura [/card] [card] name=Animation Module +auto=@counter(1/1,1) target(*|myBattlefield):pay({1}) create(Servo:Artifact Creature Servo:1/1) text=Whenever one or more +1/+1 counters are placed on a permanent you control, you may pay {1}. If you do, create a 1/1 colorless Servo artifact creature token. -- {3}, {T}: Choose a counter on target permanent or player. Give that permanent or player another counter of that kind. mana={1} type=Artifact @@ -557,28 +398,6 @@ power=4 toughness=4 [/card] [card] -name=Anje Falkenrath -text=Haste -- {T}, Discard a card: Draw a card. -- Whenever you discard a card, if it has madness, untap Anje Falkenrath. -mana={1}{B}{R} -type=Legendary Creature -subtype=Vampire -power=1 -toughness=3 -[/card] -[card] -name=Anthem of Rakdos -text=Whenever a creature you control attacks, it gets +2/+0 until end of turn and Anthem of Rakdos deals 1 damage to you. -- Hellbent — As long as you have no cards in hand, if a source you control would deal damage to a creature or player, it deals double that damage to that creature or player instead. -mana={2}{B}{R}{R} -type=Enchantment -[/card] -[card] -name=Anti-Magic Aura -text=Enchant creature -- Enchanted creature can't be the target of spells and can't be enchanted. This effect doesn't remove Anti-Magic Aura. -mana={2}{U} -type=Enchantment -subtype=Aura -[/card] -[card] name=Anurid Swarmsnapper abilities=reach text=Reach (This creature can block creatures with flying.) -- {1}{G}: Anurid Swarmsnapper can block an additional creature this turn. @@ -608,7 +427,7 @@ toughness=3 [/card] [card] name=Apocalypse Chime -text={2}, {T}, Sacrifice Apocalypse Chime: Destroy all nontoken permanents from the Homelands expansion. They can't be regenerated. +text={2},{T}, Sacrifice Apocalypse Chime: Destroy all nontoken permanents from the Homelands expansion. They can't be regenerated. mana={2} type=Artifact [/card] @@ -624,27 +443,12 @@ text=When you set this scheme in motion, until your next turn, if a source would type=Scheme [/card] [card] -name=Arachnus Spinner -abilities=reach -text=Reach (This creature can block creatures with flying.) -- Tap an untapped Spider you control: Search your graveyard and/or library for a card named Arachnus Web and put it onto the battlefield attached to target creature. If you search your library this way, shuffle it. -mana={5}{G} -type=Creature -subtype=Spider -power=5 -toughness=7 -[/card] -[card] name=Arc Blade text=Arc Blade deals 2 damage to target creature or player. Exile Arc Blade with three time counters on it. -- Suspend 3—{2}{R} (Rather than cast this card from your hand, you may pay {2}{R} and exile it with three time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.) mana={3}{R}{R} type=Sorcery [/card] [card] -name=Arcane Lighthouse -text={T}: Add {C} to your mana pool. -- {1}, {T}: Until end of turn, creatures your opponents control lose hexproof and shroud and can't have hexproof or shroud. -type=Land -[/card] -[card] name=Arcane Savant text=Before you shuffle your deck to start the game, you may reveal this card from your deck and exile an instant or sorcery card you drafted that isn't in your deck. -- When Arcane Savant enters the battlefield, copy a card you exiled with cards named Arcane Savant. You may cast the copy without paying its mana cost. mana={3}{U}{U} @@ -667,16 +471,6 @@ type=Enchantment subtype=Aura [/card] [card] -name=Archangel of Strife -abilities=flying -text=Flying -- As Archangel of Strife enters the battlefield, each player chooses war or peace. -- Creatures controlled by players who chose war get +3/+0. -- Creatures controlled by players who chose peace get +0/+3. -mana={5}{W}{W} -type=Creature -subtype=Angel -power=6 -toughness=6 -[/card] -[card] name=Archdemon of Paliano text=Draft Archdemon of Paliano face up. -- As long as Archdemon of Paliano is face up during the draft, you can't look at booster packs and must draft cards at random. After you draft three cards this way, turn Archdemon of Paliano face down. (You may look at cards as you draft them.) -- Flying mana={2}{B}{B} @@ -703,12 +497,6 @@ type=Instant subtype=Trap [/card] [card] -name=Arcum's Weathervane -text={2}, {T}: Target snow land is no longer snow. -- {2}, {T}: Target nonsnow basic land becomes snow. -mana={2} -type=Artifact -[/card] -[card] name=Arcum's Whistle text={3}, {T}: Choose target non-Wall creature the active player has controlled continuously since the beginning of the turn. That player may pay {X}, where X is that creature's converted mana cost. If he or she doesn't, the creature attacks this turn if able, and at the beginning of the next end step, destroy it if it didn't attack. Activate this ability only before attackers are declared. mana={3} @@ -736,18 +524,6 @@ power=6 toughness=6 [/card] [card] -name=Aria of Flame -text=When Aria of Flame enters the battlefield, each opponent gains 10 life. -- Whenever you cast an instant or sorcery spell, put a verse counter on Aria of Flame, then it deals damage equal to the number of verse counters on it to target player or planeswalker. -mana={2}{R} -type=Enchantment -[/card] -[card] -name=Armed // Dangerous -text=Target creature gets +1/+1 and gains double strike until end of turn. -- // -- All creatures able to block target creature this turn do so. -- -- Fuse (You may cast one or both halves of this card from your hand.) -mana={1}{R} // {3}{G} -type=Sorcery // Sorcery -[/card] -[card] name=Armor of Thorns text=You may cast Armor of Thorns as though it had flash. If you cast it any time a sorcery couldn't have been cast, the controller of the permanent it becomes sacrifices it at the beginning of the next cleanup step. -- Enchant nonblack creature -- Enchanted creature gets +2/+2. mana={1}{G} @@ -761,19 +537,6 @@ type=Artifact subtype=Contraption [/card] [card] -name=Arrow Storm -text=Arrow Storm deals 4 damage to target creature or player. -- Raid — If you attacked with a creature this turn, instead Arrow Storm deals 5 damage to that creature or player and the damage can't be prevented. -mana={3}{R}{R} -type=Sorcery -[/card] -[card] -name=Arrow Volley Trap -text=If four or more creatures are attacking, you may pay {1}{W} rather than pay Arrow Volley Trap's mana cost. -- Arrow Volley Trap deals 5 damage divided as you choose among any number of target attacking creatures. -mana={3}{W}{W} -type=Instant -subtype=Trap -[/card] -[card] name=Artful Looter text={T}: Draw a card, then discard a card. -- Whenever a permanent comes into play that shares an artist with another permanent you control, untap Artful Looter. mana={2}{U} @@ -847,12 +610,6 @@ mana={1}{W}{B} type=Sorcery [/card] [card] -name=Assault // Battery -text=Assault deals 2 damage to target creature or player. -- // -- Put a 3/3 green Elephant creature token onto the battlefield. -mana={R} // {3}{G} -type=Sorcery // Sorcery -[/card] -[card] name=Assault Suit text=Equipped creature gets +2/+2, has haste, can't attack you or a planeswalker you control, and can't be sacrificed. -- At the beginning of each opponent's upkeep, you may have that player gain control of equipped creature until end of turn. If you do, untap it. -- Equip {3} mana={4} @@ -933,24 +690,6 @@ mana={X}{R}{W} type=Instant [/card] [card] -name=Auriok Siege Sled -text={1}: Target artifact creature blocks Auriok Siege Sled this turn if able. -- {1}: Target artifact creature can't block Auriok Siege Sled this turn. -mana={6} -type=Artifact Creature -subtype=Juggernaut -power=3 -toughness=5 -[/card] -[card] -name=Auriok Steelshaper -text=Equip costs you pay cost {1} less. -- As long as Auriok Steelshaper is equipped, Soldier and/or Knight creatures you control get +1/+1. -mana={1}{W} -type=Creature -subtype=Human Soldier -power=1 -toughness=1 -[/card] -[card] name=Auto-Key text=Whenever you crank Auto-Key, until end of turn, target creature becomes an artifact in addition to its other types and gains " {T}: You gain 3 life." type=Artifact @@ -969,16 +708,9 @@ mana={1}{R} type=Sorcery [/card] [card] -name=Avalanche Tusker -text=Whenever Avalanche Tusker attacks, target creature defending player controls blocks it this combat if able. -mana={2}{G}{U}{R} -type=Creature -subtype=Elephant Warrior -power=6 -toughness=4 -[/card] -[card] name=Avatar of Hope +abilities=flying +anyzone=while(controllerlife < 4) changecost(colorless:-6) text=If you have 3 or less life, Avatar of Hope costs {6} less to cast. -- Flying -- Avatar of Hope can block any number of creatures. mana={6}{W}{W} type=Creature @@ -1036,12 +768,6 @@ power=3 toughness=3 [/card] [card] -name=Avoid Fate -text=Counter target instant or Aura spell that targets a permanent you control. -mana={G} -type=Instant -[/card] -[card] name=Awe Strike text=The next time target creature would deal damage this turn, prevent that damage. You gain life equal to the damage prevented this way. mana={W} @@ -1130,12 +856,6 @@ power=3{1/2} toughness=1 [/card] [card] -name=Baffling End -text=When Baffling End enters the battlefield, exile target creature an opponent controls with converted mana cost {3} or less. -- When Baffling End leaves the battlefield, target opponent creates a 3/3 green Dinosaur creature token with trample. -mana={1}{W} -type=Enchantment -[/card] -[card] name=Bag of Holding text=Whenever you discard a card, exile that card from your graveyard. {2}, {T}: Draw a card, then discard a card. -- {4}, {T}, Sacrifice Bag of Holding: Return all cards exiled with Bag of Holding to their owner's hand. mana={1} @@ -1187,12 +907,6 @@ power=0 toughness=3 [/card] [card] -name=Banefire -text=Banefire deals X damage to target creature or player. -- If X is 5 or more, Banefire can't be countered by spells or abilities and the damage can't be prevented. -mana={X}{R} -type=Sorcery -[/card] -[card] name=Banshee of the Dread Choir text=Myriad (Whenever this creature attacks, for each opponent other than defending player, you may put a token that's a copy of this creature onto the battlefield tapped and attacking that player or a planeswalker he or she controls. Exile the tokens at end of combat.) -- Whenever Banshee of the Dread Choir deals combat damage to a player, that player discards a card. mana={3}{B}{B} @@ -1220,27 +934,6 @@ power=2 toughness=2 [/card] [card] -name=Barbed Lightning -text=Choose one — Barbed Lightning deals 3 damage to target creature; or Barbed Lightning deals 3 damage to target player. -- Entwine {2} (Choose both if you pay the entwine cost.) -mana={2}{R} -type=Instant -[/card] -[card] -name=Barbed Wire -text=At the beginning of each player's upkeep, Barbed Wire deals 1 damage to that player. -- -- {2}: Prevent the next 1 damage that would be dealt by Barbed Wire this turn. -mana={3} -type=Artifact -[/card] -[card] -name=Barbed-Back Wurm -text={B}: Target green creature blocking Barbed-Back Wurm gets -1/-1 until end of turn. -mana={4}{B} -type=Creature -subtype=Wurm -power=4 -toughness=3 -[/card] -[card] name=Baron Von Count text=Baron Von Count enters the battlefield with a doom counter on "5." -- Whenever you cast a spell with the indicated numeral in its mana cost, text box, power, or toughness, move the doom counter one numeral to the left. -- When the doom counter moves from "1," destroy target player and put that doom counter on "5." mana={1}{B}{R} @@ -1257,27 +950,12 @@ type=Instant subtype=Arcane [/card] [card] -name=Barrin's Spite -text=Choose two target creatures controlled by the same player. Their controller chooses and sacrifices one of them. Return the other to its owner's hand. -mana={2}{U}{B} -type=Sorcery -[/card] -[card] name=Barrin's Unmaking text=Return target permanent to its owner's hand if that permanent shares a color with the most common color among all permanents or a color tied for most common. mana={1}{U} type=Instant [/card] [card] -name=Bastion Protector -text=Commander creatures you control get +2/+2 and have indestructible. -mana={2}{W} -type=Creature -subtype=Human Soldier -power=3 -toughness=3 -[/card] -[card] name=Bat- text=Flying -- At the beginning of each end step, if an opponent lost 3 or more life this turn, -- Augment {1}{B} ({1}{B}, Reveal this card from your hand: Combine it with target host. Augment only as a sorcery.) type=Creature @@ -1301,39 +979,6 @@ power=1 toughness=1 [/card] [card] -name=Battle at the Bridge -text=Improvise (Your artifacts can help cast this spell. Each artifact you tap after you're done activating mana abilities pays for {1}.) -- Target creature gets -X/-X until end of turn. You gain X life. -mana={X}{B} -type=Sorcery -[/card] -[card] -name=Battlefield Scrounger -text=Threshold — Put three cards from your graveyard on the bottom of your library: Battlefield Scrounger gets +3/+3 until end of turn. Activate this ability only once each turn, and only if seven or more cards are in your graveyard. -mana={3}{G}{G} -type=Creature -subtype=Centaur -power=3 -toughness=3 -[/card] -[card] -name=Battlefield Thaumaturge -text=Each instant and sorcery spell you cast costs {1} less to cast for each creature it targets. -- Heroic — Whenever you cast a spell that targets Battlefield Thaumaturge, Battlefield Thaumaturge gains hexproof until end of turn. -mana={1}{U} -type=Creature -subtype=Human Wizard -power=2 -toughness=1 -[/card] -[card] -name=Battletide Alchemist -text=If a source would deal damage to a player, you may prevent X of that damage, where X is the number of Clerics you control. -mana={3}{W}{W} -type=Creature -subtype=Kithkin Cleric -power=3 -toughness=4 -[/card] -[card] name=Bazaar of Wonders text=When Bazaar of Wonders enters the battlefield, exile all cards from all graveyards. -- Whenever a player casts a spell, counter it if a card with the same name is in a graveyard or a nontoken permanent with the same name is on the battlefield. mana={3}{U}{U} @@ -1341,6 +986,7 @@ type=World Enchantment [/card] [card] name=Beacon of Destiny +auto=@damaged(player) from(*|opponentbattlefield,opponentstack,opponentgraveyard,opponentlibrary,opponentexile]):{T}:prevent:thatmuch controller && damage:thatmuch target(this) text={T}: The next time a source of your choice would deal damage to you this turn, that damage is dealt to Beacon of Destiny instead. mana={1}{W} type=Creature @@ -1358,30 +1004,6 @@ power=2 toughness=2 [/card] [card] -name=Beast in Show -text=Trample -mana={4}{G}{G} -type=Creature -subtype=Beast -power=6 -toughness=4 -[/card] -[card] -name=Beastcaller Savant -text=Haste -- {T}: Add one mana of any color to your mana pool. Spend this mana only to cast a creature spell. -mana={1}{G} -type=Creature -subtype=Elf Shaman Ally -power=1 -toughness=1 -[/card] -[card] -name=Beck // Call -text=Whenever a creature enters the battlefield this turn, you may draw a card. -- // -- Put four 1/1 white Bird creature tokens with flying onto the battlefield. -- -- Fuse (You may cast one or both halves of this card from your hand.) -mana={G}{U} // {4}{W}{U} -type=Sorcery // Sorcery -[/card] -[card] name=Bee-Bee Gun text=Whenever you crank Bee-Bee Gun, until end of turn, target creature gains "{2} : This creature fights another target creature." type=Artifact @@ -1423,15 +1045,6 @@ power=1 toughness=3 [/card] [card] -name=Benalish Missionary -text={1}{W}, {T}: Prevent all combat damage that would be dealt by target blocked creature this turn. -mana={W} -type=Creature -subtype=Human Cleric -power=1 -toughness=1 -[/card] -[card] name=Bend or Break text=Each player separates all nontoken lands he or she controls into two piles. For each player, one of his or her piles is chosen by one of his or her opponents of his or her choice. Destroy all lands in the chosen piles. Tap all lands in the other piles. mana={3}{R} @@ -1453,18 +1066,6 @@ power=1 toughness=2 [/card] [card] -name=Besmirch -text=Until end of turn, gain control of target creature and it gains haste. Untap and goad that creature. (Until your next turn, that creature attacks each combat if able and attacks a player other than you if able.) -mana={1}{R}{R} -type=Sorcery -[/card] -[card] -name=Betrayal of Flesh -text=Choose one — Destroy target creature; or return target creature card from your graveyard to the battlefield. -- Entwine—Sacrifice three lands. (Choose both if you pay the entwine cost.) -mana={5}{B} -type=Instant -[/card] -[card] name=Better Than One text=A person outside the game becomes your teammate. (Choose any number of cards in your hand, on top of your library, or on the battlefield under your control. Those cards become your teammate's hand, library, and permanents, respectively.) mana={G}{W} @@ -1559,13 +1160,6 @@ mana={R} type=Instant [/card] [card] -name=Blazing Torch -text=Equipped creature can't be blocked by Vampires or Zombies. -- Equipped creature has "{T}, Sacrifice Blazing Torch: Blazing Torch deals 2 damage to target creature or player." -- Equip {1} ({1}: Attach to target creature you control. Equip only as a sorcery.) -mana={1} -type=Artifact -subtype=Equipment -[/card] -[card] name=Blessed Breath text=Target creature you control gains protection from the color of your choice until end of turn. -- Splice onto Arcane {W} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) mana={W} @@ -1599,12 +1193,6 @@ power=2 toughness=2 [/card] [card] -name=Blinding Beam -text=Choose one — Tap two target creatures; or creatures don't untap during target player's next untap step. -- Entwine {1} (Choose both if you pay the entwine cost.) -mana={2}{W} -type=Instant -[/card] -[card] name=Blinding Flare text=Strive — Blinding Flare costs {R} more to cast for each target beyond the first. -- Any number of target creatures can't block this turn. mana={R} @@ -1645,6 +1233,8 @@ toughness=3 [/card] [card] name=Bloodthirsty Blade +auto=teach(creature) 2/0 +auto=teach(creature) mustattack text=Equipped creature gets +2/+0 and is goaded. (It attacks each combat if able and attacks a player other than you if able.) -- {1}: Attach Bloodthirsty Blade to target creature an opponent controls. Activate this ability only any time you could cast a sorcery. mana={2} type=Artifact @@ -1684,12 +1274,6 @@ power=1 toughness=1 [/card] [card] -name=Bond of Agony -text=As an additional cost to cast Bond of Agony, pay X life. -- Each other player loses X life. -mana={X}{B} -type=Sorcery -[/card] -[card] name=Bone Dancer text=Whenever Bone Dancer attacks and isn't blocked, you may put the top creature card of defending player's graveyard onto the battlefield under your control. If you do, Bone Dancer assigns no combat damage this turn. mana={1}{B}{B} @@ -1741,12 +1325,6 @@ mana={1}{R} type=Sorcery [/card] [card] -name=Boom // Bust -text=Destroy target land you control and target land you don't control. -- // -- Destroy all lands. -mana={1}{R} // {5}{R} -type=Sorcery // Sorcery -[/card] -[card] name=Boomflinger text=Whenever you crank Boomflinger, roll two six-sided dice. Boomflinger deals damage to target player or planeswalker equal to the difference between those results. type=Artifact @@ -1762,12 +1340,6 @@ power=0 toughness=0 [/card] [card] -name=Boon Reflection -text=If you would gain life, you gain twice that much life instead. -mana={4}{W} -type=Enchantment -[/card] -[card] name=Booster Tutor text=Open a sealed Magic booster pack, reveal the cards, and put one of those cards into your hand. (Remove that card from your deck before beginning a new game.) mana={B} @@ -1801,11 +1373,6 @@ power=5 toughness=5 [/card] [card] -name=Boseiju, Who Shelters All -text=Boseiju, Who Shelters All enters the battlefield tapped. -- {T}, Pay 2 life: Add {1} to your mana pool. If that mana is spent on an instant or sorcery spell, that spell can't be countered by spells or abilities. -type=Legendary Land -[/card] -[card] name=Bosium Strip text={3}, {T}: Until end of turn, if the top card of your graveyard is an instant or sorcery card, you may cast that card. If a card cast this way would be put into a graveyard this turn, exile it instead. mana={3} @@ -1874,18 +1441,6 @@ mana={1}{B} type=Sorcery [/card] [card] -name=Branching Bolt -text=Choose one or both — Branching Bolt deals 3 damage to target creature with flying; and/or Branching Bolt deals 3 damage to target creature without flying. -mana={1}{R}{G} -type=Instant -[/card] -[card] -name=Brave the Sands -text=Creatures you control have vigilance. -- Each creature you control can block an additional creature each combat. -mana={1}{W} -type=Enchantment -[/card] -[card] name=Break Open text=Turn target face-down creature an opponent controls face up. mana={1}{R} @@ -1925,16 +1480,6 @@ mana={W}{W}{U}{U}{U}{B}{B} type=Sorcery [/card] [card] -name=Brimaz, King of Oreskos -abilities=vigilance -text=Vigilance -- Whenever Brimaz, King of Oreskos attacks, put a 1/1 white Cat Soldier creature token with vigilance onto the battlefield attacking. -- Whenever Brimaz blocks a creature, put a 1/1 white Cat Soldier creature token with vigilance onto the battlefield blocking that creature. -mana={1}{W}{W} -type=Legendary Creature -subtype=Cat Soldier -power=3 -toughness=4 -[/card] -[card] name=Brine Hag text=When Brine Hag dies, all creatures that dealt damage to it this turn become 0/2. (This effect lasts indefinitely.) mana={2}{U}{U} @@ -1959,12 +1504,6 @@ mana={X}{U} type=Instant [/card] [card] -name=Broken Visage -text=Destroy target nonartifact attacking creature. It can't be regenerated. Put a black Spirit creature token with that creature's power and toughness onto the battlefield. Sacrifice the token at the beginning of the next end step. -mana={4}{B} -type=Instant -[/card] -[card] name=Bronze Bombshell text=When a player other than Bronze Bombshell's owner controls it, that player sacrifices it. If the player does, Bronze Bombshell deals 7 damage to him or her. mana={4} @@ -1980,16 +1519,6 @@ mana={4} type=Artifact [/card] [card] -name=Bronze Horse -abilities=trample -text=Trample -- As long as you control another creature, prevent all damage that would be dealt to Bronze Horse by spells that target it. -mana={7} -type=Artifact Creature -subtype=Horse -power=4 -toughness=4 -[/card] -[card] name=Bronze Tablet text=Remove Bronze Tablet from your deck before playing if you're not playing for ante. -- Bronze Tablet enters the battlefield tapped. -- {4}, {T}: Exile Bronze Tablet and target nontoken permanent an opponent owns. That player may pay 10 life. If he or she does, put Bronze Tablet into its owner's graveyard. Otherwise, that player owns Bronze Tablet and you own the other exiled card. mana={6} @@ -2050,15 +1579,6 @@ mana={R} type=Enchantment [/card] [card] -name=Bumbling Pangolin -text=When this creature enters the battlefield, you may destroy target artifact. -mana={3}{R} -type=Host Creature -subtype=Pangolin Beast -power=2 -toughness=2 -[/card] -[card] name=Bureaucracy text=Pursuant to subsection 3.1(4) of Richard's Rules of Order, during the upkeep of each participant in this game of the Magic: The Gathering® trading card game (hereafter known as "PLAYER"), that PLAYER performs all actions in the sequence of previously added actions (hereafter known as "ACTION QUEUE"), in the order those actions were added, then adds another action to the end of the ACTION QUEUE. All actions must be simple physical or verbal actions that a player can perform while sitting in a chair, without jeopardizing the health and security of said PLAYER. -- If any PLAYER does not perform all the prescribed actions in the correct order, sacrifice Bureaucracy and said PLAYER discards his or her complement of cards in hand (hereafter known as "HAND"). mana={3}{U}{U} @@ -2131,18 +1651,6 @@ mana={2}{W} type=Enchantment [/card] [card] -name=Cabal Conditioning -text=Any number of target players each discard a number of cards equal to the highest converted mana cost among permanents you control. -mana={6}{B} -type=Sorcery -[/card] -[card] -name=Cabal Shrine -text=Whenever a player casts a spell, that player discards X cards, where X is the number of cards in all graveyards with the same name as that spell. -mana={1}{B}{B} -type=Enchantment -[/card] -[card] name=Cabal Therapist text=Menace -- At the beginning of your precombat main phase, you may sacrifice a creature. When you do, choose a nonland card name, then target player reveals their hand and discards all cards with that name. mana={B} @@ -2164,11 +1672,6 @@ mana={6} type=Artifact [/card] [card] -name=Calciform Pools -text={T}: Add {1} to your mana pool. -- {1}, {T}: Put a storage counter on Calciform Pools. -- {1}, Remove X storage counters from Calciform Pools: Add X mana in any combination of {W} and/or {U} to your mana pool. -type=Land -[/card] -[card] name=Call of the Nightwing text=Put a 1/1 blue and black Horror creature token with flying onto the battlefield. -- Cipher (Then you may exile this spell card encoded on a creature you control. Whenever that creature deals combat damage to a player, its controller may cast a copy of the encoded card without paying its mana cost.) mana={2}{U}{B} @@ -2275,12 +1778,6 @@ type=Instant subtype=Arcane [/card] [card] -name=Cankerous Thirst -text=If {B} was spent to cast Cankerous Thirst, you may have target creature get -3/-3 until end of turn. If {G} was spent to cast Cankerous Thirst, you may have target creature get +3/+3 until end of turn. (Do both if {B}{G} was spent.) -mana={3}{BG} -type=Instant -[/card] -[card] name=Capital Punishment text=Council's dilemma — Starting with you, each player votes for death or taxes. Each opponent sacrifices a creature for each death vote and discards a card for each taxes vote. mana={4}{B}{B} @@ -2296,12 +1793,6 @@ power=6 toughness=4 [/card] [card] -name=Captain's Maneuver -text=The next X damage that would be dealt to target creature or player this turn is dealt to another target creature or player instead. -mana={X}{R}{W} -type=Instant -[/card] -[card] name=Captivating Glance text=Enchant creature -- At the beginning of your end step, clash with an opponent. If you win, gain control of enchanted creature. Otherwise, that player gains control of enchanted creature. (Each clashing player reveals the top card of his or her library, then puts that card on the top or bottom. A player wins if his or her card had a higher converted mana cost.) mana={2}{U} @@ -2344,12 +1835,6 @@ power=2 toughness=2 [/card] [card] -name=Carom -text=The next 1 damage that would be dealt to target creature this turn is dealt to another target creature instead. -- Draw a card. -mana={1}{W} -type=Instant -[/card] -[card] name=Carpet of Flowers text=At the beginning of each of your main phases, if you haven't added mana to your mana pool with this ability this turn, you may add up to X mana of any one color to your mana pool, where X is the number of Islands target opponent controls. mana={G} @@ -2374,15 +1859,6 @@ power=6 toughness=5 [/card] [card] -name=Carrionette -text={2}{B}{B}: Exile Carrionette and target creature unless that creature's controller pays {2}. Activate this ability only if Carrionette is in your graveyard. -mana={1}{B} -type=Creature -subtype=Skeleton -power=1 -toughness=1 -[/card] -[card] name=Carry Away text=Enchant Equipment -- When Carry Away enters the battlefield, unattach enchanted Equipment. -- You control enchanted Equipment. mana={U}{U} @@ -2414,15 +1890,6 @@ mana={1}{U}{R} // {4}{R}{W} type=Sorcery // Sorcery [/card] [card] -name=Cathedral Membrane -text=({PW} can be paid with either {W} or 2 life.) -- Defender -- When Cathedral Membrane dies during combat, it deals 6 damage to each creature it blocked this combat. -mana={1}{PW} -type=Artifact Creature -subtype=Wall -power=0 -toughness=3 -[/card] -[card] name=Cathedral of Serra text=White legendary creatures you control have "bands with other legendary creatures." (Any legendary creatures can attack in a band as long as at least one has "bands with other legendary creatures." Bands are blocked as a group. If at least two legendary creatures you control, one of which has "bands with other legendary creatures," are blocking or being blocked by the same creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) type=Land @@ -2466,15 +1933,6 @@ mana={2} type=Artifact [/card] [card] -name=Cenn's Tactician -text={W}, {T}: Put a +1/+1 counter on target Soldier creature. -- Each creature you control with a +1/+1 counter on it can block an additional creature. -mana={W} -type=Creature -subtype=Kithkin Soldier -power=1 -toughness=1 -[/card] -[card] name=Censorship text=When Censorship comes into play, choose a CENSORED word. -- Whenever any CENSORED player says the chosen CENSORED word, Censorship deals 2 CENSORED damage to him or her. mana={U} @@ -2487,15 +1945,6 @@ mana={1}{U}{U} type=Enchantment [/card] [card] -name=Cetavolver -text=Kicker {1}{R} and/or {G} (You may pay an additional {1}{R} and/or {G} as you cast this spell.) -- If Cetavolver was kicked with its {1}{R} kicker, it enters the battlefield with two +1/+1 counters on it and with first strike. -- If Cetavolver was kicked with its {G} kicker, it enters the battlefield with a +1/+1 counter on it and with trample. -mana={1}{U} -type=Creature -subtype=Volver -power=1 -toughness=1 -[/card] -[card] name=Chain Stasis text=You may tap or untap target creature. Then that creature's controller may pay {2}{U}. If the player does, he or she may copy this spell and may choose a new target for that copy. mana={U} @@ -2535,15 +1984,6 @@ mana={1}{B} type=Enchantment [/card] [card] -name=Champion of Stray Souls -text={3}{B}{B}, {T}, Sacrifice X other creatures: Return X target creature cards from your graveyard to the battlefield. -- {5}{B}{B}: Put Champion of Stray Souls on top of your library from your graveyard. -mana={4}{B}{B} -type=Creature -subtype=Skeleton Warrior -power=4 -toughness=4 -[/card] -[card] name=Chance Encounter text=Whenever you win a coin flip, put a luck counter on Chance Encounter. -- -- At the beginning of your upkeep, if Chance Encounter has ten or more luck counters on it, you win the game. mana={2}{R}{R} @@ -2613,6 +2053,9 @@ subtype=Chandra [/card] [card] name=Chandra, Fire of Kaladesh +auto=@movedTo(*[red]|mystack):untap +auto={T}:damage:1 target(player) +#auto=transforms((,newability[flip(Chandra, Roaring Flame)],newability[moveto(mybattlefield)])) forever text=Whenever you cast a red spell, untap Chandra, Fire of Kaladesh. -- {T}: Chandra, Fire of Kaladesh deals 1 damage to target player. If Chandra has dealt 3 or more damage this turn, exile her, then return her to the battlefield transformed under her owner's control. mana={1}{R}{R} type=Legendary Creature @@ -2629,48 +2072,18 @@ type=Planeswalker subtype=Chandra [/card] [card] -name=Chandra, Roaring Flame -auto=counter(0/0,4,loyalty) -text=+1: Chandra, Roaring Flame deals 2 damage to target player. -- -2: Chandra, Roaring Flame deals 2 damage to target creature. -- -7: Chandra, Roaring Flame deals 6 damage to each opponent. Each player dealt damage this way gets an emblem with "At the beginning of your upkeep, this emblem deals 3 damage to you." -type=Planeswalker -subtype=Chandra -[/card] -[card] -name=Chandra, the Firebrand -auto=counter(0/0,3,loyalty) -text=+1: Chandra, the Firebrand deals 1 damage to target creature or player. -- -2: When you cast your next instant or sorcery spell this turn, copy that spell. You may choose new targets for the copy. -- -6: Chandra, the Firebrand deals 6 damage to each of up to six target creatures and/or players. -mana={3}{R} -type=Planeswalker -subtype=Chandra -[/card] -[card] name=Channel Harm text=Prevent all damage that would be dealt to you and permanents you control this turn by sources you don't control. If damage is prevented this way, you may have Channel Harm deal that much damage to target creature. mana={5}{W} type=Instant [/card] [card] -name=Chant of Vitu-Ghazi -text=Convoke (Each creature you tap while casting this spell reduces its cost by {1} or by one mana of that creature's color.) -- Prevent all damage that would be dealt by creatures this turn. You gain life equal to the damage prevented this way. -mana={6}{W}{W} -type=Instant -[/card] -[card] name=Chaos Confetti text={4}, {T}: Tear Chaos Confetti into pieces. Throw the pieces onto the playing area from a distance of at least five feet. Destroy each card in play that a piece touches. Remove the pieces from the game afterwards. mana={4} type=Artifact [/card] [card] -name=Chaos Harlequin -text={R}: Exile the top card of your library. If that card is a land card, Chaos Harlequin gets -4/-0 until end of turn. Otherwise, Chaos Harlequin gets +2/+0 until end of turn. -mana={2}{R}{R} -type=Creature -subtype=Human -power=2 -toughness=4 -[/card] -[card] name=Chaos Lord abilities=first strike text=First strike -- At the beginning of your upkeep, target opponent gains control of Chaos Lord if the number of permanents is even. -- Chaos Lord can attack as though it had haste unless it entered the battlefield this turn. @@ -2705,15 +2118,6 @@ type=Enchantment subtype=Aura [/card] [card] -name=Charm Peddler -text={W}, {T}, Discard a card: The next time a source of your choice would deal damage to target creature this turn, prevent that damage. -mana={W} -type=Creature -subtype=Human Spellshaper -power=1 -toughness=1 -[/card] -[card] name=Charm School text=When Charm School comes into play, choose a color and balance Charm School on your head. -- Prevent all damage to you of the chosen color. -- If Charm School falls off your head, sacrifice Charm School. mana={2}{W} @@ -2773,12 +2177,6 @@ power=2 toughness=2 [/card] [card] -name=Chill Haunting -text=As an additional cost to cast Chill Haunting, exile X creature cards from your graveyard. -- Target creature gets -X/-X until end of turn. -mana={1}{B} -type=Instant -[/card] -[card] name=Chipper Chopper text=Flying -- When Chipper Chopper enters the battlefield, you may sacrifice another artifact. If you do, put two +1/+1 counters on Chipper Chopper and it assembles a Contraption. (Put the top card of your Contraption deck face up onto one of your sprockets.) mana={3}{U} @@ -2814,6 +2212,8 @@ toughness=3 [/card] [card] name=Cho-Arrim Alchemist +auto=preventalldamage to(controller) ueot +auto=life:pdcount controller ueot text={1}{W}{W}, {T}, Discard a card: The next time a source of your choice would deal damage to you this turn, prevent that damage. You gain life equal to the damage prevented this way. mana={W} type=Creature @@ -2829,33 +2229,11 @@ type=Sorcery subtype=Arcane [/card] [card] -name=Choking Vines -text=Cast Choking Vines only during the declare blockers step. -- X target attacking creatures become blocked. Choking Vines deals 1 damage to each of those creatures. (This spell works on unblockable creatures.) -mana={X}{G} -type=Instant -[/card] -[card] name=Choose Your Champion text=When you set this scheme in motion, target opponent chooses a player. Until your next turn, only you and the chosen player can cast spells and attack with creatures. type=Scheme [/card] [card] -name=Chord of Calling -text=Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.) -- Search your library for a creature card with converted mana cost X or less and put it onto the battlefield. Then shuffle your library. -mana={X}{G}{G}{G} -type=Instant -[/card] -[card] -name=Chorus of the Conclave -abilities=forestwalk -text=Forestwalk -- As an additional cost to cast creature spells, you may pay any amount of mana. If you do, that creature enters the battlefield with that many additional +1/+1 counters on it. -mana={4}{G}{G}{W}{W} -type=Legendary Creature -subtype=Dryad -power=3 -toughness=8 -[/card] -[card] name=Chromatic Armor text=Enchant creature -- As Chromatic Armor enters the battlefield, choose a color. -- Chromatic Armor enters the battlefield with a sleight counter on it. -- Prevent all damage that would be dealt to enchanted creature by sources of the last chosen color. -- {X}: Put a sleight counter on Chromatic Armor and choose a color. X is the number of sleight counters on Chromatic Armor. mana={1}{W}{U} @@ -2878,49 +2256,6 @@ mana={4}{W}{W} type=Sorcery [/card] [card] -name=Chronostutter -text=Put target creature into its owner's library second from the top. -mana={5}{U} -type=Instant -[/card] -[card] -name=Cinder Crawler -text={R}: Cinder Crawler gets +1/+0 until end of turn. Activate this ability only if Cinder Crawler is blocked. -mana={1}{R} -type=Creature -subtype=Salamander -power=1 -toughness=2 -[/card] -[card] -name=Circle of Affliction -text=As Circle of Affliction enters the battlefield, choose a color. -- Whenever a source of the chosen color deals damage to you, you may pay {1}. If you do, target player loses 1 life and you gain 1 life. -mana={1}{B} -type=Enchantment -[/card] -[card] -name=Circle of Despair -text={1}, Sacrifice a creature: The next time a source of your choice would deal damage to target creature or player this turn, prevent that damage. -mana={1}{W}{B} -type=Enchantment -[/card] -[card] -name=Circle of Protection: Artifacts -text={2}: The next time an artifact source of your choice would deal damage to you this turn, prevent that damage. -mana={1}{W} -type=Enchantment -[/card] -[card] -name=Circling Vultures -abilities=flying -text=Flying -- You may discard Circling Vultures any time you could cast an instant. -- At the beginning of your upkeep, sacrifice Circling Vultures unless you exile the top creature card of your graveyard. -mana={B} -type=Creature -subtype=Bird -power=3 -toughness=2 -[/card] -[card] name=City in a Bottle text=Whenever a nontoken permanent from the Arabian Nights expansion other than City in a Bottle is on the battlefield, its controller sacrifices it. -- Players can't play cards from the Arabian Nights expansion. mana={2} @@ -2946,19 +2281,6 @@ type=Summon subtype=Clamfolk [/card] [card] -name=Clambassadors -text=If Clambassadors damages any player, choose an artifact, creature, or land you control. That player gains control of that artifact, creature, or land. -mana={3}{U} -type=Summon -subtype=Clamfolk -[/card] -[card] -name=Clan Defiance -text=Choose one or more — -- • Clan Defiance deals X damage to target creature with flying. -- • Clan Defiance deals X damage to target creature without flying. -- • Clan Defiance deals X damage to target player. -mana={X}{R}{G} -type=Sorcery -[/card] -[card] name=Clarion Ultimatum text=Choose five permanents you control. For each of those permanents, you may search your library for a card with the same name as that permanent. Put those cards onto the battlefield tapped, then shuffle your library. mana={G}{G}{W}{W}{W}{U}{U} @@ -2980,12 +2302,6 @@ mana={W}{W}{W} type=Sorcery [/card] [card] -name=Cleansing Meditation -text=Destroy all enchantments. -- Threshold — If seven or more cards are in your graveyard, instead destroy all enchantments, then return all cards in your graveyard destroyed this way to the battlefield. -mana={1}{W}{W} -type=Sorcery -[/card] -[card] name=Clear the Land text=Each player reveals the top five cards of his or her library, puts all land cards revealed this way onto the battlefield tapped, and exiles the rest. mana={2}{G} @@ -3059,22 +2375,6 @@ power=2 toughness=4 [/card] [card] -name=Coastline Chimera -abilities=flying -text=Flying -- {1}{W}: Coastline Chimera can block an additional creature this turn. -mana={3}{U} -type=Creature -subtype=Chimera -power=1 -toughness=5 -[/card] -[card] -name=Coax from the Blind Eternities -text=You may choose an Eldrazi card you own from outside the game or in exile, reveal that card, and put it into your hand. -mana={2}{U} -type=Sorcery -[/card] -[card] name=Cobra Trap text=If a noncreature permanent under your control was destroyed this turn by a spell or ability an opponent controlled, you may pay {G} rather than pay Cobra Trap's mana cost. -- Put four 1/1 green Snake creature tokens onto the battlefield. mana={4}{G}{G} @@ -3149,13 +2449,6 @@ power=4 toughness=4 [/card] [card] -name=Coils of the Medusa -text=Enchant creature -- Enchanted creature gets +1/-1. -- Sacrifice Coils of the Medusa: Destroy all non-Wall creatures blocking enchanted creature. -mana={1}{B} -type=Enchantment -subtype=Aura -[/card] -[card] name=Colfenor's Plans text=When Colfenor's Plans enters the battlefield, exile the top seven cards of your library face down. -- You may look at and play cards exiled with Colfenor's Plans. -- Skip your draw step. -- You can't cast more than one spell each turn. mana={2}{B}{B} @@ -3174,15 +2467,6 @@ mana={G} type=Sorcery [/card] [card] -name=Collector Protector -text={W}, Give an opponent a nonland card you own from outside the game: Prevent the next 1 damage that would be dealt to you or Collector Protector this turn. -mana={3}{W}{W} -type=Creature -subtype=Human Gamer -power=2 -toughness=5 -[/card] -[card] name=Colossal Heroics text=Strive — Colossal Heroics costs {1}{G} more to cast for each target beyond the first. -- Any number of target creatures each get +2/+2 until end of turn. Untap those creatures. mana={2}{G} @@ -3205,16 +2489,6 @@ mana={3}{W} type=Instant [/card] [card] -name=Command Beacon -text={T}: Add {C} to your mana pool. -- {T}, Sacrifice Command Beacon: Put your commander into your hand from the command zone. -type=Land -[/card] -[card] -name=Command Tower -text={T}: Add to your mana pool one mana of any color in your commander's color identity. -type=Land -[/card] -[card] name=Commandeer text=You may exile two blue cards from your hand rather than pay Commandeer's mana cost. -- Gain control of target noncreature spell. You may choose new targets for it. (If that spell is an artifact, enchantment, or planeswalker, the permanent enters the battlefield under your control.) mana={5}{U}{U} @@ -3227,12 +2501,6 @@ mana={2}{W}{W} type=Enchantment [/card] [card] -name=Commander's Sphere -text={T}: Add to your mana pool one mana of any color in your commander's color identity. -- Sacrifice Commander's Sphere: Draw a card. -mana={3} -type=Artifact -[/card] -[card] name=Common Cause text=Nonartifact creatures get +2/+2 as long as they all share a color. mana={2}{W} @@ -3245,45 +2513,13 @@ mana={2}{U}{U} type=Enchantment [/card] [card] -name=Common Iguana -text=When this creature enters the battlefield, you may discard a card. If you do, draw a card. -mana={1}{R} -type=Host Creature -subtype=Lizard -power=1 -toughness=3 -[/card] -[card] -name=Complicate -text=Counter target spell unless its controller pays {3}. -- Cycling {2}{U} ({2}{U}, Discard this card: Draw a card.) -- When you cycle Complicate, you may counter target spell unless its controller pays {1}. -mana={2}{U} -type=Instant -[/card] -[card] -name=Cone of Flame -text=Cone of Flame deals 1 damage to target creature or player, 2 damage to another target creature or player, and 3 damage to a third target creature or player. -mana={3}{R}{R} -type=Sorcery -[/card] -[card] -name=Confiscation Coup -text=Choose target artifact or creature. You get {E}{E}{E}{E} (four energy counters), then you may pay an amount of {E} equal to that permanent's converted mana cost. If you do, gain control of it. -mana={3}{U}{U} -type=Sorcery -[/card] -[card] name=Conflagrate +flashback={R}{R} text=Conflagrate deals X damage divided as you choose among any number of target creatures and/or players. -- Flashback—{R}{R}, Discard X cards. (You may cast this card from your graveyard for its flashback cost. Then exile it.) mana={X}{X}{R} type=Sorcery [/card] [card] -name=Confound -text=Counter target spell that targets one or more creatures. -- -- Draw a card. -mana={1}{U} -type=Instant -[/card] -[card] name=Confusion in the Ranks text=Whenever an artifact, creature, or enchantment enters the battlefield, its controller chooses target permanent another player controls that shares a card type with it. Exchange control of those permanents. mana={3}{R}{R} @@ -3302,25 +2538,6 @@ mana={W}{B} type=Sorcery [/card] [card] -name=Conqueror's Flail -text=Equipped creature gets +1/+1 for each color among permanents you control. -- As long as Conqueror's Flail is attached to a creature, your opponents can't cast spells during your turn. -- Equip {2} -mana={2} -type=Artifact -subtype=Equipment -[/card] -[card] -name=Consign to Dust -text=Strive — Consign to Dust costs {2}{G} more to cast for each target beyond the first. -- Destroy any number of target artifacts and/or enchantments. -mana={2}{G} -type=Instant -[/card] -[card] -name=Consulate Surveillance -text=When Consulate Surveillance enters the battlefield, you get {E}{E}{E}{E} (four energy counters). -- Pay {E}{E}: Prevent all damage that would be dealt to you this turn by a source of your choice. -mana={3}{W} -type=Enchantment -[/card] -[card] name=Consuming Vortex text=Return target creature to its owner's hand. -- Splice onto Arcane {3}{U} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) mana={1}{U} @@ -3338,24 +2555,12 @@ power=2 toughness=2 [/card] [card] -name=Contamination -text=At the beginning of your upkeep, sacrifice Contamination unless you sacrifice a creature. -- If a land is tapped for mana, it produces {B} instead of any other type and amount. -mana={2}{B} -type=Enchantment -[/card] -[card] name=Contract from Below text=Remove Contract from Below from your deck before playing if you're not playing for ante. -- Discard your hand, add the top card of your library to the ante, then draw seven cards. mana={B} type=Sorcery [/card] [card] -name=Contraption Cannon -text={2}, Sacrifice Contraption Cannon: It deals damage to any target equal to the number of Contraptions you control. -mana={4} -type=Artifact -[/card] -[card] name=Conundrum Sphinx abilities=flying text=Flying -- Whenever Conundrum Sphinx attacks, each player names a card. Then each player reveals the top card of his or her library. If the card a player revealed is the card he or she named, that player puts it into his or her hand. If it's not, that player puts it on the bottom of his or her library. @@ -3389,6 +2594,7 @@ type=Enchantment [/card] [card] name=Corpse Dance +buyback={2}{B}{2} text=Buyback {2} (You may pay an additional {2} as you cast this spell. If you do, put this card into your hand as it resolves.) -- Return the top creature card of your graveyard to the battlefield. That creature gains haste until end of turn. Exile it at the beginning of the next end step. mana={2}{B} type=Instant @@ -3403,21 +2609,11 @@ power=4 toughness=4 [/card] [card] -name=Corpseweft -text={1}{B}, Exile one or more creature cards from your graveyard: Put an X/X black Zombie Horror creature token onto the battlefield tapped, where X is twice the number of cards exiled this way. -mana={2}{B} -type=Enchantment -[/card] -[card] name=Corrosion text=Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) -- At the beginning of your upkeep, put a rust counter on each artifact target opponent controls. Then destroy each artifact with converted mana cost less than or equal to the number of rust counters on it. Artifacts destroyed this way can't be regenerated. -- When Corrosion leaves the battlefield, remove all rust counters from all permanents. mana={1}{B}{R} type=Enchantment [/card] -[card] -name=Corrupted Crossroads -text={T}: Add {C} to your mana pool. ({C} represents colorless mana.) -- {T}, Pay 1 life: Add one mana of any color to your mana pool. Spend this mana only to cast a spell with devoid. -type=Land [/card] [card] name=Corrupting Licid @@ -3539,15 +2735,6 @@ type=Sorcery subtype=Arcane [/card] [card] -name=Crashing Boars -text=Whenever Crashing Boars attacks, defending player chooses an untapped creature he or she controls. That creature blocks Crashing Boars this turn if able. -mana={3}{G}{G} -type=Creature -subtype=Boar -power=4 -toughness=4 -[/card] -[card] name=Crawlspace text=No more than two creatures can attack you each combat. mana={3} @@ -3584,21 +2771,6 @@ mana={3}{B} type=Enchantment [/card] [card] -name=Crime // Punishment -text=Put target creature or enchantment card from an opponent's graveyard onto the battlefield under your control. -- // -- Destroy each artifact, creature, and enchantment with converted mana cost X. -mana={3}{W}{B} // {X}{B}{G} -type=Sorcery // Sorcery -[/card] -[card] -name=Cromat -text={W}{B}: Destroy target creature blocking or blocked by Cromat. -- {U}{R}: Cromat gains flying until end of turn. -- {B}{G}: Regenerate Cromat. -- {R}{W}: Cromat gets +1/+1 until end of turn. -- {G}{U}: Put Cromat on top of its owner's library. -mana={W}{U}{B}{R}{G} -type=Legendary Creature -subtype=Illusion -power=5 -toughness=5 -[/card] -[card] name=Crooked Scales text={4}, {T}: Flip a coin. If you win the flip, destroy target creature an opponent controls. If you lose the flip, destroy target creature you control unless you pay {3} and repeat this process. mana={4} @@ -3633,6 +2805,9 @@ toughness=4 [/card] [card] name=Crucible of the Spirit Dragon +auto={T}: Add {1} +auto={1}{T}:counter(0/0,1,Storage) +auto={T}{C(0/0,-1,Storage)}: ability$! _ choice add{U} _ choice add{B} _ choice add{G} _ choice add{R} _ choice add{W} !$ controller text={T}: Add {1} to your mana pool. -- {1}, {T}: Put a storage counter on Crucible of the Spirit Dragon. -- {T}, Remove X storage counters from Crucible of the Spirit Dragon: Add X mana in any combination of colors to your mana pool. Spend this mana only to cast Dragon spells or activate abilities of Dragons. type=Land [/card] @@ -3643,12 +2818,6 @@ mana={6}{B} type=Sorcery [/card] [card] -name=Cruel Feeding -text=Strive — Cruel Feeding costs {2}{B} more to cast for each target beyond the first. -- Any number of target creatures each get +1/+0 and gain lifelink until end of turn. (Damage dealt by a creature with lifelink also causes its controller to gain that much life.) -mana={B} -type=Instant -[/card] -[card] name=Crumbling Sanctuary text=If damage would be dealt to a player, that player exiles that many cards from the top of his or her library instead. mana={5} @@ -3661,21 +2830,6 @@ mana={B} type=Sorcery [/card] [card] -name=Cryptic Annelid -text=When Cryptic Annelid enters the battlefield, scry 1, then scry 2, then scry 3. (To scry X, look at the top X cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) -mana={3}{U} -type=Creature -subtype=Worm Beast -power=1 -toughness=4 -[/card] -[card] -name=Cryptic Command -text=Choose two — Counter target spell; or return target permanent to its owner's hand; or tap all creatures your opponents control; or draw a card. -mana={1}{U}{U}{U} -type=Instant -[/card] -[card] name=Cryptic Gateway text=Tap two untapped creatures you control: You may put a creature card from your hand that shares a creature type with each creature tapped this way onto the battlefield. mana={5} @@ -3697,46 +2851,12 @@ power=5 toughness=4 [/card] [card] -name=Cultivator Drone -abilities=devoid -text=Devoid (This card has no color.) -- {T}: Add {C} to your mana pool. Spend this mana only to cast a colorless spell, activate an ability of a colorless permanent, or pay a cost that contains {C}. ({C} represents colorless mana.) -mana={2}{U} -type=Creature -subtype=Eldrazi Drone -power=2 -toughness=3 -[/card] -[card] name=Cultural Exchange text=Choose any number of creatures target player controls. Choose the same number of creatures another target player controls. Those players exchange control of those creatures. (This effect lasts indefinitely.) mana={4}{U}{U} type=Sorcery [/card] [card] -name=Curious Homunculus -text={T}: Add {C} to your mana pool. Spend this mana only to cast an instant or sorcery spell. -- At the beginning of your upkeep, if there are three or more instant and/or sorcery cards in your graveyard, transform Curious Homunculus. -mana={1}{U} -type=Creature -subtype=Homunculus -power=1 -toughness=1 -[/card] -[card] -name=Curious Killbot -mana={2} -type=Artifact Creature -subtype=Killbot -power=2 -toughness=1 -[/card] -[card] -name=Curse of Bloodletting -text=Enchant player -- If a source would deal damage to enchanted player, it deals double that damage to that player instead. -mana={3}{R}{R} -type=Enchantment -subtype=Aura Curse -[/card] -[card] name=Curse of Chaos text=Enchant player -- Whenever a player attacks enchanted player with one or more creatures, that attacking player may discard a card. If the player does, he or she draws a card. mana={2}{R} @@ -3807,12 +2927,6 @@ type=Enchantment subtype=Aura Curse [/card] [card] -name=Cursed Rack -text=As Cursed Rack enters the battlefield, choose an opponent. -- The chosen player's maximum hand size is four. -mana={4} -type=Artifact -[/card] -[card] name=Cursed Scroll text={3}, {T}: Name a card. Reveal a card at random from your hand. If it's the named card, Cursed Scroll deals 2 damage to target creature or player. mana={1} @@ -3871,15 +2985,6 @@ mana={2}{G}{G} type=Enchantment [/card] [card] -name=Cyclopean Giant -text=When Cyclopean Giant dies, target land becomes a Swamp. Exile Cyclopean Giant. -mana={2}{B}{B} -type=Creature -subtype=Zombie Giant -power=4 -toughness=2 -[/card] -[card] name=Cytoplast Manipulator text=Graft 2 (This creature enters the battlefield with two +1/+1 counters on it. Whenever another creature enters the battlefield, you may move a +1/+1 counter from this creature onto it.) -- {U}, {T}: Gain control of target creature with a +1/+1 counter on it for as long as Cytoplast Manipulator remains on the battlefield. mana={2}{U}{U} @@ -3903,16 +3008,6 @@ type=Planeswalker subtype=Dack [/card] [card] -name=Daghatar the Adamant -abilities=vigilance -text=Vigilance -- Daghatar the Adamant enters the battlefield with four +1/+1 counters on it. -- {1}{BG}{BG}: Move a +1/+1 counter from target creature onto a second target creature. -mana={3}{W} -type=Legendary Creature -subtype=Human Warrior -power=0 -toughness=0 -[/card] -[card] name=Dakra Mystic text={U}, {T}: Each player reveals the top card of his or her library. You may put the revealed cards into their owners' graveyards. If you don't, each player draws a card. mana={U} @@ -3947,12 +3042,6 @@ mana={U}{U} type=Enchantment [/card] [card] -name=Dance of the Manse -text=Return up to X target artifact and/or non-Aura enchantment cards each with converted mana cost X or less from your graveyard to the battlefield. If X is 6 or more, those permanents are 4/4 creatures in addition to their other types. -mana={X}{W}{U} -type=Sorcery -[/card] -[card] name=Dance, Pathetic Marionette text=When you set this scheme in motion, each opponent reveals cards from the top of his or her library until he or she reveals a creature card. Choose one of the revealed creature cards and put it onto the battlefield under your control. Put all other cards revealed this way into their owners' graveyards. type=Scheme @@ -3994,12 +3083,6 @@ mana={B}{B}{B} type=Sorcery [/card] [card] -name=Dash Hopes -text=When you cast Dash Hopes, any player may pay 5 life. If a player does, counter Dash Hopes. -- Counter target spell. -mana={B}{B} -type=Instant -[/card] -[card] name=Daughter of Autumn text={W}: The next 1 damage that would be dealt to target white creature this turn is dealt to Daughter of Autumn instead. mana={2}{G}{G} @@ -4009,27 +3092,6 @@ power=2 toughness=4 [/card] [card] -name=Dawn Charm -text=Choose one — Prevent all combat damage that would be dealt this turn; or regenerate target creature; or counter target spell that targets you. -mana={1}{W} -type=Instant -[/card] -[card] -name=Dawn Evangel -text=Whenever a creature dies, if an Aura you controlled was attached to it, return target creature card with converted mana cost 2 or less from your graveyard to your hand. -mana={2}{W} -type=Enchantment Creature -subtype=Human Cleric -power=2 -toughness=3 -[/card] -[card] -name=Dawn to Dusk -text=Choose one or both — Return target enchantment card from your graveyard to your hand; and/or destroy target enchantment. -mana={2}{W}{W} -type=Sorcery -[/card] -[card] name=Daxos of Meletis text=Daxos of Meletis can't be blocked by creatures with power 3 or greater. -- Whenever Daxos of Meletis deals combat damage to a player, exile the top card of that player's library. You gain life equal to that card's converted mana cost. Until end of turn, you may cast that card and you may spend mana as though it were mana of any color to cast it. mana={1}{W}{U} @@ -4045,24 +3107,6 @@ mana={2}{U} type=Sorcery [/card] [card] -name=Dazzling Beauty -text=Cast Dazzling Beauty only during the declare blockers step. -- Target unblocked attacking creature becomes blocked. (This spell works on unblockable creatures.) -- Draw a card at the beginning of the next turn's upkeep. -mana={2}{W} -type=Instant -[/card] -[card] -name=Dead // Gone -text=Dead deals 2 damage to target creature. -- // -- Return target creature you don't control to its owner's hand. -mana={R} // {2}{R} -type=Instant // Instant -[/card] -[card] -name=Dead Reckoning -text=You may put target creature card from your graveyard on top of your library. If you do, Dead Reckoning deals damage equal to that card's power to target creature. -mana={1}{B}{B} -type=Sorcery -[/card] -[card] name=Dead Ringers text=Destroy two target nonblack creatures unless either one is a color the other isn't. They can't be regenerated. mana={4}{B} @@ -4076,12 +3120,6 @@ type=Summon subtype=Zombie [/card] [card] -name=Deadly Allure -text=Target creature gains deathtouch until end of turn and must be blocked this turn if able. -- Flashback {G} (You may cast this card from your graveyard for its flashback cost. Then exile it.) -mana={B} -type=Sorcery -[/card] -[card] name=Deadly Designs text={2}: Put a plot counter on Deadly Designs. Any player may activate this ability. -- When there are five or more plot counters on Deadly Designs, sacrifice it. If you do, destroy up to two target creatures. mana={1}{B} @@ -4134,12 +3172,6 @@ power=3 toughness=3 [/card] [card] -name=Debt of Loyalty -text=Regenerate target creature. You gain control of that creature if it regenerates this way. -mana={1}{W}{W} -type=Instant -[/card] -[card] name=Deceiver of Form text=({C} represents colorless mana.) -- At the beginning of combat on your turn, reveal the top card of your library. If a creature card is revealed this way, you may have creatures you control other than Deceiver of Form become copies of that card until end of turn. You may put that card on the bottom of your library. mana={6}{C} @@ -4155,16 +3187,6 @@ mana={U}{U} type=Enchantment [/card] [card] -name=Decorated Griffin -abilities=flying -text=Flying -- {1}{W}: Prevent the next 1 combat damage that would be dealt to you this turn. -mana={4}{W} -type=Creature -subtype=Griffin -power=2 -toughness=3 -[/card] -[card] name=Deep Water text={U}: Until end of turn, if you tap a land you control for mana, it produces {U} instead of any other type. mana={U}{U} @@ -4207,12 +3229,6 @@ mana={3}{U} type=Instant [/card] [card] -name=Deft Dismissal -text=Deft Dismissal deals 3 damage divided as you choose among one, two, or three target attacking or blocking creatures. -mana={3}{W} -type=Instant -[/card] -[card] name=Degavolver text=Kicker {1}{B} and/or {R} (You may pay an additional {1}{B} and/or {R} as you cast this spell.) -- If Degavolver was kicked with its {1}{B} kicker, it enters the battlefield with two +1/+1 counters on it and with "Pay 3 life: Regenerate Degavolver." -- If Degavolver was kicked with its {R} kicker, it enters the battlefield with a +1/+1 counter on it and with first strike. mana={1}{W} @@ -4240,14 +3256,6 @@ mana={1} type=Artifact [/card] [card] -name=Delighted Killbot -mana={2} -type=Artifact Creature -subtype=Killbot -power=2 -toughness=1 -[/card] -[card] name=Dementia Sliver text=All Slivers have "{T}: Name a card. Target opponent reveals a card at random from his or her hand. If it's the named card, that player discards it. Activate this ability only during your turn." mana={3}{U}{B} @@ -4257,12 +3265,6 @@ power=3 toughness=3 [/card] [card] -name=Demonfire -text=Demonfire deals X damage to target creature or player. If a creature dealt damage this way would die this turn, exile it instead. -- Hellbent — If you have no cards in hand, Demonfire can't be countered by spells or abilities and the damage can't be prevented. -mana={X}{R} -type=Sorcery -[/card] -[card] name=Demonic Attorney text=Remove Demonic Attorney from your deck before playing if you're not playing for ante. -- Each player antes the top card of his or her library. mana={1}{B}{B} @@ -4344,96 +3346,24 @@ type=Instant subtype=Arcane [/card] [card] -name=Desperate Stand -text=Strive — Desperate Stand costs {R}{W} more to cast for each target beyond the first. -- Any number of target creatures each get +2/+0 and gain first strike and vigilance until end of turn. -mana={R}{W} -type=Sorcery -[/card] -[card] -name=Despondent Killbot -mana={2} -type=Artifact Creature -subtype=Killbot -power=2 -toughness=1 -[/card] -[card] -name=Devastating Dreams -text=As an additional cost to cast Devastating Dreams, discard X cards at random. -- Each player sacrifices X lands. Devastating Dreams deals X damage to each creature. -mana={R}{R} -type=Sorcery -[/card] -[card] -name=Devastating Summons -text=As an additional cost to cast Devastating Summons, sacrifice X lands. -- Put two X/X red Elemental creature tokens onto the battlefield. -mana={R} -type=Sorcery -[/card] -[card] -name=Devouring Rage -text=As an additional cost to cast Devouring Rage, you may sacrifice any number of Spirits. -- Target creature gets +3/+0 until end of turn. For each Spirit sacrificed this way, that creature gets an additional +3/+0 until end of turn. -mana={4}{R} -type=Instant -subtype=Arcane -[/card] -[card] -name=Devout Harpist -text={T}: Destroy target Aura attached to a creature. -mana={W} -type=Creature -subtype=Human -power=1 -toughness=1 -[/card] -[card] name=Dichotomancy text=For each tapped nonland permanent target opponent controls, search that player's library for a card with the same name as that permanent and put it onto the battlefield under your control. Then that player shuffles his or her library. -- Suspend 3—{1}{U}{U} (Rather than cast this card from your hand, you may pay {1}{U}{U} and exile it with three time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.) mana={7}{U}{U} type=Sorcery [/card] [card] -name=Dictate of the Twin Gods -text=Flash -- If a source would deal damage to a permanent or player, it deals double that damage to that permanent or player instead. -mana={3}{R}{R} -type=Enchantment -[/card] -[card] name=Dictation Quillograph text=Whenever you crank Dictation Quillograph, until end of turn, target creature gains "Whenever this creature deals combat damage to a player, you may draw a card. If you do, discard a card." type=Artifact subtype=Contraption [/card] [card] -name=Die Young -text=Choose target creature. You get {E}{E} (two energy counters), then you may pay any amount of {E}. The creature gets -1/-1 until end of turn for each {E} paid this way. -mana={1}{B} -type=Sorcery -[/card] -[card] -name=Diffusion Sliver -text=Whenever a Sliver creature you control becomes the target of a spell or ability an opponent controls, counter that spell or ability unless its controller pays {2}. -mana={1}{U} -type=Creature -subtype=Sliver -power=1 -toughness=1 -[/card] -[card] name=Dimensional Breach text=Exile all permanents. For as long as any of those cards remain exiled, at the beginning of each player's upkeep, that player returns one of the exiled cards he or she owns to the battlefield. mana={5}{W}{W} type=Sorcery [/card] [card] -name=Diplomatic Escort -text={U}, {T}, Discard a card: Counter target spell or ability that targets a creature. -mana={1}{U} -type=Creature -subtype=Human Spellshaper -power=1 -toughness=1 -[/card] -[card] name=Dire Wolves text=Dire Wolves has banding as long as you control a Plains. (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) mana={2}{G} @@ -4443,33 +3373,12 @@ power=2 toughness=2 [/card] [card] -name=Dirty Rat -text=When this creature enters the battlefield, target opponent discards a card. -mana={1}{B} -type=Host Creature -subtype=Rat -power=1 -toughness=1 -[/card] -[card] -name=Disallow -text=Counter target spell, activated ability, or triggered ability. (Mana abilities can't be targeted.) -mana={1}{U}{U} -type=Instant -[/card] -[card] name=Disarm text=Unattach all Equipment from target creature. mana={U} type=Instant [/card] [card] -name=Disaster Radius -text=As an additional cost to cast Disaster Radius, reveal a creature card from your hand. -- Disaster Radius deals X damage to each creature your opponents control, where X is the revealed card's converted mana cost. -mana={5}{R}{R} -type=Sorcery -[/card] -[card] name=Disciple of Deceit text=Inspired — Whenever Disciple of Deceit becomes untapped, you may discard a nonland card. If you do, search your library for a card with the same converted mana cost as that card, reveal it, put it into your hand, then shuffle your library. mana={U}{B} @@ -4480,6 +3389,8 @@ toughness=3 [/card] [card] name=Dismantle +target=artifact +auto=destroy text=Destroy target artifact. If that artifact had counters on it, put that many +1/+1 counters or charge counters on an artifact you control. mana={2}{R} type=Sorcery @@ -4491,19 +3402,6 @@ type=Artifact subtype=Contraption [/card] [card] -name=Display of Dominance -text=Choose one — -- • Destroy target blue or black noncreature permanent. -- • Permanents you control can't be the targets of blue or black spells your opponents control this turn. -mana={1}{G} -type=Instant -[/card] -[card] -name=Disrupting Shoal -text=You may exile a blue card with converted mana cost X from your hand rather than pay Disrupting Shoal's mana cost. -- Counter target spell if its converted mana cost is X. -mana={X}{U}{U} -type=Instant -subtype=Arcane -[/card] -[card] name=Disruption Aura text=Enchant artifact -- Enchanted artifact has "At the beginning of your upkeep, sacrifice this artifact unless you pay its mana cost." mana={2}{U} @@ -4511,12 +3409,6 @@ type=Enchantment subtype=Aura [/card] [card] -name=Dissension in the Ranks -text=Target blocking creature fights another target blocking creature. -mana={3}{R}{R} -type=Instant -[/card] -[card] name=Distant Memories text=Search your library for a card, exile it, then shuffle your library. Any opponent may have you put that card into your hand. If no player does, you draw three cards. mana={2}{U}{U} @@ -4589,16 +3481,6 @@ power=3 toughness=5 [/card] [card] -name=Djinn of Infinite Deceits -abilities=flying -text=Flying -- {T}: Exchange control of two target nonlegendary creatures. You can't activate this ability during combat. -mana={4}{U}{U} -type=Creature -subtype=Djinn -power=2 -toughness=7 -[/card] -[card] name=Do or Die text=Separate all creatures target player controls into two piles. Destroy all creatures in the pile of that player's choice. They can't be regenerated. mana={1}{B} @@ -4630,6 +3512,10 @@ toughness=1 [/card] [card] name=Domineering Will +target=creature[-attacking]|opponentbattlefield +auto=untap +auto=moveto(mybattlefield) ueot +auto=mustblock ueot text=Target player gains control of up to three target nonattacking creatures until end of turn. Untap those creatures. They block this turn if able. mana={3}{U} type=Instant @@ -4641,16 +3527,6 @@ mana={B}{B}{B} type=Sorcery [/card] [card] -name=Dormant Gomazoa -abilities=flying -text=Flying -- Dormant Gomazoa enters the battlefield tapped. -- Dormant Gomazoa doesn't untap during your untap step. -- Whenever you become the target of a spell, you may untap Dormant Gomazoa. -mana={1}{U}{U} -type=Creature -subtype=Jellyfish -power=5 -toughness=5 -[/card] -[card] name=Double Cross text=Choose another player. Look at that player's hand and choose one of those cards other than a basic land. He or she discards that card. At the beginning of the next game with the player, look at the player's hand and choose one of those cards other than a basic land. He or she discards that card. mana={3}{B}{B} @@ -4716,12 +3592,6 @@ type=Planeswalker subtype=Dovin [/card] [card] -name=Down // Dirty -text=Target player discards two cards. -- // -- Return target card from your graveyard to your hand. -- -- Fuse (You may cast one or both halves of this card from your hand.) -mana={3}{B} // {2}{G} -type=Sorcery // Sorcery -[/card] -[card] name=Dr. Julius Jumblemorph text=Dr. Julius Jumblemorph is every creature type (even if this card isn't on the battlefield). -- Whenever a host enters the battlefield under your control, you may search your library and/or graveyard for a card with augment and combine it with that host. If you search your library this way, shuffle it. mana={2}{G}{W} @@ -4730,15 +3600,6 @@ power=4 toughness=4 [/card] [card] -name=Draco -text=Domain — Draco costs {2} less to cast for each basic land type among lands you control. -- Flying -- Domain — At the beginning of your upkeep, sacrifice Draco unless you pay {1}0. This cost is reduced by {2} for each basic land type among lands you control. -mana={16} -type=Artifact Creature -subtype=Dragon -power=9 -toughness=9 -[/card] -[card] name=Dracoplasm abilities=flying text=Flying -- As Dracoplasm enters the battlefield, sacrifice any number of creatures. Dracoplasm's power becomes the total power of those creatures and its toughness becomes their total toughness. -- {R}: Dracoplasm gets +1/+0 until end of turn. @@ -4750,6 +3611,7 @@ toughness=0 [/card] [card] name=Dragon Hunter +auto=protection from(dragon) text=Protection from Dragons -- Dragon Hunter can block Dragons as though it had reach. mana={W} type=Creature @@ -4758,28 +3620,12 @@ power=2 toughness=1 [/card] [card] -name=Dragonlord Atarka -abilities=flying,trample -text=Flying, trample -- When Dragonlord Atarka enters the battlefield, it deals 5 damage divided as you choose among any number of target creatures and/or planeswalkers your opponents control. -mana={5}{R}{G} -type=Legendary Creature -subtype=Elder Dragon -power=8 -toughness=8 -[/card] -[card] name=Dragonlord's Prerogative text=As an additional cost to cast Dragonlord's Prerogative, you may reveal a Dragon card from your hand. -- If you revealed a Dragon card or controlled a Dragon as you cast Dragonlord's Prerogative, Dragonlord's Prerogative can't be countered. -- Draw four cards. mana={4}{U}{U} type=Instant [/card] [card] -name=Dragonshift -text=Until end of turn, target creature you control becomes a 4/4 blue and red Dragon, loses all abilities, and gains flying. -- Overload {3}{U}{U}{R}{R} (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of "target" with "each.") -mana={1}{U}{R} -type=Instant -[/card] -[card] name=Drain Power text=Target player activates a mana ability of each land he or she controls. Then put all mana from that player's mana pool into yours. mana={U}{U} @@ -4807,31 +3653,12 @@ mana={2} type=Artifact [/card] [card] -name=Dream Coat -text=Enchant creature -- {0}: Enchanted creature becomes the color or colors of your choice. Activate this ability only once each turn. -mana={U} -type=Enchantment -subtype=Aura -[/card] -[card] name=Dream Salvage text=Draw cards equal to the number of cards target opponent discarded this turn. mana={UB} type=Instant [/card] [card] -name=Dream Tides -text=Creatures don't untap during their controllers' untap steps. -- At the beginning of each player's upkeep, that player may choose any number of tapped nongreen creatures he or she controls and pay {2} for each creature chosen this way. If the player does, untap those creatures. -mana={2}{U}{U} -type=Enchantment -[/card] -[card] -name=Dream's Grip -text=Choose one — Tap target permanent; or untap target permanent. -- Entwine {1} (Choose both if you pay the entwine cost.) -mana={U} -type=Instant -[/card] -[card] name=Dromoka's Command text=Choose two — -- • Prevent all damage target instant or sorcery spell would deal this turn. -- • Target player sacrifices an enchantment. -- • Put a +1/+1 counter on target creature. -- • Target creature you control fights target creature you don't control. mana={G}{W} @@ -4844,15 +3671,6 @@ mana={2}{W}{W} type=Enchantment [/card] [card] -name=Druid of the Sacred Beaker -text={T}: Add {G} for each Crossbreed Labs watermark among permanents you control. -mana={2}{G} -type=Creature -subtype=Deer Bird Ape Druid -power=2 -toughness=2 -[/card] -[card] name=Dual Doomsuits text=Whenever you crank Dual Doomsuits, each time a source you control would deal damage this turn, it deals double that damage instead. type=Artifact @@ -4877,15 +3695,6 @@ mana={B} type=Instant [/card] [card] -name=Dulcet Sirens -text={U}, {T}: Target creature attacks target opponent this turn if able. -- Morph {U} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -mana={2}{U} -type=Creature -subtype=Siren -power=1 -toughness=3 -[/card] -[card] name=Dumb Ass text=At the beginning of your upkeep, flip a coin. If you lose the flip, target opponent chooses whether Dumb Ass attacks this turn. mana={2}{R} @@ -4938,24 +3747,6 @@ mana={X}{R} type=Instant [/card] [card] -name=Dwarven Driller -text={T}: Destroy target land unless its controller has Dwarven Driller deal 2 damage to him or her. -mana={3}{R} -type=Creature -subtype=Dwarf -power=2 -toughness=2 -[/card] -[card] -name=Dwarven Scorcher -text=Sacrifice Dwarven Scorcher: Dwarven Scorcher deals 1 damage to target creature unless that creature's controller has Dwarven Scorcher deal 2 damage to him or her. -mana={R} -type=Creature -subtype=Dwarf -power=1 -toughness=1 -[/card] -[card] name=Dwarven Sea Clan text={T}: Choose target attacking or blocking creature whose controller controls an Island. Dwarven Sea Clan deals 2 damage to that creature at end of combat. Activate this ability only before the end of combat step. mana={2}{R} @@ -4971,15 +3762,6 @@ mana={1}{R}{R} type=Enchantment [/card] [card] -name=Eager Beaver -text=When this creature enters the battlefield, you may untap target permanent. -mana={2}{G} -type=Host Creature -subtype=Beaver -power=3 -toughness=2 -[/card] -[card] name=Earl of Squirrel text=Squirrellink (Damage dealt by this creature also causes you to create that many 1/1 green Squirrel creature tokens.) -- Creature tokens you control are Squirrels in addition to their other creature types. -- Other Squirrels you control get +1/+1. mana={4}{G}{G} @@ -5013,26 +3795,6 @@ type=Plane subtype=Belenon [/card] [card] -name=Eldrazi Mimic -text=Whenever another colorless creature enters the battlefield under your control, you may change Eldrazi Mimic's base power and toughness to that creature's power and toughness until end of turn. -mana={2} -type=Creature -subtype=Eldrazi -power=2 -toughness=1 -[/card] -[card] -name=Eldrazi Temple -text={T}: Add {1} to your mana pool. -- {T}: Add {2} to your mana pool. Spend this mana only to cast colorless Eldrazi spells or activate abilities of colorless Eldrazi. -type=Land -[/card] -[card] -name=Electropotence -text=Whenever a creature enters the battlefield under your control, you may pay {2}{R}. If you do, that creature deals damage equal to its power to target creature or player. -mana={2}{R} -type=Enchantment -[/card] -[card] name=Elemental Resonance text=Enchant permanent -- At the beginning of your precombat main phase, add mana equal to enchanted permanent's mana cost to your mana pool. (Mana cost includes color. If a mana symbol has multiple colors, choose one.) mana={2}{G}{G} @@ -5040,12 +3802,6 @@ type=Enchantment subtype=Aura [/card] [card] -name=Eliminate the Competition -text=As an additional cost to cast Eliminate the Competition, sacrifice X creatures. -- Destroy X target creatures. -mana={4}{B} -type=Sorcery -[/card] -[card] name=Elite Arcanist text=When Elite Arcanist enters the battlefield, you may exile an instant card from your hand. -- {X}, {T}: Copy the exiled card. You may cast the copy without paying its mana cost. X is the converted mana cost of the exiled card. mana={3}{U} @@ -5055,12 +3811,6 @@ power=1 toughness=1 [/card] [card] -name=Elkin Bottle -text={3}, {T}: Exile the top card of your library. Until the beginning of your next upkeep, you may play that card. -mana={3} -type=Artifact -[/card] -[card] name=Elkin Lair text=At the beginning of each player's upkeep, that player exiles a card at random from his or her hand. The player may play that card this turn. At the beginning of the next end step, if the player hasn't played the card, he or she puts it into his or her graveyard. mana={3}{R} @@ -5073,15 +3823,6 @@ type=Plane subtype=Shandalar [/card] [card] -name=Elsha of the Infinite -text=Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.) -- You may look at the top card of your library any time. -- You may cast the top card of your library if it's a noncreature, nonland card, and you may cast it as though it had flash. -mana={2}{U}{R}{W} -type=Legendary Creature -subtype=Djinn Monk -power=3 -toughness=3 -[/card] -[card] name=Elvish House Party text=Elvish House Party's power and toughness are each equal to the current hour, using the twelve-hour system. mana={4}{G}{G} @@ -5110,7 +3851,7 @@ toughness=5 [card] name=Emberwilde Djinn abilities=flying -text=Flying -- -- At the beginning of each player's upkeep, that player may pay {R}{R} or 2 life. If he or she does, the player gains control of Emberwilde Djinn. +text=Flying -- At the beginning of each player's upkeep, that player may pay {R}{R} or 2 life. If he or she does, the player gains control of Emberwilde Djinn. mana={2}{R}{R} type=Creature subtype=Djinn @@ -5161,12 +3902,6 @@ text=(Start the game with this conspiracy face up in the command zone.) -- Befor type=Conspiracy [/card] [card] -name=Empty the Pits -text=Delve (Each card you exile from your graveyard while casting this spell pays for {1}.) -- Put X 2/2 black Zombie creature tokens onto the battlefield tapped. -mana={X}{X}{B}{B}{B}{B} -type=Instant -[/card] -[card] name=Empyrial Archangel abilities=flying,shroud text=Flying, shroud -- All damage that would be dealt to you is dealt to Empyrial Archangel instead. @@ -5179,7 +3914,7 @@ toughness=8 [card] name=Emrakul, the Promised End text=Emrakul, the Promised End costs {1} less to cast for each card type among cards in your graveyard. -- When you cast Emrakul, you gain control of target opponent during that player's next turn. After that turn, that player takes an extra turn. -- Flying, trample, protection from instants -mana=13 +mana={13} type=Legendary Creature subtype=Eldrazi power=13 @@ -5210,36 +3945,12 @@ mana={2}{W}{W} type=Enchantment [/card] [card] -name=Enduring Scalelord -abilities=flying -text=Flying -- Whenever one or more +1/+1 counters are placed on another creature you control, you may put a +1/+1 counter on Enduring Scalelord. -mana={4}{G}{W} -type=Creature -subtype=Dragon -power=4 -toughness=4 -[/card] -[card] name=Energy Vortex text=As Energy Vortex enters the battlefield, choose an opponent. -- At the beginning of your upkeep, remove all energy counters from Energy Vortex. -- At the beginning of the chosen player's upkeep, Energy Vortex deals 3 damage to that player unless he or she pays {1} for each energy counter on Energy Vortex. -- {X}: Put X energy counters on Energy Vortex. Activate this ability only during your upkeep. mana={3}{U}{U} type=Enchantment [/card] [card] -name=Enlarge -text=Target creature gets +7/+7 and gains trample until end of turn. It must be blocked this turn if able. (If a creature with trample would assign enough damage to its blockers to destroy them, you may have it assign the rest of its damage to defending player or planeswalker.) -mana={3}{G}{G} -type=Sorcery -[/card] -[card] -name=Enraged Killbot -mana={2} -type=Artifact Creature -subtype=Killbot -power=2 -toughness=1 -[/card] -[card] name=Enraging Licid text={R}, {T}: Enraging Licid loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {R} to end this effect. -- Enchanted creature has haste. mana={1}{R} @@ -5249,13 +3960,6 @@ power=1 toughness=1 [/card] [card] -name=Ensouled Scimitar -text={3}: Ensouled Scimitar becomes a 1/5 Spirit artifact creature with flying until end of turn. (Equipment that's a creature can't equip a creature.) -- Equipped creature gets +1/+5. -- Equip {2} ({2}: Attach to target creature you control. Equip only as a sorcery.) -mana={3} -type=Artifact -subtype=Equipment -[/card] -[card] name=Entangler text=Enchant creature -- Enchanted creature can block any number of creatures. mana={2}{W}{W} @@ -5289,12 +3993,6 @@ power=4 toughness=4 [/card] [card] -name=Entreat the Angels -text=Put X 4/4 white Angel creature tokens with flying onto the battlefield. -- Miracle {X}{W}{W} (You may cast this card for its miracle cost when you draw it if it's the first card you drew this turn.) -mana={X}{X}{W}{W}{W} -type=Sorcery -[/card] -[card] name=Epic Experiment text=Exile the top X cards of your library. For each instant and sorcery card with converted mana cost X or less among them, you may cast that card without paying its mana cost. Then put all cards exiled this way that weren't cast into your graveyard. mana={X}{U}{R} @@ -5317,7 +4015,7 @@ toughness=1 [/card] [card] name=Equal Treatment -text=If any source would deal 1 or more damage to a creature or player this turn, it deals 2 damage to that creature or player instead. -- -- Draw a card. +text=If any source would deal 1 or more damage to a creature or player this turn, it deals 2 damage to that creature or player instead. -- Draw a card. mana={1}{W} type=Instant [/card] @@ -5341,16 +4039,8 @@ mana={2}{W} type=Instant [/card] [card] -name=Erebos's Titan -text=As long as your opponents control no creatures, Erebos's Titan has indestructible. (Damage and effects that say "destroy" don't destroy it.) -- Whenever a creature card leaves an opponent's graveyard, you may discard a card. If you do, return Erebos's Titan from your graveyard to your hand. -mana={1}{B}{B}{B} -type=Creature -subtype=Giant -power=5 -toughness=5 -[/card] -[card] name=Erosion +target=land text=Enchant land -- At the beginning of the upkeep of enchanted land's controller, destroy that land unless that player pays {1} or 1 life. mana={U}{U}{U} type=Enchantment @@ -5401,12 +4091,6 @@ power=6 toughness=6 [/card] [card] -name=Evasive Action -text=Domain — Counter target spell unless its controller pays {1} for each basic land type among lands you control. -mana={1}{U} -type=Instant -[/card] -[card] name=Everdream text=Draw a card. -- Splice onto instant or sorcery {2}{U} (As you cast an instant or sorcery spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) mana={1}{U} @@ -5493,38 +4177,19 @@ type=Sorcery [/card] [card] name=Excavation +auto={1}{S(land|myBattlefield)}:draw:1 opponent +auto={1}{S(land|myBattlefield)}:draw:1 controller text={1}, Sacrifice a land: Draw a card. Any player may activate this ability. mana={1}{U} type=Enchantment [/card] [card] -name=Excavator -text={T}, Sacrifice a basic land: Target creature gains landwalk of each of the land types of the sacrificed land until end of turn. -mana={2} -type=Artifact -[/card] -[card] -name=Excise -text=Exile target attacking creature unless its controller pays {X}. -mana={X}{W} -type=Instant -[/card] -[card] name=Exclusion Ritual text=Imprint — When Exclusion Ritual enters the battlefield, exile target nonland permanent. -- Players can't cast spells with the same name as the exiled card. mana={4}{W}{W} type=Enchantment [/card] [card] -name=Excruciator -text=Damage that would be dealt by Excruciator can't be prevented. -mana={6}{R}{R} -type=Creature -subtype=Avatar -power=7 -toughness=7 -[/card] -[card] name=Exhumer Thrull text=Haunt (When this creature dies, exile it haunting target creature.) -- When Exhumer Thrull enters the battlefield or the creature it haunts dies, return target creature card from your graveyard to your hand. mana={5}{B} @@ -5534,15 +4199,6 @@ power=3 toughness=3 [/card] [card] -name=Exiled Doomsayer -text=All morph costs cost {2} more. (This doesn't affect the cost to cast creature spells face down.) -mana={1}{W} -type=Creature -subtype=Human Cleric -power=1 -toughness=2 -[/card] -[card] name=Experiment Kraj text=Experiment Kraj has all activated abilities of each other creature with a +1/+1 counter on it. -- {T}: Put a +1/+1 counter on target creature. mana={2}{G}{G}{U}{U} @@ -5558,14 +4214,10 @@ mana={7}{U}{U} type=Sorcery [/card] [card] -name=Exquisite Archangel -abilities=flying -text=Flying -- If you would lose the game, instead exile Exquisite Archangel and your life total becomes equal to your starting life total. -mana={5}{W}{W} -type=Creature -subtype=Angel -power=5 -toughness=5 +name=Extinction Event +text=Choose odd or even. Exile each creature with converted mana cost of the chosen value. (Zero is even.) +mana={3}{B} +type=Sorcery [/card] [card] name=Extremely Slow Zombie @@ -5589,25 +4241,6 @@ mana={2}{B} type=Instant [/card] [card] -name=Eyekite -abilities=flying -text=Flying -- Eyekite gets +2/+0 as long as you've drawn two or more cards this turn. -mana={1}{U} -type=Creature -subtype=Drake -power=1 -toughness=2 -[/card] -[card] -name=Fa'adiyah Seer -text={T}: Draw a card and reveal it. If it isn't a land card, discard it. -mana={1}{G} -type=Creature -subtype=Human Shaman -power=1 -toughness=1 -[/card] -[card] name=Face of Divinity auto=teach(creature) 2/2 text=Enchant creature -- Enchanted creature gets +2/+2. -- As long as another Aura is attached to enchanted creature, it has first strike and lifelink. @@ -5634,28 +4267,15 @@ mana={3}{U} type=Instant [/card] [card] -name=Fade Away -text=For each creature, its controller sacrifices a permanent unless he or she pays {1}. -mana={2}{U} -type=Sorcery -[/card] -[card] name=Faerie Aerie text=Whenever you crank Faerie Aerie, create two 1/1 blue Faerie Spy creature tokens with flying, haste, and "Whenever this creature deals combat damage to a player, draw a card." Exile them at the beginning of the next end step. type=Artifact subtype=Contraption [/card] [card] -name=Fairgrounds Trumpeter -text=At the beginning of each end step, if a +1/+1 counter was placed on a permanent under your control this turn, put a +1/+1 counter on Fairgrounds Trumpeter. -mana={2}{G} -type=Creature -subtype=Elephant -power=2 -toughness=2 -[/card] -[card] name=Faith's Shield +auto=this(controllerlife > 5) ability$! choice name(protection from white) target(*|myBattlefield) protection from white ueot _ choice name(protection from blue) target(*|myBattlefield) protection from blue ueot _ choice name(protection from black) target(*|myBattlefield) protection from black ueot _ choice name(protection from red) target(*|myBattlefield) protection from red ueot _ choice name(protection from green) target(*|myBattlefield) protection from green ueot !$ controller +auto=this(controllerlife < 6) ability$! choice name(protection from white) all(*|myBattlefield) protection from white ueot _ choice name(protection from blue) all(*|myBattlefield) protection from blue ueot _ choice name(protection from black) all(*|myBattlefield) protection from black ueot _ choice name(protection from red) all(*|myBattlefield) protection from red ueot _ choice name(protection from green) all(*|myBattlefield) protection from green ueot !$ controller text=Target permanent you control gains protection from the color of your choice until end of turn. -- Fateful hour — If you have 5 or less life, instead you and each permanent you control gain protection from the color of your choice until end of turn. mana={W} type=Instant @@ -5676,12 +4296,6 @@ mana={2}{R} type=Sorcery [/card] [card] -name=Falling Timber -text=Kicker—Sacrifice a land. (You may sacrifice a land in addition to any other costs as you cast this spell.) -- Prevent all combat damage target creature would deal this turn. If Falling Timber was kicked, prevent all combat damage another target creature would deal this turn. -mana={2}{G} -type=Instant -[/card] -[card] name=False Dawn text=Until end of turn, spells and abilities you control that would add colored mana to your mana pool add that much white mana instead. Until end of turn, you may spend white mana as though it were mana of any color. -- -- Draw a card. mana={1}{W} @@ -5694,12 +4308,6 @@ mana={R} type=Instant [/card] [card] -name=Far // Away -text=Return target creature to its owner's hand. -- // -- Target player sacrifices a creature. -- -- Fuse (You may cast one or both halves of this card from your hand.) -mana={1}{U} // {2}{B} -type=Instant // Instant -[/card] -[card] name=Farewell to Arms text=As Farewell to Arms comes into play, choose a hand attached to an opponent's arm. -- When the chosen hand isn't behind its owner's back, sacrifice Farewell to Arms. If you do, that player discards his or her hand . . . of cards. (The lawyers wouldn't let us do it the other way.) mana={1}{B}{B} @@ -7204,6 +5812,16 @@ mana={4} type=Artifact [/card] [card] +name=Gomazoa +abilities=defender,flying +text=Defender, flying -- {T}: Put Gomazoa and each creature it's blocking on top of their owners' libraries, then those players shuffle their libraries. +mana={2}{U} +type=Creature +subtype=Jellyfish +power=0 +toughness=3 +[/card] +[card] name=Gonti, Lord of Luxury abilities=deathtouch text=Deathtouch -- When Gonti, Lord of Luxury enters the battlefield, look at the top four cards of target opponent's library, exile one of them face down, then put the rest on the bottom of that library in a random order. For as long as that card remains exiled, you may look at it, you may cast it, and you may spend mana as though it were mana of any type to cast it. @@ -7237,6 +5855,15 @@ mana={W}{W} type=Enchantment [/card] [card] +name=Gyruda, Doom of Depths +text=Companion — Your starting deck contains only cards with even converted mana costs. (If this card is your chosen companion, you may cast it once from outside the game.) -- When Gyruda enters the battlefield, each player puts the top four cards of their library into their graveyard. Put a creature card with an even converted mana cost from among those cards onto the battlefield under your control. +mana={4}{UB}{UB} +type=Legendary Creature +subtype=Demon Kraken +power=6 +toughness=6 +[/card] +[card] name=Grab the Reins text=Choose one — -- • Until end of turn, you gain control of target creature and it gains haste. -- • Sacrifice a creature. Grab the Reins deals damage equal to that creature's power to target creature or player. -- Entwine {2}{R} (Choose both if you pay the entwine cost.) mana={3}{R} @@ -9270,6 +7897,15 @@ mana={5}{R} type=Sorcery [/card] [card] +name=Jegantha, the Wellspring +text=Companion — No card in your starting deck has more than one of the same mana symbol in its mana cost. (If this card is your chosen companion, you may cast it once from outside the game.) -- {T}: Add {W}{U}{B}{R}{G}. This mana can't be spent to pay generic mana costs. +mana={4}{RG} +type=Legendary Creature +subtype=Elemental Elk +power=5 +toughness=5 +[/card] +[card] name=Jeleva, Nephalia's Scourge abilities=flying text=Flying -- When Jeleva, Nephalia's Scourge enters the battlefield, each player exiles the top X cards of his or her library, where X is the amount of mana spent to cast Jeleva. -- Whenever Jeleva attacks, you may cast an instant or sorcery card exiled with it without paying its mana cost. @@ -9435,6 +8071,15 @@ mana={B}{B}{B} type=Instant [/card] [card] +name=Kaheera, the Orphanguard +text=Companion — Each creature card in your starting deck is a Cat, Elemental, Nightmare, Dinosaur, or Beast card. (If this card is your chosen companion, you may cast it once from outside the game.) -- Vigilance -- Each other creature you control that's a Cat, Elemental, Nightmare, Dinosaur, or Beast gets +1/+1 and has vigilance. +mana={1}{GW}{GW} +type=Legendary Creature +subtype=Cat Beast +power=3 +toughness=2 +[/card] +[card] name=Kaho, Minamo Historian text=When Kaho, Minamo Historian enters the battlefield, search your library for up to three instant cards and exile them. Then shuffle your library. -- {X}, {T}: You may cast a card with converted mana cost X exiled with Kaho without paying its mana cost. mana={2}{U}{U} @@ -9561,6 +8206,15 @@ power=6 toughness=5 [/card] [card] +name=Keruga, the Macrosage +text=Companion — Your starting deck contains only cards with converted mana cost 3 or greater and land cards. (If this card is your chosen companion, you may cast it once from outside the game.) -- When Keruga, the Macrosage enters the battlefield, draw a card for each other permanent you control with converted mana cost 3 or greater. +mana={3}{GU}{GU} +type=Legendary Creature +subtype=Dinosaur Hippo +power=5 +toughness=4 +[/card] +[card] name=Kethis, the Hidden Hand text=Legendary spells you cast cost {1} less to cast. -- Exile two legendary cards from your graveyard: Until end of turn, each legendary card in your graveyard gains "You may play this card from your graveyard." mana={W}{B}{G} @@ -10204,6 +8858,15 @@ mana={X}{R} type=Sorcery [/card] [card] +name=Lavabrink Venturer +text=As Lavabrink Venturer enters the battlefield, choose odd or even. (Zero is even.) -- Lavabrink Venturer has protection from each converted mana cost of the chosen value. +mana={2}{W} +type=Creature +subtype=Human Soldier +power=3 +toughness=3 +[/card] +[card] name=Lazav, Dimir Mastermind abilities=opponentshroud text=Hexproof -- Whenever a creature card is put into an opponent's graveyard from anywhere, you may have Lazav, Dimir Mastermind become a copy of that card except its name is still Lazav, Dimir Mastermind, it's legendary in addition to its other types, and it gains hexproof and this ability. @@ -10675,6 +9338,24 @@ power=0 toughness=0 [/card] [card] +name=Lurrus of the Dream-Den +text=Companion — Each permanent card in your starting deck has converted mana cost 2 or less. (If this card is your chosen companion, you may cast it once from outside the game.) -- Lifelink -- During each of your turns, you may cast one permanent spell with converted mana cost 2 or less from your graveyard. +mana={1}{WB}{WB} +type=Legendary Creature +subtype=Cat Nightmare +power=3 +toughness=2 +[/card] +[card] +name=Lutri, the Spellchaser +text=Companion — Each nonland card in your starting deck has a different name. (If this card is your chosen companion, you may cast it once from outside the game.) -- Flash -- When Lutri, the Spellchaser enters the battlefield, if you cast it, copy target instant or sorcery spell you control. You may choose new targets for the copy. +mana={1}{UR}{UR} +type=Legendary Creature +subtype=Elemental Otter +power=3 +toughness=2 +[/card] +[card] name=Lyzolda, the Blood Witch text={2}, Sacrifice a creature: Lyzolda, the Blood Witch deals 2 damage to target creature or player if the sacrificed creature was red. Draw a card if the sacrificed creature was black. mana={1}{B}{R} @@ -11373,15 +10054,6 @@ type=Instant subtype=Trap [/card] [card] -name=Mindleecher -text=Mutate {4}{B} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- Flying -- Whenever this creature mutates, exile the top card of each opponent's library face down. You may look at and play those cards for as long as they remain exiled. -mana={4}{B}{B} -type=Creature -subtype=Nightmare -power=5 -toughness=5 -[/card] -[card] name=Mindlock Orb text=Players can't search libraries. mana={3}{U} @@ -11955,6 +10627,12 @@ type=Enchantment subtype=Aura [/card] [card] +name=Mythos of Snapdax +text=Each player chooses an artifact, a creature, an enchantment, and a planeswalker from among the nonland permanents they control, then sacrifices the rest. If {B}{R} was spent to cast this spell, you choose the permanents for each player instead. +mana={2}{W}{W} +type=Sorcery +[/card] +[card] name=Naar Isle text=At the beginning of your upkeep, put a flame counter on Naar Isle, then Naar Isle deals damage to you equal to the number of flame counters on it. -- Whenever you roll {C}, Naar Isle deals 3 damage to target player. type=Plane @@ -12557,6 +11235,15 @@ power=4 toughness=4 [/card] [card] +name=Obosh, the Preypiercer +text=Companion — Your starting deck contains only cards with odd converted mana costs and land cards. (If this card is your chosen companion, you may cast it once from outside the game.) -- If a source you control with an odd converted mana cost would deal damage to a permanent or player, it deals double that damage to that permanent or player instead. +mana={3}{BR}{BR} +type=Legendary Creature +subtype=Hellion Horror +power=3 +toughness=5 +[/card] +[card] name=Obscuring AEther text=Face-down creature spells you cast cost {1} less to cast. -- {1}{G}: Turn Obscuring AEther face down. (It becomes a 2/2 creature.) mana={G} @@ -12923,15 +11610,6 @@ power=1 toughness=1 [/card] [card] -name=Otrimi, the Ever-Playful -text=Mutate {1}{B}{G}{U} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- Trample -- Whenever this creature deals combat damage to a player, return target creature card with mutate from your graveyard to your hand. -mana={3}{B}{G}{U} -type=Legendary Creature -subtype=Nightmare Beast -power=6 -toughness=6 -[/card] -[card] name=Oubliette text=When Oubliette enters the battlefield, exile target creature and all Auras attached to it. Note the number and kind of counters that were on that creature. -- When Oubliette leaves the battlefield, return the exiled card to the battlefield under its owner's control tapped with the noted number and kind of counters on it. If you do, return the exiled Aura cards to the battlefield under their owner's control attached to that permanent. mana={1}{B}{B} @@ -13704,6 +12382,18 @@ type=Plane subtype=Bolas’s Meditation Realm [/card] [card] +name=Portal Mage +abilities=flash +auto=phasealter(remove,combatphases,controller) +auto=nextphasealter(add,combatphases,controller,after) +text=Flash -- When Portal Mage enters the battlefield during the declare attackers step, you may reselect which player or planeswalker target attacking creature is attacking. (It can’t attack its controller or its controller’s planeswalkers.) +mana={2}{U} +type=Creature +subtype=Human Wizard +Power=2 +toughness=2 +[/card] +[card] name=Possibility Storm text=Whenever a player casts a spell from his or her hand, that player exiles it, then exiles cards from the top of his or her library until he or she exiles a card that shares a card type with it. That player may cast that card without paying its mana cost. Then he or she puts all cards exiled with Possibility Storm on the bottom of his or her library in a random order. mana={3}{R}{R} @@ -13753,12 +12443,6 @@ mana={G}{G} type=Enchantment [/card] [card] -name=Pox -text=Each player loses a third of his or her life, then discards a third of the cards in his or her hand, then sacrifices a third of the creatures he or she controls, then sacrifices a third of the lands he or she controls. Round up each time. -mana={B}{B}{B} -type=Sorcery -[/card] -[card] name=Praetor's Grasp text=Search target opponent's library for a card and exile it face down. Then that player shuffles his or her library. You may look at and play that card for as long as it remains exiled. mana={1}{B}{B} @@ -14509,14 +13193,6 @@ name=Rebirth text=Remove Rebirth from your deck before playing if you're not playing for ante. -- -- Each player may put the top card of his or her library into the ante. If a player does, his or her life total becomes 20. mana={3}{G}{G}{G} type=Sorcery -name=Gomazoa -abilities=defender,flying -text=Defender, flying -- {T}: Put Gomazoa and each creature it's blocking on top of their owners' libraries, then those players shuffle their libraries. -mana={2}{U} -type=Creature -subtype=Jellyfish -power=0 -toughness=3 [/card] [card] name=Rebound @@ -15601,15 +14277,6 @@ mana={W} type=Instant [/card] [card] -name=Sawtusk Demolisher -text=Mutate {3}{G} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- Trample -- Whenever this creature mutates, destroy target noncreature permanent. Its controller creates a 3/3 green Beast creature token. -mana={4}{G}{G} -type=Creature -subtype=Beast -power=6 -toughness=6 -[/card] -[card] name=Scab-Clan Giant text=When Scab-Clan Giant enters the battlefield, it fights target creature an opponent controls chosen at random. mana={4}{R}{G} @@ -17139,15 +15806,6 @@ type=Instant subtype=Arcane [/card] [card] -name=Souvenir Snatcher -text=Mutate {5}{U} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.) -- Flying -- Whenever this creature mutates, gain control of target noncreature artifact. -mana={4}{U} -type=Creature -subtype=Bird -power=4 -toughness=4 -[/card] -[card] name=Sovereign's Realm text=(Start the game with this conspiracy face up in the command zone.) -- Your deck can't have basic land cards and your starting hand size is five. -- Exile a card from your hand: This turn, you may play basic land cards from outside the game. -- Basic lands you control have "{T}: Add one mana of any color to your mana pool." type=Conspiracy @@ -18204,15 +16862,6 @@ type=Artifact subtype=Equipment [/card] [card] -name=Surgeon General Commander -text=Whenever you augment, enchant, or mutate a creature you control, draw a card. -- {T}: Add {W}, {U}, {B}, {R}, or {G}. -mana={3}{G} -type=Legendary Creature -subtype=Wombat Bat Chameleon -power=3 -toughness=3 -[/card] -[card] name=Surrender Your Thoughts text=When you set this scheme in motion, target opponent chooses self or others. If that player chooses self, he or she discards four cards. If the player chooses others, each of your other opponents discards two cards. type=Scheme @@ -18776,6 +17425,12 @@ power=0 toughness=0 [/card] [card] +name=The Ozolith +text=Whenever a creature you control leaves the battlefield, if it had counters on it, put those counters on The Ozolith. -- At the beginning of combat on your turn, if The Ozolith has counters on it, you may move all counters from The Ozolith onto target creature. +mana={1} +type=Legendary Artifact +[/card] +[card] name=The Pieces Are Coming Together text=When you set this scheme in motion, draw two cards. Artifact spells you cast this turn cost {2} less to cast. type=Scheme @@ -19537,6 +18192,15 @@ power=2 toughness=2 [/card] [card] +name=Umori, the Collector +text=Companion — Each nonland card in your starting deck shares a card type. (If this card is your chosen companion, you may cast it once from outside the game.) -- As Umori, the CollectorUmori, the Collector enters the battlefield, choose a card type. -- Spells you cast of the chosen type cost 1 less to cast. +mana={2}{BG}{BG} +type=Legendary Creature +subtype=Ooze +power=4 +toughness=5 +[/card] +[card] name=Unblinking Bleb text=Morph {2}{U} (You may cast this face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) -- Whenever Unblinking Bleb or another permanent is turned face up, you may scry 2. (To scry 2, look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) mana={3}{U} @@ -19609,6 +18273,12 @@ mana={2}{G} type=Instant [/card] [card] +name=Unpredictable Cyclone +text=If a cycling ability of another nonland card would cause you to draw a card, instead exile cards from the top of your library until you exile a card that shares a card type with the cycled card. You may cast that card without paying its mana cost. Then put the exiled cards that weren't cast this way on the bottom of your library in a random order. -- Cycling {2} ({2}, Discard this card: Draw a card.) +mana={3}{R}{R} +type=Enchantment +[/card] +[card] name=Unsettled Mariner abilities=changeling auto=@targeted(*|mybattlefield) from(*|opponentbattlefield,opponenthand,opponentstack,opponentgraveyard,opponentexile,opponentlibrary):transforms((,newability[pay[[{1}]] name(pay 1 mana) donothing?fizzle])) forever @@ -20184,15 +18854,6 @@ power=4 toughness=4 [/card] [card] -name=Voracious Reader -text={T}: Add {C} to your mana pool. Spend this mana only to cast an instant or sorcery spell. -- At the beginning of your upkeep, if there are three or more instant and/or sorcery cards in your graveyard, transform Curious Homunculus. -mana={1}{U} -type=Creature -subtype=Homunculus -power=1 -toughness=1 -[/card] -[card] name=Voracious Vacuum text=When this creature enters the battlefield, put a +1/+1 counter on target creature. mana={3} @@ -21036,6 +19697,15 @@ mana={3}{R}{R} type=Enchantment [/card] [card] +name=Yorion, Sky Nomad +text=Companion — Your starting deck contains at least twenty cards more than the minimum deck size. (If this card is your chosen companion, you may cast it once from outside the game.) -- Flying -- When Yorion enters the battlefield, exile any number of other nonland permanents you own and control. Return those cards to the battlefield at the beginning of the next end step. +mana={3}{WU}{WU} +type=Legendary Creature +subtype=Bird Serpent +power=4 +toughness=5 +[/card] +[card] name=Yosei, the Morning Star abilities=flying text=Flying -- When Yosei, the Morning Star dies, target player skips his or her next untap step. Tap up to five target permanents that player controls. @@ -21132,6 +19802,15 @@ power=2 toughness=2 [/card] [card] +name=Zirda, the Dawnwaker +text=Companion — Each permanent card in your starting deck has an activated ability. (If this card is your chosen companion, you may cast it once from outside the game.) -- Abilities you activate that aren't mana abilities cost {2} less to activate. This effect can't reduce the mana in that cost to less than one mana. -- {1}, {T}: Target creature can't block this turn. +mana={1}{RW}{RW} +type=Legendary Creature +subtype=Elemental Fox +power=3 +toughness=3 +[/card] +[card] name=Zombie Fanboy text=As Zombie Fanboy comes into play, choose an artist. -- Whenever a permanent by the chosen artist is put into a graveyard, put two +1/+1 counters on Zombie Fanboy. mana={2}{B} diff --git a/projects/mtg/build.number.properties b/projects/mtg/build.number.properties index 2eb721c07..807a5918c 100644 --- a/projects/mtg/build.number.properties +++ b/projects/mtg/build.number.properties @@ -1,6 +1,6 @@ #build.number.properties (normally this file is maintained by build.xml) -#Sun, 06 May 2012 11:56:35 -0700 +#Sun, 20 May 2020 11:56:35 +0200 build.major=0 -build.minor=20 -build.point=1 +build.minor=22 +build.point=3 diff --git a/projects/mtg/build.xml b/projects/mtg/build.xml index 8582f163a..2fcb00611 100644 --- a/projects/mtg/build.xml +++ b/projects/mtg/build.xml @@ -63,6 +63,7 @@ This file was auto-generated by ant build script on ${TODAY} To make changes please edit the ant build script, otherwise your changes will be lost Author: Michael Nguyen +Mod by: Vitty85 */ @@ -73,7 +74,6 @@ Author: Michael Nguyen #define WAGIC_VERSION_MAJOR ${build.major} #define WAGIC_VERSION_MEDIUM ${build.minor} #define WAGIC_VERSION_MINOR ${build.point} -#define WAGIC_VERSION_REVISION ${env.TRAVIS_BUILD_NUMBER} #define VERSION_DOT(a, b, c, d) a ##.## b ##.## c ##.## d #define VERSION_WITHOUT_DOT(a, b, c) a ## b ## c @@ -82,12 +82,12 @@ Author: Michael Nguyen #define VERSION_TOSTRING(a) #a #define VERSION_STRINGIFY(a) VERSION_TOSTRING(a) -#define WAGIC_VERSION VERSION_GAME(WAGIC_VERSION_MAJOR, WAGIC_VERSION_MEDIUM, WAGIC_VERSION_MINOR, WAGIC_VERSION_REVISION) +#define WAGIC_VERSION VERSION_GAME(WAGIC_VERSION_MAJOR, WAGIC_VERSION_MEDIUM, WAGIC_VERSION_MINOR) #define WAGIC_RESOURCE_VERSION VERSION_FILE(WAGIC_VERSION_MAJOR, WAGIC_VERSION_MEDIUM, WAGIC_VERSION_MINOR) #define WAGIC_VERSION_STRING VERSION_STRINGIFY(WAGIC_VERSION) #define WAGIC_CORE_VERSION_STRING "core_" VERSION_STRINGIFY(WAGIC_RESOURCE_VERSION) -#define WAGIC_RESOURCE_NAME "Wagic-core.zip" -#define WAGIC_RELEASE_NAME "${env.RELEASE_NAME}" +#define WAGIC_RESOURCE_NAME "Wagic-core-" VERSION_STRINGIFY(WAGIC_RESOURCE_VERSION) ".zip" +#define WAGIC_RELEASE_NAME "wagic-v" WAGIC_VERSION_STRING #define WAGIC_RESOURCE_URL "https://github.com/WagicProject/wagic/releases/download/" WAGIC_RELEASE_NAME "/" WAGIC_RESOURCE_NAME #endif diff --git a/projects/mtg/include/AllAbilities.h b/projects/mtg/include/AllAbilities.h index 238a98f49..fa2450033 100644 --- a/projects/mtg/include/AllAbilities.h +++ b/projects/mtg/include/AllAbilities.h @@ -178,6 +178,8 @@ private: intValue = 0; bool halfup = false; bool halfdown = false; + bool thirdup = false; + bool thirddown = false; bool twice = false; bool thrice = false; bool other = false;//othertype:[subtype] @@ -218,6 +220,18 @@ private: size_t hD = s.find("halfdown"); s.erase(hD,hD + 8); } + if(s.find("thirdup") != string::npos) + { + thirdup = true; + size_t tU = s.find("thirdup"); + s.erase(tU,tU + 7); + } + if(s.find("thirddown") != string::npos) + { + thirddown = true; + size_t tD = s.find("thirddown"); + s.erase(tD,tD + 9); + } if(s.find("twice") != string::npos) { twice = true; @@ -328,6 +342,10 @@ private: { intValue = target->equipment; } + else if (s == "mutations") + { + intValue = target->mutation; + } else if (s == "colors") { intValue = target->countColors(); @@ -560,6 +578,14 @@ private: { intValue = card->controller()->opponent()->energyCount; } + else if (s == "pyidarocount") + { + intValue = card->controller()->yidaroCount; + } + else if (s == "oyidarocount") + { + intValue = card->controller()->opponent()->yidaroCount; + } else if (s == "praidcount") { intValue = card->controller()->raidcount; @@ -1047,6 +1073,16 @@ private: } if (halfdown) intValue = intValue / 2; + + if (thirdup) + { + if (intValue % 3 > 0) + intValue = (intValue / 3) + 1; + else + intValue = intValue / 3; + } + if (thirddown) + intValue = intValue / 3; } if (twice) intValue = intValue * 2; @@ -1613,6 +1649,29 @@ public: } }; +class TrCardMutated: public Trigger +{ +public: + bool thiscontroller, thisopponent; + TrCardMutated(GameObserver* observer, int id, MTGCardInstance * source, TargetChooser * tc,bool once = false) : + Trigger(observer, id, source,once, tc) + { + } + + int triggerOnEventImpl(WEvent * event) + { + WEventCardMutated * e = dynamic_cast (event); + if (!e) return 0; + if (!tc->canTarget(e->card)) return 0; + return 1; + } + + TrCardMutated * clone() const + { + return NEW TrCardMutated(*this); + } +}; + class TrCardSacrificed: public Trigger { public: @@ -3045,6 +3104,8 @@ public: int addToGame() { + if(!ability) + return 1; //Fix a possible crash on mutate cards ability->forceDestroy = -1; ability->target = target; //Might have changed since initialization ability->addToGame(); @@ -3762,6 +3823,7 @@ public: int unequip(); int equip(MTGCardInstance * equipped); + int mutate(MTGCardInstance * mutated); int resolve(); const string getMenuText(); @@ -4696,6 +4758,19 @@ public: AAAlterEnergy * clone() const; ~AAAlterEnergy(); }; +//Yidaro Counter +class AAAlterYidaroCount: public ActivatedAbilityTP +{ +public: + int yidarocount; + + AAAlterYidaroCount(GameObserver* observer, int _id, MTGCardInstance * _source, Targetable * _target, int yidarocount, ManaCost * _cost = NULL, + int who = TargetChooser::UNSET); + int resolve(); + const string getMenuText(); + AAAlterYidaroCount * clone() const; + ~AAAlterYidaroCount(); +}; /* Standard Damager, can choose a NEW target each time the price is paid */ class TADamager: public TargetAbility { @@ -4808,7 +4883,8 @@ public: bool retarget; bool reequip; bool newhook; - AANewTarget(GameObserver* observer, int id, MTGCardInstance * card, MTGCardInstance * _target,bool retarget = false, ManaCost * _cost = NULL, bool reequip = false, bool newhook = false); +int mutation; + AANewTarget(GameObserver* observer, int id, MTGCardInstance * card, MTGCardInstance * _target,bool retarget = false, ManaCost * _cost = NULL, bool reequip = false, bool newhook = false, int mutation = 0); int resolve(); const string getMenuText(); AANewTarget * clone() const; @@ -6959,7 +7035,8 @@ public: bool noEvent; bool putinplay; bool asNormalMadness; - AACastCard(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target,bool restricted,bool copied,bool _asNormal,string nameCard,string abilityName,bool _noEvent, bool putinplay,bool asNormalMadness = false); + bool alternative; + AACastCard(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target,bool restricted,bool copied,bool _asNormal,string nameCard,string abilityName,bool _noEvent, bool putinplay,bool asNormalMadness = false,bool alternative = false); int testDestroy(){return 0;}; void Update(float dt); diff --git a/projects/mtg/include/MTGAbility.h b/projects/mtg/include/MTGAbility.h index c00d527df..ec38bf4e0 100644 --- a/projects/mtg/include/MTGAbility.h +++ b/projects/mtg/include/MTGAbility.h @@ -176,6 +176,7 @@ public: virtual ostream& toString(ostream& out) const; virtual int addToGame(); virtual int removeFromGame(); + static vector deletedpointers; /*Poor man's casting */ /* Todo replace that crap with dynamic casting */ diff --git a/projects/mtg/include/MTGCardInstance.h b/projects/mtg/include/MTGCardInstance.h index 77760f9ea..e69ee6854 100644 --- a/projects/mtg/include/MTGCardInstance.h +++ b/projects/mtg/include/MTGCardInstance.h @@ -62,6 +62,7 @@ public: int frozen; int sunburst; int equipment; + int mutation; int auras; bool wasDealtDamage; bool combatdamageToOpponent; diff --git a/projects/mtg/include/MTGDefinitions.h b/projects/mtg/include/MTGDefinitions.h index a8f382a8d..6ce27b836 100644 --- a/projects/mtg/include/MTGDefinitions.h +++ b/projects/mtg/include/MTGDefinitions.h @@ -281,7 +281,9 @@ class Constants TOTEMARMOR = 155, DISCARDTOPLAYBYOPPONENT = 156, MODULAR = 157, - NB_BASIC_ABILITIES = 158, + MUTATE = 158, + ADVENTURE = 159, + NB_BASIC_ABILITIES = 160, RARITY_S = 'S', //Special Rarity RARITY_M = 'M', //Mythics diff --git a/projects/mtg/include/Player.h b/projects/mtg/include/Player.h index c578e0edf..7de089a51 100644 --- a/projects/mtg/include/Player.h +++ b/projects/mtg/include/Player.h @@ -43,6 +43,7 @@ public: int extraTurn; int drawCounter; int energyCount; + int yidaroCount; int epic; int forcefield; int dealsdamagebycombat; diff --git a/projects/mtg/include/ThisDescriptor.h b/projects/mtg/include/ThisDescriptor.h index 62d913d5d..67a2e4b0b 100644 --- a/projects/mtg/include/ThisDescriptor.h +++ b/projects/mtg/include/ThisDescriptor.h @@ -77,6 +77,14 @@ class ThisOpponentlife:public ThisDescriptor{ ThisOpponentlife * clone() const; }; +class ThisMutation:public ThisDescriptor{ + public: + virtual int match(MTGCardInstance * card); + + ThisMutation(int mutation); + ThisMutation * clone() const; +}; + class ThisEquip:public ThisDescriptor{ public: virtual int match(MTGCardInstance * card); diff --git a/projects/mtg/include/WEvent.h b/projects/mtg/include/WEvent.h index 7a6cda611..619d4229c 100644 --- a/projects/mtg/include/WEvent.h +++ b/projects/mtg/include/WEvent.h @@ -72,7 +72,7 @@ struct WEventLife : public WEvent { Player * player; int amount; MTGCardInstance * source; - WEventLife(Player * player,int amount, MTGCardInstance * source); + WEventLife(Player * player, int amount, MTGCardInstance * source); virtual Targetable * getTarget(int target); }; @@ -351,6 +351,12 @@ struct WEventplayerEnergized : public WEvent { virtual Targetable * getTarget(Player * player); }; +//mutation event +struct WEventCardMutated : public WEventCardUpdate { + WEventCardMutated(MTGCardInstance * card); + virtual Targetable * getTarget(int target); +}; + std::ostream& operator<<(std::ostream&, const WEvent&); #endif diff --git a/projects/mtg/include/Wagic_Version.h b/projects/mtg/include/Wagic_Version.h index 7edb1fdad..1f431c0dd 100644 --- a/projects/mtg/include/Wagic_Version.h +++ b/projects/mtg/include/Wagic_Version.h @@ -4,6 +4,7 @@ This file was auto-generated by ant build script on Sat, 26-Oct-2013 23::59:07 To make changes please edit the ant build script, otherwise your changes will be lost Author: Michael Nguyen +Mod by: Vitty85 */ @@ -13,7 +14,7 @@ Author: Michael Nguyen /* Wagic versions */ #define WAGIC_VERSION_MAJOR 0 #define WAGIC_VERSION_MEDIUM 22 -#define WAGIC_VERSION_MINOR 2 +#define WAGIC_VERSION_MINOR 3 #define VERSION_DOT(a, b, c) a ##.## b ##.## c #define VERSION_WITHOUT_DOT(a, b, c) a ## b ## c diff --git a/projects/mtg/src/AllAbilities.cpp b/projects/mtg/src/AllAbilities.cpp index bba1647e2..277e8e413 100644 --- a/projects/mtg/src/AllAbilities.cpp +++ b/projects/mtg/src/AllAbilities.cpp @@ -1023,6 +1023,44 @@ AAAlterPoison::~AAAlterPoison() { } +//AA Yidaro Count +AAAlterYidaroCount::AAAlterYidaroCount(GameObserver* observer, int _id, MTGCardInstance * _source, Targetable * _target, int yidarocount, ManaCost * _cost, + int who) : + ActivatedAbilityTP(observer, _id, _source, _target, _cost, who), yidarocount(yidarocount) +{ +} + +int AAAlterYidaroCount::resolve() +{ + Damageable * _target = (Damageable *) getTarget(); + if (_target) + { + Player * pTarget = (Player*)_target; + if(pTarget) + { + pTarget->yidaroCount += yidarocount; + if(pTarget->yidaroCount < 0) + pTarget->yidaroCount = 0; + } + } + return 0; +} + +const string AAAlterYidaroCount::getMenuText() +{ + WParsedInt parsedNum(yidarocount); + return _(parsedNum.getStringValue() + " Yidaro Cycling Counter ").c_str(); +} + +AAAlterYidaroCount * AAAlterYidaroCount::clone() const +{ + return NEW AAAlterYidaroCount(*this); +} + +AAAlterYidaroCount::~AAAlterYidaroCount() +{ +} + //AA Energy Counters AAAlterEnergy::AAAlterEnergy(GameObserver* observer, int _id, MTGCardInstance * _source, Targetable * _target, int energy, ManaCost * _cost, int who) : @@ -3168,8 +3206,8 @@ AAFrozen * AAFrozen::clone() const } // chose a new target for an aura or enchantment and equip it note: VERY basic right now. -AANewTarget::AANewTarget(GameObserver* observer, int id, MTGCardInstance * card, MTGCardInstance * _target,bool retarget, ManaCost * _cost, bool reequip, bool newhook) : -ActivatedAbility(observer, id, card, _cost, 0),retarget(retarget),reequip(reequip),newhook(newhook) +AANewTarget::AANewTarget(GameObserver* observer, int id, MTGCardInstance * card, MTGCardInstance * _target,bool retarget, ManaCost * _cost, bool reequip, bool newhook, int mutation) : +ActivatedAbility(observer, id, card, _cost, 0),retarget(retarget),reequip(reequip),newhook(newhook),mutation(mutation) { target = _target; } @@ -3182,7 +3220,7 @@ int AANewTarget::resolve() _target = source; source = (MTGCardInstance *) target; } - if (_target && !reequip) + if (_target && !reequip && !mutation) { while (_target->next) _target = _target->next; @@ -3219,7 +3257,7 @@ int AANewTarget::resolve() } } - if (_target && _target->currentZone == _target->controller()->game->battlefield && reequip) + if (_target && _target->currentZone == _target->controller()->game->battlefield && reequip && !mutation) { if(!newhook) { @@ -3254,6 +3292,53 @@ int AANewTarget::resolve() source = _target; } } + if (_target && _target->currentZone == _target->controller()->game->battlefield && mutation > 0) + { + _target = source; + source = (MTGCardInstance *) target; + for (size_t i = 1; i < game->mLayers->actionLayer()->mObjects.size(); i++) + { + MTGAbility * a = ((MTGAbility *) game->mLayers->actionLayer()->mObjects[i]); + AEquip * eq = dynamic_cast (a); + if (eq && eq->source == _target) + { + uint8_t sourceoldcolors = source->colors; // Read the original colors before mutation + uint8_t _targetoldcolors = _target->colors; + ((AEquip*)a)->mutate(source); // hook the cards one each other + source->colors = sourceoldcolors; // Restore the original colors after the mutation + if(mutation == 1){ + int deltapower = source->getPower() - source->origpower; // keep counters and power/toughness increasement + int deltatoughness = source->getToughness() - source->origtoughness; + source->origpower = _target->origpower; + source->origtoughness = _target->origtoughness; + source->basepower = _target->basepower; + source->basetoughness = _target->basetoughness; + source->setPower(_target->getPower() + deltapower); + source->setToughness(_target->getToughness() + deltatoughness); + source->colors = _targetoldcolors; // The mutated card gain all colors from the parent + std::string oldname = source->getName(); // The mutated card swap its name with the parent + source->setName(_target->getName()); + _target->setName(oldname); + for (int i = ((int)source->types.size())-1; i >= 0; --i) // The mutated card looses all its types + if(source->types[i] != 1) + source->removeType(source->types[i]); + for (int i = 0; i < ((int)_target->types.size()); i++) // The mutated card gains all the types of the source card + if(_target->types[i] != 1) + source->addType(_target->types[i]); + if(source->types[0] == 1 && source->types[1] == 7){ // Fix order for Legendary Creatures + source->types[0] = 7; + source->types[1] = 1; + } + } + _target->colors = 0; // The parent card loose all its colors + for (int i = ((int)_target->types.size())-1; i >= 0; --i) // The parent card looses all types and becomes a dummy Mutated type + _target->removeType(_target->types[i]); + _target->setType("Mutated"); + } + } + target = source; + source = _target; + } return 1; } @@ -5389,10 +5474,16 @@ IfThenAbility * IfThenAbility::clone() const IfThenAbility::~IfThenAbility() { - SAFE_DELETE(delayedAbility); - SAFE_DELETE(delayedElseAbility); + if(delayedAbility && (std::find(deletedpointers.begin(), deletedpointers.end(), delayedAbility) == deletedpointers.end())) { + deletedpointers.push_back(delayedAbility); // Fix to avoid crash on May abilities nested in IfThenElse Abilities. + SAFE_DELETE(delayedAbility); + } + if(delayedElseAbility && (std::find(deletedpointers.begin(), deletedpointers.end(), delayedElseAbility) == deletedpointers.end())) { + deletedpointers.push_back(delayedElseAbility); // Fix to avoid crash on May abilities nested in IfThenElse Abilities. + SAFE_DELETE(delayedElseAbility); + } } -// + //May Abilities MayAbility::MayAbility(GameObserver* observer, int _id, MTGAbility * _ability, MTGCardInstance * _source, bool must,string _cond) : MTGAbility(observer, _id, _source), NestedAbility(_ability), must(must), Cond(_cond) @@ -6336,8 +6427,8 @@ int ATransformer::destroy() { for (unsigned int i = 0;i < newAbilities[_target].size(); i++) { - // The primitives Dead Presence probabily causes a double free error and a crash in Wagic, so for now it has been exluded... - if(newAbilities[_target].at(i) && strcmp(_target->name.c_str(),"Dread Presence")) + // The primitives Dead Presence and the mutated cards probably cause a double free error and a crash in Wagic, so for now they have been exluded... + if(newAbilities[_target].at(i) && strcmp(_target->name.c_str(),"Dread Presence") && !_target->mutation) { newAbilities[_target].at(i)->forceDestroy = 1; newAbilities[_target].at(i)->removeFromGame(); @@ -6884,9 +6975,10 @@ int AProduceMana::receiveEvent(WEvent * event) int AProduceMana::produce() { if(ManaDescription == "selectmana") - {//I tried menu ability and vector to have a shorter code but it crashes wagic at end of turn... - //The may ability on otherhand works but the ability is cumulative... - //This must be wrapped on menuability so we can use it on successions... + { + //I tried menu ability and vector to have a shorter code but it crashes wagic at end of turn... + //The may ability on otherhand works but the ability is cumulative... + //This must be wrapped on menuability so we can use it on successions... AManaProducer *ap0 = NEW AManaProducer(game, game->mLayers->actionLayer()->getMaxId(), source, source->controller(), ManaCost::parseManaCost(mana[0],NULL,source), NULL, 0,"",false); MayAbility *mw0 = NEW MayAbility(game, game->mLayers->actionLayer()->getMaxId(), ap0, source,true); MTGAbility *ga0 = NEW GenericAddToGame(game, game->mLayers->actionLayer()->getMaxId(), source,NULL,mw0); @@ -8091,11 +8183,47 @@ int AEquip::equip(MTGCardInstance * equipped) return 1; } +int AEquip::mutate(MTGCardInstance * mutated) +{ + source->target = mutated; + source->target->mutation += 1; + source->mutation += 1; + source->parentCards.push_back(mutated); + source->target->childrenCards.push_back((MTGCardInstance*)source); + AbilityFactory af(game); + af.getAbilities(¤tAbilities, NULL, source); + for (size_t i = 0; i < currentAbilities.size(); ++i) + { + MTGAbility * a = currentAbilities[i]; + if (dynamic_cast (a)) continue; + if (dynamic_cast (a)) continue; + if (dynamic_cast (a)) continue; + if (dynamic_cast (af.getCoreAbility(a))) continue; + if (a->aType == MTGAbility::STANDARD_TOKENCREATOR && a->oneShot) + { + a->forceDestroy = 1; + continue; + } + if (dynamic_cast (af.getCoreAbility(a))) + { + a->forceDestroy = 1; + continue; + } + //we generally dont want to pass oneShot tokencreators to the cards + //we mutate... + a->addToGame(); + } + WEvent * e = NEW WEventCardMutated(mutated); + source->getObserver()->receiveEvent(e); // triggers the @mutated event for any other listener. + return 1; +} + int AEquip::resolve() { MTGCardInstance * mTarget = tc->getNextCardTarget(); if (!mTarget) return 0; if (mTarget == source) return 0; + if (source->mutation) return 0; // No need to unequip mutation cards. unequip(); equip(mTarget); return 1; @@ -8111,6 +8239,9 @@ const string AEquip::getMenuText() int AEquip::testDestroy() { + if(source->mutation) // No need to unequip mutation cards. + return 0; + if (source->target && !game->isInPlay(source->target)) //unequip();//testfix for equipment when the card it equip moves to other battlefield if (!game->connectRule) @@ -8123,6 +8254,8 @@ int AEquip::testDestroy() int AEquip::destroy() { + if(source->mutation) // No need to unequip mutation cards. + return 0; unequip(); return TargetAbility::destroy(); } @@ -8133,8 +8266,8 @@ AEquip * AEquip::clone() const } // casting a card for free, or casting a copy of a card. -AACastCard::AACastCard(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target,bool _restricted,bool _copied,bool asNormal,string _namedCard,string _name,bool _noEvent,bool putinplay,bool madness) : - MTGAbility(observer, _id, _source),restricted(_restricted),asCopy(_copied),normal(asNormal),cardNamed(_namedCard),nameThis(_name),noEvent(_noEvent),putinplay(putinplay), asNormalMadness(madness) +AACastCard::AACastCard(GameObserver* observer, int _id, MTGCardInstance * _source, MTGCardInstance * _target,bool _restricted,bool _copied,bool asNormal,string _namedCard,string _name,bool _noEvent,bool putinplay,bool madness, bool alternative) : + MTGAbility(observer, _id, _source),restricted(_restricted),asCopy(_copied),normal(asNormal),cardNamed(_namedCard),nameThis(_name),noEvent(_noEvent),putinplay(putinplay), asNormalMadness(madness), alternative(alternative) { target = _target; andAbility = NULL; @@ -8397,7 +8530,7 @@ int AACastCard::resolveSpell() copy =_target->controller()->game->putInZone(_target, _target->currentZone, source->controller()->game->stack,noEvent); copy->changeController(source->controller(),true); if(asNormalMadness) - copy->MadnessPlay = true; + copy->MadnessPlay = true; } else { @@ -8407,6 +8540,8 @@ int AACastCard::resolveSpell() copy =_target->controller()->game->putInZone(_target, _target->currentZone, source->controller()->game->stack,noEvent); copy->changeController(source->controller(),true); } + if(alternative) + copy->alternateCostPaid[ManaCost::MANA_PAID_WITH_ALTERNATIVE] = 1; if (game->targetChooser) { game->targetChooser->Owner = source->controller(); diff --git a/projects/mtg/src/CardGui.cpp b/projects/mtg/src/CardGui.cpp index d63c14079..cd04f9fd3 100644 --- a/projects/mtg/src/CardGui.cpp +++ b/projects/mtg/src/CardGui.cpp @@ -851,7 +851,7 @@ void CardGui::AlternateRender(MTGCard * card, const Pos& pos) } } else { for (unsigned int i = 0; i < card->data->types.size() - 1; i++) - { + { s += _(MTGAllCards::findType(card->data->types[i])); if(!strcmp(_(MTGAllCards::findType(card->data->types[i])).c_str(),"Creature") || !strcmp(_(MTGAllCards::findType(card->data->types[i])).c_str(),"Land")) s += _(" - "); @@ -1152,7 +1152,7 @@ void CardGui::TinyCropRender(MTGCard * card, const Pos& pos, JQuad * quad) } } else { for (unsigned int i = 0; i < card->data->types.size() - 1; i++) - { + { s += _(MTGAllCards::findType(card->data->types[i])); if(!strcmp(_(MTGAllCards::findType(card->data->types[i])).c_str(),"Creature") || !strcmp(_(MTGAllCards::findType(card->data->types[i])).c_str(),"Land")) s += _(" - "); @@ -1276,7 +1276,7 @@ void CardGui::RenderBig(MTGCard* card, const Pos& pos, bool thumb, bool noborder string cardsetname = setlist[card->setId].c_str(); /*if(!noborder) { - if(cardsetname == "2ED"||cardsetname == "RV"||cardsetname == "4ED"||cardsetname == "5ED"||cardsetname == "6ED"||cardsetname == "7ED"||cardsetname == "8ED"||cardsetname == "9ED"||cardsetname == "CHR"||cardsetname == "DM") + if(cardsetname == "2ED"||cardsetname == "RV"||cardsetname == "4ED"||cardsetname == "5ED"||cardsetname == "6ED"||cardsetname == "7ED"||cardsetname == "8ED"||cardsetname == "9ED"||cardsetname == "S00"||cardsetname == "S99"||cardsetname == "PTK"||cardsetname == "BTD"||cardsetname == "ATH"||cardsetname == "BRB"||cardsetname == "CHR"||cardsetname == "DM") {//Draw white border renderer->FillRoundRect((pos.actX - (pos.actZ * 84.f))-11.5f,(pos.actY - (pos.actZ * 119.7f))-14.f,pos.actZ * 168.f + 6.5f,pos.actZ * 239.4f + 12.f,8.f,ARGB(255,248,248,255)); renderer->DrawRoundRect((pos.actX - (pos.actZ * 84.f))-11.5f,(pos.actY - (pos.actZ * 119.7f))-14.f,pos.actZ * 168.f + 6.5f,pos.actZ * 239.4f + 12.f,8.f,ARGB(150,20,20,20)); @@ -1299,7 +1299,7 @@ void CardGui::RenderBig(MTGCard* card, const Pos& pos, bool thumb, bool noborder //universal border if(options[Options::SHOWBORDER].number) { - if((cardsetname == "2ED"||cardsetname == "RV"||cardsetname == "4ED"||cardsetname == "5ED"||cardsetname == "6ED"||cardsetname == "7ED"||cardsetname == "8ED"||cardsetname == "9ED"||cardsetname == "CHR"||cardsetname == "DM") + if((cardsetname == "2ED"||cardsetname == "RV"||cardsetname == "4ED"||cardsetname == "5ED"||cardsetname == "6ED"||cardsetname == "7ED"||cardsetname == "8ED"||cardsetname == "9ED"||cardsetname == "S00"||cardsetname == "S99"||cardsetname == "PTK"||cardsetname == "BTD"||cardsetname == "ATH"||cardsetname == "BRB"||cardsetname == "CHR"||cardsetname == "DM") && !options[Options::BLKBORDER].number) {//white border renderer->FillRoundRect(pos.actX - (scale * quad->mWidth / 2)-6.f,pos.actY - (scale * quad->mHeight / 2)-5.8f, (scale * quad->mWidth)-0.02f, (scale * quad->mHeight)-0.02f, 5.8f,ARGB(255,248,248,255)); diff --git a/projects/mtg/src/ExtraCost.cpp b/projects/mtg/src/ExtraCost.cpp index 0311a1f3d..c9e48f72c 100644 --- a/projects/mtg/src/ExtraCost.cpp +++ b/projects/mtg/src/ExtraCost.cpp @@ -189,7 +189,7 @@ int SnowCost::doPay() result += source->controller()->snowManaC; if (result) { - // Avoided double payments for Snow Mana cost + // Avoided double payments for Snow Mana cost if (source->controller()->snowManaC && source->controller()->getManaPool()->canAfford(ManaCost::parseManaCost("{1}",NULL,source))) { //source->controller()->getManaPool()->pay(ManaCost::parseManaCost("{1}",NULL,source)); diff --git a/projects/mtg/src/GameObserver.cpp b/projects/mtg/src/GameObserver.cpp index 74b2c0b69..14017c260 100644 --- a/projects/mtg/src/GameObserver.cpp +++ b/projects/mtg/src/GameObserver.cpp @@ -788,7 +788,7 @@ void GameObserver::gameStateBasedEffects() else if((!card->target->isLand() && card->hasType("fortification"))) ((AEquip*)a)->unequip(); } - if(card->controller()) + if(card->controller() && !card->mutation) ((AEquip*)a)->getActionTc()->Owner = card->controller(); //fix for equip ability when the equipment changed controller... } @@ -1406,9 +1406,9 @@ bool GameObserver::WaitForExtraPayment(MTGCardInstance * card) mExtraPayment = NULL; } result = true; - // Avoid game stucks on current phase till snow mana cost will be paid - if(mExtraPayment && mExtraPayment->costs.size() == 1 && !strcmp(mExtraPayment->costs[0]->mCostRenderString.c_str(), "Snow Mana")) - result = false; + // Avoid game stucks on current phase till snow mana cost will be paid + if(mExtraPayment && mExtraPayment->costs.size() == 1 && !strcmp(mExtraPayment->costs[0]->mCostRenderString.c_str(), "Snow Mana")) + result = false; } return result; diff --git a/projects/mtg/src/GameStateAwards.cpp b/projects/mtg/src/GameStateAwards.cpp index b838d7517..8135e0c20 100644 --- a/projects/mtg/src/GameStateAwards.cpp +++ b/projects/mtg/src/GameStateAwards.cpp @@ -95,13 +95,19 @@ void GameStateAwards::Start() listview->Add(wgh); int locked = 0; - for (int i = 0; i < setlist.size(); i++) + + vector > orderedSet; + for(int i = 0; i < setlist.size(); i++){ + sprintf(buf, "%s", setlist[i].c_str()); + orderedSet.push_back(pair (setlist.getInfo(i)->getName(), buf)); + } + sort(orderedSet.begin(),orderedSet.end()); + for (unsigned int i = 0; i < orderedSet.size(); i++) { - MTGSetInfo * si = setlist.getInfo(i); + MTGSetInfo * si = setlist.getInfo(setlist.findSet(orderedSet.at(i).second)); if (!si) continue; - if (!options[Options::optionSet(i)].number) - { + if (!options[Options::optionSet(setlist.findSet(orderedSet.at(i).second))].number){ locked++; continue; } @@ -119,9 +125,9 @@ void GameStateAwards::Start() else sprintf(buf, _("%s: %i cards.").c_str(), si->author.c_str(), si->totalCards()); - aw = NEW WGuiAward(Options::optionSet(i), si->getName(), buf, "Card Spoiler"); + aw = NEW WGuiAward(Options::optionSet(setlist.findSet(orderedSet.at(i).second)), si->getName(), buf, "Card Spoiler"); aw->mFlags = WGuiItem::NO_TRANSLATE; - btn = NEW WGuiButton(aw, GUI_AWARD_BUTTON, Options::optionSet(i), this); + btn = NEW WGuiButton(aw, GUI_AWARD_BUTTON, Options::optionSet(setlist.findSet(orderedSet.at(i).second)), this); listview->Add(btn); } if (locked) diff --git a/projects/mtg/src/GameStateDuel.cpp b/projects/mtg/src/GameStateDuel.cpp index f01c982ae..0dad314fd 100644 --- a/projects/mtg/src/GameStateDuel.cpp +++ b/projects/mtg/src/GameStateDuel.cpp @@ -364,6 +364,8 @@ void GameStateDuel::End() #ifdef TESTSUITE SAFE_DELETE(testSuite); #endif + + MTGAbility::deletedpointers.clear(); // Clear the list of deallocated pointer. } //TODO Move This to utils or ResourceManager. Don't we have more generic functions that can do that? diff --git a/projects/mtg/src/GameStateOptions.cpp b/projects/mtg/src/GameStateOptions.cpp index 91b55add0..0a9d6ecf4 100644 --- a/projects/mtg/src/GameStateOptions.cpp +++ b/projects/mtg/src/GameStateOptions.cpp @@ -58,7 +58,7 @@ void GameStateOptions::Start() optionsList->Add(NEW WGuiHeader("Card Display Options")); optionsList->Add(NEW OptionInteger(Options::SHOWBORDER, "Show Borders")); //black border - optionsList->Add(NEW OptionInteger(Options::BLKBORDER, "All Black Border")); + optionsList->Add(NEW OptionInteger(Options::BLKBORDER, "All Black Borders")); //show tokens in editor optionsList->Add(NEW OptionInteger(Options::SHOWTOKENS, "Show Tokens in Editor")); WDecoStyled * wMisc = NEW WDecoStyled(NEW WGuiHeader("Warning!!!")); @@ -258,9 +258,9 @@ void GameStateOptions::Render() "", "Dev Team:", "Abrasax, Almosthumane, Daddy32, DJardin, Dr.Solomat,", - "J, Jeck, kevlahnota, Leungclj, linshier, Mootpoint,", - "Mnguyen, Ph34rbot, Psyringe, Rolzad73, Salmelo, Superhiro,", - "Vitty85, Wololo, Yeshua, Zethfox", + "J, Jeck, kevlahnota, Leungclj, linshier, Mootpoint,", + "Mnguyen, Ph34rbot, Psyringe, Rolzad73, Salmelo, Superhiro,", + "Vitty85, Wololo, Yeshua, Zethfox", "", "Music by Celestial Aeon Project, http://www.jamendo.com", "", diff --git a/projects/mtg/src/MTGAbility.cpp b/projects/mtg/src/MTGAbility.cpp index abe868d60..35f17db10 100644 --- a/projects/mtg/src/MTGAbility.cpp +++ b/projects/mtg/src/MTGAbility.cpp @@ -1169,6 +1169,10 @@ TriggeredAbility * AbilityFactory::parseTrigger(string s, string, int id, Spell if (TargetChooser * tc = parseSimpleTC(s, "drawn", card)) return NEW TrcardDrawn(observer, id, card, tc,once); + //Card is mutated + if (TargetChooser * tc = parseSimpleTC(s, "mutated", card)) + return NEW TrCardMutated(observer, id, card, tc,once); + //Card is sacrificed if (TargetChooser * tc = parseSimpleTC(s, "sacrificed", card)) return NEW TrCardSacrificed(observer, id, card, tc,once); @@ -3128,6 +3132,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG bool asNormalMadness = splitCastCard[1].find("madness") != string::npos; bool sendNoEvent = splitCastCard[1].find("noevent") != string::npos; bool putinplay = splitCastCard[1].find("putinplay") != string::npos; + bool alternative = splitCastCard[1].find("alternative") != string::npos; string nameCard = ""; if(splitCastCard[1].find("named!:") != string::npos) { @@ -3137,7 +3142,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG nameCard = splitCastName[1]; } } - MTGAbility *a = NEW AACastCard(observer, id, card, target,withRestrictions,asCopy,asNormal,nameCard,newName,sendNoEvent,putinplay, asNormalMadness); + MTGAbility *a = NEW AACastCard(observer, id, card, target,withRestrictions,asCopy,asNormal,nameCard,newName,sendNoEvent,putinplay, asNormalMadness, alternative); a->oneShot = false; if(splitCastCard[1].find("trigger[to]") != string::npos) { @@ -3278,6 +3283,38 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG return a; } + //alter yidaro counter + vector splitYidaroCounter = parseBetween(s, "alteryidarocount:", " ", false); + if (splitYidaroCounter.size()) + { + int yidarocount = atoi(splitYidaroCounter[1].c_str()); + Targetable * t = spell ? spell->getNextTarget() : NULL; + MTGAbility * a = NEW AAAlterYidaroCount(observer, id, card, t, yidarocount, NULL, who); + a->oneShot = 1; + return a; + } + + //alter mutation counter on target card with trigger activation + vector splitMutated = parseBetween(s, "altermutationcounter:", " ", false); + if (splitMutated.size()) + { + card->mutation += atoi(splitMutated[1].c_str()); + WEvent * e = NEW WEventCardMutated(card); + card->getObserver()->receiveEvent(e); + } + + //set mutation counter on source card with no trigger activation + vector splitMutatedOver = parseBetween(s, "mutationover:", " ", false); + if (splitMutatedOver.size()) + { + card->mutation += atoi(splitMutatedOver[1].c_str()); + } + vector splitMutatedUnder = parseBetween(s, "mutationunder:", " ", false); + if (splitMutatedUnder.size()) + { + card->mutation += atoi(splitMutatedUnder[1].c_str()); + } + //prevent next damage vector splitPrevent = parseBetween(s, "prevent:", " ", false); if (splitPrevent.size()) @@ -4174,6 +4211,14 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG return a; } + //get a new target for muatations + if ((s.find("mutateover") != string::npos) || s.find("mutateunder") != string::npos) + { + MTGAbility * a = NEW AANewTarget(observer, id, card,target, false,NULL,false,false,(s.find("mutateover") != string::npos)?1:2); + a->oneShot = 1; + return a; + } + //morph found = s.find("morph"); if (found != string::npos) @@ -4687,8 +4732,8 @@ int AbilityFactory::abilityEfficiency(MTGAbility * a, Player * p, int mode, Targ badAbilities[(int)Constants::NOLIFEGAINOPPONENT] = true; badAbilities[(int)Constants::MUSTBLOCK] = true; badAbilities[(int)Constants::FLYERSONLY] = true; - badAbilities[(int)Constants::TREASON] = true; - badAbilities[(int)Constants::SHACKLER] = true; + badAbilities[(int)Constants::TREASON] = true; + badAbilities[(int)Constants::SHACKLER] = true; if (AInstantBasicAbilityModifierUntilEOT * abi = dynamic_cast(a)) { @@ -5539,6 +5584,8 @@ MTGAbility * AbilityFactory::getManaReduxAbility(string s, int id, Spell *, MTGC return NEW AAlterCost(observer, id, card, target, amount, color); } +vector MTGAbility::deletedpointers; + MTGAbility::MTGAbility(const MTGAbility& a): ActionElement(a) { //Todo get rid of menuText, it is only used as a placeholder in getMenuText, for something that could be a string @@ -6024,7 +6071,7 @@ int TargetAbility::reactToClick(MTGCardInstance * card) game->mExtraPayment = cost->extraCosts; return 0; } - + if (!tc) return 0; // Fix crash on mutating cards waitingForAnswer = 1; game->mLayers->actionLayer()->setCurrentWaitingAction(this); tc->initTargets(); @@ -6306,7 +6353,8 @@ void ListMaintainerAbility::updateTargets() { MTGCardInstance * card = (*it).first; cards.erase(card); - removed(card); + if(!card->mutation) // Fix crash on mutating card... + removed(card); } temp.clear(); //add New valid ones @@ -6426,7 +6474,8 @@ int ListMaintainerAbility::destroy() { MTGCardInstance * card = (*it).first; cards.erase(card); - removed(card); + if(!card->mutation) // Fix crash on mutating card... + removed(card); it = cards.begin(); } return 1; diff --git a/projects/mtg/src/MTGCardInstance.cpp b/projects/mtg/src/MTGCardInstance.cpp index 18190b8d6..2fe990845 100644 --- a/projects/mtg/src/MTGCardInstance.cpp +++ b/projects/mtg/src/MTGCardInstance.cpp @@ -237,6 +237,7 @@ void MTGCardInstance::initMTGCI() notblocked = 0; sunburst = 0; equipment = 0; + mutation = 0; auras = 0; combatdamageToOpponent = false; damageToOpponent = false; diff --git a/projects/mtg/src/MTGDefinitions.cpp b/projects/mtg/src/MTGDefinitions.cpp index 2de6d8da5..f7b6c509d 100644 --- a/projects/mtg/src/MTGDefinitions.cpp +++ b/projects/mtg/src/MTGDefinitions.cpp @@ -188,7 +188,9 @@ const char* Constants::MTGBasicAbilities[] = { "showopponenttoplibrary", "totemarmor", "discardtoplaybyopponent", - "modular" + "modular", + "mutate", //it can mutate + "adventure" //it can be adventure }; map Constants::MTGBasicAbilitiesMap; diff --git a/projects/mtg/src/MTGRules.cpp b/projects/mtg/src/MTGRules.cpp index ea2d901da..43108d730 100644 --- a/projects/mtg/src/MTGRules.cpp +++ b/projects/mtg/src/MTGRules.cpp @@ -782,12 +782,14 @@ int MTGAlternativeCostRule::isReactingToClick(MTGCardInstance * card, ManaCost * if(!allowedToAltCast(card,player)) return 0; - + if(card->has(Constants::ADVENTURE) && game->isInExile(card)) + return 0; // Advetures can't be alternate casted from exile. + alternativeName = "Pay Alternative Cost"; if(card->has(Constants::CANPLAYFROMGRAVEYARD) && game->isInGrave(card)) alternativeName = "Alternate Cast From Graveyard"; - else if(card->has(Constants::CANPLAYFROMEXILE) && game->isInExile(card)) + else if(card->has(Constants::CANPLAYFROMEXILE) && game->isInExile(card) && !card->has(Constants::ADVENTURE)) alternativeName = "Alternate Cast From Exile"; else if(card->canPlayFromLibrary() && game->isInLibrary(card)) alternativeName = "Alternate Cast From Library"; diff --git a/projects/mtg/src/Player.cpp b/projects/mtg/src/Player.cpp index 363a46cfd..2f8e79f16 100644 --- a/projects/mtg/src/Player.cpp +++ b/projects/mtg/src/Player.cpp @@ -35,6 +35,7 @@ Player::Player(GameObserver *observer, string file, string fileSmall, MTGDeck * extraTurn = 0; drawCounter = 0; energyCount = 0; + yidaroCount = 0; epic = 0; forcefield = 0; dealsdamagebycombat = 0; diff --git a/projects/mtg/src/Rules.cpp b/projects/mtg/src/Rules.cpp index 226f4923b..8961002f1 100644 --- a/projects/mtg/src/Rules.cpp +++ b/projects/mtg/src/Rules.cpp @@ -598,6 +598,7 @@ void Rules::initGame(GameObserver *g, bool currentPlayerSet) p->damageCount = initState.playerData[i].player->damageCount; p->preventable = initState.playerData[i].player->preventable; p->energyCount = initState.playerData[i].player->energyCount; + p->yidaroCount = initState.playerData[i].player->yidaroCount; if (initState.playerData[i].player->mAvatarName.size()) { p->mAvatarName = initState.playerData[i].player->mAvatarName; diff --git a/projects/mtg/src/ThisDescriptor.cpp b/projects/mtg/src/ThisDescriptor.cpp index 82966f636..03f31e444 100644 --- a/projects/mtg/src/ThisDescriptor.cpp +++ b/projects/mtg/src/ThisDescriptor.cpp @@ -145,6 +145,18 @@ ThisDescriptor * ThisDescriptorFactory::createThisDescriptor(GameObserver* obser return NULL; } + //mutations + found = s.find("mutations"); + if (found != string::npos) + { + ThisMutation * td = NEW ThisMutation(criterion); + if (td) + { + td->comparisonMode = mode; + return td; + } + return NULL; + } //equips and auras found = s.find("gear");//still same meaning, better wording to word conflict with MTGAbility equip. if (found != string::npos) @@ -513,6 +525,20 @@ ThisPower* ThisPower::clone() const return NEW ThisPower(*this); } +ThisMutation::ThisMutation(int mutation) +{ + comparisonCriterion = mutation; +} +int ThisMutation::match(MTGCardInstance * card) +{ + return matchValue(card->mutation); +} + +ThisMutation* ThisMutation::clone() const +{ + return NEW ThisMutation(*this); +} + ThisEquip::ThisEquip(int equipment) { comparisonCriterion = equipment; diff --git a/projects/mtg/src/WEvent.cpp b/projects/mtg/src/WEvent.cpp index 5a4f36d78..f26509437 100644 --- a/projects/mtg/src/WEvent.cpp +++ b/projects/mtg/src/WEvent.cpp @@ -286,6 +286,11 @@ WEventplayerEnergized::WEventplayerEnergized(Player * player, int nb_count) : player(player), nb_count(nb_count) { } + +WEventCardMutated::WEventCardMutated(MTGCardInstance * card) : + WEventCardUpdate(card) +{ +} ; Targetable * WEventDamage::getTarget(int target) @@ -484,6 +489,12 @@ Targetable * WEventCardCopiedACard::getTarget(int target) return NULL; } +Targetable * WEventCardMutated::getTarget(int target) +{ + if (target) return card; + return NULL; +} + Targetable * WEventplayerEnergized::getTarget(Player * player) { if (player) return player; diff --git a/projects/mtg/src/WGui.cpp b/projects/mtg/src/WGui.cpp index 1607554de..3d42e8904 100644 --- a/projects/mtg/src/WGui.cpp +++ b/projects/mtg/src/WGui.cpp @@ -1345,7 +1345,7 @@ void WGuiAward::Underlay() } if (!trophy.get()) //Fallback to basic trophy image. - trophy = WResourceManager::Instance()->RetrieveTempQuad("trophy.png"); + trophy = WResourceManager::Instance()->RetrieveTempQuad("trophy.png"); #endif if (trophy.get()) @@ -2215,11 +2215,15 @@ void WGuiFilterItem::updateValue() else if (filterType == FILTER_SET) { char buf[512]; - for (int i = 0; i < setlist.size(); i++) - { + vector > orderedSet; + for(int i = 0; i < setlist.size(); i++){ if (options[Options::optionSet(i)].number == 0) continue; sprintf(buf, "s:%s;", setlist[i].c_str()); - mParent->addArg((setlist.getInfo(i))->getName(), buf); + orderedSet.push_back(pair (setlist.getInfo(i)->getName(), buf)); + } + sort(orderedSet.begin(),orderedSet.end()); + for (unsigned int i = 0; i < orderedSet.size(); i++){ + mParent->addArg(orderedSet.at(i).first, orderedSet.at(i).second); } } else if (filterType == FILTER_ALPHA)