Merge remote-tracking branch 'upstream/master'

This commit is contained in:
MTGfan 2016-12-27 20:29:31 -05:00
commit cf93656f0d
263 changed files with 2675 additions and 2243 deletions

View file

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

View file

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

View file

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

View file

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

View file

@ -10,6 +10,7 @@ public class CardDownloadData {
private String name; private String name;
private String downloadName; private String downloadName;
private String fileName = "";
private String set; private String set;
private String tokenSetCode; private String tokenSetCode;
private String tokenDescriptor; private String tokenDescriptor;
@ -32,6 +33,11 @@ public class CardDownloadData {
this(name, set, collectorId, usesVariousArt, type, tokenSetCode, tokenDescriptor, token, false, false); this(name, set, collectorId, usesVariousArt, type, tokenSetCode, tokenDescriptor, token, false, false);
} }
public CardDownloadData(String name, String set, String collectorId, boolean usesVariousArt, Integer type, String tokenSetCode, String tokenDescriptor, boolean token, String fileName) {
this(name, set, collectorId, usesVariousArt, type, tokenSetCode, tokenDescriptor, token, false, false);
this.fileName = fileName;
}
public CardDownloadData(String name, String set, String collectorId, boolean usesVariousArt, Integer type, String tokenSetCode, String tokenDescriptor, boolean token, boolean twoFacedCard, boolean secondSide) { public CardDownloadData(String name, String set, String collectorId, boolean usesVariousArt, Integer type, String tokenSetCode, String tokenDescriptor, boolean token, boolean twoFacedCard, boolean secondSide) {
this.name = name; this.name = name;
this.set = set; this.set = set;
@ -43,7 +49,7 @@ public class CardDownloadData {
this.secondSide = secondSide; this.secondSide = secondSide;
this.tokenSetCode = tokenSetCode; this.tokenSetCode = tokenSetCode;
this.tokenDescriptor = tokenDescriptor; this.tokenDescriptor = tokenDescriptor;
if (this.tokenDescriptor == null || this.tokenDescriptor.equalsIgnoreCase("")) { if (this.tokenDescriptor == null || this.tokenDescriptor.equalsIgnoreCase("")) {
this.tokenDescriptor = lastDitchTokenDescriptor(); this.tokenDescriptor = lastDitchTokenDescriptor();
} }
@ -60,6 +66,7 @@ public class CardDownloadData {
this.usesVariousArt = card.usesVariousArt; this.usesVariousArt = card.usesVariousArt;
this.tokenSetCode = card.tokenSetCode; this.tokenSetCode = card.tokenSetCode;
this.tokenDescriptor = card.tokenDescriptor; this.tokenDescriptor = card.tokenDescriptor;
this.fileName = card.fileName;
} }
@ -118,6 +125,14 @@ public class CardDownloadData {
return name; return name;
} }
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public void setName(String name) { public void setName(String name) {
this.name = name; this.name = name;
} }
@ -125,7 +140,7 @@ public class CardDownloadData {
public String getSet() { public String getSet() {
return set; return set;
} }
public void setSet(String set) { public void setSet(String set) {
this.set = set; this.set = set;
} }
@ -144,15 +159,15 @@ public class CardDownloadData {
public void setTokenDescriptor(String tokenDescriptor) { public void setTokenDescriptor(String tokenDescriptor) {
this.tokenDescriptor = tokenDescriptor; this.tokenDescriptor = tokenDescriptor;
} }
private String lastDitchTokenDescriptor() { private String lastDitchTokenDescriptor() {
String name = this.name.replaceAll("[^a-zA-Z0-9]", ""); String tmpName = this.name.replaceAll("[^a-zA-Z0-9]", "");
String descriptor = name + "...."; String descriptor = tmpName + "....";
descriptor = descriptor.toUpperCase(); descriptor = descriptor.toUpperCase();
return descriptor; return descriptor;
} }
public boolean isToken() { public boolean isToken() {
return token; return token;
} }

View file

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

View file

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

View file

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

View file

@ -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 Pegasus, 89, W, 1|1, -, Creature - Pegasus, Mark Zug, Flying
Soldier, 90, W, 1|1, -, Creature - Soldier, Daren Bader, - Soldier, 90, W, 1|1, -, Creature - Soldier, Daren Bader, -
Zombie, 91, B, 2|2, -, Creature - Zombie, Christopher Rush, - 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, - Sheep, 93, G, 1|1, -, Creature - Sheep, Kev Walker, -
Squirrel, 94, G, 1|1, -, Creature - Squirrel, Ron Spencer, - 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 Pegasus, 89, W, 1|1, -, Creature - Pegasus, Mark Zug, Flying
Goblin, 92, R, 1|1, -, Creature - Goblin, Pete Venters, - 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 Bird, T1, U, 1|1, Player Rewards, Creature - Bird, Michael Sutfin, Flying
Elephant, T2, G, 3|3, Player Rewards, Creature - Elephant, Terese Nielsen, - Elephant, T2, G, 3|3, Player Rewards, Creature - Elephant, Terese Nielsen, -
Saproling, T3, G, 1|1, Player Rewards, Creature - Saproling, Jeff Laubenstein, - 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 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, - 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, - Bear, T1, G, 2|2, Player Rewards, Creature - Bear, Heather Hudson, -
Beast, T2, G, 4|4, Player Rewards, Creature - Beast, Larry Elmore, - Beast, T2, G, 4|4, Player Rewards, Creature - Beast, Larry Elmore, -
Elephant, T3, G, 3|3, Player Rewards, Creature - Elephant, Arnie Swekel, - 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, - Wurm, T5, G, 6|6, Player Rewards, Creature - Wurm, Alan Pollack, -
Zombie, T6, B, 2|2, Player Rewards, Creature - Zombie, Dana Knutson, - 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, - Bear, T1, G, 2|2, Player Rewards, Creature - Bear, Glen Angus, -
Dragon, T2, R, 5|5, Player Rewards, Creature - Dragon, Glen Angus, Flying Dragon, T2, R, 5|5, Player Rewards, Creature - Dragon, Glen Angus, Flying
Insect, T3, G, 1|1, Player Rewards, Creature - Insect, Anthony S. Waters, - Insect, T3, G, 1|1, Player Rewards, Creature - Insect, Anthony S. Waters, -
Soldier, T4, W, 1|1, Player Rewards, Creature - Soldier, Ron Spencer, - 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, - Goblin, T1, R, 1|1, Player Rewards, Creature - Goblin, Darrell Riche, -
Sliver, T2, -, 1|1, Player Rewards, Creature - Sliver, Tony Szczudlo, - 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 Angel, T1, W, 4|4, Player Rewards, Creature - Angel, Scott M. Fischer, Flying
8ED - Eighth Edition (2003-07-28) 8ED - Eighth Edition (2003-07-28)
Rukh, T1, R, 4|4, Player Rewards, Creature - Rukh, Edward P. Beard Jr., Flying Rukh, T1, R, 4|4, Player Rewards, Creature - Rukh, Edward P. Beard<72> Jr., Flying
MRD - Mirrodin (2003-10-02)
MRD - Mirrodin (2003-10-02)
Demon, T1, B, *|*, Player Rewards, Creature - Demon, Pete Venters, - Demon, T1, B, *|*, Player Rewards, Creature - Demon, Pete Venters, -
Myr, T2, -, 1|1, Player Rewards, Creature - Myr, Wayne England, - Myr, T2, -, 1|1, Player Rewards, Creature - Myr, Wayne England, -
Pentavite, T3, -, 1|1, Player Rewards, Artifact Creature - Pentavite, Greg Staples, - Pentavite, T3, -, 1|1, Player Rewards, Artifact Creature - Pentavite, Greg Staples, -
DST - Darksteel (2004-02-06) DST - Darksteel (2004-02-06)
Beast, T1, G, 3|3, Player Rewards, Creature - Beast, Edward P. Beard Jr., - Beast, T1, G, 3|3, Player Rewards, Creature - Beast, Edward P. Beard<72> 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, - Spirit, T1, -, 1|1, Player Rewards, Creature - Spirit, Hugh Jamieson, -
CSP - Coldsnap (2006-07-21) CSP - Coldsnap (2006-07-21)
Marit Lage, T1, B, 20|20, Pre-Release, Creature - Avatar, Stephan Martiniere, Flying indestructible Marit Lage, T1, B, 20|20, Pre-Release, Creature - Avatar, Stephan Martiniere, Flying<6E> indestructible
10E - Tenth Edition (2007-07-13)
10E - Tenth Edition (2007-07-13)
Soldier, 1, W, 1|1, -, Creature - Soldier, Parente, - Soldier, 1, W, 1|1, -, Creature - Soldier, Parente, -
Zombie, 2, B, 2|2, -, Creature - Zombie, Carl Critchlow, - Zombie, 2, B, 2|2, -, Creature - Zombie, Carl Critchlow, -
Dragon, 3, R, 5|5, -, Creature - Dragon, Jim Pavelec, Flying 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, - Saproling, 5, G, 1|1, -, Creature - Saproling, Cyril Van Der Haegen, -
Wasp, 6, -, 1|1, -, Artifact Creature - Insect, Ron Spencer, Flying 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. 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 Elemental, 2, W, 4|4, -, Creature - Elemental, Anthony S. Waters, Flying
Kithkin Soldier, 3, W, 1|1, -, Creature - Kithkin Soldier, Greg Hildebrandt, - 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, - Wolf, 10, G, 2|2, -, Creature - Wolf, Pete Venters, -
Shapeshifter, 11, -, 1|1, -, Creature - Shapeshifter, Franz Vohwinkel, Changeling 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 Elemental, T1, G, 7|7, -, Creature - Elemental, Anthony S. Waters, Trample
Elf Warrior, T2, G, 1|1, -, Creature - Elf Warrior, Dominick Domingo, - Elf Warrior, T2, G, 1|1, -, Creature - Elf Warrior, Dominick Domingo, -
Goblin, T3, R, 1|1, -, Creature - Goblin, Dave Kendall, - 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, - Giant Warrior, 1, W, 5|5, -, Creature - Giant Warrior, Steve Ellis, -
Faerie Rogue, 2, B, 1|1, -, Creature - Faerie Rogue, Jim Nelson, Flying Faerie Rogue, 2, B, 1|1, -, Creature - Faerie Rogue, Jim Nelson, Flying
Treefolk Shaman, 3, G, 2|5, -, Creature - Treefolk Shaman, Richard Sardinha, - 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, - Kithkin Soldier, 1, W, 1|1, -, Creature - Kithkin Soldier, Randy Gallegos, -
Spirit, 2, W, 1|1, -, Creature - Spirit, Jeremy Enecio, Flying Spirit, 2, W, 1|1, -, Creature - Spirit, Jeremy Enecio, Flying
Rat, 3, B, 1|1, -, Creature - Rat, Carl Critchlow, - 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, - Goblin Warrior, 11, R G, 1|1, -, Creature - Goblin Warrior, Dave Allsop, -
Elf Warrior, 12, G W, 1|1, -, Creature - Elf Warrior, Carl Frank, - 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, - Goat, 1, W, -, -, Creature - Goat, Terese Nielsen, -
Bird, 2, U, 1|1, -, Creature - Bird, Heather Hudson, Flying Bird, 2, U, 1|1, -, Creature - Bird, Heather Hudson, Flying
Beast, 3, G, 3|3, -, Creature - Beast, William O'Connor, - 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, - Worm, 6, B G, 1|1, -, Creature - Worm, Chuck Lukacs, -
Goblin Soldier, 7, R W, 1|1, -, Creature - Goblin Soldier, Jeff Miracola, - 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, - Soldier, 1, W, 1|1, -, Creature - Soldier, Alan Pollack, -
Homunculus, 2, U, -, -, Artifact Creature - Homunculus, Howard Lyon, - Homunculus, 2, U, -, -, Artifact Creature - Homunculus, Howard Lyon, -
Thopter, 3, U, 1|1, -, Artifact Creature - Thopter, Andrew Murray, Flying 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, - Saproling, 9, G, 1|1, -, Creature - Saproling, Trevor Claxton, -
Beast, 10, R G W, 8|8, -, Creature - Beast, Parente, - 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, - 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 Angel, 1, W, 4|4, -, Creature - Angel, Cyril Van Der Haegen, Flying
Elemental, 2, R, 3|1, -, Creature - Elemental, Vance Kovacs, - 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 Spirit, T1, W, 1|1, -, Creature - Spirit, Luca Zontini, Flying
Demon, T2, B, *|*, -, Creature - Demon, Pete Venters, Flying Demon, T2, B, *|*, -, Creature - Demon, Pete Venters, Flying
Thrull, T3, B, -, -, Creature - Thrull, Veronique Meignaud, - 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 Bird Soldier, 1, W, 1|1, -, Creature - Bird Soldier, Matt Cavotta, Flying
Lizard, 2, G, 2|2, -, Creature - Lizard, Anthony S. Waters, - Lizard, 2, G, 2|2, -, Creature - Lizard, Anthony S. Waters, -
Dragon, 3, R G, 1|1, -, Creature - Dragon, Jaime Jones, Flying devour 2 Dragon, 3, R G, 1|1, -, Creature - Dragon, Jaime Jones, Flying<EFBFBD> devour 2
Zombie Wizard, 4, U B, 1|1, -, Creature - Zombie Wizard, Dave Allsop, - Zombie Wizard, 4, U B, 1|1, -, Creature - Zombie Wizard, Dave Allsop, -
M10 - Magic 2010 (2009-07-17) M10 - Magic 2010 (2009-07-17)
Avatar, 1, W, *|*, -, Creature - Avatar, Vance Kovacs, This creature's power and toughness are each equal to your life total. 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, - Soldier, 2, W, 1|1, -, Creature - Soldier, Parente, -
Zombie, 3, B, 2|2, -, Creature - Zombie, Bud Cook, - 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, - Wolf, 7, G, 2|2, -, Creature - Wolf, Lars Grant-West, -
Gargoyle, 8, -, 3|4, -, Artifact Creature - Gargoyle, Paul Bonner, Flying 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 Angel, 1, W, 4|4, -, Creature - Angel, Adi Granov, Flying
Bird, 2, W, 1|1, -, Creature - Bird, Howard Lyon, Flying Bird, 2, W, 1|1, -, Creature - Bird, Howard Lyon, Flying
Kor Soldier, 3, W, 1|1, -, Creature - Kor Soldier, Daren Bader, - 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, - Merfolk, 5, U, 1|1, -, Creature - Merfolk, Warren Mahy, -
Vampire, 6, B, *|*, -, Creature - Vampire, Kekai Kotaki, - Vampire, 6, B, *|*, -, Creature - Vampire, Kekai Kotaki, -
Zombie Giant, 7, B, 5|5, -, Creature - Zombie Giant, Igor Kieryluk, - Zombie Giant, 7, B, 5|5, -, Creature - Zombie Giant, Igor Kieryluk, -
Elemental, 8, R, 7|1, -, Creature - Elemental, Anthony Francisco, Trample haste Elemental, 8, R, 7|1, -, Creature - Elemental, Anthony Francisco, Trample<EFBFBD> haste
Beast, 9, G, 4|4, -, Creature - Beast, Steve Prescott, - Beast, 9, G, 4|4, -, Creature - Beast, Steve Prescott, -
Snake, 10, G, 1|1, -, Creature - Snake, Austin Hsu, - Snake, 10, G, 1|1, -, Creature - Snake, Austin Hsu, -
Wolf, 11, G, 2|2, -, Creature - Wolf, Daren Bader, - Wolf, 11, G, 2|2, -, Creature - Wolf, Daren Bader, -
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, T1, G, 3|3, -, Creature - Beast, John Donahue, -
Beast, T2, G, 4|4, -, Creature - Beast, Steve Prescott, - Beast, T2, G, 4|4, -, Creature - Beast, Steve Prescott, -
Elephant, T3, G, 3|3, -, Creature - Elephant, Arnie Swekel, - 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, - Soldier Ally, 1, W, 1|1, -, Creature - Soldier Ally, Kekai Kotaki, -
Dragon, 2, R, 5|5, -, Creature - Dragon, Raymond Swanland, Flying Dragon, 2, R, 5|5, -, Creature - Dragon, Raymond Swanland, Flying
Ogre, 3, R, 3|3, -, Creature - Ogre, Paul Bonner, - 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, - Plant, 5, G, -, -, Creature - Plant, Daren Bader, -
Construct, 6, -, 6|12, -, Artifact Creature - Construct, Jung Park, Trample Construct, 6, -, 6|12, -, Artifact Creature - Construct, Jung Park, Trample
DDE - Duel Decks: Phyrexia vs. the Coalition (2010-03-19) DDE - Duel Decks: Phyrexia vs. the Coalition (2010-03-19)
Hornet, T1, -, 1|1, -, Artifact Creature - Insect, Ron Spencer, Flying haste Hornet, T1, -, 1|1, -, Artifact Creature - Insect, Ron Spencer, Flying<EFBFBD> haste
Minion, T2, B, *|*, -, Creature - Minion, Dave Kendall, - Minion, T2, B, *|*, -, Creature - Minion, Dave Kendall, -
Saproling, T3, G, 1|1, -, Creature - Saproling, Warren Mahy, - Saproling, T3, G, 1|1, -, Creature - Saproling, Warren Mahy, -
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, 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, 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. 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, - Ooze, 4, G, *|*, -, Creature - Ooze, Daniel Ljunggren, -
Tuktuk The Returned, 5, -, 5|5, -, Legendary Artifact Creature - Goblin Golem, Franz Vohwinkel, - 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. 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 Bird, 2, W, 3|3, -, Creature - Bird, Paul Bonner, Flying
Zombie, 3, B, 2|2, -, Creature - Zombie, Bud Cook, - Zombie, 3, B, 2|2, -, Creature - Zombie, Bud Cook, -
Beast, 4, G, 3|3, -, Creature - Beast, John Donahue, - Beast, 4, G, 3|3, -, Creature - Beast, John Donahue, -
Ooze, 5, G, 2|2, -, Creature - Ooze, Raymond Swanland, When this creature dies put two 1/1 green Ooze creature tokens onto the battlefield. Ooze, 5, G, 2|2, -, Creature - Ooze, Raymond Swanland, When this creature dies<EFBFBD> put two 1/1 green Ooze creature tokens onto the battlefield.
Ooze, 6, G, 1|1, -, Creature - Ooze, Raymond Swanland, - Ooze, 6, G, 1|1, -, Creature - Ooze, Raymond Swanland, -
DDF - Duel Decks: Elspeth vs. Tezzeret (2010-09-03) DDF - Duel Decks: Elspeth vs. Tezzeret (2010-09-03)
Soldier, T1, W, 1|1, -, Creature - Soldier, Parente, - 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, - Cat, 1, W, 2|2, -, Creature - Cat, Scott Chou, -
Soldier, 2, W, 1|1, -, Creature - Soldier, Goran Josic, - Soldier, 2, W, 1|1, -, Creature - Soldier, Goran Josic, -
Goblin, 3, R, 1|1, -, Creature - Goblin, 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 Wurm, 9, -, 3|3, -, Artifact Creature - Wurm, Raymond Swanland, Lifelink
Poison Counter, -, -, -, -, Emblem, -, - Poison Counter, -, -, -, -, Emblem, -, -
MBS - Mirrodin Besieged (2011-02-04) MBS - Mirrodin Besieged (2011-02-04)
Germ, 1, B, -, -, Creature - Germ, Igor Kieryluk, - Germ, 1, B, -, -, Creature - Germ, Igor Kieryluk, -
Zombie, 2, B, 2|2, -, Creature - Zombie, Dave Kendall, - Zombie, 2, B, 2|2, -, Creature - Zombie, Dave Kendall, -
Golem, 3, -, 9|9, -, Artifact Creature - Golem, Svetlin Velinov, - 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 Thopter, 5, -, 1|1, -, Artifact Creature - Thopter, Volkan Baga, Flying
Poison Counter, -, -, -, -, Emblem, -, - 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, - 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, - Beast, 1, G, 3|3, -, Creature - Beast, Dave Allsop, -
Goblin, 2, R, 1|1, -, Creature - Goblin, Jaime Jones, - Goblin, 2, R, 1|1, -, Creature - Goblin, Jaime Jones, -
Golem, 3, -, 3|3, -, Artifact Creature - Golem, Volkan Baga, - Golem, 3, -, 3|3, -, Artifact Creature - Golem, Volkan Baga, -
Myr, 4, -, 1|1, -, Artifact Creature - Myr, Matt Stewart, - Myr, 4, -, 1|1, -, Artifact Creature - Myr, Matt Stewart, -
Poison Counter, -, -, -, -, Emblem, -, - 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 Bird, 1, W, 3|3, -, Creature - Bird, Paul Bonner, Flying
Soldier, 2, W, 1|1, -, Creature - Soldier, Parente, - Soldier, 2, W, 1|1, -, Creature - Soldier, Parente, -
Zombie, 3, B, 2|2, -, Creature - Zombie, Carl Critchlow, - 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, - Wurm, 6, G, 6|6, -, Creature - Wurm, Anthony Francisco, -
Pentavite, 7, -, 1|1, -, Artifact Creature - Pentavite, Greg Staples, Flying 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 Griffin, T1, W, 2|2, -, Creature - Griffin, Jim Nelson, Flying
Saproling, T2, G, 1|1, -, Creature - Saproling, Cyril Van Der Haegen, - 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 Angel, 1, W, 4|4, -, Creature - Angel, Winona Nelson, Flying
Spirit, 2, W, 1|1, -, Creature - Spirit, Kev Walker, Flying Spirit, 2, W, 1|1, -, Creature - Spirit, Kev Walker, Flying
Homunculus, 3, U, 2|2, -, Creature - Homunculus, Johann Bodin, - 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, 12, G, 2|2, -, Creature - Wolf, David Palumbo, -
Wolf, T12, G, 2|2, Judge, 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, - Human, 1, W, 1|1, -, Creature - Human, John Stanko, -
Vampire, 2, B, 1|1, -, Creature - Vampire, Peter Mohrbacher, Lifelink Vampire, 2, B, 1|1, -, Creature - Vampire, Peter Mohrbacher, Lifelink
Sorin Emblem, 3, -, -, -, Emblem - Sorin, Michael Komrack, Creatures you control get +1/+0. Sorin Emblem, 3, -, -, -, Emblem - Sorin, Michael Komrack, Creatures you control get +1/+0.
DDI - Duel Decks: Venser vs. Koth (2012-03-30) DDI - Duel Decks: Venser vs. Koth (2012-03-30)
Koth Emblem, E1, -, -, -, Emblem - Koth, Eric Deschamps, Mountains you control have Tap: This land deals 1 damage to target creature or player.' Koth Emblem, E1, -, -, -, Emblem - Koth, Eric Deschamps, Mountains you control have Tap: This land deals 1 damage to target creature or player.'
Venser Emblem, E2, -, -, -, Emblem - Venser, Eric Deschamps, Whenever you cast a spell exile target permanent. Venser Emblem, E2, -, -, -, Emblem - Venser, Eric Deschamps, Whenever you cast a spell<6C> 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, - Human, T1a, W, 1|1, Full Moon, Creature - Human, Lars Grant-West, -
Wolf, T1b, G, 2|2, Full Moon, Creature - Wolf, 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 Angel, 1, W, 4|4, -, Creature - Angel, Anthony Palumbo, Flying
Human, 2, W, 1|1, -, Creature - Human, Michael C. Hayes, - Human, 2, W, 1|1, -, Creature - Human, Michael C. Hayes, -
Spirit, 3, W, 1|1, -, Creature - Spirit, Ryan Yee, Flying 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 Demon, 5, B, 5|5, -, Creature - Demon, Kev Walker, Flying
Zombie, 6, B, 2|2, -, Creature - Zombie, Lucas Graciano, - Zombie, 6, B, 2|2, -, Creature - Zombie, Lucas Graciano, -
Human, 7, R, 1|1, -, Creature - Human, Ryan Pancoast, Haste Human, 7, R, 1|1, -, Creature - Human, Ryan Pancoast, Haste
Tamiyo Emblem, 8, -, -, -, Emblem - Tamiyo, Eric Deschamps, You have no maximum hand size. Whenever a card is put into your graveyard from anywhere you may return it to your hand. Tamiyo Emblem, 8, -, -, -, Emblem - Tamiyo, Eric Deschamps, You have no maximum hand size. Whenever a card is put into your graveyard from anywhere<EFBFBD> you may return it to your hand.
Angel, T1, W, 4|4, Pre-Release, Creature - Angel, James Ryman, Flying Angel, T1, W, 4|4, Pre-Release, Creature - Angel, James Ryman, Flying
Angel, T1F, W, 4|4, Pre-Release, Creature - Angel, James Ryman, Flying Angel, T1F, W, 4|4, Pre-Release, Creature - Angel, James Ryman, Flying
Demon, T5, B, 5|5, Pre-Release, Creature - Demon, Karl Kopinski, Flying Demon, T5, B, 5|5, Pre-Release, Creature - Demon, Karl Kopinski, Flying
Demon, T5F, 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, - Goblin, 1, R, 1|1, League, Creature - Goblin, Jim Nelson, -
Cat, 1, W, 2|2, -, Creature - Cat, Jesper Ejsing, - Cat, 1, W, 2|2, -, Creature - Cat, Jesper Ejsing, -
Goat, 2, W, -, -, Creature - Goat, Adam Paquette, - 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, - 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.' 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, - 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, - Centaur, 1, G, 3|3, Judge, Creature - Centaur, James Ryman, -
Knight, 1, W, 2|2, League, Creature - Knight, Lucas Graciano, Vigilance Knight, 1, W, 2|2, League, Creature - Knight, Lucas Graciano, Vigilance
Bird, 1, W, 1|1, -, Creature - Bird, James Ryman, Flying Bird, 1, W, 1|1, -, Creature - Bird, James Ryman, Flying
Knight, 2, W, 2|2, -, Creature - Knight, Matt Stewart, Vigilance Knight, 2, W, 2|2, -, Creature - Knight, Matt Stewart, Vigilance
Soldier, 3, W, 1|1, -, Creature - Soldier, Steve Prescott, - Soldier, 3, W, 1|1, -, Creature - Soldier, Steve Prescott, -
Assassin, 4, B, 1|1, -, Creature - Assassin, Svetlin Velinov, Whenever this creature deals combat damage to a player that player loses the game. Assassin, 4, B, 1|1, -, Creature - Assassin, Svetlin Velinov, Whenever this creature deals combat damage to a player<EFBFBD> that player loses the game.
Dragon, 5, R, 6|6, -, Creature - Dragon, Mark Zug, Flying Dragon, 5, R, 6|6, -, Creature - Dragon, Mark Zug, Flying
Goblin, 6, R, 1|1, -, Creature - Goblin, Christopher Moeller, - Goblin, 6, R, 1|1, -, Creature - Goblin, Christopher Moeller, -
Centaur, 7, G, 3|3, -, Creature - Centaur, Slawomir Maniak, - Centaur, 7, G, 3|3, -, Creature - Centaur, Slawomir Maniak, -
@ -371,29 +371,29 @@ Saproling, 10, G, 1|1, -, Creature - Saproling, Raoul Vitale, -
Wurm, 11, G, 5|5, -, Creature - Wurm, Anthony Palumbo, Trample Wurm, 11, G, 5|5, -, Creature - Wurm, Anthony Palumbo, Trample
Elemental, 12, G W, 8|8, -, Creature - Elemental, Yeong-Hao Han, Vigilance 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 Soldier, 1, R W, 1|1, League, Creature - Soldier, Zoltan Boros, Haste
Angel, 1, W, 4|4, -, Creature - Angel, Steve Argyle, Flying Angel, 1, W, 4|4, -, Creature - Angel, Steve Argyle, Flying
Rat, 2, B, 1|1, -, Creature - Rat, Nils Hamm, - Rat, 2, B, 1|1, -, Creature - Rat, Nils Hamm, -
Frog Lizard, 3, G, 3|3, -, Creature - Frog Lizard, Jack Wang, - Frog Lizard, 3, G, 3|3, -, Creature - Frog Lizard, Jack Wang, -
Cleric, 4, W B, 1|1, -, Creature - Cleric, Jason Chan, {3}{W}{B}{B} {T} Sacrifice this creature: Return a card named Deathpact Angel from your graveyard to the battlefield. Cleric, 4, W B, 1|1, -, Creature - Cleric, Jason Chan, {3}{W}{B}{B}<EFBFBD> {T}<7D> Sacrifice this creature: Return a card named Deathpact Angel from your graveyard to the battlefield.
Horror, 5, U B, 1|1, -, Creature - Horror, Adam Paquette, Flying Horror, 5, U B, 1|1, -, Creature - Horror, Adam Paquette, Flying
Soldier, 6, R W, 1|1, -, Creature - Soldier, David Palumbo, Haste Soldier, 6, R W, 1|1, -, Creature - Soldier, David Palumbo, Haste
Spirit, 7, W B, 1|1, -, Creature - Spirit, Cliff Childs, Flying Spirit, 7, W B, 1|1, -, Creature - Spirit, Cliff Childs, Flying
Domri Emblem, 8, -, -, -, Emblem - Domri, Tyler Jacobson, Creatures you control have double strike trample hexproof and haste. Domri Emblem, 8, -, -, -, Emblem - Domri, Tyler Jacobson, Creatures you control have double strike<6B> trample<6C> hexproof<6F> 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 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 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. 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, - Giant Warrior, 1, W, 5|5, -, Creature - Giant Warrior, Svetlin Velinov, -
Kithkin Soldier, 2, W, 1|1, -, Creature - Kithkin Soldier, Randy Gallegos, - Kithkin Soldier, 2, W, 1|1, -, Creature - Kithkin Soldier, Randy Gallegos, -
Soldier, 3, W, 1|1, -, Creature - Soldier, Goran Josic, - 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, - Treefolk Shaman, 13, G, 2|5, -, Creature - Treefolk Shaman, Zack Stella, -
Faerie Rogue, 14, U B, 1|1, -, Creature - Faerie Rogue, E. M. Gist, Flying Faerie Rogue, 14, U B, 1|1, -, Creature - Faerie Rogue, E. M. Gist, Flying
Worm, 15, B G, 1|1, -, Creature - Worm, Chuck Lukacs, - Worm, 15, B G, 1|1, -, Creature - Worm, Chuck Lukacs, -
Elspeth Emblem, 16, -, -, -, Emblem - Elspeth, Volkan Baga, Artifacts creatures enchantments and lands you control have indestructible. Elspeth Emblem, 16, -, -, -, Emblem - Elspeth, Volkan Baga, Artifacts<74> creatures<65> enchantments<74> and lands you control have indestructible.
M14 - Magic 2014 Core Set (2013-07-19)
M14 - Magic 2014 Core Set (2013-07-19)
Sliver, 1, -, 1|1, -, Creature - Sliver, Igor Kieryluk, - Sliver, 1, -, 1|1, -, Creature - Sliver, Igor Kieryluk, -
Angel, 1, W, 4|4, -, Creature - Angel, James Ryman, Flying Angel, 1, W, 4|4, -, Creature - Angel, James Ryman, Flying
Cat, 3, W, 2|2, -, Creature - Cat, Jesper Ejsing, - 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, - Saproling, 10, G, 1|1, -, Creature - Saproling, Brad Rigney, -
Wolf, 11, G, 2|2, -, Creature - Wolf, Lars Grant-West, - Wolf, 11, G, 2|2, -, Creature - Wolf, Lars Grant-West, -
Liliana Emblem, 12, -, -, -, Emblem - Liliana, D. Alexander Gregory, Swamps you control have Tap: Add {B}{B}{B}{B} to your mana pool.' Liliana Emblem, 12, -, -, -, Emblem - Liliana, D. Alexander Gregory, Swamps you control have Tap: Add {B}{B}{B}{B} to your mana pool.'
Garruk Emblem, 13, -, -, -, Emblem - Garruk, Karl Kopinski, Whenever you cast a creature spell you may search your library for a creature card put it onto the battlefield then shuffle your library. Garruk Emblem, 13, -, -, -, Emblem - Garruk, Karl Kopinski, Whenever you cast a creature spell<EFBFBD> you may search your library for a creature card<72> put it onto the battlefield<6C> then shuffle your library.
Sliver, T1, -, 1|1, League, Creature - Sliver, Vincent Proce, - Sliver, T1, -, 1|1, League, Creature - Sliver, Vincent Proce, -
DDL - Duel Decks: Heroes vs. Monsters (2013-09-06) DDL - Duel Decks: Heroes vs. Monsters (2013-09-06)
Griffin, T1, W, 2|2, -, Creature - Griffin, Johann Bodin, Flying Griffin, T1, W, 2|2, -, Creature - Griffin, Johann Bodin, Flying
Beast, T2, G, 3|3, -, Creature - Beast, Jesper Ejsing, - 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, - Golem, 1, -, 3|3, Judge, Enchantment Artifact Creature - Golem, Yeong-Hao Han, -
Soldier, 1, W, 1|1, League, Creature - Soldier, Johann Bodin, - Soldier, 1, W, 1|1, League, Creature - Soldier, Johann Bodin, -
Cleric, 1, W, 2|1, -, Enchantment Creature - Cleric, 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, - 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. 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, - Soldier, 1, W, 1|1, League, Enchantment Creature - Soldier, Ryan Barger, -
Bird, 1, W, 1|1, -, Creature - Bird, Clint Cearly, Flying Bird, 1, W, 1|1, -, Creature - Bird, Clint Cearly, Flying
Cat Soldier, 2, W, 1|1, -, Creature - Cat Soldier, Scott Chou, Vigilance 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, - Centaur, 8, G, 3|3, -, Enchantment Creature - Centaur, Ryan Barger, -
Wolf, 9, G, 2|2, -, Creature - Wolf, Raoul Vitale, - Wolf, 9, G, 2|2, -, Creature - Wolf, Raoul Vitale, -
Gold, 10, -, -, -, Artifact, Richard Wright, Sacrifice this artifact: Add one mana of any color to your mana pool. Gold, 10, -, -, -, Artifact, Richard Wright, Sacrifice this artifact: Add one mana of any color to your mana pool.
Kiora Emblem, 11, -, -, -, Emblem - Kiora, Scott M. Fischer, At the beginning of your end step put a 9/9 blue Kraken creature token onto the battlefield. Kiora Emblem, 11, -, -, -, Emblem - Kiora, Scott M. Fischer, At the beginning of your end step<EFBFBD> put a 9/9 blue Kraken creature token onto the battlefield.
DDM - Duel Decks: Jace vs. Vraska (2014-03-14) DDM - Duel Decks: Jace vs. Vraska (2014-03-14)
Assassin, T1, B, 1|1, -, Creature - Assassin, Svetlin Velinov, Whenever this creature deals combat damage to a player that player loses the game. Assassin, T1, B, 1|1, -, Creature - Assassin, Svetlin Velinov, Whenever this creature deals combat damage to a player<65> 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, - Minotaur, 1, R, 2|3, League, Creature - Minotaur, Scott Murphy, -
Sphinx, 1, U, 4|4, -, Creature - Sphinx, Jesper Ejsing, Flying Sphinx, 1, U, 4|4, -, Creature - Sphinx, Jesper Ejsing, Flying
Zombie, 2, B, *|*, -, Creature - Zombie, Zack Stella, - 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 Spider, 5, G, 1|3, -, Enchantment Creature - Spider, Yohann Schepacz, Reach
Snake, 6, G B, 1|1, -, Enchantment Creature - Snake, Greg Staples, Deathtouch 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, - Soldier, 1, W, 1|1, -, Creature - Soldier, Goran Josic, -
Spirit, 2, W, 1|1, -, Creature - Spirit, Kev Walker, Flying Spirit, 2, W, 1|1, -, Creature - Spirit, Kev Walker, Flying
Myr, 3, -, 1|1, -, Artifact Creature - Myr, Matt Stewart, - Myr, 3, -, 1|1, -, Artifact Creature - Myr, Matt Stewart, -
Elspeth Emblem, 4, -, -, -, Emblem - Elspeth, Volkan Baga, Artifacts creatures enchantments and lands you control have indestructible. Elspeth Emblem, 4, -, -, -, Emblem - Elspeth, Volkan Baga, Artifacts<74> creatures<65> enchantments<74> 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 Spirit, 1, W, 1|1, -, Creature - Spirit, Jeff Simpson, Flying
Demon, 2, B, *|*, -, Creature - Demon, Evan Shipard, Flying Demon, 2, B, *|*, -, Creature - Demon, Evan Shipard, Flying
Zombie, 3, B, 2|2, -, Creature - Zombie, Lucas Graciano, - 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, - Squirrel, 6, G, 1|1, -, Creature - Squirrel, Daniel Ljunggren, -
Wolf, 7, G, 2|2, -, Creature - Wolf, Raoul Vitale, - Wolf, 7, G, 2|2, -, Creature - Wolf, Raoul Vitale, -
Construct, 8, -, 1|1, -, Artifact Creature - Construct, Adam Paquette, Defender Construct, 8, -, 1|1, -, Artifact Creature - Construct, Adam Paquette, Defender
Dack Emblem, 9, -, -, -, Emblem - Dack, Eric Deschamps, Whenever you cast a spell that targets one or more permanents gain control of those permanents. Dack Emblem, 9, -, -, -, Emblem - Dack, Eric Deschamps, Whenever you cast a spell that targets one or more permanents<74> 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, - Wolf, 001, G, 1|1, Pre-Release, Creature - Wolf, David Palumbo, -
Sliver, 001, -, 1|1, -, Creature - Sliver, Igor Kieryluk, - Sliver, 001, -, 1|1, -, Creature - Sliver, Igor Kieryluk, -
Squid, 001, U, 1|1, League, Creature - Squid, Richard Wright, Islandwalk 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. Dragon, 007, R, 2|2, -, Creature - Dragon, Jack Wang, Flying {R}: This creature gets +1/+0 until end of turn.
Goblin, 008, R, 1|1, -, Creature - Goblin, Karl Kopinski, - Goblin, 008, R, 1|1, -, Creature - Goblin, Karl Kopinski, -
Beast, 009, G, 3|3, -, Creature - Beast, Dave Kendall, - Beast, 009, G, 3|3, -, Creature - Beast, Dave Kendall, -
Insect, 010, G, 1|1, -, Creature - Insect, Martina Pilcerova, Flying deathtouch Insect, 010, G, 1|1, -, Creature - Insect, Martina Pilcerova, Flying<EFBFBD> deathtouch
Treefolk Warrior, 011, G, *|*, -, Creature - Treefolk Warrior, Todd Lockwood, This creature's power and toughness are each equal to the number of Forests you control. Treefolk Warrior, 011, G, *|*, -, Creature - Treefolk Warrior, Todd Lockwood, This creature's power and toughness are each equal to the number of Forests you control.
Land Mine, 012, -, -, -, Artifact, Kev Walker, {R} Sacrifice this artifact: This artifact deals 2 damage to target attacking creature without flying. Land Mine, 012, -, -, -, Artifact, Kev Walker, {R}<7D> Sacrifice this artifact: This artifact deals 2 damage to target attacking creature without flying.
Ajani Emblem, 013, -, -, -, Emblem - Ajani, Chris Rahn, If a source would deal damage to you or a planeswalker you control prevent all but 1 of that damage. Ajani Emblem, 013, -, -, -, Emblem - Ajani, Chris Rahn, If a source would deal damage to you or a planeswalker you control<6F> prevent all but 1 of that damage.
Garruk Emblem, 014, -, -, -, Emblem - Garruk, Tyler Jacobson, Whenever a creature attacks you it gets +5/+5 and gains trample until end of turn. Garruk Emblem, 014, -, -, -, Emblem - Garruk, Tyler Jacobson, Whenever a creature attacks you<6F> 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, - 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, - Warrior, 001, W, 1|1, League, Creature - Warrior, Winona Nelson, -
Bird, 001, W, 3|4, -, Creature - Bird, Mark Zug, Flying Bird, 001, W, 3|4, -, Creature - Bird, Mark Zug, Flying
Spirit, 002, W, 1|1, -, Creature - Spirit, Mike Sass, 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, - Snake, 009, G, 1|1, -, Creature - Snake, Lars Grant-West, -
Spirit Warrior, 010, B G, *|*, -, Creature - Spirit Warrior, Ryan Alexander Lee, - Spirit Warrior, 010, B G, *|*, -, Creature - Spirit Warrior, Ryan Alexander Lee, -
Morph, 011, -, 2|2, -, Creature, Raymond Swanland, (You can cover a face-down creature with this reminder card. A card with morph can be turned face up any time for its morph cost.) Morph, 011, -, 2|2, -, Creature, Raymond Swanland, (You can cover a face-down creature with this reminder card. A card with morph can be turned face up any time for its morph cost.)
Sarkhan Emblem, 012, -, -, -, Emblem - Sarkhan, Daarken, At the beginning of your draw step draw two additional cards. At the beginning of your end step discard your hand. Sarkhan Emblem, 012, -, -, -, Emblem - Sarkhan, Daarken, At the beginning of your draw step<65> draw two additional cards. At the beginning of your end step<65> discard your hand.
Sorin Emblem, 013, -, -, -, Emblem - Sorin, Cynthia Sheppard, At the beginning of each opponent's upkeep that player sacrifices a creature. Sorin Emblem, 013, -, -, -, Emblem - Sorin, Cynthia Sheppard, At the beginning of each opponent's upkeep<65> 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 Angel, 001, W, 4|4, -, Creature - Angel, Anthony Palumbo, Flying
Cat, 002, W, 2|2, -, Creature - Cat, Scott Chou, - Cat, 002, W, 2|2, -, Creature - Cat, Scott Chou, -
Goat, 003, W, -, -, Creature - Goat, Adam Paquette, - 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 Pegasus, 005, W, 1|1, -, Creature - Pegasus, Greg Hildebrandt, Flying
Soldier, 006, W, 1|1, -, Creature - Soldier, Goran Josic, - Soldier, 006, W, 1|1, -, Creature - Soldier, Goran Josic, -
Spirit, 007, W, 1|1, -, Creature - Spirit, Ryan Yee, Flying Spirit, 007, W, 1|1, -, Creature - Spirit, Ryan Yee, Flying
Fish, 008, U, 3|3, -, Creature - Fish, Dan Scott, When this creature dies put a 6/6 blue Whale creature token onto the battlefield with "When this creature dies put a 9/9 blue Kraken creature token onto the battlefield." Fish, 008, U, 3|3, -, Creature - Fish, Dan Scott, When this creature dies<EFBFBD> put a 6/6 blue Whale creature token onto the battlefield with "When this creature dies<65> put a 9/9 blue Kraken creature token onto the battlefield."
Kraken, 009, U, 9|9, -, Creature - Kraken, Dan Scott, - Kraken, 009, U, 9|9, -, Creature - Kraken, Dan Scott, -
Whale, 010, U, 6|6, -, Creature - Whale, Dan Scott, When this creature dies put a 9/9 blue Kraken creature token onto the battlefield. Whale, 010, U, 6|6, -, Creature - Whale, Dan Scott, When this creature dies<EFBFBD> put a 9/9 blue Kraken creature token onto the battlefield.
Zombie, 011, U, *|*, -, Creature - Zombie, Dave Kendall, - Zombie, 011, U, *|*, -, Creature - Zombie, Dave Kendall, -
Demon, 012, B, *|*, -, Creature - Demon, Pete Venters, Flying Demon, 012, B, *|*, -, Creature - Demon, Pete Venters, Flying
Demon, 013, B, 5|5, -, Creature - Demon, Kev Walker, Flying Demon, 013, B, 5|5, -, Creature - Demon, Kev Walker, Flying
@ -573,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, 032, -, 3|3, -, Artifact Creature - Wurm, Raymond Swanland, Deathtouch
Wurm, 033, -, 3|3, -, Artifact Creature - Wurm, Raymond Swanland, Lifelink Wurm, 033, -, 3|3, -, Artifact Creature - Wurm, Raymond Swanland, Lifelink
Teferi Emblem, 034, -, -, -, Emblem - Teferi, Tyler Jacobson, You may activate loyalty abilities of planeswalkers you control on any player's turn any time you could cast an instant. Teferi Emblem, 034, -, -, -, Emblem - Teferi, Tyler Jacobson, You may activate loyalty abilities of planeswalkers you control on any player's turn any time you could cast an instant.
Nixilis Emblem, 035, -, -, -, Emblem - Nixilis, Daarken, {1}{B} Sacrifice a creature: You gain X life and draw X cards where X is the sacrificed creature's power. Nixilis Emblem, 035, -, -, -, Emblem - Nixilis, Daarken, {1}{B}<7D> Sacrifice a creature: You gain X life and draw X cards<64> where X is the sacrificed creature's power.
Daretti Emblem, 036, -, -, -, Emblem - Daretti, Dan Scott, Whenever an artifact is put into your graveyard from the battlefield return that card to the battlefield at the beginning of the next end step. Daretti Emblem, 036, -, -, -, Emblem - Daretti, Dan Scott, Whenever an artifact is put into your graveyard from the battlefield<6C> return that card to the battlefield at the beginning of the next end step.
DD3_EVG - Duel Decks Anthology<67> 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 Elemental, 001, G, 7|7, -, Creature - Elemental, Anthony S. Waters, Trample
Elf Warrior, 002, G, 1|1, -, Creature - Elf Warrior, Dominick Domingo, - Elf Warrior, 002, G, 1|1, -, Creature - Elf Warrior, Dominick Domingo, -
Goblin, 003, R, 1|1, -, Creature - Goblin, Dave Kendall, - Goblin, 003, R, 1|1, -, Creature - Goblin, Dave Kendall, -
DD3_JVC - Duel Decks Anthology Jace vs. Chandra (2014-12-05) DD3_JVC - Duel Decks Anthology<EFBFBD> Jace vs. Chandra (2014-12-05)
Elemental Shaman, 004, R, 3|1, -, Creature - Elemental Shaman, Jim Pavelec, - Elemental Shaman, 004, R, 3|1, -, Creature - Elemental Shaman, Jim Pavelec, -
DD3_DVD - Duel Decks Anthology Divine vs. Demonic (2014-12-05) DD3_DVD - Duel Decks Anthology<EFBFBD> Divine vs. Demonic (2014-12-05)
Spirit, 005, W, 1|1, -, Creature - Spirit, Luca Zontini, Flying Spirit, 005, W, 1|1, -, Creature - Spirit, Luca Zontini, Flying
Demon, 006, B, *|*, -, Creature - Demon, Pete Venters, Flying Demon, 006, B, *|*, -, Creature - Demon, Pete Venters, Flying
Thrull, 007, B, -, -, Creature - Thrull, Veronique Meignaud, - Thrull, 007, B, -, -, Creature - Thrull, Veronique Meignaud, -
DD3_GVL - Duel Decks Anthology Garruk vs. Liliana (2014-12-05) DD3_GVL - Duel Decks Anthology<EFBFBD> Garruk vs. Liliana (2014-12-05)
Beast, 008, G, 3|3, -, Creature - Beast, John Donahue, - Beast, 008, G, 3|3, -, Creature - Beast, John Donahue, -
Beast, 009, G, 4|4, -, Creature - Beast, Steve Prescott, - Beast, 009, G, 4|4, -, Creature - Beast, Steve Prescott, -
Elephant, 010, G, 3|3, -, Creature - Elephant, Arnie Swekel, - Elephant, 010, G, 3|3, -, Creature - Elephant, Arnie Swekel, -
Bat, 011, B, 1|1, -, Creature - Bat, Wayne Reynolds, Flying 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, 001, W, 1|1, -, Creature - Monk, Steven Belledin, Prowess
Monk, 001T, W, 1|1, League, Creature - Monk, Magali Villeneuve, Prowess Monk, 001T, W, 1|1, League, Creature - Monk, Magali Villeneuve, Prowess
Spirit, 002, W, 1|1, -, Creature - Spirit, Aaron Miller, Flying Spirit, 002, W, 1|1, -, Creature - Spirit, Aaron Miller, Flying
Warrior, 003, B, 2|1, -, Creature - Warrior, Zoltan Boros, - 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.) 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, - Soldier, 066, W, 1|1, -, Creature - Soldier, Svetlin Velinov, -
Kraken, 067, U, 9|9, -, Creature - Kraken, Dan Scott, - 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, - Warrior, 001, W, 1|1, -, Creature - Warrior, Aaron Miller, -
Djinn Monk, 002, U, 2|2, -, Creature - Djinn Monk, Izzy, Flying Djinn Monk, 002, U, 2|2, -, Creature - Djinn Monk, Izzy, Flying
Zombie, 003, B, 2|2, -, Creature - Zombie, Vincent Proce, - 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.) 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. 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, 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, 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. 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, - Golem, 015, -, 3|3, -, Artifact Creature - Golem, Nic Klein, -
Myr, 016, -, 1|1, -, Artifact Creature - Myr, Ryan Pancoast, - 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 Angel, 001, W, 4|4, -, Creature - Angel, Cyril Van Der Haegen, Flying
Knight, 002, W, 2|2, -, Creature - Knight, Matt Stewart, Vigilance Knight, 002, W, 2|2, -, Creature - Knight, Matt Stewart, Vigilance
Soldier, 003, W, 1|1, -, Creature - Soldier, Steve Prescott, - Soldier, 003, W, 1|1, -, Creature - Soldier, Steve Prescott, -
Demon, 004, B, 5|5, -, Creature - Demon, Kev Walker, Flying Demon, 004, B, 5|5, -, Creature - Demon, Kev Walker, Flying
Zombie, 005, B, 2|2, -, Creature - Zombie, Lucas Graciano, - Zombie, 005, B, 2|2, -, Creature - Zombie, Lucas Graciano, -
Goblin, 006, R, 1|1, -, Creature - Goblin, Brandon Kitkouski, - Goblin, 006, R, 1|1, -, Creature - Goblin, Brandon Kitkouski, -
Ashaya the Awoken World, 007, G, 4|4, -, Legendary Creature - Elemental, Raymond Swanland, - Ashaya<EFBFBD> the Awoken World, 007, G, 4|4, -, Legendary Creature - Elemental, Raymond Swanland, -
Elemental, 008, G, 2|2, -, Creature - Elemental, Marco Nelor, - Elemental, 008, G, 2|2, -, Creature - Elemental, Marco Nelor, -
Elf Warrior, 009, G, 1|1, -, Creature - Elf Warrior, William O'Connor, - Elf Warrior, 009, G, 1|1, -, Creature - Elf Warrior, William O'Connor, -
Thopter, 010, -, 1|1, -, Artifact Creature - Thopter, Adam Paquette, Flying Thopter, 010, -, 1|1, -, Artifact Creature - Thopter, Adam Paquette, Flying
Thopter, 011, -, 1|1, -, Artifact Creature - Thopter, Svetlin Velinov, Flying Thopter, 011, -, 1|1, -, Artifact Creature - Thopter, Svetlin Velinov, Flying
Jace Emblem, 012, -, -, -, Emblem - Jace, Jaime Jones, Whenever you cast a spell target opponent puts the top five cards of his or her library into his or her graveyard. Jace Emblem, 012, -, -, -, Emblem - Jace, Jaime Jones, Whenever you cast a spell<6C> target opponent puts the top five cards of his or her library into his or her graveyard.
Liliana Emblem, 013, -, -, -, Emblem - Liliana, Karla Ortiz, Whenever a creature dies return it to the battlefield under your control at the beginning of the next end step. Liliana Emblem, 013, -, -, -, Emblem - Liliana, Karla Ortiz, Whenever a creature dies<65> return it to the battlefield under your control at the beginning of the next end step.
Chandra Emblem, 014, -, -, -, Emblem - Chandra, Eric Deschamps, At the beginning of your upkeep this emblem deals 3 damage to you. Chandra Emblem, 014, -, -, -, Emblem - Chandra, Eric Deschamps, At the beginning of your upkeep<65> 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, 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, 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. 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, - Hellion, 079, R, 4|4, -, Creature - Hellion, Anthony Francisco, -
Plant, 080, G, -, -, Creature - Plant, Daren Bader, - 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, 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, 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. 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, - Octopus, 007, U, 8|8, -, Creature - Octopus, Craig J Spearing, -
Dragon, 008, R, 5|5, -, Creature - Dragon, Raymond Swanland, Flying Dragon, 008, R, 5|5, -, Creature - Dragon, Raymond Swanland, Flying
Plant, 009, G, 1|1, -, Creature - Plant, Sam Burley, - Plant, 009, G, 1|1, -, Creature - Plant, Sam Burley, -
Elemental, 009, R, 3|1, -, Creature - Elemental, Victor Adame Minguez, Trample Haste Elemental, 009, R, 3|1, -, Creature - Elemental, Victor Adame Minguez, Trample<EFBFBD> Haste
Elemental, 011, G R, 5|5, -, Creature - Elemental, Brad Rigney, - Elemental, 011, G R, 5|5, -, Creature - Elemental, Brad Rigney, -
Gideon Emblem, 012, -, -, -, Emblem - Gideon, Eric Deschamps, - Gideon Emblem, 012, -, -, -, Emblem - Gideon, Eric Deschamps, -
Nixilis Emblem, 013, -, -, -, Emblem - Nixilis, Chris Rahn, - Nixilis Emblem, 013, -, -, -, Emblem - Nixilis, Chris Rahn, -
Kiora Emblem, 014, -, -, -, Emblem - Kiora, Jason Chan, - 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 Shapeshifter, 001, -, 1|1, -, Creature - Shapeshifter, Franz Vohwinkel, Changeling
Angel, 002, W, 4|4, -, Creature - Angel, Cyril Van Der Haegen, Flying Angel, 002, W, 4|4, -, Creature - Angel, Cyril Van Der Haegen, Flying
Cat, 003, W, 2|2, -, Creature - Cat, Jesper Ejsing, - 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, - Zombie, 008, B, 2|2, -, Creature - Zombie, Lucas Graciano, -
Dragon, 009, R, 5|5, -, Creature - Dragon, Jim Pavelec, Flying Dragon, 009, R, 5|5, -, Creature - Dragon, Jim Pavelec, Flying
Elemental Shaman, 010, R, 3|1, -, Creature - Elemental Shaman, Jim Pavelec, - Elemental Shaman, 010, R, 3|1, -, Creature - Elemental Shaman, Jim Pavelec, -
Lightning Rager, 011, R, 5|1, -, Creature - Elemental, Svetlin Velinov, Trample Haste At the beginning of your end step sacrifice this creature. Lightning Ranger, 011, R, 5|1, -, Creature - Elemental, Svetlin Velinov, Trample<EFBFBD> Haste At the beginning of your end step<65> sacrifice this creature.
Bear, 012, G, 2|2, -, Creature - Bear, Heather Hudson, - Bear, 012, G, 2|2, -, Creature - Bear, Heather Hudson, -
Beast, 013, G, 4|4, -, Creature - Beast, Svetlin Velinov, - Beast, 013, G, 4|4, -, Creature - Beast, Svetlin Velinov, -
Elephant, 014, G, 3|3, -, Creature - Elephant, Lars Grant-West, - Elephant, 014, G, 3|3, -, Creature - Elephant, Lars Grant-West, -
@ -708,5 +708,40 @@ Wolf, 019, G, 2|2, -, Creature - Wolf, David Palumbo, -
Elemental, 020, U R, 5|5, -, Creature - Elemental, Randy Gallegos, Flying Elemental, 020, U R, 5|5, -, Creature - Elemental, Randy Gallegos, Flying
Snake, 021, G U, 1|1, -, Creature - Snake, Christopher Moeller, - Snake, 021, G U, 1|1, -, Creature - Snake, Christopher Moeller, -
Spirit, 022, W B, 1|1, -, Creature - Spirit, Cliff Childs, Flying Spirit, 022, W B, 1|1, -, Creature - Spirit, Cliff Childs, Flying
Spirit, 023, -, *|*, -, Enchantment Creature - Spirit, Adam Paquette, This creature's power and toughness are each equal to the number of experience counters you have. Spirit, 023, W B, *|*, -, Enchantment Creature - Spirit, Adam Paquette, This creature's power and toughness are each equal to the number of experience counters you have.
Gold, 024, -, -, -, Artifact, Richard Wright, Sacrifice this artifact: Add one mana of any color to your mana pool. Gold, 024, -, -, -, Artifact, Richard Wright, Sacrifice this artifact: Add one mana of any color to your mana pool.
OGW - Oath of the Gatewatch (2016-01-22)
Eldrazi Scion, 001, -, 1|1, -, Creature - Eldrazi Scion, Izzy, Sacrifice this creature: Add {1} to your mana pool.
Eldrazi Scion, 002, -, 1|1, -, Creature - Eldrazi Scion, Craig J Spearing, Sacrifice this creature: Add {1} to your mana pool.
Eldrazi Scion, 003, -, 1|1, -, Creature - Eldrazi Scion, Svetlin Velinov, Sacrifice this creature: Add {1} to your mana pool.
Eldrazi Scion, 004, -, 1|1, -, Creature - Eldrazi Scion, Izzy, Sacrifice this creature: Add {1} to your mana pool.
Eldrazi Scion, 005, -, 1|1, -, Creature - Eldrazi Scion, Winona Nelson, Sacrifice this creature: Add {1} to your mana pool.
Eldrazi Scion, 006, -, 1|1, -, Creature - Eldrazi Scion, Svetlin Velinov, Sacrifice this creature: Add {1} to your mana pool.
Angel, 007, W, 3|3, -, Creature - Angel, Anastasia Ovchinnikova, Flying
Zombie, 008, B, 2|2, -, Creature - Zombie, Kev Walker, -
Elemental, 009, R, 3|1, -, Creature - Elemental, Raymond Swanland, -
Elemental, 010, G, *|*, -, Creature - Elemental, Vincent Proce, -
Plant, 011, G, -, -, Creature - Plant, Daren Bader, -
SOI - Shadows over Innistrad (2016-04-08)
Angel, 001, W, 4|4, -, Creature - Angel, Magali Villeneuve, Flying
Human Soldier, 002, W, 1|1, -, Creature - Human Soldier, Deruchenko Alexander, -
Spirit, 003, W, 1|1, -, Creature - Spirit, Jason A. Engle, Flying
Vampire Knight, 004, B, 1|1, -, Creature - Vampire Knight, Deruchenko Alexander, Lifelink
Zombie, 005, B, 2|2, -, Creature - Zombie, Craig J Spearing, -
Devil, 006, R, 1|1, -, Creature - Devil, Wayne England, When this creature dies<65> it deals 1 damage to target creature or player.
Insect, 007, G, 1|1, -, Creature - Insect, Christopher Moeller, -
Ooze, 008, G, 3|3, -, Creature - Ooze, Nils Hamm, -
Wolf, 009, G, 2|2, -, Creature - Wolf, Aaron Miller, -
Human Cleric, 010, W B, 1|1, -, Creature - Human Cleric, Min Yum, -
Clue, 011, -, -, -, Artifact - Clue, John Avon, {2} Sacrifice this Artifact: Draw a card.
Clue, 012, -, -, -, Artifact - Clue, Noah Bradley, {2} Sacrifice this Artifact: Draw a card.
Clue, 013, -, -, -, Artifact - Clue, Zezhou Chen, {2} Sacrifice this Artifact: Draw a card.
Clue, 014, -, -, -, Artifact - Clue, Cliff Childs, {2} Sacrifice this Artifact: Draw a card.
Clue, 015, -, -, -, Artifact - Clue, James Paick, {2} Sacrifice this Artifact: Draw a card.
Clue, 016, -, -, -, Artifact - Clue, Franz Vohwinkel, {2} Sacrifice this Artifact: Draw a card.
Jace Emblem, 017, -, -, -, Emblem - Jace, Tyler Jacobson, Whenever an opponent casts his or her first spell each turn<72> counter that spell.
Arlinn Emblem, 018, -, -, -, Emblem - Arlinn, Winona Nelson, Creatures you control have haste and '{T}: This creature deals damage equal to its power to target creature or player.'

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

View file

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

View file

@ -24,7 +24,7 @@ public class EmblemView implements CommandObjectView, Serializable {
} else { } else {
expansionSetCode = emblem.getExpansionSetCodeForImage(); expansionSetCode = emblem.getExpansionSetCodeForImage();
} }
rules = emblem.getAbilities().getRules(sourceCard.getName()); rules = emblem.getAbilities().getRules(sourceCard.getName());
} }

