* Fixed a problem that Emblems created by permanents where its owner left the game caused errors in clients. Some handling cganges of emblems.

This commit is contained in:
LevelX2 2016-12-27 16:00:22 +01:00
parent 81caed134f
commit 8075ea2e50
56 changed files with 894 additions and 850 deletions

View file

@ -594,7 +594,7 @@ public class MageFrame extends javax.swing.JFrame implements MageClient {
missingCards = CardRepository.instance.findCards(new CardCriteria()); missingCards = CardRepository.instance.findCards(new CardCriteria());
LOGGER.info("Card pool load time: " + ((System.currentTimeMillis() - beforeCall) / 1000 + " seconds")); LOGGER.info("Card pool load time: " + ((System.currentTimeMillis() - beforeCall) / 1000 + " seconds"));
beforeCall = System.currentTimeMillis(); beforeCall = System.currentTimeMillis();
if (DownloadPictures.checkForNewCards(missingCards)) { if (DownloadPictures.checkForMissingCardImages(missingCards)) {
LOGGER.info("Card images checking time: " + ((System.currentTimeMillis() - beforeCall) / 1000 + " seconds")); LOGGER.info("Card images checking time: " + ((System.currentTimeMillis() - beforeCall) / 1000 + " seconds"));
UserRequestMessage message = new UserRequestMessage("New images available", "Card images are missing (" + missingCards.size() + "). Do you want to download the images?" UserRequestMessage message = new UserRequestMessage("New images available", "Card images are missing (" + missingCards.size() + "). Do you want to download the images?"
+ "<br><br><i>You can deactivate the image download check on application start in the preferences.</i>"); + "<br><br><i>You can deactivate the image download check on application start in the preferences.</i>");

View file

@ -43,7 +43,6 @@ import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.util.*; import java.util.*;
import javax.swing.DefaultComboBoxModel; import javax.swing.DefaultComboBoxModel;
import javax.swing.JOptionPane;
import javax.swing.JTable; import javax.swing.JTable;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableCellRenderer;
@ -55,6 +54,7 @@ import mage.cards.Sets;
import mage.cards.repository.CardCriteria; import mage.cards.repository.CardCriteria;
import mage.cards.repository.CardInfo; import mage.cards.repository.CardInfo;
import mage.cards.repository.CardRepository; import mage.cards.repository.CardRepository;
import mage.client.MageFrame;
import mage.client.cards.*; import mage.client.cards.*;
import mage.client.constants.Constants.SortBy; import mage.client.constants.Constants.SortBy;
import mage.client.deckeditor.table.TableModel; import mage.client.deckeditor.table.TableModel;
@ -960,7 +960,7 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
filterCards(); filterCards();
} }
} else { } else {
JOptionPane.showMessageDialog(null, "An expansion set must be selected to be able to generate a booster."); MageFrame.getInstance().showMessage("An expansion set must be selected to be able to generate a booster.");
} }
}//GEN-LAST:event_btnBoosterActionPerformed }//GEN-LAST:event_btnBoosterActionPerformed
@ -993,7 +993,7 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
if (currentView.cardsSize() > CardGrid.MAX_IMAGES) { if (currentView.cardsSize() > CardGrid.MAX_IMAGES) {
jToggleCardView.setSelected(false); jToggleCardView.setSelected(false);
jToggleListView.setSelected(true); jToggleListView.setSelected(true);
JOptionPane.showMessageDialog(this, new StringBuilder("The card view can't be used for more than ").append(CardGrid.MAX_IMAGES).append(" cards.").toString()); MageFrame.getInstance().showMessage("The card view can't be used for more than " + CardGrid.MAX_IMAGES + " cards.");
} else { } else {
if (!(currentView instanceof CardGrid)) { if (!(currentView instanceof CardGrid)) {
toggleViewMode(); toggleViewMode();

View file

@ -749,9 +749,9 @@ public final class GamePanel extends javax.swing.JPanel {
if (change) { if (change) {
handCardsOfOpponentAvailable = !handCardsOfOpponentAvailable; handCardsOfOpponentAvailable = !handCardsOfOpponentAvailable;
if (handCardsOfOpponentAvailable) { if (handCardsOfOpponentAvailable) {
JOptionPane.showMessageDialog(null, "You control other player's turn. \nUse \"Switch Hand\" button to switch between cards in different hands."); MageFrame.getInstance().showMessage("You control other player's turn. \nUse \"Switch Hand\" button to switch between cards in different hands.");
} else { } else {
JOptionPane.showMessageDialog(null, "You lost control on other player's turn."); MageFrame.getInstance().showMessage("You lost control on other player's turn.");
} }
} }
} else { } else {

View file

@ -49,6 +49,10 @@ public class TokensMtgImageSource implements CardImageSource {
private static CardImageSource instance = new TokensMtgImageSource(); private static CardImageSource instance = new TokensMtgImageSource();
private List<TokenData> tokensData;
private final Object tokensDataSync = new Object();
public static CardImageSource getInstance() { public static CardImageSource getInstance() {
if (instance == null) { if (instance == null) {
instance = new TokensMtgImageSource(); instance = new TokensMtgImageSource();
@ -82,26 +86,27 @@ public class TokensMtgImageSource implements CardImageSource {
} }
private static final String[] EMBLEMS = { private static final String[] EMBLEMS = {
"Ajani", "Ajani",
"Chandra", "Arlinn",
"Dack", "Chandra",
"Daretti", "Dack",
"Domri", "Daretti",
"Elspeth", "Dovin",
"Garruk", "Domri",
"Gideon", "Elspeth",
"Jace", "Garruk",
"Kiora", "Gideon",
"Koth", "Jace",
"Liliana", "Kiora",
"Narset", "Koth",
"Nixilis", "Liliana",
"Sarkhan", "Narset",
"Sorin", "Nixilis",
"Tamiyo", "Sarkhan",
"Teferi", "Sorin",
"Venser", "Tamiyo",
}; "Teferi",
"Venser",};
private static final Map<String, String> SET_NAMES_REPLACEMENT = new HashMap<String, String>() { private static final Map<String, String> SET_NAMES_REPLACEMENT = new HashMap<String, String>() {
{ {
@ -119,7 +124,7 @@ public class TokensMtgImageSource implements CardImageSource {
// handle emblems // handle emblems
if (name.toLowerCase().contains("emblem")) { if (name.toLowerCase().contains("emblem")) {
for (String emblem : EMBLEMS) { for (String emblem : EMBLEMS) {
if (name.toLowerCase().contains(emblem.toLowerCase())){ if (name.toLowerCase().contains(emblem.toLowerCase())) {
name = emblem + " Emblem"; name = emblem + " Emblem";
break; break;
} }
@ -135,23 +140,23 @@ public class TokensMtgImageSource implements CardImageSource {
// e.g. http://tokens.mtg.onl/tokens/ORI_010-Thopter.jpg -- token number 010 // e.g. http://tokens.mtg.onl/tokens/ORI_010-Thopter.jpg -- token number 010
// We don't know these numbers, but we can take them from a file // We don't know these numbers, but we can take them from a file
// with tokens information that can be downloaded from the site. // with tokens information that can be downloaded from the site.
List<TokenData> tokensData = getTokensData(); List<TokenData> newTokensData = getTokensData();
if (tokensData.isEmpty()) { if (newTokensData.isEmpty()) {
return null; return null;
} }
List<TokenData> matchedTokens = new ArrayList<TokenData>(); List<TokenData> matchedTokens = new ArrayList<>();
for (TokenData token : tokensData) { for (TokenData token : newTokensData) {
if (name.equalsIgnoreCase(token.getName()) && set.equalsIgnoreCase(token.getExpansionSetCode())) { if (name.equalsIgnoreCase(token.getName()) && set.equalsIgnoreCase(token.getExpansionSetCode())) {
matchedTokens.add(token); matchedTokens.add(token);
} }
} }
//
if (matchedTokens.isEmpty()) { // if (matchedTokens.isEmpty()) {
logger.info("Could not find data for token " + name + ", set " + set + "."); // logger.info("Could not find data for token " + name + ", set " + set + ".");
return null; // return null;
} // }
TokenData tokenData; TokenData tokenData;
if (type == 0) { if (type == 0) {
@ -168,72 +173,66 @@ public class TokensMtgImageSource implements CardImageSource {
} }
String url = "http://tokens.mtg.onl/tokens/" + tokenData.getExpansionSetCode().trim() + "_" String url = "http://tokens.mtg.onl/tokens/" + tokenData.getExpansionSetCode().trim() + "_"
+ tokenData.getNumber().trim() + "-" + tokenData.getName().trim()+ ".jpg"; + tokenData.getNumber().trim() + "-" + tokenData.getName().trim() + ".jpg";
url = url.replace(' ', '-'); url = url.replace(' ', '-');
return url; return url;
} }
private List<TokenData> tokensData;
private final Object tokensDataSync = new Object();
private List<TokenData> getTokensData() throws IOException { private List<TokenData> getTokensData() throws IOException {
if (tokensData == null) { synchronized (tokensDataSync) {
synchronized (tokensDataSync) { if (tokensData == null) {
if (tokensData == null) { tokensData = new ArrayList<>();
tokensData = new ArrayList<TokenData>();
// get tokens data from resource file // get tokens data from resource file
InputStream inputStream = null; InputStream inputStream = null;
try { try {
inputStream = this.getClass().getResourceAsStream("/tokens-mtg-onl-list.csv"); inputStream = this.getClass().getResourceAsStream("/tokens-mtg-onl-list.csv");
List<TokenData> fileTokensData = parseTokensData(inputStream); List<TokenData> fileTokensData = parseTokensData(inputStream);
tokensData.addAll(fileTokensData); tokensData.addAll(fileTokensData);
} catch (Exception exception) { } catch (Exception exception) {
logger.warn("Failed to get tokens description from resource file tokens-mtg-onl-list.csv", exception); logger.warn("Failed to get tokens description from resource file tokens-mtg-onl-list.csv", exception);
} finally { } finally {
if (inputStream != null) { if (inputStream != null) {
try { try {
inputStream.close(); inputStream.close();
} catch (Exception e) { } catch (Exception e) {
logger.error("Input stream close failed:", e); logger.error("Input stream close failed:", e);
}
}
}
// description on site may contain new information
// try to add it
try {
URL url = new URL("http://tokens.mtg.onl/data/SetsWithTokens.csv");
inputStream = url.openStream();
List<TokenData> siteTokensData = parseTokensData(inputStream);
List<TokenData> newTokensData = new ArrayList<>();
for (TokenData siteData : siteTokensData) {
boolean isNew = true;
for (TokenData fileData : tokensData) {
if (siteData.getName().equalsIgnoreCase(fileData.getName())
&& siteData.getNumber().equalsIgnoreCase(fileData.getNumber())
&& siteData.getExpansionSetCode().equalsIgnoreCase(fileData.getExpansionSetCode())) {
isNew = false;
break;
} }
} }
if (isNew) {
newTokensData.add(siteData);
}
} }
// description on site may contain new information tokensData.addAll(newTokensData);
// try to add it } catch (Exception exception) {
try { logger.warn("Failed to get tokens description from tokens.mtg.onl", exception);
URL url = new URL("http://tokens.mtg.onl/data/SetsWithTokens.csv"); } finally {
inputStream = url.openStream(); if (inputStream != null) {
List<TokenData> siteTokensData = parseTokensData(inputStream); try {
inputStream.close();
List<TokenData> newTokensData = new ArrayList<TokenData>(); } catch (Exception e) {
for (TokenData siteData : siteTokensData) { logger.error("Input stream close failed:", e);
boolean isNew = true;
for (TokenData fileData : tokensData) {
if (siteData.getName().equalsIgnoreCase(fileData.getName())
&& siteData.getNumber().equalsIgnoreCase(fileData.getNumber())
&& siteData.getExpansionSetCode().equalsIgnoreCase(fileData.getExpansionSetCode())) {
isNew = false;
break;
}
}
if (isNew) {
newTokensData.add(siteData);
}
}
tokensData.addAll(newTokensData);
} catch (Exception exception) {
logger.warn("Failed to get tokens description from tokens.mtg.onl", exception);
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (Exception e) {
logger.error("Input stream close failed:", e);
}
} }
} }
} }
@ -244,7 +243,7 @@ public class TokensMtgImageSource implements CardImageSource {
} }
private List<TokenData> parseTokensData(InputStream inputStream) throws IOException { private List<TokenData> parseTokensData(InputStream inputStream) throws IOException {
List<TokenData> tokensData = new ArrayList<TokenData>(); List<TokenData> newTokensData = new ArrayList<>();
InputStreamReader inputReader = null; InputStreamReader inputReader = null;
BufferedReader reader = null; BufferedReader reader = null;
@ -266,8 +265,7 @@ public class TokensMtgImageSource implements CardImageSource {
if (state == 2) { if (state == 2) {
state = 0; state = 0;
} }
} else { } else if (state == 0) {
if (state == 0) {
set = line.substring(0, 3); set = line.substring(0, 3);
state = 1; state = 1;
} else { } else {
@ -279,8 +277,7 @@ public class TokensMtgImageSource implements CardImageSource {
String name = split[0].replace('', ','); String name = split[0].replace('', ',');
String number = split[1]; String number = split[1];
TokenData token = new TokenData(name, number, set); TokenData token = new TokenData(name, number, set);
tokensData.add(token); newTokensData.add(token);
}
} }
line = reader.readLine(); line = reader.readLine();
@ -302,7 +299,7 @@ public class TokensMtgImageSource implements CardImageSource {
} }
} }
return tokensData; return newTokensData;
} }
final class TokenData { final class TokenData {

View file

@ -10,6 +10,7 @@ public class CardDownloadData {
private String name; private String name;
private String downloadName; private String downloadName;
private String fileName = "";
private String set; private String set;
private String tokenSetCode; private String tokenSetCode;
private String tokenDescriptor; private String tokenDescriptor;
@ -32,6 +33,11 @@ public class CardDownloadData {
this(name, set, collectorId, usesVariousArt, type, tokenSetCode, tokenDescriptor, token, false, false); this(name, set, collectorId, usesVariousArt, type, tokenSetCode, tokenDescriptor, token, false, false);
} }
public CardDownloadData(String name, String set, String collectorId, boolean usesVariousArt, Integer type, String tokenSetCode, String tokenDescriptor, boolean token, String fileName) {
this(name, set, collectorId, usesVariousArt, type, tokenSetCode, tokenDescriptor, token, false, false);
this.fileName = fileName;
}
public CardDownloadData(String name, String set, String collectorId, boolean usesVariousArt, Integer type, String tokenSetCode, String tokenDescriptor, boolean token, boolean twoFacedCard, boolean secondSide) { public CardDownloadData(String name, String set, String collectorId, boolean usesVariousArt, Integer type, String tokenSetCode, String tokenDescriptor, boolean token, boolean twoFacedCard, boolean secondSide) {
this.name = name; this.name = name;
this.set = set; this.set = set;
@ -60,6 +66,7 @@ public class CardDownloadData {
this.usesVariousArt = card.usesVariousArt; this.usesVariousArt = card.usesVariousArt;
this.tokenSetCode = card.tokenSetCode; this.tokenSetCode = card.tokenSetCode;
this.tokenDescriptor = card.tokenDescriptor; this.tokenDescriptor = card.tokenDescriptor;
this.fileName = card.fileName;
} }
@ -118,6 +125,14 @@ public class CardDownloadData {
return name; return name;
} }
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public void setName(String name) { public void setName(String name) {
this.name = name; this.name = name;
} }
@ -147,8 +162,8 @@ public class CardDownloadData {
} }
private String lastDitchTokenDescriptor() { private String lastDitchTokenDescriptor() {
String name = this.name.replaceAll("[^a-zA-Z0-9]", ""); String tmpName = this.name.replaceAll("[^a-zA-Z0-9]", "");
String descriptor = name + "...."; String descriptor = tmpName + "....";
descriptor = descriptor.toUpperCase(); descriptor = descriptor.toUpperCase();
return descriptor; return descriptor;
} }

View file

@ -57,11 +57,11 @@ import org.mage.plugins.card.dl.sources.AltMtgOnlTokensImageSource;
import org.mage.plugins.card.dl.sources.CardImageSource; import org.mage.plugins.card.dl.sources.CardImageSource;
import org.mage.plugins.card.dl.sources.GrabbagImageSource; import org.mage.plugins.card.dl.sources.GrabbagImageSource;
import org.mage.plugins.card.dl.sources.MagicCardsImageSource; import org.mage.plugins.card.dl.sources.MagicCardsImageSource;
import org.mage.plugins.card.dl.sources.MagidexImageSource;
import org.mage.plugins.card.dl.sources.MtgOnlTokensImageSource; import org.mage.plugins.card.dl.sources.MtgOnlTokensImageSource;
import org.mage.plugins.card.dl.sources.MythicspoilerComSource; import org.mage.plugins.card.dl.sources.MythicspoilerComSource;
import org.mage.plugins.card.dl.sources.TokensMtgImageSource; import org.mage.plugins.card.dl.sources.TokensMtgImageSource;
import org.mage.plugins.card.dl.sources.WizardCardsImageSource; import org.mage.plugins.card.dl.sources.WizardCardsImageSource;
import org.mage.plugins.card.dl.sources.MagidexImageSource;
import org.mage.plugins.card.properties.SettingsManager; import org.mage.plugins.card.properties.SettingsManager;
import org.mage.plugins.card.utils.CardImageUtils; import org.mage.plugins.card.utils.CardImageUtils;
@ -235,7 +235,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
dlg = new JOptionPane(p0, JOptionPane.PLAIN_MESSAGE, JOptionPane.DEFAULT_OPTION, null, options, options[1]); dlg = new JOptionPane(p0, JOptionPane.PLAIN_MESSAGE, JOptionPane.DEFAULT_OPTION, null, options, options[1]);
} }
public static boolean checkForNewCards(List<CardInfo> allCards) { public static boolean checkForMissingCardImages(List<CardInfo> allCards) {
AtomicBoolean missedCardTFiles = new AtomicBoolean(); AtomicBoolean missedCardTFiles = new AtomicBoolean();
allCards.parallelStream().forEach(card -> { allCards.parallelStream().forEach(card -> {
if (!missedCardTFiles.get()) { if (!missedCardTFiles.get()) {
@ -279,7 +279,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
private void updateProgressText(int cardCount) { private void updateProgressText(int cardCount) {
float mb = (cardCount * cardImageSource.getAverageSize()) / 1024; float mb = (cardCount * cardImageSource.getAverageSize()) / 1024;
bar.setString(String.format(cardIndex == cardCount ? "%d of %d cards finished! Please close!" bar.setString(String.format(cardIndex == cardCount ? "%d of %d cards finished! Please close!"
: "%d of %d cards finished! Please wait! [%.1f Mb]", 0, cardCount, mb)); : "%d of %d cards finished! Please wait! [%.1f Mb]", 0, cardCount, mb));
} }
private static String createDownloadName(CardInfo card) { private static String createDownloadName(CardInfo card) {
@ -309,57 +309,57 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
} }
int numberCardImages = allCards.size(); int numberCardImages = allCards.size();
int numberWithoutTokens = 0;
try { try {
offlineMode = true; offlineMode = true;
allCards.parallelStream().forEach(card -> { allCards.parallelStream().forEach(card -> {
if (!card.getCardNumber().isEmpty() && !"0".equals(card.getCardNumber()) && !card.getSetCode().isEmpty() if (!card.getCardNumber().isEmpty() && !"0".equals(card.getCardNumber()) && !card.getSetCode().isEmpty()
&& !ignoreUrls.contains(card.getSetCode())) { && !ignoreUrls.contains(card.getSetCode())) {
String cardName = card.getName(); String cardName = card.getName();
boolean isType2 = type2SetsFilter.contains(card.getSetCode()); boolean isType2 = type2SetsFilter.contains(card.getSetCode());
CardDownloadData url = new CardDownloadData(cardName, card.getSetCode(), card.getCardNumber(), card.usesVariousArt(), 0, "", "", false, card.isDoubleFaced(), card.isNightCard()); CardDownloadData url = new CardDownloadData(cardName, card.getSetCode(), card.getCardNumber(), card.usesVariousArt(), 0, "", "", false, card.isDoubleFaced(), card.isNightCard());
if (url.getUsesVariousArt()) { if (url.getUsesVariousArt()) {
url.setDownloadName(createDownloadName(card)); url.setDownloadName(createDownloadName(card));
} }
url.setFlipCard(card.isFlipCard()); url.setFlipCard(card.isFlipCard());
url.setSplitCard(card.isSplitCard()); url.setSplitCard(card.isSplitCard());
url.setType2(isType2); url.setType2(isType2);
allCardsUrls.add(url); allCardsUrls.add(url);
if (card.isDoubleFaced()) { if (card.isDoubleFaced()) {
if (card.getSecondSideName() == null || card.getSecondSideName().trim().isEmpty()) { if (card.getSecondSideName() == null || card.getSecondSideName().trim().isEmpty()) {
throw new IllegalStateException("Second side card can't have empty name."); throw new IllegalStateException("Second side card can't have empty name.");
} }
url = new CardDownloadData(card.getSecondSideName(), card.getSetCode(), card.getCardNumber(), card.usesVariousArt(), 0, "", "", false, card.isDoubleFaced(), true); url = new CardDownloadData(card.getSecondSideName(), card.getSetCode(), card.getCardNumber(), card.usesVariousArt(), 0, "", "", false, card.isDoubleFaced(), true);
url.setType2(isType2); url.setType2(isType2);
allCardsUrls.add(url); allCardsUrls.add(url);
} }
if (card.isFlipCard()) { if (card.isFlipCard()) {
if (card.getFlipCardName() == null || card.getFlipCardName().trim().isEmpty()) { if (card.getFlipCardName() == null || card.getFlipCardName().trim().isEmpty()) {
throw new IllegalStateException("Flipped card can't have empty name."); throw new IllegalStateException("Flipped card can't have empty name.");
} }
url = new CardDownloadData(card.getFlipCardName(), card.getSetCode(), card.getCardNumber(), card.usesVariousArt(), 0, "", "", false, card.isDoubleFaced(), card.isNightCard()); url = new CardDownloadData(card.getFlipCardName(), card.getSetCode(), card.getCardNumber(), card.usesVariousArt(), 0, "", "", false, card.isDoubleFaced(), card.isNightCard());
url.setFlipCard(true); url.setFlipCard(true);
url.setFlippedSide(true); url.setFlippedSide(true);
url.setType2(isType2); url.setType2(isType2);
allCardsUrls.add(url); allCardsUrls.add(url);
} }
} else if (card.getCardNumber().isEmpty() || "0".equals(card.getCardNumber())) { } else if (card.getCardNumber().isEmpty() || "0".equals(card.getCardNumber())) {
System.err.println("There was a critical error!"); System.err.println("There was a critical error!");
logger.error("Card has no collector ID and won't be sent to client: " + card); logger.error("Card has no collector ID and won't be sent to client: " + card);
} else if (card.getSetCode().isEmpty()) { } else if (card.getSetCode().isEmpty()) {
System.err.println("There was a critical error!"); System.err.println("There was a critical error!");
logger.error("Card has no set name and won't be sent to client:" + card); logger.error("Card has no set name and won't be sent to client:" + card);
} }
}); });
numberWithoutTokens = allCards.size();
allCardsUrls.addAll(getTokenCardUrls()); allCardsUrls.addAll(getTokenCardUrls());
} catch (Exception e) { } catch (Exception e) {
logger.error(e); logger.error(e);
} }
int numberTokenImages = allCardsUrls.size() - numberCardImages; int numberAllTokenImages = allCardsUrls.size() - numberWithoutTokens;
/** /**
* check to see which cards we already have * check to see which cards we already have
@ -372,21 +372,16 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
} }
}); });
logger.info("Check download images (total cards: " + numberCardImages + ", total tokens: " + numberTokenImages + ") => Missing images: " + cardsToDownload.size()); int tokenImages = 0;
if (logger.isDebugEnabled()) { for (CardDownloadData card : cardsToDownload) {
for (CardDownloadData card : cardsToDownload) { logger.debug((card.isToken() ? "Token" : "Card") + " image to download: " + card.getName() + " (" + card.getSet() + ")");
if (card.isToken()) { if (card.isToken()) {
logger.debug("Card to download: " + card.getName() + " (Token) "); tokenImages++;
} else {
try {
logger.debug("Card to download: " + card.getName() + " (" + card.getSet() + ")");
} catch (Exception e) {
logger.error(e);
}
}
} }
} }
logger.info("Check download images (total card images: " + numberCardImages + ", total token images: " + numberAllTokenImages + ")");
logger.info(" => Missing card images: " + (cardsToDownload.size() - tokenImages));
logger.info(" => Missing token images: " + tokenImages);
return new ArrayList<>(cardsToDownload); return new ArrayList<>(cardsToDownload);
} }
@ -413,24 +408,29 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
String[] params = line.split("\\|", -1); String[] params = line.split("\\|", -1);
if (params.length >= 5) { if (params.length >= 5) {
int type = 0; int type = 0;
String fileName = "";
if (params[4] != null && !params[4].isEmpty()) { if (params[4] != null && !params[4].isEmpty()) {
type = Integer.parseInt(params[4].trim()); type = Integer.parseInt(params[4].trim());
} }
if (params.length > 5 && params[5] != null && !params[5].isEmpty()) {
fileName = params[5].trim();
}
if (params[1].toLowerCase().equals("generate") && params[2].startsWith("TOK:")) { if (params[1].toLowerCase().equals("generate") && params[2].startsWith("TOK:")) {
String set = params[2].substring(4); String set = params[2].substring(4);
CardDownloadData card = new CardDownloadData(params[3], set, "0", false, type, "", "", true); CardDownloadData card = new CardDownloadData(params[3], set, "0", false, type, "", "", true);
list.add(card); list.add(card);
} else if (params[1].toLowerCase().equals("generate") && params[2].startsWith("EMBLEM:")) { } else if (params[1].toLowerCase().equals("generate") && params[2].startsWith("EMBLEM:")) {
String set = params[2].substring(7); String set = params[2].substring(7);
CardDownloadData card = new CardDownloadData("Emblem " + params[3], set, "0", false, type, "", "", true); CardDownloadData card = new CardDownloadData("Emblem " + params[3], set, "0", false, type, "", "", true, fileName);
list.add(card); list.add(card);
} else if (params[1].toLowerCase().equals("generate") && params[2].startsWith("EMBLEM-:")) { } else if (params[1].toLowerCase().equals("generate") && params[2].startsWith("EMBLEM-:")) {
String set = params[2].substring(8); String set = params[2].substring(8);
CardDownloadData card = new CardDownloadData(params[3] + " Emblem", set, "0", false, type, "", "", true); CardDownloadData card = new CardDownloadData(params[3] + " Emblem", set, "0", false, type, "", "", true, fileName);
list.add(card); list.add(card);
} else if (params[1].toLowerCase().equals("generate") && params[2].startsWith("EMBLEM!:")) { } else if (params[1].toLowerCase().equals("generate") && params[2].startsWith("EMBLEM!:")) {
String set = params[2].substring(8); String set = params[2].substring(8);
CardDownloadData card = new CardDownloadData(params[3], set, "0", false, type, "", "", true); CardDownloadData card = new CardDownloadData(params[3], set, "0", false, type, "", "", true, fileName);
list.add(card); list.add(card);
} }
} else { } else {
@ -531,20 +531,18 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
imageRef = cardImageSource.getSourceName() + imageRef; imageRef = cardImageSource.getSourceName() + imageRef;
try { try {
URL imageUrl = new URL(imageRef); URL imageUrl = new URL(imageRef);
if (card != null) { card.setToken(cardImageSource.isTokenSource());
card.setToken(cardImageSource.isTokenSource());
}
Runnable task = new DownloadTask(card, imageUrl, fileName, cardImageSource.getTotalImages()); Runnable task = new DownloadTask(card, imageUrl, fileName, cardImageSource.getTotalImages());
executor.execute(task); executor.execute(task);
} catch (Exception ex) { } catch (Exception ex) {
} }
} else if (card != null && cardImageSource.getTotalImages() == -1) { } else if (cardImageSource.getTotalImages() == -1) {
logger.info("Card not available on " + cardImageSource.getSourceName() + ": " + card.getName() + " (" + card.getSet() + ")"); logger.info("Card not available on " + cardImageSource.getSourceName() + ": " + card.getName() + " (" + card.getSet() + ")");
synchronized (sync) { synchronized (sync) {
update(cardIndex + 1, cardsToDownload.size()); update(cardIndex + 1, cardsToDownload.size());
} }
} }
} else if (url != null) { } else {
Runnable task = new DownloadTask(card, new URL(url), cardsToDownload.size()); Runnable task = new DownloadTask(card, new URL(url), cardsToDownload.size());
executor.execute(task); executor.execute(task);
} }
@ -637,7 +635,11 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
} }
File existingFile = new File(imagePath.replaceFirst("\\w{3}.zip", "")); File existingFile = new File(imagePath.replaceFirst("\\w{3}.zip", ""));
if (existingFile.exists()) { if (existingFile.exists()) {
new TFile(existingFile).cp_rp(outputFile); try {
new TFile(existingFile).cp_rp(outputFile);
} catch (IOException e) {
logger.error("Error while copying file " + card.getName(), e);
}
synchronized (sync) { synchronized (sync) {
update(cardIndex + 1, count); update(cardIndex + 1, count);
} }
@ -728,7 +730,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
logger.error(e, e); logger.error(e, e);
} finally { } finally {
if (temporaryFile != null) { if (temporaryFile != null) {
//temporaryFile.delete(); temporaryFile.delete();
} }
} }
synchronized (sync) { synchronized (sync) {

View file

@ -167,7 +167,7 @@ public class CardImageUtils {
String imageName; String imageName;
String type = card.getType() != 0 ? " " + Integer.toString(card.getType()) : ""; String type = card.getType() != 0 ? " " + Integer.toString(card.getType()) : "";
String name = card.getName().replace(":", "").replace("//", "-"); String name = card.getFileName().isEmpty() ? card.getName().replace(":", "").replace("//", "-") : card.getFileName();
if (card.getUsesVariousArt()) { if (card.getUsesVariousArt()) {
imageName = name + "." + card.getCollectorId() + ".full.jpg"; imageName = name + "." + card.getCollectorId() + ".full.jpg";

View file

@ -29,9 +29,9 @@
|Generate|TOK:KLD|Thopter|1| |Generate|TOK:KLD|Thopter|1|
|Generate|TOK:KLD|Thopter|2| |Generate|TOK:KLD|Thopter|2|
|Generate|TOK:KLD|Thopter|3| |Generate|TOK:KLD|Thopter|3|
|Generate|EMBLEM!:KLD|Emblem Chandra, Torch of Defiance|| |Generate|EMBLEM!:KLD|Emblem Chandra||
|Generate|EMBLEM!:KLD|Emblem Nissa, Vital Force|| |Generate|EMBLEM!:KLD|Emblem Nissa||
|Generate|EMBLEM!:KLD|Emblem Dovin Baan|| |Generate|EMBLEM!:KLD|Emblem Dovin||
|Generate|TOK:CN2|Assassin|| |Generate|TOK:CN2|Assassin||
|Generate|TOK:CN2|Beast|| |Generate|TOK:CN2|Beast||
@ -60,7 +60,7 @@
|Generate|TOK:EMA|Wall|| |Generate|TOK:EMA|Wall||
|Generate|TOK:EMA|Wurm|| |Generate|TOK:EMA|Wurm||
|Generate|TOK:EMA|Zombie|| |Generate|TOK:EMA|Zombie||
|Generate|EMBLEM!:EMA|Emblem Dack Fayden|| |Generate|EMBLEM!:EMA|Emblem Dack||
|Generate|TOK:EMN|Eldrazi Horror|| |Generate|TOK:EMN|Eldrazi Horror||
|Generate|TOK:EMN|Human|| |Generate|TOK:EMN|Human||
@ -70,8 +70,8 @@
|Generate|TOK:EMN|Zombie|2| |Generate|TOK:EMN|Zombie|2|
|Generate|TOK:EMN|Zombie|3| |Generate|TOK:EMN|Zombie|3|
|Generate|TOK:EMN|Zombie|4| |Generate|TOK:EMN|Zombie|4|
|Generate|EMBLEM!:EMN|Emblem Liliana, the Last Hope|| |Generate|EMBLEM!:EMN|Emblem Liliana||
|Generate|EMBLEM!:EMN|Emblem Tamiyo, Field Researcher|| |Generate|EMBLEM!:EMN|Emblem Tamiyo||
|Generate|TOK:SOI|Angel|| |Generate|TOK:SOI|Angel||
|Generate|TOK:SOI|Clue|1| |Generate|TOK:SOI|Clue|1|
@ -89,8 +89,8 @@
|Generate|TOK:SOI|Vampire Knight|| |Generate|TOK:SOI|Vampire Knight||
|Generate|TOK:SOI|Wolf|| |Generate|TOK:SOI|Wolf||
|Generate|TOK:SOI|Zombie|| |Generate|TOK:SOI|Zombie||
|Generate|EMBLEM!:SOI|Emblem Arlinn, Embraced by the Moon|| |Generate|EMBLEM!:SOI|Emblem Arlinn||
|Generate|EMBLEM!:SOI|Emblem Jace, Unraveler of Secrets|| |Generate|EMBLEM!:SOI|Emblem Jace||
|Generate|TOK:OGW|Angel|| |Generate|TOK:OGW|Angel||
|Generate|TOK:OGW|Elemental|1| |Generate|TOK:OGW|Elemental|1|
@ -123,7 +123,7 @@
|Generate|TOK:C15|Gold|| |Generate|TOK:C15|Gold||
|Generate|TOK:C15|Knight|1| |Generate|TOK:C15|Knight|1|
|Generate|TOK:C15|Knight|2| |Generate|TOK:C15|Knight|2|
|Generate|TOK:C15|Lightning Rager|| |Generate|TOK:C15|Lightning Ranger||
|Generate|TOK:C15|Saproling|| |Generate|TOK:C15|Saproling||
|Generate|TOK:C15|Shapeshifter|| |Generate|TOK:C15|Shapeshifter||
|Generate|TOK:C15|Snake|1| |Generate|TOK:C15|Snake|1|
@ -145,9 +145,9 @@
|Generate|TOK:BFZ|Kor Ally|| |Generate|TOK:BFZ|Kor Ally||
|Generate|TOK:BFZ|Octopus|| |Generate|TOK:BFZ|Octopus||
|Generate|TOK:BFZ|Plant|| |Generate|TOK:BFZ|Plant||
|Generate|EMBLEM!:BFZ|Emblem Gideon, Ally of Zendikar|| |Generate|EMBLEM!:BFZ|Emblem Gideon||
|Generate|EMBLEM!:BFZ|Emblem Kiora, Master of the Depths|| |Generate|EMBLEM!:BFZ|Emblem Kiora||
|Generate|EMBLEM!:BFZ|Emblem Ob Nixilis Reignited|| |Generate|EMBLEM!:BFZ|Emblem Nixilis||
|Generate|TOK:DDP|Eldrazi Spawn|1| |Generate|TOK:DDP|Eldrazi Spawn|1|
|Generate|TOK:DDP|Eldrazi Spawn|2| |Generate|TOK:DDP|Eldrazi Spawn|2|
@ -194,9 +194,9 @@
|Generate|TOK:ORI|Thopter|1| |Generate|TOK:ORI|Thopter|1|
|Generate|TOK:ORI|Thopter|2| |Generate|TOK:ORI|Thopter|2|
|Generate|TOK:ORI|Zombie|| |Generate|TOK:ORI|Zombie||
|Generate|EMBLEM!:ORI|Emblem Chandra, Roaring Flame|| |Generate|EMBLEM!:ORI|Emblem Chandra||
|Generate|EMBLEM!:ORI|Emblem Jace, Telepath Unbound|| |Generate|EMBLEM!:ORI|Emblem Jace||
|Generate|EMBLEM!:ORI|Emblem Liliana, Defiant Necromancer|| |Generate|EMBLEM!:ORI|Emblem Liliana||
#|Generate|TOK:PTC|Angel|| #|Generate|TOK:PTC|Angel||
#|Generate|TOK:PTC|Avatar|| #|Generate|TOK:PTC|Avatar||
@ -356,7 +356,7 @@
|Generate|TOK:CNS|Squirrel|| |Generate|TOK:CNS|Squirrel||
|Generate|TOK:CNS|Wolf|| |Generate|TOK:CNS|Wolf||
|Generate|TOK:CNS|Construct|| |Generate|TOK:CNS|Construct||
|Generate|EMBLEM!:CNS|Emblem Dack Fayden|| |Generate|EMBLEM!:CNS|Emblem Dack Fayden||Emblem Dack|
|Generate|TOK:JOU|Sphinx|| |Generate|TOK:JOU|Sphinx||
|Generate|TOK:JOU|Zombie|| |Generate|TOK:JOU|Zombie||
@ -379,7 +379,7 @@
|Generate|TOK:BNG|Centaur|| |Generate|TOK:BNG|Centaur||
|Generate|TOK:BNG|Wolf|| |Generate|TOK:BNG|Wolf||
|Generate|TOK:BNG|Gold|| |Generate|TOK:BNG|Gold||
|Generate|EMBLEM:BNG|Kiora, the Crashing Wave|| |Generate|EMBLEM:BNG|Kiora, the Crashing Wave||Emblem Kiora|
|Generate|TOK:THS|Cleric|| |Generate|TOK:THS|Cleric||
|Generate|TOK:THS|Soldier|1| |Generate|TOK:THS|Soldier|1|
@ -393,7 +393,7 @@
|Generate|TOK:THS|Satyr|| |Generate|TOK:THS|Satyr||
|Generate|TOK:THS|Golem|1| |Generate|TOK:THS|Golem|1|
|Generate|TOK:THS|Golem|2| |Generate|TOK:THS|Golem|2|
|Generate|EMBLEM-:THS|Elspeth, Suns Champion|| |Generate|EMBLEM-:THS|Elspeth, Suns Champion||Emblem Elspeth|
|Generate|TOK:M14|Sliver|1| |Generate|TOK:M14|Sliver|1|
|Generate|TOK:M14|Sliver|2| |Generate|TOK:M14|Sliver|2|
@ -407,8 +407,8 @@
|Generate|TOK:M14|Beast|| |Generate|TOK:M14|Beast||
|Generate|TOK:M14|Saproling|| |Generate|TOK:M14|Saproling||
|Generate|TOK:M14|Wolf|| |Generate|TOK:M14|Wolf||
|Generate|EMBLEM:M14|Liliana of the Dark Realms|| |Generate|EMBLEM:M14|Liliana of the Dark Realms||Emblem Liliana|
|Generate|EMBLEM:M14|Garruk, Caller of Beasts|| |Generate|EMBLEM:M14|Garruk, Caller of Beasts||Emblem Garruk|
|Generate|TOK:DDL|Griffin|| |Generate|TOK:DDL|Griffin||
|Generate|TOK:DDL|Beast|| |Generate|TOK:DDL|Beast||
@ -428,7 +428,7 @@
|Generate|TOK:MMA|Treefolk Shaman|| |Generate|TOK:MMA|Treefolk Shaman||
|Generate|TOK:MMA|Faerie Rogue|| |Generate|TOK:MMA|Faerie Rogue||
|Generate|TOK:MMA|Worm|| |Generate|TOK:MMA|Worm||
|Generate|EMBLEM:MMA|Elspeth, Knight Errant|| |Generate|EMBLEM:MMA|Elspeth, Knight Errant||Emblem Elspeth|
|Generate|TOK:DGM|Elemental|| |Generate|TOK:DGM|Elemental||
|Generate|TOK:DGM|Bird|| |Generate|TOK:DGM|Bird||
@ -443,7 +443,7 @@
|Generate|TOK:GTC|Soldier|1| |Generate|TOK:GTC|Soldier|1|
|Generate|TOK:GTC|Soldier|2| |Generate|TOK:GTC|Soldier|2|
|Generate|TOK:GTC|Spirit|| |Generate|TOK:GTC|Spirit||
|Generate|EMBLEM:GTC|Domri Rade|| |Generate|EMBLEM:GTC|Domri Rade||Emblem Domri|
|Generate|TOK:RTR|Bird|| |Generate|TOK:RTR|Bird||
|Generate|TOK:RTR|Knight|1| |Generate|TOK:RTR|Knight|1|
@ -462,7 +462,7 @@
|Generate|TOK:DDJ|Saproling|| |Generate|TOK:DDJ|Saproling||
|Generate|EMBLEM-:M13|Liliana of the Dark Realms|| |Generate|EMBLEM-:M13|Liliana of the Dark Realms||Emblem Liliana|
|Generate|TOK:M13|Cat|| |Generate|TOK:M13|Cat||
|Generate|TOK:M13|Goat|| |Generate|TOK:M13|Goat||
|Generate|TOK:M13|Soldier|| |Generate|TOK:M13|Soldier||
@ -475,7 +475,7 @@
|Generate|TOK:M13|Saproling|| |Generate|TOK:M13|Saproling||
|Generate|TOK:M13|Wurm|| |Generate|TOK:M13|Wurm||
|Generate|EMBLEM:AVR|Tamiyo, the Moon Sage|| |Generate|EMBLEM:AVR|Tamiyo, the Moon Sage||Emblem Tamiyo|
|Generate|TOK:AVR|Angel|1| |Generate|TOK:AVR|Angel|1|
|Generate|TOK:AVR|Angel|2| |Generate|TOK:AVR|Angel|2|
|Generate|TOK:AVR|Angel|3| |Generate|TOK:AVR|Angel|3|
@ -488,12 +488,12 @@
|Generate|TOK:AVR|Demon|3| |Generate|TOK:AVR|Demon|3|
|Generate|TOK:AVR|Zombie|| |Generate|TOK:AVR|Zombie||
|Generate|EMBLEM:DDI|Venser, the Sojourner|| |Generate|EMBLEM:DDI|Venser, the Sojourner||Emblem Venser|
|Generate|EMBLEM:DDI|Koth of the Hammer|| |Generate|EMBLEM:DDI|Koth of the Hammer||Emblem Koth|
|Generate|TOK:DKA|Human|| |Generate|TOK:DKA|Human||
|Generate|TOK:DKA|Vampire|| |Generate|TOK:DKA|Vampire||
|Generate|EMBLEM:DKA|Sorin, Lord of Innistrad| |Generate|EMBLEM:DKA|Sorin, Lord of Innistrad||Emblem Sorin|
|Generate|TOK:ISD|Angel|| |Generate|TOK:ISD|Angel||
|Generate|TOK:ISD|Spirit|| |Generate|TOK:ISD|Spirit||

View file

@ -55,7 +55,7 @@ Angel, T1, W, 4|4, Player Rewards, Creature - Angel, Scott M. Fischer, Flying
8ED - Eighth Edition (2003-07-28) 8ED - Eighth Edition (2003-07-28)
Rukh, T1, R, 4|4, Player Rewards, Creature - Rukh, Edward P. Beard Jr., Flying Rukh, T1, R, 4|4, Player Rewards, Creature - Rukh, Edward P. Beard<EFBFBD> Jr., Flying
MRD - Mirrodin (2003-10-02) MRD - Mirrodin (2003-10-02)
@ -65,7 +65,7 @@ Pentavite, T3, -, 1|1, Player Rewards, Artifact Creature - Pentavite, Greg Stapl
DST - Darksteel (2004-02-06) DST - Darksteel (2004-02-06)
Beast, T1, G, 3|3, Player Rewards, Creature - Beast, Edward P. Beard Jr., - Beast, T1, G, 3|3, Player Rewards, Creature - Beast, Edward P. Beard<EFBFBD> Jr., -
CHK - Champions of Kamigawa (2004-10-01) CHK - Champions of Kamigawa (2004-10-01)
@ -73,7 +73,7 @@ Spirit, T1, -, 1|1, Player Rewards, Creature - Spirit, Hugh Jamieson, -
CSP - Coldsnap (2006-07-21) CSP - Coldsnap (2006-07-21)
Marit Lage, T1, B, 20|20, Pre-Release, Creature - Avatar, Stephan Martiniere, Flying indestructible Marit Lage, T1, B, 20|20, Pre-Release, Creature - Avatar, Stephan Martiniere, Flying<EFBFBD> indestructible
10E - Tenth Edition (2007-07-13) 10E - Tenth Edition (2007-07-13)
@ -167,7 +167,7 @@ ARB - Alara Reborn (2009-04-30)
Bird Soldier, 1, W, 1|1, -, Creature - Bird Soldier, Matt Cavotta, Flying Bird Soldier, 1, W, 1|1, -, Creature - Bird Soldier, Matt Cavotta, Flying
Lizard, 2, G, 2|2, -, Creature - Lizard, Anthony S. Waters, - Lizard, 2, G, 2|2, -, Creature - Lizard, Anthony S. Waters, -
Dragon, 3, R G, 1|1, -, Creature - Dragon, Jaime Jones, Flying devour 2 Dragon, 3, R G, 1|1, -, Creature - Dragon, Jaime Jones, Flying<EFBFBD> devour 2
Zombie Wizard, 4, U B, 1|1, -, Creature - Zombie Wizard, Dave Allsop, - Zombie Wizard, 4, U B, 1|1, -, Creature - Zombie Wizard, Dave Allsop, -
M10 - Magic 2010 (2009-07-17) M10 - Magic 2010 (2009-07-17)
@ -190,7 +190,7 @@ Illusion, 4, U, 2|2, -, Creature - Illusion, Cyril Van Der Haegen, -
Merfolk, 5, U, 1|1, -, Creature - Merfolk, Warren Mahy, - Merfolk, 5, U, 1|1, -, Creature - Merfolk, Warren Mahy, -
Vampire, 6, B, *|*, -, Creature - Vampire, Kekai Kotaki, - Vampire, 6, B, *|*, -, Creature - Vampire, Kekai Kotaki, -
Zombie Giant, 7, B, 5|5, -, Creature - Zombie Giant, Igor Kieryluk, - Zombie Giant, 7, B, 5|5, -, Creature - Zombie Giant, Igor Kieryluk, -
Elemental, 8, R, 7|1, -, Creature - Elemental, Anthony Francisco, Trample haste Elemental, 8, R, 7|1, -, Creature - Elemental, Anthony Francisco, Trample<EFBFBD> haste
Beast, 9, G, 4|4, -, Creature - Beast, Steve Prescott, - Beast, 9, G, 4|4, -, Creature - Beast, Steve Prescott, -
Snake, 10, G, 1|1, -, Creature - Snake, Austin Hsu, - Snake, 10, G, 1|1, -, Creature - Snake, Austin Hsu, -
Wolf, 11, G, 2|2, -, Creature - Wolf, Daren Bader, - Wolf, 11, G, 2|2, -, Creature - Wolf, Daren Bader, -
@ -212,7 +212,7 @@ Construct, 6, -, 6|12, -, Artifact Creature - Construct, Jung Park, Trample
DDE - Duel Decks: Phyrexia vs. the Coalition (2010-03-19) DDE - Duel Decks: Phyrexia vs. the Coalition (2010-03-19)
Hornet, T1, -, 1|1, -, Artifact Creature - Insect, Ron Spencer, Flying haste Hornet, T1, -, 1|1, -, Artifact Creature - Insect, Ron Spencer, Flying<EFBFBD> haste
Minion, T2, B, *|*, -, Creature - Minion, Dave Kendall, - Minion, T2, B, *|*, -, Creature - Minion, Dave Kendall, -
Saproling, T3, G, 1|1, -, Creature - Saproling, Warren Mahy, - Saproling, T3, G, 1|1, -, Creature - Saproling, Warren Mahy, -
@ -232,7 +232,7 @@ Avatar, 1, W, *|*, -, Creature - Avatar, Vance Kovacs, This creature's power and
Bird, 2, W, 3|3, -, Creature - Bird, Paul Bonner, Flying Bird, 2, W, 3|3, -, Creature - Bird, Paul Bonner, Flying
Zombie, 3, B, 2|2, -, Creature - Zombie, Bud Cook, - Zombie, 3, B, 2|2, -, Creature - Zombie, Bud Cook, -
Beast, 4, G, 3|3, -, Creature - Beast, John Donahue, - Beast, 4, G, 3|3, -, Creature - Beast, John Donahue, -
Ooze, 5, G, 2|2, -, Creature - Ooze, Raymond Swanland, When this creature dies put two 1/1 green Ooze creature tokens onto the battlefield. Ooze, 5, G, 2|2, -, Creature - Ooze, Raymond Swanland, When this creature dies<EFBFBD> put two 1/1 green Ooze creature tokens onto the battlefield.
Ooze, 6, G, 1|1, -, Creature - Ooze, Raymond Swanland, - Ooze, 6, G, 1|1, -, Creature - Ooze, Raymond Swanland, -
DDF - Duel Decks: Elspeth vs. Tezzeret (2010-09-03) DDF - Duel Decks: Elspeth vs. Tezzeret (2010-09-03)
@ -313,7 +313,7 @@ Sorin Emblem, 3, -, -, -, Emblem - Sorin, Michael Komrack, Creatures you control
DDI - Duel Decks: Venser vs. Koth (2012-03-30) DDI - Duel Decks: Venser vs. Koth (2012-03-30)
Koth Emblem, E1, -, -, -, Emblem - Koth, Eric Deschamps, Mountains you control have Tap: This land deals 1 damage to target creature or player.' Koth Emblem, E1, -, -, -, Emblem - Koth, Eric Deschamps, Mountains you control have Tap: This land deals 1 damage to target creature or player.'
Venser Emblem, E2, -, -, -, Emblem - Venser, Eric Deschamps, Whenever you cast a spell exile target permanent. Venser Emblem, E2, -, -, -, Emblem - Venser, Eric Deschamps, Whenever you cast a spell<EFBFBD> exile target permanent.
FNM - Friday Night Magic (2012-04-01) FNM - Friday Night Magic (2012-04-01)
@ -329,7 +329,7 @@ Spirit, 4, U, 1|1, -, Creature - Spirit, Dan Scott, Flying
Demon, 5, B, 5|5, -, Creature - Demon, Kev Walker, Flying Demon, 5, B, 5|5, -, Creature - Demon, Kev Walker, Flying
Zombie, 6, B, 2|2, -, Creature - Zombie, Lucas Graciano, - Zombie, 6, B, 2|2, -, Creature - Zombie, Lucas Graciano, -
Human, 7, R, 1|1, -, Creature - Human, Ryan Pancoast, Haste Human, 7, R, 1|1, -, Creature - Human, Ryan Pancoast, Haste
Tamiyo Emblem, 8, -, -, -, Emblem - Tamiyo, Eric Deschamps, You have no maximum hand size. Whenever a card is put into your graveyard from anywhere you may return it to your hand. Tamiyo Emblem, 8, -, -, -, Emblem - Tamiyo, Eric Deschamps, You have no maximum hand size. Whenever a card is put into your graveyard from anywhere<EFBFBD> you may return it to your hand.
Angel, T1, W, 4|4, Pre-Release, Creature - Angel, James Ryman, Flying Angel, T1, W, 4|4, Pre-Release, Creature - Angel, James Ryman, Flying
Angel, T1F, W, 4|4, Pre-Release, Creature - Angel, James Ryman, Flying Angel, T1F, W, 4|4, Pre-Release, Creature - Angel, James Ryman, Flying
Demon, T5, B, 5|5, Pre-Release, Creature - Demon, Karl Kopinski, Flying Demon, T5, B, 5|5, Pre-Release, Creature - Demon, Karl Kopinski, Flying
@ -361,7 +361,7 @@ Knight, 1, W, 2|2, League, Creature - Knight, Lucas Graciano, Vigilance
Bird, 1, W, 1|1, -, Creature - Bird, James Ryman, Flying Bird, 1, W, 1|1, -, Creature - Bird, James Ryman, Flying
Knight, 2, W, 2|2, -, Creature - Knight, Matt Stewart, Vigilance Knight, 2, W, 2|2, -, Creature - Knight, Matt Stewart, Vigilance
Soldier, 3, W, 1|1, -, Creature - Soldier, Steve Prescott, - Soldier, 3, W, 1|1, -, Creature - Soldier, Steve Prescott, -
Assassin, 4, B, 1|1, -, Creature - Assassin, Svetlin Velinov, Whenever this creature deals combat damage to a player that player loses the game. Assassin, 4, B, 1|1, -, Creature - Assassin, Svetlin Velinov, Whenever this creature deals combat damage to a player<EFBFBD> that player loses the game.
Dragon, 5, R, 6|6, -, Creature - Dragon, Mark Zug, Flying Dragon, 5, R, 6|6, -, Creature - Dragon, Mark Zug, Flying
Goblin, 6, R, 1|1, -, Creature - Goblin, Christopher Moeller, - Goblin, 6, R, 1|1, -, Creature - Goblin, Christopher Moeller, -
Centaur, 7, G, 3|3, -, Creature - Centaur, Slawomir Maniak, - Centaur, 7, G, 3|3, -, Creature - Centaur, Slawomir Maniak, -
@ -377,11 +377,11 @@ Soldier, 1, R W, 1|1, League, Creature - Soldier, Zoltan Boros, Haste
Angel, 1, W, 4|4, -, Creature - Angel, Steve Argyle, Flying Angel, 1, W, 4|4, -, Creature - Angel, Steve Argyle, Flying
Rat, 2, B, 1|1, -, Creature - Rat, Nils Hamm, - Rat, 2, B, 1|1, -, Creature - Rat, Nils Hamm, -
Frog Lizard, 3, G, 3|3, -, Creature - Frog Lizard, Jack Wang, - Frog Lizard, 3, G, 3|3, -, Creature - Frog Lizard, Jack Wang, -
Cleric, 4, W B, 1|1, -, Creature - Cleric, Jason Chan, {3}{W}{B}{B} {T} Sacrifice this creature: Return a card named Deathpact Angel from your graveyard to the battlefield. Cleric, 4, W B, 1|1, -, Creature - Cleric, Jason Chan, {3}{W}{B}{B}<EFBFBD> {T}<7D> Sacrifice this creature: Return a card named Deathpact Angel from your graveyard to the battlefield.
Horror, 5, U B, 1|1, -, Creature - Horror, Adam Paquette, Flying Horror, 5, U B, 1|1, -, Creature - Horror, Adam Paquette, Flying
Soldier, 6, R W, 1|1, -, Creature - Soldier, David Palumbo, Haste Soldier, 6, R W, 1|1, -, Creature - Soldier, David Palumbo, Haste
Spirit, 7, W B, 1|1, -, Creature - Spirit, Cliff Childs, Flying Spirit, 7, W B, 1|1, -, Creature - Spirit, Cliff Childs, Flying
Domri Emblem, 8, -, -, -, Emblem - Domri, Tyler Jacobson, Creatures you control have double strike trample hexproof and haste. Domri Emblem, 8, -, -, -, Emblem - Domri, Tyler Jacobson, Creatures you control have double strike<EFBFBD> trample<6C> hexproof<6F> and haste.
DDK - Duel Decks: Sorin vs. Tibalt (2013-03-15) DDK - Duel Decks: Sorin vs. Tibalt (2013-03-15)
@ -409,7 +409,7 @@ Saproling, 12, G, 1|1, -, Creature - Saproling, Warren Mahy, -
Treefolk Shaman, 13, G, 2|5, -, Creature - Treefolk Shaman, Zack Stella, - Treefolk Shaman, 13, G, 2|5, -, Creature - Treefolk Shaman, Zack Stella, -
Faerie Rogue, 14, U B, 1|1, -, Creature - Faerie Rogue, E. M. Gist, Flying Faerie Rogue, 14, U B, 1|1, -, Creature - Faerie Rogue, E. M. Gist, Flying
Worm, 15, B G, 1|1, -, Creature - Worm, Chuck Lukacs, - Worm, 15, B G, 1|1, -, Creature - Worm, Chuck Lukacs, -
Elspeth Emblem, 16, -, -, -, Emblem - Elspeth, Volkan Baga, Artifacts creatures enchantments and lands you control have indestructible. Elspeth Emblem, 16, -, -, -, Emblem - Elspeth, Volkan Baga, Artifacts<EFBFBD> creatures<65> enchantments<74> and lands you control have indestructible.
M14 - Magic 2014 Core Set (2013-07-19) M14 - Magic 2014 Core Set (2013-07-19)
@ -425,7 +425,7 @@ Beast, 9, G, 3|3, -, Creature - Beast, John Donahue, -
Saproling, 10, G, 1|1, -, Creature - Saproling, Brad Rigney, - Saproling, 10, G, 1|1, -, Creature - Saproling, Brad Rigney, -
Wolf, 11, G, 2|2, -, Creature - Wolf, Lars Grant-West, - Wolf, 11, G, 2|2, -, Creature - Wolf, Lars Grant-West, -
Liliana Emblem, 12, -, -, -, Emblem - Liliana, D. Alexander Gregory, Swamps you control have Tap: Add {B}{B}{B}{B} to your mana pool.' Liliana Emblem, 12, -, -, -, Emblem - Liliana, D. Alexander Gregory, Swamps you control have Tap: Add {B}{B}{B}{B} to your mana pool.'
Garruk Emblem, 13, -, -, -, Emblem - Garruk, Karl Kopinski, Whenever you cast a creature spell you may search your library for a creature card put it onto the battlefield then shuffle your library. Garruk Emblem, 13, -, -, -, Emblem - Garruk, Karl Kopinski, Whenever you cast a creature spell<EFBFBD> you may search your library for a creature card<72> put it onto the battlefield<6C> then shuffle your library.
Sliver, T1, -, 1|1, League, Creature - Sliver, Vincent Proce, - Sliver, T1, -, 1|1, League, Creature - Sliver, Vincent Proce, -
DDL - Duel Decks: Heroes vs. Monsters (2013-09-06) DDL - Duel Decks: Heroes vs. Monsters (2013-09-06)
@ -462,11 +462,11 @@ Elemental, 7, R, 3|1, -, Enchantment Creature - Elemental, Greg Staples, -
Centaur, 8, G, 3|3, -, Enchantment Creature - Centaur, Ryan Barger, - Centaur, 8, G, 3|3, -, Enchantment Creature - Centaur, Ryan Barger, -
Wolf, 9, G, 2|2, -, Creature - Wolf, Raoul Vitale, - Wolf, 9, G, 2|2, -, Creature - Wolf, Raoul Vitale, -
Gold, 10, -, -, -, Artifact, Richard Wright, Sacrifice this artifact: Add one mana of any color to your mana pool. Gold, 10, -, -, -, Artifact, Richard Wright, Sacrifice this artifact: Add one mana of any color to your mana pool.
Kiora Emblem, 11, -, -, -, Emblem - Kiora, Scott M. Fischer, At the beginning of your end step put a 9/9 blue Kraken creature token onto the battlefield. Kiora Emblem, 11, -, -, -, Emblem - Kiora, Scott M. Fischer, At the beginning of your end step<EFBFBD> put a 9/9 blue Kraken creature token onto the battlefield.
DDM - Duel Decks: Jace vs. Vraska (2014-03-14) DDM - Duel Decks: Jace vs. Vraska (2014-03-14)
Assassin, T1, B, 1|1, -, Creature - Assassin, Svetlin Velinov, Whenever this creature deals combat damage to a player that player loses the game. Assassin, T1, B, 1|1, -, Creature - Assassin, Svetlin Velinov, Whenever this creature deals combat damage to a player<EFBFBD> that player loses the game.
JOU - Journey into Nyx (2014-05-02) JOU - Journey into Nyx (2014-05-02)
@ -483,7 +483,7 @@ MD1 - Modern Event Deck 2014 (2014-05-30)
Soldier, 1, W, 1|1, -, Creature - Soldier, Goran Josic, - Soldier, 1, W, 1|1, -, Creature - Soldier, Goran Josic, -
Spirit, 2, W, 1|1, -, Creature - Spirit, Kev Walker, Flying Spirit, 2, W, 1|1, -, Creature - Spirit, Kev Walker, Flying
Myr, 3, -, 1|1, -, Artifact Creature - Myr, Matt Stewart, - Myr, 3, -, 1|1, -, Artifact Creature - Myr, Matt Stewart, -
Elspeth Emblem, 4, -, -, -, Emblem - Elspeth, Volkan Baga, Artifacts creatures enchantments and lands you control have indestructible. Elspeth Emblem, 4, -, -, -, Emblem - Elspeth, Volkan Baga, Artifacts<EFBFBD> creatures<65> enchantments<74> and lands you control have indestructible.
CNS - Conspiracy (2014-06-06) CNS - Conspiracy (2014-06-06)
@ -495,7 +495,7 @@ Elephant, 5, G, 3|3, -, Creature - Elephant, Lars Grant-West, -
Squirrel, 6, G, 1|1, -, Creature - Squirrel, Daniel Ljunggren, - Squirrel, 6, G, 1|1, -, Creature - Squirrel, Daniel Ljunggren, -
Wolf, 7, G, 2|2, -, Creature - Wolf, Raoul Vitale, - Wolf, 7, G, 2|2, -, Creature - Wolf, Raoul Vitale, -
Construct, 8, -, 1|1, -, Artifact Creature - Construct, Adam Paquette, Defender Construct, 8, -, 1|1, -, Artifact Creature - Construct, Adam Paquette, Defender
Dack Emblem, 9, -, -, -, Emblem - Dack, Eric Deschamps, Whenever you cast a spell that targets one or more permanents gain control of those permanents. Dack Emblem, 9, -, -, -, Emblem - Dack, Eric Deschamps, Whenever you cast a spell that targets one or more permanents<EFBFBD> gain control of those permanents.
M15 - Magic 2015 Core Set (2014-07-18) M15 - Magic 2015 Core Set (2014-07-18)
@ -510,11 +510,11 @@ Zombie, 006, B, 2|2, -, Creature - Zombie, Lucas Graciano, -
Dragon, 007, R, 2|2, -, Creature - Dragon, Jack Wang, Flying {R}: This creature gets +1/+0 until end of turn. Dragon, 007, R, 2|2, -, Creature - Dragon, Jack Wang, Flying {R}: This creature gets +1/+0 until end of turn.
Goblin, 008, R, 1|1, -, Creature - Goblin, Karl Kopinski, - Goblin, 008, R, 1|1, -, Creature - Goblin, Karl Kopinski, -
Beast, 009, G, 3|3, -, Creature - Beast, Dave Kendall, - Beast, 009, G, 3|3, -, Creature - Beast, Dave Kendall, -
Insect, 010, G, 1|1, -, Creature - Insect, Martina Pilcerova, Flying deathtouch Insect, 010, G, 1|1, -, Creature - Insect, Martina Pilcerova, Flying<EFBFBD> deathtouch
Treefolk Warrior, 011, G, *|*, -, Creature - Treefolk Warrior, Todd Lockwood, This creature's power and toughness are each equal to the number of Forests you control. Treefolk Warrior, 011, G, *|*, -, Creature - Treefolk Warrior, Todd Lockwood, This creature's power and toughness are each equal to the number of Forests you control.
Land Mine, 012, -, -, -, Artifact, Kev Walker, {R} Sacrifice this artifact: This artifact deals 2 damage to target attacking creature without flying. Land Mine, 012, -, -, -, Artifact, Kev Walker, {R}<EFBFBD> Sacrifice this artifact: This artifact deals 2 damage to target attacking creature without flying.
Ajani Emblem, 013, -, -, -, Emblem - Ajani, Chris Rahn, If a source would deal damage to you or a planeswalker you control prevent all but 1 of that damage. Ajani Emblem, 013, -, -, -, Emblem - Ajani, Chris Rahn, If a source would deal damage to you or a planeswalker you control<EFBFBD> prevent all but 1 of that damage.
Garruk Emblem, 014, -, -, -, Emblem - Garruk, Tyler Jacobson, Whenever a creature attacks you it gets +5/+5 and gains trample until end of turn. Garruk Emblem, 014, -, -, -, Emblem - Garruk, Tyler Jacobson, Whenever a creature attacks you<EFBFBD> it gets +5/+5 and gains trample until end of turn.
DDN - Duel Decks: Speed vs. Cunning (2014-09-05) DDN - Duel Decks: Speed vs. Cunning (2014-09-05)
@ -534,8 +534,8 @@ Bear, 008, G, 4|4, -, Creature - Bear, Kev Walker, -
Snake, 009, G, 1|1, -, Creature - Snake, Lars Grant-West, - Snake, 009, G, 1|1, -, Creature - Snake, Lars Grant-West, -
Spirit Warrior, 010, B G, *|*, -, Creature - Spirit Warrior, Ryan Alexander Lee, - Spirit Warrior, 010, B G, *|*, -, Creature - Spirit Warrior, Ryan Alexander Lee, -
Morph, 011, -, 2|2, -, Creature, Raymond Swanland, (You can cover a face-down creature with this reminder card. A card with morph can be turned face up any time for its morph cost.) Morph, 011, -, 2|2, -, Creature, Raymond Swanland, (You can cover a face-down creature with this reminder card. A card with morph can be turned face up any time for its morph cost.)
Sarkhan Emblem, 012, -, -, -, Emblem - Sarkhan, Daarken, At the beginning of your draw step draw two additional cards. At the beginning of your end step discard your hand. Sarkhan Emblem, 012, -, -, -, Emblem - Sarkhan, Daarken, At the beginning of your draw step<EFBFBD> draw two additional cards. At the beginning of your end step<65> discard your hand.
Sorin Emblem, 013, -, -, -, Emblem - Sorin, Cynthia Sheppard, At the beginning of each opponent's upkeep that player sacrifices a creature. Sorin Emblem, 013, -, -, -, Emblem - Sorin, Cynthia Sheppard, At the beginning of each opponent's upkeep<EFBFBD> that player sacrifices a creature.
C14 - Commander 2014 (2014-11-07) C14 - Commander 2014 (2014-11-07)
@ -546,9 +546,9 @@ Kor Soldier, 004, W, 1|1, -, Creature - Kor Soldier, Daren Bader, -
Pegasus, 005, W, 1|1, -, Creature - Pegasus, Greg Hildebrandt, Flying Pegasus, 005, W, 1|1, -, Creature - Pegasus, Greg Hildebrandt, Flying
Soldier, 006, W, 1|1, -, Creature - Soldier, Goran Josic, - Soldier, 006, W, 1|1, -, Creature - Soldier, Goran Josic, -
Spirit, 007, W, 1|1, -, Creature - Spirit, Ryan Yee, Flying Spirit, 007, W, 1|1, -, Creature - Spirit, Ryan Yee, Flying
Fish, 008, U, 3|3, -, Creature - Fish, Dan Scott, When this creature dies put a 6/6 blue Whale creature token onto the battlefield with "When this creature dies put a 9/9 blue Kraken creature token onto the battlefield." Fish, 008, U, 3|3, -, Creature - Fish, Dan Scott, When this creature dies<EFBFBD> put a 6/6 blue Whale creature token onto the battlefield with "When this creature dies<65> put a 9/9 blue Kraken creature token onto the battlefield."
Kraken, 009, U, 9|9, -, Creature - Kraken, Dan Scott, - Kraken, 009, U, 9|9, -, Creature - Kraken, Dan Scott, -
Whale, 010, U, 6|6, -, Creature - Whale, Dan Scott, When this creature dies put a 9/9 blue Kraken creature token onto the battlefield. Whale, 010, U, 6|6, -, Creature - Whale, Dan Scott, When this creature dies<EFBFBD> put a 9/9 blue Kraken creature token onto the battlefield.
Zombie, 011, U, *|*, -, Creature - Zombie, Dave Kendall, - Zombie, 011, U, *|*, -, Creature - Zombie, Dave Kendall, -
Demon, 012, B, *|*, -, Creature - Demon, Pete Venters, Flying Demon, 012, B, *|*, -, Creature - Demon, Pete Venters, Flying
Demon, 013, B, 5|5, -, Creature - Demon, Kev Walker, Flying Demon, 013, B, 5|5, -, Creature - Demon, Kev Walker, Flying
@ -573,26 +573,26 @@ Tuktuk The Returned, 031, -, 5|5, -, Legendary Artifact Creature - Goblin Golem,
Wurm, 032, -, 3|3, -, Artifact Creature - Wurm, Raymond Swanland, Deathtouch Wurm, 032, -, 3|3, -, Artifact Creature - Wurm, Raymond Swanland, Deathtouch
Wurm, 033, -, 3|3, -, Artifact Creature - Wurm, Raymond Swanland, Lifelink Wurm, 033, -, 3|3, -, Artifact Creature - Wurm, Raymond Swanland, Lifelink
Teferi Emblem, 034, -, -, -, Emblem - Teferi, Tyler Jacobson, You may activate loyalty abilities of planeswalkers you control on any player's turn any time you could cast an instant. Teferi Emblem, 034, -, -, -, Emblem - Teferi, Tyler Jacobson, You may activate loyalty abilities of planeswalkers you control on any player's turn any time you could cast an instant.
Nixilis Emblem, 035, -, -, -, Emblem - Nixilis, Daarken, {1}{B} Sacrifice a creature: You gain X life and draw X cards where X is the sacrificed creature's power. Nixilis Emblem, 035, -, -, -, Emblem - Nixilis, Daarken, {1}{B}<EFBFBD> Sacrifice a creature: You gain X life and draw X cards<64> where X is the sacrificed creature's power.
Daretti Emblem, 036, -, -, -, Emblem - Daretti, Dan Scott, Whenever an artifact is put into your graveyard from the battlefield return that card to the battlefield at the beginning of the next end step. Daretti Emblem, 036, -, -, -, Emblem - Daretti, Dan Scott, Whenever an artifact is put into your graveyard from the battlefield<EFBFBD> return that card to the battlefield at the beginning of the next end step.
DD3_EVG - Duel Decks Anthology Elves vs. Goblins (2014-12-05) DD3_EVG - Duel Decks Anthology<EFBFBD> Elves vs. Goblins (2014-12-05)
Elemental, 001, G, 7|7, -, Creature - Elemental, Anthony S. Waters, Trample Elemental, 001, G, 7|7, -, Creature - Elemental, Anthony S. Waters, Trample
Elf Warrior, 002, G, 1|1, -, Creature - Elf Warrior, Dominick Domingo, - Elf Warrior, 002, G, 1|1, -, Creature - Elf Warrior, Dominick Domingo, -
Goblin, 003, R, 1|1, -, Creature - Goblin, Dave Kendall, - Goblin, 003, R, 1|1, -, Creature - Goblin, Dave Kendall, -
DD3_JVC - Duel Decks Anthology Jace vs. Chandra (2014-12-05) DD3_JVC - Duel Decks Anthology<EFBFBD> Jace vs. Chandra (2014-12-05)
Elemental Shaman, 004, R, 3|1, -, Creature - Elemental Shaman, Jim Pavelec, - Elemental Shaman, 004, R, 3|1, -, Creature - Elemental Shaman, Jim Pavelec, -
DD3_DVD - Duel Decks Anthology Divine vs. Demonic (2014-12-05) DD3_DVD - Duel Decks Anthology<EFBFBD> Divine vs. Demonic (2014-12-05)
Spirit, 005, W, 1|1, -, Creature - Spirit, Luca Zontini, Flying Spirit, 005, W, 1|1, -, Creature - Spirit, Luca Zontini, Flying
Demon, 006, B, *|*, -, Creature - Demon, Pete Venters, Flying Demon, 006, B, *|*, -, Creature - Demon, Pete Venters, Flying
Thrull, 007, B, -, -, Creature - Thrull, Veronique Meignaud, - Thrull, 007, B, -, -, Creature - Thrull, Veronique Meignaud, -
DD3_GVL - Duel Decks Anthology Garruk vs. Liliana (2014-12-05) DD3_GVL - Duel Decks Anthology<EFBFBD> Garruk vs. Liliana (2014-12-05)
Beast, 008, G, 3|3, -, Creature - Beast, John Donahue, - Beast, 008, G, 3|3, -, Creature - Beast, John Donahue, -
Beast, 009, G, 4|4, -, Creature - Beast, Steve Prescott, - Beast, 009, G, 4|4, -, Creature - Beast, Steve Prescott, -
@ -650,14 +650,14 @@ Soldier, 003, W, 1|1, -, Creature - Soldier, Steve Prescott, -
Demon, 004, B, 5|5, -, Creature - Demon, Kev Walker, Flying Demon, 004, B, 5|5, -, Creature - Demon, Kev Walker, Flying
Zombie, 005, B, 2|2, -, Creature - Zombie, Lucas Graciano, - Zombie, 005, B, 2|2, -, Creature - Zombie, Lucas Graciano, -
Goblin, 006, R, 1|1, -, Creature - Goblin, Brandon Kitkouski, - Goblin, 006, R, 1|1, -, Creature - Goblin, Brandon Kitkouski, -
Ashaya the Awoken World, 007, G, 4|4, -, Legendary Creature - Elemental, Raymond Swanland, - Ashaya<EFBFBD> the Awoken World, 007, G, 4|4, -, Legendary Creature - Elemental, Raymond Swanland, -
Elemental, 008, G, 2|2, -, Creature - Elemental, Marco Nelor, - Elemental, 008, G, 2|2, -, Creature - Elemental, Marco Nelor, -
Elf Warrior, 009, G, 1|1, -, Creature - Elf Warrior, William O'Connor, - Elf Warrior, 009, G, 1|1, -, Creature - Elf Warrior, William O'Connor, -
Thopter, 010, -, 1|1, -, Artifact Creature - Thopter, Adam Paquette, Flying Thopter, 010, -, 1|1, -, Artifact Creature - Thopter, Adam Paquette, Flying
Thopter, 011, -, 1|1, -, Artifact Creature - Thopter, Svetlin Velinov, Flying Thopter, 011, -, 1|1, -, Artifact Creature - Thopter, Svetlin Velinov, Flying
Jace Emblem, 012, -, -, -, Emblem - Jace, Jaime Jones, Whenever you cast a spell target opponent puts the top five cards of his or her library into his or her graveyard. Jace Emblem, 012, -, -, -, Emblem - Jace, Jaime Jones, Whenever you cast a spell<EFBFBD> target opponent puts the top five cards of his or her library into his or her graveyard.
Liliana Emblem, 013, -, -, -, Emblem - Liliana, Karla Ortiz, Whenever a creature dies return it to the battlefield under your control at the beginning of the next end step. Liliana Emblem, 013, -, -, -, Emblem - Liliana, Karla Ortiz, Whenever a creature dies<EFBFBD> return it to the battlefield under your control at the beginning of the next end step.
Chandra Emblem, 014, -, -, -, Emblem - Chandra, Eric Deschamps, At the beginning of your upkeep this emblem deals 3 damage to you. Chandra Emblem, 014, -, -, -, Emblem - Chandra, Eric Deschamps, At the beginning of your upkeep<EFBFBD> this emblem deals 3 damage to you.
DDP - Duel Decks: Zendikar vs. Eldrazi (2015-08-28) DDP - Duel Decks: Zendikar vs. Eldrazi (2015-08-28)
@ -678,7 +678,7 @@ Kor Ally, 006, W, 1|1, -, Creature - Kor Ally, Jeremy Wilson, -
Octopus, 007, U, 8|8, -, Creature - Octopus, Craig J Spearing, - Octopus, 007, U, 8|8, -, Creature - Octopus, Craig J Spearing, -
Dragon, 008, R, 5|5, -, Creature - Dragon, Raymond Swanland, Flying Dragon, 008, R, 5|5, -, Creature - Dragon, Raymond Swanland, Flying
Plant, 009, G, 1|1, -, Creature - Plant, Sam Burley, - Plant, 009, G, 1|1, -, Creature - Plant, Sam Burley, -
Elemental, 009, R, 3|1, -, Creature - Elemental, Victor Adame Minguez, Trample Haste Elemental, 009, R, 3|1, -, Creature - Elemental, Victor Adame Minguez, Trample<EFBFBD> Haste
Elemental, 011, G R, 5|5, -, Creature - Elemental, Brad Rigney, - Elemental, 011, G R, 5|5, -, Creature - Elemental, Brad Rigney, -
Gideon Emblem, 012, -, -, -, Emblem - Gideon, Eric Deschamps, - Gideon Emblem, 012, -, -, -, Emblem - Gideon, Eric Deschamps, -
Nixilis Emblem, 013, -, -, -, Emblem - Nixilis, Chris Rahn, - Nixilis Emblem, 013, -, -, -, Emblem - Nixilis, Chris Rahn, -
@ -696,7 +696,7 @@ Germ, 007, B, -, -, Creature - Germ, Igor Kieryluk, -
Zombie, 008, B, 2|2, -, Creature - Zombie, Lucas Graciano, - Zombie, 008, B, 2|2, -, Creature - Zombie, Lucas Graciano, -
Dragon, 009, R, 5|5, -, Creature - Dragon, Jim Pavelec, Flying Dragon, 009, R, 5|5, -, Creature - Dragon, Jim Pavelec, Flying
Elemental Shaman, 010, R, 3|1, -, Creature - Elemental Shaman, Jim Pavelec, - Elemental Shaman, 010, R, 3|1, -, Creature - Elemental Shaman, Jim Pavelec, -
Lightning Rager, 011, R, 5|1, -, Creature - Elemental, Svetlin Velinov, Trample Haste At the beginning of your end step sacrifice this creature. Lightning Ranger, 011, R, 5|1, -, Creature - Elemental, Svetlin Velinov, Trample<EFBFBD> Haste At the beginning of your end step<65> sacrifice this creature.
Bear, 012, G, 2|2, -, Creature - Bear, Heather Hudson, - Bear, 012, G, 2|2, -, Creature - Bear, Heather Hudson, -
Beast, 013, G, 4|4, -, Creature - Beast, Svetlin Velinov, - Beast, 013, G, 4|4, -, Creature - Beast, Svetlin Velinov, -
Elephant, 014, G, 3|3, -, Creature - Elephant, Lars Grant-West, - Elephant, 014, G, 3|3, -, Creature - Elephant, Lars Grant-West, -
@ -708,5 +708,40 @@ Wolf, 019, G, 2|2, -, Creature - Wolf, David Palumbo, -
Elemental, 020, U R, 5|5, -, Creature - Elemental, Randy Gallegos, Flying Elemental, 020, U R, 5|5, -, Creature - Elemental, Randy Gallegos, Flying
Snake, 021, G U, 1|1, -, Creature - Snake, Christopher Moeller, - Snake, 021, G U, 1|1, -, Creature - Snake, Christopher Moeller, -
Spirit, 022, W B, 1|1, -, Creature - Spirit, Cliff Childs, Flying Spirit, 022, W B, 1|1, -, Creature - Spirit, Cliff Childs, Flying
Spirit, 023, -, *|*, -, Enchantment Creature - Spirit, Adam Paquette, This creature's power and toughness are each equal to the number of experience counters you have. Spirit, 023, W B, *|*, -, Enchantment Creature - Spirit, Adam Paquette, This creature's power and toughness are each equal to the number of experience counters you have.
Gold, 024, -, -, -, Artifact, Richard Wright, Sacrifice this artifact: Add one mana of any color to your mana pool. Gold, 024, -, -, -, Artifact, Richard Wright, Sacrifice this artifact: Add one mana of any color to your mana pool.
OGW - Oath of the Gatewatch (2016-01-22)
Eldrazi Scion, 001, -, 1|1, -, Creature - Eldrazi Scion, Izzy, Sacrifice this creature: Add {1} to your mana pool.
Eldrazi Scion, 002, -, 1|1, -, Creature - Eldrazi Scion, Craig J Spearing, Sacrifice this creature: Add {1} to your mana pool.
Eldrazi Scion, 003, -, 1|1, -, Creature - Eldrazi Scion, Svetlin Velinov, Sacrifice this creature: Add {1} to your mana pool.
Eldrazi Scion, 004, -, 1|1, -, Creature - Eldrazi Scion, Izzy, Sacrifice this creature: Add {1} to your mana pool.
Eldrazi Scion, 005, -, 1|1, -, Creature - Eldrazi Scion, Winona Nelson, Sacrifice this creature: Add {1} to your mana pool.
Eldrazi Scion, 006, -, 1|1, -, Creature - Eldrazi Scion, Svetlin Velinov, Sacrifice this creature: Add {1} to your mana pool.
Angel, 007, W, 3|3, -, Creature - Angel, Anastasia Ovchinnikova, Flying
Zombie, 008, B, 2|2, -, Creature - Zombie, Kev Walker, -
Elemental, 009, R, 3|1, -, Creature - Elemental, Raymond Swanland, -
Elemental, 010, G, *|*, -, Creature - Elemental, Vincent Proce, -
Plant, 011, G, -, -, Creature - Plant, Daren Bader, -
SOI - Shadows over Innistrad (2016-04-08)
Angel, 001, W, 4|4, -, Creature - Angel, Magali Villeneuve, Flying
Human Soldier, 002, W, 1|1, -, Creature - Human Soldier, Deruchenko Alexander, -
Spirit, 003, W, 1|1, -, Creature - Spirit, Jason A. Engle, Flying
Vampire Knight, 004, B, 1|1, -, Creature - Vampire Knight, Deruchenko Alexander, Lifelink
Zombie, 005, B, 2|2, -, Creature - Zombie, Craig J Spearing, -
Devil, 006, R, 1|1, -, Creature - Devil, Wayne England, When this creature dies<65> it deals 1 damage to target creature or player.
Insect, 007, G, 1|1, -, Creature - Insect, Christopher Moeller, -
Ooze, 008, G, 3|3, -, Creature - Ooze, Nils Hamm, -
Wolf, 009, G, 2|2, -, Creature - Wolf, Aaron Miller, -
Human Cleric, 010, W B, 1|1, -, Creature - Human Cleric, Min Yum, -
Clue, 011, -, -, -, Artifact - Clue, John Avon, {2} Sacrifice this Artifact: Draw a card.
Clue, 012, -, -, -, Artifact - Clue, Noah Bradley, {2} Sacrifice this Artifact: Draw a card.
Clue, 013, -, -, -, Artifact - Clue, Zezhou Chen, {2} Sacrifice this Artifact: Draw a card.
Clue, 014, -, -, -, Artifact - Clue, Cliff Childs, {2} Sacrifice this Artifact: Draw a card.
Clue, 015, -, -, -, Artifact - Clue, James Paick, {2} Sacrifice this Artifact: Draw a card.
Clue, 016, -, -, -, Artifact - Clue, Franz Vohwinkel, {2} Sacrifice this Artifact: Draw a card.
Jace Emblem, 017, -, -, -, Emblem - Jace, Tyler Jacobson, Whenever an opponent casts his or her first spell each turn<72> counter that spell.
Arlinn Emblem, 018, -, -, -, Emblem - Arlinn, Winona Nelson, Creatures you control have haste and '{T}: This creature deals damage equal to its power to target creature or player.'

Can't render this file because it contains an unexpected character in line 549 and column 140.

View file

@ -36,7 +36,6 @@ import mage.MageObject;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.effects.Effect; import mage.abilities.effects.Effect;
import mage.cards.Card; import mage.cards.Card;
import mage.constants.CardType;
import mage.constants.Zone; import mage.constants.Zone;
import mage.game.Game; import mage.game.Game;
import mage.game.GameState; import mage.game.GameState;
@ -112,19 +111,13 @@ public class CardsView extends LinkedHashMap<UUID, CardView> {
case COMMAND: case COMMAND:
sourceObject = game.getObject(ability.getSourceId()); sourceObject = game.getObject(ability.getSourceId());
if (sourceObject instanceof Emblem) { if (sourceObject instanceof Emblem) {
Card planeswalkerCard = game.getCard(((Emblem) sourceObject).getSourceId()); // Card sourceCard = (Card) ((Emblem) sourceObject).getSourceObject();
if (planeswalkerCard != null) { // if (sourceCard == null) {
if (!planeswalkerCard.getCardType().contains(CardType.PLANESWALKER)) { // throw new IllegalArgumentException("Source card for emblem not found.");
if (planeswalkerCard.getSecondCardFace() != null) { // }
planeswalkerCard = planeswalkerCard.getSecondCardFace(); abilityView = new AbilityView(ability, sourceObject.getName(), new CardView(new EmblemView((Emblem) sourceObject)));
} abilityView.setName(((Emblem) sourceObject).getName());
} // abilityView.setExpansionSetCode(sourceCard.getExpansionSetCode());
abilityView = new AbilityView(ability, "Emblem " + planeswalkerCard.getName(), new CardView(new EmblemView((Emblem) sourceObject, planeswalkerCard)));
abilityView.setName("Emblem " + planeswalkerCard.getName());
abilityView.setExpansionSetCode(planeswalkerCard.getExpansionSetCode());
} else {
throw new IllegalArgumentException("Source card for emblem not found.");
}
} }
break; break;
} }

View file

@ -36,7 +36,6 @@ import java.util.UUID;
import mage.MageObject; import mage.MageObject;
import mage.abilities.costs.Cost; import mage.abilities.costs.Cost;
import mage.cards.Card; import mage.cards.Card;
import mage.constants.CardType;
import mage.constants.PhaseStep; import mage.constants.PhaseStep;
import mage.constants.TurnPhase; import mage.constants.TurnPhase;
import mage.constants.Zone; import mage.constants.Zone;
@ -127,20 +126,10 @@ public class GameView implements Serializable {
stack.put(stackObject.getId(), new StackAbilityView(game, (StackAbility) stackObject, token.getName(), new CardView(token))); stack.put(stackObject.getId(), new StackAbilityView(game, (StackAbility) stackObject, token.getName(), new CardView(token)));
checkPaid(stackObject.getId(), (StackAbility) stackObject); checkPaid(stackObject.getId(), (StackAbility) stackObject);
} else if (object instanceof Emblem) { } else if (object instanceof Emblem) {
Card sourceCard = game.getCard(((Emblem) object).getSourceId()); CardView cardView = new CardView(new EmblemView((Emblem) object));
CardView cardView; // Card sourceCard = (Card) ((Emblem) object).getSourceObject();
if (sourceCard != null) { ((StackAbility) stackObject).setName(((Emblem) object).getName());
if (!sourceCard.getCardType().contains(CardType.PLANESWALKER)) { // ((StackAbility) stackObject).setExpansionSetCode(sourceCard.getExpansionSetCode());
if (sourceCard.getSecondCardFace() != null) {
sourceCard = sourceCard.getSecondCardFace();
}
}
((StackAbility) stackObject).setName("Emblem " + sourceCard.getName());
((StackAbility) stackObject).setExpansionSetCode(sourceCard.getExpansionSetCode());
cardView = new CardView(new EmblemView(((Emblem) object), sourceCard));
} else {
cardView = new CardView(new EmblemView((Emblem) object));
}
stack.put(stackObject.getId(), stack.put(stackObject.getId(),
new StackAbilityView(game, (StackAbility) stackObject, object.getName(), cardView)); new StackAbilityView(game, (StackAbility) stackObject, object.getName(), cardView));
checkPaid(stackObject.getId(), ((StackAbility) stackObject)); checkPaid(stackObject.getId(), ((StackAbility) stackObject));

View file

@ -35,7 +35,6 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
import mage.cards.Card; import mage.cards.Card;
import mage.constants.CardType;
import mage.counters.Counters; import mage.counters.Counters;
import mage.game.ExileZone; import mage.game.ExileZone;
import mage.game.Game; import mage.game.Game;
@ -139,17 +138,7 @@ public class PlayerView implements Serializable {
if (commandObject instanceof Emblem) { if (commandObject instanceof Emblem) {
Emblem emblem = (Emblem) commandObject; Emblem emblem = (Emblem) commandObject;
if (emblem.getControllerId().equals(this.playerId)) { if (emblem.getControllerId().equals(this.playerId)) {
Card sourceCard = game.getCard(((CommandObject) emblem).getSourceId()); commandList.add(new EmblemView(emblem));
if (sourceCard != null) {
if (!sourceCard.getCardType().contains(CardType.PLANESWALKER)) {
if (sourceCard.getSecondCardFace() != null) {
sourceCard = sourceCard.getSecondCardFace();
}
}
commandList.add(new EmblemView(emblem, sourceCard));
} else {
commandList.add(new EmblemView(emblem));
}
} }
} else if (commandObject instanceof Commander) { } else if (commandObject instanceof Commander) {
Commander commander = (Commander) commandObject; Commander commander = (Commander) commandObject;

View file

@ -87,7 +87,8 @@ public class MomirDuel extends GameImpl {
for (UUID playerId : state.getPlayerList(startingPlayerId)) { for (UUID playerId : state.getPlayerList(startingPlayerId)) {
Player player = getPlayer(playerId); Player player = getPlayer(playerId);
if (player != null) { if (player != null) {
addEmblem(new MomirEmblem(), ability, playerId); CardInfo cardInfo = CardRepository.instance.findCard("Momir Vig, Simic Visionary");
addEmblem(new MomirEmblem(), cardInfo.getCard(), playerId);
} }
} }
getState().addAbility(ability, null); getState().addAbility(ability, null);
@ -122,8 +123,8 @@ public class MomirDuel extends GameImpl {
class MomirEmblem extends Emblem { class MomirEmblem extends Emblem {
public MomirEmblem() { public MomirEmblem() {
setName("Momir Vig, Simic Visionary"); setName("Emblem Momir Vig, Simic Visionary");
//TODO: setExpansionSetCodeForImage(???); setExpansionSetCodeForImage("DIS");
// {X}, Discard a card: Put a token into play as a copy of a random creature card with converted mana cost X. Play this ability only any time you could play a sorcery and only once each turn. // {X}, Discard a card: Put a token into play as a copy of a random creature card with converted mana cost X. Play this ability only any time you could play a sorcery and only once each turn.
LimitedTimesPerTurnActivatedAbility ability = new LimitedTimesPerTurnActivatedAbility(Zone.COMMAND, new MomirEffect(), new VariableManaCost()); LimitedTimesPerTurnActivatedAbility ability = new LimitedTimesPerTurnActivatedAbility(Zone.COMMAND, new MomirEffect(), new VariableManaCost());
ability.addCost(new DiscardCardCost()); ability.addCost(new DiscardCardCost());

View file

@ -72,7 +72,7 @@ public class AjaniSteadfast extends CardImpl {
} }
public AjaniSteadfast(UUID ownerId, CardSetInfo setInfo) { public AjaniSteadfast(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{3}{W}"); super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{3}{W}");
this.subtype.add("Ajani"); this.subtype.add("Ajani");
this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4));
@ -117,7 +117,7 @@ public class AjaniSteadfast extends CardImpl {
class AjaniSteadfastEmblem extends Emblem { class AjaniSteadfastEmblem extends Emblem {
public AjaniSteadfastEmblem() { public AjaniSteadfastEmblem() {
setName("EMBLEM: Ajani Steadfast"); setName("Emblem Ajani");
this.getAbilities().add(new SimpleStaticAbility(Zone.COMMAND, new AjaniSteadfastPreventEffect())); this.getAbilities().add(new SimpleStaticAbility(Zone.COMMAND, new AjaniSteadfastPreventEffect()));
this.setExpansionSetCodeForImage("M15"); this.setExpansionSetCodeForImage("M15");
} }

View file

@ -63,7 +63,7 @@ public class ArlinnEmbracedByTheMoon extends CardImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Creatures you control"); private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Creatures you control");
public ArlinnEmbracedByTheMoon(UUID ownerId, CardSetInfo setInfo) { public ArlinnEmbracedByTheMoon(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},""); super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "");
this.subtype.add("Arlinn"); this.subtype.add("Arlinn");
this.color.setRed(true); this.color.setRed(true);
this.color.setGreen(true); this.color.setGreen(true);
@ -105,7 +105,7 @@ class ArlinnEmbracedByTheMoonEmblem extends Emblem {
// "Creatures you control have haste and '{T}: This creature deals damage equal to its power to target creature or player.'" // "Creatures you control have haste and '{T}: This creature deals damage equal to its power to target creature or player.'"
public ArlinnEmbracedByTheMoonEmblem() { public ArlinnEmbracedByTheMoonEmblem() {
this.setName("EMBLEM: Arlinn, Embraced by the Moon"); this.setName("Emblem Arlinn");
FilterPermanent filter = new FilterControlledCreaturePermanent("Creatures"); FilterPermanent filter = new FilterControlledCreaturePermanent("Creatures");
GainAbilityControlledEffect effect = new GainAbilityControlledEffect(HasteAbility.getInstance(), Duration.EndOfGame, filter); GainAbilityControlledEffect effect = new GainAbilityControlledEffect(HasteAbility.getInstance(), Duration.EndOfGame, filter);
effect.setText("Creatures you control have haste"); effect.setText("Creatures you control have haste");

View file

@ -56,7 +56,7 @@ import mage.target.common.TargetCreaturePermanent;
public class ChandraRoaringFlame extends CardImpl { public class ChandraRoaringFlame extends CardImpl {
public ChandraRoaringFlame(UUID ownerId, CardSetInfo setInfo) { public ChandraRoaringFlame(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},""); super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "");
this.subtype.add("Chandra"); this.subtype.add("Chandra");
this.color.setRed(true); this.color.setRed(true);
@ -120,7 +120,7 @@ class ChandraRoaringFlameEmblemEffect extends OneShotEffect {
} }
} }
for (Player opponent : opponentsEmblem) { for (Player opponent : opponentsEmblem) {
game.addEmblem(new ChandraRoaringFlameEmblem(), source, opponent.getId()); game.addEmblem(new ChandraRoaringFlameEmblem(), source.getSourceObject(game), opponent.getId());
} }
} }
return false; return false;
@ -134,7 +134,8 @@ class ChandraRoaringFlameEmblemEffect extends OneShotEffect {
class ChandraRoaringFlameEmblem extends Emblem { class ChandraRoaringFlameEmblem extends Emblem {
public ChandraRoaringFlameEmblem() { public ChandraRoaringFlameEmblem() {
setName("EMBLEM: Chandra, Roaring Flame"); setName("Emblem Chandra");
setExpansionSetCodeForImage("ORI");
Effect effect = new DamageTargetEffect(3); Effect effect = new DamageTargetEffect(3);
effect.setText("this emblem deals 3 damage to you"); effect.setText("this emblem deals 3 damage to you");
this.getAbilities().add(new BeginningOfUpkeepTriggeredAbility(Zone.COMMAND, effect, TargetController.YOU, false, true)); this.getAbilities().add(new BeginningOfUpkeepTriggeredAbility(Zone.COMMAND, effect, TargetController.YOU, false, true));

View file

@ -63,7 +63,7 @@ import mage.target.common.TargetCreaturePermanent;
public class ChandraTorchOfDefiance extends CardImpl { public class ChandraTorchOfDefiance extends CardImpl {
public ChandraTorchOfDefiance(UUID ownerId, CardSetInfo setInfo) { public ChandraTorchOfDefiance(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{2}{R}{R}"); super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{2}{R}{R}");
this.subtype.add("Chandra"); this.subtype.add("Chandra");
this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4));
@ -142,7 +142,7 @@ class ChandraTorchOfDefianceEmblem extends Emblem {
// You get an emblem with "Whenever you cast a spell, this emblem deals 5 damage to target creature or player." // You get an emblem with "Whenever you cast a spell, this emblem deals 5 damage to target creature or player."
public ChandraTorchOfDefianceEmblem() { public ChandraTorchOfDefianceEmblem() {
this.setName("Emblem - Chandra, Torch of Defiance"); this.setName("Emblem Chandra");
Effect effect = new DamageTargetEffect(5); Effect effect = new DamageTargetEffect(5);
effect.setText("this emblem deals 5 damage to target creature or player"); effect.setText("this emblem deals 5 damage to target creature or player");
Ability ability = new SpellCastControllerTriggeredAbility(Zone.COMMAND, effect, new FilterSpell("a spell"), false, false); Ability ability = new SpellCastControllerTriggeredAbility(Zone.COMMAND, effect, new FilterSpell("a spell"), false, false);

View file

@ -67,7 +67,7 @@ import mage.target.common.TargetArtifactPermanent;
public class DackFayden extends CardImpl { public class DackFayden extends CardImpl {
public DackFayden(UUID ownerId, CardSetInfo setInfo) { public DackFayden(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{1}{U}{R}"); super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{1}{U}{R}");
this.subtype.add("Dack"); this.subtype.add("Dack");
this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3));
@ -107,7 +107,7 @@ public class DackFayden extends CardImpl {
class DackFaydenEmblem extends Emblem { class DackFaydenEmblem extends Emblem {
DackFaydenEmblem() { DackFaydenEmblem() {
this.setName("EMBLEM: Dack Fayden"); this.setName("Emblem Dack");
this.getAbilities().add(new DackFaydenEmblemTriggeredAbility()); this.getAbilities().add(new DackFaydenEmblemTriggeredAbility());
} }
} }

View file

@ -68,7 +68,7 @@ import mage.target.targetpointer.FixedTarget;
public class DarettiScrapSavant extends CardImpl { public class DarettiScrapSavant extends CardImpl {
public DarettiScrapSavant(UUID ownerId, CardSetInfo setInfo) { public DarettiScrapSavant(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{3}{R}"); super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{3}{R}");
this.subtype.add("Daretti"); this.subtype.add("Daretti");
this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3));
@ -176,7 +176,6 @@ class DarettiScrapSavantEmblem extends Emblem {
// You get an emblem with "Whenever an artifact is put into your graveyard from the battlefield, return that card to the battlefield at the beginning of the next end step." // You get an emblem with "Whenever an artifact is put into your graveyard from the battlefield, return that card to the battlefield at the beginning of the next end step."
public DarettiScrapSavantEmblem() { public DarettiScrapSavantEmblem() {
this.setName("Emblem - Daretti");
this.getAbilities().add(new DarettiScrapSavantTriggeredAbility()); this.getAbilities().add(new DarettiScrapSavantTriggeredAbility());
} }
} }

View file

@ -66,7 +66,7 @@ import mage.target.common.TargetCreaturePermanent;
public class DomriRade extends CardImpl { public class DomriRade extends CardImpl {
public DomriRade(UUID ownerId, CardSetInfo setInfo) { public DomriRade(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{1}{R}{G}"); super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{1}{R}{G}");
this.subtype.add("Domri"); this.subtype.add("Domri");
this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3));
@ -145,7 +145,7 @@ class DomriRadeEmblem extends Emblem {
// "Creatures you control have double strike, trample, hexproof and haste." // "Creatures you control have double strike, trample, hexproof and haste."
public DomriRadeEmblem() { public DomriRadeEmblem() {
this.setName("EMBLEM: Domri Rade"); this.setName("Emblem Domri");
FilterPermanent filter = new FilterControlledCreaturePermanent("Creatures"); FilterPermanent filter = new FilterControlledCreaturePermanent("Creatures");
GainAbilityControlledEffect effect = new GainAbilityControlledEffect(DoubleStrikeAbility.getInstance(), Duration.EndOfGame, filter); GainAbilityControlledEffect effect = new GainAbilityControlledEffect(DoubleStrikeAbility.getInstance(), Duration.EndOfGame, filter);
Ability ability = new SimpleStaticAbility(Zone.COMMAND, effect); Ability ability = new SimpleStaticAbility(Zone.COMMAND, effect);

View file

@ -60,7 +60,7 @@ import mage.target.common.TargetCreaturePermanent;
public class DovinBaan extends CardImpl { public class DovinBaan extends CardImpl {
public DovinBaan(UUID ownerId, CardSetInfo setInfo) { public DovinBaan(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{2}{W}{U}"); super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{2}{W}{U}");
this.subtype.add("Dovin"); this.subtype.add("Dovin");
this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3));
@ -129,7 +129,7 @@ class DovinBaanCantActivateAbilitiesEffect extends ContinuousRuleModifyingEffect
class DovinBaanEmblem extends Emblem { class DovinBaanEmblem extends Emblem {
DovinBaanEmblem() { DovinBaanEmblem() {
this.setName("EMBLEM: Dovin Baan"); this.setName("Emblem Dovin");
Ability ability = new SimpleStaticAbility(Zone.COMMAND, new DovinBaanCantUntapEffect()); Ability ability = new SimpleStaticAbility(Zone.COMMAND, new DovinBaanCantUntapEffect());
this.getAbilities().add(ability); this.getAbilities().add(ability);
} }

View file

@ -60,7 +60,7 @@ import mage.target.common.TargetCreaturePermanent;
public class ElspethKnightErrant extends CardImpl { public class ElspethKnightErrant extends CardImpl {
public ElspethKnightErrant(UUID ownerId, CardSetInfo setInfo) { public ElspethKnightErrant(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{2}{W}{W}"); super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{2}{W}{W}");
this.subtype.add("Elspeth"); this.subtype.add("Elspeth");
this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4));
@ -100,7 +100,7 @@ public class ElspethKnightErrant extends CardImpl {
class ElspethKnightErrantEmblem extends Emblem { class ElspethKnightErrantEmblem extends Emblem {
public ElspethKnightErrantEmblem() { public ElspethKnightErrantEmblem() {
this.setName("EMBLEM: Elspeth, Knight-Errant"); this.setName("Emblem Elspeth");
FilterControlledPermanent filter = new FilterControlledPermanent("Artifacts, creatures, enchantments, and lands you control"); FilterControlledPermanent filter = new FilterControlledPermanent("Artifacts, creatures, enchantments, and lands you control");
filter.add(Predicates.or( filter.add(Predicates.or(
new CardTypePredicate(CardType.ARTIFACT), new CardTypePredicate(CardType.ARTIFACT),

View file

@ -62,7 +62,7 @@ public class ElspethSunsChampion extends CardImpl {
} }
public ElspethSunsChampion(UUID ownerId, CardSetInfo setInfo) { public ElspethSunsChampion(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{4}{W}{W}"); super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{4}{W}{W}");
this.subtype.add("Elspeth"); this.subtype.add("Elspeth");
this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4));
@ -91,7 +91,7 @@ class ElspethSunsChampionEmblem extends Emblem {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Creatures"); private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Creatures");
public ElspethSunsChampionEmblem() { public ElspethSunsChampionEmblem() {
this.setName("EMBLEM: Elspeth, Sun's Champion"); this.setName("Emblem Elspeth");
Ability ability = new SimpleStaticAbility(Zone.COMMAND, new BoostControlledEffect(2, 2, Duration.EndOfGame, filter, false)); Ability ability = new SimpleStaticAbility(Zone.COMMAND, new BoostControlledEffect(2, 2, Duration.EndOfGame, filter, false));
ability.addEffect(new GainAbilityControlledEffect(FlyingAbility.getInstance(), Duration.EndOfGame, filter)); ability.addEffect(new GainAbilityControlledEffect(FlyingAbility.getInstance(), Duration.EndOfGame, filter));
this.getAbilities().add(ability); this.getAbilities().add(ability);

View file

@ -75,7 +75,7 @@ public class GarrukApexPredator extends CardImpl {
} }
public GarrukApexPredator(UUID ownerId, CardSetInfo setInfo) { public GarrukApexPredator(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{5}{B}{G}"); super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{5}{B}{G}");
this.subtype.add("Garruk"); this.subtype.add("Garruk");
this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5));
@ -166,7 +166,7 @@ class GarrukApexPredatorBeastToken extends Token {
class GarrukApexPredatorEmblem extends Emblem { class GarrukApexPredatorEmblem extends Emblem {
public GarrukApexPredatorEmblem() { public GarrukApexPredatorEmblem() {
setName("EMBLEM: Garruk, Apex Predator"); setName("Emblem Garruk");
Effect effect = new BoostTargetEffect(5, 5, Duration.EndOfTurn); Effect effect = new BoostTargetEffect(5, 5, Duration.EndOfTurn);
effect.setText("it gets +5/+5"); effect.setText("it gets +5/+5");
Ability ability = new AttackedByCreatureTriggeredAbility(Zone.COMMAND, effect, false, SetTargetPointer.PERMANENT); Ability ability = new AttackedByCreatureTriggeredAbility(Zone.COMMAND, effect, false, SetTargetPointer.PERMANENT);

View file

@ -63,7 +63,7 @@ public class GarrukCallerOfBeasts extends CardImpl {
} }
public GarrukCallerOfBeasts(UUID ownerId, CardSetInfo setInfo) { public GarrukCallerOfBeasts(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{4}{G}{G}"); super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{4}{G}{G}");
this.subtype.add("Garruk"); this.subtype.add("Garruk");
this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4));
@ -102,7 +102,7 @@ class GarrukCallerOfBeastsEmblem extends Emblem {
} }
public GarrukCallerOfBeastsEmblem() { public GarrukCallerOfBeastsEmblem() {
this.setName("EMBLEM: Garruk, Caller of Beasts"); this.setName("Emblem Garruk");
Effect effect = new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(new FilterCreatureCard("creature card")), false, true, Outcome.PutCreatureInPlay); Effect effect = new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(new FilterCreatureCard("creature card")), false, true, Outcome.PutCreatureInPlay);
Ability ability = new SpellCastControllerTriggeredAbility(Zone.COMMAND, effect, filter, true, false); Ability ability = new SpellCastControllerTriggeredAbility(Zone.COMMAND, effect, filter, true, false);
this.getAbilities().add(ability); this.getAbilities().add(ability);

View file

@ -55,7 +55,7 @@ import mage.game.permanent.token.Token;
public class GideonAllyOfZendikar extends CardImpl { public class GideonAllyOfZendikar extends CardImpl {
public GideonAllyOfZendikar(UUID ownerId, CardSetInfo setInfo) { public GideonAllyOfZendikar(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{2}{W}{W}"); super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{2}{W}{W}");
this.subtype.add("Gideon"); this.subtype.add("Gideon");
this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4));
@ -87,7 +87,7 @@ public class GideonAllyOfZendikar extends CardImpl {
class GideonAllyOfZendikarEmblem extends Emblem { class GideonAllyOfZendikarEmblem extends Emblem {
public GideonAllyOfZendikarEmblem() { public GideonAllyOfZendikarEmblem() {
this.setName("EMBLEM: Gideon, Ally of Zendikar"); this.setName("Emblem Gideon");
BoostControlledEffect effect = new BoostControlledEffect(1, 1, Duration.EndOfGame); BoostControlledEffect effect = new BoostControlledEffect(1, 1, Duration.EndOfGame);
Ability ability = new SimpleStaticAbility(Zone.COMMAND, effect); Ability ability = new SimpleStaticAbility(Zone.COMMAND, effect);
this.getAbilities().add(ability); this.getAbilities().add(ability);

View file

@ -67,7 +67,7 @@ import mage.target.targetpointer.FixedTarget;
public class JaceTelepathUnbound extends CardImpl { public class JaceTelepathUnbound extends CardImpl {
public JaceTelepathUnbound(UUID ownerId, CardSetInfo setInfo) { public JaceTelepathUnbound(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},""); super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "");
this.subtype.add("Jace"); this.subtype.add("Jace");
this.color.setBlue(true); this.color.setBlue(true);
@ -207,7 +207,7 @@ class JaceTelepathUnboundEmblem extends Emblem {
// You get an emblem with "Whenever you cast a spell, target opponent puts the top five cards of his or her library into his or her graveyard". // You get an emblem with "Whenever you cast a spell, target opponent puts the top five cards of his or her library into his or her graveyard".
public JaceTelepathUnboundEmblem() { public JaceTelepathUnboundEmblem() {
this.setName("Emblem - Jace"); this.setName("Emblem Jace");
Effect effect = new PutTopCardOfLibraryIntoGraveTargetEffect(5); Effect effect = new PutTopCardOfLibraryIntoGraveTargetEffect(5);
effect.setText("target opponent puts the top five cards of his or her library into his or her graveyard"); effect.setText("target opponent puts the top five cards of his or her library into his or her graveyard");
Ability ability = new SpellCastControllerTriggeredAbility(Zone.COMMAND, effect, new FilterSpell("a spell"), false, false); Ability ability = new SpellCastControllerTriggeredAbility(Zone.COMMAND, effect, new FilterSpell("a spell"), false, false);

View file

@ -59,7 +59,7 @@ import mage.watchers.common.SpellsCastWatcher;
public class JaceUnravelerOfSecrets extends CardImpl { public class JaceUnravelerOfSecrets extends CardImpl {
public JaceUnravelerOfSecrets(UUID ownerId, CardSetInfo setInfo) { public JaceUnravelerOfSecrets(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{3}{U}{U}"); super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{3}{U}{U}");
this.subtype.add("Jace"); this.subtype.add("Jace");
this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5));
@ -99,7 +99,8 @@ public class JaceUnravelerOfSecrets extends CardImpl {
class JaceUnravelerOfSecretsEmblem extends Emblem { class JaceUnravelerOfSecretsEmblem extends Emblem {
public JaceUnravelerOfSecretsEmblem() { public JaceUnravelerOfSecretsEmblem() {
this.setName("EMBLEM: Jace, Unraveler of Secrets"); this.setName("Emblem Jace");
setExpansionSetCodeForImage("SOI");
Effect effect = new CounterTargetEffect(); Effect effect = new CounterTargetEffect();
effect.setText("counter that spell"); effect.setText("counter that spell");
this.getAbilities().add(new JaceUnravelerOfSecretsTriggeredAbility(effect, false)); this.getAbilities().add(new JaceUnravelerOfSecretsTriggeredAbility(effect, false));

View file

@ -67,7 +67,7 @@ import mage.target.common.TargetLandPermanent;
public class KioraMasterOfTheDepths extends CardImpl { public class KioraMasterOfTheDepths extends CardImpl {
public KioraMasterOfTheDepths(UUID ownerId, CardSetInfo setInfo) { public KioraMasterOfTheDepths(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{2}{G}{U}"); super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{2}{G}{U}");
this.subtype.add("Kiora"); this.subtype.add("Kiora");
this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4));
@ -203,7 +203,7 @@ class KioraMasterOfTheDepthsEmblem extends Emblem {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Creatures"); private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Creatures");
public KioraMasterOfTheDepthsEmblem() { public KioraMasterOfTheDepthsEmblem() {
this.setName("EMBLEM: Kiora, Master of the Depths"); this.setName("Emblem Kiora");
Ability ability = new EntersBattlefieldControlledTriggeredAbility(Zone.COMMAND, Ability ability = new EntersBattlefieldControlledTriggeredAbility(Zone.COMMAND,
new KioraFightEffect(), filter, true, SetTargetPointer.PERMANENT, new KioraFightEffect(), filter, true, SetTargetPointer.PERMANENT,

View file

@ -68,7 +68,7 @@ public class KioraTheCrashingWave extends CardImpl {
} }
public KioraTheCrashingWave(UUID ownerId, CardSetInfo setInfo) { public KioraTheCrashingWave(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{2}{G}{U}"); super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{2}{G}{U}");
this.subtype.add("Kiora"); this.subtype.add("Kiora");
this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(2)); this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(2));
@ -164,7 +164,7 @@ class KioraPreventionEffect extends PreventionEffectImpl {
class KioraEmblem extends Emblem { class KioraEmblem extends Emblem {
public KioraEmblem() { public KioraEmblem() {
this.setName("EMBLEM: Kiora, the Crashing Wave"); this.setName("Emblem Kiora");
Ability ability = new BeginningOfEndStepTriggeredAbility(Zone.COMMAND, new CreateTokenEffect(new KioraKrakenToken()), TargetController.YOU, null, false); Ability ability = new BeginningOfEndStepTriggeredAbility(Zone.COMMAND, new CreateTokenEffect(new KioraKrakenToken()), TargetController.YOU, null, false);
this.getAbilities().add(ability); this.getAbilities().add(ability);
} }

View file

@ -77,7 +77,7 @@ public class KothOfTheHammer extends CardImpl {
} }
public KothOfTheHammer(UUID ownerId, CardSetInfo setInfo) { public KothOfTheHammer(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{2}{R}{R}"); super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{2}{R}{R}");
this.subtype.add("Koth"); this.subtype.add("Koth");
this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3));
@ -122,7 +122,7 @@ class KothOfTheHammerEmblem extends Emblem {
// "Mountains you control have '{T}: This land deals 1 damage to target creature or player.'" // "Mountains you control have '{T}: This land deals 1 damage to target creature or player.'"
public KothOfTheHammerEmblem() { public KothOfTheHammerEmblem() {
this.setName("EMBLEM: Koth of the Hammer"); this.setName("Emblem Koth");
this.getAbilities().add(new SimpleStaticAbility(Zone.COMMAND, new KothOfTheHammerThirdEffect())); this.getAbilities().add(new SimpleStaticAbility(Zone.COMMAND, new KothOfTheHammerThirdEffect()));
} }
} }

View file

@ -74,7 +74,7 @@ public class LilianaDefiantNecromancer extends CardImpl {
UUID ability2Id; UUID ability2Id;
public LilianaDefiantNecromancer(UUID ownerId, CardSetInfo setInfo) { public LilianaDefiantNecromancer(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},""); super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "");
this.subtype.add("Liliana"); this.subtype.add("Liliana");
this.color.setBlack(true); this.color.setBlack(true);
@ -128,7 +128,7 @@ class LilianaDefiantNecromancerEmblem extends Emblem {
// You get an emblem with "Whenever a creature you control dies, return it to the battlefield under your control at the beginning of the next end step." // You get an emblem with "Whenever a creature you control dies, return it to the battlefield under your control at the beginning of the next end step."
public LilianaDefiantNecromancerEmblem() { public LilianaDefiantNecromancerEmblem() {
this.setName("Emblem - Liliana"); this.setName("Emblem Liliana");
Ability ability = new DiesCreatureTriggeredAbility(Zone.COMMAND, new LilianaDefiantNecromancerEmblemEffect(), false, filter, true); Ability ability = new DiesCreatureTriggeredAbility(Zone.COMMAND, new LilianaDefiantNecromancerEmblemEffect(), false, filter, true);
this.getAbilities().add(ability); this.getAbilities().add(ability);
} }

View file

@ -72,7 +72,7 @@ public class LilianaOfTheDarkRealms extends CardImpl {
} }
public LilianaOfTheDarkRealms(UUID ownerId, CardSetInfo setInfo) { public LilianaOfTheDarkRealms(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{2}{B}{B}"); super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{2}{B}{B}");
this.subtype.add("Liliana"); this.subtype.add("Liliana");
this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3));
@ -155,7 +155,7 @@ class LilianaOfTheDarkRealmsEmblem extends Emblem {
} }
public LilianaOfTheDarkRealmsEmblem() { public LilianaOfTheDarkRealmsEmblem() {
this.setName("EMBLEM: Liliana of the Dark Realms"); this.setName("Emblem Liliana");
SimpleManaAbility manaAbility = new SimpleManaAbility(Zone.BATTLEFIELD, Mana.BlackMana(4), new TapSourceCost()); SimpleManaAbility manaAbility = new SimpleManaAbility(Zone.BATTLEFIELD, Mana.BlackMana(4), new TapSourceCost());
Ability ability = new SimpleStaticAbility(Zone.COMMAND, new GainAbilityControlledEffect(manaAbility, Duration.WhileOnBattlefield, filter)); Ability ability = new SimpleStaticAbility(Zone.COMMAND, new GainAbilityControlledEffect(manaAbility, Duration.WhileOnBattlefield, filter));
this.getAbilities().add(ability); this.getAbilities().add(ability);

View file

@ -64,7 +64,7 @@ import mage.target.common.TargetCreaturePermanent;
public class LilianaTheLastHope extends CardImpl { public class LilianaTheLastHope extends CardImpl {
public LilianaTheLastHope(UUID ownerId, CardSetInfo setInfo) { public LilianaTheLastHope(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{1}{B}{B}"); super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{1}{B}{B}");
this.subtype.add("Liliana"); this.subtype.add("Liliana");
this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3));
@ -131,10 +131,11 @@ class LilianaTheLastHopeEffect extends OneShotEffect {
return true; return true;
} }
} }
class LilianaTheLastHopeEmblem extends Emblem { class LilianaTheLastHopeEmblem extends Emblem {
public LilianaTheLastHopeEmblem() { public LilianaTheLastHopeEmblem() {
this.setName("EMBLEM: Liliana, the Last Hope"); this.setName("Emblem Liliana");
Ability ability = new BeginningOfEndStepTriggeredAbility(Zone.COMMAND, new CreateTokenEffect(new ZombieToken(), new LilianaZombiesCount()), Ability ability = new BeginningOfEndStepTriggeredAbility(Zone.COMMAND, new CreateTokenEffect(new ZombieToken(), new LilianaZombiesCount()),
TargetController.YOU, null, false); TargetController.YOU, null, false);
this.getAbilities().add(ability); this.getAbilities().add(ability);

View file

@ -65,7 +65,7 @@ import mage.target.targetpointer.FixedTarget;
public class NarsetTranscendent extends CardImpl { public class NarsetTranscendent extends CardImpl {
public NarsetTranscendent(UUID ownerId, CardSetInfo setInfo) { public NarsetTranscendent(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{2}{W}{U}"); super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{2}{W}{U}");
this.subtype.add("Narset"); this.subtype.add("Narset");
this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(6)); this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(6));
@ -226,7 +226,7 @@ class NarsetTranscendentEmblem extends Emblem {
public NarsetTranscendentEmblem() { public NarsetTranscendentEmblem() {
this.setName("EMBLEM: Narset Transcendent"); this.setName("Emblem Narset");
this.getAbilities().add(new SimpleStaticAbility(Zone.COMMAND, new NarsetTranscendentCantCastEffect())); this.getAbilities().add(new SimpleStaticAbility(Zone.COMMAND, new NarsetTranscendentCantCastEffect()));
} }

View file

@ -67,7 +67,7 @@ public class NissaVitalForce extends CardImpl {
} }
public NissaVitalForce(UUID ownerId, CardSetInfo setInfo) { public NissaVitalForce(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{3}{G}{G}"); super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{3}{G}{G}");
this.subtype.add("Nissa"); this.subtype.add("Nissa");
this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5));
@ -114,9 +114,9 @@ class NissaVitalForceEmblem extends Emblem {
// You get an emblem with "Whenever a land enters the battlefield under your control, you may draw a card." // You get an emblem with "Whenever a land enters the battlefield under your control, you may draw a card."
public NissaVitalForceEmblem() { public NissaVitalForceEmblem() {
this.setName("Emblem - Nissa, Vital Force"); this.setName("Emblem Nissa");
Ability ability = new EntersBattlefieldAllTriggeredAbility(Zone.COMMAND, new DrawCardSourceControllerEffect(1), new FilterControlledLandPermanent("a land"), Ability ability = new EntersBattlefieldAllTriggeredAbility(Zone.COMMAND, new DrawCardSourceControllerEffect(1), new FilterControlledLandPermanent("a land"),
true, null, true); true, null, true);
getAbilities().add(ability); getAbilities().add(ability);
} }
} }

View file

@ -62,7 +62,7 @@ import mage.target.common.TargetControlledCreaturePermanent;
public class ObNixilisOfTheBlackOath extends CardImpl { public class ObNixilisOfTheBlackOath extends CardImpl {
public ObNixilisOfTheBlackOath(UUID ownerId, CardSetInfo setInfo) { public ObNixilisOfTheBlackOath(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{3}{B}{B}"); super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{3}{B}{B}");
this.subtype.add("Nixilis"); this.subtype.add("Nixilis");
this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3));
@ -131,9 +131,8 @@ class ObNixilisOfTheBlackOathEffect1 extends OneShotEffect {
class ObNixilisOfTheBlackOathEmblem extends Emblem { class ObNixilisOfTheBlackOathEmblem extends Emblem {
// You get an emblem with "{1}{B}, Sacrifice a creature: You gain X life and draw X cards, where X is the sacrificed creature's power." // You get an emblem with "{1}{B}, Sacrifice a creature: You gain X life and draw X cards, where X is the sacrificed creature's power."
public ObNixilisOfTheBlackOathEmblem() { public ObNixilisOfTheBlackOathEmblem() {
this.setName("EMBLEM: Ob Nixilis of the Black Oath"); this.setName("Emblem Nixilis");
DynamicValue xValue = new SacrificeCostCreaturesPower(); DynamicValue xValue = new SacrificeCostCreaturesPower();
Effect effect = new GainLifeEffect(xValue); Effect effect = new GainLifeEffect(xValue);
effect.setText("You gain X life"); effect.setText("You gain X life");

View file

@ -54,7 +54,7 @@ import mage.target.common.TargetOpponent;
public class ObNixilisReignited extends CardImpl { public class ObNixilisReignited extends CardImpl {
public ObNixilisReignited(UUID ownerId, CardSetInfo setInfo) { public ObNixilisReignited(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{3}{B}{B}"); super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{3}{B}{B}");
this.subtype.add("Nixilis"); this.subtype.add("Nixilis");
this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5));
@ -94,7 +94,7 @@ public class ObNixilisReignited extends CardImpl {
class ObNixilisReignitedEmblem extends Emblem { class ObNixilisReignitedEmblem extends Emblem {
public ObNixilisReignitedEmblem() { public ObNixilisReignitedEmblem() {
setName("EMBLEM: Ob Nixilis Reignited"); setName("Emblem Nixilis");
this.getAbilities().add(new ObNixilisEmblemTriggeredAbility(new LoseLifeSourceControllerEffect(2), false)); this.getAbilities().add(new ObNixilisEmblemTriggeredAbility(new LoseLifeSourceControllerEffect(2), false));
this.setExpansionSetCodeForImage("BFZ"); this.setExpansionSetCodeForImage("BFZ");

View file

@ -65,7 +65,7 @@ import mage.target.common.TargetCreaturePermanent;
public class SarkhanTheDragonspeaker extends CardImpl { public class SarkhanTheDragonspeaker extends CardImpl {
public SarkhanTheDragonspeaker(UUID ownerId, CardSetInfo setInfo) { public SarkhanTheDragonspeaker(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{3}{R}{R}"); super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{3}{R}{R}");
this.subtype.add("Sarkhan"); this.subtype.add("Sarkhan");
this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4));
@ -166,7 +166,7 @@ class SarkhanTheDragonspeakerEffect extends ContinuousEffectImpl {
class SarkhanTheDragonspeakerEmblem extends Emblem { class SarkhanTheDragonspeakerEmblem extends Emblem {
SarkhanTheDragonspeakerEmblem() { SarkhanTheDragonspeakerEmblem() {
setName("EMBLEM: Sarkhan, the Dragonspeaker"); setName("Emblem Sarkhan");
this.setExpansionSetCodeForImage("KTK"); this.setExpansionSetCodeForImage("KTK");
this.getAbilities().add(new BeginningOfDrawTriggeredAbility(Zone.COMMAND, new DrawCardSourceControllerEffect(2), TargetController.YOU, false)); this.getAbilities().add(new BeginningOfDrawTriggeredAbility(Zone.COMMAND, new DrawCardSourceControllerEffect(2), TargetController.YOU, false));

View file

@ -98,6 +98,7 @@ public class SorinLordOfInnistrad extends CardImpl {
} }
class VampireToken extends Token { class VampireToken extends Token {
VampireToken() { VampireToken() {
super("Vampire", "1/1 black Vampire creature token with lifelink"); super("Vampire", "1/1 black Vampire creature token with lifelink");
cardType.add(CardType.CREATURE); cardType.add(CardType.CREATURE);
@ -112,7 +113,7 @@ class VampireToken extends Token {
class SorinLordOfInnistradEmblem extends Emblem { class SorinLordOfInnistradEmblem extends Emblem {
public SorinLordOfInnistradEmblem() { public SorinLordOfInnistradEmblem() {
this.setName("EMBLEM: Sorin, Lord of Innistrad"); this.setName("Emblem Sorin");
BoostControlledEffect effect = new BoostControlledEffect(1, 0, Duration.EndOfGame); BoostControlledEffect effect = new BoostControlledEffect(1, 0, Duration.EndOfGame);
Ability ability = new SimpleStaticAbility(Zone.COMMAND, effect); Ability ability = new SimpleStaticAbility(Zone.COMMAND, effect);
this.getAbilities().add(ability); this.getAbilities().add(ability);

View file

@ -58,7 +58,7 @@ import mage.game.permanent.token.Token;
public class SorinSolemnVisitor extends CardImpl { public class SorinSolemnVisitor extends CardImpl {
public SorinSolemnVisitor(UUID ownerId, CardSetInfo setInfo) { public SorinSolemnVisitor(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{2}{W}{B}"); super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{2}{W}{B}");
this.subtype.add("Sorin"); this.subtype.add("Sorin");
this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4));
@ -97,7 +97,7 @@ public class SorinSolemnVisitor extends CardImpl {
class SorinSolemnVisitorEmblem extends Emblem { class SorinSolemnVisitorEmblem extends Emblem {
public SorinSolemnVisitorEmblem() { public SorinSolemnVisitorEmblem() {
this.setName("EMBLEM: Sorin, Solemn Visitor"); this.setName("Emblem Sorin");
Ability ability = new BeginningOfUpkeepTriggeredAbility(Zone.COMMAND, new SacrificeEffect(new FilterCreaturePermanent(), 1, "that player"), TargetController.OPPONENT, false, true); Ability ability = new BeginningOfUpkeepTriggeredAbility(Zone.COMMAND, new SacrificeEffect(new FilterCreaturePermanent(), 1, "that player"), TargetController.OPPONENT, false, true);
this.getAbilities().add(ability); this.getAbilities().add(ability);
} }

View file

@ -85,7 +85,7 @@ public class TamiyoFieldResearcher extends CardImpl {
} }
public TamiyoFieldResearcher(UUID ownerId, CardSetInfo setInfo) { public TamiyoFieldResearcher(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{1}{G}{W}{U}"); super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{1}{G}{W}{U}");
this.subtype.add("Tamiyo"); this.subtype.add("Tamiyo");
this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4));
@ -160,7 +160,7 @@ class TamiyoFieldResearcherDelayedTriggeredAbility extends DelayedTriggeredAbili
super(new DrawCardSourceControllerEffect(1), Duration.Custom, false); super(new DrawCardSourceControllerEffect(1), Duration.Custom, false);
this.creatures = creatures; this.creatures = creatures;
this.startingTurn = startingTurn; this.startingTurn = startingTurn;
} }
public TamiyoFieldResearcherDelayedTriggeredAbility(final TamiyoFieldResearcherDelayedTriggeredAbility ability) { public TamiyoFieldResearcherDelayedTriggeredAbility(final TamiyoFieldResearcherDelayedTriggeredAbility ability) {
super(ability); super(ability);
@ -205,7 +205,7 @@ class TamiyoFieldResearcherEmblem extends Emblem {
public TamiyoFieldResearcherEmblem() { public TamiyoFieldResearcherEmblem() {
this.setName("EMBLEM: Tamiyo, Field Researcher"); this.setName("Emblem Tamiyo");
this.getAbilities().add(new SimpleStaticAbility(Zone.COMMAND, new TamiyoFieldResearcherCastingEffect())); this.getAbilities().add(new SimpleStaticAbility(Zone.COMMAND, new TamiyoFieldResearcherCastingEffect()));
} }

View file

@ -65,7 +65,7 @@ import mage.target.TargetPlayer;
public class TamiyoTheMoonSage extends CardImpl { public class TamiyoTheMoonSage extends CardImpl {
public TamiyoTheMoonSage(UUID ownerId, CardSetInfo setInfo) { public TamiyoTheMoonSage(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{3}{U}{U}"); super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{3}{U}{U}");
this.subtype.add("Tamiyo"); this.subtype.add("Tamiyo");
this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4));
@ -132,7 +132,7 @@ class TappedCreaturesControlledByTargetCount implements DynamicValue {
class TamiyoTheMoonSageEmblem extends Emblem { class TamiyoTheMoonSageEmblem extends Emblem {
public TamiyoTheMoonSageEmblem() { public TamiyoTheMoonSageEmblem() {
this.setName("EMBLEM: Tamiyo, the Moon Sage"); this.setName("Emblem Tamiyo");
Ability ability = new SimpleStaticAbility(Zone.COMMAND, new MaximumHandSizeControllerEffect(Integer.MAX_VALUE, Duration.EndOfGame, HandSizeModification.SET)); Ability ability = new SimpleStaticAbility(Zone.COMMAND, new MaximumHandSizeControllerEffect(Integer.MAX_VALUE, Duration.EndOfGame, HandSizeModification.SET));
this.getAbilities().add(ability); this.getAbilities().add(ability);
Effect effect = new ReturnToHandTargetEffect(); Effect effect = new ReturnToHandTargetEffect();

View file

@ -53,7 +53,7 @@ import mage.target.TargetPermanent;
public class TeferiTemporalArchmage extends CardImpl { public class TeferiTemporalArchmage extends CardImpl {
public TeferiTemporalArchmage(UUID ownerId, CardSetInfo setInfo) { public TeferiTemporalArchmage(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{4}{U}{U}"); super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{4}{U}{U}");
this.subtype.add("Teferi"); this.subtype.add("Teferi");
this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5));
@ -89,7 +89,7 @@ class TeferiTemporalArchmageEmblem extends Emblem {
// "You may activate loyalty abilities of planeswalkers you control on any player's turn any time you could cast an instant." // "You may activate loyalty abilities of planeswalkers you control on any player's turn any time you could cast an instant."
public TeferiTemporalArchmageEmblem() { public TeferiTemporalArchmageEmblem() {
this.setName("EMBLEM: Teferi, Temporal Archmage"); this.setName("Emblem Teferi");
this.getAbilities().add(new SimpleStaticAbility(Zone.COMMAND, new ActivateAbilitiesAnyTimeYouCouldCastInstantEffect(LoyaltyAbility.class, "loyalty abilities of planeswalkers you control on any player's turn"))); this.getAbilities().add(new SimpleStaticAbility(Zone.COMMAND, new ActivateAbilitiesAnyTimeYouCouldCastInstantEffect(LoyaltyAbility.class, "loyalty abilities of planeswalkers you control on any player's turn")));
} }
} }

View file

@ -27,6 +27,7 @@
*/ */
package mage.cards.t; package mage.cards.t;
import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.LoyaltyAbility; import mage.abilities.LoyaltyAbility;
import mage.abilities.common.BeginningOfCombatTriggeredAbility; import mage.abilities.common.BeginningOfCombatTriggeredAbility;
@ -58,8 +59,6 @@ import mage.game.permanent.token.Token;
import mage.target.common.TargetArtifactPermanent; import mage.target.common.TargetArtifactPermanent;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
/** /**
* @author JRHerlehy * @author JRHerlehy
*/ */
@ -108,7 +107,7 @@ class TezzeretTheSchemerEmblem extends Emblem {
} }
public TezzeretTheSchemerEmblem() { public TezzeretTheSchemerEmblem() {
this.setName("EMBLEM: Tezzeret The Schemer"); this.setName("Emblem Tezzeret");
Effect effect = new AddCardTypeTargetEffect(CardType.CREATURE, Duration.EndOfGame); Effect effect = new AddCardTypeTargetEffect(CardType.CREATURE, Duration.EndOfGame);
effect.setText("target artifact you control becomes an artifact creature"); effect.setText("target artifact you control becomes an artifact creature");

View file

@ -153,7 +153,7 @@ class VenserTheSojournerEffect extends OneShotEffect {
class VenserTheSojournerEmblem extends Emblem { class VenserTheSojournerEmblem extends Emblem {
public VenserTheSojournerEmblem() { public VenserTheSojournerEmblem() {
this.setName("EMBLEM: Venser, the Sojourner"); this.setName("Emblem Venser");
Ability ability = new VenserTheSojournerSpellCastTriggeredAbility(new ExileTargetEffect(), false); Ability ability = new VenserTheSojournerSpellCastTriggeredAbility(new ExileTargetEffect(), false);
Target target = new TargetPermanent(); Target target = new TargetPermanent();
ability.addTarget(target); ability.addTarget(target);

View file

@ -54,7 +54,7 @@ import mage.target.common.TargetOpponent;
public class ZamWesell extends CardImpl { public class ZamWesell extends CardImpl {
public ZamWesell(UUID ownerId, CardSetInfo setInfo) { public ZamWesell(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{U}{U}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}{U}");
this.supertype.add("Legendary"); this.supertype.add("Legendary");
this.subtype.add("Shapeshifter"); this.subtype.add("Shapeshifter");
this.subtype.add("Hunter"); this.subtype.add("Hunter");
@ -63,6 +63,7 @@ public class ZamWesell extends CardImpl {
// When you cast Zam Wessel, target opponent reveals his or her hand. You may choose a creature card from it and have Zam Wessel enter the battlefield as a copy of that creature card. // When you cast Zam Wessel, target opponent reveals his or her hand. You may choose a creature card from it and have Zam Wessel enter the battlefield as a copy of that creature card.
Ability ability = new CastSourceTriggeredAbility(new RevealHandTargetEffect()); Ability ability = new CastSourceTriggeredAbility(new RevealHandTargetEffect());
ability.addEffect(new ZamWesselEffect());
ability.addTarget(new TargetOpponent()); ability.addTarget(new TargetOpponent());
this.addAbility(ability); this.addAbility(ability);
} }

View file

@ -24,8 +24,7 @@
* The views and conclusions contained in the software and documentation are those of the * The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed * authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com. * or implied, of BetaSteward_at_googlemail.com.
*/ */
package mage.abilities.effects.common; package mage.abilities.effects.common;
import mage.MageObject; import mage.MageObject;
@ -37,7 +36,7 @@ import mage.game.command.Emblem;
/** /**
* *
* @author nantuko * @author nantuko
*/ */
public class GetEmblemEffect extends OneShotEffect { public class GetEmblemEffect extends OneShotEffect {
@ -65,7 +64,7 @@ public class GetEmblemEffect extends OneShotEffect {
if (sourceObject == null) { if (sourceObject == null) {
return false; return false;
} }
game.addEmblem(emblem, source); game.addEmblem(emblem, sourceObject, source);
return true; return true;
} }

View file

@ -24,8 +24,7 @@
* The views and conclusions contained in the software and documentation are those of the * The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed * authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com. * or implied, of BetaSteward_at_googlemail.com.
*/ */
package mage.abilities.effects.common; package mage.abilities.effects.common;
import mage.MageObject; import mage.MageObject;
@ -71,7 +70,7 @@ public class GetEmblemTargetPlayerEffect extends OneShotEffect {
if (toPlayer == null) { if (toPlayer == null) {
return false; return false;
} }
game.addEmblem(emblem, source, toPlayer.getId()); game.addEmblem(emblem, sourceObject, toPlayer.getId());
return true; return true;
} }

View file

@ -25,7 +25,6 @@
* authors and should not be interpreted as representing official policies, either expressed * authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com. * or implied, of BetaSteward_at_googlemail.com.
*/ */
package mage.abilities.effects.common; package mage.abilities.effects.common;
import mage.MageObject; import mage.MageObject;
@ -64,7 +63,7 @@ public class RevealHandTargetEffect extends OneShotEffect {
Player player = game.getPlayer(source.getFirstTarget()); Player player = game.getPlayer(source.getFirstTarget());
MageObject sourceObject = game.getObject(source.getSourceId()); MageObject sourceObject = game.getObject(source.getSourceId());
if (player != null && sourceObject != null) { if (player != null && sourceObject != null) {
player.revealCards(sourceObject.getName(), player.getHand(), game); player.revealCards(sourceObject.getIdName(), player.getHand(), game);
return true; return true;
} }
return false; return false;

View file

@ -364,9 +364,9 @@ public interface Game extends MageItem, Serializable {
void addEffect(ContinuousEffect continuousEffect, Ability source); void addEffect(ContinuousEffect continuousEffect, Ability source);
void addEmblem(Emblem emblem, Ability source); void addEmblem(Emblem emblem, MageObject sourceObject, Ability source);
void addEmblem(Emblem emblem, Ability source, UUID toPlayerId); void addEmblem(Emblem emblem, MageObject sourceObject, UUID toPlayerId);
void addCommander(Commander commander); void addCommander(Commander commander);

View file

@ -1426,19 +1426,21 @@ public abstract class GameImpl implements Game, Serializable {
} }
@Override @Override
public void addEmblem(Emblem emblem, Ability source) { public void addEmblem(Emblem emblem, MageObject sourceObject, Ability source) {
addEmblem(emblem, source, null); addEmblem(emblem, sourceObject, source.getControllerId());
} }
/**
*
* @param emblem
* @param sourceObject
* @param toPlayerId controller and owner of the emblem
*/
@Override @Override
public void addEmblem(Emblem emblem, Ability source, UUID toPlayerId) { public void addEmblem(Emblem emblem, MageObject sourceObject, UUID toPlayerId) {
Emblem newEmblem = emblem.copy(); Emblem newEmblem = emblem.copy();
newEmblem.setSourceId(source.getSourceId()); newEmblem.setSourceObject(sourceObject);
if (toPlayerId == null) { newEmblem.setControllerId(toPlayerId);
newEmblem.setControllerId(source.getControllerId());
} else {
newEmblem.setControllerId(toPlayerId);
}
newEmblem.assignNewId(); newEmblem.assignNewId();
newEmblem.getAbilities().newId(); newEmblem.getAbilities().newId();
for (Ability ability : newEmblem.getAbilities()) { for (Ability ability : newEmblem.getAbilities()) {

View file

@ -24,24 +24,26 @@
* The views and conclusions contained in the software and documentation are those of the * The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed * authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com. * or implied, of BetaSteward_at_googlemail.com.
*/ */
package mage.game.command; package mage.game.command;
import java.util.UUID;
import mage.MageObject; import mage.MageObject;
import java.util.UUID;
/** /**
* *
* @author Viserion, nantuko * @author Viserion, nantuko
*/ */
public interface CommandObject extends MageObject { public interface CommandObject extends MageObject {
UUID getSourceId(); UUID getSourceId();
UUID getControllerId(); UUID getControllerId();
void assignNewId(); void assignNewId();
MageObject getSourceObject();
@Override @Override
CommandObject copy(); CommandObject copy();
} }

View file

@ -47,11 +47,11 @@ import mage.util.GameLog;
public class Commander implements CommandObject { public class Commander implements CommandObject {
private final Card card; private final Card sourceObject;
private final Abilities<Ability> abilites = new AbilitiesImpl<>(); private final Abilities<Ability> abilites = new AbilitiesImpl<>();
public Commander(Card card) { public Commander(Card card) {
this.card = card; this.sourceObject = card;
abilites.add(new CastCommanderAbility(card)); abilites.add(new CastCommanderAbility(card));
for (Ability ability : card.getAbilities()) { for (Ability ability : card.getAbilities()) {
if (!(ability instanceof SpellAbility)) { if (!(ability instanceof SpellAbility)) {
@ -62,21 +62,22 @@ public class Commander implements CommandObject {
} }
private Commander(Commander copy) { private Commander(Commander copy) {
this.card = copy.card; this.sourceObject = copy.sourceObject;
} }
public Card getCard() { @Override
return card; public Card getSourceObject() {
return sourceObject;
} }
@Override @Override
public UUID getSourceId() { public UUID getSourceId() {
return card.getId(); return sourceObject.getId();
} }
@Override @Override
public UUID getControllerId() { public UUID getControllerId() {
return card.getOwnerId(); return sourceObject.getOwnerId();
} }
@Override @Override
@ -90,12 +91,12 @@ public class Commander implements CommandObject {
@Override @Override
public String getName() { public String getName() {
return card.getName(); return sourceObject.getName();
} }
@Override @Override
public String getIdName() { public String getIdName() {
return card.getName() + " [" + card.getId().toString().substring(0, 3) + "]"; return sourceObject.getName() + " [" + sourceObject.getId().toString().substring(0, 3) + "]";
} }
@Override @Override
@ -110,22 +111,22 @@ public class Commander implements CommandObject {
@Override @Override
public List<CardType> getCardType() { public List<CardType> getCardType() {
return card.getCardType(); return sourceObject.getCardType();
} }
@Override @Override
public List<String> getSubtype(Game game) { public List<String> getSubtype(Game game) {
return card.getSubtype(game); return sourceObject.getSubtype(game);
} }
@Override @Override
public boolean hasSubtype(String subtype, Game game) { public boolean hasSubtype(String subtype, Game game) {
return card.hasSubtype(subtype, game); return sourceObject.hasSubtype(subtype, game);
} }
@Override @Override
public List<String> getSupertype() { public List<String> getSupertype() {
return card.getSupertype(); return sourceObject.getSupertype();
} }
@Override @Override
@ -144,42 +145,42 @@ public class Commander implements CommandObject {
@Override @Override
public ObjectColor getColor(Game game) { public ObjectColor getColor(Game game) {
return card.getColor(game); return sourceObject.getColor(game);
} }
@Override @Override
public ObjectColor getFrameColor(Game game) { public ObjectColor getFrameColor(Game game) {
return card.getFrameColor(game); return sourceObject.getFrameColor(game);
} }
@Override @Override
public FrameStyle getFrameStyle() { public FrameStyle getFrameStyle() {
return card.getFrameStyle(); return sourceObject.getFrameStyle();
} }
@Override @Override
public ManaCosts<ManaCost> getManaCost() { public ManaCosts<ManaCost> getManaCost() {
return card.getManaCost(); return sourceObject.getManaCost();
} }
@Override @Override
public int getConvertedManaCost() { public int getConvertedManaCost() {
return card.getConvertedManaCost(); return sourceObject.getConvertedManaCost();
} }
@Override @Override
public MageInt getPower() { public MageInt getPower() {
return card.getPower(); return sourceObject.getPower();
} }
@Override @Override
public MageInt getToughness() { public MageInt getToughness() {
return card.getToughness(); return sourceObject.getToughness();
} }
@Override @Override
public int getStartingLoyalty() { public int getStartingLoyalty() {
return card.getStartingLoyalty(); return sourceObject.getStartingLoyalty();
} }
@Override @Override
@ -201,27 +202,27 @@ public class Commander implements CommandObject {
@Override @Override
public UUID getId() { public UUID getId() {
return card.getId(); return sourceObject.getId();
} }
@Override @Override
public String getImageName() { public String getImageName() {
return card.getImageName(); return sourceObject.getImageName();
} }
@Override @Override
public int getZoneChangeCounter(Game game) { public int getZoneChangeCounter(Game game) {
return card.getZoneChangeCounter(game); return sourceObject.getZoneChangeCounter(game);
} }
@Override @Override
public void updateZoneChangeCounter(Game game, ZoneChangeEvent event) { public void updateZoneChangeCounter(Game game, ZoneChangeEvent event) {
card.updateZoneChangeCounter(game, event); sourceObject.updateZoneChangeCounter(game, event);
} }
@Override @Override
public void setZoneChangeCounter(int value, Game game) { public void setZoneChangeCounter(int value, Game game) {
card.setZoneChangeCounter(value, game); sourceObject.setZoneChangeCounter(value, game);
} }
} }

View file

@ -31,6 +31,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.MageObject;
import mage.ObjectColor; import mage.ObjectColor;
import mage.abilities.Abilities; import mage.abilities.Abilities;
import mage.abilities.AbilitiesImpl; import mage.abilities.AbilitiesImpl;
@ -38,6 +39,7 @@ import mage.abilities.Ability;
import mage.abilities.costs.mana.ManaCost; import mage.abilities.costs.mana.ManaCost;
import mage.abilities.costs.mana.ManaCosts; import mage.abilities.costs.mana.ManaCosts;
import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.costs.mana.ManaCostsImpl;
import mage.cards.Card;
import mage.cards.FrameStyle; import mage.cards.FrameStyle;
import mage.constants.CardType; import mage.constants.CardType;
import mage.game.Game; import mage.game.Game;
@ -53,13 +55,13 @@ public class Emblem implements CommandObject {
private static ObjectColor emptyColor = new ObjectColor(); private static ObjectColor emptyColor = new ObjectColor();
private static ManaCosts emptyCost = new ManaCostsImpl(); private static ManaCosts emptyCost = new ManaCostsImpl();
private String name; private String name = "";
private UUID id; private UUID id;
private UUID controllerId; private UUID controllerId;
private UUID sourceId; private MageObject sourceObject;
private FrameStyle frameStyle; private FrameStyle frameStyle;
private Abilities<Ability> abilites = new AbilitiesImpl<>(); private Abilities<Ability> abilites = new AbilitiesImpl<>();
private String expansionSetCodeForImage = null; private String expansionSetCodeForImage = "";
public Emblem() { public Emblem() {
this.id = UUID.randomUUID(); this.id = UUID.randomUUID();
@ -70,8 +72,9 @@ public class Emblem implements CommandObject {
this.name = emblem.name; this.name = emblem.name;
this.frameStyle = emblem.frameStyle; this.frameStyle = emblem.frameStyle;
this.controllerId = emblem.controllerId; this.controllerId = emblem.controllerId;
this.sourceId = emblem.sourceId; this.sourceObject = emblem.sourceObject;
this.abilites = emblem.abilites.copy(); this.abilites = emblem.abilites.copy();
this.expansionSetCodeForImage = emblem.expansionSetCodeForImage;
} }
@Override @Override
@ -84,9 +87,29 @@ public class Emblem implements CommandObject {
this.id = UUID.randomUUID(); this.id = UUID.randomUUID();
} }
public void setSourceObject(MageObject sourceObject) {
this.sourceObject = sourceObject;
if (sourceObject instanceof Card) {
if (name.isEmpty()) {
name = ((Card) sourceObject).getSubtype(null).toString();
}
if (expansionSetCodeForImage.isEmpty()) {
expansionSetCodeForImage = ((Card) sourceObject).getExpansionSetCode();
}
}
}
@Override
public MageObject getSourceObject() {
return sourceObject;
}
@Override @Override
public UUID getSourceId() { public UUID getSourceId() {
return this.sourceId; if (sourceObject != null) {
return sourceObject.getId();
}
return null;
} }
@Override @Override
@ -99,10 +122,6 @@ public class Emblem implements CommandObject {
this.abilites.setControllerId(controllerId); this.abilites.setControllerId(controllerId);
} }
public void setSourceId(UUID sourceId) {
this.sourceId = sourceId;
}
@Override @Override
public String getName() { public String getName() {
return name; return name;