diff --git a/Mage.Client/src/main/java/mage/client/MageFrame.java b/Mage.Client/src/main/java/mage/client/MageFrame.java index 2f252fce7f1..ae3f7ab1d66 100644 --- a/Mage.Client/src/main/java/mage/client/MageFrame.java +++ b/Mage.Client/src/main/java/mage/client/MageFrame.java @@ -594,7 +594,7 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { missingCards = CardRepository.instance.findCards(new CardCriteria()); LOGGER.info("Card pool load time: " + ((System.currentTimeMillis() - beforeCall) / 1000 + " seconds")); beforeCall = System.currentTimeMillis(); - if (DownloadPictures.checkForNewCards(missingCards)) { + if (DownloadPictures.checkForMissingCardImages(missingCards)) { 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?" + "

You can deactivate the image download check on application start in the preferences."); diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.java b/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.java index 357dc99d2db..fe676343a9c 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.java @@ -43,7 +43,6 @@ import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.*; import javax.swing.DefaultComboBoxModel; -import javax.swing.JOptionPane; import javax.swing.JTable; import javax.swing.SwingUtilities; import javax.swing.table.DefaultTableCellRenderer; @@ -55,6 +54,7 @@ import mage.cards.Sets; import mage.cards.repository.CardCriteria; import mage.cards.repository.CardInfo; import mage.cards.repository.CardRepository; +import mage.client.MageFrame; import mage.client.cards.*; import mage.client.constants.Constants.SortBy; import mage.client.deckeditor.table.TableModel; @@ -960,7 +960,7 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene filterCards(); } } 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 @@ -993,7 +993,7 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene if (currentView.cardsSize() > CardGrid.MAX_IMAGES) { jToggleCardView.setSelected(false); 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 { if (!(currentView instanceof CardGrid)) { toggleViewMode(); diff --git a/Mage.Client/src/main/java/mage/client/game/GamePanel.java b/Mage.Client/src/main/java/mage/client/game/GamePanel.java index a74eba61bad..b22e28db511 100644 --- a/Mage.Client/src/main/java/mage/client/game/GamePanel.java +++ b/Mage.Client/src/main/java/mage/client/game/GamePanel.java @@ -749,9 +749,9 @@ public final class GamePanel extends javax.swing.JPanel { if (change) { handCardsOfOpponentAvailable = !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 { - JOptionPane.showMessageDialog(null, "You lost control on other player's turn."); + MageFrame.getInstance().showMessage("You lost control on other player's turn."); } } } else { diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/TokensMtgImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/TokensMtgImageSource.java index e169dfc4258..74b1fdb0a58 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/TokensMtgImageSource.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/TokensMtgImageSource.java @@ -49,6 +49,10 @@ public class TokensMtgImageSource implements CardImageSource { private static CardImageSource instance = new TokensMtgImageSource(); + private List tokensData; + + private final Object tokensDataSync = new Object(); + public static CardImageSource getInstance() { if (instance == null) { instance = new TokensMtgImageSource(); @@ -82,26 +86,27 @@ public class TokensMtgImageSource implements CardImageSource { } private static final String[] EMBLEMS = { - "Ajani", - "Chandra", - "Dack", - "Daretti", - "Domri", - "Elspeth", - "Garruk", - "Gideon", - "Jace", - "Kiora", - "Koth", - "Liliana", - "Narset", - "Nixilis", - "Sarkhan", - "Sorin", - "Tamiyo", - "Teferi", - "Venser", - }; + "Ajani", + "Arlinn", + "Chandra", + "Dack", + "Daretti", + "Dovin", + "Domri", + "Elspeth", + "Garruk", + "Gideon", + "Jace", + "Kiora", + "Koth", + "Liliana", + "Narset", + "Nixilis", + "Sarkhan", + "Sorin", + "Tamiyo", + "Teferi", + "Venser",}; private static final Map SET_NAMES_REPLACEMENT = new HashMap() { { @@ -119,7 +124,7 @@ public class TokensMtgImageSource implements CardImageSource { // handle emblems if (name.toLowerCase().contains("emblem")) { for (String emblem : EMBLEMS) { - if (name.toLowerCase().contains(emblem.toLowerCase())){ + if (name.toLowerCase().contains(emblem.toLowerCase())) { name = emblem + " Emblem"; break; } @@ -135,23 +140,23 @@ public class TokensMtgImageSource implements CardImageSource { // 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 // with tokens information that can be downloaded from the site. - List tokensData = getTokensData(); + List newTokensData = getTokensData(); - if (tokensData.isEmpty()) { + if (newTokensData.isEmpty()) { return null; } - List matchedTokens = new ArrayList(); - for (TokenData token : tokensData) { + List matchedTokens = new ArrayList<>(); + for (TokenData token : newTokensData) { if (name.equalsIgnoreCase(token.getName()) && set.equalsIgnoreCase(token.getExpansionSetCode())) { matchedTokens.add(token); } } - - if (matchedTokens.isEmpty()) { - logger.info("Could not find data for token " + name + ", set " + set + "."); - return null; - } +// +// if (matchedTokens.isEmpty()) { +// logger.info("Could not find data for token " + name + ", set " + set + "."); +// return null; +// } TokenData tokenData; if (type == 0) { @@ -168,72 +173,66 @@ public class TokensMtgImageSource implements CardImageSource { } 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(' ', '-'); return url; } - private List tokensData; - - private final Object tokensDataSync = new Object(); - private List getTokensData() throws IOException { - if (tokensData == null) { - synchronized (tokensDataSync) { - if (tokensData == null) { - tokensData = new ArrayList(); + synchronized (tokensDataSync) { + if (tokensData == null) { + tokensData = new ArrayList<>(); - // get tokens data from resource file - InputStream inputStream = null; - try { - inputStream = this.getClass().getResourceAsStream("/tokens-mtg-onl-list.csv"); - List fileTokensData = parseTokensData(inputStream); - tokensData.addAll(fileTokensData); - } catch (Exception exception) { - logger.warn("Failed to get tokens description from resource file tokens-mtg-onl-list.csv", exception); - } finally { - if (inputStream != null) { - try { - inputStream.close(); - } catch (Exception e) { - logger.error("Input stream close failed:", e); + // get tokens data from resource file + InputStream inputStream = null; + try { + inputStream = this.getClass().getResourceAsStream("/tokens-mtg-onl-list.csv"); + List fileTokensData = parseTokensData(inputStream); + tokensData.addAll(fileTokensData); + } catch (Exception exception) { + logger.warn("Failed to get tokens description from resource file tokens-mtg-onl-list.csv", exception); + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (Exception 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 siteTokensData = parseTokensData(inputStream); + + List 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 - // try to add it - try { - URL url = new URL("http://tokens.mtg.onl/data/SetsWithTokens.csv"); - inputStream = url.openStream(); - List siteTokensData = parseTokensData(inputStream); - - List 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); - } - } - - 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); - } + 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 parseTokensData(InputStream inputStream) throws IOException { - List tokensData = new ArrayList(); + List newTokensData = new ArrayList<>(); InputStreamReader inputReader = null; BufferedReader reader = null; @@ -266,8 +265,7 @@ public class TokensMtgImageSource implements CardImageSource { if (state == 2) { state = 0; } - } else { - if (state == 0) { + } else if (state == 0) { set = line.substring(0, 3); state = 1; } else { @@ -279,8 +277,7 @@ public class TokensMtgImageSource implements CardImageSource { String name = split[0].replace('‚', ','); String number = split[1]; TokenData token = new TokenData(name, number, set); - tokensData.add(token); - } + newTokensData.add(token); } line = reader.readLine(); @@ -302,7 +299,7 @@ public class TokensMtgImageSource implements CardImageSource { } } - return tokensData; + return newTokensData; } final class TokenData { @@ -334,12 +331,12 @@ public class TokensMtgImageSource implements CardImageSource { public Integer getTotalImages() { return -1; } - + @Override public Boolean isTokenSource() { return true; } - + @Override public void doPause(String httpImageUrl) { } diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/images/CardDownloadData.java b/Mage.Client/src/main/java/org/mage/plugins/card/images/CardDownloadData.java index dda5955bc82..4130addaf59 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/images/CardDownloadData.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/images/CardDownloadData.java @@ -10,6 +10,7 @@ public class CardDownloadData { private String name; private String downloadName; + private String fileName = ""; private String set; private String tokenSetCode; private String tokenDescriptor; @@ -32,6 +33,11 @@ public class CardDownloadData { 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) { this.name = name; this.set = set; @@ -43,7 +49,7 @@ public class CardDownloadData { this.secondSide = secondSide; this.tokenSetCode = tokenSetCode; this.tokenDescriptor = tokenDescriptor; - + if (this.tokenDescriptor == null || this.tokenDescriptor.equalsIgnoreCase("")) { this.tokenDescriptor = lastDitchTokenDescriptor(); } @@ -60,6 +66,7 @@ public class CardDownloadData { this.usesVariousArt = card.usesVariousArt; this.tokenSetCode = card.tokenSetCode; this.tokenDescriptor = card.tokenDescriptor; + this.fileName = card.fileName; } @@ -118,6 +125,14 @@ public class CardDownloadData { return name; } + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + public void setName(String name) { this.name = name; } @@ -125,7 +140,7 @@ public class CardDownloadData { public String getSet() { return set; } - + public void setSet(String set) { this.set = set; } @@ -144,15 +159,15 @@ public class CardDownloadData { public void setTokenDescriptor(String tokenDescriptor) { this.tokenDescriptor = tokenDescriptor; - } - + } + private String lastDitchTokenDescriptor() { - String name = this.name.replaceAll("[^a-zA-Z0-9]", ""); - String descriptor = name + "...."; + String tmpName = this.name.replaceAll("[^a-zA-Z0-9]", ""); + String descriptor = tmpName + "...."; descriptor = descriptor.toUpperCase(); return descriptor; - } - + } + public boolean isToken() { return token; } diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java b/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java index c76e2498f49..07ae2dd24f0 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/images/DownloadPictures.java @@ -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.GrabbagImageSource; 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.MythicspoilerComSource; import org.mage.plugins.card.dl.sources.TokensMtgImageSource; 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.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]); } - public static boolean checkForNewCards(List allCards) { + public static boolean checkForMissingCardImages(List allCards) { AtomicBoolean missedCardTFiles = new AtomicBoolean(); allCards.parallelStream().forEach(card -> { if (!missedCardTFiles.get()) { @@ -279,7 +279,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab private void updateProgressText(int cardCount) { float mb = (cardCount * cardImageSource.getAverageSize()) / 1024; 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) { @@ -309,57 +309,57 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab } int numberCardImages = allCards.size(); - + int numberWithoutTokens = 0; try { offlineMode = true; - allCards.parallelStream().forEach(card -> { - if (!card.getCardNumber().isEmpty() && !"0".equals(card.getCardNumber()) && !card.getSetCode().isEmpty() - && !ignoreUrls.contains(card.getSetCode())) { - String cardName = card.getName(); - boolean isType2 = type2SetsFilter.contains(card.getSetCode()); - CardDownloadData url = new CardDownloadData(cardName, card.getSetCode(), card.getCardNumber(), card.usesVariousArt(), 0, "", "", false, card.isDoubleFaced(), card.isNightCard()); - if (url.getUsesVariousArt()) { - url.setDownloadName(createDownloadName(card)); - } + allCards.parallelStream().forEach(card -> { + if (!card.getCardNumber().isEmpty() && !"0".equals(card.getCardNumber()) && !card.getSetCode().isEmpty() + && !ignoreUrls.contains(card.getSetCode())) { + String cardName = card.getName(); + boolean isType2 = type2SetsFilter.contains(card.getSetCode()); + CardDownloadData url = new CardDownloadData(cardName, card.getSetCode(), card.getCardNumber(), card.usesVariousArt(), 0, "", "", false, card.isDoubleFaced(), card.isNightCard()); + if (url.getUsesVariousArt()) { + url.setDownloadName(createDownloadName(card)); + } - url.setFlipCard(card.isFlipCard()); - url.setSplitCard(card.isSplitCard()); - url.setType2(isType2); + url.setFlipCard(card.isFlipCard()); + url.setSplitCard(card.isSplitCard()); + url.setType2(isType2); - allCardsUrls.add(url); - if (card.isDoubleFaced()) { - if (card.getSecondSideName() == null || card.getSecondSideName().trim().isEmpty()) { - 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.setType2(isType2); - allCardsUrls.add(url); - } - if (card.isFlipCard()) { - if (card.getFlipCardName() == null || card.getFlipCardName().trim().isEmpty()) { - 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.setFlipCard(true); - url.setFlippedSide(true); - url.setType2(isType2); - allCardsUrls.add(url); - } - } else if (card.getCardNumber().isEmpty() || "0".equals(card.getCardNumber())) { - System.err.println("There was a critical error!"); - logger.error("Card has no collector ID and won't be sent to client: " + card); - } else if (card.getSetCode().isEmpty()) { - System.err.println("There was a critical error!"); - logger.error("Card has no set name and won't be sent to client:" + card); - } - }); + allCardsUrls.add(url); + if (card.isDoubleFaced()) { + if (card.getSecondSideName() == null || card.getSecondSideName().trim().isEmpty()) { + 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.setType2(isType2); + allCardsUrls.add(url); + } + if (card.isFlipCard()) { + if (card.getFlipCardName() == null || card.getFlipCardName().trim().isEmpty()) { + 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.setFlipCard(true); + url.setFlippedSide(true); + url.setType2(isType2); + allCardsUrls.add(url); + } + } else if (card.getCardNumber().isEmpty() || "0".equals(card.getCardNumber())) { + System.err.println("There was a critical error!"); + logger.error("Card has no collector ID and won't be sent to client: " + card); + } else if (card.getSetCode().isEmpty()) { + System.err.println("There was a critical error!"); + logger.error("Card has no set name and won't be sent to client:" + card); + } + }); + numberWithoutTokens = allCards.size(); allCardsUrls.addAll(getTokenCardUrls()); } catch (Exception e) { logger.error(e); } - int numberTokenImages = allCardsUrls.size() - numberCardImages; - + int numberAllTokenImages = allCardsUrls.size() - numberWithoutTokens; /** * 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()); - if (logger.isDebugEnabled()) { - for (CardDownloadData card : cardsToDownload) { - if (card.isToken()) { - logger.debug("Card to download: " + card.getName() + " (Token) "); - } else { - try { - logger.debug("Card to download: " + card.getName() + " (" + card.getSet() + ")"); - } catch (Exception e) { - logger.error(e); - } - } + int tokenImages = 0; + for (CardDownloadData card : cardsToDownload) { + logger.debug((card.isToken() ? "Token" : "Card") + " image to download: " + card.getName() + " (" + card.getSet() + ")"); + if (card.isToken()) { + tokenImages++; } } - + 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); } @@ -413,24 +408,29 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab String[] params = line.split("\\|", -1); if (params.length >= 5) { int type = 0; + String fileName = ""; if (params[4] != null && !params[4].isEmpty()) { 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:")) { String set = params[2].substring(4); CardDownloadData card = new CardDownloadData(params[3], set, "0", false, type, "", "", true); list.add(card); } else if (params[1].toLowerCase().equals("generate") && params[2].startsWith("EMBLEM:")) { 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); } else if (params[1].toLowerCase().equals("generate") && params[2].startsWith("EMBLEM-:")) { 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); } else if (params[1].toLowerCase().equals("generate") && params[2].startsWith("EMBLEM!:")) { 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); } } else { @@ -531,20 +531,18 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab imageRef = cardImageSource.getSourceName() + imageRef; try { 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()); executor.execute(task); } 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() + ")"); synchronized (sync) { update(cardIndex + 1, cardsToDownload.size()); } } - } else if (url != null) { + } else { Runnable task = new DownloadTask(card, new URL(url), cardsToDownload.size()); executor.execute(task); } @@ -637,7 +635,11 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab } File existingFile = new File(imagePath.replaceFirst("\\w{3}.zip", "")); 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) { update(cardIndex + 1, count); } @@ -728,7 +730,7 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab logger.error(e, e); } finally { if (temporaryFile != null) { - //temporaryFile.delete(); + temporaryFile.delete(); } } synchronized (sync) { diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/utils/CardImageUtils.java b/Mage.Client/src/main/java/org/mage/plugins/card/utils/CardImageUtils.java index 34a2ede8113..759787d6186 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/utils/CardImageUtils.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/utils/CardImageUtils.java @@ -167,7 +167,7 @@ public class CardImageUtils { String imageName; 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()) { imageName = name + "." + card.getCollectorId() + ".full.jpg"; diff --git a/Mage.Client/src/main/resources/card-pictures-tok.txt b/Mage.Client/src/main/resources/card-pictures-tok.txt index e3fbce26ad1..b242976bacb 100644 --- a/Mage.Client/src/main/resources/card-pictures-tok.txt +++ b/Mage.Client/src/main/resources/card-pictures-tok.txt @@ -29,9 +29,9 @@ |Generate|TOK:KLD|Thopter|1| |Generate|TOK:KLD|Thopter|2| |Generate|TOK:KLD|Thopter|3| -|Generate|EMBLEM!:KLD|Emblem Chandra, Torch of Defiance|| -|Generate|EMBLEM!:KLD|Emblem Nissa, Vital Force|| -|Generate|EMBLEM!:KLD|Emblem Dovin Baan|| +|Generate|EMBLEM!:KLD|Emblem Chandra|| +|Generate|EMBLEM!:KLD|Emblem Nissa|| +|Generate|EMBLEM!:KLD|Emblem Dovin|| |Generate|TOK:CN2|Assassin|| |Generate|TOK:CN2|Beast|| @@ -60,7 +60,7 @@ |Generate|TOK:EMA|Wall|| |Generate|TOK:EMA|Wurm|| |Generate|TOK:EMA|Zombie|| -|Generate|EMBLEM!:EMA|Emblem Dack Fayden|| +|Generate|EMBLEM!:EMA|Emblem Dack|| |Generate|TOK:EMN|Eldrazi Horror|| |Generate|TOK:EMN|Human|| @@ -70,8 +70,8 @@ |Generate|TOK:EMN|Zombie|2| |Generate|TOK:EMN|Zombie|3| |Generate|TOK:EMN|Zombie|4| -|Generate|EMBLEM!:EMN|Emblem Liliana, the Last Hope|| -|Generate|EMBLEM!:EMN|Emblem Tamiyo, Field Researcher|| +|Generate|EMBLEM!:EMN|Emblem Liliana|| +|Generate|EMBLEM!:EMN|Emblem Tamiyo|| |Generate|TOK:SOI|Angel|| |Generate|TOK:SOI|Clue|1| @@ -89,8 +89,8 @@ |Generate|TOK:SOI|Vampire Knight|| |Generate|TOK:SOI|Wolf|| |Generate|TOK:SOI|Zombie|| -|Generate|EMBLEM!:SOI|Emblem Arlinn, Embraced by the Moon|| -|Generate|EMBLEM!:SOI|Emblem Jace, Unraveler of Secrets|| +|Generate|EMBLEM!:SOI|Emblem Arlinn|| +|Generate|EMBLEM!:SOI|Emblem Jace|| |Generate|TOK:OGW|Angel|| |Generate|TOK:OGW|Elemental|1| @@ -123,7 +123,7 @@ |Generate|TOK:C15|Gold|| |Generate|TOK:C15|Knight|1| |Generate|TOK:C15|Knight|2| -|Generate|TOK:C15|Lightning Rager|| +|Generate|TOK:C15|Lightning Ranger|| |Generate|TOK:C15|Saproling|| |Generate|TOK:C15|Shapeshifter|| |Generate|TOK:C15|Snake|1| @@ -145,9 +145,9 @@ |Generate|TOK:BFZ|Kor Ally|| |Generate|TOK:BFZ|Octopus|| |Generate|TOK:BFZ|Plant|| -|Generate|EMBLEM!:BFZ|Emblem Gideon, Ally of Zendikar|| -|Generate|EMBLEM!:BFZ|Emblem Kiora, Master of the Depths|| -|Generate|EMBLEM!:BFZ|Emblem Ob Nixilis Reignited|| +|Generate|EMBLEM!:BFZ|Emblem Gideon|| +|Generate|EMBLEM!:BFZ|Emblem Kiora|| +|Generate|EMBLEM!:BFZ|Emblem Nixilis|| |Generate|TOK:DDP|Eldrazi Spawn|1| |Generate|TOK:DDP|Eldrazi Spawn|2| @@ -194,9 +194,9 @@ |Generate|TOK:ORI|Thopter|1| |Generate|TOK:ORI|Thopter|2| |Generate|TOK:ORI|Zombie|| -|Generate|EMBLEM!:ORI|Emblem Chandra, Roaring Flame|| -|Generate|EMBLEM!:ORI|Emblem Jace, Telepath Unbound|| -|Generate|EMBLEM!:ORI|Emblem Liliana, Defiant Necromancer|| +|Generate|EMBLEM!:ORI|Emblem Chandra|| +|Generate|EMBLEM!:ORI|Emblem Jace|| +|Generate|EMBLEM!:ORI|Emblem Liliana|| #|Generate|TOK:PTC|Angel|| #|Generate|TOK:PTC|Avatar|| @@ -356,7 +356,7 @@ |Generate|TOK:CNS|Squirrel|| |Generate|TOK:CNS|Wolf|| |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|Zombie|| @@ -379,7 +379,7 @@ |Generate|TOK:BNG|Centaur|| |Generate|TOK:BNG|Wolf|| |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|Soldier|1| @@ -393,7 +393,7 @@ |Generate|TOK:THS|Satyr|| |Generate|TOK:THS|Golem|1| |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|2| @@ -407,8 +407,8 @@ |Generate|TOK:M14|Beast|| |Generate|TOK:M14|Saproling|| |Generate|TOK:M14|Wolf|| -|Generate|EMBLEM:M14|Liliana of the Dark Realms|| -|Generate|EMBLEM:M14|Garruk, Caller of Beasts|| +|Generate|EMBLEM:M14|Liliana of the Dark Realms||Emblem Liliana| +|Generate|EMBLEM:M14|Garruk, Caller of Beasts||Emblem Garruk| |Generate|TOK:DDL|Griffin|| |Generate|TOK:DDL|Beast|| @@ -428,7 +428,7 @@ |Generate|TOK:MMA|Treefolk Shaman|| |Generate|TOK:MMA|Faerie Rogue|| |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|Bird|| @@ -443,7 +443,7 @@ |Generate|TOK:GTC|Soldier|1| |Generate|TOK:GTC|Soldier|2| |Generate|TOK:GTC|Spirit|| -|Generate|EMBLEM:GTC|Domri Rade|| +|Generate|EMBLEM:GTC|Domri Rade||Emblem Domri| |Generate|TOK:RTR|Bird|| |Generate|TOK:RTR|Knight|1| @@ -462,7 +462,7 @@ |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|Goat|| |Generate|TOK:M13|Soldier|| @@ -475,7 +475,7 @@ |Generate|TOK:M13|Saproling|| |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|2| |Generate|TOK:AVR|Angel|3| @@ -488,12 +488,12 @@ |Generate|TOK:AVR|Demon|3| |Generate|TOK:AVR|Zombie|| -|Generate|EMBLEM:DDI|Venser, the Sojourner|| -|Generate|EMBLEM:DDI|Koth of the Hammer|| +|Generate|EMBLEM:DDI|Venser, the Sojourner||Emblem Venser| +|Generate|EMBLEM:DDI|Koth of the Hammer||Emblem Koth| |Generate|TOK:DKA|Human|| |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|Spirit|| diff --git a/Mage.Client/src/main/resources/tokens-mtg-onl-list.csv b/Mage.Client/src/main/resources/tokens-mtg-onl-list.csv index 2a64a370e06..1d2ea50d5c9 100644 --- a/Mage.Client/src/main/resources/tokens-mtg-onl-list.csv +++ b/Mage.Client/src/main/resources/tokens-mtg-onl-list.csv @@ -1,7 +1,7 @@ -Token name, Number, Color, P/T, Promo, Type, Artist, Text +Token name, Number, Color, P/T, Promo, Type, Artist, Text + +UGL - Unglued (1998-08-11) -UGL - Unglued (1998-08-11) - Pegasus, 89, W, 1|1, -, Creature - Pegasus, Mark Zug, Flying Soldier, 90, W, 1|1, -, Creature - Soldier, Daren Bader, - Zombie, 91, B, 2|2, -, Creature - Zombie, Christopher Rush, - @@ -9,27 +9,27 @@ Goblin, 92, R, 1|1, -, Creature - Goblin, Pete Venters, - Sheep, 93, G, 1|1, -, Creature - Sheep, Kev Walker, - Squirrel, 94, G, 1|1, -, Creature - Squirrel, Ron Spencer, - -ATH - Anthologies (1998-11-01) - +ATH - Anthologies (1998-11-01) + Pegasus, 89, W, 1|1, -, Creature - Pegasus, Mark Zug, Flying Goblin, 92, R, 1|1, -, Creature - Goblin, Pete Venters, - -INV - Invasion (2000-10-02) - +INV - Invasion (2000-10-02) + Bird, T1, U, 1|1, Player Rewards, Creature - Bird, Michael Sutfin, Flying Elephant, T2, G, 3|3, Player Rewards, Creature - Elephant, Terese Nielsen, - Saproling, T3, G, 1|1, Player Rewards, Creature - Saproling, Jeff Laubenstein, - -PLS - Planeshift (2001-02-05) - +PLS - Planeshift (2001-02-05) + Spirit, T1, W, 1|1, Player Rewards, Creature - Spirit, John Matson, Flying -APC - Apocalypse (2001-06-04) - +APC - Apocalypse (2001-06-04) + Goblin Soldier, T1, R W, 1|1, Player Rewards, Creature - Goblin Soldier, Ron Spears, - -ODY - Odyssey (2001-10-01) - +ODY - Odyssey (2001-10-01) + Bear, T1, G, 2|2, Player Rewards, Creature - Bear, Heather Hudson, - Beast, T2, G, 4|4, Player Rewards, Creature - Beast, Larry Elmore, - Elephant, T3, G, 3|3, Player Rewards, Creature - Elephant, Arnie Swekel, - @@ -37,46 +37,46 @@ Squirrel, T4, G, 1|1, Player Rewards, Creature - Squirrel, Ron Spencer, - Wurm, T5, G, 6|6, Player Rewards, Creature - Wurm, Alan Pollack, - Zombie, T6, B, 2|2, Player Rewards, Creature - Zombie, Dana Knutson, - -ONS - Onslaught (2002-10-07) - +ONS - Onslaught (2002-10-07) + Bear, T1, G, 2|2, Player Rewards, Creature - Bear, Glen Angus, - Dragon, T2, R, 5|5, Player Rewards, Creature - Dragon, Glen Angus, Flying Insect, T3, G, 1|1, Player Rewards, Creature - Insect, Anthony S. Waters, - Soldier, T4, W, 1|1, Player Rewards, Creature - Soldier, Ron Spencer, - -LGN - Legions (2003-02-03) - +LGN - Legions (2003-02-03) + Goblin, T1, R, 1|1, Player Rewards, Creature - Goblin, Darrell Riche, - Sliver, T2, -, 1|1, Player Rewards, Creature - Sliver, Tony Szczudlo, - -SCG - Scourge (2003-05-26) - +SCG - Scourge (2003-05-26) + Angel, T1, W, 4|4, Player Rewards, Creature - Angel, Scott M. Fischer, Flying -8ED - Eighth Edition (2003-07-28) - -Rukh, T1, R, 4|4, Player Rewards, Creature - Rukh, Edward P. Beard‚ Jr., Flying +8ED - Eighth Edition (2003-07-28) + +Rukh, T1, R, 4|4, Player Rewards, Creature - Rukh, Edward P. Beard� Jr., Flying + +MRD - Mirrodin (2003-10-02) -MRD - Mirrodin (2003-10-02) - Demon, T1, B, *|*, Player Rewards, Creature - Demon, Pete Venters, - Myr, T2, -, 1|1, Player Rewards, Creature - Myr, Wayne England, - Pentavite, T3, -, 1|1, Player Rewards, Artifact Creature - Pentavite, Greg Staples, - -DST - Darksteel (2004-02-06) - -Beast, T1, G, 3|3, Player Rewards, Creature - Beast, Edward P. Beard‚ Jr., - +DST - Darksteel (2004-02-06) + +Beast, T1, G, 3|3, Player Rewards, Creature - Beast, Edward P. Beard� Jr., - + +CHK - Champions of Kamigawa (2004-10-01) -CHK - Champions of Kamigawa (2004-10-01) - Spirit, T1, -, 1|1, Player Rewards, Creature - Spirit, Hugh Jamieson, - -CSP - Coldsnap (2006-07-21) - -Marit Lage, T1, B, 20|20, Pre-Release, Creature - Avatar, Stephan Martiniere, Flying‚ indestructible +CSP - Coldsnap (2006-07-21) + +Marit Lage, T1, B, 20|20, Pre-Release, Creature - Avatar, Stephan Martiniere, Flying� indestructible + +10E - Tenth Edition (2007-07-13) -10E - Tenth Edition (2007-07-13) - Soldier, 1, W, 1|1, -, Creature - Soldier, Parente, - Zombie, 2, B, 2|2, -, Creature - Zombie, Carl Critchlow, - Dragon, 3, R, 5|5, -, Creature - Dragon, Jim Pavelec, Flying @@ -84,8 +84,8 @@ Goblin, 4, R, 1|1, -, Creature - Goblin, Dave Kendall, - Saproling, 5, G, 1|1, -, Creature - Saproling, Cyril Van Der Haegen, - Wasp, 6, -, 1|1, -, Artifact Creature - Insect, Ron Spencer, Flying -LRW - Lorwyn (2007-10-12) - +LRW - Lorwyn (2007-10-12) + Avatar, 1, W, *|*, -, Creature - Avatar, Vance Kovacs, This creature's power and toughness are each equal to your life total. Elemental, 2, W, 4|4, -, Creature - Elemental, Anthony S. Waters, Flying Kithkin Soldier, 3, W, 1|1, -, Creature - Kithkin Soldier, Greg Hildebrandt, - @@ -98,20 +98,20 @@ Elf Warrior, 9, G, 1|1, -, Creature - Elf Warrior, Dominick Domingo, - Wolf, 10, G, 2|2, -, Creature - Wolf, Pete Venters, - Shapeshifter, 11, -, 1|1, -, Creature - Shapeshifter, Franz Vohwinkel, Changeling -EVG - Duel Decks: Elves vs. Goblins (2007-11-16) - +EVG - Duel Decks: Elves vs. Goblins (2007-11-16) + Elemental, T1, G, 7|7, -, Creature - Elemental, Anthony S. Waters, Trample Elf Warrior, T2, G, 1|1, -, Creature - Elf Warrior, Dominick Domingo, - Goblin, T3, R, 1|1, -, Creature - Goblin, Dave Kendall, - -MOR - Morningtide (2008-02-01) - +MOR - Morningtide (2008-02-01) + Giant Warrior, 1, W, 5|5, -, Creature - Giant Warrior, Steve Ellis, - Faerie Rogue, 2, B, 1|1, -, Creature - Faerie Rogue, Jim Nelson, Flying Treefolk Shaman, 3, G, 2|5, -, Creature - Treefolk Shaman, Richard Sardinha, - -SHM - Shadowmoor (2008-05-02) - +SHM - Shadowmoor (2008-05-02) + Kithkin Soldier, 1, W, 1|1, -, Creature - Kithkin Soldier, Randy Gallegos, - Spirit, 2, W, 1|1, -, Creature - Spirit, Jeremy Enecio, Flying Rat, 3, B, 1|1, -, Creature - Rat, Carl Critchlow, - @@ -125,8 +125,8 @@ Giant Warrior, 10, R G, 4|4, -, Creature - Giant Warrior, Trevor Hairsine, Haste Goblin Warrior, 11, R G, 1|1, -, Creature - Goblin Warrior, Dave Allsop, - Elf Warrior, 12, G W, 1|1, -, Creature - Elf Warrior, Carl Frank, - -EVE - Eventide (2008-07-25) - +EVE - Eventide (2008-07-25) + Goat, 1, W, -, -, Creature - Goat, Terese Nielsen, - Bird, 2, U, 1|1, -, Creature - Bird, Heather Hudson, Flying Beast, 3, G, 3|3, -, Creature - Beast, William O'Connor, - @@ -135,8 +135,8 @@ Elemental, 5, U R, 5|5, -, Creature - Elemental, Randy Gallegos, Flying Worm, 6, B G, 1|1, -, Creature - Worm, Chuck Lukacs, - Goblin Soldier, 7, R W, 1|1, -, Creature - Goblin Soldier, Jeff Miracola, - -ALA - Shards of Alara (2008-10-03) - +ALA - Shards of Alara (2008-10-03) + Soldier, 1, W, 1|1, -, Creature - Soldier, Alan Pollack, - Homunculus, 2, U, -, -, Artifact Creature - Homunculus, Howard Lyon, - Thopter, 3, U, 1|1, -, Artifact Creature - Thopter, Andrew Murray, Flying @@ -148,30 +148,30 @@ Ooze, 8, G, *|*, -, Creature - Ooze, Anthony S. Waters, - Saproling, 9, G, 1|1, -, Creature - Saproling, Trevor Claxton, - Beast, 10, R G W, 8|8, -, Creature - Beast, Parente, - -DD2 - Duel Decks: Jace vs. Chandra (2008-11-07) - +DD2 - Duel Decks: Jace vs. Chandra (2008-11-07) + Elemental Shaman, T1, R, 3|1, -, Creature - Elemental Shaman, Jim Pavelec, - -CFX - Conflux (2009-02-06) - +CFX - Conflux (2009-02-06) + Angel, 1, W, 4|4, -, Creature - Angel, Cyril Van Der Haegen, Flying Elemental, 2, R, 3|1, -, Creature - Elemental, Vance Kovacs, - -DDC - Duel Decks: Divine vs. Demonic (2009-04-10) - +DDC - Duel Decks: Divine vs. Demonic (2009-04-10) + Spirit, T1, W, 1|1, -, Creature - Spirit, Luca Zontini, Flying Demon, T2, B, *|*, -, Creature - Demon, Pete Venters, Flying Thrull, T3, B, -, -, Creature - Thrull, Veronique Meignaud, - -ARB - Alara Reborn (2009-04-30) - +ARB - Alara Reborn (2009-04-30) + Bird Soldier, 1, W, 1|1, -, Creature - Bird Soldier, Matt Cavotta, Flying 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� devour 2 Zombie Wizard, 4, U B, 1|1, -, Creature - Zombie Wizard, Dave Allsop, - -M10 - Magic 2010 (2009-07-17) - +M10 - Magic 2010 (2009-07-17) + Avatar, 1, W, *|*, -, Creature - Avatar, Vance Kovacs, This creature's power and toughness are each equal to your life total. Soldier, 2, W, 1|1, -, Creature - Soldier, Parente, - Zombie, 3, B, 2|2, -, Creature - Zombie, Bud Cook, - @@ -181,8 +181,8 @@ Insect, 6, G, 1|1, -, Creature - Insect, Ron Spencer, - Wolf, 7, G, 2|2, -, Creature - Wolf, Lars Grant-West, - Gargoyle, 8, -, 3|4, -, Artifact Creature - Gargoyle, Paul Bonner, Flying -ZEN - Zendikar (2009-10-02) - +ZEN - Zendikar (2009-10-02) + Angel, 1, W, 4|4, -, Creature - Angel, Adi Granov, Flying Bird, 2, W, 1|1, -, Creature - Bird, Howard Lyon, Flying Kor Soldier, 3, W, 1|1, -, Creature - Kor Soldier, Daren Bader, - @@ -190,19 +190,19 @@ Illusion, 4, U, 2|2, -, Creature - Illusion, Cyril Van Der Haegen, - Merfolk, 5, U, 1|1, -, Creature - Merfolk, Warren Mahy, - Vampire, 6, B, *|*, -, Creature - Vampire, Kekai Kotaki, - 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� haste Beast, 9, G, 4|4, -, Creature - Beast, Steve Prescott, - Snake, 10, G, 1|1, -, Creature - Snake, Austin Hsu, - Wolf, 11, G, 2|2, -, Creature - Wolf, Daren Bader, - -DDD - Duel Decks: Garruk vs. Liliana (2009-10-30) - +DDD - Duel Decks: Garruk vs. Liliana (2009-10-30) + Beast, T1, G, 3|3, -, Creature - Beast, John Donahue, - Beast, T2, G, 4|4, -, Creature - Beast, Steve Prescott, - Elephant, T3, G, 3|3, -, Creature - Elephant, Arnie Swekel, - -WWK - Worldwake (2010-02-05) - +WWK - Worldwake (2010-02-05) + Soldier Ally, 1, W, 1|1, -, Creature - Soldier Ally, Kekai Kotaki, - Dragon, 2, R, 5|5, -, Creature - Dragon, Raymond Swanland, Flying Ogre, 3, R, 3|3, -, Creature - Ogre, Paul Bonner, - @@ -210,14 +210,14 @@ Elephant, 4, G, 3|3, -, Creature - Elephant, Lars Grant-West, - Plant, 5, G, -, -, Creature - Plant, Daren Bader, - Construct, 6, -, 6|12, -, Artifact Creature - Construct, Jung Park, Trample -DDE - Duel Decks: Phyrexia vs. the Coalition (2010-03-19) - -Hornet, T1, -, 1|1, -, Artifact Creature - Insect, Ron Spencer, Flying‚ haste +DDE - Duel Decks: Phyrexia vs. the Coalition (2010-03-19) + +Hornet, T1, -, 1|1, -, Artifact Creature - Insect, Ron Spencer, Flying� haste Minion, T2, B, *|*, -, Creature - Minion, Dave Kendall, - Saproling, T3, G, 1|1, -, Creature - Saproling, Warren Mahy, - -ROE - Rise of the Eldrazi (2010-04-23) - +ROE - Rise of the Eldrazi (2010-04-23) + Eldrazi Spawn, 1a, -, -, -, Creature - Eldrazi Spawn, Aleksi Briclot, Sacrifice this creature: Add {1} to your mana pool. Eldrazi Spawn, 1b, -, -, -, Creature - Eldrazi Spawn, Mark Tedin, Sacrifice this creature: Add {1} to your mana pool. Eldrazi Spawn, 1c, -, -, -, Creature - Eldrazi Spawn, Veronique Meignaud, Sacrifice this creature: Add {1} to your mana pool. @@ -226,21 +226,21 @@ Hellion, 3, R, 4|4, -, Creature - Hellion, Anthony Francisco, - Ooze, 4, G, *|*, -, Creature - Ooze, Daniel Ljunggren, - Tuktuk The Returned, 5, -, 5|5, -, Legendary Artifact Creature - Goblin Golem, Franz Vohwinkel, - -M11 - Magic 2011 (2010-07-16) - +M11 - Magic 2011 (2010-07-16) + Avatar, 1, W, *|*, -, Creature - Avatar, Vance Kovacs, This creature's power and toughness are each equal to your life total. Bird, 2, W, 3|3, -, Creature - Bird, Paul Bonner, Flying Zombie, 3, B, 2|2, -, Creature - Zombie, Bud Cook, - 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� put two 1/1 green Ooze creature tokens onto the battlefield. 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) + Soldier, T1, W, 1|1, -, Creature - Soldier, Parente, - -SOM - Scars of Mirrodin (2010-10-01) - +SOM - Scars of Mirrodin (2010-10-01) + Cat, 1, W, 2|2, -, Creature - Cat, Scott Chou, - Soldier, 2, W, 1|1, -, Creature - Soldier, Goran Josic, - Goblin, 3, R, 1|1, -, Creature - Goblin, Goran Josic, - @@ -252,8 +252,8 @@ Wurm, 8, -, 3|3, -, Artifact Creature - Wurm, Raymond Swanland, Deathtouch Wurm, 9, -, 3|3, -, Artifact Creature - Wurm, Raymond Swanland, Lifelink Poison Counter, -, -, -, -, Emblem, -, - -MBS - Mirrodin Besieged (2011-02-04) - +MBS - Mirrodin Besieged (2011-02-04) + Germ, 1, B, -, -, Creature - Germ, Igor Kieryluk, - Zombie, 2, B, 2|2, -, Creature - Zombie, Dave Kendall, - Golem, 3, -, 9|9, -, Artifact Creature - Golem, Svetlin Velinov, - @@ -261,20 +261,20 @@ Horror, 4, -, *|*, -, Artifact Creature - Horror, Scott Chou, - Thopter, 5, -, 1|1, -, Artifact Creature - Thopter, Volkan Baga, Flying Poison Counter, -, -, -, -, Emblem, -, - -DDG - Duel Decks: Knights vs. Dragons (2011-04-01) - +DDG - Duel Decks: Knights vs. Dragons (2011-04-01) + Goblin, T1, R, 1|1, -, Creature - Goblin, Brandon Kitkouski, - -NPH - New Phyrexia (2011-05-13) - +NPH - New Phyrexia (2011-05-13) + Beast, 1, G, 3|3, -, Creature - Beast, Dave Allsop, - Goblin, 2, R, 1|1, -, Creature - Goblin, Jaime Jones, - Golem, 3, -, 3|3, -, Artifact Creature - Golem, Volkan Baga, - Myr, 4, -, 1|1, -, Artifact Creature - Myr, Matt Stewart, - Poison Counter, -, -, -, -, Emblem, -, - -M12 - Magic 2012 (2011-07-15) - +M12 - Magic 2012 (2011-07-15) + Bird, 1, W, 3|3, -, Creature - Bird, Paul Bonner, Flying Soldier, 2, W, 1|1, -, Creature - Soldier, Parente, - Zombie, 3, B, 2|2, -, Creature - Zombie, Carl Critchlow, - @@ -283,13 +283,13 @@ Saproling, 5, G, 1|1, -, Creature - Saproling, Cyril Van Der Haegen, - Wurm, 6, G, 6|6, -, Creature - Wurm, Anthony Francisco, - Pentavite, 7, -, 1|1, -, Artifact Creature - Pentavite, Greg Staples, Flying -DDH - Duel Decks: Ajani vs. Nicol Bolas (2011-09-02) - +DDH - Duel Decks: Ajani vs. Nicol Bolas (2011-09-02) + Griffin, T1, W, 2|2, -, Creature - Griffin, Jim Nelson, Flying Saproling, T2, G, 1|1, -, Creature - Saproling, Cyril Van Der Haegen, - -ISD - Innistrad (2011-09-30) - +ISD - Innistrad (2011-09-30) + Angel, 1, W, 4|4, -, Creature - Angel, Winona Nelson, Flying Spirit, 2, W, 1|1, -, Creature - Spirit, Kev Walker, Flying Homunculus, 3, U, 2|2, -, Creature - Homunculus, Johann Bodin, - @@ -304,24 +304,24 @@ Spider, 11, G, 1|2, -, Creature - Spider, Daniel Ljunggren, Reach Wolf, 12, G, 2|2, -, Creature - Wolf, David Palumbo, - Wolf, T12, G, 2|2, Judge, Creature - Wolf, David Palumbo, - -DKA - Dark Ascension (2012-02-03) - +DKA - Dark Ascension (2012-02-03) + Human, 1, W, 1|1, -, Creature - Human, John Stanko, - Vampire, 2, B, 1|1, -, Creature - Vampire, Peter Mohrbacher, Lifelink Sorin Emblem, 3, -, -, -, Emblem - Sorin, Michael Komrack, Creatures you control get +1/+0. -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.' -Venser Emblem, E2, -, -, -, Emblem - Venser, Eric Deschamps, Whenever you cast a spell‚ exile target permanent. +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.' +Venser Emblem, E2, -, -, -, Emblem - Venser, Eric Deschamps, Whenever you cast a spell� exile target permanent. + +FNM - Friday Night Magic (2012-04-01) -FNM - Friday Night Magic (2012-04-01) - Human, T1a, W, 1|1, Full Moon, Creature - Human, Lars Grant-West, - Wolf, T1b, G, 2|2, Full Moon, Creature - Wolf, Lars Grant-West, - -AVR - Avacyn Restored (2012-05-04) - +AVR - Avacyn Restored (2012-05-04) + Angel, 1, W, 4|4, -, Creature - Angel, Anthony Palumbo, Flying Human, 2, W, 1|1, -, Creature - Human, Michael C. Hayes, - Spirit, 3, W, 1|1, -, Creature - Spirit, Ryan Yee, Flying @@ -329,14 +329,14 @@ Spirit, 4, U, 1|1, -, Creature - Spirit, Dan Scott, Flying Demon, 5, B, 5|5, -, Creature - Demon, Kev Walker, Flying Zombie, 6, B, 2|2, -, Creature - Zombie, Lucas Graciano, - 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� you may return it to your hand. Angel, T1, 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, T5F, B, 5|5, Pre-Release, Creature - Demon, Karl Kopinski, Flying -M13 - Magic 2013 (2012-07-13) - +M13 - Magic 2013 (2012-07-13) + Goblin, 1, R, 1|1, League, Creature - Goblin, Jim Nelson, - Cat, 1, W, 2|2, -, Creature - Cat, Jesper Ejsing, - Goat, 2, W, -, -, Creature - Goat, Adam Paquette, - @@ -350,18 +350,18 @@ Saproling, 9, G, 1|1, -, Creature - Saproling, Brad Rigney, - Wurm, 10, G, 6|6, -, Creature - Wurm, Anthony Francisco, - Liliana Emblem, 11, -, -, -, Emblem - Liliana, D. Alexander Gregory, Swamps you control have Tap: Add {B}{B}{B}{B} to your mana pool.' -DDJ - Duel Decks: Izzet vs. Golgari (2012-09-07) - +DDJ - Duel Decks: Izzet vs. Golgari (2012-09-07) + Saproling, T1, G, 1|1, -, Creature - Saproling, Brad Rigney, - -RTR - Return to Ravnica (2012-10-05) - +RTR - Return to Ravnica (2012-10-05) + Centaur, 1, G, 3|3, Judge, Creature - Centaur, James Ryman, - Knight, 1, W, 2|2, League, Creature - Knight, Lucas Graciano, Vigilance Bird, 1, W, 1|1, -, Creature - Bird, James Ryman, Flying Knight, 2, W, 2|2, -, Creature - Knight, Matt Stewart, Vigilance 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� that player loses the game. Dragon, 5, R, 6|6, -, Creature - Dragon, Mark Zug, Flying Goblin, 6, R, 1|1, -, Creature - Goblin, Christopher Moeller, - Centaur, 7, G, 3|3, -, Creature - Centaur, Slawomir Maniak, - @@ -371,29 +371,29 @@ Saproling, 10, G, 1|1, -, Creature - Saproling, Raoul Vitale, - Wurm, 11, G, 5|5, -, Creature - Wurm, Anthony Palumbo, Trample Elemental, 12, G W, 8|8, -, Creature - Elemental, Yeong-Hao Han, Vigilance -GTC - Gatecrash (2013-02-01) - +GTC - Gatecrash (2013-02-01) + Soldier, 1, R W, 1|1, League, Creature - Soldier, Zoltan Boros, Haste Angel, 1, W, 4|4, -, Creature - Angel, Steve Argyle, Flying Rat, 2, B, 1|1, -, Creature - Rat, Nils Hamm, - 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}� {T}� 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 Soldier, 6, R W, 1|1, -, Creature - Soldier, David Palumbo, Haste 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� trample� hexproof� and haste. + +DDK - Duel Decks: Sorin vs. Tibalt (2013-03-15) -DDK - Duel Decks: Sorin vs. Tibalt (2013-03-15) - Spirit, T1, W, 1|1, -, Creature - Spirit, Ryan Yee, Flying -DGM - Dragon's Maze (2013-05-03) - +DGM - Dragon's Maze (2013-05-03) + Bird, 1, W, 1|1, League, Creature - Bird, Martina Pilcerova, Flying Elemental, 1, G W, *|*, -, Creature - Elemental, Mark Winters, This creature's power and toughness are each equal to the number of creatures you control. -MMA - Modern Masters (2013-06-07) - +MMA - Modern Masters (2013-06-07) + Giant Warrior, 1, W, 5|5, -, Creature - Giant Warrior, Svetlin Velinov, - Kithkin Soldier, 2, W, 1|1, -, Creature - Kithkin Soldier, Randy Gallegos, - Soldier, 3, W, 1|1, -, Creature - Soldier, Goran Josic, - @@ -409,10 +409,10 @@ Saproling, 12, G, 1|1, -, Creature - Saproling, Warren Mahy, - 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 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� creatures� enchantments� and lands you control have indestructible. + +M14 - Magic 2014 Core Set (2013-07-19) -M14 - Magic 2014 Core Set (2013-07-19) - Sliver, 1, -, 1|1, -, Creature - Sliver, Igor Kieryluk, - Angel, 1, W, 4|4, -, Creature - Angel, James Ryman, Flying Cat, 3, W, 2|2, -, Creature - Cat, Jesper Ejsing, - @@ -425,16 +425,16 @@ Beast, 9, G, 3|3, -, Creature - Beast, John Donahue, - Saproling, 10, G, 1|1, -, Creature - Saproling, Brad Rigney, - 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.' -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� you may search your library for a creature card� put it onto the battlefield� then shuffle your library. 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) + Griffin, T1, W, 2|2, -, Creature - Griffin, Johann Bodin, Flying Beast, T2, G, 3|3, -, Creature - Beast, Jesper Ejsing, - -THS - Theros (2013-09-27) - +THS - Theros (2013-09-27) + Golem, 1, -, 3|3, Judge, Enchantment Artifact Creature - Golem, Yeong-Hao Han, - Soldier, 1, W, 1|1, League, Creature - Soldier, Johann Bodin, - Cleric, 1, W, 2|1, -, Enchantment Creature - Cleric, Johann Bodin, - @@ -449,8 +449,8 @@ Satyr, 9, R G, 2|2, -, Creature - Satyr, Johann Bodin, - Golem, 10, -, 3|3, -, Enchantment Artifact Creature - Golem, Yeong-Hao Han, - Elspeth Emblem, 11, -, -, -, Emblem - Elspeth, Eric Deschamps, Creatures you control get +2/+2 and have flying. -BNG - Born of the Gods (2014-02-07) - +BNG - Born of the Gods (2014-02-07) + Soldier, 1, W, 1|1, League, Enchantment Creature - Soldier, Ryan Barger, - Bird, 1, W, 1|1, -, Creature - Bird, Clint Cearly, Flying Cat Soldier, 2, W, 1|1, -, Creature - Cat Soldier, Scott Chou, Vigilance @@ -462,14 +462,14 @@ Elemental, 7, R, 3|1, -, Enchantment Creature - Elemental, Greg Staples, - Centaur, 8, G, 3|3, -, Enchantment Creature - Centaur, Ryan Barger, - 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. -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� put a 9/9 blue Kraken creature token onto the battlefield. -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. +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. + +JOU - Journey into Nyx (2014-05-02) -JOU - Journey into Nyx (2014-05-02) - Minotaur, 1, R, 2|3, League, Creature - Minotaur, Scott Murphy, - Sphinx, 1, U, 4|4, -, Creature - Sphinx, Jesper Ejsing, Flying Zombie, 2, B, *|*, -, Creature - Zombie, Zack Stella, - @@ -478,15 +478,15 @@ Hydra, 4, G, *|*, -, Creature - Hydra, Steve Prescott, - Spider, 5, G, 1|3, -, Enchantment Creature - Spider, Yohann Schepacz, Reach Snake, 6, G B, 1|1, -, Enchantment Creature - Snake, Greg Staples, Deathtouch -MD1 - Modern Event Deck 2014 (2014-05-30) - +MD1 - Modern Event Deck 2014 (2014-05-30) + Soldier, 1, W, 1|1, -, Creature - Soldier, Goran Josic, - Spirit, 2, W, 1|1, -, Creature - Spirit, Kev Walker, Flying 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� creatures� enchantments� and lands you control have indestructible. + +CNS - Conspiracy (2014-06-06) -CNS - Conspiracy (2014-06-06) - Spirit, 1, W, 1|1, -, Creature - Spirit, Jeff Simpson, Flying Demon, 2, B, *|*, -, Creature - Demon, Evan Shipard, Flying Zombie, 3, B, 2|2, -, Creature - Zombie, Lucas Graciano, - @@ -495,10 +495,10 @@ Elephant, 5, G, 3|3, -, Creature - Elephant, Lars Grant-West, - Squirrel, 6, G, 1|1, -, Creature - Squirrel, Daniel Ljunggren, - Wolf, 7, G, 2|2, -, Creature - Wolf, Raoul Vitale, - 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� gain control of those permanents. + +M15 - Magic 2015 Core Set (2014-07-18) -M15 - Magic 2015 Core Set (2014-07-18) - Wolf, 001, G, 1|1, Pre-Release, Creature - Wolf, David Palumbo, - Sliver, 001, -, 1|1, -, Creature - Sliver, Igor Kieryluk, - Squid, 001, U, 1|1, League, Creature - Squid, Richard Wright, Islandwalk @@ -510,18 +510,18 @@ 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. Goblin, 008, R, 1|1, -, Creature - Goblin, Karl Kopinski, - 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� 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. -Land Mine, 012, -, -, -, Artifact, Kev Walker, {R}‚ 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. -Garruk Emblem, 014, -, -, -, Emblem - Garruk, Tyler Jacobson, Whenever a creature attacks you‚ it gets +5/+5 and gains trample until end of turn. +Land Mine, 012, -, -, -, Artifact, Kev Walker, {R}� 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. +Garruk Emblem, 014, -, -, -, Emblem - Garruk, Tyler Jacobson, Whenever a creature attacks you� 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) - Goblin, 082, R, 1|1, -, Creature - Goblin, Karl Kopinski, - -KTK - Khans of Tarkir (2014-09-26) - +KTK - Khans of Tarkir (2014-09-26) + Warrior, 001, W, 1|1, League, Creature - Warrior, Winona Nelson, - Bird, 001, W, 3|4, -, Creature - Bird, Mark Zug, Flying Spirit, 002, W, 1|1, -, Creature - Spirit, Mike Sass, Flying @@ -534,11 +534,11 @@ Bear, 008, G, 4|4, -, Creature - Bear, Kev Walker, - Snake, 009, G, 1|1, -, Creature - Snake, Lars Grant-West, - 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.) -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. -Sorin Emblem, 013, -, -, -, Emblem - Sorin, Cynthia Sheppard, At the beginning of each opponent's upkeep‚ that player sacrifices a creature. +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. +Sorin Emblem, 013, -, -, -, Emblem - Sorin, Cynthia Sheppard, At the beginning of each opponent's upkeep� that player sacrifices a creature. + +C14 - Commander 2014 (2014-11-07) -C14 - Commander 2014 (2014-11-07) - Angel, 001, W, 4|4, -, Creature - Angel, Anthony Palumbo, Flying Cat, 002, W, 2|2, -, Creature - Cat, Scott Chou, - Goat, 003, W, -, -, Creature - Goat, Adam Paquette, - @@ -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 Soldier, 006, W, 1|1, -, Creature - Soldier, Goran Josic, - 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� 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." 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� put a 9/9 blue Kraken creature token onto the battlefield. Zombie, 011, U, *|*, -, Creature - Zombie, Dave Kendall, - Demon, 012, B, *|*, -, Creature - Demon, Pete Venters, Flying Demon, 013, B, 5|5, -, Creature - Demon, Kev Walker, Flying @@ -573,47 +573,47 @@ Tuktuk The Returned, 031, -, 5|5, -, Legendary Artifact Creature - Goblin Golem, Wurm, 032, -, 3|3, -, Artifact Creature - Wurm, Raymond Swanland, Deathtouch 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. -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. -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. +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. +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. + +DD3_EVG - Duel Decks Anthology� Elves vs. Goblins (2014-12-05) -DD3_EVG - Duel Decks Anthology‚ Elves vs. Goblins (2014-12-05) - Elemental, 001, G, 7|7, -, Creature - Elemental, Anthony S. Waters, Trample Elf Warrior, 002, G, 1|1, -, Creature - Elf Warrior, Dominick Domingo, - 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� Jace vs. Chandra (2014-12-05) + 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� Divine vs. Demonic (2014-12-05) + Spirit, 005, W, 1|1, -, Creature - Spirit, Luca Zontini, Flying Demon, 006, B, *|*, -, Creature - Demon, Pete Venters, Flying Thrull, 007, B, -, -, Creature - Thrull, Veronique Meignaud, - -DD3_GVL - Duel Decks Anthology‚ Garruk vs. Liliana (2014-12-05) - +DD3_GVL - Duel Decks Anthology� Garruk vs. Liliana (2014-12-05) + Beast, 008, G, 3|3, -, Creature - Beast, John Donahue, - Beast, 009, G, 4|4, -, Creature - Beast, Steve Prescott, - Elephant, 010, G, 3|3, -, Creature - Elephant, Arnie Swekel, - Bat, 011, B, 1|1, -, Creature - Bat, Wayne Reynolds, Flying -FRF - Fate Reforged (2015-01-23) - +FRF - Fate Reforged (2015-01-23) + Monk, 001, W, 1|1, -, Creature - Monk, Steven Belledin, Prowess Monk, 001T, W, 1|1, League, Creature - Monk, Magali Villeneuve, Prowess Spirit, 002, W, 1|1, -, Creature - Spirit, Aaron Miller, Flying Warrior, 003, B, 2|1, -, Creature - Warrior, Zoltan Boros, - Manifest, 004, -, 2|2, -, Creature, Raymond Swanland, (You can cover a face-down manifested creature with this reminder card. A manifested creature card can be turned face up any time for its mana cost. A face-down card can also be turned face up for its morph cost.) -DDO - Duel Decks: Elspeth vs. Kiora (2015-02-27) - +DDO - Duel Decks: Elspeth vs. Kiora (2015-02-27) + Soldier, 066, W, 1|1, -, Creature - Soldier, Svetlin Velinov, - Kraken, 067, U, 9|9, -, Creature - Kraken, Dan Scott, - -DTK - Dragons of Tarkir (2015-03-27) - +DTK - Dragons of Tarkir (2015-03-27) + Warrior, 001, W, 1|1, -, Creature - Warrior, Aaron Miller, - Djinn Monk, 002, U, 2|2, -, Creature - Djinn Monk, Izzy, Flying Zombie, 003, B, 2|2, -, Creature - Zombie, Vincent Proce, - @@ -623,8 +623,8 @@ Goblin, 006, R, 1|1, -, Creature - Goblin, Mike Bierek, - Morph, 007, -, 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.) Narset Emblem, 008, -, -, -, Emblem - Narset, Magali Villeneuve, Your opponents can't cast noncreature spells. -MM2 - Modern Masters 2015 Edition (2015-05-22) - +MM2 - Modern Masters 2015 Edition (2015-05-22) + Eldrazi Spawn, 001, -, -, -, Creature - Eldrazi Spawn, Aleksi Briclot, Sacrifice this creature: Add {1} to your mana pool. Eldrazi Spawn, 002, -, -, -, Creature - Eldrazi Spawn, Mark Tedin, Sacrifice this creature: Add {1} to your mana pool. Eldrazi Spawn, 003, -, -, -, Creature - Eldrazi Spawn, Veronique Meignaud, Sacrifice this creature: Add {1} to your mana pool. @@ -642,33 +642,33 @@ Worm, 014, B G, 1|1, -, Creature - Worm, Chuck Lukacs, - Golem, 015, -, 3|3, -, Artifact Creature - Golem, Nic Klein, - Myr, 016, -, 1|1, -, Artifact Creature - Myr, Ryan Pancoast, - -ORI - Magic Origins (2015-07-17) - +ORI - Magic Origins (2015-07-17) + Angel, 001, W, 4|4, -, Creature - Angel, Cyril Van Der Haegen, Flying Knight, 002, W, 2|2, -, Creature - Knight, Matt Stewart, Vigilance Soldier, 003, W, 1|1, -, Creature - Soldier, Steve Prescott, - Demon, 004, B, 5|5, -, Creature - Demon, Kev Walker, Flying Zombie, 005, B, 2|2, -, Creature - Zombie, Lucas Graciano, - Goblin, 006, R, 1|1, -, Creature - Goblin, Brandon Kitkouski, - -Ashaya‚ the Awoken World, 007, G, 4|4, -, Legendary Creature - Elemental, Raymond Swanland, - +Ashaya� the Awoken World, 007, G, 4|4, -, Legendary Creature - Elemental, Raymond Swanland, - Elemental, 008, G, 2|2, -, Creature - Elemental, Marco Nelor, - Elf Warrior, 009, G, 1|1, -, Creature - Elf Warrior, William O'Connor, - Thopter, 010, -, 1|1, -, Artifact Creature - Thopter, Adam Paquette, 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. -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. -Chandra Emblem, 014, -, -, -, Emblem - Chandra, Eric Deschamps, At the beginning of your upkeep‚ this emblem deals 3 damage to you. +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. +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. +Chandra Emblem, 014, -, -, -, Emblem - Chandra, Eric Deschamps, At the beginning of your upkeep� 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) - Eldrazi Spawn, 076, -, -, -, Creature - Eldrazi Spawn, Aleksi Briclot, Sacrifice this creature: Add {1} to your mana pool. Eldrazi Spawn, 077, -, -, -, Creature - Eldrazi Spawn, Veronique Meignaud, Sacrifice this creature: Add {1} to your mana pool. Eldrazi Spawn, 078, -, -, -, Creature - Eldrazi Spawn, Mark Tedin, Sacrifice this creature: Add {1} to your mana pool. Hellion, 079, R, 4|4, -, Creature - Hellion, Anthony Francisco, - Plant, 080, G, -, -, Creature - Plant, Daren Bader, - -BFZ - Battle for Zendikar (2015-10-09) - +BFZ - Battle for Zendikar (2015-10-09) + Eldrazi, 001, -, 10|10, -, Creature - Eldrazi, Jack Wang, - Eldrazi Scion, 002, -, 1|1, -, Creature - Eldrazi Scion, Izzy, Sacrifice this creature: Add {1} to your mana pool. Eldrazi Scion, 003, -, 1|1, -, Creature - Eldrazi Scion, Winona Nelson, Sacrifice this creature: Add {1} to your mana pool. @@ -678,14 +678,14 @@ Kor Ally, 006, W, 1|1, -, Creature - Kor Ally, Jeremy Wilson, - Octopus, 007, U, 8|8, -, Creature - Octopus, Craig J Spearing, - Dragon, 008, R, 5|5, -, Creature - Dragon, Raymond Swanland, Flying 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� Haste Elemental, 011, G R, 5|5, -, Creature - Elemental, Brad Rigney, - Gideon Emblem, 012, -, -, -, Emblem - Gideon, Eric Deschamps, - Nixilis Emblem, 013, -, -, -, Emblem - Nixilis, Chris Rahn, - Kiora Emblem, 014, -, -, -, Emblem - Kiora, Jason Chan, - -C15 - Commander 2015 (2015-11-13) - +C15 - Commander 2015 (2015-11-13) + Shapeshifter, 001, -, 1|1, -, Creature - Shapeshifter, Franz Vohwinkel, Changeling Angel, 002, W, 4|4, -, Creature - Angel, Cyril Van Der Haegen, Flying Cat, 003, W, 2|2, -, Creature - Cat, Jesper Ejsing, - @@ -696,7 +696,7 @@ Germ, 007, B, -, -, Creature - Germ, Igor Kieryluk, - Zombie, 008, B, 2|2, -, Creature - Zombie, Lucas Graciano, - Dragon, 009, R, 5|5, -, Creature - Dragon, Jim Pavelec, Flying 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� Haste At the beginning of your end step� sacrifice this creature. Bear, 012, G, 2|2, -, Creature - Bear, Heather Hudson, - Beast, 013, G, 4|4, -, Creature - Beast, Svetlin Velinov, - 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 Snake, 021, G U, 1|1, -, Creature - Snake, Christopher Moeller, - 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. + +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� 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� 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.' diff --git a/Mage.Common/src/mage/view/CardsView.java b/Mage.Common/src/mage/view/CardsView.java index f36ba02d9b5..4d8518493d7 100644 --- a/Mage.Common/src/mage/view/CardsView.java +++ b/Mage.Common/src/mage/view/CardsView.java @@ -36,7 +36,6 @@ import mage.MageObject; import mage.abilities.Ability; import mage.abilities.effects.Effect; import mage.cards.Card; -import mage.constants.CardType; import mage.constants.Zone; import mage.game.Game; import mage.game.GameState; @@ -112,19 +111,13 @@ public class CardsView extends LinkedHashMap { case COMMAND: sourceObject = game.getObject(ability.getSourceId()); if (sourceObject instanceof Emblem) { - Card planeswalkerCard = game.getCard(((Emblem) sourceObject).getSourceId()); - if (planeswalkerCard != null) { - if (!planeswalkerCard.getCardType().contains(CardType.PLANESWALKER)) { - if (planeswalkerCard.getSecondCardFace() != null) { - planeswalkerCard = planeswalkerCard.getSecondCardFace(); - } - } - 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."); - } +// Card sourceCard = (Card) ((Emblem) sourceObject).getSourceObject(); +// if (sourceCard == null) { +// throw new IllegalArgumentException("Source card for emblem not found."); +// } + abilityView = new AbilityView(ability, sourceObject.getName(), new CardView(new EmblemView((Emblem) sourceObject))); + abilityView.setName(((Emblem) sourceObject).getName()); + // abilityView.setExpansionSetCode(sourceCard.getExpansionSetCode()); } break; } diff --git a/Mage.Common/src/mage/view/EmblemView.java b/Mage.Common/src/mage/view/EmblemView.java index 1681f05de90..807bd0c1f52 100644 --- a/Mage.Common/src/mage/view/EmblemView.java +++ b/Mage.Common/src/mage/view/EmblemView.java @@ -24,7 +24,7 @@ public class EmblemView implements CommandObjectView, Serializable { } else { expansionSetCode = emblem.getExpansionSetCodeForImage(); } - + rules = emblem.getAbilities().getRules(sourceCard.getName()); } diff --git a/Mage.Common/src/mage/view/GameView.java b/Mage.Common/src/mage/view/GameView.java index d0fae59a0fc..5ee494809da 100644 --- a/Mage.Common/src/mage/view/GameView.java +++ b/Mage.Common/src/mage/view/GameView.java @@ -36,7 +36,6 @@ import java.util.UUID; import mage.MageObject; import mage.abilities.costs.Cost; import mage.cards.Card; -import mage.constants.CardType; import mage.constants.PhaseStep; import mage.constants.TurnPhase; 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))); checkPaid(stackObject.getId(), (StackAbility) stackObject); } else if (object instanceof Emblem) { - Card sourceCard = game.getCard(((Emblem) object).getSourceId()); - CardView cardView; - if (sourceCard != null) { - if (!sourceCard.getCardType().contains(CardType.PLANESWALKER)) { - 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)); - } + CardView cardView = new CardView(new EmblemView((Emblem) object)); + // Card sourceCard = (Card) ((Emblem) object).getSourceObject(); + ((StackAbility) stackObject).setName(((Emblem) object).getName()); + // ((StackAbility) stackObject).setExpansionSetCode(sourceCard.getExpansionSetCode()); stack.put(stackObject.getId(), new StackAbilityView(game, (StackAbility) stackObject, object.getName(), cardView)); checkPaid(stackObject.getId(), ((StackAbility) stackObject)); diff --git a/Mage.Common/src/mage/view/PlayerView.java b/Mage.Common/src/mage/view/PlayerView.java index 9627c470a5d..86f87c0a704 100644 --- a/Mage.Common/src/mage/view/PlayerView.java +++ b/Mage.Common/src/mage/view/PlayerView.java @@ -35,7 +35,6 @@ import java.util.List; import java.util.Map; import java.util.UUID; import mage.cards.Card; -import mage.constants.CardType; import mage.counters.Counters; import mage.game.ExileZone; import mage.game.Game; @@ -139,17 +138,7 @@ public class PlayerView implements Serializable { if (commandObject instanceof Emblem) { Emblem emblem = (Emblem) commandObject; if (emblem.getControllerId().equals(this.playerId)) { - Card sourceCard = game.getCard(((CommandObject) emblem).getSourceId()); - 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)); - } + commandList.add(new EmblemView(emblem)); } } else if (commandObject instanceof Commander) { Commander commander = (Commander) commandObject; diff --git a/Mage.Server.Plugins/Mage.Game.MomirDuel/src/mage/game/MomirDuel.java b/Mage.Server.Plugins/Mage.Game.MomirDuel/src/mage/game/MomirDuel.java index 1b41a76423b..e2181c83b2c 100644 --- a/Mage.Server.Plugins/Mage.Game.MomirDuel/src/mage/game/MomirDuel.java +++ b/Mage.Server.Plugins/Mage.Game.MomirDuel/src/mage/game/MomirDuel.java @@ -87,7 +87,8 @@ public class MomirDuel extends GameImpl { for (UUID playerId : state.getPlayerList(startingPlayerId)) { Player player = getPlayer(playerId); 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); @@ -122,8 +123,8 @@ public class MomirDuel extends GameImpl { class MomirEmblem extends Emblem { public MomirEmblem() { - setName("Momir Vig, Simic Visionary"); - //TODO: setExpansionSetCodeForImage(???); + setName("Emblem Momir Vig, Simic Visionary"); + 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. LimitedTimesPerTurnActivatedAbility ability = new LimitedTimesPerTurnActivatedAbility(Zone.COMMAND, new MomirEffect(), new VariableManaCost()); ability.addCost(new DiscardCardCost()); diff --git a/Mage.Sets/src/mage/cards/a/AjaniSteadfast.java b/Mage.Sets/src/mage/cards/a/AjaniSteadfast.java index 2e665a43e95..23794e9046c 100644 --- a/Mage.Sets/src/mage/cards/a/AjaniSteadfast.java +++ b/Mage.Sets/src/mage/cards/a/AjaniSteadfast.java @@ -72,7 +72,7 @@ public class AjaniSteadfast extends CardImpl { } 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.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); @@ -117,7 +117,7 @@ public class AjaniSteadfast extends CardImpl { class AjaniSteadfastEmblem extends Emblem { public AjaniSteadfastEmblem() { - setName("EMBLEM: Ajani Steadfast"); + setName("Emblem Ajani"); this.getAbilities().add(new SimpleStaticAbility(Zone.COMMAND, new AjaniSteadfastPreventEffect())); this.setExpansionSetCodeForImage("M15"); } diff --git a/Mage.Sets/src/mage/cards/a/ArlinnEmbracedByTheMoon.java b/Mage.Sets/src/mage/cards/a/ArlinnEmbracedByTheMoon.java index f900c462fbf..3f47888a3f0 100644 --- a/Mage.Sets/src/mage/cards/a/ArlinnEmbracedByTheMoon.java +++ b/Mage.Sets/src/mage/cards/a/ArlinnEmbracedByTheMoon.java @@ -63,7 +63,7 @@ public class ArlinnEmbracedByTheMoon extends CardImpl { private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Creatures you control"); 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.color.setRed(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.'" public ArlinnEmbracedByTheMoonEmblem() { - this.setName("EMBLEM: Arlinn, Embraced by the Moon"); + this.setName("Emblem Arlinn"); FilterPermanent filter = new FilterControlledCreaturePermanent("Creatures"); GainAbilityControlledEffect effect = new GainAbilityControlledEffect(HasteAbility.getInstance(), Duration.EndOfGame, filter); effect.setText("Creatures you control have haste"); diff --git a/Mage.Sets/src/mage/cards/c/ChandraRoaringFlame.java b/Mage.Sets/src/mage/cards/c/ChandraRoaringFlame.java index fe25c84c28f..82b9def82df 100644 --- a/Mage.Sets/src/mage/cards/c/ChandraRoaringFlame.java +++ b/Mage.Sets/src/mage/cards/c/ChandraRoaringFlame.java @@ -56,7 +56,7 @@ import mage.target.common.TargetCreaturePermanent; public class ChandraRoaringFlame extends CardImpl { 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.color.setRed(true); @@ -120,7 +120,7 @@ class ChandraRoaringFlameEmblemEffect extends OneShotEffect { } } for (Player opponent : opponentsEmblem) { - game.addEmblem(new ChandraRoaringFlameEmblem(), source, opponent.getId()); + game.addEmblem(new ChandraRoaringFlameEmblem(), source.getSourceObject(game), opponent.getId()); } } return false; @@ -134,7 +134,8 @@ class ChandraRoaringFlameEmblemEffect extends OneShotEffect { class ChandraRoaringFlameEmblem extends Emblem { public ChandraRoaringFlameEmblem() { - setName("EMBLEM: Chandra, Roaring Flame"); + setName("Emblem Chandra"); + setExpansionSetCodeForImage("ORI"); Effect effect = new DamageTargetEffect(3); effect.setText("this emblem deals 3 damage to you"); this.getAbilities().add(new BeginningOfUpkeepTriggeredAbility(Zone.COMMAND, effect, TargetController.YOU, false, true)); diff --git a/Mage.Sets/src/mage/cards/c/ChandraTorchOfDefiance.java b/Mage.Sets/src/mage/cards/c/ChandraTorchOfDefiance.java index 2f1a1f0d077..36d0bc9a566 100644 --- a/Mage.Sets/src/mage/cards/c/ChandraTorchOfDefiance.java +++ b/Mage.Sets/src/mage/cards/c/ChandraTorchOfDefiance.java @@ -63,7 +63,7 @@ import mage.target.common.TargetCreaturePermanent; public class ChandraTorchOfDefiance extends CardImpl { 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.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." public ChandraTorchOfDefianceEmblem() { - this.setName("Emblem - Chandra, Torch of Defiance"); + this.setName("Emblem Chandra"); Effect effect = new DamageTargetEffect(5); 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); diff --git a/Mage.Sets/src/mage/cards/d/DackFayden.java b/Mage.Sets/src/mage/cards/d/DackFayden.java index 1e034e1a7ad..42c2af272a6 100644 --- a/Mage.Sets/src/mage/cards/d/DackFayden.java +++ b/Mage.Sets/src/mage/cards/d/DackFayden.java @@ -67,7 +67,7 @@ import mage.target.common.TargetArtifactPermanent; public class DackFayden extends CardImpl { 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.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); @@ -107,7 +107,7 @@ public class DackFayden extends CardImpl { class DackFaydenEmblem extends Emblem { DackFaydenEmblem() { - this.setName("EMBLEM: Dack Fayden"); + this.setName("Emblem Dack"); this.getAbilities().add(new DackFaydenEmblemTriggeredAbility()); } } diff --git a/Mage.Sets/src/mage/cards/d/DarettiScrapSavant.java b/Mage.Sets/src/mage/cards/d/DarettiScrapSavant.java index bf94a11a65a..ef03ad53ff1 100644 --- a/Mage.Sets/src/mage/cards/d/DarettiScrapSavant.java +++ b/Mage.Sets/src/mage/cards/d/DarettiScrapSavant.java @@ -68,7 +68,7 @@ import mage.target.targetpointer.FixedTarget; public class DarettiScrapSavant extends CardImpl { 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.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." public DarettiScrapSavantEmblem() { - this.setName("Emblem - Daretti"); this.getAbilities().add(new DarettiScrapSavantTriggeredAbility()); } } diff --git a/Mage.Sets/src/mage/cards/d/DomriRade.java b/Mage.Sets/src/mage/cards/d/DomriRade.java index d64cb310d6c..13751716963 100644 --- a/Mage.Sets/src/mage/cards/d/DomriRade.java +++ b/Mage.Sets/src/mage/cards/d/DomriRade.java @@ -66,7 +66,7 @@ import mage.target.common.TargetCreaturePermanent; public class DomriRade extends CardImpl { 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.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); @@ -79,7 +79,7 @@ public class DomriRade extends CardImpl { TargetControlledCreaturePermanent target = new TargetControlledCreaturePermanent(); target.setTargetTag(1); ability2.addTarget(target); - + FilterCreaturePermanent filter = new FilterCreaturePermanent("another creature to fight"); filter.add(new AnotherTargetPredicate(2)); TargetCreaturePermanent target2 = new TargetCreaturePermanent(filter); @@ -145,7 +145,7 @@ class DomriRadeEmblem extends Emblem { // "Creatures you control have double strike, trample, hexproof and haste." public DomriRadeEmblem() { - this.setName("EMBLEM: Domri Rade"); + this.setName("Emblem Domri"); FilterPermanent filter = new FilterControlledCreaturePermanent("Creatures"); GainAbilityControlledEffect effect = new GainAbilityControlledEffect(DoubleStrikeAbility.getInstance(), Duration.EndOfGame, filter); Ability ability = new SimpleStaticAbility(Zone.COMMAND, effect); diff --git a/Mage.Sets/src/mage/cards/d/DovinBaan.java b/Mage.Sets/src/mage/cards/d/DovinBaan.java index a7c8db198e2..6979c1b5385 100644 --- a/Mage.Sets/src/mage/cards/d/DovinBaan.java +++ b/Mage.Sets/src/mage/cards/d/DovinBaan.java @@ -1,158 +1,158 @@ -/* - * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * 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 - * or implied, of BetaSteward_at_googlemail.com. - */ -package mage.cards.d; - -import java.util.UUID; -import mage.abilities.Ability; -import mage.abilities.LoyaltyAbility; -import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; -import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; -import mage.abilities.effects.Effect; -import mage.abilities.effects.RestrictionUntapNotMoreThanEffect; -import mage.abilities.effects.common.DrawCardSourceControllerEffect; -import mage.abilities.effects.common.GainLifeEffect; -import mage.abilities.effects.common.GetEmblemEffect; -import mage.abilities.effects.common.continuous.BoostTargetEffect; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.constants.Zone; -import mage.filter.common.FilterControlledPermanent; -import mage.game.Game; -import mage.game.command.Emblem; -import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; -import mage.players.Player; -import mage.target.common.TargetCreaturePermanent; - -/** - * - * @author emerald000 - */ -public class DovinBaan extends CardImpl { - - public DovinBaan(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{2}{W}{U}"); - this.subtype.add("Dovin"); - - this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); - - // +1: Until your next turn, up to one target creature gets -3/-0 and its activated abilities can't be activated. - Effect effect = new BoostTargetEffect(-3, 0, Duration.UntilYourNextTurn); - effect.setText("Until your next turn, up to one target creature gets -3/-0"); - Ability ability = new LoyaltyAbility(effect, 1); - ability.addTarget(new TargetCreaturePermanent(0, 1)); - ability.addEffect(new DovinBaanCantActivateAbilitiesEffect()); - this.addAbility(ability); - - // -1: You gain 2 life and draw a card. - ability = new LoyaltyAbility(new GainLifeEffect(2), -1); - effect = new DrawCardSourceControllerEffect(1); - effect.setText("and draw a card"); - ability.addEffect(effect); - this.addAbility(ability); - - // -7: You get an emblem with "Your opponents can't untap more than two permanents during their untap steps." - this.addAbility(new LoyaltyAbility(new GetEmblemEffect(new DovinBaanEmblem()), -7)); - } - - public DovinBaan(final DovinBaan card) { - super(card); - } - - @Override - public DovinBaan copy() { - return new DovinBaan(this); - } -} - -class DovinBaanCantActivateAbilitiesEffect extends ContinuousRuleModifyingEffectImpl { - - DovinBaanCantActivateAbilitiesEffect() { - super(Duration.UntilYourNextTurn, Outcome.UnboostCreature); - staticText = "and its activated abilities can't be activated"; - } - - DovinBaanCantActivateAbilitiesEffect(final DovinBaanCantActivateAbilitiesEffect effect) { - super(effect); - } - - @Override - public DovinBaanCantActivateAbilitiesEffect copy() { - return new DovinBaanCantActivateAbilitiesEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - return true; - } - - @Override - public boolean checksEventType(GameEvent event, Game game) { - return event.getType() == EventType.ACTIVATE_ABILITY; - } - - @Override - public boolean applies(GameEvent event, Ability source, Game game) { - return event.getSourceId().equals(this.getTargetPointer().getFirst(game, source)); - } -} - -class DovinBaanEmblem extends Emblem { - - DovinBaanEmblem() { - this.setName("EMBLEM: Dovin Baan"); - Ability ability = new SimpleStaticAbility(Zone.COMMAND, new DovinBaanCantUntapEffect()); - this.getAbilities().add(ability); - } -} - -class DovinBaanCantUntapEffect extends RestrictionUntapNotMoreThanEffect { - - DovinBaanCantUntapEffect() { - super(Duration.WhileOnBattlefield, 2, new FilterControlledPermanent()); - staticText = "Your opponents can't untap more than two permanents during their untap steps."; - } - - DovinBaanCantUntapEffect(final DovinBaanCantUntapEffect effect) { - super(effect); - } - - @Override - public boolean applies(Player player, Ability source, Game game) { - return game.getOpponents(source.getControllerId()).contains(player.getId()); - } - - @Override - public DovinBaanCantUntapEffect copy() { - return new DovinBaanCantUntapEffect(this); - } -} +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * 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 + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.cards.d; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.LoyaltyAbility; +import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.RestrictionUntapNotMoreThanEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.effects.common.GetEmblemEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.filter.common.FilterControlledPermanent; +import mage.game.Game; +import mage.game.command.Emblem; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.players.Player; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author emerald000 + */ +public class DovinBaan extends CardImpl { + + public DovinBaan(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{2}{W}{U}"); + this.subtype.add("Dovin"); + + this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); + + // +1: Until your next turn, up to one target creature gets -3/-0 and its activated abilities can't be activated. + Effect effect = new BoostTargetEffect(-3, 0, Duration.UntilYourNextTurn); + effect.setText("Until your next turn, up to one target creature gets -3/-0"); + Ability ability = new LoyaltyAbility(effect, 1); + ability.addTarget(new TargetCreaturePermanent(0, 1)); + ability.addEffect(new DovinBaanCantActivateAbilitiesEffect()); + this.addAbility(ability); + + // -1: You gain 2 life and draw a card. + ability = new LoyaltyAbility(new GainLifeEffect(2), -1); + effect = new DrawCardSourceControllerEffect(1); + effect.setText("and draw a card"); + ability.addEffect(effect); + this.addAbility(ability); + + // -7: You get an emblem with "Your opponents can't untap more than two permanents during their untap steps." + this.addAbility(new LoyaltyAbility(new GetEmblemEffect(new DovinBaanEmblem()), -7)); + } + + public DovinBaan(final DovinBaan card) { + super(card); + } + + @Override + public DovinBaan copy() { + return new DovinBaan(this); + } +} + +class DovinBaanCantActivateAbilitiesEffect extends ContinuousRuleModifyingEffectImpl { + + DovinBaanCantActivateAbilitiesEffect() { + super(Duration.UntilYourNextTurn, Outcome.UnboostCreature); + staticText = "and its activated abilities can't be activated"; + } + + DovinBaanCantActivateAbilitiesEffect(final DovinBaanCantActivateAbilitiesEffect effect) { + super(effect); + } + + @Override + public DovinBaanCantActivateAbilitiesEffect copy() { + return new DovinBaanCantActivateAbilitiesEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType() == EventType.ACTIVATE_ABILITY; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + return event.getSourceId().equals(this.getTargetPointer().getFirst(game, source)); + } +} + +class DovinBaanEmblem extends Emblem { + + DovinBaanEmblem() { + this.setName("Emblem Dovin"); + Ability ability = new SimpleStaticAbility(Zone.COMMAND, new DovinBaanCantUntapEffect()); + this.getAbilities().add(ability); + } +} + +class DovinBaanCantUntapEffect extends RestrictionUntapNotMoreThanEffect { + + DovinBaanCantUntapEffect() { + super(Duration.WhileOnBattlefield, 2, new FilterControlledPermanent()); + staticText = "Your opponents can't untap more than two permanents during their untap steps."; + } + + DovinBaanCantUntapEffect(final DovinBaanCantUntapEffect effect) { + super(effect); + } + + @Override + public boolean applies(Player player, Ability source, Game game) { + return game.getOpponents(source.getControllerId()).contains(player.getId()); + } + + @Override + public DovinBaanCantUntapEffect copy() { + return new DovinBaanCantUntapEffect(this); + } +} diff --git a/Mage.Sets/src/mage/cards/e/ElspethKnightErrant.java b/Mage.Sets/src/mage/cards/e/ElspethKnightErrant.java index 3379988d341..2fc1cf28108 100644 --- a/Mage.Sets/src/mage/cards/e/ElspethKnightErrant.java +++ b/Mage.Sets/src/mage/cards/e/ElspethKnightErrant.java @@ -60,7 +60,7 @@ import mage.target.common.TargetCreaturePermanent; public class ElspethKnightErrant extends CardImpl { 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.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); @@ -100,7 +100,7 @@ public class ElspethKnightErrant extends CardImpl { class ElspethKnightErrantEmblem extends Emblem { public ElspethKnightErrantEmblem() { - this.setName("EMBLEM: Elspeth, Knight-Errant"); + this.setName("Emblem Elspeth"); FilterControlledPermanent filter = new FilterControlledPermanent("Artifacts, creatures, enchantments, and lands you control"); filter.add(Predicates.or( new CardTypePredicate(CardType.ARTIFACT), diff --git a/Mage.Sets/src/mage/cards/e/ElspethSunsChampion.java b/Mage.Sets/src/mage/cards/e/ElspethSunsChampion.java index e926146b8a8..b6c4e56f8d0 100644 --- a/Mage.Sets/src/mage/cards/e/ElspethSunsChampion.java +++ b/Mage.Sets/src/mage/cards/e/ElspethSunsChampion.java @@ -62,7 +62,7 @@ public class ElspethSunsChampion extends CardImpl { } 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.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); @@ -91,7 +91,7 @@ class ElspethSunsChampionEmblem extends Emblem { private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Creatures"); 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.addEffect(new GainAbilityControlledEffect(FlyingAbility.getInstance(), Duration.EndOfGame, filter)); this.getAbilities().add(ability); diff --git a/Mage.Sets/src/mage/cards/g/GarrukApexPredator.java b/Mage.Sets/src/mage/cards/g/GarrukApexPredator.java index f8a8c845427..435922722e8 100644 --- a/Mage.Sets/src/mage/cards/g/GarrukApexPredator.java +++ b/Mage.Sets/src/mage/cards/g/GarrukApexPredator.java @@ -75,7 +75,7 @@ public class GarrukApexPredator extends CardImpl { } 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.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); @@ -166,7 +166,7 @@ class GarrukApexPredatorBeastToken extends Token { class GarrukApexPredatorEmblem extends Emblem { public GarrukApexPredatorEmblem() { - setName("EMBLEM: Garruk, Apex Predator"); + setName("Emblem Garruk"); Effect effect = new BoostTargetEffect(5, 5, Duration.EndOfTurn); effect.setText("it gets +5/+5"); Ability ability = new AttackedByCreatureTriggeredAbility(Zone.COMMAND, effect, false, SetTargetPointer.PERMANENT); diff --git a/Mage.Sets/src/mage/cards/g/GarrukCallerOfBeasts.java b/Mage.Sets/src/mage/cards/g/GarrukCallerOfBeasts.java index 0f4b81bcb7b..76d3456416f 100644 --- a/Mage.Sets/src/mage/cards/g/GarrukCallerOfBeasts.java +++ b/Mage.Sets/src/mage/cards/g/GarrukCallerOfBeasts.java @@ -63,7 +63,7 @@ public class GarrukCallerOfBeasts extends CardImpl { } 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.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); @@ -102,7 +102,7 @@ class GarrukCallerOfBeastsEmblem extends Emblem { } 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); Ability ability = new SpellCastControllerTriggeredAbility(Zone.COMMAND, effect, filter, true, false); this.getAbilities().add(ability); diff --git a/Mage.Sets/src/mage/cards/g/GideonAllyOfZendikar.java b/Mage.Sets/src/mage/cards/g/GideonAllyOfZendikar.java index 2b592171c8e..b2ac452716d 100644 --- a/Mage.Sets/src/mage/cards/g/GideonAllyOfZendikar.java +++ b/Mage.Sets/src/mage/cards/g/GideonAllyOfZendikar.java @@ -55,7 +55,7 @@ import mage.game.permanent.token.Token; public class GideonAllyOfZendikar extends CardImpl { 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.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); @@ -87,7 +87,7 @@ public class GideonAllyOfZendikar extends CardImpl { class GideonAllyOfZendikarEmblem extends Emblem { public GideonAllyOfZendikarEmblem() { - this.setName("EMBLEM: Gideon, Ally of Zendikar"); + this.setName("Emblem Gideon"); BoostControlledEffect effect = new BoostControlledEffect(1, 1, Duration.EndOfGame); Ability ability = new SimpleStaticAbility(Zone.COMMAND, effect); this.getAbilities().add(ability); diff --git a/Mage.Sets/src/mage/cards/j/JaceTelepathUnbound.java b/Mage.Sets/src/mage/cards/j/JaceTelepathUnbound.java index f3525e7d143..c6fd34c9e08 100644 --- a/Mage.Sets/src/mage/cards/j/JaceTelepathUnbound.java +++ b/Mage.Sets/src/mage/cards/j/JaceTelepathUnbound.java @@ -67,7 +67,7 @@ import mage.target.targetpointer.FixedTarget; public class JaceTelepathUnbound extends CardImpl { 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.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". public JaceTelepathUnboundEmblem() { - this.setName("Emblem - Jace"); + this.setName("Emblem Jace"); Effect effect = new PutTopCardOfLibraryIntoGraveTargetEffect(5); 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); diff --git a/Mage.Sets/src/mage/cards/j/JaceUnravelerOfSecrets.java b/Mage.Sets/src/mage/cards/j/JaceUnravelerOfSecrets.java index c14b482cd28..947f4259387 100644 --- a/Mage.Sets/src/mage/cards/j/JaceUnravelerOfSecrets.java +++ b/Mage.Sets/src/mage/cards/j/JaceUnravelerOfSecrets.java @@ -59,7 +59,7 @@ import mage.watchers.common.SpellsCastWatcher; public class JaceUnravelerOfSecrets extends CardImpl { 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.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); @@ -99,7 +99,8 @@ public class JaceUnravelerOfSecrets extends CardImpl { class JaceUnravelerOfSecretsEmblem extends Emblem { public JaceUnravelerOfSecretsEmblem() { - this.setName("EMBLEM: Jace, Unraveler of Secrets"); + this.setName("Emblem Jace"); + setExpansionSetCodeForImage("SOI"); Effect effect = new CounterTargetEffect(); effect.setText("counter that spell"); this.getAbilities().add(new JaceUnravelerOfSecretsTriggeredAbility(effect, false)); diff --git a/Mage.Sets/src/mage/cards/k/KioraMasterOfTheDepths.java b/Mage.Sets/src/mage/cards/k/KioraMasterOfTheDepths.java index 43217f7a055..8aba71ab02e 100644 --- a/Mage.Sets/src/mage/cards/k/KioraMasterOfTheDepths.java +++ b/Mage.Sets/src/mage/cards/k/KioraMasterOfTheDepths.java @@ -67,7 +67,7 @@ import mage.target.common.TargetLandPermanent; public class KioraMasterOfTheDepths extends CardImpl { 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.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); @@ -203,7 +203,7 @@ class KioraMasterOfTheDepthsEmblem extends Emblem { private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Creatures"); public KioraMasterOfTheDepthsEmblem() { - this.setName("EMBLEM: Kiora, Master of the Depths"); + this.setName("Emblem Kiora"); Ability ability = new EntersBattlefieldControlledTriggeredAbility(Zone.COMMAND, new KioraFightEffect(), filter, true, SetTargetPointer.PERMANENT, diff --git a/Mage.Sets/src/mage/cards/k/KioraTheCrashingWave.java b/Mage.Sets/src/mage/cards/k/KioraTheCrashingWave.java index cefdd5ffc43..2c1e964fead 100644 --- a/Mage.Sets/src/mage/cards/k/KioraTheCrashingWave.java +++ b/Mage.Sets/src/mage/cards/k/KioraTheCrashingWave.java @@ -68,7 +68,7 @@ public class KioraTheCrashingWave extends CardImpl { } 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.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(2)); @@ -164,7 +164,7 @@ class KioraPreventionEffect extends PreventionEffectImpl { class KioraEmblem extends Emblem { 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); this.getAbilities().add(ability); } diff --git a/Mage.Sets/src/mage/cards/k/KothOfTheHammer.java b/Mage.Sets/src/mage/cards/k/KothOfTheHammer.java index 70fe2b0978c..474930fc33b 100644 --- a/Mage.Sets/src/mage/cards/k/KothOfTheHammer.java +++ b/Mage.Sets/src/mage/cards/k/KothOfTheHammer.java @@ -77,7 +77,7 @@ public class KothOfTheHammer extends CardImpl { } 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.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.'" public KothOfTheHammerEmblem() { - this.setName("EMBLEM: Koth of the Hammer"); + this.setName("Emblem Koth"); this.getAbilities().add(new SimpleStaticAbility(Zone.COMMAND, new KothOfTheHammerThirdEffect())); } } diff --git a/Mage.Sets/src/mage/cards/l/LilianaDefiantNecromancer.java b/Mage.Sets/src/mage/cards/l/LilianaDefiantNecromancer.java index 12c83e1da92..ac433f8daa2 100644 --- a/Mage.Sets/src/mage/cards/l/LilianaDefiantNecromancer.java +++ b/Mage.Sets/src/mage/cards/l/LilianaDefiantNecromancer.java @@ -74,7 +74,7 @@ public class LilianaDefiantNecromancer extends CardImpl { UUID ability2Id; 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.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." public LilianaDefiantNecromancerEmblem() { - this.setName("Emblem - Liliana"); + this.setName("Emblem Liliana"); Ability ability = new DiesCreatureTriggeredAbility(Zone.COMMAND, new LilianaDefiantNecromancerEmblemEffect(), false, filter, true); this.getAbilities().add(ability); } diff --git a/Mage.Sets/src/mage/cards/l/LilianaOfTheDarkRealms.java b/Mage.Sets/src/mage/cards/l/LilianaOfTheDarkRealms.java index 67f89a5159c..96ec14246ab 100644 --- a/Mage.Sets/src/mage/cards/l/LilianaOfTheDarkRealms.java +++ b/Mage.Sets/src/mage/cards/l/LilianaOfTheDarkRealms.java @@ -72,7 +72,7 @@ public class LilianaOfTheDarkRealms extends CardImpl { } 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.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); @@ -155,7 +155,7 @@ class LilianaOfTheDarkRealmsEmblem extends Emblem { } 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()); Ability ability = new SimpleStaticAbility(Zone.COMMAND, new GainAbilityControlledEffect(manaAbility, Duration.WhileOnBattlefield, filter)); this.getAbilities().add(ability); diff --git a/Mage.Sets/src/mage/cards/l/LilianaTheLastHope.java b/Mage.Sets/src/mage/cards/l/LilianaTheLastHope.java index e4b75f42aad..47a5ea95603 100644 --- a/Mage.Sets/src/mage/cards/l/LilianaTheLastHope.java +++ b/Mage.Sets/src/mage/cards/l/LilianaTheLastHope.java @@ -64,7 +64,7 @@ import mage.target.common.TargetCreaturePermanent; public class LilianaTheLastHope extends CardImpl { 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.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); @@ -131,10 +131,11 @@ class LilianaTheLastHopeEffect extends OneShotEffect { return true; } } + class LilianaTheLastHopeEmblem extends Emblem { 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()), TargetController.YOU, null, false); this.getAbilities().add(ability); diff --git a/Mage.Sets/src/mage/cards/n/NarsetTranscendent.java b/Mage.Sets/src/mage/cards/n/NarsetTranscendent.java index 9dea85ae55a..2565deb3f8c 100644 --- a/Mage.Sets/src/mage/cards/n/NarsetTranscendent.java +++ b/Mage.Sets/src/mage/cards/n/NarsetTranscendent.java @@ -65,7 +65,7 @@ import mage.target.targetpointer.FixedTarget; public class NarsetTranscendent extends CardImpl { 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.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(6)); @@ -226,7 +226,7 @@ class NarsetTranscendentEmblem extends Emblem { public NarsetTranscendentEmblem() { - this.setName("EMBLEM: Narset Transcendent"); + this.setName("Emblem Narset"); this.getAbilities().add(new SimpleStaticAbility(Zone.COMMAND, new NarsetTranscendentCantCastEffect())); } diff --git a/Mage.Sets/src/mage/cards/n/NissaVitalForce.java b/Mage.Sets/src/mage/cards/n/NissaVitalForce.java index 63ac479e12e..1d7efabcce1 100644 --- a/Mage.Sets/src/mage/cards/n/NissaVitalForce.java +++ b/Mage.Sets/src/mage/cards/n/NissaVitalForce.java @@ -67,7 +67,7 @@ public class NissaVitalForce extends CardImpl { } 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.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." public NissaVitalForceEmblem() { - this.setName("Emblem - Nissa, Vital Force"); - Ability ability = new EntersBattlefieldAllTriggeredAbility(Zone.COMMAND, new DrawCardSourceControllerEffect(1), new FilterControlledLandPermanent("a land"), + this.setName("Emblem Nissa"); + Ability ability = new EntersBattlefieldAllTriggeredAbility(Zone.COMMAND, new DrawCardSourceControllerEffect(1), new FilterControlledLandPermanent("a land"), true, null, true); - getAbilities().add(ability); + getAbilities().add(ability); } } diff --git a/Mage.Sets/src/mage/cards/o/ObNixilisOfTheBlackOath.java b/Mage.Sets/src/mage/cards/o/ObNixilisOfTheBlackOath.java index f0530b90f4d..5ad73cae2df 100644 --- a/Mage.Sets/src/mage/cards/o/ObNixilisOfTheBlackOath.java +++ b/Mage.Sets/src/mage/cards/o/ObNixilisOfTheBlackOath.java @@ -62,7 +62,7 @@ import mage.target.common.TargetControlledCreaturePermanent; public class ObNixilisOfTheBlackOath extends CardImpl { 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.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); @@ -131,9 +131,8 @@ class ObNixilisOfTheBlackOathEffect1 extends OneShotEffect { 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." - public ObNixilisOfTheBlackOathEmblem() { - this.setName("EMBLEM: Ob Nixilis of the Black Oath"); + this.setName("Emblem Nixilis"); DynamicValue xValue = new SacrificeCostCreaturesPower(); Effect effect = new GainLifeEffect(xValue); effect.setText("You gain X life"); diff --git a/Mage.Sets/src/mage/cards/o/ObNixilisReignited.java b/Mage.Sets/src/mage/cards/o/ObNixilisReignited.java index d5e94d21830..0ff4300421c 100644 --- a/Mage.Sets/src/mage/cards/o/ObNixilisReignited.java +++ b/Mage.Sets/src/mage/cards/o/ObNixilisReignited.java @@ -54,7 +54,7 @@ import mage.target.common.TargetOpponent; public class ObNixilisReignited extends CardImpl { 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.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); @@ -94,7 +94,7 @@ public class ObNixilisReignited extends CardImpl { class ObNixilisReignitedEmblem extends Emblem { public ObNixilisReignitedEmblem() { - setName("EMBLEM: Ob Nixilis Reignited"); + setName("Emblem Nixilis"); this.getAbilities().add(new ObNixilisEmblemTriggeredAbility(new LoseLifeSourceControllerEffect(2), false)); this.setExpansionSetCodeForImage("BFZ"); diff --git a/Mage.Sets/src/mage/cards/s/SarkhanTheDragonspeaker.java b/Mage.Sets/src/mage/cards/s/SarkhanTheDragonspeaker.java index a0efd13ed5c..e2d398855d6 100644 --- a/Mage.Sets/src/mage/cards/s/SarkhanTheDragonspeaker.java +++ b/Mage.Sets/src/mage/cards/s/SarkhanTheDragonspeaker.java @@ -65,7 +65,7 @@ import mage.target.common.TargetCreaturePermanent; public class SarkhanTheDragonspeaker extends CardImpl { 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.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); @@ -166,7 +166,7 @@ class SarkhanTheDragonspeakerEffect extends ContinuousEffectImpl { class SarkhanTheDragonspeakerEmblem extends Emblem { SarkhanTheDragonspeakerEmblem() { - setName("EMBLEM: Sarkhan, the Dragonspeaker"); + setName("Emblem Sarkhan"); this.setExpansionSetCodeForImage("KTK"); this.getAbilities().add(new BeginningOfDrawTriggeredAbility(Zone.COMMAND, new DrawCardSourceControllerEffect(2), TargetController.YOU, false)); diff --git a/Mage.Sets/src/mage/cards/s/SorinLordOfInnistrad.java b/Mage.Sets/src/mage/cards/s/SorinLordOfInnistrad.java index 704aee8dc5a..0a36d49a39f 100644 --- a/Mage.Sets/src/mage/cards/s/SorinLordOfInnistrad.java +++ b/Mage.Sets/src/mage/cards/s/SorinLordOfInnistrad.java @@ -98,6 +98,7 @@ public class SorinLordOfInnistrad extends CardImpl { } class VampireToken extends Token { + VampireToken() { super("Vampire", "1/1 black Vampire creature token with lifelink"); cardType.add(CardType.CREATURE); @@ -112,7 +113,7 @@ class VampireToken extends Token { class SorinLordOfInnistradEmblem extends Emblem { public SorinLordOfInnistradEmblem() { - this.setName("EMBLEM: Sorin, Lord of Innistrad"); + this.setName("Emblem Sorin"); BoostControlledEffect effect = new BoostControlledEffect(1, 0, Duration.EndOfGame); Ability ability = new SimpleStaticAbility(Zone.COMMAND, effect); this.getAbilities().add(ability); diff --git a/Mage.Sets/src/mage/cards/s/SorinSolemnVisitor.java b/Mage.Sets/src/mage/cards/s/SorinSolemnVisitor.java index 4f909edb837..0514b3ec455 100644 --- a/Mage.Sets/src/mage/cards/s/SorinSolemnVisitor.java +++ b/Mage.Sets/src/mage/cards/s/SorinSolemnVisitor.java @@ -58,7 +58,7 @@ import mage.game.permanent.token.Token; public class SorinSolemnVisitor extends CardImpl { 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.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); @@ -97,7 +97,7 @@ public class SorinSolemnVisitor extends CardImpl { class SorinSolemnVisitorEmblem extends Emblem { 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); this.getAbilities().add(ability); } diff --git a/Mage.Sets/src/mage/cards/t/TamiyoFieldResearcher.java b/Mage.Sets/src/mage/cards/t/TamiyoFieldResearcher.java index 66f1445b8da..9c5dbd9ec9e 100644 --- a/Mage.Sets/src/mage/cards/t/TamiyoFieldResearcher.java +++ b/Mage.Sets/src/mage/cards/t/TamiyoFieldResearcher.java @@ -85,7 +85,7 @@ public class TamiyoFieldResearcher extends CardImpl { } 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.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); @@ -152,7 +152,7 @@ class TamiyoFieldResearcherEffect1 extends OneShotEffect { } class TamiyoFieldResearcherDelayedTriggeredAbility extends DelayedTriggeredAbility { - + private int startingTurn; private List creatures; @@ -160,7 +160,7 @@ class TamiyoFieldResearcherDelayedTriggeredAbility extends DelayedTriggeredAbili super(new DrawCardSourceControllerEffect(1), Duration.Custom, false); this.creatures = creatures; this.startingTurn = startingTurn; - } + } public TamiyoFieldResearcherDelayedTriggeredAbility(final TamiyoFieldResearcherDelayedTriggeredAbility ability) { super(ability); @@ -183,7 +183,7 @@ class TamiyoFieldResearcherDelayedTriggeredAbility extends DelayedTriggeredAbili } return false; } - + @Override public boolean isInactive(Game game) { return game.getActivePlayerId().equals(getControllerId()) && game.getTurnNum() != startingTurn; @@ -205,7 +205,7 @@ class TamiyoFieldResearcherEmblem extends Emblem { public TamiyoFieldResearcherEmblem() { - this.setName("EMBLEM: Tamiyo, Field Researcher"); + this.setName("Emblem Tamiyo"); this.getAbilities().add(new SimpleStaticAbility(Zone.COMMAND, new TamiyoFieldResearcherCastingEffect())); } diff --git a/Mage.Sets/src/mage/cards/t/TamiyoTheMoonSage.java b/Mage.Sets/src/mage/cards/t/TamiyoTheMoonSage.java index 563c8a5ffb3..a9f4b970bed 100644 --- a/Mage.Sets/src/mage/cards/t/TamiyoTheMoonSage.java +++ b/Mage.Sets/src/mage/cards/t/TamiyoTheMoonSage.java @@ -65,7 +65,7 @@ import mage.target.TargetPlayer; public class TamiyoTheMoonSage extends CardImpl { 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.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(4)); @@ -132,7 +132,7 @@ class TappedCreaturesControlledByTargetCount implements DynamicValue { class TamiyoTheMoonSageEmblem extends Emblem { 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)); this.getAbilities().add(ability); Effect effect = new ReturnToHandTargetEffect(); diff --git a/Mage.Sets/src/mage/cards/t/TeferiTemporalArchmage.java b/Mage.Sets/src/mage/cards/t/TeferiTemporalArchmage.java index 7a2df275ac1..5926cc3ef18 100644 --- a/Mage.Sets/src/mage/cards/t/TeferiTemporalArchmage.java +++ b/Mage.Sets/src/mage/cards/t/TeferiTemporalArchmage.java @@ -53,7 +53,7 @@ import mage.target.TargetPermanent; public class TeferiTemporalArchmage extends CardImpl { 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.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." 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"))); } } diff --git a/Mage.Sets/src/mage/cards/t/TezzeretTheSchemer.java b/Mage.Sets/src/mage/cards/t/TezzeretTheSchemer.java index 0ace6c6e49a..bbe00c398d5 100644 --- a/Mage.Sets/src/mage/cards/t/TezzeretTheSchemer.java +++ b/Mage.Sets/src/mage/cards/t/TezzeretTheSchemer.java @@ -27,6 +27,7 @@ */ package mage.cards.t; +import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.common.BeginningOfCombatTriggeredAbility; @@ -58,8 +59,6 @@ import mage.game.permanent.token.Token; import mage.target.common.TargetArtifactPermanent; import mage.target.common.TargetCreaturePermanent; -import java.util.UUID; - /** * @author JRHerlehy */ @@ -108,7 +107,7 @@ class TezzeretTheSchemerEmblem extends Emblem { } public TezzeretTheSchemerEmblem() { - this.setName("EMBLEM: Tezzeret The Schemer"); + this.setName("Emblem Tezzeret"); Effect effect = new AddCardTypeTargetEffect(CardType.CREATURE, Duration.EndOfGame); effect.setText("target artifact you control becomes an artifact creature"); diff --git a/Mage.Sets/src/mage/cards/v/VenserTheSojourner.java b/Mage.Sets/src/mage/cards/v/VenserTheSojourner.java index 2f134772ffa..8ae6f18af80 100644 --- a/Mage.Sets/src/mage/cards/v/VenserTheSojourner.java +++ b/Mage.Sets/src/mage/cards/v/VenserTheSojourner.java @@ -153,7 +153,7 @@ class VenserTheSojournerEffect extends OneShotEffect { class VenserTheSojournerEmblem extends Emblem { public VenserTheSojournerEmblem() { - this.setName("EMBLEM: Venser, the Sojourner"); + this.setName("Emblem Venser"); Ability ability = new VenserTheSojournerSpellCastTriggeredAbility(new ExileTargetEffect(), false); Target target = new TargetPermanent(); ability.addTarget(target); diff --git a/Mage.Sets/src/mage/cards/z/ZamWesell.java b/Mage.Sets/src/mage/cards/z/ZamWesell.java index e34c81f96da..23351edfc4e 100644 --- a/Mage.Sets/src/mage/cards/z/ZamWesell.java +++ b/Mage.Sets/src/mage/cards/z/ZamWesell.java @@ -1,115 +1,116 @@ -/* - * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * 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 - * or implied, of BetaSteward_at_googlemail.com. - */ -package mage.cards.z; - -import java.util.UUID; -import mage.MageInt; -import mage.abilities.Ability; -import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.CastSourceTriggeredAbility; -import mage.abilities.effects.common.CopyEffect; -import mage.abilities.effects.common.RevealHandTargetEffect; -import mage.cards.Card; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.constants.Zone; -import mage.filter.common.FilterCreatureCard; -import mage.game.Game; -import mage.players.Player; -import mage.target.TargetCard; -import mage.target.common.TargetOpponent; - -/** - * - * @author Styxo - */ -public class ZamWesell extends CardImpl { - - public ZamWesell(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{U}{U}"); - this.supertype.add("Legendary"); - this.subtype.add("Shapeshifter"); - this.subtype.add("Hunter"); - this.power = new MageInt(2); - this.toughness = new MageInt(2); - - // 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.addTarget(new TargetOpponent()); - this.addAbility(ability); - } - - public ZamWesell(final ZamWesell card) { - super(card); - } - - @Override - public ZamWesell copy() { - return new ZamWesell(this); - } -} - -class ZamWesselEffect extends OneShotEffect { - - public ZamWesselEffect() { - super(Outcome.Benefit); - this.staticText = "You may choose a creature card from it and have {this} enter the battlefield as a copy of that creature card"; - } - - public ZamWesselEffect(final ZamWesselEffect effect) { - super(effect); - } - - @Override - public ZamWesselEffect copy() { - return new ZamWesselEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null) { - Player targetPlayer = game.getPlayer(getTargetPointer().getFirst(game, source)); - if (targetPlayer != null) { - TargetCard targetCard = new TargetCard(0, 1, Zone.HAND, new FilterCreatureCard()); - controller.choose(outcome, targetPlayer.getHand(), targetCard, game); - Card copyFromCard = game.getCard(targetCard.getFirstTarget()); - if (copyFromCard != null) { - game.informPlayers(controller.getLogName() + " chooses to copy " + copyFromCard.getName()); - CopyEffect copyEffect = new CopyEffect(Duration.Custom, copyFromCard, source.getSourceId()); - game.addEffect(copyEffect, source); - } - } - return true; - } - return false; - } -} +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * 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 + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.cards.z; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CastSourceTriggeredAbility; +import mage.abilities.effects.common.CopyEffect; +import mage.abilities.effects.common.RevealHandTargetEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.filter.common.FilterCreatureCard; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetCard; +import mage.target.common.TargetOpponent; + +/** + * + * @author Styxo + */ +public class ZamWesell extends CardImpl { + + public ZamWesell(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}{U}"); + this.supertype.add("Legendary"); + this.subtype.add("Shapeshifter"); + this.subtype.add("Hunter"); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // 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.addEffect(new ZamWesselEffect()); + ability.addTarget(new TargetOpponent()); + this.addAbility(ability); + } + + public ZamWesell(final ZamWesell card) { + super(card); + } + + @Override + public ZamWesell copy() { + return new ZamWesell(this); + } +} + +class ZamWesselEffect extends OneShotEffect { + + public ZamWesselEffect() { + super(Outcome.Benefit); + this.staticText = "You may choose a creature card from it and have {this} enter the battlefield as a copy of that creature card"; + } + + public ZamWesselEffect(final ZamWesselEffect effect) { + super(effect); + } + + @Override + public ZamWesselEffect copy() { + return new ZamWesselEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + Player targetPlayer = game.getPlayer(getTargetPointer().getFirst(game, source)); + if (targetPlayer != null) { + TargetCard targetCard = new TargetCard(0, 1, Zone.HAND, new FilterCreatureCard()); + controller.choose(outcome, targetPlayer.getHand(), targetCard, game); + Card copyFromCard = game.getCard(targetCard.getFirstTarget()); + if (copyFromCard != null) { + game.informPlayers(controller.getLogName() + " chooses to copy " + copyFromCard.getName()); + CopyEffect copyEffect = new CopyEffect(Duration.Custom, copyFromCard, source.getSourceId()); + game.addEffect(copyEffect, source); + } + } + return true; + } + return false; + } +} diff --git a/Mage/src/main/java/mage/abilities/effects/common/GetEmblemEffect.java b/Mage/src/main/java/mage/abilities/effects/common/GetEmblemEffect.java index 88e26acdc4e..cd7c4dd6b34 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/GetEmblemEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/GetEmblemEffect.java @@ -24,8 +24,7 @@ * 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 * or implied, of BetaSteward_at_googlemail.com. -*/ - + */ package mage.abilities.effects.common; import mage.MageObject; @@ -37,7 +36,7 @@ import mage.game.command.Emblem; /** * - * @author nantuko + * @author nantuko */ public class GetEmblemEffect extends OneShotEffect { @@ -65,7 +64,7 @@ public class GetEmblemEffect extends OneShotEffect { if (sourceObject == null) { return false; } - game.addEmblem(emblem, source); + game.addEmblem(emblem, sourceObject, source); return true; } diff --git a/Mage/src/main/java/mage/abilities/effects/common/GetEmblemTargetPlayerEffect.java b/Mage/src/main/java/mage/abilities/effects/common/GetEmblemTargetPlayerEffect.java index b449b8928e6..7f5daf38497 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/GetEmblemTargetPlayerEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/GetEmblemTargetPlayerEffect.java @@ -24,8 +24,7 @@ * 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 * or implied, of BetaSteward_at_googlemail.com. -*/ - + */ package mage.abilities.effects.common; import mage.MageObject; @@ -71,7 +70,7 @@ public class GetEmblemTargetPlayerEffect extends OneShotEffect { if (toPlayer == null) { return false; } - game.addEmblem(emblem, source, toPlayer.getId()); + game.addEmblem(emblem, sourceObject, toPlayer.getId()); return true; } diff --git a/Mage/src/main/java/mage/abilities/effects/common/RevealHandTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/RevealHandTargetEffect.java index ab40f84db8f..089e36ef35b 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/RevealHandTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/RevealHandTargetEffect.java @@ -25,7 +25,6 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.abilities.effects.common; import mage.MageObject; @@ -43,11 +42,11 @@ import mage.players.Player; public class RevealHandTargetEffect extends OneShotEffect { private final TargetController targetController; - + public RevealHandTargetEffect() { this(TargetController.OPPONENT); } - + public RevealHandTargetEffect(TargetController targetController) { super(Outcome.Discard); this.targetController = targetController; @@ -64,7 +63,7 @@ public class RevealHandTargetEffect extends OneShotEffect { Player player = game.getPlayer(source.getFirstTarget()); MageObject sourceObject = game.getObject(source.getSourceId()); if (player != null && sourceObject != null) { - player.revealCards(sourceObject.getName(), player.getHand(), game); + player.revealCards(sourceObject.getIdName(), player.getHand(), game); return true; } return false; @@ -74,7 +73,7 @@ public class RevealHandTargetEffect extends OneShotEffect { public RevealHandTargetEffect copy() { return new RevealHandTargetEffect(this); } - + private String getText() { StringBuilder sb = new StringBuilder("Target "); switch (targetController) { diff --git a/Mage/src/main/java/mage/game/Game.java b/Mage/src/main/java/mage/game/Game.java index db89016b244..8670aab12b1 100644 --- a/Mage/src/main/java/mage/game/Game.java +++ b/Mage/src/main/java/mage/game/Game.java @@ -364,9 +364,9 @@ public interface Game extends MageItem, Serializable { 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); diff --git a/Mage/src/main/java/mage/game/GameImpl.java b/Mage/src/main/java/mage/game/GameImpl.java index 6b129cde356..56ce273b395 100644 --- a/Mage/src/main/java/mage/game/GameImpl.java +++ b/Mage/src/main/java/mage/game/GameImpl.java @@ -1426,19 +1426,21 @@ public abstract class GameImpl implements Game, Serializable { } @Override - public void addEmblem(Emblem emblem, Ability source) { - addEmblem(emblem, source, null); + public void addEmblem(Emblem emblem, MageObject sourceObject, Ability source) { + addEmblem(emblem, sourceObject, source.getControllerId()); } + /** + * + * @param emblem + * @param sourceObject + * @param toPlayerId controller and owner of the emblem + */ @Override - public void addEmblem(Emblem emblem, Ability source, UUID toPlayerId) { + public void addEmblem(Emblem emblem, MageObject sourceObject, UUID toPlayerId) { Emblem newEmblem = emblem.copy(); - newEmblem.setSourceId(source.getSourceId()); - if (toPlayerId == null) { - newEmblem.setControllerId(source.getControllerId()); - } else { - newEmblem.setControllerId(toPlayerId); - } + newEmblem.setSourceObject(sourceObject); + newEmblem.setControllerId(toPlayerId); newEmblem.assignNewId(); newEmblem.getAbilities().newId(); for (Ability ability : newEmblem.getAbilities()) { diff --git a/Mage/src/main/java/mage/game/command/CommandObject.java b/Mage/src/main/java/mage/game/command/CommandObject.java index eba4d6ea50e..04be1ceed60 100644 --- a/Mage/src/main/java/mage/game/command/CommandObject.java +++ b/Mage/src/main/java/mage/game/command/CommandObject.java @@ -24,24 +24,26 @@ * 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 * or implied, of BetaSteward_at_googlemail.com. -*/ - + */ package mage.game.command; +import java.util.UUID; import mage.MageObject; -import java.util.UUID; - /** -* -* @author Viserion, nantuko -*/ + * + * @author Viserion, nantuko + */ public interface CommandObject extends MageObject { UUID getSourceId(); + UUID getControllerId(); + void assignNewId(); + MageObject getSourceObject(); + @Override CommandObject copy(); } diff --git a/Mage/src/main/java/mage/game/command/Commander.java b/Mage/src/main/java/mage/game/command/Commander.java index b89cbc22b5d..d31721b97b7 100644 --- a/Mage/src/main/java/mage/game/command/Commander.java +++ b/Mage/src/main/java/mage/game/command/Commander.java @@ -47,11 +47,11 @@ import mage.util.GameLog; public class Commander implements CommandObject { - private final Card card; + private final Card sourceObject; private final Abilities abilites = new AbilitiesImpl<>(); public Commander(Card card) { - this.card = card; + this.sourceObject = card; abilites.add(new CastCommanderAbility(card)); for (Ability ability : card.getAbilities()) { if (!(ability instanceof SpellAbility)) { @@ -62,21 +62,22 @@ public class Commander implements CommandObject { } private Commander(Commander copy) { - this.card = copy.card; + this.sourceObject = copy.sourceObject; } - public Card getCard() { - return card; + @Override + public Card getSourceObject() { + return sourceObject; } @Override public UUID getSourceId() { - return card.getId(); + return sourceObject.getId(); } @Override public UUID getControllerId() { - return card.getOwnerId(); + return sourceObject.getOwnerId(); } @Override @@ -90,12 +91,12 @@ public class Commander implements CommandObject { @Override public String getName() { - return card.getName(); + return sourceObject.getName(); } @Override public String getIdName() { - return card.getName() + " [" + card.getId().toString().substring(0, 3) + "]"; + return sourceObject.getName() + " [" + sourceObject.getId().toString().substring(0, 3) + "]"; } @Override @@ -110,22 +111,22 @@ public class Commander implements CommandObject { @Override public List getCardType() { - return card.getCardType(); + return sourceObject.getCardType(); } @Override public List getSubtype(Game game) { - return card.getSubtype(game); + return sourceObject.getSubtype(game); } @Override public boolean hasSubtype(String subtype, Game game) { - return card.hasSubtype(subtype, game); + return sourceObject.hasSubtype(subtype, game); } @Override public List getSupertype() { - return card.getSupertype(); + return sourceObject.getSupertype(); } @Override @@ -144,42 +145,42 @@ public class Commander implements CommandObject { @Override public ObjectColor getColor(Game game) { - return card.getColor(game); + return sourceObject.getColor(game); } - + @Override public ObjectColor getFrameColor(Game game) { - return card.getFrameColor(game); + return sourceObject.getFrameColor(game); } @Override public FrameStyle getFrameStyle() { - return card.getFrameStyle(); + return sourceObject.getFrameStyle(); } @Override public ManaCosts getManaCost() { - return card.getManaCost(); + return sourceObject.getManaCost(); } @Override public int getConvertedManaCost() { - return card.getConvertedManaCost(); + return sourceObject.getConvertedManaCost(); } @Override public MageInt getPower() { - return card.getPower(); + return sourceObject.getPower(); } @Override public MageInt getToughness() { - return card.getToughness(); + return sourceObject.getToughness(); } - + @Override public int getStartingLoyalty() { - return card.getStartingLoyalty(); + return sourceObject.getStartingLoyalty(); } @Override @@ -201,27 +202,27 @@ public class Commander implements CommandObject { @Override public UUID getId() { - return card.getId(); + return sourceObject.getId(); } @Override public String getImageName() { - return card.getImageName(); + return sourceObject.getImageName(); } @Override public int getZoneChangeCounter(Game game) { - return card.getZoneChangeCounter(game); + return sourceObject.getZoneChangeCounter(game); } @Override public void updateZoneChangeCounter(Game game, ZoneChangeEvent event) { - card.updateZoneChangeCounter(game, event); + sourceObject.updateZoneChangeCounter(game, event); } @Override public void setZoneChangeCounter(int value, Game game) { - card.setZoneChangeCounter(value, game); + sourceObject.setZoneChangeCounter(value, game); } } diff --git a/Mage/src/main/java/mage/game/command/Emblem.java b/Mage/src/main/java/mage/game/command/Emblem.java index cfe9fa14c23..8501b2ea729 100644 --- a/Mage/src/main/java/mage/game/command/Emblem.java +++ b/Mage/src/main/java/mage/game/command/Emblem.java @@ -31,6 +31,7 @@ import java.util.ArrayList; import java.util.List; import java.util.UUID; import mage.MageInt; +import mage.MageObject; import mage.ObjectColor; import mage.abilities.Abilities; import mage.abilities.AbilitiesImpl; @@ -38,6 +39,7 @@ import mage.abilities.Ability; import mage.abilities.costs.mana.ManaCost; import mage.abilities.costs.mana.ManaCosts; import mage.abilities.costs.mana.ManaCostsImpl; +import mage.cards.Card; import mage.cards.FrameStyle; import mage.constants.CardType; import mage.game.Game; @@ -53,13 +55,13 @@ public class Emblem implements CommandObject { private static ObjectColor emptyColor = new ObjectColor(); private static ManaCosts emptyCost = new ManaCostsImpl(); - private String name; + private String name = ""; private UUID id; private UUID controllerId; - private UUID sourceId; + private MageObject sourceObject; private FrameStyle frameStyle; private Abilities abilites = new AbilitiesImpl<>(); - private String expansionSetCodeForImage = null; + private String expansionSetCodeForImage = ""; public Emblem() { this.id = UUID.randomUUID(); @@ -70,8 +72,9 @@ public class Emblem implements CommandObject { this.name = emblem.name; this.frameStyle = emblem.frameStyle; this.controllerId = emblem.controllerId; - this.sourceId = emblem.sourceId; + this.sourceObject = emblem.sourceObject; this.abilites = emblem.abilites.copy(); + this.expansionSetCodeForImage = emblem.expansionSetCodeForImage; } @Override @@ -84,9 +87,29 @@ public class Emblem implements CommandObject { 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 public UUID getSourceId() { - return this.sourceId; + if (sourceObject != null) { + return sourceObject.getId(); + } + return null; } @Override @@ -99,10 +122,6 @@ public class Emblem implements CommandObject { this.abilites.setControllerId(controllerId); } - public void setSourceId(UUID sourceId) { - this.sourceId = sourceId; - } - @Override public String getName() { return name; @@ -162,8 +181,8 @@ public class Emblem implements CommandObject { public ObjectColor getColor(Game game) { return emptyColor; } - - @Override + + @Override public ObjectColor getFrameColor(Game game) { return emptyColor; } @@ -187,7 +206,7 @@ public class Emblem implements CommandObject { public MageInt getToughness() { return MageInt.EmptyMageInt; } - + @Override public int getStartingLoyalty() { return 0;