View file

@ -36,7 +36,6 @@ import java.util.UUID;
import mage.MageObject; import mage.MageObject;
import mage.abilities.costs.Cost; import mage.abilities.costs.Cost;
import mage.cards.Card; import mage.cards.Card;
import mage.constants.CardType;
import mage.constants.PhaseStep; import mage.constants.PhaseStep;
import mage.constants.TurnPhase; import mage.constants.TurnPhase;
import mage.constants.Zone; import mage.constants.Zone;
@ -81,10 +80,10 @@ public class GameView implements Serializable {
private final PhaseStep step; private final PhaseStep step;
private final UUID activePlayerId; private final UUID activePlayerId;
private String activePlayerName = ""; private String activePlayerName = "";
private String priorityPlayerName = ""; private String priorityPlayerName;
private final int turn; private final int turn;
private boolean special = false; private boolean special = false;
private final boolean isPlayer; private final boolean isPlayer; // false = watching user
private final int spellsCastCurrentTurn; private final int spellsCastCurrentTurn;
private final boolean rollbackTurnsAllowed; private final boolean rollbackTurnsAllowed;
@ -127,20 +126,10 @@ public class GameView implements Serializable {
stack.put(stackObject.getId(), new StackAbilityView(game, (StackAbility) stackObject, token.getName(), new CardView(token))); stack.put(stackObject.getId(), new StackAbilityView(game, (StackAbility) stackObject, token.getName(), new CardView(token)));
checkPaid(stackObject.getId(), (StackAbility) stackObject); checkPaid(stackObject.getId(), (StackAbility) stackObject);
} else if (object instanceof Emblem) { } else if (object instanceof Emblem) {
Card sourceCard = game.getCard(((Emblem) object).getSourceId()); CardView cardView = new CardView(new EmblemView((Emblem) object));
CardView cardView; // Card sourceCard = (Card) ((Emblem) object).getSourceObject();
if (sourceCard != null) { ((StackAbility) stackObject).setName(((Emblem) object).getName());
if (!sourceCard.getCardType().contains(CardType.PLANESWALKER)) { // ((StackAbility) stackObject).setExpansionSetCode(sourceCard.getExpansionSetCode());
if (sourceCard.getSecondCardFace() != null) {
sourceCard = sourceCard.getSecondCardFace();
}
}
((StackAbility) stackObject).setName("Emblem " + sourceCard.getName());
((StackAbility) stackObject).setExpansionSetCode(sourceCard.getExpansionSetCode());
cardView = new CardView(new EmblemView(((Emblem) object), sourceCard));
} else {
cardView = new CardView(new EmblemView((Emblem) object));
}
stack.put(stackObject.getId(), stack.put(stackObject.getId(),
new StackAbilityView(game, (StackAbility) stackObject, object.getName(), cardView)); new StackAbilityView(game, (StackAbility) stackObject, object.getName(), cardView));
checkPaid(stackObject.getId(), ((StackAbility) stackObject)); checkPaid(stackObject.getId(), ((StackAbility) stackObject));
@ -187,18 +176,22 @@ public class GameView implements Serializable {
} else { } else {
this.activePlayerName = ""; this.activePlayerName = "";
} }
Player priorityPlayer = null;
if (state.getPriorityPlayerId() != null) { if (state.getPriorityPlayerId() != null) {
this.priorityPlayerName = state.getPlayer(state.getPriorityPlayerId()).getName(); priorityPlayer = state.getPlayer(state.getPriorityPlayerId());
this.priorityPlayerName = priorityPlayer != null ? priorityPlayer.getName() : "";
} else { } else {
this.priorityPlayerName = ""; this.priorityPlayerName = "";
} }
for (CombatGroup combatGroup : state.getCombat().getGroups()) { for (CombatGroup combatGroup : state.getCombat().getGroups()) {
combat.add(new CombatGroupView(combatGroup, game)); combat.add(new CombatGroupView(combatGroup, game));
} }
if (isPlayer) { if (isPlayer) { // no watcher
// has only to be set for active palyer with priority (e.g. pay mana by delve or Quenchable Fire special action) // has only to be set for active player with priority (e.g. pay mana by delve or Quenchable Fire special action)
if (createdForPlayer != null && createdForPlayerId != null && createdForPlayerId.equals(state.getPriorityPlayerId())) { if (priorityPlayer != null && createdForPlayer != null && createdForPlayerId != null && createdForPlayer.isGameUnderControl()
this.special = state.getSpecialActions().getControlledBy(state.getPriorityPlayerId(), createdForPlayer.isInPayManaMode()).size() > 0; && (createdForPlayerId.equals(priorityPlayer.getId()) // player controls the turn
|| createdForPlayer.getPlayersUnderYourControl().contains(priorityPlayer.getId()))) { // player controls active players turn
this.special = state.getSpecialActions().getControlledBy(priorityPlayer.getId(), priorityPlayer.isInPayManaMode()).size() > 0;
} }
} else { } else {
this.special = false; this.special = false;

View file

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

View file

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

View file

@ -107,7 +107,7 @@ public class ChatManager {
} }
private boolean containsSwearing(String message) { private boolean containsSwearing(String message) {
if (message != null && message.toLowerCase().matches("^.*(anal|asshole|balls|bastard|bitch|blowjob|cock|crap|cunt|cum|damn|dick|dildo|douche|fag|fuck|idiot|moron|piss|prick|pussy|rape|rapist|sex|screw|shit|slut|vagina).*$")) { if (message != null && message.toLowerCase().matches("^.*(anal|asshole|balls|bastard|bitch|blowjob|cock|crap|cunt|cum|damn|dick|dildo|douche|fag|fuck|idiot|moron|penis|piss|prick|pussy|rape|rapist|sex|screw|shit|slut|vagina).*$")) {
return true; return true;
} }
return false; return false;

View file

@ -1,96 +1,96 @@
/* /*
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without modification, are * Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met: * permitted provided that the following conditions are met:
* *
* 1. Redistributions of source code must retain the above copyright notice, this list of * 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer. * conditions and the following disclaimer.
* *
* 2. Redistributions in binary form must reproduce the above copyright notice, this list * 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 * of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution. * provided with the distribution.
* *
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED * 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 * 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 * 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 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 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 * 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 * 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 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* *
* The views and conclusions contained in the software and documentation are those of the * The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed * authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com. * or implied, of BetaSteward_at_googlemail.com.
*/ */
package mage.cards.a; package mage.cards.a;
import java.util.UUID; import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.costs.Cost; import mage.abilities.costs.Cost;
import mage.abilities.costs.CostImpl; import mage.abilities.costs.CostImpl;
import mage.abilities.keyword.CumulativeUpkeepAbility; import mage.abilities.keyword.CumulativeUpkeepAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
/** /**
* *
* @author Styxo * @author Styxo
*/ */
public class Aboroth extends CardImpl { public class Aboroth extends CardImpl {
public Aboroth(UUID ownerId, CardSetInfo setInfo) { public Aboroth(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{G}{G}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{G}{G}");
this.subtype.add("Elemental"); this.subtype.add("Elemental");
this.power = new MageInt(9); this.power = new MageInt(9);
this.toughness = new MageInt(9); this.toughness = new MageInt(9);
// Cumulative upkeep-Put a -1/-1 counter on Aboroth. // Cumulative upkeep-Put a -1/-1 counter on Aboroth.
this.addAbility(new CumulativeUpkeepAbility(new AborothCost())); this.addAbility(new CumulativeUpkeepAbility(new AborothCost()));
} }
public Aboroth(final Aboroth card) { public Aboroth(final Aboroth card) {
super(card); super(card);
} }
@Override @Override
public Aboroth copy() { public Aboroth copy() {
return new Aboroth(this); return new Aboroth(this);
} }
} }
class AborothCost extends CostImpl { class AborothCost extends CostImpl {
public AborothCost() { public AborothCost() {
this.text = "Put a -1/-1 counter on Aboroth"; this.text = "Put a -1/-1 counter on Aboroth";
} }
@Override @Override
public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana, Cost costToPay) { public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana, Cost costToPay) {
Permanent permanent = game.getPermanent(sourceId); Permanent permanent = game.getPermanent(sourceId);
if (permanent != null) { if (permanent != null) {
permanent.addCounters(CounterType.M1M1.createInstance(), game); permanent.addCounters(CounterType.M1M1.createInstance(), ability, game);
this.paid = true; this.paid = true;
return true; return true;
} }
return false; return false;
} }
@Override @Override
public boolean canPay(Ability ability, UUID sourceId, UUID controllerId, Game game) { public boolean canPay(Ability ability, UUID sourceId, UUID controllerId, Game game) {
return true; return true;
} }
@Override @Override
public AborothCost copy() { public AborothCost copy() {
return new AborothCost(); return new AborothCost();
} }
} }

View file

@ -119,7 +119,7 @@ class AetherbornMarauderEffect extends OneShotEffect {
} }
if (numberToMove > 0) { if (numberToMove > 0) {
fromPermanent.removeCounters(CounterType.P1P1.createInstance(numberToMove), game); fromPermanent.removeCounters(CounterType.P1P1.createInstance(numberToMove), game);
sourceObject.addCounters(CounterType.P1P1.createInstance(numberToMove), game); sourceObject.addCounters(CounterType.P1P1.createInstance(numberToMove), source, game);
} }
} }
} }

