Moved images from cardforge.org to cardforge.link and added missing sets/some product images.

This commit is contained in:
Krazy
2015-06-01 03:44:10 +00:00
parent cceee98a0d
commit 5886f43f8b
179 changed files with 2019 additions and 2101 deletions

1
.gitattributes vendored
View File

@@ -16308,7 +16308,6 @@ forge-gui/res/lists/net-decks-commander.txt -text
forge-gui/res/lists/net-decks.txt -text
forge-gui/res/lists/precon-images.txt svneol=native#text/plain
forge-gui/res/lists/quest-opponent-icons.txt svneol=native#text/plain
forge-gui/res/lists/quest-pet-shop-icons.txt svneol=native#text/plain
forge-gui/res/lists/quest-pet-token-images.txt svneol=native#text/plain
forge-gui/res/lists/token-images.txt svneol=native#text/plain
forge-gui/res/lists/tournamentpack-images.txt svneol=native#text/plain

View File

@@ -1,14 +1,12 @@
package forge.util;
import org.apache.commons.lang3.StringUtils;
import forge.ImageKeys;
import forge.StaticData;
import forge.card.CardDb;
import forge.card.CardRules;
import forge.card.CardSplitType;
import forge.item.PaperCard;
import forge.util.Base64Coder;
import org.apache.commons.lang3.StringUtils;
public class ImageUtil {
public static float getNearestHQSize(float baseSize, float actualSize) {
@@ -34,16 +32,16 @@ public class ImageUtil {
return null;
}
StringBuilder s = new StringBuilder();
CardRules card = cp.getRules();
String edition = cp.getEdition();
s.append(toMWSFilename(nameToUse));
final int cntPictures;
final boolean hasManyPictures;
final CardDb db = !card.isVariant() ? StaticData.instance().getCommonCards() : StaticData.instance().getVariantCards();
if (includeSet) {
cntPictures = db.getPrintCount(card.getName(), edition);
cntPictures = db.getPrintCount(card.getName(), edition);
hasManyPictures = cntPictures > 1;
} else {
// without set number of pictures equals number of urls provided in Svar:Picture
@@ -54,27 +52,27 @@ public class ImageUtil {
int maxCntPictures = db.getMaxPrintCount(card.getName());
hasManyPictures = maxCntPictures > 1;
}
int artIdx = cp.getArtIndex() - 1;
if (hasManyPictures) {
if ( cntPictures <= artIdx ) // prevent overflow
artIdx = cntPictures == 0 ? 0 : artIdx % cntPictures;
s.append(artIdx + 1);
}
// for whatever reason, MWS-named plane cards don't have the ".full" infix
if (!card.getType().isPlane() && !card.getType().isPhenomenon()) {
s.append(".full");
}
final String fname;
String fname;
if (isDownloadUrl) {
s.append(".jpg");
fname = Base64Coder.encodeString(s.toString(), true);
fname = s.toString().replaceAll("\\s", "%20");
} else {
fname = s.toString();
}
if (includeSet) {
String editionAliased = isDownloadUrl ? StaticData.instance().getEditions().getCode2ByCode(edition) : ImageKeys.getSetFolder(edition);
return String.format("%s/%s", editionAliased, fname);
@@ -85,15 +83,15 @@ public class ImageUtil {
public static boolean hasBackFacePicture(PaperCard cp) {
CardSplitType cst = cp.getRules().getSplitType();
return cst == CardSplitType.Transform || cst == CardSplitType.Flip;
return cst == CardSplitType.Transform || cst == CardSplitType.Flip;
}
public static String getNameToUse(PaperCard cp, boolean backFace) {
final CardRules card = cp.getRules();
if (backFace ) {
if ( hasBackFacePicture(cp) )
if ( hasBackFacePicture(cp) )
return card.getOtherPart().getName();
else
else
return null;
} else if(CardSplitType.Split == cp.getRules().getSplitType()) {
return card.getMainPart().getName() + card.getOtherPart().getName();
@@ -101,17 +99,17 @@ public class ImageUtil {
return cp.getName();
}
}
public static String getImageKey(PaperCard cp, boolean backFace, boolean includeSet) {
return getImageRelativePath(cp, backFace, includeSet, false);
}
public static String getDownloadUrl(PaperCard cp, boolean backFace) {
return getImageRelativePath(cp, backFace, true, true);
}
}
public static String toMWSFilename(String in) {
final StringBuffer out = new StringBuffer();
final StringBuilder out = new StringBuilder();
char c;
for (int i = 0; i < in.length(); i++) {
c = in.charAt(i);

View File

@@ -17,18 +17,8 @@
*/
package forge.gui;
import java.io.File;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.TreeMap;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import forge.card.CardEdition;
import forge.card.CardRules;
import forge.item.IPaperCard;
@@ -37,9 +27,15 @@ import forge.model.FModel;
import forge.properties.ForgeConstants;
import forge.util.FileUtil;
import forge.util.ImageUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import java.io.File;
import java.util.*;
public class ImportSourceAnalyzer {
public static enum OpType {
public enum OpType {
CONSTRUCTED_DECK,
DRAFT_DECK,
PLANAR_DECK,
@@ -57,74 +53,75 @@ public class ImportSourceAnalyzer {
DB_FILE
}
public static interface AnalysisCallback {
public interface AnalysisCallback {
boolean checkCancel();
void addOp(OpType type, File src, File dest);
void addOp(OpType type, File src, File dest);
}
private final File _source;
private final AnalysisCallback _cb;
private final int _numFilesToAnalyze;
private final File source;
private final AnalysisCallback cb;
private final int numFilesToAnalyze;
private int _numFilesAnalyzed;
private int numFilesAnalyzed;
public ImportSourceAnalyzer(final String source, final AnalysisCallback cb) {
_source = new File(source);
_cb = cb;
_numFilesToAnalyze = _countFiles(_source);
this.source = new File(source);
this.cb = cb;
numFilesToAnalyze = countFiles(this.source);
}
public int getNumFilesToAnalyze() { return _numFilesToAnalyze; }
public int getNumFilesAnalyzed() { return _numFilesAnalyzed; }
public int getNumFilesToAnalyze() { return numFilesToAnalyze; }
public int getNumFilesAnalyzed() { return numFilesAnalyzed; }
public void doAnalysis() {
_identifyAndAnalyze(_source);
identifyAndAnalyze(this.source);
}
private void _identifyAndAnalyze(final File root) {
private void identifyAndAnalyze(final File root) {
// see if we can figure out the likely identity of the source folder and
// dispatch to the best analysis subroutine to handle it
final String dirname = root.getName();
if ("res".equalsIgnoreCase(dirname)) { _analyzeOldResDir(root); }
else if ("constructed".equalsIgnoreCase(dirname)) { _analyzeConstructedDeckDir(root); }
else if ("draft".equalsIgnoreCase(dirname)) { _analyzeDraftDeckDir(root); }
else if ("plane".equalsIgnoreCase(dirname) || "planar".equalsIgnoreCase(dirname)) { _analyzePlanarDeckDir(root); }
else if ("scheme".equalsIgnoreCase(dirname)) { _analyzeSchemeDeckDir(root); }
else if ("sealed".equalsIgnoreCase(dirname)) { _analyzeSealedDeckDir(root); }
else if (StringUtils.containsIgnoreCase(dirname, "deck")) { _analyzeDecksDir(root); }
else if ("gauntlet".equalsIgnoreCase(dirname)) { _analyzeGauntletDataDir(root); }
else if ("layouts".equalsIgnoreCase(dirname)) { _analyzeLayoutsDir(root); }
else if ("pics".equalsIgnoreCase(dirname)) { _analyzeCardPicsDir(root); }
else if ("pics_product".equalsIgnoreCase(dirname)) { _analyzeProductPicsDir(root); }
else if ("preferences".equalsIgnoreCase(dirname)) { _analyzePreferencesDir(root); }
else if ("quest".equalsIgnoreCase(dirname)) { _analyzeQuestDir(root); }
else if (null != FModel.getMagicDb().getEditions().get(dirname)) { _analyzeCardPicsSetDir(root); }
if ("res".equalsIgnoreCase(dirname)) { analyzeOldResDir(root); }
else if ("constructed".equalsIgnoreCase(dirname)) { analyzeConstructedDeckDir(root); }
else if ("draft".equalsIgnoreCase(dirname)) { analyzeDraftDeckDir(root); }
else if ("plane".equalsIgnoreCase(dirname) || "planar".equalsIgnoreCase(dirname)) { analyzePlanarDeckDir(root); }
else if ("scheme".equalsIgnoreCase(dirname)) { analyzeSchemeDeckDir(root); }
else if ("sealed".equalsIgnoreCase(dirname)) { analyzeSealedDeckDir(root); }
else if (StringUtils.containsIgnoreCase(dirname, "deck")) { analyzeDecksDir(root); }
else if ("gauntlet".equalsIgnoreCase(dirname)) { analyzeGauntletDataDir(root); }
else if ("layouts".equalsIgnoreCase(dirname)) { analyzeLayoutsDir(root); }
else if ("pics".equalsIgnoreCase(dirname)) { analyzeCardPicsDir(root); }
else if ("pics_product".equalsIgnoreCase(dirname)) { analyzeProductPicsDir(root); }
else if ("preferences".equalsIgnoreCase(dirname)) { analyzePreferencesDir(root); }
else if ("quest".equalsIgnoreCase(dirname)) { analyzeQuestDir(root); }
else if (null != FModel.getMagicDb().getEditions().get(dirname)) { analyzeCardPicsSetDir(root); }
else {
// look at files in directory and make a semi-educated guess based on file extensions
int numUnhandledFiles = 0;
for (final File file : root.listFiles()) {
if (_cb.checkCancel()) { return; }
File[] files = root.listFiles();
assert files != null;
for (final File file : files) {
if (cb.checkCancel()) { return; }
if (file.isFile()) {
final String filename = file.getName();
if (StringUtils.endsWithIgnoreCase(filename, ".dck")) {
_analyzeDecksDir(root);
analyzeDecksDir(root);
numUnhandledFiles = 0;
break;
} else if (StringUtils.endsWithIgnoreCase(filename, ".jpg")) {
_analyzeCardPicsDir(root);
analyzeCardPicsDir(root);
numUnhandledFiles = 0;
break;
}
++numUnhandledFiles;
} else if (file.isDirectory()) {
_identifyAndAnalyze(file);
identifyAndAnalyze(file);
}
}
_numFilesAnalyzed += numUnhandledFiles;
numFilesAnalyzed += numUnhandledFiles;
}
}
@@ -132,24 +129,25 @@ public class ImportSourceAnalyzer {
// pre-profile res dir
//
private void _analyzeOldResDir(final File root) {
_analyzeDir(root, new _Analyzer() {
@Override boolean onDir(final File dir) {
private void analyzeOldResDir(final File root) {
analyzeDir(root, new Analyzer() {
@Override
boolean onDir(final File dir) {
final String dirname = dir.getName();
if ("decks".equalsIgnoreCase(dirname)) {
_analyzeDecksDir(dir);
analyzeDecksDir(dir);
} else if ("gauntlet".equalsIgnoreCase(dirname)) {
_analyzeGauntletDataDir(dir);
analyzeGauntletDataDir(dir);
} else if ("layouts".equalsIgnoreCase(dirname)) {
_analyzeLayoutsDir(dir);
analyzeLayoutsDir(dir);
} else if ("pics".equalsIgnoreCase(dirname)) {
_analyzeCardPicsDir(dir);
analyzeCardPicsDir(dir);
} else if ("pics_product".equalsIgnoreCase(dirname)) {
_analyzeProductPicsDir(dir);
analyzeProductPicsDir(dir);
} else if ("preferences".equalsIgnoreCase(dirname)) {
_analyzePreferencesDir(dir);
analyzePreferencesDir(dir);
} else if ("quest".equalsIgnoreCase(dirname)) {
_analyzeQuestDir(dir);
analyzeQuestDir(dir);
} else {
return false;
}
@@ -162,74 +160,78 @@ public class ImportSourceAnalyzer {
// decks
//
private void _analyzeDecksDir(final File root) {
_analyzeDir(root, new _Analyzer() {
@Override void onFile(final File file) {
private void analyzeDecksDir(final File root) {
analyzeDir(root, new Analyzer() {
@Override
void onFile(final File file) {
// we don't really expect any files in here, but if we find a .dck file, add it to the unknown list
final String filename = file.getName();
if (StringUtils.endsWithIgnoreCase(filename, ".dck")) {
final File targetFile = new File(_lcaseExt(filename));
_cb.addOp(OpType.UNKNOWN_DECK, file, targetFile);
final File targetFile = new File(lcaseExt(filename));
cb.addOp(OpType.UNKNOWN_DECK, file, targetFile);
}
}
@Override boolean onDir(final File dir) {
@Override
boolean onDir(final File dir) {
final String dirname = dir.getName();
if ("constructed".equalsIgnoreCase(dirname)) {
_analyzeConstructedDeckDir(dir);
analyzeConstructedDeckDir(dir);
} else if ("cube".equalsIgnoreCase(dirname)) {
return false;
} else if ("draft".equalsIgnoreCase(dirname)) {
_analyzeDraftDeckDir(dir);
analyzeDraftDeckDir(dir);
} else if ("plane".equalsIgnoreCase(dirname) || "planar".equalsIgnoreCase(dirname)) {
_analyzePlanarDeckDir(dir);
analyzePlanarDeckDir(dir);
} else if ("scheme".equalsIgnoreCase(dirname)) {
_analyzeSchemeDeckDir(dir);
analyzeSchemeDeckDir(dir);
} else if ("sealed".equalsIgnoreCase(dirname)) {
_analyzeSealedDeckDir(dir);
analyzeSealedDeckDir(dir);
} else {
_analyzeKnownDeckDir(dir, null, OpType.UNKNOWN_DECK);
analyzeKnownDeckDir(dir, null, OpType.UNKNOWN_DECK);
}
return true;
}
});
}
private void _analyzeConstructedDeckDir(final File root) {
_analyzeKnownDeckDir(root, ForgeConstants.DECK_CONSTRUCTED_DIR, OpType.CONSTRUCTED_DECK);
private void analyzeConstructedDeckDir(final File root) {
analyzeKnownDeckDir(root, ForgeConstants.DECK_CONSTRUCTED_DIR, OpType.CONSTRUCTED_DECK);
}
private void _analyzeDraftDeckDir(final File root) {
_analyzeKnownDeckDir(root, ForgeConstants.DECK_DRAFT_DIR, OpType.DRAFT_DECK);
private void analyzeDraftDeckDir(final File root) {
analyzeKnownDeckDir(root, ForgeConstants.DECK_DRAFT_DIR, OpType.DRAFT_DECK);
}
private void _analyzePlanarDeckDir(final File root) {
_analyzeKnownDeckDir(root, ForgeConstants.DECK_PLANE_DIR, OpType.PLANAR_DECK);
private void analyzePlanarDeckDir(final File root) {
analyzeKnownDeckDir(root, ForgeConstants.DECK_PLANE_DIR, OpType.PLANAR_DECK);
}
private void _analyzeSchemeDeckDir(final File root) {
_analyzeKnownDeckDir(root, ForgeConstants.DECK_SCHEME_DIR, OpType.SCHEME_DECK);
private void analyzeSchemeDeckDir(final File root) {
analyzeKnownDeckDir(root, ForgeConstants.DECK_SCHEME_DIR, OpType.SCHEME_DECK);
}
private void _analyzeSealedDeckDir(final File root) {
_analyzeKnownDeckDir(root, ForgeConstants.DECK_SEALED_DIR, OpType.SEALED_DECK);
private void analyzeSealedDeckDir(final File root) {
analyzeKnownDeckDir(root, ForgeConstants.DECK_SEALED_DIR, OpType.SEALED_DECK);
}
private void _analyzeKnownDeckDir(final File root, final String targetDir, final OpType opType) {
_analyzeDir(root, new _Analyzer() {
@Override void onFile(final File file) {
private void analyzeKnownDeckDir(final File root, final String targetDir, final OpType opType) {
analyzeDir(root, new Analyzer() {
@Override
void onFile(final File file) {
final String filename = file.getName();
if (StringUtils.endsWithIgnoreCase(filename, ".dck")) {
final File targetFile = new File(targetDir, _lcaseExt(filename));
final File targetFile = new File(targetDir, lcaseExt(filename));
if (!file.equals(targetFile)) {
_cb.addOp(opType, file, targetFile);
cb.addOp(opType, file, targetFile);
}
}
}
@Override boolean onDir(final File dir) {
@Override
boolean onDir(final File dir) {
// if there's a dir beneath a known directory, assume the same kind of decks are in there
_analyzeKnownDeckDir(dir, targetDir, opType);
analyzeKnownDeckDir(dir, targetDir, opType);
return true;
}
});
@@ -239,15 +241,16 @@ public class ImportSourceAnalyzer {
// gauntlet
//
private void _analyzeGauntletDataDir(final File root) {
_analyzeDir(root, new _Analyzer() {
@Override void onFile(final File file) {
private void analyzeGauntletDataDir(final File root) {
analyzeDir(root, new Analyzer() {
@Override
void onFile(final File file) {
// find *.dat files, but exclude LOCKED_*
final String filename = file.getName();
if (StringUtils.endsWithIgnoreCase(filename, ".dat") && !filename.startsWith("LOCKED_")) {
final File targetFile = new File(ForgeConstants.GAUNTLET_DIR.userPrefLoc, _lcaseExt(filename));
final File targetFile = new File(ForgeConstants.GAUNTLET_DIR.userPrefLoc, lcaseExt(filename));
if (!file.equals(targetFile)) {
_cb.addOp(OpType.GAUNTLET_DATA, file, targetFile);
cb.addOp(OpType.GAUNTLET_DATA, file, targetFile);
}
}
}
@@ -258,15 +261,16 @@ public class ImportSourceAnalyzer {
// layouts
//
private void _analyzeLayoutsDir(final File root) {
_analyzeDir(root, new _Analyzer() {
@Override void onFile(final File file) {
private void analyzeLayoutsDir(final File root) {
analyzeDir(root, new Analyzer() {
@Override
void onFile(final File file) {
// find *_preferred.xml files
final String filename = file.getName();
if (StringUtils.endsWithIgnoreCase(filename, "_preferred.xml")) {
final File targetFile = new File(ForgeConstants.USER_PREFS_DIR,
file.getName().toLowerCase(Locale.ENGLISH).replace("_preferred", ""));
_cb.addOp(OpType.PREFERENCE_FILE, file, targetFile);
cb.addOp(OpType.PREFERENCE_FILE, file, targetFile);
}
}
});
@@ -276,8 +280,8 @@ public class ImportSourceAnalyzer {
// default card pics
//
private static String _oldCleanString(final String in) {
final StringBuffer out = new StringBuffer();
private static String oldCleanString(final String in) {
final StringBuilder out = new StringBuilder();
for (int i = 0; i < in.length(); i++) {
final char c = in.charAt(i);
if ((c == ' ') || (c == '-')) {
@@ -292,7 +296,7 @@ public class ImportSourceAnalyzer {
return out.toString().toLowerCase();
}
private void _addDefaultPicNames(final PaperCard c, final boolean backFace) {
private void addDefaultPicNames(final PaperCard c, final boolean backFace) {
final CardRules card = c.getRules();
final String urls = card.getPictureUrl(backFace);
if (StringUtils.isEmpty(urls)) { return; }
@@ -304,59 +308,62 @@ public class ImportSourceAnalyzer {
final String filenameBase = ImageUtil.getImageKey(c, backFace, false);
final String filename = filenameBase + ".jpg";
final boolean alreadyHadIt = null != _defaultPicNames.put(filename, filename);
final boolean alreadyHadIt = null != defaultPicNames.put(filename, filename);
if ( alreadyHadIt ) {
return;
}
// Do you shift artIndex by one here?
final String newLastSymbol = 0 == c.getArtIndex() ? "" : String.valueOf(c.getArtIndex() /* + 1 */);
final String oldFilename = _oldCleanString(filenameBase.replaceAll("[0-9]?(\\.full)?$", "")) + newLastSymbol + ".jpg";
final String oldFilename = oldCleanString(filenameBase.replaceAll("[0-9]?(\\.full)?$", "")) + newLastSymbol + ".jpg";
//if ( numPics > 1 )
//System.out.printf("Will move %s -> %s%n", oldFilename, filename);
_defaultPicOldNameToCurrentName.put(oldFilename, filename);
defaultPicOldNameToCurrentName.put(oldFilename, filename);
}
private Map<String, String> _defaultPicNames;
private Map<String, String> _defaultPicOldNameToCurrentName;
private void _analyzeCardPicsDir(final File root) {
if (null == _defaultPicNames) {
_defaultPicNames = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
_defaultPicOldNameToCurrentName = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
private Map<String, String> defaultPicNames;
private Map<String, String> defaultPicOldNameToCurrentName;
private void analyzeCardPicsDir(final File root) {
if (null == defaultPicNames) {
defaultPicNames = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
defaultPicOldNameToCurrentName = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
for (final PaperCard c : FModel.getMagicDb().getCommonCards().getAllCards()) {
_addDefaultPicNames(c, false);
addDefaultPicNames(c, false);
if (ImageUtil.hasBackFacePicture(c)) {
_addDefaultPicNames(c, true);
addDefaultPicNames(c, true);
}
}
for (final PaperCard c : FModel.getMagicDb().getVariantCards().getAllCards()) {
_addDefaultPicNames(c, false);
addDefaultPicNames(c, false);
// variants never have backfaces
}
}
_analyzeListedDir(root, ForgeConstants.CACHE_CARD_PICS_DIR, new _ListedAnalyzer() {
@Override public String map(final String filename) {
if (_defaultPicOldNameToCurrentName.containsKey(filename)) {
return _defaultPicOldNameToCurrentName.get(filename);
analyzeListedDir(root, ForgeConstants.CACHE_CARD_PICS_DIR, new ListedAnalyzer() {
@Override
public String map(final String filename) {
if (defaultPicOldNameToCurrentName.containsKey(filename)) {
return defaultPicOldNameToCurrentName.get(filename);
}
return _defaultPicNames.get(filename);
return defaultPicNames.get(filename);
}
@Override public OpType getOpType(final String filename) {
@Override
public OpType getOpType(final String filename) {
return OpType.DEFAULT_CARD_PIC;
}
@Override boolean onDir(final File dir) {
@Override
boolean onDir(final File dir) {
if ("icons".equalsIgnoreCase(dir.getName())) {
_analyzeIconsPicsDir(dir);
analyzeIconsPicsDir(dir);
} else if ("tokens".equalsIgnoreCase(dir.getName())) {
_analyzeTokenPicsDir(dir);
analyzeTokenPicsDir(dir);
} else {
_analyzeCardPicsSetDir(dir);
analyzeCardPicsSetDir(dir);
}
return true;
}
@@ -367,7 +374,7 @@ public class ImportSourceAnalyzer {
// set card pics
//
private static void _addSetCards(final Map<String, String> cardFileNames, final Iterable<PaperCard> library, final Predicate<PaperCard> filter) {
private static void addSetCards(final Map<String, String> cardFileNames, final Iterable<PaperCard> library, final Predicate<PaperCard> filter) {
for (final PaperCard c : Iterables.filter(library, filter)) {
String filename = ImageUtil.getImageKey(c, false, true) + ".jpg";
cardFileNames.put(filename, filename);
@@ -378,21 +385,21 @@ public class ImportSourceAnalyzer {
}
}
Map<String, Map<String, String>> _cardFileNamesBySet;
Map<String, String> _nameUpdates;
private void _analyzeCardPicsSetDir(final File root) {
if (null == _cardFileNamesBySet) {
_cardFileNamesBySet = new TreeMap<String, Map<String, String>>(String.CASE_INSENSITIVE_ORDER);
Map<String, Map<String, String>> cardFileNamesBySet;
Map<String, String> nameUpdates;
private void analyzeCardPicsSetDir(final File root) {
if (null == cardFileNamesBySet) {
cardFileNamesBySet = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
for (final CardEdition ce : FModel.getMagicDb().getEditions()) {
final Map<String, String> cardFileNames = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
final Map<String, String> cardFileNames = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
final Predicate<PaperCard> filter = IPaperCard.Predicates.printedInSet(ce.getCode());
_addSetCards(cardFileNames, FModel.getMagicDb().getCommonCards().getAllCards(), filter);
_addSetCards(cardFileNames, FModel.getMagicDb().getVariantCards().getAllCards(), filter);
_cardFileNamesBySet.put(ce.getCode2(), cardFileNames);
addSetCards(cardFileNames, FModel.getMagicDb().getCommonCards().getAllCards(), filter);
addSetCards(cardFileNames, FModel.getMagicDb().getVariantCards().getAllCards(), filter);
cardFileNamesBySet.put(ce.getCode2(), cardFileNames);
}
// planar cards now don't have the ".full" part in their filenames
_nameUpdates = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
nameUpdates = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
final Predicate<PaperCard> predPlanes = new Predicate<PaperCard>() {
@Override
public boolean apply(final PaperCard arg0) {
@@ -402,10 +409,10 @@ public class ImportSourceAnalyzer {
for (final PaperCard c : Iterables.filter(FModel.getMagicDb().getVariantCards().getAllCards(), predPlanes)) {
String baseName = ImageUtil.getImageKey(c,false, true);
_nameUpdates.put(baseName + ".full.jpg", baseName + ".jpg");
nameUpdates.put(baseName + ".full.jpg", baseName + ".jpg");
if (ImageUtil.hasBackFacePicture(c)) {
baseName = ImageUtil.getImageKey(c, true, true);
_nameUpdates.put(baseName + ".full.jpg", baseName + ".jpg");
nameUpdates.put(baseName + ".full.jpg", baseName + ".jpg");
}
}
}
@@ -415,17 +422,18 @@ public class ImportSourceAnalyzer {
final CardEdition edition = editions.get(editionCode);
if (null == edition) {
// not a valid set name, skip
_numFilesAnalyzed += _countFiles(root);
numFilesAnalyzed += countFiles(root);
return;
}
final String editionCode2 = edition.getCode2();
final Map<String, String> validFilenames = _cardFileNamesBySet.get(editionCode2);
_analyzeListedDir(root, ForgeConstants.CACHE_CARD_PICS_DIR, new _ListedAnalyzer() {
@Override public String map(String filename) {
final Map<String, String> validFilenames = cardFileNamesBySet.get(editionCode2);
analyzeListedDir(root, ForgeConstants.CACHE_CARD_PICS_DIR, new ListedAnalyzer() {
@Override
public String map(String filename) {
filename = editionCode2 + "/" + filename;
if (_nameUpdates.containsKey(filename)) {
filename = _nameUpdates.get(filename);
if (nameUpdates.containsKey(filename)) {
filename = nameUpdates.get(filename);
}
if (validFilenames.containsKey(filename)) {
return validFilenames.get(filename);
@@ -435,7 +443,9 @@ public class ImportSourceAnalyzer {
}
return null;
}
@Override public OpType getOpType(final String filename) {
@Override
public OpType getOpType(final String filename) {
return validFilenames.containsKey(filename) ? OpType.SET_CARD_PIC : OpType.POSSIBLE_SET_CARD_PIC;
}
});
@@ -445,65 +455,77 @@ public class ImportSourceAnalyzer {
// other image dirs
//
Map<String, String> _iconFileNames;
private void _analyzeIconsPicsDir(final File root) {
if (null == _iconFileNames) {
_iconFileNames = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
Map<String, String> iconFileNames;
private void analyzeIconsPicsDir(final File root) {
if (null == iconFileNames) {
iconFileNames = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
for (final Pair<String, String> nameurl : FileUtil.readNameUrlFile(ForgeConstants.IMAGE_LIST_QUEST_OPPONENT_ICONS_FILE)) {
_iconFileNames.put(nameurl.getLeft(), nameurl.getLeft());
}
for (final Pair<String, String> nameurl : FileUtil.readNameUrlFile(ForgeConstants.IMAGE_LIST_QUEST_PET_SHOP_ICONS_FILE)) {
_iconFileNames.put(nameurl.getLeft(), nameurl.getLeft());
iconFileNames.put(nameurl.getLeft(), nameurl.getLeft());
}
}
_analyzeListedDir(root, ForgeConstants.CACHE_ICON_PICS_DIR, new _ListedAnalyzer() {
@Override public String map(final String filename) { return _iconFileNames.containsKey(filename) ? _iconFileNames.get(filename) : null; }
@Override public OpType getOpType(final String filename) { return OpType.QUEST_PIC; }
analyzeListedDir(root, ForgeConstants.CACHE_ICON_PICS_DIR, new ListedAnalyzer() {
@Override
public String map(final String filename) {
return iconFileNames.containsKey(filename) ? iconFileNames.get(filename) : null;
}
@Override
public OpType getOpType(final String filename) {
return OpType.QUEST_PIC;
}
});
}
Map<String, String> _tokenFileNames;
Map<String, String> _questTokenFileNames;
private void _analyzeTokenPicsDir(final File root) {
if (null == _tokenFileNames) {
_tokenFileNames = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
_questTokenFileNames = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
Map<String, String> tokenFileNames;
Map<String, String> questTokenFileNames;
private void analyzeTokenPicsDir(final File root) {
if (null == tokenFileNames) {
tokenFileNames = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
questTokenFileNames = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
for (final Pair<String, String> nameurl : FileUtil.readNameUrlFile(ForgeConstants.IMAGE_LIST_TOKENS_FILE)) {
_tokenFileNames.put(nameurl.getLeft(), nameurl.getLeft());
tokenFileNames.put(nameurl.getLeft(), nameurl.getLeft());
}
for (final Pair<String, String> nameurl : FileUtil.readNameUrlFile(ForgeConstants.IMAGE_LIST_QUEST_TOKENS_FILE)) {
_questTokenFileNames.put(nameurl.getLeft(), nameurl.getLeft());
questTokenFileNames.put(nameurl.getLeft(), nameurl.getLeft());
}
}
_analyzeListedDir(root, ForgeConstants.CACHE_TOKEN_PICS_DIR, new _ListedAnalyzer() {
@Override public String map(final String filename) {
if (_questTokenFileNames.containsKey(filename)) { return _questTokenFileNames.get(filename); }
if (_tokenFileNames.containsKey(filename)) { return _tokenFileNames.get(filename); }
analyzeListedDir(root, ForgeConstants.CACHE_TOKEN_PICS_DIR, new ListedAnalyzer() {
@Override
public String map(final String filename) {
if (questTokenFileNames.containsKey(filename)) {
return questTokenFileNames.get(filename);
}
if (tokenFileNames.containsKey(filename)) {
return tokenFileNames.get(filename);
}
return null;
}
@Override public OpType getOpType(final String filename) {
return _questTokenFileNames.containsKey(filename) ? OpType.QUEST_PIC : OpType.TOKEN_PIC;
@Override
public OpType getOpType(final String filename) {
return questTokenFileNames.containsKey(filename) ? OpType.QUEST_PIC : OpType.TOKEN_PIC;
}
});
}
private void _analyzeProductPicsDir(final File root) {
private void analyzeProductPicsDir(final File root) {
// we don't care about the files in the root dir -- the new booster files are .png, not the current .jpg ones
_analyzeDir(root, new _Analyzer() {
@Override boolean onDir(final File dir) {
analyzeDir(root, new Analyzer() {
@Override
boolean onDir(final File dir) {
final String dirName = dir.getName();
if ("booster".equalsIgnoreCase(dirName)) {
_analyzeSimpleListedDir(dir, ForgeConstants.IMAGE_LIST_QUEST_BOOSTERS_FILE, ForgeConstants.CACHE_BOOSTER_PICS_DIR, OpType.QUEST_PIC);
analyzeSimpleListedDir(dir, ForgeConstants.IMAGE_LIST_QUEST_BOOSTERS_FILE, ForgeConstants.CACHE_BOOSTER_PICS_DIR, OpType.QUEST_PIC);
} else if ("fatpacks".equalsIgnoreCase(dirName)) {
_analyzeSimpleListedDir(dir, ForgeConstants.IMAGE_LIST_QUEST_FATPACKS_FILE, ForgeConstants.CACHE_FATPACK_PICS_DIR, OpType.QUEST_PIC);
analyzeSimpleListedDir(dir, ForgeConstants.IMAGE_LIST_QUEST_FATPACKS_FILE, ForgeConstants.CACHE_FATPACK_PICS_DIR, OpType.QUEST_PIC);
} else if ("boosterboxes".equalsIgnoreCase(dirName)) {
_analyzeSimpleListedDir(dir, ForgeConstants.IMAGE_LIST_QUEST_BOOSTERBOXES_FILE, ForgeConstants.CACHE_BOOSTERBOX_PICS_DIR, OpType.QUEST_PIC);
analyzeSimpleListedDir(dir, ForgeConstants.IMAGE_LIST_QUEST_BOOSTERBOXES_FILE, ForgeConstants.CACHE_BOOSTERBOX_PICS_DIR, OpType.QUEST_PIC);
} else if ("precons".equalsIgnoreCase(dirName)) {
_analyzeSimpleListedDir(dir, ForgeConstants.IMAGE_LIST_QUEST_PRECONS_FILE, ForgeConstants.CACHE_PRECON_PICS_DIR, OpType.QUEST_PIC);
analyzeSimpleListedDir(dir, ForgeConstants.IMAGE_LIST_QUEST_PRECONS_FILE, ForgeConstants.CACHE_PRECON_PICS_DIR, OpType.QUEST_PIC);
} else if ("tournamentpacks".equalsIgnoreCase(dirName)) {
_analyzeSimpleListedDir(dir, ForgeConstants.IMAGE_LIST_QUEST_TOURNAMENTPACKS_FILE, ForgeConstants.CACHE_TOURNAMENTPACK_PICS_DIR, OpType.QUEST_PIC);
analyzeSimpleListedDir(dir, ForgeConstants.IMAGE_LIST_QUEST_TOURNAMENTPACKS_FILE, ForgeConstants.CACHE_TOURNAMENTPACK_PICS_DIR, OpType.QUEST_PIC);
} else {
return false;
}
@@ -516,14 +538,15 @@ public class ImportSourceAnalyzer {
// preferences
//
private void _analyzePreferencesDir(final File root) {
_analyzeDir(root, new _Analyzer() {
@Override void onFile(final File file) {
private void analyzePreferencesDir(final File root) {
analyzeDir(root, new Analyzer() {
@Override
void onFile(final File file) {
final String filename = file.getName();
if ("editor.preferences".equalsIgnoreCase(filename) || "forge.preferences".equalsIgnoreCase(filename)) {
final File targetFile = new File(ForgeConstants.USER_PREFS_DIR, filename.toLowerCase(Locale.ENGLISH));
if (!file.equals(targetFile)) {
_cb.addOp(OpType.PREFERENCE_FILE, file, targetFile);
cb.addOp(OpType.PREFERENCE_FILE, file, targetFile);
}
}
}
@@ -534,20 +557,23 @@ public class ImportSourceAnalyzer {
// quest data
//
private void _analyzeQuestDir(final File root) {
_analyzeDir(root, new _Analyzer() {
@Override void onFile(final File file) {
private void analyzeQuestDir(final File root) {
analyzeDir(root, new Analyzer() {
@Override
void onFile(final File file) {
final String filename = file.getName();
if ("all-prices.txt".equalsIgnoreCase(filename)) {
final File targetFile = new File(ForgeConstants.DB_DIR, filename.toLowerCase(Locale.ENGLISH));
if (!file.equals(targetFile)) {
_cb.addOp(OpType.DB_FILE, file, targetFile);
cb.addOp(OpType.DB_FILE, file, targetFile);
}
}
}
@Override boolean onDir(final File dir) {
@Override
boolean onDir(final File dir) {
if ("data".equalsIgnoreCase(dir.getName())) {
_analyzeQuestDataDir(dir);
analyzeQuestDataDir(dir);
return true;
}
return false;
@@ -555,14 +581,15 @@ public class ImportSourceAnalyzer {
});
}
private void _analyzeQuestDataDir(final File root) {
_analyzeDir(root, new _Analyzer() {
@Override void onFile(final File file) {
private void analyzeQuestDataDir(final File root) {
analyzeDir(root, new Analyzer() {
@Override
void onFile(final File file) {
final String filename = file.getName();
if (StringUtils.endsWithIgnoreCase(filename, ".dat")) {
final File targetFile = new File(ForgeConstants.QUEST_SAVE_DIR, _lcaseExt(filename));
final File targetFile = new File(ForgeConstants.QUEST_SAVE_DIR, lcaseExt(filename));
if (!file.equals(targetFile)) {
_cb.addOp(OpType.QUEST_DATA, file, targetFile);
cb.addOp(OpType.QUEST_DATA, file, targetFile);
}
}
}
@@ -573,47 +600,56 @@ public class ImportSourceAnalyzer {
// utility functions
//
private class _Analyzer {
private class Analyzer {
void onFile(final File file) { }
// returns whether the directory has been handled
boolean onDir(final File dir) { return false; }
}
private void _analyzeDir(final File root, final _Analyzer analyzer) {
for (final File file : root.listFiles()) {
if (_cb.checkCancel()) { return; }
private void analyzeDir(final File root, final Analyzer analyzer) {
File[] files = root.listFiles();
assert files != null;
for (final File file : files) {
if (cb.checkCancel()) { return; }
if (file.isFile()) {
++_numFilesAnalyzed;
++numFilesAnalyzed;
analyzer.onFile(file);
} else if (file.isDirectory()) {
if (!analyzer.onDir(file)) {
_numFilesAnalyzed += _countFiles(file);
numFilesAnalyzed += countFiles(file);
}
}
}
}
private final Map<String, Map<String, String>> _fileNameDb = new HashMap<String, Map<String, String>>();
private void _analyzeSimpleListedDir(final File root, final String listFile, final String targetDir, final OpType opType) {
if (!_fileNameDb.containsKey(listFile)) {
final Map<String, String> fileNames = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
private final Map<String, Map<String, String>> fileNameDb = new HashMap<>();
private void analyzeSimpleListedDir(final File root, final String listFile, final String targetDir, final OpType opType) {
if (!fileNameDb.containsKey(listFile)) {
final Map<String, String> fileNames = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
for (final Pair<String, String> nameurl : FileUtil.readNameUrlFile(listFile)) {
// we use a map instead of a set since we need to match case-insensitively but still map to the correct case
fileNames.put(nameurl.getLeft(), nameurl.getLeft());
}
_fileNameDb.put(listFile, fileNames);
fileNameDb.put(listFile, fileNames);
}
final Map<String, String> fileDb = _fileNameDb.get(listFile);
_analyzeListedDir(root, targetDir, new _ListedAnalyzer() {
@Override public String map(final String filename) { return fileDb.containsKey(filename) ? fileDb.get(filename) : null; }
@Override public OpType getOpType(final String filename) { return opType; }
final Map<String, String> fileDb = fileNameDb.get(listFile);
analyzeListedDir(root, targetDir, new ListedAnalyzer() {
@Override
public String map(final String filename) {
return fileDb.containsKey(filename) ? fileDb.get(filename) : null;
}
@Override
public OpType getOpType(final String filename) {
return opType;
}
});
}
private abstract class _ListedAnalyzer {
private abstract class ListedAnalyzer {
abstract String map(String filename);
abstract OpType getOpType(String filename);
@@ -621,37 +657,43 @@ public class ImportSourceAnalyzer {
boolean onDir(final File dir) { return false; }
}
private void _analyzeListedDir(final File root, final String targetDir, final _ListedAnalyzer listedAnalyzer) {
_analyzeDir(root, new _Analyzer() {
@Override void onFile(final File file) {
private void analyzeListedDir(final File root, final String targetDir, final ListedAnalyzer listedAnalyzer) {
analyzeDir(root, new Analyzer() {
@Override
void onFile(final File file) {
final String filename = listedAnalyzer.map(file.getName());
if (null != filename) {
final File targetFile = new File(targetDir, filename);
if (!file.equals(targetFile)) {
_cb.addOp(listedAnalyzer.getOpType(filename), file, targetFile);
cb.addOp(listedAnalyzer.getOpType(filename), file, targetFile);
}
}
}
@Override boolean onDir(final File dir) { return listedAnalyzer.onDir(dir); }
@Override
boolean onDir(final File dir) {
return listedAnalyzer.onDir(dir);
}
});
}
private int _countFiles(final File root) {
private int countFiles(final File root) {
int count = 0;
for (final File file : root.listFiles()) {
if (_cb.checkCancel()) { return 0; }
File[] files = root.listFiles();
assert files != null;
for (final File file : files) {
if (cb.checkCancel()) { return 0; }
if (file.isFile()) {
++count;
} else if (file.isDirectory()) {
count += _countFiles(file);
count += countFiles(file);
}
}
return count;
}
private static String _lcaseExt(final String filename) {
private static String lcaseExt(final String filename) {
final int lastDotIdx = filename.lastIndexOf('.');
if (0 > lastDotIdx) {
return filename;

View File

@@ -6,12 +6,12 @@
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
@@ -45,9 +45,9 @@ import java.util.Map.Entry;
/**
* Updates the deck editor UI as necessary draft selection mode.
*
*
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
*
*
* @author Forge
* @version $Id: CEditorDraftingProcess.java 24872 2014-02-17 07:35:47Z drdev $
*/
@@ -84,7 +84,7 @@ public class CEditorDraftingProcess extends ACEditorBase<PaperCard, DeckGroup> {
/**
* Show GuiBase.getInterface().
*
*
* @param inBoosterDraft
* the in_booster draft
*/
@@ -110,7 +110,6 @@ public class CEditorDraftingProcess extends ACEditorBase<PaperCard, DeckGroup> {
this.showChoices(this.boosterDraft.nextChoice());
}
else {
this.boosterDraft.finishedDrafting();
this.saveDraft();
}
}
@@ -136,9 +135,9 @@ public class CEditorDraftingProcess extends ACEditorBase<PaperCard, DeckGroup> {
* <p>
* showChoices.
* </p>
*
*
* @param list
* a {@link forge.CardList} object.
* a {@link ItemPool<PaperCard>} object.
*/
private void showChoices(final ItemPool<PaperCard> list) {
int packNumber = ((BoosterDraft) boosterDraft).getCurrentBoosterIndex() + 1;
@@ -151,7 +150,7 @@ public class CEditorDraftingProcess extends ACEditorBase<PaperCard, DeckGroup> {
* <p>
* getPlayersDeck.
* </p>
*
*
* @return a {@link forge.deck.Deck} object.
*/
private Deck getPlayersDeck() {
@@ -194,7 +193,7 @@ public class CEditorDraftingProcess extends ACEditorBase<PaperCard, DeckGroup> {
// Cancel button will be null; OK will return string.
// Must check for null value first, then string length.
// Recurse, if either null or empty string.
if (s == null || s.length() == 0) {
if (s == null || s.isEmpty()) {
saveDraft();
return;
}
@@ -241,7 +240,7 @@ public class CEditorDraftingProcess extends ACEditorBase<PaperCard, DeckGroup> {
/*
* (non-Javadoc)
*
*
* @see forge.gui.deckeditor.ACEditorBase#getController()
*/
@Override
@@ -251,7 +250,7 @@ public class CEditorDraftingProcess extends ACEditorBase<PaperCard, DeckGroup> {
/*
* (non-Javadoc)
*
*
* @see forge.gui.deckeditor.ACEditorBase#updateView()
*/
@Override
@@ -260,7 +259,7 @@ public class CEditorDraftingProcess extends ACEditorBase<PaperCard, DeckGroup> {
/*
* (non-Javadoc)
*
*
* @see forge.gui.deckeditor.ACEditorBase#show(forge.Command)
*/
@Override

View File

@@ -6,21 +6,18 @@
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.screens.deckeditor.controllers;
import java.util.Map.Entry;
import com.google.common.collect.ImmutableList;
import forge.assets.FSkinProp;
import forge.card.MagicColor;
import forge.deck.Deck;
@@ -48,24 +45,26 @@ import forge.toolbox.FSkin;
import forge.util.ItemPool;
import forge.util.MyRandom;
import java.util.Map.Entry;
/**
* Updates the deck editor UI as necessary draft selection mode.
*
*
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
*
*
* @author Forge
* @version $Id: CEditorDraftingProcess.java 24872 2014-02-17 07:35:47Z drdev $
*/
public class CEditorQuestDraftingProcess extends ACEditorBase<PaperCard, DeckGroup> {
private CSubmenuQuestDraft draftQuest;
private QuestController quest;
public void setDraftQuest(CSubmenuQuestDraft testDraftQuest) {
this.draftQuest = testDraftQuest;
this.quest = FModel.getQuest();
}
private IBoosterDraft boosterDraft;
private String ccAddLabel = "Add card";
@@ -100,7 +99,7 @@ public class CEditorQuestDraftingProcess extends ACEditorBase<PaperCard, DeckGro
/**
* Show GuiBase.getInterface().
*
*
* @param inBoosterDraft
* the in_booster draft
*/
@@ -126,7 +125,6 @@ public class CEditorQuestDraftingProcess extends ACEditorBase<PaperCard, DeckGro
this.showChoices(this.boosterDraft.nextChoice());
}
else {
this.boosterDraft.finishedDrafting();
this.saveDraft();
}
}
@@ -152,9 +150,9 @@ public class CEditorQuestDraftingProcess extends ACEditorBase<PaperCard, DeckGro
* <p>
* showChoices.
* </p>
*
*
* @param list
* a {@link forge.CardList} object.
* a {@link ItemPool<PaperCard>} object.
*/
private void showChoices(final ItemPool<PaperCard> list) {
int packNumber = ((BoosterDraft) boosterDraft).getCurrentBoosterIndex() + 1;
@@ -167,7 +165,7 @@ public class CEditorQuestDraftingProcess extends ACEditorBase<PaperCard, DeckGro
* <p>
* getPlayersDeck.
* </p>
*
*
* @return a {@link forge.deck.Deck} object.
*/
public Deck getPlayersDeck() {
@@ -217,9 +215,9 @@ public class CEditorQuestDraftingProcess extends ACEditorBase<PaperCard, DeckGro
CSubmenuQuestDraft.SINGLETON_INSTANCE.update();
FScreen.DRAFTING_PROCESS.close();
draftQuest.setCompletedDraft(finishedDraft);
}
//========== Overridden from ACEditorBase
@@ -231,7 +229,7 @@ public class CEditorQuestDraftingProcess extends ACEditorBase<PaperCard, DeckGro
/*
* (non-Javadoc)
*
*
* @see forge.gui.deckeditor.ACEditorBase#getController()
*/
@Override
@@ -241,7 +239,7 @@ public class CEditorQuestDraftingProcess extends ACEditorBase<PaperCard, DeckGro
/*
* (non-Javadoc)
*
*
* @see forge.gui.deckeditor.ACEditorBase#updateView()
*/
@Override
@@ -250,7 +248,7 @@ public class CEditorQuestDraftingProcess extends ACEditorBase<PaperCard, DeckGro
/*
* (non-Javadoc)
*
*
* @see forge.gui.deckeditor.ACEditorBase#show(forge.Command)
*/
@Override

View File

@@ -6,12 +6,12 @@
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
@@ -54,6 +54,7 @@ import java.util.Map.Entry;
* @author Forge
* @version $Id: CEditorDraftingProcess.java 24872 2014-02-17 07:35:47Z drdev $
*/
@SuppressWarnings("FieldCanBeLocal")
public class CEditorWinstonProcess extends ACEditorBase<PaperCard, DeckGroup> {
private IBoosterDraft boosterDraft;
@@ -202,7 +203,7 @@ public class CEditorWinstonProcess extends ACEditorBase<PaperCard, DeckGroup> {
// Cancel button will be null; OK will return string.
// Must check for null value first, then string length.
// Recurse, if either null or empty string.
if (s == null || s.length() == 0) {
if (s == null || s.isEmpty()) {
saveDraft();
return;
}
@@ -251,7 +252,7 @@ public class CEditorWinstonProcess extends ACEditorBase<PaperCard, DeckGroup> {
/*
* (non-Javadoc)
*
*
* @see forge.gui.deckeditor.ACEditorBase#getController()
*/
@Override
@@ -261,7 +262,7 @@ public class CEditorWinstonProcess extends ACEditorBase<PaperCard, DeckGroup> {
/*
* (non-Javadoc)
*
*
* @see forge.gui.deckeditor.ACEditorBase#updateView()
*/
@Override
@@ -270,7 +271,7 @@ public class CEditorWinstonProcess extends ACEditorBase<PaperCard, DeckGroup> {
/*
* (non-Javadoc)
*
*
* @see forge.gui.deckeditor.ACEditorBase#show(forge.Command)
*/
@Override
@@ -376,7 +377,6 @@ public class CEditorWinstonProcess extends ACEditorBase<PaperCard, DeckGroup> {
}
}
// If we get here, there's no choices left. Finish the draft and then save it
this.boosterDraft.finishedDrafting();
this.saveDraft();
}

View File

@@ -1,16 +1,5 @@
package forge.screens.deckeditor.controllers;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
import forge.deck.Deck;
import forge.item.PaperCard;
import forge.properties.ForgeConstants;
@@ -20,6 +9,13 @@ import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.*;
import java.util.Map.Entry;
public class DeckHtmlSerializer {
public static void writeDeckHtml(final Deck d, final File f) {
try {
@@ -40,11 +36,9 @@ public class DeckHtmlSerializer {
* a {@link forge.deck.Deck} object.
* @param out
* a {@link java.io.BufferedWriter} object.
* @throws java.io.IOException
* if any.
*/
private static void writeDeckHtml(final Deck d, final BufferedWriter out) {
Template temp = null;
Template temp;
final int cardBorder = 0;
final int height = 319;
final int width = 222;
@@ -68,19 +62,19 @@ public class DeckHtmlSerializer {
temp = cfg.getTemplate("proxy-template.ftl");
/* Create a data-model */
final Map<String, Object> root = new HashMap<String, Object>();
final Map<String, Object> root = new HashMap<>();
root.put("title", d.getName());
final List<String> list = new ArrayList<String>();
final List<String> list = new ArrayList<>();
for (final Entry<PaperCard, Integer> card : d.getMain()) {
// System.out.println(card.getSets().get(card.getSets().size() - 1).URL);
for (int i = card.getValue().intValue(); i > 0; --i ) {
for (int i = card.getValue(); i > 0; --i ) {
final PaperCard r = card.getKey();
final String url = ForgeConstants.URL_PIC_DOWNLOAD + ImageUtil.getDownloadUrl(r, false);
list.add(url);
}
}
final Map<String, Integer> map = new TreeMap<String, Integer>();
final Map<String, Integer> map = new TreeMap<>();
for (final Entry<PaperCard, Integer> entry : d.getMain()) {
map.put(entry.getKey().getName(), entry.getValue());
// System.out.println(entry.getValue() + " " +
@@ -97,9 +91,7 @@ public class DeckHtmlSerializer {
/* Merge data-model with template */
temp.process(root, out);
out.flush();
} catch (final IOException e) {
System.out.println(e.toString());
} catch (final TemplateException e) {
} catch (final IOException | TemplateException e) {
System.out.println(e.toString());
}
}

View File

@@ -1,18 +1,5 @@
package forge.screens.home.settings;
import java.awt.Desktop;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JCheckBox;
import javax.swing.SwingUtilities;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import forge.Singletons;
import forge.UiCommand;
import forge.ai.AiProfileUtil;
@@ -31,6 +18,16 @@ import forge.toolbox.FComboBox;
import forge.toolbox.FComboBoxPanel;
import forge.toolbox.FLabel;
import forge.toolbox.FOptionPane;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
* Controls the preferences submenu in the home UI.
@@ -46,7 +43,7 @@ public enum CSubmenuPreferences implements ICDoc {
private ForgePreferences prefs;
private boolean updating;
private final List<Pair<JCheckBox, FPref>> lstControls = new ArrayList<Pair<JCheckBox,FPref>>();
private final List<Pair<JCheckBox, FPref>> lstControls = new ArrayList<>();
@Override
public void register() {
@@ -100,7 +97,6 @@ public enum CSubmenuPreferences implements ICDoc {
lstControls.add(Pair.of(view.getCbRemoveSmall(), FPref.DECKGEN_NOSMALL));
lstControls.add(Pair.of(view.getCbRemoveArtifacts(), FPref.DECKGEN_ARTIFACTS));
lstControls.add(Pair.of(view.getCbSingletons(), FPref.DECKGEN_SINGLETONS));
lstControls.add(Pair.of(view.getCbUploadDraft(), FPref.UI_UPLOAD_DRAFT));
lstControls.add(Pair.of(view.getCbEnableAICheats(), FPref.UI_ENABLE_AI_CHEATS));
lstControls.add(Pair.of(view.getCbDisplayFoil(), FPref.UI_OVERLAY_FOIL_EFFECT));
lstControls.add(Pair.of(view.getCbRandomFoil(), FPref.UI_RANDOM_FOIL));
@@ -285,7 +281,7 @@ public enum CSubmenuPreferences implements ICDoc {
private void initializeCloseActionComboBox() {
final FComboBoxPanel<CloseAction> panel = this.view.getCloseActionComboBoxPanel();
final FComboBox<CloseAction> comboBox = new FComboBox<CloseAction>(CloseAction.values());
final FComboBox<CloseAction> comboBox = new FComboBox<>(CloseAction.values());
comboBox.addItemListener(new ItemListener() {
@Override public void itemStateChanged(final ItemEvent e) {
Singletons.getControl().setCloseAction(comboBox.getSelectedItem());
@@ -303,7 +299,7 @@ public enum CSubmenuPreferences implements ICDoc {
}
private <E> FComboBox<E> createComboBox(final E[] items, final ForgePreferences.FPref setting) {
final FComboBox<E> comboBox = new FComboBox<E>(items);
final FComboBox<E> comboBox = new FComboBox<>(items);
addComboBoxListener(comboBox, setting);
return comboBox;
}

View File

@@ -1,27 +1,5 @@
package forge.screens.home.settings;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingConstants;
import net.miginfocom.swing.MigLayout;
import org.apache.commons.lang3.StringUtils;
import forge.control.FControl.CloseAction;
import forge.control.KeyboardShortcuts;
import forge.control.KeyboardShortcuts.Shortcut;
@@ -34,13 +12,20 @@ import forge.properties.ForgePreferences.FPref;
import forge.screens.home.EMenuGroup;
import forge.screens.home.IVSubmenu;
import forge.screens.home.VHomeUI;
import forge.toolbox.FCheckBox;
import forge.toolbox.FComboBoxPanel;
import forge.toolbox.FLabel;
import forge.toolbox.FScrollPane;
import forge.toolbox.FSkin;
import forge.toolbox.*;
import forge.toolbox.FSkin.SkinnedLabel;
import forge.toolbox.FSkin.SkinnedTextField;
import net.miginfocom.swing.MigLayout;
import org.apache.commons.lang3.StringUtils;
import javax.swing.*;
import java.awt.*;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.*;
import java.util.List;
/**
* Assembles Swing components of preferences submenu singleton.
@@ -73,7 +58,6 @@ public enum VSubmenuPreferences implements IVSubmenu<CSubmenuPreferences> {
private final JCheckBox cbRemoveArtifacts = new OptionsCheckBox("Remove Artifacts");
private final JCheckBox cbAnte = new OptionsCheckBox("Play for Ante");
private final JCheckBox cbAnteMatchRarity = new OptionsCheckBox("Match Ante Rarity");
private final JCheckBox cbUploadDraft = new OptionsCheckBox("Upload Draft Picks");
private final JCheckBox cbEnableAICheats = new OptionsCheckBox("Allow AI Cheating");
private final JCheckBox cbManaBurn = new OptionsCheckBox("Mana Burn");
private final JCheckBox cbManaLostPrompt = new OptionsCheckBox("Prompt Mana Pool Emptying");
@@ -99,17 +83,17 @@ public enum VSubmenuPreferences implements IVSubmenu<CSubmenuPreferences> {
private final JCheckBox cbTokensInSeparateRow = new OptionsCheckBox("Display Tokens in a Separate Row");
private final JCheckBox cbStackCreatures = new OptionsCheckBox("Stack Creatures");
private final Map<FPref, KeyboardShortcutField> shortcutFields = new HashMap<FPref, KeyboardShortcutField>();
private final Map<FPref, KeyboardShortcutField> shortcutFields = new HashMap<>();
// ComboBox items are added in CSubmenuPreferences since this is just the View.
private final FComboBoxPanel<GameLogEntryType> cbpGameLogEntryType = new FComboBoxPanel<GameLogEntryType>("Game Log Verbosity:");
private final FComboBoxPanel<CloseAction> cbpCloseAction = new FComboBoxPanel<CloseAction>("Close Action:");
private final FComboBoxPanel<String> cbpAiProfiles = new FComboBoxPanel<String>("AI Personality:");
private final FComboBoxPanel<GameLogEntryType> cbpGameLogEntryType = new FComboBoxPanel<>("Game Log Verbosity:");
private final FComboBoxPanel<CloseAction> cbpCloseAction = new FComboBoxPanel<>("Close Action:");
private final FComboBoxPanel<String> cbpAiProfiles = new FComboBoxPanel<>("AI Personality:");
/**
* Constructor.
*/
private VSubmenuPreferences() {
VSubmenuPreferences() {
pnlPrefs.setOpaque(false);
pnlPrefs.setLayout(new MigLayout("insets 0, gap 0, wrap 2"));
@@ -153,9 +137,6 @@ public enum VSubmenuPreferences implements IVSubmenu<CSubmenuPreferences> {
pnlPrefs.add(cbAnteMatchRarity, regularConstraints);
pnlPrefs.add(new NoteLabel("Attempts to make antes the same rarity for all players."), regularConstraints);
pnlPrefs.add(cbUploadDraft, regularConstraints);
pnlPrefs.add(new NoteLabel("Sends draft picks to Forge servers for analysis, to improve draft AI."), regularConstraints);
pnlPrefs.add(cbEnableAICheats, regularConstraints);
pnlPrefs.add(new NoteLabel("Allow the AI to cheat to gain advantage (for personalities that have cheat shuffling options set)."), regularConstraints);
@@ -317,8 +298,8 @@ public enum VSubmenuPreferences implements IVSubmenu<CSubmenuPreferences> {
/** Consolidates checkbox styling in one place. */
@SuppressWarnings("serial")
private class OptionsCheckBox extends FCheckBox {
public OptionsCheckBox(final String txt0) {
private final class OptionsCheckBox extends FCheckBox {
private OptionsCheckBox(final String txt0) {
super(txt0);
this.setFont(FSkin.getBoldFont(12));
}
@@ -326,8 +307,8 @@ public enum VSubmenuPreferences implements IVSubmenu<CSubmenuPreferences> {
/** Consolidates section title label styling in one place. */
@SuppressWarnings("serial")
private class SectionLabel extends SkinnedLabel {
public SectionLabel(final String txt0) {
private final class SectionLabel extends SkinnedLabel {
private SectionLabel(final String txt0) {
super(txt0);
this.setBorder(new FSkin.MatteSkinBorder(0, 0, 1, 0, FSkin.getColor(FSkin.Colors.CLR_BORDERS)));
setHorizontalAlignment(SwingConstants.CENTER);
@@ -338,8 +319,8 @@ public enum VSubmenuPreferences implements IVSubmenu<CSubmenuPreferences> {
/** Consolidates notation label styling in one place. */
@SuppressWarnings("serial")
private class NoteLabel extends SkinnedLabel {
public NoteLabel(final String txt0) {
private final class NoteLabel extends SkinnedLabel {
private NoteLabel(final String txt0) {
super(txt0);
this.setFont(FSkin.getItalicFont(12));
this.setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT));
@@ -359,7 +340,7 @@ public enum VSubmenuPreferences implements IVSubmenu<CSubmenuPreferences> {
* A JTextField plus a "codeString" property, that stores keycodes for
* the shortcut. Also, an action listener that handles translation of
* keycodes into characters and (dis)assembly of keycode stack.
*
*
* @param shortcut0 &emsp; Shortcut object
*/
public KeyboardShortcutField(final Shortcut shortcut0) {
@@ -398,7 +379,7 @@ public enum VSubmenuPreferences implements IVSubmenu<CSubmenuPreferences> {
/**
* Gets the code string.
*
*
* @return String
*/
public final String getCodeString() {
@@ -407,7 +388,7 @@ public enum VSubmenuPreferences implements IVSubmenu<CSubmenuPreferences> {
/**
* Sets the code string.
*
*
* @param str0
* &emsp; The new code string (space delimited)
*/
@@ -418,8 +399,8 @@ public enum VSubmenuPreferences implements IVSubmenu<CSubmenuPreferences> {
this.codeString = str0.trim();
final List<String> codes = new ArrayList<String>(Arrays.asList(this.codeString.split(" ")));
final List<String> displayText = new ArrayList<String>();
final List<String> codes = new ArrayList<>(Arrays.asList(this.codeString.split(" ")));
final List<String> displayText = new ArrayList<>();
for (final String s : codes) {
if (!s.isEmpty()) {
@@ -451,11 +432,6 @@ public enum VSubmenuPreferences implements IVSubmenu<CSubmenuPreferences> {
return cbRemoveArtifacts;
}
/** @return {@link javax.swing.JCheckBox} */
public JCheckBox getCbUploadDraft() {
return cbUploadDraft;
}
/** @return {@link javax.swing.JCheckBox} */
public JCheckBox getCbEnableAICheats() {
return cbEnableAICheats;
@@ -475,7 +451,7 @@ public enum VSubmenuPreferences implements IVSubmenu<CSubmenuPreferences> {
public JCheckBox getCbAnte() {
return cbAnte;
}
/** @return {@link javax.swing.JCheckBox} */
public JCheckBox getCbAnteMatchRarity() {
return cbAnteMatchRarity;
@@ -579,7 +555,7 @@ public enum VSubmenuPreferences implements IVSubmenu<CSubmenuPreferences> {
public final JCheckBox getCbStackCreatures() {
return cbStackCreatures;
}
public final JCheckBox getCbManaLostPrompt() {
return cbManaLostPrompt;
}

View File

@@ -17,7 +17,7 @@ import java.util.List;
* <p>
* BoosterDraftTest class.
* </p>
*
*
* @author Forge
* @version $Id: BoosterDraftTest.java 24769 2014-02-09 13:56:04Z Hellfish $
*/
@@ -31,7 +31,7 @@ public class BoosterDraftTest implements IBoosterDraft {
* <p>
* getDecks.
* </p>
*
*
* @return an array of {@link forge.deck.Deck} objects.
*/
@Override
@@ -44,7 +44,7 @@ public class BoosterDraftTest implements IBoosterDraft {
* <p>
* nextChoice.
* </p>
*
*
* @return a {@link forge.CardList} object.
*/
@Override
@@ -66,7 +66,7 @@ public class BoosterDraftTest implements IBoosterDraft {
* <p>
* hasNextChoice.
* </p>
*
*
* @return a boolean.
*/
@Override
@@ -78,7 +78,7 @@ public class BoosterDraftTest implements IBoosterDraft {
* <p>
* getChosenCards.
* </p>
*
*
* @return a {@link forge.CardList} object.
*/
public List<Card> getChosenCards() {
@@ -89,23 +89,13 @@ public class BoosterDraftTest implements IBoosterDraft {
* <p>
* getUnchosenCards.
* </p>
*
*
* @return a {@link forge.CardList} object.
*/
public List<Card> getUnchosenCards() {
return null;
}
/*
* (non-Javadoc)
*
* @see forge.game.limited.IBoosterDraft#finishedDrafting()
*/
@Override
public void finishedDrafting() {
}
@Override
public boolean isPileDraft() {
return false;

View File

@@ -1,27 +1,14 @@
package forge.deck;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.commons.lang3.StringUtils;
import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment;
import com.badlogic.gdx.math.Vector2;
import com.google.common.base.Predicates;
import com.google.common.base.Supplier;
import com.google.common.collect.ImmutableList;
import forge.Forge;
import forge.Graphics;
import forge.StaticData;
import forge.assets.FImage;
import forge.assets.FSkin;
import forge.assets.FSkinFont;
import forge.assets.FSkinImage;
import forge.assets.FTextureRegionImage;
import forge.assets.*;
import forge.card.CardDb;
import forge.card.CardEdition;
import forge.card.CardPreferences;
@@ -32,8 +19,8 @@ import forge.itemmanager.CardManager;
import forge.itemmanager.ColumnDef;
import forge.itemmanager.ItemColumn;
import forge.itemmanager.ItemManager.ContextMenuBuilder;
import forge.itemmanager.filters.ItemFilter;
import forge.itemmanager.ItemManagerConfig;
import forge.itemmanager.filters.ItemFilter;
import forge.limited.BoosterDraft;
import forge.menu.FCheckBoxMenuItem;
import forge.menu.FDropDownMenu;
@@ -45,17 +32,20 @@ import forge.properties.ForgePreferences.FPref;
import forge.quest.data.QuestPreferences.QPref;
import forge.screens.FScreen;
import forge.screens.TabPageScreen;
import forge.toolbox.FContainer;
import forge.toolbox.FEvent;
import forge.toolbox.*;
import forge.toolbox.FEvent.FEventHandler;
import forge.toolbox.FEvent.FEventType;
import forge.toolbox.FLabel;
import forge.toolbox.FOptionPane;
import forge.toolbox.GuiChoose;
import forge.util.Callback;
import forge.util.ItemPool;
import forge.util.Utils;
import forge.util.storage.IStorage;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
public class FDeckEditor extends TabPageScreen<FDeckEditor> {
public static FSkinImage MAIN_DECK_ICON = FSkinImage.DECKLIST;
@@ -291,7 +281,7 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
switch (editorType) {
case Draft:
case Sealed:
//use most recent edition that all cards in limited pool came before or in
//use most recent edition that all cards in limited pool came before or in
defaultLandSet = StaticData.instance().getEditions().getEarliestEditionWithAllCards(deck.getAllCardsInASinglePool());
break;
default:
@@ -1100,7 +1090,7 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
@Override
public void run(Integer result) {
if (result == null || result <= 0) { return; }
removeCard(card, result);
parentScreen.getSideboardPage().addCard(card, result);
}
@@ -1254,7 +1244,6 @@ public class FDeckEditor extends TabPageScreen<FDeckEditor> {
}
else {
hideTab(); //hide this tab page when finished drafting
draft.finishedDrafting();
parentScreen.save(null);
}
}

View File

@@ -1,10 +1,6 @@
package forge.screens.settings;
import java.util.ArrayList;
import java.util.List;
import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment;
import forge.Forge;
import forge.Graphics;
import forge.ai.AiProfileUtil;
@@ -26,6 +22,9 @@ import forge.toolbox.FGroupList;
import forge.toolbox.FList;
import forge.util.Utils;
import java.util.ArrayList;
import java.util.List;
public class SettingsPage extends TabPage<SettingsScreen> {
private final FGroupList<Setting> lstSettings = add(new FGroupList<Setting>());
@@ -71,10 +70,6 @@ public class SettingsPage extends TabPage<SettingsScreen> {
"Hot Seat Mode",
"When starting a game with 2 human players, use single prompt to control both players."),
1);
lstSettings.addItem(new BooleanSetting(FPref.UI_UPLOAD_DRAFT,
"Upload Draft Picks",
"Sends draft picks to Forge servers for analysis, to improve draft AI."),
1);
lstSettings.addItem(new BooleanSetting(FPref.UI_ENABLE_AI_CHEATS,
"Allow AI Cheating",
"Allow the AI to cheat to gain advantage (for personalities that have cheat shuffling options set)."),
@@ -379,7 +374,7 @@ public class SettingsPage extends TabPage<SettingsScreen> {
g.drawText(value.label, font, foreColor, x, y, w, h, false, HAlignment.LEFT, false);
value.drawPrefValue(g, font, foreColor, x, y, w, h);
h += SettingsScreen.SETTING_PADDING;
g.drawText(value.description, SettingsScreen.DESC_FONT, SettingsScreen.DESC_COLOR, x, y + h, w, totalHeight - h + SettingsScreen.getInsets(w), true, HAlignment.LEFT, false);
g.drawText(value.description, SettingsScreen.DESC_FONT, SettingsScreen.DESC_COLOR, x, y + h, w, totalHeight - h + SettingsScreen.getInsets(w), true, HAlignment.LEFT, false);
}
}
}

View File

@@ -5,5 +5,5 @@ T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ DarkEffect | TriggerZones$
SVar:DarkEffect:AB$ Effect | Cost$ 0 | Name$ Dark Power Scheme | Duration$ UntilYourNextTurn | Triggers$ DarkPower | SVars$ DarkMana
SVar:DarkPower:Mode$ TapsForMana | ValidCard$ Land | Execute$ DarkMana | TriggerZones$ Command | Static$ True | TriggerDescription$ Whenever a player taps a land for mana, that player adds one mana to his or her mana pool of any type that land produced.
SVar:DarkMana:AB$ ManaReflected | Cost$ 0 | ColorOrType$ Type | Valid$ Defined.Triggered | ReflectProperty$ Produced | Defined$ TriggeredPlayer
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/a_display_of_my_dark_power.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/ARC/A Display of My Dark Power.full.jpg
Oracle:When you set this scheme in motion, until your next turn, whenever a player taps a land for mana, that player adds one mana to his or her mana pool of any type that land produced.

View File

@@ -4,5 +4,5 @@ Types:Vanguard
HandLifeModifier:+1/+7
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | TriggerZones$ Command | ValidCard$ Creature.YouCtrl | Execute$ PumpRandom | TriggerDescription$ Whenever a creature enters the battlefield under your control, it gains two abilities chosen at random from flying, first strike, trample, haste, protection from black, protection from red, and vigilance.
SVar:PumpRandom:AB$ Pump | Cost$ 0 | Defined$ TriggeredCard | Permanent$ True | KW$ Flying & First Strike & Trample & Haste & Protection from black & Protection from red & Vigilance | RandomKeyword$ True | RandomKWNum$ 2
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/akroma_angel_of_wrath_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Akroma, Angel of Wrath Avatar.full.jpg
Oracle:Hand +1, life +7\nWhenever a creature enters the battlefield under your control, it gains two abilities chosen at random from flying, first strike, trample, haste, protection from black, protection from red, and vigilance.

View File

@@ -3,5 +3,5 @@ ManaCost:no cost
Types:Scheme
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ GoodTimes | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, take an extra turn after this one. Schemes can't be set in motion that turn.
SVar:GoodTimes:AB$ AddTurn | Cost$ 0 | NumTurns$ 1 | NoSchemes$ True
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/all_in_good_time.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/ARC/All in Good Time.full.jpg
Oracle:When you set this scheme in motion, take an extra turn after this one. Schemes can't be set in motion that turn.

View File

@@ -5,5 +5,5 @@ T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ Ignite | TriggerZones$ Com
SVar:Ignite:AB$ Destroy | Cost$ 0 | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Artifact | TgtPrompt$ Select target artifact to destroy | SubAbility$ Burn
SVar:Burn:DB$ Destroy | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment to destroy | SubAbility$ Smolder
SVar:Smolder:DB$ Destroy | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Land.nonBasic | TgtPrompt$ Select target nonbasic land to destroy
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/all_shall_smolder_in_my_wake.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/ARC/All Shall Smolder in My Wake.full.jpg
Oracle: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.

View File

@@ -8,5 +8,5 @@ SVar:MoltenRealmCombat:Event$ DamageDone | ActiveZones$ Command | ValidSource$ C
SVar:DmgTimes2:AB$ DealDamage | Cost$ 0 | Defined$ ReplacedTarget | DamageSource$ ReplacedSource | NumDmg$ MoltenX | References$ MoltenX
SVar:DmgTimes2Combat:AB$ DealDamage | Cost$ 0 | CombatDamage$ True | Defined$ ReplacedTarget | DamageSource$ ReplacedSource | NumDmg$ MoltenX | References$ MoltenX
SVar:MoltenX:ReplaceCount$DamageAmount/Twice
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/approach_my_molten_realm.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/ARC/Approach My Molten Realm.full.jpg
Oracle:When you set this scheme in motion, until your next turn, if a source would deal damage, it deals double that damage instead.

View File

@@ -5,5 +5,5 @@ HandLifeModifier:+1/-3
A:AB$ Draw | ActivationZone$ Command | Announce$ X | Cost$ XCantBe0 X Return<1/Creature.cmcEQX/creature you control with converted mana cost X> | NumCards$ Y | References$ X,Y | SpellDescription$ Draw a number of cards chosen at random between 0 and X. X can't be 0. | StackDescription$ SpellDescription
SVar:X:Count$xPaid
SVar:Y:Count$Random.0.X
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/arcanis_the_omnipotent_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Arcanis, the Omnipotent Avatar.full.jpg
Oracle:Hand +1, life -3\n{X}, Return a creature you control with converted mana cost X to its owner's hand: Draw a number of cards chosen at random between 0 and X. X can't be 0.

View File

@@ -6,5 +6,5 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Command | Execu
SVar:BuildCounter:AB$ PutCounter | Cost$ 0 | CounterType$ P1P1 | CounterNum$ 1 | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Command | Execute$ ChargeCounter | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may put a charge counter on target permanent you control.
SVar:ChargeCounter:AB$ PutCounter | Cost$ 0 | CounterType$ CHARGE | CounterNum$ 1 | ValidTgts$ Permanent.YouCtrl | TgtPrompt$ Select target permanent you control
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/arcbound_overseer_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Arcbound Overseer Avatar.full.jpg
Oracle:Hand +0, life +3\nAt the beginning of your upkeep, you may put a +1/+1 counter on target creature you control.\nAt the beginning of your upkeep, you may put a charge counter on target permanent you control.

View File

@@ -3,5 +3,5 @@ ManaCost:no cost
Types:Vanguard
HandLifeModifier:+1/-3
A:AB$ DestroyAll | ActivationZone$ Command | Cost$ 5 | ValidCards$ Permanent.nonLand | PlayerTurn$ True | GameActivationLimit$ 1 | SpellDescription$ Destroy all nonland permanents. Activate this ability only once and only during your turn.
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/ashling_the_extinguisher_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Ashling, the Extinguisher Avatar.full.jpg
Oracle:Hand +1, life -3\n{5}: Destroy all nonland permanents. Activate this ability only once and only during your turn.

View File

@@ -3,5 +3,5 @@ ManaCost:no cost
Types:Vanguard
HandLifeModifier:-1/+6
A:AB$ DamageAll | ActivationZone$ Command | Cost$ 2 | NumDmg$ 1 | ValidCards$ Creature | ValidPlayers$ Each | ValidDescription$ each creature and each player. | SpellDescription$ CARDNAME deals 1 damage to each creature and each player.
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/ashling_the_pilgrim_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Ashling the Pilgrim Avatar.full.jpg
Oracle:Hand -1, life +6\n{2}: Ashling the Pilgrim Avatar deals 1 damage to each creature and each player.

View File

@@ -4,5 +4,5 @@ Types:Vanguard
HandLifeModifier:+1/-8
T:Mode$ DamageDone | ValidSource$ Creature | ValidTarget$ You | Execute$ TrigDestroy | TriggerZones$ Command | TriggerDescription$ Whenever a creature deals damage to you, destroy it.
SVar:TrigDestroy:AB$ Destroy | Cost$ 0 | Defined$ TriggeredSource
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/ashnod.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Ashnod.full.jpg
Oracle:Hand +1, life -8\nWhenever a creature deals damage to you, destroy it.

View File

@@ -4,5 +4,5 @@ Types:Vanguard
HandLifeModifier:+0/+6
A:AB$ ChangeZone | ActivationZone$ Command | Cost$ Sac<1/Permanent> | ValidTgts$ Creature | TgtPrompt$ Select target Creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand.
SVar:RemAIDeck:True
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/barrin.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Barrin.full.jpg
Oracle:Hand +0, life +6\nSacrifice a permanent: Return target creature to its owner's hand.

View File

@@ -3,5 +3,5 @@ ManaCost:no cost
Types:Scheme
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ DarkEffect | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, destroy all nonland permanents target opponent controls.
SVar:DarkEffect:AB$ DestroyAll | Cost$ 0 | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | ValidCards$ Permanent.nonLand
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/behold_the_power_of_destruction.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/ARC/Behold the Power of Destruction.full.jpg
Oracle:When you set this scheme in motion, destroy all nonland permanents target opponent controls.

View File

@@ -4,5 +4,5 @@ Types:Vanguard
HandLifeModifier:+0/-3
S:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Land.YouCtrl | AddAbility$ AnyMana | Description$ Lands you control have "{T}: Add one mana of any color to your mana pool."
SVar:AnyMana:AB$ Mana | Cost$ T | Produced$ Any | Amount$ 1 | SpellDescription$ Add one mana of any color to your mana pool.
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/birds_of_paradise_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Birds of Paradise Avatar1.full.jpg
Oracle:Hand +0, life -3\nLands you control have "{T}: Add one mana of any color to your mana pool."

View File

@@ -4,6 +4,6 @@ Types:Vanguard
HandLifeModifier:+0/-2
A:AB$ DealDamage | ActivationZone$ Command | Announce$ X | Cost$ X Sac<1/Artifact.cmcEQX/artifact with converted mana cost X> | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player | NumDmg$ X | References$ X | SpellDescription$ CARDNAME deals X damage to target creature or player.
SVar:X:Count$xPaid
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/bosh_iron_golem_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Bosh, Iron Golem Avatar.full.jpg
SVar:RemAIDeck:True
Oracle:Hand +0, life -2\n{X}, Sacrifice an artifact with converted mana cost X: Bosh, Iron Golem Avatar deals X damage to target creature or player.

View File

@@ -5,5 +5,5 @@ HandLifeModifier:+0/+3
A:AB$ ChangeZone | ActivationZone$ Command | Cost$ 2 | Origin$ Hand | Destination$ Battlefield | ChangeType$ Land | DefinedPlayer$ Player | ChangeNum$ 1 | Tapped$ True | SpellDescription$ Each player may put a land card from his or her hand onto the battlefield tapped.
A:AB$ ChangeZone | ActivationZone$ Command | Cost$ 3 | Origin$ Hand | Destination$ Battlefield | ChangeType$ Artifact.nonCreature | DefinedPlayer$ Player | ChangeNum$ 1 | SpellDescription$ Each player may put a noncreature artifact card from his or her hand onto the battlefield.
A:AB$ ChangeZone | ActivationZone$ Command | Cost$ 4 | Origin$ Hand | Destination$ Battlefield | ChangeType$ Creature | DefinedPlayer$ Player | ChangeNum$ 1 | SorcerySpeed$ True | SpellDescription$ Each player may put a creature card from his or her hand onto the battlefield. Activate this ability only any time you could cast a sorcery.
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/braids_conjurer_adept_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Braids, Conjurer Adept Avatar.full.jpg
Oracle:Hand +0, life +3\n{2}: Each player may put a land card from his or her hand onto the battlefield tapped.\n{3}: Each player may put a noncreature artifact card from his or her hand onto the battlefield.\n{4}: Each player may put a creature card from his or her hand onto the battlefield. Activate this ability only any time you could cast a sorcery.

View File

@@ -6,5 +6,5 @@ SVar:ChooseChampion:AB$ ChoosePlayer | Cost$ 0 | ValidTgts$ Opponent | Choices$
SVar:PrepChamps:DB$ Effect | RememberObjects$ ChosenPlayer,You | Name$ Choose Your Champion Scheme | Duration$ UntilYourNextTurn | StaticAbilities$ RestrictAttackers,RestrictCasting
SVar:RestrictAttackers:Mode$ Continuous | Affected$ Creature.nonRememberedPlayerCtrl | AddHiddenKeyword$ CARDNAME can't attack. | EffectZone$ Command | Description$ Until your next turn, only you and the chosen player can attack with creatures.
SVar:RestrictCasting:Mode$ CantBeCast | ValidCard$ Card | Caster$ Player.IsNotRemembered | EffectZone$ Command | Description$ Until your next turn, only you and the chosen player can cast spells.
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/choose_your_champion.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/ARC/Choose Your Champion.full.jpg
Oracle: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.

View File

@@ -6,5 +6,5 @@ S:Mode$ Continuous | EffectZone$ Command | Affected$ You | SetMaxHandSize$ Unlim
A:AB$ Draw | ActivationZone$ Command | Cost$ 0 | NumCards$ 3 | Defined$ You | ActivationLimit$ 1 | SubAbility$ DBSkipTurn | SpellDescription$ Draw three cards. You skip your next turn. Activate this ability only once each turn.
SVar:DBSkipTurn:DB$ SkipTurn | NumTurns$ 1 | Defined$ You
SVar:RemAIDeck:True
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/chronatog_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Chronatog Avatar.full.jpg
Oracle:Hand -1, life +1\nYou have no maximum hand size.\n{0}: Draw three cards. You skip your next turn. Activate this ability only once each turn.

View File

@@ -4,5 +4,5 @@ Types:Vanguard
HandLifeModifier:+2/+0
T:Mode$ DamageDone | ValidSource$ Creature+YouCtrl | ValidTarget$ Creature,Player | TriggerZones$ Command | Execute$ TrigGainLife | TriggerDescription$ Whenever a creature you control deals damage to a creature or player, you gain 1 life.
SVar:TrigGainLife:AB$ GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 1
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/crovax.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Crovax.full.jpg
Oracle:Hand +2, life +0\nWhenever a creature you control deals damage to a creature or player, you gain 1 life.

View File

@@ -5,5 +5,5 @@ HandLifeModifier:+1/+0
S:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Hand | Affected$ Card.nonColorless+YouOwn | AddAbility$ STPlayLand | Description$ You may play any colored card from your hand as a copy of a basic land card chosen at random that can produce mana of one of the card's colors.
SVar:STPlayLand:ST$ PlayLandVariant | Cost$ 0 | Clone$ BasicLand | SorcerySpeed$ True | ActivationZone$ Hand | SpellDescription$ Play CARDNAME from your hand as a copy of a basic land card chosen at random that can produce mana of one of CARDNAME's colors.
SVar:RemAIDeck:True
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/dakkon_blackblade_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Dakkon Blackblade Avatar.full.jpg
Oracle:Hand +1, life +0\nYou may play any colored card from your hand as a copy of a basic land card chosen at random that can produce mana of one of the card's colors.

View File

@@ -7,5 +7,5 @@ SVar:MakeItChoose:DB$ ChooseCard | Choices$ Card.IsRemembered | ChoiceZone$ Libr
SVar:MakeItDance:DB$ ChangeZone | Defined$ ChosenCard | Origin$ Library | Destination$ Battlefield | Mandatory$ True | GainControl$ True | ForgetChanged$ True | SubAbility$ TakeOutTheTrash
SVar:TakeOutTheTrash:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Library | Destination$ Graveyard | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/dance_pathetic_marionette.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/ARC/Dance, Pathetic Marionette.full.jpg
Oracle: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.

View File

@@ -3,5 +3,5 @@ ManaCost:no cost
Types:Vanguard
HandLifeModifier:+1/+1
S:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.YouCtrl | AddKeyword$ Exalted | Description$ Creatures you control have exalted. (Whenever a creature you control attacks alone, it gets +1/+1 until end of turn for each instance of exalted among permanents you control.)
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/dauntless_escort_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Dauntless Escort Avatar.full.jpg
Oracle:Hand +1, life +1\nCreatures you control have exalted. (Whenever a creature you control attacks alone, it gets +1/+1 until end of turn for each instance of exalted among permanents you control.)

View File

@@ -4,5 +4,5 @@ Types:Vanguard
HandLifeModifier:+0/+5
A:AB$ Pump | ActivationZone$ Command | Cost$ S | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | NumAtt$ 1 | NumDef$ 1 | SpellDescription$ Target creature you control gets +1/+1 until end of turn.
SVar:RemRandomDeck:True
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/diamond_faerie_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Diamond Faerie Avatar.full.jpg
Oracle:Hand +0, life +5\n{S}: Target creature you control gets +1/+1 until end of turn.

View File

@@ -4,5 +4,5 @@ Types:Scheme
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ BloodyCombat | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, after the main phase, there is an additional combat phase followed by an additional main phase. Creatures you control gain vigilance until end of turn.
SVar:BloodyCombat:DB$ AddPhase | ExtraPhase$ BeginCombat | FollowedBy$ ThisPhase | ConditionPhases$ Main1,Main2 | SubAbility$ MakeVigilant
SVar:MakeVigilant:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Vigilance
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/drench_the_soil_in_their_blood.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/ARC/Drench the Soil in Their Blood.full.jpg
Oracle:When you set this scheme in motion, after the main phase, there is an additional combat phase followed by an additional main phase. Creatures you control gain vigilance until end of turn.

View File

@@ -3,5 +3,5 @@ ManaCost:no cost
Types:Vanguard
HandLifeModifier:+2/-3
A:AB$ Pump | Cost$ 1 | ActivationZone$ Command | ValidTgts$ Permanent.YouCtrl | TgtPrompt$ Select target permanent you control | KW$ Protection from red & Protection from blue & Protection from black & Protection from white & Protection from green | RandomKeyword$ True | NoRepetition$ True | StackDescription$ SpellDescription | SpellDescription$ Until end of turn, target permanent you control gains protection from a color chosen at random from colors it doesn't have protection from.
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/eight_and_a_half_tails_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Eight-and-a-Half-Tails Avatar.full.jpg
Oracle:Hand +2, life -3\n{1}: Until end of turn, target permanent you control gains protection from a color chosen at random from colors it doesn't have protection from.

View File

@@ -13,6 +13,6 @@ SVar:OutOfSight:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Val
SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile | Static$ True
SVar:X:ReplaceCount$DamageAmount/Minus.1
SVar:Y:ReplaceCount$DamageAmount
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/eladamri.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Eladamri.full.jpg
SVar:RemAIDeck:True
Oracle:Hand -1, life +15\n{0}: The next 1 damage that would be dealt to target creature you control is dealt to you instead.

View File

@@ -6,5 +6,5 @@ T:Mode$ Phase | Phase$ Main1 | ValidPlayer$ Player | TriggerZones$ Command | Exe
SVar:TrigAddMana:AB$ Mana | Cost$ 0 | Produced$ G | Amount$ 2 | Defined$ TriggeredPlayer
SVar:RemAIDeck:True
SVar:RemRandomDeck:True
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/eladamri_lord_of_leaves_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Eladamri, Lord of Leaves Avatar.full.jpg
Oracle:Hand -1, life +2\nAt the beginning of each player's precombat main phase, that player adds {G}{G} to his or her mana pool.

View File

@@ -5,5 +5,5 @@ HandLifeModifier:+0/-5
T:Mode$ NewGame | TriggerZones$ Command | Execute$ TrigToken | Static$ True | TriggerDescription$ You begin the game with a 1/1 green Elf creature token on the battlefield. It has "{T}: Add {G} to your mana pool."
SVar:TrigToken:AB$ Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Elf | TokenTypes$ Creature,Elf | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | TokenAbilities$ DBMana
SVar:DBMana:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G} to your mana pool.
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/elvish_champion_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Elvish Champion Avatar.full.jpg
Oracle:Hand +0, life -5\nYou begin the game with a 1/1 green Elf creature token on the battlefield. It has "{T}: Add {G} to your mana pool."

View File

@@ -5,5 +5,5 @@ T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ GraveEmbrace | TriggerZone
SVar:GraveEmbrace:AB$ ChangeZoneAll | Cost$ 0 | ChangeType$ Card | Origin$ Graveyard,Hand | Destination$ Library | Shuffle$ True | SubAbility$ MyVision
SVar:MyVision:DB$ Draw | Defined$ You | NumCards$ 7 | SubAbility$ PitifulDraw
SVar:PitifulDraw:DB$ Draw | Defined$ Player.Other | NumCards$ 4
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/embrace_my_diabolical_vision.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/ARC/Embrace My Diabolical Vision.full.jpg
Oracle:When you set this scheme in motion, each player shuffles his or her hand and graveyard into his or her library. You draw seven cards, then each other player draws four cards.

View File

@@ -8,5 +8,5 @@ SVar:DBPlay:DB$ Play | Defined$ Remembered | Controller$ You | WithoutManaCost$
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:NumColoredCast:Count$ThisTurnCast_Artifact.nonColorless+YouCtrl
SVar:X:Count$TriggeredCardManaCost
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/enigma_sphinx_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Enigma Sphinx Avatar.full.jpg
Oracle:Hand +0, life +5\nWhenever you cast a colored artifact spell for the first time in a turn, search your library for a colored artifact card chosen at random whose converted mana cost is less than that spell's converted mana cost. You may play that card without paying its mana cost. If you don't, put that card on the bottom of your library.

View File

@@ -4,5 +4,5 @@ Types:Vanguard
HandLifeModifier:+0/+3
T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ You | Execute$ DjinnisGift | TriggerZones$ Command | TriggerDescription$ Whenever you cast a creature spell, put a 1/1 green Saproling creature token onto the battlefield.
SVar:DjinnisGift:AB$ Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/erhnam_djinn_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Erhnam Djinn Avatar1.full.jpg
Oracle:Hand +0, life +3\nWhenever you cast a creature spell, put a 1/1 green Saproling creature token onto the battlefield.

View File

@@ -3,5 +3,5 @@ ManaCost:no cost
Types:Vanguard
HandLifeModifier:-1/+4
S:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.YouCtrl | AddKeyword$ Hexproof | Description$ Creatures you control have hexproof. (They can't be the targets of spells or abilities your opponents control.)
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/ertai.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Ertai.full.jpg
Oracle:Hand -1, life +4\nCreatures you control have hexproof. (They can't be the targets of spells or abilities your opponents control.)

View File

@@ -4,5 +4,5 @@ Types:Vanguard
HandLifeModifier:+1/-4
S:Mode$ Continuous | EffectZone$ Command | Affected$ Card.YouCtrl | AddHiddenKeyword$ Alternative Cost W U B R G | AffectedZone$ Hand,Graveyard,Exile,Library,Command | Description$ You may pay {W}{U}{B}{R}{G} rather than pay the mana cost for spells that you cast.
SVar:RemRandomDeck:True
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/etched_oracle_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Etched Oracle Avatar.full.jpg
Oracle:Hand +1, life -4\nYou may pay {W}{U}{B}{R}{G} rather than pay the mana cost for spells that you cast.

View File

@@ -3,5 +3,5 @@ ManaCost:no cost
Types:Scheme
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ DiscardHope | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, each opponent reveals his or her hand. Choose a nonland card from each of those hands. Those players discard those cards.
SVar:DiscardHope:AB$ Discard | Cost$ 0 | Defined$ Player.Opponent | Mode$ RevealYouChoose | DiscardValid$ Card.nonLand | NumCards$ 1
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/every_hope_shall_vanish.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/ARC/Every Hope Shall Vanish.full.jpg
Oracle:When you set this scheme in motion, each opponent reveals his or her hand. Choose a nonland card from each of those hands. Those players discard those cards.

View File

@@ -4,5 +4,5 @@ Types:Scheme
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ MoveToBottom | TriggerZones$ Command | OptionalDecider$ You | TriggerDescription$ When you set this scheme in motion, you may pay {X}. If you do, put each nonland permanent target player controls with converted mana cost X or less on the bottom of its owner's library.
SVar:MoveToBottom:AB$ ChangeZoneAll | Cost$ X | ChangeType$ Permanent.nonLand+cmcLEX | ValidTgts$ Player | TgtPrompt$ Select target player | Origin$ Battlefield | Destination$ Library | LibraryPosition$ -1
SVar:X:Count$xPaid
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/every_last_vestige_shall_rot.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/ARC/Every Last Vestige Shall Rot.full.jpg
Oracle:When you set this scheme in motion, you may pay {X}. If you do, put each nonland permanent target player controls with converted mana cost X or less on the bottom of its owner's library.

View File

@@ -5,5 +5,5 @@ T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ NewEvil | TriggerZones$ Co
SVar:NewEvil:AB$ Token | Cost$ 0 | TokenAmount$ 7 | TokenName$ Plant | TokenTypes$ Creature,Plant | TokenOwner$ You | TokenColors$ Green | TokenPower$ 0 | TokenToughness$ 1 | ConditionPresent$ Land.YouCtrl | ConditionCompare$ LT10 | SubAbility$ MatureEvil
SVar:MatureEvil:DB$ Token | Cost$ 0 | TokenAmount$ 7 | TokenName$ Elemental | TokenTypes$ Creature,Elemental | TokenOwner$ You | TokenColors$ Green | TokenPower$ 3 | TokenToughness$ 3 | ConditionPresent$ Land.YouCtrl | ConditionCompare$ GE10
SVar:X:Count$NumTypeYouCtrl.Land
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/evil_comes_to_fruition.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/ARC/Evil Comes to Fruition.full.jpg
Oracle:When you set this scheme in motion, put seven 0/1 green Plant creature tokens onto the battlefield. If you control ten or more lands, put seven 3/3 green Elemental creature tokens onto the battlefield instead.

View File

@@ -5,5 +5,5 @@ HandLifeModifier:+0/-5
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouCtrl | Execute$ TrigDrain | TriggerZones$ Command | TriggerDescription$ Whenever a creature you control dies, target opponent loses 1 life and you gain 1 life.
SVar:TrigDrain:AB$ LoseLife | Cost$ 0 | ValidTgts$ Opponent | LifeAmount$ 1 | SubAbility$ DBGainLife
SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/fallen_angel_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Fallen Angel Avatar.full.jpg
Oracle:Hand +0, life -5\nWhenever a creature you control dies, target opponent loses 1 life and you gain 1 life.

View File

@@ -4,5 +4,5 @@ Types:Vanguard
HandLifeModifier:+0/+3
A:AB$ PutCounter | ActivationZone$ Command | Announce$ X | Cost$ X | CounterType$ P1P1 | CounterNum$ 1 | ValidTgts$ Creature.counters_LTX_P1P1 | TgtPrompt$ Select target creature with fewer than X +1/+1 counters on it | References$ X | SpellDescription$ Put a +1/+1 counter on target creature with fewer than X +1/+1 counters on it.
SVar:X:Count$xPaid
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/figure_of_destiny_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Figure of Destiny Avatar.full.jpg
Oracle:Hand +0, life +3\n{X}: Put a +1/+1 counter on target creature with fewer than X +1/+1 counters on it.

View File

@@ -5,5 +5,5 @@ HandLifeModifier:+0/-6
T:Mode$ ChangesZone | ValidCard$ Creature.nonToken+YouCtrl | Origin$ Any | Destination$ Battlefield | Execute$ TrigDealDamage | TriggerZones$ Command | TriggerDescription$ Whenever a nontoken creature enters the battlefield under your control, that creature deals X damage to target creature, where X is a number chosen at random from 0 to 4.
SVar:TrigDealDamage:AB$ DealDamage | Cost$ 0 | ValidTgts$ Creature | NumDmg$ X | References$ X | DamageSource$ TriggeredCard
SVar:X:Count$Random.0.4
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/flametongue_kavu_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Flametongue Kavu Avatar.full.jpg
Oracle:Hand +0, life -6\nWhenever a nontoken creature enters the battlefield under your control, that creature deals X damage to target creature, where X is a number chosen at random from 0 to 4.

View File

@@ -6,5 +6,5 @@ S:Mode$ Continuous | EffectZone$ Command | Affected$ Permanent.YouCtrl | AddKeyw
T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Command | Execute$ TrigFlip | TriggerDescription$ At the beginning of your end step, flip a coin. If you win the flip, take an extra turn after this one.
SVar:TrigFlip:AB$ FlipACoin | Cost$ 0 | Defined$ You | WinSubAbility$ DBAddTurn
SVar:DBAddTurn:DB$ AddTurn | NumTurns$ 1
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/frenetic_efreet_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Frenetic Efreet Avatar.full.jpg
Oracle:Hand -1, life -3\nEach permanent you control has phasing. (It phases in or out before you untap during each of your untap steps. While it's phased out, it's treated as though it doesn't exist.)\nAt the beginning of your end step, flip a coin. If you win the flip, take an extra turn after this one.

View File

@@ -4,5 +4,5 @@ Types:Vanguard
HandLifeModifier:-4/+0
T:Mode$ Phase | Phase$ Draw | ValidPlayer$ You | TriggerZones$ Command | Execute$ TrigDraw | TriggerDescription$ At the beginning of your draw step, draw an additional card.
SVar:TrigDraw:AB$ Draw | Cost$ 0 | NumCards$ 1 | Defined$ You
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/gerrard.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Gerrard.full.jpg
Oracle:Hand -4, life +0\nAt the beginning of your draw step, draw an additional card.

View File

@@ -3,5 +3,5 @@ ManaCost:no cost
Types:Vanguard
HandLifeModifier:-2/+18
A:AB$ ChangeZone | Cost$ 3 | ActivationZone$ Command | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Select target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | SpellDescription$ Return target creature card from your graveyard to your hand.
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/gix.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Gix.full.jpg
Oracle:Hand -2, life +18\n{3}: Return target creature card from your graveyard to your hand.

View File

@@ -3,5 +3,5 @@ ManaCost:no cost
Types:Vanguard
HandLifeModifier:+1/+2
S:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature.attacking+YouCtrl | AddPower$ 1 | Description$ Attacking creatures you control get +1/+0.
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/goblin_warchief_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Goblin Warchief Avatar1.full.jpg
Oracle:Hand +1, life +2\nAttacking creatures you control get +1/+0.

View File

@@ -4,5 +4,5 @@ Types:Vanguard
HandLifeModifier:-1/+2
T:Mode$ DamageDone | ValidSource$ Creature.YouCtrl | ValidTarget$ Creature | TriggerZones$ Command | Execute$ TrigDestroy | TriggerDescription$ Whenever a creature you control deals damage to a creature, destroy the other creature. It can't be regenerated.
SVar:TrigDestroy:AB$ Destroy | Cost$ 0 | Defined$ TriggeredTarget | NoRegen$ True
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/greven_il-vec.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Greven il-Vec.full.jpg
Oracle:Hand -1, life +2\nWhenever a creature you control deals damage to a creature, destroy the other creature. It can't be regenerated.

View File

@@ -4,5 +4,5 @@ Types:Vanguard
HandLifeModifier:-1/-2
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouCtrl+nonToken | TriggerZones$ Command | Execute$ GrinningDiscard | TriggerDescription$ Whenever a nontoken creature you control dies, target opponent discards a card.
SVar:GrinningDiscard:AB$ Discard | Cost$ 0 | ValidTgts$ Opponent | TgtPrompt$ Select an opponent to discard | NumCards$ 1 | Mode$ TgtChoose
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/grinning_demon_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Grinning Demon Avatar1.full.jpg
Oracle:Hand -1, life -2\nWhenever a nontoken creature you control dies, target opponent discards a card.

View File

@@ -6,5 +6,5 @@ A:AB$ Pump | ActivationZone$ Command | Cost$ PayLife<1> | TgtZone$ Graveyard | V
T:Mode$ SpellCast | ValidCard$ Card.wasCastFromGraveyard | ValidControllingPlayer$ You | TriggerZones$ Command | Execute$ TrigAnimate | TriggerDescription$ Whenever you play a creature card from your graveyard, it becomes a black Zombie Knight.
SVar:TrigAnimate:AB$ Animate | Cost$ 0 | Defined$ TriggeredCard | Types$ Zombie,Knight | Colors$ Black | OverwriteColors$ True | Permanent$ True | OverwriteTypes$ True | KeepSupertypes$ True | KeepCardTypes$ True
S:Mode$ Continuous | EffectZone$ Command | Affected$ Card.Zombie+Knight | AffectedZone$ Battlefield | AddHiddenKeyword$ If CARDNAME would be put into a graveyard, exile it instead. | Description$ If a Zombie Knight would be put into your graveyard from the battlefield, exile it instead.
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/haakon_stromgald_scourge_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Haakon, Stromgald Scourge Avatar.full.jpg
Oracle:Hand +0, life -3\nPay 1 life: You may play target creature card in your graveyard this turn.\nWhenever you play a creature card from your graveyard, it becomes a black Zombie Knight.\nIf a Zombie Knight would be put into your graveyard from the battlefield, exile it instead.

View File

@@ -3,5 +3,5 @@ ManaCost:no cost
Types:Vanguard
HandLifeModifier:+1/-5
S:Mode$ ReduceCost | EffectZone$ Command | ValidCard$ Card | Type$ Spell | Activator$ You | Amount$ 1 | Description$ Spells you cast cost {1} less to cast.
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/hanna.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Hanna.full.jpg
Oracle:Hand +1, life -5\nSpells you cast cost {1} less to cast.

View File

@@ -4,5 +4,5 @@ Types:Vanguard
HandLifeModifier:-1/+4
S:Mode$ ReduceCost | EffectZone$ Command | ValidCard$ Card.Creature | Activator$ You | Type$ Spell | OnlyFirstSpell$ True | Amount$ 1 | Description$ The first creature spell you cast each turn costs {1} less to cast.
S:Mode$ RaiseCost | EffectZone$ Command | ValidCard$ Card.nonCreature | Activator$ Player.Opponent | Type$ Spell | OnlyFirstSpell$ True | Amount$ 1 | Description$ The first noncreature spell each opponent casts each turn costs {1} more to cast.
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/heartwood_storyteller_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Heartwood Storyteller Avatar.full.jpg
Oracle:Hand -1, life +4\nThe first creature spell you cast each turn costs {1} less to cast.\nThe first noncreature spell each opponent casts each turn costs {1} more to cast.

View File

@@ -4,5 +4,5 @@ Types:Vanguard
HandLifeModifier:-1/-4
A:AB$ ChangeZone | Cost$ 3 Sac<1/Creature/creature> | ActivationZone$ Command | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature in your graveyard | SpellDescription$ Return target creature card from your graveyard to the battlefield.
SVar:RemAIDeck:True
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/hells_caretaker_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Hell's Caretaker Avatar.full.jpg
Oracle:Hand -1, life -4\n{3}, Sacrifice a creature: Return target creature card from your graveyard to the battlefield.

View File

@@ -4,5 +4,5 @@ Types:Vanguard
HandLifeModifier:-2/-2
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigBounce | TriggerZones$ Command | TriggerDescription$ At the beginning of your upkeep, put a land card from your library chosen at random onto the battlefield.
SVar:TrigBounce:AB$ ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Battlefield | AtRandom$ True | ChangeType$ Land
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/hermit_druid_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Hermit Druid Avatar.full.jpg
Oracle:Hand -2, life -2\nAt the beginning of your upkeep, put a land card from your library chosen at random onto the battlefield.

View File

@@ -4,5 +4,5 @@ Types:Vanguard
HandLifeModifier:-1/+3
T:Mode$ DamageDone | ValidSource$ Creature.nonToken+YouCtrl | ValidTarget$ Opponent | TriggerZones$ Command | CombatDamage$ True | Execute$ TrigChangeZone | TriggerDescription$ Whenever a nontoken creature you control deals combat damage to an opponent, choose a creature card at random from your library, reveal that card, and put it into your hand. Then shuffle your library.
SVar:TrigChangeZone:AB$ ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Hand | AtRandom$ True | ChangeType$ Card.Creature | ChangeNum$ 1
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/higure_the_still_wind_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Higure, the Still Wind Avatar.full.jpg
Oracle:Hand -1, life +3\nWhenever a nontoken creature you control deals combat damage to an opponent, choose a creature card at random from your library, reveal that card, and put it into your hand. Then shuffle your library.

View File

@@ -4,6 +4,6 @@ Types:Plane Pyrulea
S:Mode$ Continuous | EffectZone$ Command | Affected$ Permanent | AddHiddenKeyword$ CARDNAME untaps during each other player's untap step. | Description$ All permanents untap during each player's untap step.
T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ DBFetch | TriggerDescription$ Whenever you roll {C}, you may search your library for up to three basic land cards, put them onto the battlefield tapped, then shuffle your library.
SVar:DBFetch:DB$ChangeZone | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Basic | ChangeNum$ 3 | ShuffleNonMandatory$ True
SVar:Picture:http://www.cardforge.org/fpics/lq_planes_promos/horizon_boughs.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/HOP/Horizon Boughs.jpg
SVar:AIRollPlanarDieParams:Mode$ Always | LowPriority$ True | MaxRollsPerTurn$ 9
Oracle:All permanents untap during each player's untap step.\nWhenever you roll {C}, you may search your library for up to three basic land cards, put them onto the battlefield tapped, then shuffle your library.

View File

@@ -4,5 +4,5 @@ Types:Scheme
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ OppTutor | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, each other player searches his or her library for a card, reveals it, and puts it into his or her hand. Then you search your library for two cards and put them into your hand. Each player shuffles his or her library.
SVar:OppTutor:AB$ ChangeZone | Cost$ 0 | DefinedPlayer$ Player.Other | Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ 1 | Reveal$ True | Mandatory$ True | SubAbility$ MyMagic
SVar:MyMagic:DB$ ChangeZone | DefinedPlayer$ You | Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ 2 | Mandatory$ True
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/i_call_on_the_ancient_magics.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/ARC/I Call on the Ancient Magics.full.jpg
Oracle:When you set this scheme in motion, each other player searches his or her library for a card, reveals it, and puts it into his or her hand. Then you search your library for two cards and put them into your hand. Each player shuffles his or her library.

View File

@@ -5,5 +5,5 @@ T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ DarkEffect | TriggerZones$
SVar:DarkEffect:AB$ LoseLife | Cost$ 0 | Defined$ Player.Opponent | LifeAmount$ 3 | SubAbility$ DBGainLife
SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ AFLifeLost | StackDescription$ You gain life equal to the life lost this way.
SVar:AFLifeLost:Number$0
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/i_delight_in_your_convulsions.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/ARC/I Delight in Your Convulsions.full.jpg
Oracle:When you set this scheme in motion, each opponent loses 3 life. You gain life equal to the life lost this way.

View File

@@ -5,5 +5,5 @@ S:Mode$ Continuous | EffectZone$ Command | Affected$ Permanent.YouCtrl | AddHidd
T:Mode$ Phase | Phase$ End of Turn | Execute$ Abandon | TriggerZones$ Command | CheckSVar$ X | SVarCompare$ GE3 | TriggerDescription$ At the beginning of each end step, if three or more cards were put into your graveyard this turn from anywhere, abandon this scheme.
SVar:Abandon:AB$ Abandon | Cost$ 0
SVar:X:Count$ThisTurnEntered_Graveyard_Card.YouOwn
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/i_know_all_i_see_all.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/ARC/I Know All, I See All.full.jpg
Oracle:(An ongoing scheme remains face up until it's abandoned.)\nUntap all permanents you control during each opponent's untap step.\nAt the beginning of each end step, if three or more cards were put into your graveyard this turn from anywhere, abandon this scheme.

View File

@@ -3,5 +3,5 @@ ManaCost:no cost
Types:Scheme
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ DarkEffect | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, put a token onto the battlefield that's a copy of target permanent an opponent controls.
SVar:DarkEffect:AB$ CopyPermanent | Cost$ 0 | ValidTgts$ Permanent.OppCtrl | TgtPrompt$ Select target permanent an opponent controls
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/ignite_the_cloneforge.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/ARC/Ignite the Cloneforge!.full.jpg
Oracle:When you set this scheme in motion, put a token onto the battlefield that's a copy of target permanent an opponent controls.

View File

@@ -7,5 +7,5 @@ S:Mode$ Continuous | EffectZone$ Command | Affected$ Permanent.ChosenCtrl | Affe
T:Mode$ Attacks | ValidCard$ Card | Attacked$ Player.Chosen | Execute$ Abandon | TriggerZones$ Command | TriggerDescription$ When the chosen player is attacked or becomes the target of a spell or ability, abandon this scheme.
T:Mode$ BecomesTarget | ValidTarget$ Player.Chosen | TriggerZones$ Command | Execute$ Abandon | Secondary$ True | TriggerDescription$ When the chosen player is attacked or becomes the target of a spell or ability, abandon this scheme.
SVar:Abandon:AB$ Abandon | Cost$ 0
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/imprison_this_insolent_wretch.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/ARC/Imprison This Insolent Wretch.full.jpg
Oracle:When you set this scheme in motion, choose an opponent.\nPermanents the chosen player controls don't untap during his or her untap step.\nWhen the chosen player is attacked or becomes the target of a spell or ability, abandon this scheme.

View File

@@ -6,5 +6,5 @@ T:Mode$ NewGame | Execute$ TrigDiscard | TriggerZones$ Command | TriggerDescript
SVar:TrigDiscard:AB$ Discard | Cost$ 0 | ValidTgts$ Opponent | Mode$ RevealYouChoose | NumCards$ 1 | DiscardValid$ Card.nonLand
A:AB$ ChangeZone | ActivationZone$ Command | Announce$ X | Cost$ X PayLife<X> | References$ X | ValidTgts$ Creature.OppOwn+cmcEQX | TgtPrompt$ Select target creature with converted mana cost X from an opponent's graveyard | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | SpellDescription$ Put target creature card with converted mana cost X from an opponent's graveyard onto the battlefield under your control.
SVar:X:Count$xPaid
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/ink_eyes_servant_of_oni_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Ink-Eyes, Servant of Oni Avatar.full.jpg
Oracle:Hand +0, life -3\nAt the beginning of the game, look at target opponent's hand and choose a nonland card from it. That player discards that card.\n{X}, Pay X life: Put target creature card with converted mana cost X from an opponent's graveyard onto the battlefield under your control.

View File

@@ -5,5 +5,5 @@ T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ ExileFlying | TriggerZones
SVar:ExileFlying:AB$ ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Exile | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with Flying | SubAbility$ ExileWithoutFly
SVar:ExileWithoutFly:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Creature.withoutFlying | TgtPrompt$ Select target creature without Flying | SubAbility$ ExileAllYard
SVar:ExileAllYard:DB$ ChangeZoneAll | Origin$ Graveyard | Destination$ Exile | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Opponent | ChangeType$ Card
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/into_the_earthen_maw.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/ARC/Into the Earthen Maw.full.jpg
Oracle:When you set this scheme in motion, exile up to one target creature with flying, up to one target creature without flying, and all cards from up to one target opponent's graveyard.

View File

@@ -5,5 +5,5 @@ T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ TrigCharm | TriggerZones$
SVar:TrigCharm:AB$ Charm | Cost$ 0 | Choices$ DBTutorCreature,DBPutCreature | CharmNum$ 1
SVar:DBTutorCreature:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Card.Creature | ChangeNum$ 1 | SpellDescription$ Search your library for a creature card, reveal it, put it into your hand, then shuffle your library;
SVar:DBPutCreature:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | ChangeType$ Card.Creature | ChangeNum$ 1 | SpellDescription$ or you may put a creature card from your hand onto the battlefield.
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/introductions_are_in_order.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/ARC/Introductions Are in Order.full.jpg
Oracle:When you set this scheme in motion, choose one -\n• Search your library for a creature card, reveal it, put it into your hand, then shuffle your library.\n• You may put a creature card from your hand onto the battlefield.

View File

@@ -5,5 +5,5 @@ HandLifeModifier:+0/+1
A:AB$ DealDamage | ActivationZone$ Command | Cost$ X | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player | NumDmg$ Y | References$ X,Y | ActivationLimit$ 1 | StackDescription$ SpellDescription | SpellDescription$ CARDNAME deals an amount of damage chosen at random from 0 to X to target creature or player. Activate this ability only once each turn.
SVar:X:Count$xPaid
SVar:Y:Count$Random.0.X
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/jaya_ballard_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Jaya Ballard Avatar.full.jpg
Oracle:Hand +0, life +1\n{X}: Jaya Ballard Avatar deals an amount of damage chosen at random from 0 to X to target creature or player. Activate this ability only once each turn.

View File

@@ -4,5 +4,5 @@ Types:Vanguard
HandLifeModifier:+1/+0
A:AB$ Play | Cost$ 3 Discard<1/Card> | ActivationZone$ Command | AnySupportedCard$ Instant | RandomCopied$ True | RandomNum$ 3 | ChoiceNum$ 1 | CopyCard$ True | WithoutManaCost$ True | SpellDescription$ Copy three instant cards chosen at random. You may cast one of the copies without paying its mana cost.
A:AB$ Play | Cost$ 3 Discard<1/Card> | ActivationZone$ Command | AnySupportedCard$ Sorcery | RandomCopied$ True | RandomNum$ 3 | ChoiceNum$ 1 | CopyCard$ True | WithoutManaCost$ True | SorcerySpeed$ True | SpellDescription$ Copy three sorcery cards chosen at random. You may cast one of the copies without paying its mana cost. Activate this ability only any time you could cast a sorcery.
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/jhoira_of_the_ghitu_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Jhoira of the Ghitu Avatar.full.jpg
Oracle:Hand +1, life +0\n{3}, Discard a card: Copy three instant cards chosen at random. You may cast one of the copies without paying its mana cost.\n{3}, Discard a card: Copy three sorcery cards chosen at random. You may cast one of the copies without paying its mana cost. Activate this ability only any time you could cast a sorcery.

View File

@@ -4,5 +4,5 @@ Types:Vanguard
HandLifeModifier:+1/+6
S:Mode$ Continuous | EffectZone$ Command | Affected$ Artifact.nonCreature+YouCtrl | SetPower$ AffectedX | SetToughness$ AffectedX | AddType$ Creature | Description$ Each noncreature artifact you control is an artifact creature with power and toughness each equal to its converted mana cost.
SVar:AffectedX:Count$CardManaCost
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/karn.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Karn.full.jpg
Oracle:Hand +1, life +6\nEach noncreature artifact you control is an artifact creature with power and toughness each equal to its converted mana cost.

View File

@@ -7,5 +7,5 @@ SVar:TrigExchangeChoose:AB$ ChooseCard | Cost$ 0 | ValidTgts$ Opponent | Choices
SVar:ChooseYou:DB$ ChooseCard | Choices$ Permanent.YouCtrl | Amount$ 1 | AtRandom$ True | RememberChosen$ True | SubAbility$ DBExchange
SVar:DBExchange:DB$ ExchangeControl | Defined$ Remembered | BothDefined$ True | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/karona_false_god_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Karona, False God Avatar.full.jpg
Oracle:Hand -1, life +8\nAt the beginning of your upkeep, exchange control of a permanent you control chosen at random and a permanent target opponent controls chosen at random.

View File

@@ -5,5 +5,5 @@ T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ DmgAll | TriggerZones$ Com
SVar:DmgAll:AB$ RepeatEach | Cost$ 0 | RepeatPlayers$ Player.Opponent | RepeatSubAbility$ DBDamage
SVar:DBDamage:DB$ DealDamage | Defined$ Player.IsRemembered | NumDmg$ X | References$ X
SVar:X:PlayerCountRemembered$CardsInHand
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/know_naught_but_fire.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/ARC/Know Naught but Fire.full.jpg
Oracle:When you set this scheme in motion, it deals damage to each opponent equal to the number of cards in that player's hand.

View File

@@ -5,5 +5,5 @@ HandLifeModifier:+1/-3
T:Mode$ Devoured | ValidDevoured$ Creature.YouCtrl | TriggerZones$ Command | Execute$ TrigToken | TriggerDescription$ Whenever a creature you control is devoured, put an X/X green Ooze creature token onto the battlefield, where X is the devoured creature's power.
SVar:TrigToken:AB$ Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Ooze | TokenTypes$ Creature,Ooze | TokenOwner$ You | TokenColors$ Green | TokenPower$ X | TokenToughness$ X | References$ X | TokenImage$ g x x ooze rtr | SpellDescription$ Put an X/X green Ooze creature token onto the battlefield.
SVar:X:TriggeredDevoured$CardPower
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/kresh_the_bloodbraided_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Kresh the Bloodbraided Avatar.full.jpg
Oracle:Hand +1, life -3\nWhenever a creature you control is devoured, put an X/X green Ooze creature token onto the battlefield, where X is the devoured creature's power.

View File

@@ -3,5 +3,5 @@ ManaCost:no cost
Types:Scheme
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ DarkEffect | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, put a 5/5 red Dragon creature token with flying onto the battlefield.
SVar:DarkEffect:AB$ Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Dragon | TokenTypes$ Creature,Dragon | TokenOwner$ You | TokenColors$ Red | TokenPower$ 5 | TokenToughness$ 5 | TokenKeywords$ Flying
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/look_skyward_and_despair.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/ARC/Look Skyward and Despair.full.jpg
Oracle:When you set this scheme in motion, put a 5/5 red Dragon creature token with flying onto the battlefield.

View File

@@ -3,5 +3,5 @@ ManaCost:no cost
Types:Vanguard
HandLifeModifier:+0/+12
A:AB$ Regenerate | ActivationZone$ Command | Cost$ Sac<1/Permanent> | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | SpellDescription$ Regenerate target creature you control.
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/loxodon_hierarch_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Loxodon Hierarch Avatar.full.jpg
Oracle:Hand +0, life +12\nSacrifice a permanent: Regenerate target creature you control.

View File

@@ -3,5 +3,5 @@ ManaCost:no cost
Types:Vanguard
HandLifeModifier:+2/-4
S:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.YouCtrl | AddKeyword$ Shadow | Description$ Creatures you control have shadow. (They can block and be blocked only by creatures with shadow.)
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/lyna.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Lyna.full.jpg
Oracle:Hand +2, life -4\nCreatures you control have shadow. (They can block and be blocked only by creatures with shadow.)

View File

@@ -9,5 +9,5 @@ SVar:DmgTwiceCombat:AB$ DealDamage | Cost$ 0 | CombatDamage$ True | Defined$ Rep
SVar:X:ReplaceCount$DamageAmount/Twice
T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Command | Hellbent$ True | Execute$ LyzoldasDiscard | TriggerDescription$ Hellbent - At the beginning of your end step, if you have no cards in hand, each of your opponents discards a card.
SVar:LyzoldasDiscard:AB$ Discard | Cost$ 0 | Defined$ Player.Opponent | NumCards$ 1 | Mode$ TgtChoose
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/lyzolda_the_blood_witch_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Lyzolda, the Blood Witch Avatar.full.jpg
Oracle:Hand -1, life -1\nHellbent - 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.\nHellbent - At the beginning of your end step, if you have no cards in hand, each of your opponents discards a card.

View File

@@ -11,5 +11,5 @@ T:Mode$ Phase | Phase$ Draw | ValidPlayer$ You | TriggerZones$ Command | Execute
SVar:TrigDig:AB$ Dig | Cost$ 0 | DigNum$ LifePaidOnNewGame | References$ LifePaidOnNewGame | ChangeNum$ 1 | LibraryPosition$ 0 | SubAbility$ DBShuffle
SVar:DBShuffle:DB$ Shuffle | Defined$ You
SVar:RemAIDeck:True
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/maralen_of_the_mornsong_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Maralen of the Mornsong Avatar.full.jpg
Oracle:Hand +0, life -3\nAt the beginning of the game, you may pay any amount of life.\nYou can't draw cards.\nAt the beginning of your draw step, look at the top X cards of your library, where X is the amount of life paid with Maralen of the Mornsong Avatar. Put one of them into your hand, then shuffle your library.

View File

@@ -3,5 +3,5 @@ ManaCost:no cost
Types:Vanguard
HandLifeModifier:+1/+2
S:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.YouCtrl | AddPower$ 1 | Description$ Creatures you control get +1/+0.
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/maraxus.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Maraxus.full.jpg
Oracle:Hand +1, life +2\nCreatures you control get +1/+0.

View File

@@ -4,6 +4,6 @@ Types:Vanguard
HandLifeModifier:+2/-7
A:AB$ Pump | Cost$ tapXType<1/Creature> Discard<1/Card> | ActivationZone$ Command | ValidTgts$ Creature | NumAtt$ +X | NumDef$ +X | SpellDescription$ Target creature you control gets +X/+X until end of turn, where X is the number of cards in your hand.
SVar:X:Count$InYourHand
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/maro_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Maro Avatar.full.jpg
SVar:RemAIDeck:True
Oracle:Hand +2, life -7\nTap an untapped creature you control, Discard a card: Target creature you control gets +X/+X until end of turn, where X is the number of cards in your hand.

View File

@@ -7,5 +7,5 @@ SVar:Wolf:DB$ Token | TokenAmount$ 1 | TokenName$ Wolf | TokenTypes$ Creature,Wo
SVar:Antelope:DB$ Token | TokenAmount$ 1 | TokenName$ Antelope | TokenTypes$ Creature,Antelope | TokenOwner$ You | TokenColors$ Green | TokenPower$ 2 | TokenToughness$ 3 | TokenKeywords$ Forestwalk | SpellDescription$ Antelope
SVar:Cat:DB$ Token | TokenAmount$ 1 | TokenName$ Cat | TokenTypes$ Creature,Cat | TokenOwner$ You | TokenColors$ Green | TokenPower$ 3 | TokenToughness$ 2 | TokenKeywords$ Shroud | SpellDescription$ Cat
SVar:Rhino:DB$ Token | TokenAmount$ 1 | TokenName$ Rhino | TokenTypes$ Creature,Rhino | TokenOwner$ You | TokenColors$ Green | TokenPower$ 4 | TokenToughness$ 4 | TokenKeywords$ Trample | SpellDescription$ Rhino
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/master_of_the_wild_hunt_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Master of the Wild Hunt Avatar.full.jpg
Oracle:Hand +1, life +3\n{2}{G}: Put a green creature token onto the battlefield that's a 2/2 Wolf, a 2/3 Antelope with forestwalk, a 3/2 Cat with shroud, or a 4/4 Rhino with trample, chosen at random.

View File

@@ -7,5 +7,5 @@ SVar:TrigDig:AB$ Dig | Cost$ 0 | DigNum$ 1 | Reveal$ True | ChangeNum$ All | Cha
SVar:DBDig:DB$ Dig | DigNum$ 1 | DestinationZone$ Library | Optional$ True | LibraryPosition$ -1 | LibraryPosition2$ 0 | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | SubAbility$ DBCleanup | References$ X
SVar:X:Remembered$Amount
SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/mayael_the_anima_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Mayael the Anima Avatar.full.jpg
Oracle:Hand +1, life +5\nAt the beginning of your upkeep, reveal the top card of your library. If it's a creature card with power 5 or greater, put it into your hand. Otherwise, you may put it on the bottom of your library.

View File

@@ -5,5 +5,5 @@ HandLifeModifier:+0/+5
R:Event$ ProduceMana | ActiveZones$ Command | ValidCard$ Land.Basic+YouCtrl | ManaReplacement$ ProduceAny | Description$ If a basic land you control is tapped for mana, it produces mana of a color of your choice instead of any other type.
SVar:ProduceAny:Colorless->Any & B->Any & R->Any & G->Any & W->Any & U->Any
SVar:RemAIDeck:True
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/mirri.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Mirri.full.jpg
Oracle:Hand +0, life +5\nIf a basic land you control is tapped for mana, it produces mana of a color of your choice instead of any other type.

View File

@@ -5,5 +5,5 @@ HandLifeModifier:-2/-3
S:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature.YouCtrl | AddAbility$ MirriPump | AddSVar$ MirriPutCounter | Description$ Creatures you control have "{T}: Another target creature gets -1/-1 until end of turn. Put a +1/+1 counter on this creature."
SVar:MirriPump:AB$ Pump | Cost$ T | ValidTgts$ Creature.Other | NumAtt$ -1 | NumDef$ -1 | SubAbility$ MirriPutCounter | SpellDescription$ Another target creature gets -1/-1 until end of turn. Put a +1/+1 counter on this creature.
SVar:MirriPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/mirri_the_cursed_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Mirri the Cursed Avatar.full.jpg
Oracle:Hand -2, life -3\nCreatures you control have "{T}: Another target creature gets -1/-1 until end of turn. Put a +1/+1 counter on this creature."

View File

@@ -6,5 +6,5 @@ A:AB$ ChooseType | ActivationZone$ Command | Cost$ X | Defined$ You | Type$ Crea
SVar:DBAnimate:DB$ AnimateAll | Power$ X | Toughness$ X | References$ X | Types$ AllCreatureTypes | ValidCards$ Creature.YouCtrl+ChosenType
SVar:X:Count$xPaid
SVar:RemAIDeck:True
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/mirror_entity_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Mirror Entity Avatar.full.jpg
Oracle:Hand +1, life -2\n{X}: Choose a creature type. Until end of turn, creatures you control of the chosen type become X/X and gain all creature types.

View File

@@ -7,5 +7,5 @@ R:Event$ DamageDone | ActiveZones$ Command | ValidSource$ Creature.YouCtrl | Rep
SVar:DmgTimes2:AB$ DealDamage | Cost$ 0 | Defined$ ReplacedTarget | DamageSource$ ReplacedSource | NumDmg$ X | References$ X
SVar:DmgTimes2Combat:AB$ DealDamage | Cost$ 0 | CombatDamage$ True | Defined$ ReplacedTarget | DamageSource$ ReplacedSource | NumDmg$ X | References$ X
SVar:X:ReplaceCount$DamageAmount/Twice
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/mishra.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Mishra.full.jpg
Oracle:Hand +0, life -3\nIf a creature you control would deal damage, it deals double that damage instead.

View File

@@ -5,5 +5,5 @@ HandLifeModifier:+0/+4
A:AB$ NameCard | Cost$ X Discard<1/Card> | AILogic$ MomirAvatar | ActivationZone$ Command | AtRandom$ True | ValidCards$ Creature | ValidAttribute$ cmcEQX | References$ X | Amount$ 1 | SubAbility$ DBToken | SorcerySpeed$ True | ActivationLimit$ 1 | AILogic$ MomirAvatar | SpellDescription$ Put a token onto the battlefield that's a copy of a creature card with converted mana cost X chosen at random. Activate this ability only any time you could cast a sorcery and only once each turn. | StackDescription$ SpellDescription
SVar:DBToken:DB$ CopyPermanent | ValidSupportedCopy$ Card | DefinedName$ NamedCard | NumCopies$ 1 | StackDescription$
SVar:X:Count$xPaid
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/momir_vig_simic_visionary_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Momir Vig, Simic Visionary Avatar.full.jpg
Oracle:Hand +0, life +4\n{X}, Discard a card: Put a token onto the battlefield that's a copy of a creature card with converted mana cost X chosen at random. Activate this ability only any time you could cast a sorcery and only once each turn.

View File

@@ -7,5 +7,5 @@ SVar:TrigLoseLife:AB$ LoseLife | Cost$ 0 | Defined$ You | LifeAmount$ Ouch
SVar:Ouch:Count$Valid Permanent.YouCtrl
SVar:RemAIDeck:True
SVar:RemRandomDeck:True
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/morinfen_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Morinfen Avatar.full.jpg
Oracle:Hand +0, life +30\nAt the beginning of your upkeep, you lose 1 life for each permanent you control.

View File

@@ -4,5 +4,5 @@ Types:Scheme
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ ShowTheWeakness | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, each opponent's life total becomes the lowest life total among your opponents.
SVar:ShowTheWeakness:AB$ SetLife | Cost$ 0 | Defined$ Player.Opponent | LifeAmount$ X | References$ X
SVar:X:PlayerCountOpponents$LowestLifeTotal
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/mortal_flesh_is_weak.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/ARC/Mortal Flesh Is Weak.full.jpg
Oracle:When you set this scheme in motion, each opponent's life total becomes the lowest life total among your opponents.

View File

@@ -4,5 +4,5 @@ Types:Vanguard
HandLifeModifier:-3/-2
S:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.YouCtrl | AddPower$ X | References$ X | Description$ Creatures you control get +X/+0, where X is the number of cards in your hand.
SVar:X:Count$CardsInYourHand
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/multani.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Multani.full.jpg
Oracle:Hand -3, life -2\nCreatures you control get +X/+0, where X is the number of cards in your hand.

View File

@@ -5,5 +5,5 @@ HandLifeModifier:+0/-2
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.YouCtrl+HasCounters | TriggerZones$ Command | Execute$ TrigDamage | TriggerDescription$ Whenever a creature enters the battlefield under your control with a counter on it, you may have it deal damage equal to its power to target creature or player.
SVar:TrigDamage:AB$ DealDamage | Cost$ 0 | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player | DamageSource$ TriggeredCard | NumDmg$ Damage | References$ Damage
SVar:Damage:TriggeredCard$CardPower
SVar:Picture:http://www.cardforge.org/fpics/vgd-lq/murderous_redcap_avatar.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/VAN/Murderous Redcap Avatar.full.jpg
Oracle:Hand +0, life -2\nWhenever a creature enters the battlefield under your control with a counter on it, you may have it deal damage equal to its power to target creature or player.

View File

@@ -5,5 +5,5 @@ T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ GeniusLife | TriggerZones$
SVar:GeniusLife:AB$ GainLife | Cost$ X | Defined$ You | LifeAmount$ X | SubAbility$ GeniusCards
SVar:GeniusCards:DB$ Draw | Defined$ You | NumCards$ X
SVar:X:Count$xPaid
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/my_genius_knows_no_bounds.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/ARC/My Genius Knows No Bounds.full.jpg
Oracle:When you set this scheme in motion, you may pay {X}. If you do, you gain X life and draw X cards.

View File

@@ -5,5 +5,5 @@ T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Command |
SVar:TrigNecromancy:AB$ ChangeZone | Cost$ 0 | ValidTgts$ Creature.OppCtrl | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | RememberChanged$ True
T:Mode$ ChangesZone | ValidCard$ Creature.IsRemembered | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigAbandon | TriggerZones$ Command | TriggerDescription$ When a creature put onto the battlefield with this scheme dies, abandon this scheme.
SVar:TrigAbandon:AB$ Abandon | Cost$ 0
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/my_undead_horde_awakens.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/ARC/My Undead Horde Awakens.full.jpg
Oracle:(An ongoing scheme remains face up until it's abandoned.)\nAt the beginning of your end step, you may put target creature card from an opponent's graveyard onto the battlefield under your control.\nWhen a creature put onto the battlefield with this scheme dies, abandon this scheme.

View File

@@ -5,5 +5,5 @@ T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ MyWish | TriggerZones$ Com
SVar:MyWish:AB$ RevealHand | Cost$ 0 | Defined$ Player.Opponent | RememberRevealed$ True | SubAbility$ MyPleasure
SVar:MyPleasure:DB$ Play | Valid$ Card.nonCreature+nonLand+IsRemembered | WithoutManaCost$ True | Optional$ True | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/my_wish_is_your_command.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/ARC/My Wish Is Your Command.full.jpg
Oracle:When you set this scheme in motion, each opponent reveals his or her hand. You may choose a noncreature, nonland card revealed this way and cast it without paying its mana cost.

View File

@@ -16,5 +16,5 @@ SVar:BounceLand:DB$ ChangeZone | Defined$ ChosenCard | Origin$ Battlefield | Des
SVar:DBRemember4:DB$ Pump | RememberObjects$ ImprintedOwner | SubAbility$ DBShuffle
SVar:DBShuffle:DB$ Shuffle | Defined$ Remembered | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/nature_demands_an_offering.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/ARC/Nature Demands an Offering.full.jpg
Oracle:When you set this scheme in motion, target opponent chooses a creature you don't control and puts it on top of its owner's library, then repeats this process for an artifact, an enchantment, and a land. Then the owner of each permanent chosen this way shuffles his or her library.

View File

@@ -7,5 +7,5 @@ T:Mode$ AttackersDeclared | DelayedTrigger$ DelTrigEOC | CheckSVar$ NatureShield
SVar:DelTrigEOC:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Player | Execute$ Abandon | TriggerDescription$ Abandon this scheme at end of combat.
SVar:Abandon:AB$ Abandon | Cost$ 0
SVar:NatureShields:Count$Valid Creature.attackingYou
SVar:Picture:http://www.cardforge.org/fpics/lq_schemes/nature_shields_its_own.jpg
SVar:Picture:http://downloads.cardforge.link/images/cards/ARC/Nature Shields Its Own.full.jpg
Oracle:(An ongoing scheme remains face up until it's abandoned.)\nWhenever a creature attacks and isn't blocked, if you're the defending player, put a 0/1 green Plant creature token onto the battlefield blocking that creature.\nWhen four or more creatures attack you, abandon this scheme at end of combat.

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