View file

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

View file

@ -132,7 +132,7 @@ class AngelheartVialEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getSourceId()); Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null) { if (permanent != null) {
permanent.addCounters(CounterType.CHARGE.createInstance((Integer) this.getValue("damageAmount")), game); permanent.addCounters(CounterType.CHARGE.createInstance((Integer) this.getValue("damageAmount")), source, game);
} }
return true; return true;
} }

View file

@ -147,7 +147,7 @@ class AnimationModuleEffect extends OneShotEffect {
if (permanent.getCounters(game).size() == 1) { if (permanent.getCounters(game).size() == 1) {
for (Counter counter : permanent.getCounters(game).values()) { for (Counter counter : permanent.getCounters(game).values()) {
Counter newCounter = new Counter(counter.getName()); Counter newCounter = new Counter(counter.getName());
permanent.addCounters(newCounter, game); permanent.addCounters(newCounter, source, game);
} }
} }
else { else {
@ -162,7 +162,7 @@ class AnimationModuleEffect extends OneShotEffect {
for (Counter counter : permanent.getCounters(game).values()) { for (Counter counter : permanent.getCounters(game).values()) {
if (counter.getName().equals(choice.getChoice())) { if (counter.getName().equals(choice.getChoice())) {
Counter newCounter = new Counter(counter.getName()); Counter newCounter = new Counter(counter.getName());
permanent.addCounters(newCounter, game); permanent.addCounters(newCounter, source, game);
break; break;
} }
} }

View file

@ -101,7 +101,7 @@ class AnthroplasmEffect extends OneShotEffect {
//Remove all +1/+1 counters //Remove all +1/+1 counters
permanent.removeCounters(permanent.getCounters(game).get(CounterType.P1P1.getName()), game); permanent.removeCounters(permanent.getCounters(game).get(CounterType.P1P1.getName()), game);
//put X +1/+1 counters //put X +1/+1 counters
permanent.addCounters(CounterType.P1P1.createInstance(source.getManaCostsToPay().getX()), game); permanent.addCounters(CounterType.P1P1.createInstance(source.getManaCostsToPay().getX()), source, game);
return true; return true;
} }
return false; return false;

View file

@ -103,9 +103,9 @@ class ApocalypseHydraEffect extends OneShotEffect {
int amount = spellAbility.getManaCostsToPay().getX(); int amount = spellAbility.getManaCostsToPay().getX();
if (amount > 0) { if (amount > 0) {
if (amount < 5) { if (amount < 5) {
permanent.addCounters(CounterType.P1P1.createInstance(amount), game); permanent.addCounters(CounterType.P1P1.createInstance(amount), source, game);
} else { } else {
permanent.addCounters(CounterType.P1P1.createInstance(amount * 2), game); permanent.addCounters(CounterType.P1P1.createInstance(amount * 2), source, game);
} }
} }
} }

View file

@ -125,7 +125,7 @@ class ArbiterOfTheIdealEffect extends OneShotEffect {
card.putOntoBattlefield(game, Zone.LIBRARY, source.getSourceId(), source.getControllerId()); card.putOntoBattlefield(game, Zone.LIBRARY, source.getSourceId(), source.getControllerId());
Permanent permanent = game.getPermanent(card.getId()); Permanent permanent = game.getPermanent(card.getId());
if (permanent != null) { if (permanent != null) {
permanent.addCounters(new Counter("Manifestation"), game); permanent.addCounters(new Counter("Manifestation"), source, game);
ContinuousEffect effect = new AddCardTypeTargetEffect(CardType.ENCHANTMENT, Duration.Custom); ContinuousEffect effect = new AddCardTypeTargetEffect(CardType.ENCHANTMENT, Duration.Custom);
effect.setTargetPointer(new FixedTarget(permanent.getId())); effect.setTargetPointer(new FixedTarget(permanent.getId()));
game.addEffect(effect, source); game.addEffect(effect, source);

View file

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

View file

@ -108,7 +108,7 @@ class ArsenalThresherEffect extends OneShotEffect {
} }
if (arsenalThresher != null) { if (arsenalThresher != null) {
controller.revealCards(arsenalThresher.getIdName(), cards, game); controller.revealCards(arsenalThresher.getIdName(), cards, game);
arsenalThresher.addCounters(CounterType.P1P1.createInstance(cards.size()), game); arsenalThresher.addCounters(CounterType.P1P1.createInstance(cards.size()), source, game);
} }
} }
} }

View file

@ -1,171 +1,171 @@
/* /*
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without modification, are * Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met: * permitted provided that the following conditions are met:
* *
* 1. Redistributions of source code must retain the above copyright notice, this list of * 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer. * conditions and the following disclaimer.
* *
* 2. Redistributions in binary form must reproduce the above copyright notice, this list * 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 * of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution. * provided with the distribution.
* *
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED * 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 * 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 * 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 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 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 * 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 * 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 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* *
* The views and conclusions contained in the software and documentation are those of the * The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed * authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com. * or implied, of BetaSteward_at_googlemail.com.
*/ */
package mage.cards.a; package mage.cards.a;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.LoyaltyAbility; import mage.abilities.LoyaltyAbility;
import mage.abilities.common.LeavesBattlefieldAllTriggeredAbility; import mage.abilities.common.LeavesBattlefieldAllTriggeredAbility;
import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility;
import mage.abilities.effects.Effect; import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.DamageControllerEffect; import mage.abilities.effects.common.DamageControllerEffect;
import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.effects.common.GetEmblemTargetPlayerEffect; import mage.abilities.effects.common.GetEmblemTargetPlayerEffect;
import mage.abilities.effects.common.SetPlayerLifeAllEffect; import mage.abilities.effects.common.SetPlayerLifeAllEffect;
import mage.abilities.effects.common.discard.DiscardControllerEffect; import mage.abilities.effects.common.discard.DiscardControllerEffect;
import mage.abilities.effects.common.discard.DiscardHandAllEffect; import mage.abilities.effects.common.discard.DiscardHandAllEffect;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Outcome; import mage.constants.Outcome;
import mage.constants.TargetController; import mage.constants.TargetController;
import mage.constants.Zone; import mage.constants.Zone;
import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.common.FilterCreaturePermanent; import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.Predicates; import mage.filter.predicate.Predicates;
import mage.filter.predicate.permanent.TokenPredicate; import mage.filter.predicate.permanent.TokenPredicate;
import mage.game.Game; import mage.game.Game;
import mage.game.command.Emblem; import mage.game.command.Emblem;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.players.Player; import mage.players.Player;
import mage.target.TargetPlayer; import mage.target.TargetPlayer;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
/** /**
* *
* @author Styxo * @author Styxo
*/ */
public class AurraSingBaneOfJedi extends CardImpl { public class AurraSingBaneOfJedi extends CardImpl {
public AurraSingBaneOfJedi(UUID ownerId, CardSetInfo setInfo) { public AurraSingBaneOfJedi(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{2}{B}{R}"); super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{2}{B}{R}");
this.subtype.add("Aurra"); this.subtype.add("Aurra");
this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3));
// +1:You may have {this} deal 2 damage to target creature. If you don't, {this} deals 1 damage to you. // +1:You may have {this} deal 2 damage to target creature. If you don't, {this} deals 1 damage to you.
Ability ability = new LoyaltyAbility(new AurraSingBaneOfJediEffect(), +1); Ability ability = new LoyaltyAbility(new AurraSingBaneOfJediEffect(), +1);
ability.addTarget(new TargetCreaturePermanent()); ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability); this.addAbility(ability);
// -4:Target player gets an emblem wiht "Whenever a nontoken creature you control leave the battlefied, discard a card.". // -4:Target player gets an emblem wiht "Whenever a nontoken creature you control leave the battlefied, discard a card.".
ability = new LoyaltyAbility(new GetEmblemTargetPlayerEffect(new AurraSingBaneOfJediEmblem()), -4); ability = new LoyaltyAbility(new GetEmblemTargetPlayerEffect(new AurraSingBaneOfJediEmblem()), -4);
ability.addTarget(new TargetPlayer()); ability.addTarget(new TargetPlayer());
this.addAbility(ability); this.addAbility(ability);
// -6:Each player discards his or her hand and sacrificies all creatures he or she controls. Each player's life total becomes 1." // -6:Each player discards his or her hand and sacrificies all creatures he or she controls. Each player's life total becomes 1."
ability = new LoyaltyAbility(new DiscardHandAllEffect(), -6); ability = new LoyaltyAbility(new DiscardHandAllEffect(), -6);
ability.addEffect(new SacrificeAllEffect()); ability.addEffect(new SacrificeAllEffect());
Effect effect = new SetPlayerLifeAllEffect(1, TargetController.ANY); Effect effect = new SetPlayerLifeAllEffect(1, TargetController.ANY);
ability.addEffect(effect); ability.addEffect(effect);
this.addAbility(ability); this.addAbility(ability);
} }
public AurraSingBaneOfJedi(final AurraSingBaneOfJedi card) { public AurraSingBaneOfJedi(final AurraSingBaneOfJedi card) {
super(card); super(card);
} }
@Override @Override
public AurraSingBaneOfJedi copy() { public AurraSingBaneOfJedi copy() {
return new AurraSingBaneOfJedi(this); return new AurraSingBaneOfJedi(this);
} }
} }
class AurraSingBaneOfJediEffect extends OneShotEffect { class AurraSingBaneOfJediEffect extends OneShotEffect {
public AurraSingBaneOfJediEffect() { public AurraSingBaneOfJediEffect() {
super(Outcome.Damage); super(Outcome.Damage);
staticText = "You may have {this} deal 2 damage to target creature. If you don't, {this} deals 1 damage to you"; staticText = "You may have {this} deal 2 damage to target creature. If you don't, {this} deals 1 damage to you";
} }
public AurraSingBaneOfJediEffect(final AurraSingBaneOfJediEffect effect) { public AurraSingBaneOfJediEffect(final AurraSingBaneOfJediEffect effect) {
super(effect); super(effect);
} }
@Override @Override
public AurraSingBaneOfJediEffect copy() { public AurraSingBaneOfJediEffect copy() {
return new AurraSingBaneOfJediEffect(this); return new AurraSingBaneOfJediEffect(this);
} }
@Override @Override
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId()); Player controller = game.getPlayer(source.getControllerId());
if (controller != null) { if (controller != null) {
if (controller.chooseUse(outcome, "Deal 2 damage to " + game.getPermanent(getTargetPointer().getFirst(game, source)).getName() + "?", source, game)) { if (controller.chooseUse(outcome, "Deal 2 damage to " + game.getPermanent(getTargetPointer().getFirst(game, source)).getName() + "?", source, game)) {
new DamageTargetEffect(2).apply(game, source); new DamageTargetEffect(2).apply(game, source);
} else { } else {
new DamageControllerEffect(1).apply(game, source); new DamageControllerEffect(1).apply(game, source);
} }
return true; return true;
} }
return false; return false;
} }
} }
class SacrificeAllEffect extends OneShotEffect { class SacrificeAllEffect extends OneShotEffect {
SacrificeAllEffect() { SacrificeAllEffect() {
super(Outcome.DestroyPermanent); super(Outcome.DestroyPermanent);
staticText = "and sacrificies all creatures he or she controls"; staticText = "and sacrificies all creatures he or she controls";
} }
SacrificeAllEffect(final SacrificeAllEffect effect) { SacrificeAllEffect(final SacrificeAllEffect effect) {
super(effect); super(effect);
} }
@Override @Override
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
List<Permanent> permanents = game.getBattlefield().getActivePermanents(new FilterCreaturePermanent(), source.getControllerId(), source.getId(), game); List<Permanent> permanents = game.getBattlefield().getActivePermanents(new FilterCreaturePermanent(), source.getControllerId(), source.getId(), game);
for (Permanent p : permanents) { for (Permanent p : permanents) {
p.sacrifice(source.getSourceId(), game); p.sacrifice(source.getSourceId(), game);
} }
return true; return true;
} }
@Override @Override
public SacrificeAllEffect copy() { public SacrificeAllEffect copy() {
return new SacrificeAllEffect(this); return new SacrificeAllEffect(this);
} }
} }
class AurraSingBaneOfJediEmblem extends Emblem { class AurraSingBaneOfJediEmblem extends Emblem {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("a nontoken creature you control"); private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("a nontoken creature you control");
static { static {
filter.add(Predicates.not(new TokenPredicate())); filter.add(Predicates.not(new TokenPredicate()));
} }
// Whenever a nontoken creature you control leave the battlefied, discard a card." // Whenever a nontoken creature you control leave the battlefied, discard a card."
public AurraSingBaneOfJediEmblem() { public AurraSingBaneOfJediEmblem() {
this.setName("Emblem - Aurra"); this.setName("Emblem Aurra Sing, Bane of Jedi");
getAbilities().add(new LeavesBattlefieldAllTriggeredAbility(Zone.COMMAND, new DiscardControllerEffect(1), filter, false)); getAbilities().add(new LeavesBattlefieldAllTriggeredAbility(Zone.COMMAND, new DiscardControllerEffect(1), filter, false));
} }
} }

View file

@ -127,7 +127,7 @@ class AzorsElocutorsEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getSourceId()); Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null) { if (permanent != null) {
permanent.addCounters(new Counter("filibuster"), game); permanent.addCounters(new Counter("filibuster"), source, game);
if (permanent.getCounters(game).getCount("filibuster") > 4) { if (permanent.getCounters(game).getCount("filibuster") > 4) {
Player player = game.getPlayer(permanent.getControllerId()); Player player = game.getPlayer(permanent.getControllerId());
if (player != null) { if (player != null) {

View file

@ -43,13 +43,12 @@ import mage.target.common.TargetCreaturePermanent;
public class BecomeImmense extends CardImpl { public class BecomeImmense extends CardImpl {
public BecomeImmense(UUID ownerId, CardSetInfo setInfo) { public BecomeImmense(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{5}{G}"); super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{5}{G}");
// Delve (Each card you exile from your graveyard while casting this spell pays for {1}.)
// Delve
this.addAbility(new DelveAbility()); this.addAbility(new DelveAbility());
// Target creature gets +6/+6 until end of turn // Target creature gets +6/+6 until end of turn
this.getSpellAbility().addEffect(new BoostTargetEffect(6,6,Duration.EndOfTurn)); this.getSpellAbility().addEffect(new BoostTargetEffect(6, 6, Duration.EndOfTurn));
this.getSpellAbility().addTarget(new TargetCreaturePermanent()); this.getSpellAbility().addTarget(new TargetCreaturePermanent());
} }

View file

@ -117,7 +117,7 @@ class MoveCounterFromTargetToTargetEffect extends OneShotEffect {
int amountToMove = controller.getAmount(0, amountCounters, "How many counters do you want to move?", game); int amountToMove = controller.getAmount(0, amountCounters, "How many counters do you want to move?", game);
if (amountToMove > 0) { if (amountToMove > 0) {
fromPermanent.removeCounters(CounterType.P1P1.createInstance(amountToMove), game); fromPermanent.removeCounters(CounterType.P1P1.createInstance(amountToMove), game);
toPermanent.addCounters(CounterType.P1P1.createInstance(amountToMove), game); toPermanent.addCounters(CounterType.P1P1.createInstance(amountToMove), source, game);
} }
} }
return true; return true;

View file

@ -81,7 +81,7 @@ class BlackSunsZenithEffect extends OneShotEffect {
int amount = source.getManaCostsToPay().getX(); int amount = source.getManaCostsToPay().getX();
for (Permanent permanent : game.getBattlefield().getAllActivePermanents()) { for (Permanent permanent : game.getBattlefield().getAllActivePermanents()) {
if (permanent != null && permanent.getCardType().contains(CardType.CREATURE)) { if (permanent != null && permanent.getCardType().contains(CardType.CREATURE)) {
permanent.addCounters(CounterType.M1M1.createInstance(amount), game); permanent.addCounters(CounterType.M1M1.createInstance(amount), source, game);
} }
} }
return true; return true;

View file

@ -130,9 +130,9 @@ class BladeOfTheBloodchiefEffect extends OneShotEffect {
Permanent creature = game.getPermanent(enchantment.getAttachedTo()); Permanent creature = game.getPermanent(enchantment.getAttachedTo());
if (creature != null) { if (creature != null) {
if (creature.hasSubtype("Vampire", game)) { if (creature.hasSubtype("Vampire", game)) {
creature.addCounters(CounterType.P1P1.createInstance(2), game); creature.addCounters(CounterType.P1P1.createInstance(2), source, game);
} else { } else {
creature.addCounters(CounterType.P1P1.createInstance(), game); creature.addCounters(CounterType.P1P1.createInstance(), source, game);
} }
} }
} }

View file

@ -148,7 +148,7 @@ class BloodTyrantEffect extends OneShotEffect {
} }
Permanent bloodTyrant = game.getPermanent(source.getSourceId()); Permanent bloodTyrant = game.getPermanent(source.getSourceId());
if (bloodTyrant != null && counters > 0) { if (bloodTyrant != null && counters > 0) {
bloodTyrant.addCounters(CounterType.P1P1.createInstance(counters), game); bloodTyrant.addCounters(CounterType.P1P1.createInstance(counters), source, game);
} }
return true; return true;
} }

View file

@ -107,7 +107,7 @@ class BloodsporeThrinaxEntersBattlefieldEffect extends ReplacementEffectImpl {
if (sourceCreature != null && creature != null) { if (sourceCreature != null && creature != null) {
int amount = sourceCreature.getCounters(game).getCount(CounterType.P1P1); int amount = sourceCreature.getCounters(game).getCount(CounterType.P1P1);
if (amount > 0) { if (amount > 0) {
creature.addCounters(CounterType.P1P1.createInstance(amount), game); creature.addCounters(CounterType.P1P1.createInstance(amount), source, game);
} }
} }
return false; return false;

View file

@ -111,7 +111,7 @@ class BlowflyInfestationEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
Permanent creature = game.getPermanent(source.getFirstTarget()); Permanent creature = game.getPermanent(source.getFirstTarget());
if (creature != null) { if (creature != null) {
creature.addCounters(CounterType.M1M1.createInstance(), game); creature.addCounters(CounterType.M1M1.createInstance(), source, game);
return true; return true;
} }
return false; return false;

View file

@ -201,7 +201,7 @@ class BombSquadBeginningEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
Card card = game.getCard(source.getSourceId()); Card card = game.getCard(source.getSourceId());
for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), game)) { for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), game)) {
permanent.addCounters(CounterType.FUSE.createInstance(), game); permanent.addCounters(CounterType.FUSE.createInstance(), source, game);
game.informPlayers(new StringBuilder(card.getName()).append(" puts a fuse counter on ").append(permanent.getName()).toString()); game.informPlayers(new StringBuilder(card.getName()).append(" puts a fuse counter on ").append(permanent.getName()).toString());
} }

View file

@ -119,7 +119,7 @@ class BramblewoodParagonReplacementEffect extends ReplacementEffectImpl {
public boolean replaceEvent(GameEvent event, Ability source, Game game) { public boolean replaceEvent(GameEvent event, Ability source, Game game) {
Permanent creature = ((EntersTheBattlefieldEvent) event).getTarget(); Permanent creature = ((EntersTheBattlefieldEvent) event).getTarget();
if (creature != null) { if (creature != null) {
creature.addCounters(CounterType.P1P1.createInstance(), game); creature.addCounters(CounterType.P1P1.createInstance(), source, game);
} }
return false; return false;
} }

View file

@ -103,7 +103,7 @@ class CankerAbominationEffect extends OneShotEffect {
game.informPlayers(cankerAbomination.getName() + ": " + controller.getLogName() + " has chosen " + opponent.getLogName()); game.informPlayers(cankerAbomination.getName() + ": " + controller.getLogName() + " has chosen " + opponent.getLogName());
int amount = game.getBattlefield().getAllActivePermanents(new FilterCreaturePermanent(), opponent.getId(), game).size(); int amount = game.getBattlefield().getAllActivePermanents(new FilterCreaturePermanent(), opponent.getId(), game).size();
if (amount > 0) { if (amount > 0) {
cankerAbomination.addCounters(CounterType.M1M1.createInstance(amount), game); cankerAbomination.addCounters(CounterType.M1M1.createInstance(amount), source, game);
} }
return true; return true;
} }

View file

@ -100,7 +100,7 @@ class CannibalizeEffect extends OneShotEffect {
controller.moveCardToExileWithInfo(creature, null, "", source.getSourceId(), game, Zone.BATTLEFIELD, true); controller.moveCardToExileWithInfo(creature, null, "", source.getSourceId(), game, Zone.BATTLEFIELD, true);
exileDone = true; exileDone = true;
} else { } else {
creature.addCounters(CounterType.P1P1.createInstance(2), game); creature.addCounters(CounterType.P1P1.createInstance(2), source, game);
game.informPlayers("Added two +1/+1 counters on " + creature.getLogName()); game.informPlayers("Added two +1/+1 counters on " + creature.getLogName());
} }
count++; count++;

View file

@ -93,7 +93,7 @@ class CarnifexDemonEffect extends OneShotEffect {
if (p != null) { if (p != null) {
for (Permanent t : game.getBattlefield().getAllActivePermanents()) { for (Permanent t : game.getBattlefield().getAllActivePermanents()) {
if (t.getCardType().contains(CardType.CREATURE) && !t.getId().equals(source.getSourceId())) if (t.getCardType().contains(CardType.CREATURE) && !t.getId().equals(source.getSourceId()))
t.addCounters(CounterType.M1M1.createInstance(), game); t.addCounters(CounterType.M1M1.createInstance(), source, game);
} }
} }
return false; return false;

View file

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

View file

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

View file

@ -121,7 +121,7 @@ class ChargingCinderhornDamageTargetEffect extends OneShotEffect{
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
Permanent chargingCinderhoof = game.getPermanent(source.getSourceId()); Permanent chargingCinderhoof = game.getPermanent(source.getSourceId());
if (chargingCinderhoof != null) { if (chargingCinderhoof != null) {
chargingCinderhoof.addCounters(CounterType.FURY.createInstance(), game); chargingCinderhoof.addCounters(CounterType.FURY.createInstance(), source, game);
} else { } else {
chargingCinderhoof = game.getPermanentOrLKIBattlefield(source.getSourceId()); chargingCinderhoof = game.getPermanentOrLKIBattlefield(source.getSourceId());
} }

View file

@ -200,7 +200,7 @@ class ChorusOfTheConclaveReplacementEffect2 extends ReplacementEffectImpl {
String key = event.getSourceId().toString() + (game.getState().getZoneChangeCounter(event.getSourceId()) - 1); String key = event.getSourceId().toString() + (game.getState().getZoneChangeCounter(event.getSourceId()) - 1);
int xValue = spellX.get(key); int xValue = spellX.get(key);
if (xValue > 0) { if (xValue > 0) {
creature.addCounters(CounterType.P1P1.createInstance(xValue), game); creature.addCounters(CounterType.P1P1.createInstance(xValue), source, game);
game.informPlayers(sourceObject.getLogName() + ": " + creature.getLogName() + " enters the battlefield with " + xValue + " +1/+1 counter" + (xValue > 1 ? "s" : "") + " on it"); game.informPlayers(sourceObject.getLogName() + ": " + creature.getLogName() + " enters the battlefield with " + xValue + " +1/+1 counter" + (xValue > 1 ? "s" : "") + " on it");
} }
spellX.remove(key); spellX.remove(key);

View file

@ -131,7 +131,7 @@ class CollectiveEffortEffect extends OneShotEffect {
Player target = game.getPlayer(source.getFirstTarget()); Player target = game.getPlayer(source.getFirstTarget());
if (target != null) { if (target != null) {
for (Permanent p : game.getBattlefield().getAllActivePermanents(new FilterCreaturePermanent(), target.getId(), game)) { for (Permanent p : game.getBattlefield().getAllActivePermanents(new FilterCreaturePermanent(), target.getId(), game)) {
p.addCounters(CounterType.P1P1.createInstance(), game); p.addCounters(CounterType.P1P1.createInstance(), source, game);
} }
return true; return true;
} }

View file

@ -84,12 +84,12 @@ class CommonBondEffect extends OneShotEffect {
int affectedTargets = 0; int affectedTargets = 0;
Permanent permanent = game.getPermanent(source.getTargets().get(0).getFirstTarget()); Permanent permanent = game.getPermanent(source.getTargets().get(0).getFirstTarget());
if (permanent != null) { if (permanent != null) {
permanent.addCounters(CounterType.P1P1.createInstance(1), game); permanent.addCounters(CounterType.P1P1.createInstance(1), source, game);
affectedTargets ++; affectedTargets ++;
} }
permanent = game.getPermanent(source.getTargets().get(1).getFirstTarget()); permanent = game.getPermanent(source.getTargets().get(1).getFirstTarget());
if (permanent != null) { if (permanent != null) {
permanent.addCounters(CounterType.P1P1.createInstance(1), game); permanent.addCounters(CounterType.P1P1.createInstance(1), source, game);
affectedTargets ++; affectedTargets ++;
} }
return affectedTargets > 0; return affectedTargets > 0;

View file

@ -96,7 +96,7 @@ class ContagionEngineEffect extends OneShotEffect {
Player targetPlayer = game.getPlayer(getTargetPointer().getFirst(game, source)); Player targetPlayer = game.getPlayer(getTargetPointer().getFirst(game, source));
if (targetPlayer != null) { if (targetPlayer != null) {
for (Permanent creature : game.getBattlefield().getAllActivePermanents(new FilterCreaturePermanent(), targetPlayer.getId(), game)) { for (Permanent creature : game.getBattlefield().getAllActivePermanents(new FilterCreaturePermanent(), targetPlayer.getId(), game)) {
creature.addCounters(CounterType.M1M1.createInstance(), game); creature.addCounters(CounterType.M1M1.createInstance(), source, game);
} }
return true; return true;
} }

View file

@ -129,7 +129,7 @@ class CradleOfVitalityEffect extends OneShotEffect {
Integer amount = (Integer) getValue("amount"); Integer amount = (Integer) getValue("amount");
for (UUID uuid : targetPointer.getTargets(game, source)) { for (UUID uuid : targetPointer.getTargets(game, source)) {
Permanent permanent = game.getPermanent(uuid); Permanent permanent = game.getPermanent(uuid);
permanent.addCounters(CounterType.P1P1.createInstance(amount), game); permanent.addCounters(CounterType.P1P1.createInstance(amount), source, game);
affectedTargets ++; affectedTargets ++;
} }
return affectedTargets > 0; return affectedTargets > 0;

View file

@ -91,7 +91,7 @@ class CryptbornHorrorEffect extends OneShotEffect {
if (permanent != null) { if (permanent != null) {
int oll = new OpponentsLostLifeCount().calculate(game, source, this); int oll = new OpponentsLostLifeCount().calculate(game, source, this);
if (oll > 0) { if (oll > 0) {
permanent.addCounters(CounterType.P1P1.createInstance(oll), game); permanent.addCounters(CounterType.P1P1.createInstance(oll), source, game);
} }
return true; return true;
} }

View file

@ -29,24 +29,19 @@ package mage.cards.c;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
import mage.MageObject;
import mage.MageObjectReference; import mage.MageObjectReference;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.DelayedTriggeredAbility; import mage.abilities.DelayedTriggeredAbility;
import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility; import mage.abilities.common.PutIntoGraveFromBattlefieldSourceTriggeredAbility;
import mage.abilities.condition.Condition; import mage.abilities.common.delayed.AtTheBeginOfYourNextUpkeepDelayedTriggeredAbility;
import mage.abilities.condition.common.IsStepCondition; import mage.abilities.condition.common.IsStepCondition;
import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.decorator.ConditionalActivatedAbility; import mage.abilities.decorator.ConditionalActivatedAbility;
import mage.abilities.decorator.ConditionalOneShotEffect;
import mage.abilities.effects.Effect; import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
import mage.abilities.effects.common.continuous.BecomesBasicLandTargetEffect; import mage.abilities.effects.common.continuous.BecomesBasicLandTargetEffect;
import mage.abilities.effects.common.counter.AddCountersTargetEffect; import mage.abilities.effects.common.counter.AddCountersTargetEffect;
import mage.abilities.effects.common.counter.RemoveAllCountersTargetEffect; import mage.abilities.effects.common.counter.RemoveAllCountersTargetEffect;
@ -62,17 +57,15 @@ import mage.constants.WatcherScope;
import mage.constants.Zone; import mage.constants.Zone;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.filter.common.FilterLandPermanent; import mage.filter.common.FilterLandPermanent;
import mage.filter.predicate.Predicate;
import mage.filter.predicate.Predicates; import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.SubtypePredicate; import mage.filter.predicate.mageobject.SubtypePredicate;
import mage.filter.predicate.permanent.CounterPredicate; import mage.filter.predicate.permanent.PermanentIdPredicate;
import mage.game.Game; import mage.game.Game;
import mage.game.events.GameEvent; import mage.game.events.GameEvent;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.players.Player; import mage.players.Player;
import mage.target.common.TargetLandPermanent; import mage.target.common.TargetLandPermanent;
import mage.target.targetpointer.FixedTarget; import mage.target.targetpointer.FixedTarget;
import mage.util.CardUtil;
import mage.watchers.Watcher; import mage.watchers.Watcher;
/** /**
@ -80,9 +73,9 @@ import mage.watchers.Watcher;
* @author MTGfan * @author MTGfan
*/ */
public class CyclopeanTomb extends CardImpl { public class CyclopeanTomb extends CardImpl {
private static final FilterLandPermanent filter = new FilterLandPermanent(); private static final FilterLandPermanent filter = new FilterLandPermanent();
static { static {
filter.add(Predicates.not(new SubtypePredicate("Swamp"))); filter.add(Predicates.not(new SubtypePredicate("Swamp")));
} }
@ -97,9 +90,7 @@ public class CyclopeanTomb extends CardImpl {
ability.addEffect(new BecomeSwampEffect(Duration.Custom, false, true, "Swamp")); ability.addEffect(new BecomeSwampEffect(Duration.Custom, false, true, "Swamp"));
this.addAbility(ability, new CyclopeanTombCounterWatcher()); this.addAbility(ability, new CyclopeanTombCounterWatcher());
// When Cyclopean Tomb is put into a graveyard from the battlefield, at the beginning of each of your upkeeps for the rest of the game, remove all mire counters from a land that a mire counter was put onto with Cyclopean Tomb but that a mire counter has not been removed from with Cyclopean Tomb. // When Cyclopean Tomb is put into a graveyard from the battlefield, at the beginning of each of your upkeeps for the rest of the game, remove all mire counters from a land that a mire counter was put onto with Cyclopean Tomb but that a mire counter has not been removed from with Cyclopean Tomb.
Effect effect = new CreateDelayedTriggeredAbilityEffect(new CyclopeanTombDelayedTriggeredAbility()); this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new CyclopeanTombCreateTriggeredEffect()));
effect.setText("at the beginning of each of your upkeeps for the rest of the game, remove all mire counters from a land that a mire counter was put onto with {this} but that a mire counter has not been removed from with {this}.");
this.addAbility(new PutIntoGraveFromBattlefieldSourceTriggeredAbility(effect));
} }
public CyclopeanTomb(final CyclopeanTomb card) { public CyclopeanTomb(final CyclopeanTomb card) {
@ -113,16 +104,16 @@ public class CyclopeanTomb extends CardImpl {
} }
class BecomeSwampEffect extends BecomesBasicLandTargetEffect { class BecomeSwampEffect extends BecomesBasicLandTargetEffect {
public BecomeSwampEffect(Duration duration, boolean chooseLandType, boolean loseOther, String... landNames) { public BecomeSwampEffect(Duration duration, boolean chooseLandType, boolean loseOther, String... landNames) {
super(duration, chooseLandType, loseOther, landNames); super(duration, chooseLandType, loseOther, landNames);
staticText = "That land is a Swamp for as long as it has a mire counter on it."; staticText = "That land is a Swamp for as long as it has a mire counter on it";
} }
public BecomeSwampEffect(final BecomeSwampEffect effect) { public BecomeSwampEffect(final BecomeSwampEffect effect) {
super(effect); super(effect);
} }
@Override @Override
public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) { public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) {
Permanent land = game.getPermanent(this.targetPointer.getFirst(game, source)); Permanent land = game.getPermanent(this.targetPointer.getFirst(game, source));
@ -135,36 +126,42 @@ class BecomeSwampEffect extends BecomesBasicLandTargetEffect {
} }
return true; return true;
} }
@Override @Override
public BecomeSwampEffect copy() { public BecomeSwampEffect copy() {
return new BecomeSwampEffect(this); return new BecomeSwampEffect(this);
} }
} }
class CyclopeanTombDelayedTriggeredAbility extends DelayedTriggeredAbility { class CyclopeanTombCreateTriggeredEffect extends OneShotEffect {
CyclopeanTombDelayedTriggeredAbility() { public CyclopeanTombCreateTriggeredEffect() {
super(new CyclopeanTombEffect(), Duration.OneUse, true, false); super(Outcome.Benefit);
this.staticText = "At the beginning of each of your upkeeps for the rest of the game, remove all mire counters from a land that a mire counter was put onto with {this} but that a mire counter has not been removed from with {this}";
} }
CyclopeanTombDelayedTriggeredAbility(CyclopeanTombDelayedTriggeredAbility ability) { public CyclopeanTombCreateTriggeredEffect(final CyclopeanTombCreateTriggeredEffect effect) {
super(ability); super(effect);
} }
@Override @Override
public CyclopeanTombDelayedTriggeredAbility copy() { public CyclopeanTombCreateTriggeredEffect copy() {
return new CyclopeanTombDelayedTriggeredAbility(this); return new CyclopeanTombCreateTriggeredEffect(this);
} }
@Override @Override
public boolean checkEventType(GameEvent event, Game game) { public boolean apply(Game game, Ability source) {
return event.getType() == GameEvent.EventType.BEGINNING_PHASE_PRE; Player controller = game.getPlayer(source.getControllerId());
} if (controller != null) {
Permanent tomb = game.getPermanentOrLKIBattlefield(source.getSourceId()); // we need to set the correct source object
@Override DelayedTriggeredAbility ability = new AtTheBeginOfYourNextUpkeepDelayedTriggeredAbility(new CyclopeanTombEffect(), Duration.EndOfGame, false);
public boolean checkTrigger(GameEvent event, Game game) { ability.setSourceObject(tomb, game);
return event.getPlayerId().equals(this.controllerId); ability.setControllerId(source.getControllerId());
ability.setSourceId(source.getSourceId());
game.addDelayedTriggeredAbility(ability);
return true;
}
return false;
} }
} }
@ -172,9 +169,9 @@ class CyclopeanTombEffect extends OneShotEffect {
public CyclopeanTombEffect() { public CyclopeanTombEffect() {
super(Outcome.Benefit); super(Outcome.Benefit);
this.staticText = "at the beginning of each of your upkeeps for the rest of the game, remove all mire counters from a land that a mire counter was put onto with {this} but that a mire counter has not been removed from with {this}."; this.staticText = "At the beginning of each of your upkeeps for the rest of the game, remove all mire counters from a land that a mire counter was put onto with {this} but that a mire counter has not been removed from with {this}";
} }
public CyclopeanTombEffect(final CyclopeanTombEffect effect) { public CyclopeanTombEffect(final CyclopeanTombEffect effect) {
super(effect); super(effect);
} }
@ -187,121 +184,52 @@ class CyclopeanTombEffect extends OneShotEffect {
@Override @Override
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId()); Player controller = game.getPlayer(source.getControllerId());
if(controller != null){ MageObjectReference mor = new MageObjectReference(source.getSourceId(), source.getSourceObjectZoneChangeCounter(), game);
new ChooseLandEffect().apply(game, source);
Effect effect = new RemoveAllCountersTargetEffect(CounterType.MIRE);
effect.setTargetPointer(new FixedTarget((UUID) game.getState().getValue(source.getSourceId().toString() + "_land")));
effect.apply(game, source);
//CyclopianTombEffect and CyclopeanTombDelayedTriggeredAbility will maintain a loop
//as long as there are one or more mire counters left to be removed
new ConditionalOneShotEffect(new CreateDelayedTriggeredAbilityEffect(new CyclopeanTombDelayedTriggeredAbility(), false), new CyclopeanTombCounterCondition()).apply(game, source);
return true;
}
return false;
}
}
class CyclopeanTombCounterCondition implements Condition {
private static final FilterLandPermanent mireFilter = new FilterLandPermanent();
static {
mireFilter.add(new CounterPredicate(CounterType.MIRE));
}
public CyclopeanTombCounterCondition() {
}
@Override
public boolean apply(Game game, Ability source) {
List<Permanent> permanents = game.getBattlefield().getAllActivePermanents(mireFilter, game);
Permanent cyclopeanTombInstance = game.getPermanentOrLKIBattlefield(source.getSourceId());
CyclopeanTombCounterWatcher watcher = (CyclopeanTombCounterWatcher) game.getState().getWatchers().get(CyclopeanTombCounterWatcher.class.getName()); CyclopeanTombCounterWatcher watcher = (CyclopeanTombCounterWatcher) game.getState().getWatchers().get(CyclopeanTombCounterWatcher.class.getName());
if (controller != null && watcher != null) {
for(Permanent land : permanents) {
if(watcher.landMiredByCyclopeanTombInstance(land, cyclopeanTombInstance, game)) { Set<MageObjectReference> landRef = watcher.landMiredByCyclopeanTombInstance(mor, game);
return land.getCounters(game).getCount(CounterType.MIRE) > 0; if (landRef == null || landRef.isEmpty()) { // no lands got mire counter from that instance
return true;
} }
} FilterLandPermanent filter = new FilterLandPermanent("a land with a mire counter added from the Cyclopean Tomb instance (" + landRef.size() + " left)");
return false; Set<PermanentIdPredicate> idPref = new HashSet<>();
} for (MageObjectReference ref : landRef) {
} Permanent land = ref.getPermanent(game);
if (land != null) {
class ChooseLandEffect extends OneShotEffect { idPref.add(new PermanentIdPredicate(land.getId()));
}
public ChooseLandEffect() { }
super(Outcome.Neutral); filter.add(Predicates.or(idPref));
this.staticText = "choose a land that a mire counter was put onto with Cyclopean Tomb but that a mire counter has not been removed from with Cyclopean Tomb";
}
public ChooseLandEffect(final ChooseLandEffect effect) {
super(effect);
}
@Override
public ChooseLandEffect copy() {
return new ChooseLandEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
MageObject mageObject = game.getPermanentEntering(source.getSourceId());
if (mageObject == null) {
mageObject = game.getObject(source.getSourceId());
}
FilterLandPermanent filter = new FilterLandPermanent();
filter.add(new LandIdPredicate(source));
if(controller != null && mageObject != null){
TargetLandPermanent target = new TargetLandPermanent(1, 1, filter, true); TargetLandPermanent target = new TargetLandPermanent(1, 1, filter, true);
/*Player must choose a land each upkeep. Using the message are above the player hand where frequent interactions /*Player must choose a land each upkeep. Using the message are above the player hand where frequent interactions
* take place is the most logical way to prompt for this scenario. A new constructor added to provide a not optional * take place is the most logical way to prompt for this scenario. A new constructor added to provide a not optional
* option for any cards like this where the player must choose a target in such the way this card requires. * option for any cards like this where the player must choose a target in such the way this card requires.
*/ */
if (controller.chooseTarget(Outcome.Neutral, target, source, game, false)) { if (controller.chooseTarget(Outcome.Neutral, target, source, game)) {
Permanent chosenLand = game.getPermanent(target.getFirstTarget()); Permanent chosenLand = game.getPermanent(target.getFirstTarget());
if(chosenLand != null) { if (chosenLand != null) {
game.getState().setValue(mageObject.getId() + "_land", target.getFirstTarget()); Effect effect = new RemoveAllCountersTargetEffect(CounterType.MIRE);
if (mageObject instanceof Permanent) { effect.setTargetPointer(new FixedTarget(chosenLand, game));
((Permanent) mageObject).addInfo("chosen land", CardUtil.addToolTipMarkTags("Chosen player: " + chosenLand.getLogName()), game); effect.apply(game, source);
} landRef.remove(new MageObjectReference(chosenLand, game));
return true;
} }
} }
return true;
} }
return false; return false;
} }
} }
class LandIdPredicate implements Predicate<Permanent> {
public Ability source;
public LandIdPredicate(Ability source) {
this.source = source;
}
@Override
public boolean apply(Permanent input, Game game) {
Permanent cyclopeanTombInstance = game.getPermanentOrLKIBattlefield(source.getSourceId());
CyclopeanTombCounterWatcher watcher = (CyclopeanTombCounterWatcher) game.getState().getWatchers().get(CyclopeanTombCounterWatcher.class.getName());
return watcher.landMiredByCyclopeanTombInstance(input, cyclopeanTombInstance, game);
}
}
class CyclopeanTombCounterWatcher extends Watcher { class CyclopeanTombCounterWatcher extends Watcher {
public HashMap<MageObjectReference, Set<MageObjectReference>> counterData = new HashMap<>(); public HashMap<MageObjectReference, Set<MageObjectReference>> counterData = new HashMap<>();
public CyclopeanTombCounterWatcher() { public CyclopeanTombCounterWatcher() {
super(CyclopeanTombCounterWatcher.class.getName(), WatcherScope.GAME); super(CyclopeanTombCounterWatcher.class.getName(), WatcherScope.GAME);
} }
public CyclopeanTombCounterWatcher(final CyclopeanTombCounterWatcher watcher) { public CyclopeanTombCounterWatcher(final CyclopeanTombCounterWatcher watcher) {
super(watcher); super(watcher);
for (MageObjectReference mageObjectReference : watcher.counterData.keySet()) { for (MageObjectReference mageObjectReference : watcher.counterData.keySet()) {
@ -310,7 +238,7 @@ class CyclopeanTombCounterWatcher extends Watcher {
counterData.put(mageObjectReference, miredLands); counterData.put(mageObjectReference, miredLands);
} }
} }
@Override @Override
public CyclopeanTombCounterWatcher copy() { public CyclopeanTombCounterWatcher copy() {
return new CyclopeanTombCounterWatcher(this); return new CyclopeanTombCounterWatcher(this);
@ -318,27 +246,32 @@ class CyclopeanTombCounterWatcher extends Watcher {
@Override @Override
public void watch(GameEvent event, Game game) { public void watch(GameEvent event, Game game) {
if(event.getType() == GameEvent.EventType.COUNTER_ADDED || event.getType() == GameEvent.EventType.COUNTERS_ADDED) { if (event.getType() == GameEvent.EventType.COUNTERS_ADDED && event.getData().equals(CounterType.MIRE.getName()) && event.getAmount() > 0) {
MageObjectReference cylopeanTombInstance = new MageObjectReference(/*ID needs to go here*/, game); Permanent tomb = game.getPermanentOrLKIBattlefield(event.getSourceId());
Set<MageObjectReference> miredLands = counterData.get(cylopeanTombInstance); if (tomb != null) {
if (miredLands != null) { MageObjectReference cylopeanTombInstance = new MageObjectReference(tomb, game);
Set<MageObjectReference> miredLands;
if (counterData.containsKey(cylopeanTombInstance)) {
miredLands = counterData.get(cylopeanTombInstance);
} else {
miredLands = new HashSet<>();
counterData.put(cylopeanTombInstance, miredLands);
}
miredLands.add(new MageObjectReference(event.getTargetId(), game)); miredLands.add(new MageObjectReference(event.getTargetId(), game));
} else {
miredLands = new HashSet<>();
miredLands.add(new MageObjectReference(event.getTargetId(), game));
counterData.put(cylopeanTombInstance, miredLands);
} }
} }
} }
@Override @Override
public void reset() { public void reset() {
super.reset(); super.reset();
counterData.clear();
} }
public boolean landMiredByCyclopeanTombInstance(Permanent land, Permanent cylopeanTombInstance, Game game) { public Set<MageObjectReference> landMiredByCyclopeanTombInstance(MageObjectReference mor, Game game) {
Set<MageObjectReference> miredLands = counterData.get(new MageObjectReference(cylopeanTombInstance, game)); if (counterData.containsKey(mor)) {
return miredLands != null && miredLands.contains(new MageObjectReference(land, game)); return counterData.get(mor);
}
return null;
} }
} }

View file

@ -115,7 +115,7 @@ class CytoplastRootKinEffect extends OneShotEffect {
&& !sourcePermanent.getId().equals(targetPermanent.getId()) && !sourcePermanent.getId().equals(targetPermanent.getId())
&& targetPermanent.getCounters(game).getCount(CounterType.P1P1) > 0) { && targetPermanent.getCounters(game).getCount(CounterType.P1P1) > 0) {
targetPermanent.removeCounters(CounterType.P1P1.createInstance(), game); targetPermanent.removeCounters(CounterType.P1P1.createInstance(), game);
sourcePermanent.addCounters(CounterType.P1P1.createInstance(), game); sourcePermanent.addCounters(CounterType.P1P1.createInstance(), source, game);
return true; return true;
} }
return false; return false;

View file

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

View file

@ -114,7 +114,7 @@ class MoveCounterFromTargetToTargetEffect extends OneShotEffect {
Permanent toPermanent = game.getPermanent(source.getTargets().get(1).getFirstTarget()); Permanent toPermanent = game.getPermanent(source.getTargets().get(1).getFirstTarget());
if (toPermanent != null) { if (toPermanent != null) {
fromPermanent.removeCounters(CounterType.P1P1.createInstance(), game); fromPermanent.removeCounters(CounterType.P1P1.createInstance(), game);
toPermanent.addCounters(CounterType.P1P1.createInstance(), game); toPermanent.addCounters(CounterType.P1P1.createInstance(), source, game);
game.informPlayers(sourceObject.getLogName() + ": Moved a +1/+1 counter from " + fromPermanent.getLogName() +" to " + toPermanent.getLogName()); game.informPlayers(sourceObject.getLogName() + ": Moved a +1/+1 counter from " + fromPermanent.getLogName() +" to " + toPermanent.getLogName());
} }
} }

View file

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

View file

@ -232,7 +232,7 @@ class DarkIntimationsReplacementEffect extends ReplacementEffectImpl {
public boolean replaceEvent(GameEvent event, Ability source, Game game) { public boolean replaceEvent(GameEvent event, Ability source, Game game) {
Permanent creature = ((EntersTheBattlefieldEvent) event).getTarget(); Permanent creature = ((EntersTheBattlefieldEvent) event).getTarget();
if (creature != null) { if (creature != null) {
creature.addCounters(CounterType.LOYALTY.createInstance(), game); creature.addCounters(CounterType.LOYALTY.createInstance(), source, game);
} }
return false; return false;
} }

View file

@ -103,7 +103,7 @@ class DearlyDepartedEntersBattlefieldEffect extends ReplacementEffectImpl {
public boolean replaceEvent(GameEvent event, Ability source, Game game) { public boolean replaceEvent(GameEvent event, Ability source, Game game) {
Permanent target = ((EntersTheBattlefieldEvent) event).getTarget(); Permanent target = ((EntersTheBattlefieldEvent) event).getTarget();
if (target != null) { if (target != null) {
target.addCounters(CounterType.P1P1.createInstance(), game); target.addCounters(CounterType.P1P1.createInstance(), source, game);
} }
return false; return false;
} }

View file

@ -28,13 +28,14 @@
package mage.cards.d; package mage.cards.d;
import java.util.UUID; import java.util.UUID;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.game.Game; import mage.game.Game;
import mage.players.Player;
/** /**
* *
@ -43,13 +44,10 @@ import mage.game.Game;
public class DebtToTheDeathless extends CardImpl { public class DebtToTheDeathless extends CardImpl {
public DebtToTheDeathless(UUID ownerId, CardSetInfo setInfo) { public DebtToTheDeathless(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{X}{W}{W}{B}{B}"); super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{W}{W}{B}{B}");
// Each opponent loses two times X life. You gain life equal to the life lost this way. // Each opponent loses two times X life. You gain life equal to the life lost this way.
this.getSpellAbility().addEffect(new DebtToTheDeathlessEffect()); this.getSpellAbility().addEffect(new DebtToTheDeathlessEffect());
} }
public DebtToTheDeathless(final DebtToTheDeathless card) { public DebtToTheDeathless(final DebtToTheDeathless card) {
@ -80,12 +78,19 @@ class DebtToTheDeathlessEffect extends OneShotEffect {
@Override @Override
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
int damage = 0; Player controller = game.getPlayer(source.getControllerId());
int xValue = source.getManaCostsToPay().getX(); if (controller != null) {
for (UUID opponentId: game.getOpponents(source.getControllerId())) { int lifeLost = 0;
damage += game.getPlayer(opponentId).damage(xValue * 2, source.getSourceId(), game, false, true); int xValue = source.getManaCostsToPay().getX();
for (UUID opponentId : game.getOpponents(source.getControllerId())) {
Player opponent = game.getPlayer(opponentId);
if (opponent != null) {
lifeLost += opponent.loseLife(xValue * 2, game, false);
}
}
controller.gainLife(lifeLost, game);
return true;
} }
game.getPlayer(source.getControllerId()).gainLife(damage, game); return false;
return true;
} }
} }

View file

@ -98,7 +98,7 @@ class DeepglowSkateEffect extends OneShotEffect {
if (permanent != null) { if (permanent != null) {
for (Counter counter : permanent.getCounters(game).values()) { for (Counter counter : permanent.getCounters(game).values()) {
Counter newCounter = new Counter(counter.getName(), counter.getCount()); Counter newCounter = new Counter(counter.getName(), counter.getCount());
permanent.addCounters(newCounter, game); permanent.addCounters(newCounter, source, game);
didOne = true; didOne = true;
} }
} }

View file

@ -87,7 +87,7 @@ class DefyDeathEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getFirstTarget()); Permanent permanent = game.getPermanent(source.getFirstTarget());
if (permanent != null && permanent.hasSubtype("Angel", game)) { if (permanent != null && permanent.hasSubtype("Angel", game)) {
permanent.addCounters(CounterType.P1P1.createInstance(2), game); permanent.addCounters(CounterType.P1P1.createInstance(2), source, game);
return true; return true;
} }
return false; return false;

View file

@ -100,7 +100,7 @@ class DelayEffect extends OneShotEffect {
boolean hasSuspend = card.getAbilities().containsClass(SuspendAbility.class); boolean hasSuspend = card.getAbilities().containsClass(SuspendAbility.class);
UUID exileId = SuspendAbility.getSuspendExileId(controller.getId(), game); UUID exileId = SuspendAbility.getSuspendExileId(controller.getId(), game);
if (controller.moveCardToExileWithInfo(card, exileId, "Suspended cards of " + controller.getLogName(), source.getSourceId(), game, Zone.HAND, true)) { if (controller.moveCardToExileWithInfo(card, exileId, "Suspended cards of " + controller.getLogName(), source.getSourceId(), game, Zone.HAND, true)) {
card.addCounters(CounterType.TIME.createInstance(3), game); card.addCounters(CounterType.TIME.createInstance(3), source, game);
if (!hasSuspend) { if (!hasSuspend) {
game.addEffect(new GainSuspendEffect(new MageObjectReference(card, game)), source); game.addEffect(new GainSuspendEffect(new MageObjectReference(card, game)), source);
} }

View file

@ -112,7 +112,7 @@ class DelifsCubeEffect extends OneShotEffect{
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
Permanent perm = game.getPermanent(cubeId); Permanent perm = game.getPermanent(cubeId);
if (perm == null) return false; if (perm == null) return false;
perm.addCounters(CounterType.CUBE.createInstance(), game); perm.addCounters(CounterType.CUBE.createInstance(), source, game);
return true; return true;
} }
} }

View file

@ -111,7 +111,7 @@ class DescentIntoMadnessEffect extends OneShotEffect {
Player controller = game.getPlayer(source.getControllerId()); Player controller = game.getPlayer(source.getControllerId());
Permanent sourcePermanent = game.getPermanent(source.getSourceId()); Permanent sourcePermanent = game.getPermanent(source.getSourceId());
if (sourcePermanent != null && controller != null) { if (sourcePermanent != null && controller != null) {
sourcePermanent.addCounters(CounterType.DESPAIR.createInstance(), game); sourcePermanent.addCounters(CounterType.DESPAIR.createInstance(), source, game);
} }
if (sourcePermanent == null) { if (sourcePermanent == null) {
sourcePermanent = (Permanent) game.getLastKnownInformation(source.getSourceId(), Zone.BATTLEFIELD); sourcePermanent = (Permanent) game.getLastKnownInformation(source.getSourceId(), Zone.BATTLEFIELD);

View file

@ -110,7 +110,7 @@ class DesecrationDemonEffect extends OneShotEffect {
permanent.sacrifice(source.getSourceId(), game); permanent.sacrifice(source.getSourceId(), game);
game.informPlayers(opponent.getLogName() + " sacrifices " + permanent.getLogName() + " to tap " + descrationDemon.getLogName() + ". A +1/+1 counter was put on it"); game.informPlayers(opponent.getLogName() + " sacrifices " + permanent.getLogName() + " to tap " + descrationDemon.getLogName() + ". A +1/+1 counter was put on it");
descrationDemon.tap(game); descrationDemon.tap(game);
descrationDemon.addCounters(CounterType.P1P1.createInstance(), game); descrationDemon.addCounters(CounterType.P1P1.createInstance(), source, game);
} }
} }
} }

View file

@ -109,7 +109,7 @@ class DiregrafColossusEffect extends OneShotEffect {
int amount = 0; int amount = 0;
amount += player.getGraveyard().count(filter, game); amount += player.getGraveyard().count(filter, game);
if (amount > 0) { if (amount > 0) {
permanent.addCounters(CounterType.P1P1.createInstance(amount), game); permanent.addCounters(CounterType.P1P1.createInstance(amount), source, game);
} }
return true; return true;
} }

View file

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

View file

@ -1,158 +1,158 @@
/* /*
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without modification, are * Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met: * permitted provided that the following conditions are met:
* *
* 1. Redistributions of source code must retain the above copyright notice, this list of * 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer. * conditions and the following disclaimer.
* *
* 2. Redistributions in binary form must reproduce the above copyright notice, this list * 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 * of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution. * provided with the distribution.
* *
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED * 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 * 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 * 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 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 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 * 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 * 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 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* *
* The views and conclusions contained in the software and documentation are those of the * The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed * authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com. * or implied, of BetaSteward_at_googlemail.com.
*/ */
package mage.cards.d; package mage.cards.d;
import java.util.UUID; import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.LoyaltyAbility; import mage.abilities.LoyaltyAbility;
import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
import mage.abilities.effects.Effect; import mage.abilities.effects.Effect;
import mage.abilities.effects.RestrictionUntapNotMoreThanEffect; import mage.abilities.effects.RestrictionUntapNotMoreThanEffect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.effects.common.GetEmblemEffect; import mage.abilities.effects.common.GetEmblemEffect;
import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Duration; import mage.constants.Duration;
import mage.constants.Outcome; import mage.constants.Outcome;
import mage.constants.Zone; import mage.constants.Zone;
import mage.filter.common.FilterControlledPermanent; import mage.filter.common.FilterControlledPermanent;
import mage.game.Game; import mage.game.Game;
import mage.game.command.Emblem; import mage.game.command.Emblem;
import mage.game.events.GameEvent; import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType; import mage.game.events.GameEvent.EventType;
import mage.players.Player; import mage.players.Player;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
/** /**
* *
* @author emerald000 * @author emerald000
*/ */
public class DovinBaan extends CardImpl { public class DovinBaan extends CardImpl {
public DovinBaan(UUID ownerId, CardSetInfo setInfo) { public DovinBaan(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.PLANESWALKER},"{2}{W}{U}"); super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{2}{W}{U}");
this.subtype.add("Dovin"); this.subtype.add("Dovin");
this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3)); this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(3));
// +1: Until your next turn, up to one target creature gets -3/-0 and its activated abilities can't be activated. // +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 effect = new BoostTargetEffect(-3, 0, Duration.UntilYourNextTurn);
effect.setText("Until your next turn, up to one target creature gets -3/-0"); effect.setText("Until your next turn, up to one target creature gets -3/-0");
Ability ability = new LoyaltyAbility(effect, 1); Ability ability = new LoyaltyAbility(effect, 1);
ability.addTarget(new TargetCreaturePermanent(0, 1)); ability.addTarget(new TargetCreaturePermanent(0, 1));
ability.addEffect(new DovinBaanCantActivateAbilitiesEffect()); ability.addEffect(new DovinBaanCantActivateAbilitiesEffect());
this.addAbility(ability); this.addAbility(ability);
// -1: You gain 2 life and draw a card. // -1: You gain 2 life and draw a card.
ability = new LoyaltyAbility(new GainLifeEffect(2), -1); ability = new LoyaltyAbility(new GainLifeEffect(2), -1);
effect = new DrawCardSourceControllerEffect(1); effect = new DrawCardSourceControllerEffect(1);
effect.setText("and draw a card"); effect.setText("and draw a card");
ability.addEffect(effect); ability.addEffect(effect);
this.addAbility(ability); this.addAbility(ability);
// -7: You get an emblem with "Your opponents can't untap more than two permanents during their untap steps." // -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)); this.addAbility(new LoyaltyAbility(new GetEmblemEffect(new DovinBaanEmblem()), -7));
} }
public DovinBaan(final DovinBaan card) { public DovinBaan(final DovinBaan card) {
super(card); super(card);
} }
@Override @Override
public DovinBaan copy() { public DovinBaan copy() {
return new DovinBaan(this); return new DovinBaan(this);
} }
} }
class DovinBaanCantActivateAbilitiesEffect extends ContinuousRuleModifyingEffectImpl { class DovinBaanCantActivateAbilitiesEffect extends ContinuousRuleModifyingEffectImpl {
DovinBaanCantActivateAbilitiesEffect() { DovinBaanCantActivateAbilitiesEffect() {
super(Duration.UntilYourNextTurn, Outcome.UnboostCreature); super(Duration.UntilYourNextTurn, Outcome.UnboostCreature);
staticText = "and its activated abilities can't be activated"; staticText = "and its activated abilities can't be activated";
} }
DovinBaanCantActivateAbilitiesEffect(final DovinBaanCantActivateAbilitiesEffect effect) { DovinBaanCantActivateAbilitiesEffect(final DovinBaanCantActivateAbilitiesEffect effect) {
super(effect); super(effect);
} }
@Override @Override
public DovinBaanCantActivateAbilitiesEffect copy() { public DovinBaanCantActivateAbilitiesEffect copy() {
return new DovinBaanCantActivateAbilitiesEffect(this); return new DovinBaanCantActivateAbilitiesEffect(this);
} }
@Override @Override
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
return true; return true;
} }
@Override @Override
public boolean checksEventType(GameEvent event, Game game) { public boolean checksEventType(GameEvent event, Game game) {
return event.getType() == EventType.ACTIVATE_ABILITY; return event.getType() == EventType.ACTIVATE_ABILITY;
} }
@Override @Override
public boolean applies(GameEvent event, Ability source, Game game) { public boolean applies(GameEvent event, Ability source, Game game) {
return event.getSourceId().equals(this.getTargetPointer().getFirst(game, source)); return event.getSourceId().equals(this.getTargetPointer().getFirst(game, source));
} }
} }
class DovinBaanEmblem extends Emblem { class DovinBaanEmblem extends Emblem {
DovinBaanEmblem() { DovinBaanEmblem() {
this.setName("EMBLEM: Dovin Baan"); this.setName("Emblem Dovin");
Ability ability = new SimpleStaticAbility(Zone.COMMAND, new DovinBaanCantUntapEffect()); Ability ability = new SimpleStaticAbility(Zone.COMMAND, new DovinBaanCantUntapEffect());
this.getAbilities().add(ability); this.getAbilities().add(ability);
} }
} }
class DovinBaanCantUntapEffect extends RestrictionUntapNotMoreThanEffect { class DovinBaanCantUntapEffect extends RestrictionUntapNotMoreThanEffect {
DovinBaanCantUntapEffect() { DovinBaanCantUntapEffect() {
super(Duration.WhileOnBattlefield, 2, new FilterControlledPermanent()); super(Duration.WhileOnBattlefield, 2, new FilterControlledPermanent());
staticText = "Your opponents can't untap more than two permanents during their untap steps."; staticText = "Your opponents can't untap more than two permanents during their untap steps.";
} }
DovinBaanCantUntapEffect(final DovinBaanCantUntapEffect effect) { DovinBaanCantUntapEffect(final DovinBaanCantUntapEffect effect) {
super(effect); super(effect);
} }
@Override @Override
public boolean applies(Player player, Ability source, Game game) { public boolean applies(Player player, Ability source, Game game) {
return game.getOpponents(source.getControllerId()).contains(player.getId()); return game.getOpponents(source.getControllerId()).contains(player.getId());
} }
@Override @Override
public DovinBaanCantUntapEffect copy() { public DovinBaanCantUntapEffect copy() {
return new DovinBaanCantUntapEffect(this); return new DovinBaanCantUntapEffect(this);
} }
} }

View file

@ -29,7 +29,6 @@ package mage.cards.d;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import mage.MageObject; import mage.MageObject;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.Mode; import mage.abilities.Mode;
@ -53,12 +52,12 @@ import mage.players.Player;
/** /**
* *
* @author Gal Lerman * @author Gal Lerman
*
*/ */
public class DustOfMoments extends CardImpl { public class DustOfMoments extends CardImpl {
public DustOfMoments(UUID ownerId, CardSetInfo setInfo) { public DustOfMoments(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{2}{W}"); super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{W}");
// Choose one - Remove two time counters from each permanent and each suspended card // Choose one - Remove two time counters from each permanent and each suspended card
this.getSpellAbility().addEffect(new RemoveCountersEffect()); this.getSpellAbility().addEffect(new RemoveCountersEffect());
@ -78,171 +77,172 @@ public class DustOfMoments extends CardImpl {
return new DustOfMoments(this); return new DustOfMoments(this);
} }
//TODO: PermanentImpl.getCounters() and CardImpl.getCounters(game) don't return the same value for the same Card
//TODO: This means I can't use a Card generic for Permanents and Exiled cards and use Card.getCounters(game)
//TODO: This is the reason i've copy pasted some logic in DustOfMomentsEffect
//TODO: After this issue is fixed/explained i'll refactor the code
public abstract static class DustOfMomentsEffect extends OneShotEffect {
//TODO: PermanentImpl.getCounters() and CardImpl.getCounters(game) don't return the same value for the same Card private final Counter counter;
//TODO: This means I can't use a Card generic for Permanents and Exiled cards and use Card.getCounters(game) private final Filter<Card> permFilter;
//TODO: This is the reason i've copy pasted some logic in DustOfMomentsEffect private final Filter<Card> exiledFilter;
//TODO: After this issue is fixed/explained i'll refactor the code
public abstract static class DustOfMomentsEffect extends OneShotEffect {
private final Counter counter; public DustOfMomentsEffect() {
private final Filter<Card> permFilter; super(Outcome.Benefit);
private final Filter<Card> exiledFilter; this.counter = new Counter(CounterType.TIME.getName(), 2);
this.permFilter = new FilterCard("permanent and each suspended card");
permFilter.add(new CounterPredicate(CounterType.TIME));
public DustOfMomentsEffect() { this.exiledFilter = new FilterCard("permanent and each suspended card");
super(Outcome.Benefit); exiledFilter.add(new CardCounterPredicate(CounterType.TIME));
this.counter = new Counter(CounterType.TIME.getName(), 2); setText();
this.permFilter = new FilterCard("permanent and each suspended card"); }
permFilter.add(new CounterPredicate(CounterType.TIME));
public DustOfMomentsEffect(final DustOfMomentsEffect effect) {
this.exiledFilter = new FilterCard("permanent and each suspended card"); super(effect);
exiledFilter.add(new CardCounterPredicate(CounterType.TIME)); this.counter = effect.counter.copy();
setText(); this.permFilter = effect.permFilter.copy();
} this.exiledFilter = effect.exiledFilter.copy();
}
public DustOfMomentsEffect(final DustOfMomentsEffect effect) {
super(effect); @Override
this.counter = effect.counter.copy(); public boolean apply(Game game, Ability source) {
this.permFilter = effect.permFilter.copy(); Player controller = game.getPlayer(source.getControllerId());
this.exiledFilter = effect.exiledFilter.copy(); MageObject sourceObject = game.getObject(source.getSourceId());
} if (controller != null && sourceObject != null) {
updatePermanents(source, game, controller, sourceObject);
@Override updateSuspended(source, game, controller, sourceObject);
public boolean apply(Game game, Ability source) { return true;
Player controller = game.getPlayer(source.getControllerId()); }
MageObject sourceObject = game.getObject(source.getSourceId()); return false;
if (controller != null && sourceObject != null) { }
updatePermanents(game, controller, sourceObject);
updateSuspended(game, controller, sourceObject); private void updateSuspended(final Ability source, final Game game, final Player controller, final MageObject sourceObject) {
return true; final List<Card> exiledCards = game.getExile().getAllCards(game);
} execute(source, game, controller, sourceObject, exiledCards);
return false; }
}
private void updatePermanents(final Ability source, final Game game, final Player controller, final MageObject sourceObject) {
private void updateSuspended(final Game game, final Player controller, final MageObject sourceObject) { List<Permanent> permanents = game.getBattlefield().getAllActivePermanents();
final List<Card> exiledCards = game.getExile().getAllCards(game); executeP(source, game, controller, sourceObject, permanents);
execute(game, controller, sourceObject, exiledCards); }
}
private void executeP(final Ability source, final Game game, final Player controller, final MageObject sourceObject, final List<Permanent> cards) {
private void updatePermanents(final Game game, final Player controller, final MageObject sourceObject) { if (cards == null || cards.isEmpty()) {
List<Permanent> permanents = game.getBattlefield().getAllActivePermanents(); return;
executeP(game, controller, sourceObject, permanents); }
} for (Permanent card : cards) {
if (permFilter.match(card, game)) {
private void executeP(final Game game, final Player controller, final MageObject sourceObject, final List<Permanent> cards) { final String counterName = counter.getName();
if (cards == null || cards.isEmpty()) { if (shouldRemoveCounters()) {
return; final Counter existingCounterOfSameType = card.getCounters(game).get(counterName);
} final int countersToRemove = Math.min(existingCounterOfSameType.getCount(), counter.getCount());
for (Permanent card : cards) { final Counter modifiedCounter = new Counter(counterName, countersToRemove);
if (permFilter.match(card, game)) { card.removeCounters(modifiedCounter, game);
final String counterName = counter.getName(); } else {
if (shouldRemoveCounters()) { card.addCounters(counter, source, game);
final Counter existingCounterOfSameType = card.getCounters(game).get(counterName); }
final int countersToRemove = Math.min(existingCounterOfSameType.getCount(), counter.getCount()); if (!game.isSimulation()) {
final Counter modifiedCounter = new Counter(counterName, countersToRemove); game.informPlayers(new StringBuilder(sourceObject.getName()).append(": ")
card.removeCounters(modifiedCounter, game); .append(controller.getLogName()).append(getActionStr()).append("s")
} else { .append(counter.getCount()).append(" ").append(counterName.toLowerCase())
card.addCounters(counter, game); .append(" counter on ").append(card.getName()).toString());
} }
if (!game.isSimulation()) }
game.informPlayers(new StringBuilder(sourceObject.getName()).append(": ") }
.append(controller.getLogName()).append(getActionStr()).append("s") }
.append(counter.getCount()).append(" ").append(counterName.toLowerCase())
.append(" counter on ").append(card.getName()).toString()); private void execute(final Ability source, final Game game, final Player controller, final MageObject sourceObject, final List<Card> cards) {
} if (cards == null || cards.isEmpty()) {
} return;
} }
for (Card card : cards) {
private void execute(final Game game, final Player controller, final MageObject sourceObject, final List<Card> cards) { if (exiledFilter.match(card, game)) {
if (cards == null || cards.isEmpty()) { final String counterName = counter.getName();
return; if (shouldRemoveCounters()) {
} final Counter existingCounterOfSameType = card.getCounters(game).get(counterName);
for (Card card : cards) { final int countersToRemove = Math.min(existingCounterOfSameType.getCount(), counter.getCount());
if (exiledFilter.match(card, game)) { final Counter modifiedCounter = new Counter(counterName, countersToRemove);
final String counterName = counter.getName(); card.removeCounters(modifiedCounter, game);
if (shouldRemoveCounters()) { } else {
final Counter existingCounterOfSameType = card.getCounters(game).get(counterName); card.addCounters(counter, source, game);
final int countersToRemove = Math.min(existingCounterOfSameType.getCount(), counter.getCount()); }
final Counter modifiedCounter = new Counter(counterName, countersToRemove); if (!game.isSimulation()) {
card.removeCounters(modifiedCounter, game); game.informPlayers(new StringBuilder(sourceObject.getName()).append(": ")
} else { .append(controller.getLogName()).append(getActionStr()).append("s ")
card.addCounters(counter, game); .append(counter.getCount()).append(" ").append(counterName.toLowerCase())
} .append(" counter on ").append(card.getName()).toString());
if (!game.isSimulation()) }
game.informPlayers(new StringBuilder(sourceObject.getName()).append(": ") }
.append(controller.getLogName()).append(getActionStr()).append("s ") }
.append(counter.getCount()).append(" ").append(counterName.toLowerCase()) }
.append(" counter on ").append(card.getName()).toString());
protected abstract boolean shouldRemoveCounters();
protected abstract String getActionStr();
private void setText() {
StringBuilder sb = new StringBuilder();
sb.append(getActionStr());
if (counter.getCount() > 1) {
sb.append(Integer.toString(counter.getCount())).append(" ").append(counter.getName().toLowerCase()).append(" counters on each ");
} else {
sb.append("a ").append(counter.getName().toLowerCase()).append(" counter on each ");
}
sb.append(permFilter.getMessage());
staticText = sb.toString();
} }
}
} }
protected abstract boolean shouldRemoveCounters(); public static class AddCountersEffect extends DustOfMomentsEffect {
protected abstract String getActionStr(); public AddCountersEffect() {
super();
}
private void setText() { public AddCountersEffect(final DustOfMomentsEffect effect) {
StringBuilder sb = new StringBuilder(); super(effect);
sb.append(getActionStr()); }
if (counter.getCount() > 1) {
sb.append(Integer.toString(counter.getCount())).append(" ").append(counter.getName().toLowerCase()).append(" counters on each ");
} else {
sb.append("a ").append(counter.getName().toLowerCase()).append(" counter on each ");
}
sb.append(permFilter.getMessage());
staticText = sb.toString();
}
}
public static class AddCountersEffect extends DustOfMomentsEffect { @Override
protected boolean shouldRemoveCounters() {
return false;
}
public AddCountersEffect() { @Override
super(); protected String getActionStr() {
return "add";
}
@Override
public Effect copy() {
return new AddCountersEffect(this);
}
} }
public AddCountersEffect(final DustOfMomentsEffect effect) { public static class RemoveCountersEffect extends DustOfMomentsEffect {
super(effect);
}
@Override public RemoveCountersEffect() {
protected boolean shouldRemoveCounters() { super();
return false; }
}
@Override public RemoveCountersEffect(final DustOfMomentsEffect effect) {
protected String getActionStr() { super(effect);
return "add"; }
}
@Override @Override
public Effect copy() { protected boolean shouldRemoveCounters() {
return new AddCountersEffect(this); return true;
} }
}
public static class RemoveCountersEffect extends DustOfMomentsEffect { @Override
protected String getActionStr() {
return "remove";
}
public RemoveCountersEffect() { @Override
super(); public Effect copy() {
return new RemoveCountersEffect(this);
}
} }
public RemoveCountersEffect(final DustOfMomentsEffect effect) {
super(effect);
}
@Override
protected boolean shouldRemoveCounters() {
return true;
}
@Override
protected String getActionStr() {
return "remove";
}
@Override
public Effect copy() {
return new RemoveCountersEffect(this);
}
}
} }

View file

@ -115,7 +115,7 @@ class EbonPraetorEffect extends OneShotEffect {
Permanent sacrificedCreature = ((SacrificeTargetCost) cost).getPermanents().get(0); Permanent sacrificedCreature = ((SacrificeTargetCost) cost).getPermanents().get(0);
Permanent sourceCreature = game.getPermanent(source.getSourceId()); Permanent sourceCreature = game.getPermanent(source.getSourceId());
if (sacrificedCreature.hasSubtype("Thrull", game) && sourceCreature != null) { if (sacrificedCreature.hasSubtype("Thrull", game) && sourceCreature != null) {
sourceCreature.addCounters(CounterType.P1P0.createInstance(), game); sourceCreature.addCounters(CounterType.P1P0.createInstance(), source, game);
return true; return true;
} }
} }

View file

@ -96,9 +96,9 @@ class ElderCatharAddCountersTargetEffect extends OneShotEffect {
if (permanent != null) { if (permanent != null) {
if (counter != null) { if (counter != null) {
if (permanent.hasSubtype("Human", game)) { if (permanent.hasSubtype("Human", game)) {
permanent.addCounters(counter2.copy(), game); permanent.addCounters(counter2.copy(), source, game);
} else { } else {
permanent.addCounters(counter.copy(), game); permanent.addCounters(counter.copy(), source, game);
} }
return true; return true;
} }

View file

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

View file

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

View file

@ -28,11 +28,11 @@
package mage.cards.e; package mage.cards.e;
import java.util.UUID; import java.util.UUID;
import mage.constants.CardType;
import mage.MageInt; import mage.MageInt;
import mage.abilities.keyword.CascadeAbility; import mage.abilities.keyword.CascadeAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType;
/** /**
* *
@ -41,14 +41,13 @@ import mage.cards.CardSetInfo;
public class EnlistedWurm extends CardImpl { public class EnlistedWurm extends CardImpl {
public EnlistedWurm(UUID ownerId, CardSetInfo setInfo) { public EnlistedWurm(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{G}{W}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{G}{W}");
this.subtype.add("Wurm"); this.subtype.add("Wurm");
this.power = new MageInt(5); this.power = new MageInt(5);
this.toughness = new MageInt(5); this.toughness = new MageInt(5);
// Cascade (When you cast this spell, exile cards from the top of your library until you exile a nonland card that costs less. You may cast it without paying its mana cost. Put the exiled cards on the bottom in a random order.)
this.addAbility(new CascadeAbility()); this.addAbility(new CascadeAbility());
} }

View file

@ -108,7 +108,7 @@ class EpochrasiteEffect extends OneShotEffect {
if (game.getState().getZone(card.getId()).equals(Zone.GRAVEYARD)) { if (game.getState().getZone(card.getId()).equals(Zone.GRAVEYARD)) {
UUID exileId = SuspendAbility.getSuspendExileId(controller.getId(), game); UUID exileId = SuspendAbility.getSuspendExileId(controller.getId(), game);
controller.moveCardToExileWithInfo(card, exileId, "Suspended cards of " + controller.getName(), source.getSourceId(), game, Zone.GRAVEYARD, true); controller.moveCardToExileWithInfo(card, exileId, "Suspended cards of " + controller.getName(), source.getSourceId(), game, Zone.GRAVEYARD, true);
card.addCounters(CounterType.TIME.createInstance(3), game); card.addCounters(CounterType.TIME.createInstance(3), source, game);
game.addEffect(new GainSuspendEffect(new MageObjectReference(card, game)), source); game.addEffect(new GainSuspendEffect(new MageObjectReference(card, game)), source);
} }
return true; return true;

View file

@ -86,7 +86,7 @@ class EternityVesselEffect extends OneShotEffect {
if (vessel != null && controller != null) { if (vessel != null && controller != null) {
int amount = controller.getLife(); int amount = controller.getLife();
if (amount > 0) { if (amount > 0) {
vessel.addCounters(CounterType.CHARGE.createInstance(amount), game); vessel.addCounters(CounterType.CHARGE.createInstance(amount), source, game);
} }
return true; return true;

View file

@ -105,7 +105,7 @@ class DamageDealtAsIfSourceHadWitherEffect extends ReplacementEffectImpl {
Counter counter = CounterType.M1M1.createInstance(damageAmount); Counter counter = CounterType.M1M1.createInstance(damageAmount);
Permanent creatureDamaged = game.getPermanent(event.getTargetId()); Permanent creatureDamaged = game.getPermanent(event.getTargetId());
if (creatureDamaged != null) { if (creatureDamaged != null) {
creatureDamaged.addCounters(counter, game); creatureDamaged.addCounters(counter, source, game);
} }
} }
return true; return true;

View file

@ -96,7 +96,7 @@ class EvolutionaryEscalationEffect extends OneShotEffect {
for (Target target: source.getTargets()) { for (Target target: source.getTargets()) {
Permanent targetPermanent = game.getPermanent(target.getFirstTarget()); Permanent targetPermanent = game.getPermanent(target.getFirstTarget());
if (targetPermanent != null) { if (targetPermanent != null) {
targetPermanent.addCounters(counter.copy(), game); targetPermanent.addCounters(counter.copy(), source, game);
addedCounters = true; addedCounters = true;
} }
} }

View file

@ -123,7 +123,7 @@ class EyeOfDoomEffect extends OneShotEffect {
} while (!player.getId().equals(game.getActivePlayerId())); } while (!player.getId().equals(game.getActivePlayerId()));
for (Permanent permanent: permanents) { for (Permanent permanent: permanents) {
permanent.addCounters(CounterType.DOOM.createInstance(), game); permanent.addCounters(CounterType.DOOM.createInstance(), source, game);
} }
return true; return true;

View file

@ -119,7 +119,7 @@ class EzuriClawOfProgressEffect extends OneShotEffect {
Player controller = game.getPlayer(source.getControllerId()); Player controller = game.getPlayer(source.getControllerId());
if (controller != null) { if (controller != null) {
int amount = controller.getCounters().getCount(CounterType.EXPERIENCE); int amount = controller.getCounters().getCount(CounterType.EXPERIENCE);
target.addCounters(CounterType.P1P1.createInstance(amount), game); target.addCounters(CounterType.P1P1.createInstance(amount), source, game);
} }
return false; return false;
} }

View file

@ -106,7 +106,7 @@ class FalkenrathAristocratEffect extends OneShotEffect {
Permanent sacrificedCreature = ((SacrificeTargetCost) cost).getPermanents().get(0); Permanent sacrificedCreature = ((SacrificeTargetCost) cost).getPermanents().get(0);
Permanent sourceCreature = game.getPermanent(source.getSourceId()); Permanent sourceCreature = game.getPermanent(source.getSourceId());
if (sacrificedCreature.hasSubtype("Human", game) && sourceCreature != null) { if (sacrificedCreature.hasSubtype("Human", game) && sourceCreature != null) {
sourceCreature.addCounters(CounterType.P1P1.createInstance(), game); sourceCreature.addCounters(CounterType.P1P1.createInstance(), source, game);
return true; return true;
} }
} }

View file

@ -102,7 +102,7 @@ class FalkenrathTorturerEffect extends OneShotEffect {
Permanent sacrificedCreature = ((SacrificeTargetCost) cost).getPermanents().get(0); Permanent sacrificedCreature = ((SacrificeTargetCost) cost).getPermanents().get(0);
Permanent sourceCreature = game.getPermanent(source.getSourceId()); Permanent sourceCreature = game.getPermanent(source.getSourceId());
if (sacrificedCreature.hasSubtype("Human", game) && sourceCreature != null) { if (sacrificedCreature.hasSubtype("Human", game) && sourceCreature != null) {
sourceCreature.addCounters(CounterType.P1P1.createInstance(), game); sourceCreature.addCounters(CounterType.P1P1.createInstance(), source, game);
return true; return true;
} }
} }

View file

@ -103,7 +103,7 @@ class FateTransferEffect extends OneShotEffect {
Permanent copyCreature = creatureToMoveCountersFrom.copy(); Permanent copyCreature = creatureToMoveCountersFrom.copy();
for (Counter counter : copyCreature.getCounters(game).values()) { for (Counter counter : copyCreature.getCounters(game).values()) {
creatureToMoveCountersFrom.removeCounters(counter, game); creatureToMoveCountersFrom.removeCounters(counter, game);
creatureToMoveCountersTo.addCounters(counter, game); creatureToMoveCountersTo.addCounters(counter, source, game);
} }
return true; return true;
} }

View file

@ -86,7 +86,7 @@ class FearsomeAwakeningEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getFirstTarget()); Permanent permanent = game.getPermanent(source.getFirstTarget());
if (permanent != null && permanent.hasSubtype("Dragon", game)) { if (permanent != null && permanent.hasSubtype("Dragon", game)) {
permanent.addCounters(CounterType.P1P1.createInstance(2), game); permanent.addCounters(CounterType.P1P1.createInstance(2), source, game);
return true; return true;
} }
return false; return false;

View file

@ -104,7 +104,7 @@ class FleshEffect extends OneShotEffect {
if (power > 0) { if (power > 0) {
Permanent targetCreature = game.getPermanent(source.getTargets().get(1).getFirstTarget()); Permanent targetCreature = game.getPermanent(source.getTargets().get(1).getFirstTarget());
if (targetCreature != null) { if (targetCreature != null) {
targetCreature.addCounters(CounterType.P1P1.createInstance(power), game); targetCreature.addCounters(CounterType.P1P1.createInstance(power), source, game);
} }
} }
return true; return true;

View file

@ -149,7 +149,7 @@ public class ForgottenAncient extends CardImpl {
//Move all the counters for each chosen creature //Move all the counters for each chosen creature
for(CounterMovement cm: counterMovements) { for(CounterMovement cm: counterMovements) {
sourcePermanent.removeCounters(CounterType.P1P1.createInstance(cm.counters), game); sourcePermanent.removeCounters(CounterType.P1P1.createInstance(cm.counters), game);
game.getPermanent(cm.target).addCounters(CounterType.P1P1.createInstance(cm.counters), game); game.getPermanent(cm.target).addCounters(CounterType.P1P1.createInstance(cm.counters), source, game);
} }
return true; return true;
} }

View file

@ -1,114 +1,114 @@
/* /*
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without modification, are * Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met: * permitted provided that the following conditions are met:
* *
* 1. Redistributions of source code must retain the above copyright notice, this list of * 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer. * conditions and the following disclaimer.
* *
* 2. Redistributions in binary form must reproduce the above copyright notice, this list * 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 * of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution. * provided with the distribution.
* *
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED * 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 * 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 * 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 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 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 * 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 * 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 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* *
* The views and conclusions contained in the software and documentation are those of the * The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed * authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com. * or implied, of BetaSteward_at_googlemail.com.
*/ */
package mage.cards.f; package mage.cards.f;
import java.util.UUID; import java.util.UUID;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.OneShotEffect;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Outcome; import mage.constants.Outcome;
import mage.counters.CounterType; import mage.counters.CounterType;
import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.common.FilterCreaturePermanent; import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.Predicates; import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.SubtypePredicate; import mage.filter.predicate.mageobject.SubtypePredicate;
import mage.filter.predicate.permanent.CounterPredicate; import mage.filter.predicate.permanent.CounterPredicate;
import mage.game.Game; import mage.game.Game;
import mage.game.permanent.Permanent; import mage.game.permanent.Permanent;
import mage.players.Player; import mage.players.Player;
import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetControlledCreaturePermanent;
import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetCreaturePermanent;
/** /**
* *
* @author Styxo * @author Styxo
*/ */
public class FulfillContract extends CardImpl { public class FulfillContract extends CardImpl {
private static final FilterCreaturePermanent filterBountyCreature = new FilterCreaturePermanent("creature with a bounty counter on it"); private static final FilterCreaturePermanent filterBountyCreature = new FilterCreaturePermanent("creature with a bounty counter on it");
private static final FilterControlledCreaturePermanent filterRogueOrHunter = new FilterControlledCreaturePermanent("Rogue or Hunter you control"); private static final FilterControlledCreaturePermanent filterRogueOrHunter = new FilterControlledCreaturePermanent("Rogue or Hunter you control");
static { static {
filterBountyCreature.add(new CounterPredicate(CounterType.BOUNTY)); filterBountyCreature.add(new CounterPredicate(CounterType.BOUNTY));
filterRogueOrHunter.add(Predicates.or(new SubtypePredicate("Rogue"), new SubtypePredicate("Hunter"))); filterRogueOrHunter.add(Predicates.or(new SubtypePredicate("Rogue"), new SubtypePredicate("Hunter")));
} }
public FulfillContract(UUID ownerId, CardSetInfo setInfo) { public FulfillContract(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{B/R}{B/R}"); super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{B/R}{B/R}");
// Destroy target creature with a bounty counter on it. If that creature is destroyed this way, you may put a +1/+1 counter on target Rogue or Hunter you control. // Destroy target creature with a bounty counter on it. If that creature is destroyed this way, you may put a +1/+1 counter on target Rogue or Hunter you control.
this.getSpellAbility().addEffect(new FulfillContractEffect()); this.getSpellAbility().addEffect(new FulfillContractEffect());
this.getSpellAbility().addTarget(new TargetCreaturePermanent(filterBountyCreature)); this.getSpellAbility().addTarget(new TargetCreaturePermanent(filterBountyCreature));
this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent(filterRogueOrHunter)); this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent(filterRogueOrHunter));
} }
public FulfillContract(final FulfillContract card) { public FulfillContract(final FulfillContract card) {
super(card); super(card);
} }
@Override @Override
public FulfillContract copy() { public FulfillContract copy() {
return new FulfillContract(this); return new FulfillContract(this);
} }
} }
class FulfillContractEffect extends OneShotEffect { class FulfillContractEffect extends OneShotEffect {
public FulfillContractEffect() { public FulfillContractEffect() {
super(Outcome.Benefit); super(Outcome.Benefit);
this.staticText = "Destroy target creature with a bounty counter on it. If that creature is destroyed this way, you may put a +1/+1 counter on target Rogue or Hunter you control"; this.staticText = "Destroy target creature with a bounty counter on it. If that creature is destroyed this way, you may put a +1/+1 counter on target Rogue or Hunter you control";
} }
public FulfillContractEffect(final FulfillContractEffect effect) { public FulfillContractEffect(final FulfillContractEffect effect) {
super(effect); super(effect);
} }
@Override @Override
public FulfillContractEffect copy() { public FulfillContractEffect copy() {
return new FulfillContractEffect(this); return new FulfillContractEffect(this);
} }
@Override @Override
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId()); Player controller = game.getPlayer(source.getControllerId());
Permanent permanentToDestroy = game.getPermanent(getTargetPointer().getFirst(game, source)); Permanent permanentToDestroy = game.getPermanent(getTargetPointer().getFirst(game, source));
Permanent permanentToPutCounter = game.getPermanent(getTargetPointer().getTargets(game, source).get(1)); Permanent permanentToPutCounter = game.getPermanent(source.getTargets().get(1).getFirstTarget());
if (controller != null) { if (controller != null) {
if (permanentToDestroy != null && permanentToDestroy.destroy(source.getSourceId(), game, false)) { if (permanentToDestroy != null && permanentToDestroy.destroy(source.getSourceId(), game, false)) {
if (permanentToPutCounter != null) { if (permanentToPutCounter != null) {
permanentToPutCounter.addCounters(CounterType.P1P1.createInstance(), game); permanentToPutCounter.addCounters(CounterType.P1P1.createInstance(), source, game);
} }
} }
return true; return true;
} }
return false; return false;
} }
} }

View file

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

View file

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

View file

@ -149,7 +149,7 @@ class GemstoneCavernsEffect extends OneShotEffect {
if (card.putOntoBattlefield(game, Zone.HAND, source.getSourceId(), source.getControllerId())) { if (card.putOntoBattlefield(game, Zone.HAND, source.getSourceId(), source.getControllerId())) {
Permanent permanent = game.getPermanent(card.getId()); Permanent permanent = game.getPermanent(card.getId());
if (permanent != null) { if (permanent != null) {
permanent.addCounters(CounterType.LUCK.createInstance(), game); permanent.addCounters(CounterType.LUCK.createInstance(), source, game);
Cost cost = new ExileFromHandCost(new TargetCardInHand()); Cost cost = new ExileFromHandCost(new TargetCardInHand());
if (cost.canPay(source, source.getSourceId(), source.getControllerId(), game)) { if (cost.canPay(source, source.getSourceId(), source.getControllerId(), game)) {
cost.pay(source, game, source.getSourceId(), source.getControllerId(), true, null); cost.pay(source, game, source.getSourceId(), source.getControllerId(), true, null);

View file

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

View file

@ -61,7 +61,7 @@ public class GildedDrake extends CardImpl {
} }
public GildedDrake(UUID ownerId, CardSetInfo setInfo) { public GildedDrake(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{U}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}");
this.subtype.add("Drake"); this.subtype.add("Drake");
this.power = new MageInt(3); this.power = new MageInt(3);
@ -105,20 +105,22 @@ class GildedDrakeEffect extends OneShotEffect {
@Override @Override
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
Permanent sourceObject = game.getPermanent(source.getSourceId());
Permanent targetPermanent;
Player controller = game.getPlayer(source.getControllerId()); Player controller = game.getPlayer(source.getControllerId());
if (controller != null) { if (controller != null) {
if (targetPointer.getFirst(game, source) != null) { Permanent sourceObject = game.getPermanent(source.getSourceId());
targetPermanent = game.getPermanent(targetPointer.getFirst(game, source)); if (sourceObject != null) {
if (targetPermanent != null) { if (targetPointer.getFirst(game, source) != null) {
ContinuousEffect effect = new ExchangeControlTargetEffect(Duration.EndOfGame, "", true); Permanent targetPermanent = game.getPermanent(targetPointer.getFirst(game, source));
effect.setTargetPointer(targetPointer); if (targetPermanent != null) {
game.addEffect(effect, source); ContinuousEffect effect = new ExchangeControlTargetEffect(Duration.EndOfGame, "", true);
return true; effect.setTargetPointer(targetPointer);
game.addEffect(effect, source);
return true;
}
} }
sourceObject.sacrifice(source.getSourceId(), game);
} }
sourceObject.sacrifice(source.getSourceId(), game);
return true; return true;
} }
return false; return false;

View file

@ -99,7 +99,7 @@ class GilderBairnEffect extends OneShotEffect {
} }
for (Counter counter : target.getCounters(game).values()) { for (Counter counter : target.getCounters(game).values()) {
Counter newCounter = new Counter(counter.getName(), counter.getCount()); Counter newCounter = new Counter(counter.getName(), counter.getCount());
target.addCounters(newCounter, game); target.addCounters(newCounter, source, game);
} }
return false; return false;
} }

View file

@ -102,7 +102,7 @@ class GlisteningOilEffect extends OneShotEffect {
if (enchantment != null && enchantment.getAttachedTo() != null) { if (enchantment != null && enchantment.getAttachedTo() != null) {
Permanent creature = game.getPermanent(enchantment.getAttachedTo()); Permanent creature = game.getPermanent(enchantment.getAttachedTo());
if (creature != null) { if (creature != null) {
creature.addCounters(CounterType.M1M1.createInstance(), game); creature.addCounters(CounterType.M1M1.createInstance(), source, game);
} }
} }
return true; return true;

View file

@ -107,7 +107,7 @@ class GolgariGraveTrollEffect extends OneShotEffect {
if (permanent != null && player != null) { if (permanent != null && player != null) {
int amount = player.getGraveyard().count(filter, game); int amount = player.getGraveyard().count(filter, game);
if (amount > 0) { if (amount > 0) {
permanent.addCounters(CounterType.P1P1.createInstance(amount), game); permanent.addCounters(CounterType.P1P1.createInstance(amount), source, game);
} }
return true; return true;
} }

View file

@ -146,7 +146,7 @@ class GraveBetrayalEffect extends OneShotEffect {
Zone currentZone = game.getState().getZone(card.getId()); Zone currentZone = game.getState().getZone(card.getId());
if (card.putOntoBattlefield(game, currentZone, source.getSourceId(), source.getControllerId())) { if (card.putOntoBattlefield(game, currentZone, source.getSourceId(), source.getControllerId())) {
Permanent creature = game.getPermanent(card.getId()); Permanent creature = game.getPermanent(card.getId());
creature.addCounters(CounterType.P1P1.createInstance(), game); creature.addCounters(CounterType.P1P1.createInstance(), source, game);
ContinuousEffect effect = new GraveBetrayalContiniousEffect(); ContinuousEffect effect = new GraveBetrayalContiniousEffect();
effect.setTargetPointer(new FixedTarget(creature.getId())); effect.setTargetPointer(new FixedTarget(creature.getId()));
game.addEffect(effect, source); game.addEffect(effect, source);

View file

@ -97,7 +97,7 @@ class GriefTyrantEffect extends OneShotEffect {
Permanent griefTyrant = game.getPermanentOrLKIBattlefield(source.getSourceId()); Permanent griefTyrant = game.getPermanentOrLKIBattlefield(source.getSourceId());
int countersOnGriefTyrant = griefTyrant.getCounters(game).getCount(CounterType.M1M1); int countersOnGriefTyrant = griefTyrant.getCounters(game).getCount(CounterType.M1M1);
if (targetCreature != null) { if (targetCreature != null) {
targetCreature.addCounters(CounterType.M1M1.createInstance(countersOnGriefTyrant), game); targetCreature.addCounters(CounterType.M1M1.createInstance(countersOnGriefTyrant), source, game);
return true; return true;
} }
return false; return false;

View file

@ -109,7 +109,7 @@ class GwafaHazidProfiteerEffect1 extends OneShotEffect {
Permanent targetCreature = game.getPermanent(source.getFirstTarget()); Permanent targetCreature = game.getPermanent(source.getFirstTarget());
if (targetCreature != null) { if (targetCreature != null) {
Player controller = game.getPlayer(targetCreature.getControllerId()); Player controller = game.getPlayer(targetCreature.getControllerId());
targetCreature.addCounters(CounterType.BRIBERY.createInstance(), game); targetCreature.addCounters(CounterType.BRIBERY.createInstance(), source, game);
if (controller != null) { if (controller != null) {
controller.drawCards(1, game); controller.drawCards(1, game);
} }

View file

@ -0,0 +1,159 @@
/*
* 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.h;
import java.util.UUID;
import mage.MageObject;
import mage.Mana;
import mage.ObjectColor;
import mage.abilities.Ability;
import mage.abilities.common.BeginningOfUntapTriggeredAbility;
import mage.abilities.effects.ReplacementEffectImpl;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.choices.ChoiceColor;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.constants.TargetController;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.events.ManaEvent;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.util.CardUtil;
/**
*
* @author LevelX2
*/
public class HallOfGemstone extends CardImpl {
public HallOfGemstone(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{G}{G}");
this.supertype.add("World");
// At the beginning of each player's upkeep, that player chooses a color. Until end of turn, lands tapped for mana produce mana of the chosen color instead of any other color.
this.addAbility(new BeginningOfUntapTriggeredAbility(new HallOfGemstoneEffect(), TargetController.ANY, false));
}
public HallOfGemstone(final HallOfGemstone card) {
super(card);
}
@Override
public HallOfGemstone copy() {
return new HallOfGemstone(this);
}
}
class HallOfGemstoneEffect extends ReplacementEffectImpl {
HallOfGemstoneEffect() {
super(Duration.EndOfTurn, Outcome.Neutral);
staticText = "that player chooses a color. Until end of turn, lands tapped for mana produce mana of the chosen color instead of any other color";
}
HallOfGemstoneEffect(final HallOfGemstoneEffect effect) {
super(effect);
}
@Override
public HallOfGemstoneEffect copy() {
return new HallOfGemstoneEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
return true;
}
@Override
public void init(Ability source, Game game) {
super.init(source, game);
Player player = game.getPlayer(getTargetPointer().getFirst(game, source));
MageObject mageObject = game.getPermanentOrLKIBattlefield(source.getSourceId());
if (player != null && mageObject != null) {
ChoiceColor choice = new ChoiceColor();
while (!choice.isChosen()) {
player.choose(outcome, choice, game);
if (!player.canRespond()) {
return;
}
}
if (!game.isSimulation()) {
game.informPlayers(mageObject.getLogName() + ": " + player.getLogName() + " has chosen " + choice.getChoice());
}
game.getState().setValue(mageObject.getId() + "_color", choice.getColor());
if (mageObject instanceof Permanent) {
((Permanent) mageObject).addInfo("chosen color", CardUtil.addToolTipMarkTags("Chosen color: " + choice.getChoice()), game);
}
}
}
@Override
public boolean replaceEvent(GameEvent event, Ability source, Game game) {
ObjectColor colorChosen = (ObjectColor) game.getState().getValue(source.getSourceId() + "_color");
if (colorChosen != null) {
ManaEvent manaEvent = (ManaEvent) event;
Mana mana = manaEvent.getMana();
int amount = mana.count();
switch (colorChosen.getColoredManaSymbol()) {
case W:
mana.setToMana(Mana.WhiteMana(amount));
break;
case U:
mana.setToMana(Mana.BlueMana(amount));
break;
case B:
mana.setToMana(Mana.BlackMana(amount));
break;
case R:
mana.setToMana(Mana.RedMana(amount));
break;
case G:
mana.setToMana(Mana.GreenMana(amount));
break;
}
}
return false;
}
@Override
public boolean checksEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.TAPPED_FOR_MANA;
}
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
Permanent permanent = game.getPermanentOrLKIBattlefield(event.getSourceId());
return permanent != null && permanent.getCardType().contains(CardType.LAND);
}
}

View file

@ -131,7 +131,7 @@ class HamletbackGoliathEffect extends OneShotEffect {
creature = (Permanent) game.getLastKnownInformation(targetPointer.getFirst(game, source), Zone.BATTLEFIELD); creature = (Permanent) game.getLastKnownInformation(targetPointer.getFirst(game, source), Zone.BATTLEFIELD);
} }
if (creature != null && sourceObject != null) { if (creature != null && sourceObject != null) {
sourceObject.addCounters(CounterType.P1P1.createInstance(creature.getPower().getValue()), game); sourceObject.addCounters(CounterType.P1P1.createInstance(creature.getPower().getValue()), source, game);
} }
return true; return true;
} }

View file

@ -106,7 +106,7 @@ class HankyuAddCounterEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) { public boolean apply(Game game, Ability source) {
Permanent equipment = game.getPermanent(this.effectGivingEquipmentId); Permanent equipment = game.getPermanent(this.effectGivingEquipmentId);
if (equipment != null) { if (equipment != null) {
equipment.addCounters(CounterType.AIM.createInstance(), game); equipment.addCounters(CounterType.AIM.createInstance(), source, game);
} }
return true; return true;
} }

View file

@ -0,0 +1,134 @@
/*
* 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.h;
import java.util.UUID;
import mage.ObjectColor;
import mage.abilities.Ability;
import mage.abilities.common.AsEntersBattlefieldAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.ContinuousEffect;
import mage.abilities.effects.RedirectionEffect;
import mage.abilities.effects.ReplacementEffectImpl;
import mage.abilities.effects.common.ChooseColorEffect;
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.FilterInPlay;
import mage.filter.common.FilterInstantOrSorceryCard;
import mage.game.Game;
import mage.game.events.DamagePlayerEvent;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.game.stack.Spell;
import mage.game.stack.StackObject;
import mage.target.TargetPlayer;
/**
*
* @author anonymous
*/
public class HarshJudgment extends CardImpl {
public HarshJudgment(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{2}{W}{W}");
// As Harsh Judgment enters the battlefield, choose a color.
this.addAbility(new AsEntersBattlefieldAbility(new ChooseColorEffect(Outcome.Benefit)));
// If an instant or sorcery spell of the chosen color would deal damage to you, it deals that damage to its controller instead.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new HarshJudgmentEffect()));
}
public HarshJudgment(final HarshJudgment card) {
super(card);
}
@Override
public HarshJudgment copy() {
return new HarshJudgment(this);
}
}
class HarshJudgmentEffect extends RedirectionEffect {
private static final FilterInstantOrSorceryCard instantOrSorceryFilter = new FilterInstantOrSorceryCard();
public HarshJudgmentEffect() {
super(Duration.WhileOnBattlefield);
staticText = "If an instant or sorcery spell of the chosen color would deal damage to you, it deals that damage to its controller instead";
}
public HarshJudgmentEffect(final HarshJudgmentEffect effect) {
super(effect);
}
@Override
public boolean checksEventType(GameEvent event, Game game) {
return event.getType().equals(GameEvent.EventType.DAMAGE_PLAYER);
}
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
if(event.getTargetId().equals(source.getControllerId())) {
Spell spell = null;
StackObject stackObject = game.getStack().getStackObject(event.getSourceId());
if (stackObject == null) {
stackObject = (StackObject) game.getLastKnownInformation(event.getSourceId(), Zone.STACK);
}
if (stackObject instanceof Spell) {
spell = (Spell) stackObject;
}
//Checks if damage is from a sorcery or instants and spell is of chosen color
Permanent permanent = game.getPermanent(source.getSourceId());
ObjectColor color = (ObjectColor) game.getState().getValue(permanent.getId() + "_color");
if (spell != null && instantOrSorceryFilter.match(spell.getCard(), game) && spell.getColor(game).contains(color)) {
TargetPlayer target = new TargetPlayer();
target.add(spell.getControllerId(), game);
redirectTarget = target;
return true;
}
}
return false;
}
@Override
public HarshJudgmentEffect copy() {
return new HarshJudgmentEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
return true;
}
}

View file

@ -56,7 +56,7 @@ import mage.target.common.TargetCreatureOrPlayer;
public class HatchetBully extends CardImpl { public class HatchetBully extends CardImpl {
public HatchetBully(UUID ownerId, CardSetInfo setInfo) { public HatchetBully(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{R}"); super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}");
this.subtype.add("Goblin"); this.subtype.add("Goblin");
this.subtype.add("Warrior"); this.subtype.add("Warrior");
@ -104,7 +104,7 @@ class HatchetBullyCost extends CostImpl {
public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana, Cost costToPay) { public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana, Cost costToPay) {
Permanent permanent = game.getPermanent(ability.getTargets().get(1).getFirstTarget()); Permanent permanent = game.getPermanent(ability.getTargets().get(1).getFirstTarget());
if (permanent != null) { if (permanent != null) {
permanent.addCounters(CounterType.M1M1.createInstance(), game); permanent.addCounters(CounterType.M1M1.createInstance(), ability, game);
this.paid = true; this.paid = true;
} }
return paid; return paid;
@ -117,7 +117,7 @@ class HatchetBullyCost extends CostImpl {
} }
class HatchetBullyEffect extends OneShotEffect { class HatchetBullyEffect extends OneShotEffect {
public HatchetBullyEffect() { public HatchetBullyEffect() {
super(Outcome.Damage); super(Outcome.Damage);
staticText = "{this} deals 2 damage to target creature or player"; staticText = "{this} deals 2 damage to target creature or player";

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