mirror of
https://github.com/correl/mage.git
synced 2024-12-27 03:00:13 +00:00
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
commit
cf93656f0d
263 changed files with 2675 additions and 2243 deletions
|
@ -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>");
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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();
|
||||||
|
@ -83,9 +87,11 @@ public class TokensMtgImageSource implements CardImageSource {
|
||||||
|
|
||||||
private static final String[] EMBLEMS = {
|
private static final String[] EMBLEMS = {
|
||||||
"Ajani",
|
"Ajani",
|
||||||
|
"Arlinn",
|
||||||
"Chandra",
|
"Chandra",
|
||||||
"Dack",
|
"Dack",
|
||||||
"Daretti",
|
"Daretti",
|
||||||
|
"Dovin",
|
||||||
"Domri",
|
"Domri",
|
||||||
"Elspeth",
|
"Elspeth",
|
||||||
"Garruk",
|
"Garruk",
|
||||||
|
@ -100,8 +106,7 @@ public class TokensMtgImageSource implements CardImageSource {
|
||||||
"Sorin",
|
"Sorin",
|
||||||
"Tamiyo",
|
"Tamiyo",
|
||||||
"Teferi",
|
"Teferi",
|
||||||
"Venser",
|
"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>() {
|
||||||
{
|
{
|
||||||
|
@ -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) {
|
||||||
|
@ -173,15 +178,10 @@ public class TokensMtgImageSource implements CardImageSource {
|
||||||
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<TokenData>();
|
tokensData = new ArrayList<>();
|
||||||
|
|
||||||
// get tokens data from resource file
|
// get tokens data from resource file
|
||||||
InputStream inputStream = null;
|
InputStream inputStream = null;
|
||||||
|
@ -208,7 +208,7 @@ public class TokensMtgImageSource implements CardImageSource {
|
||||||
inputStream = url.openStream();
|
inputStream = url.openStream();
|
||||||
List<TokenData> siteTokensData = parseTokensData(inputStream);
|
List<TokenData> siteTokensData = parseTokensData(inputStream);
|
||||||
|
|
||||||
List<TokenData> newTokensData = new ArrayList<TokenData>();
|
List<TokenData> newTokensData = new ArrayList<>();
|
||||||
for (TokenData siteData : siteTokensData) {
|
for (TokenData siteData : siteTokensData) {
|
||||||
boolean isNew = true;
|
boolean isNew = true;
|
||||||
for (TokenData fileData : tokensData) {
|
for (TokenData fileData : tokensData) {
|
||||||
|
@ -238,13 +238,12 @@ public class TokensMtgImageSource implements CardImageSource {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return tokensData;
|
return tokensData;
|
||||||
}
|
}
|
||||||
|
|
||||||
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 {
|
||||||
|
|
|
@ -10,6 +10,7 @@ public class CardDownloadData {
|
||||||
|
|
||||||
private String name;
|
private String name;
|
||||||
private String downloadName;
|
private String downloadName;
|
||||||
|
private String fileName = "";
|
||||||
private String set;
|
private String set;
|
||||||
private String tokenSetCode;
|
private String tokenSetCode;
|
||||||
private String tokenDescriptor;
|
private String tokenDescriptor;
|
||||||
|
@ -32,6 +33,11 @@ public class CardDownloadData {
|
||||||
this(name, set, collectorId, usesVariousArt, type, tokenSetCode, tokenDescriptor, token, false, false);
|
this(name, set, collectorId, usesVariousArt, type, tokenSetCode, tokenDescriptor, token, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public CardDownloadData(String name, String set, String collectorId, boolean usesVariousArt, Integer type, String tokenSetCode, String tokenDescriptor, boolean token, String fileName) {
|
||||||
|
this(name, set, collectorId, usesVariousArt, type, tokenSetCode, tokenDescriptor, token, false, false);
|
||||||
|
this.fileName = fileName;
|
||||||
|
}
|
||||||
|
|
||||||
public CardDownloadData(String name, String set, String collectorId, boolean usesVariousArt, Integer type, String tokenSetCode, String tokenDescriptor, boolean token, boolean twoFacedCard, boolean secondSide) {
|
public CardDownloadData(String name, String set, String collectorId, boolean usesVariousArt, Integer type, String tokenSetCode, String tokenDescriptor, boolean token, boolean twoFacedCard, boolean secondSide) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.set = set;
|
this.set = set;
|
||||||
|
@ -60,6 +66,7 @@ public class CardDownloadData {
|
||||||
this.usesVariousArt = card.usesVariousArt;
|
this.usesVariousArt = card.usesVariousArt;
|
||||||
this.tokenSetCode = card.tokenSetCode;
|
this.tokenSetCode = card.tokenSetCode;
|
||||||
this.tokenDescriptor = card.tokenDescriptor;
|
this.tokenDescriptor = card.tokenDescriptor;
|
||||||
|
this.fileName = card.fileName;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -118,6 +125,14 @@ public class CardDownloadData {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getFileName() {
|
||||||
|
return fileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFileName(String fileName) {
|
||||||
|
this.fileName = fileName;
|
||||||
|
}
|
||||||
|
|
||||||
public void setName(String name) {
|
public void setName(String name) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
|
@ -147,8 +162,8 @@ public class CardDownloadData {
|
||||||
}
|
}
|
||||||
|
|
||||||
private String lastDitchTokenDescriptor() {
|
private String lastDitchTokenDescriptor() {
|
||||||
String name = this.name.replaceAll("[^a-zA-Z0-9]", "");
|
String tmpName = this.name.replaceAll("[^a-zA-Z0-9]", "");
|
||||||
String descriptor = name + "....";
|
String descriptor = tmpName + "....";
|
||||||
descriptor = descriptor.toUpperCase();
|
descriptor = descriptor.toUpperCase();
|
||||||
return descriptor;
|
return descriptor;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()) {
|
||||||
|
@ -309,7 +309,7 @@ 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 -> {
|
||||||
|
@ -353,13 +353,13 @@ public class DownloadPictures extends DefaultBoundedRangeModel implements Runnab
|
||||||
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()) {
|
||||||
|
try {
|
||||||
new TFile(existingFile).cp_rp(outputFile);
|
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) {
|
||||||
|
|
|
@ -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";
|
||||||
|
|
|
@ -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||
|
||||||
|
|
|
@ -55,7 +55,7 @@ Angel, T1, W, 4|4, Player Rewards, Creature - Angel, Scott M. Fischer, Flying
|
||||||
|
|
||||||
8ED - Eighth Edition (2003-07-28)
|
8ED - Eighth Edition (2003-07-28)
|
||||||
|
|
||||||
Rukh, T1, R, 4|4, Player Rewards, Creature - Rukh, Edward P. Beard‚ Jr., Flying
|
Rukh, T1, R, 4|4, Player Rewards, Creature - Rukh, Edward P. Beard<EFBFBD> Jr., Flying
|
||||||
|
|
||||||
MRD - Mirrodin (2003-10-02)
|
MRD - Mirrodin (2003-10-02)
|
||||||
|
|
||||||
|
@ -65,7 +65,7 @@ Pentavite, T3, -, 1|1, Player Rewards, Artifact Creature - Pentavite, Greg Stapl
|
||||||
|
|
||||||
DST - Darksteel (2004-02-06)
|
DST - Darksteel (2004-02-06)
|
||||||
|
|
||||||
Beast, T1, G, 3|3, Player Rewards, Creature - Beast, Edward P. Beard‚ Jr., -
|
Beast, T1, G, 3|3, Player Rewards, Creature - Beast, Edward P. Beard<EFBFBD> Jr., -
|
||||||
|
|
||||||
CHK - Champions of Kamigawa (2004-10-01)
|
CHK - Champions of Kamigawa (2004-10-01)
|
||||||
|
|
||||||
|
@ -73,7 +73,7 @@ Spirit, T1, -, 1|1, Player Rewards, Creature - Spirit, Hugh Jamieson, -
|
||||||
|
|
||||||
CSP - Coldsnap (2006-07-21)
|
CSP - Coldsnap (2006-07-21)
|
||||||
|
|
||||||
Marit Lage, T1, B, 20|20, Pre-Release, Creature - Avatar, Stephan Martiniere, Flying‚ indestructible
|
Marit Lage, T1, B, 20|20, Pre-Release, Creature - Avatar, Stephan Martiniere, Flying<EFBFBD> indestructible
|
||||||
|
|
||||||
10E - Tenth Edition (2007-07-13)
|
10E - Tenth Edition (2007-07-13)
|
||||||
|
|
||||||
|
@ -167,7 +167,7 @@ ARB - Alara Reborn (2009-04-30)
|
||||||
|
|
||||||
Bird Soldier, 1, W, 1|1, -, Creature - Bird Soldier, Matt Cavotta, Flying
|
Bird Soldier, 1, W, 1|1, -, Creature - Bird Soldier, Matt Cavotta, Flying
|
||||||
Lizard, 2, G, 2|2, -, Creature - Lizard, Anthony S. Waters, -
|
Lizard, 2, G, 2|2, -, Creature - Lizard, Anthony S. Waters, -
|
||||||
Dragon, 3, R G, 1|1, -, Creature - Dragon, Jaime Jones, Flying‚ devour 2
|
Dragon, 3, R G, 1|1, -, Creature - Dragon, Jaime Jones, Flying<EFBFBD> devour 2
|
||||||
Zombie Wizard, 4, U B, 1|1, -, Creature - Zombie Wizard, Dave Allsop, -
|
Zombie Wizard, 4, U B, 1|1, -, Creature - Zombie Wizard, Dave Allsop, -
|
||||||
|
|
||||||
M10 - Magic 2010 (2009-07-17)
|
M10 - Magic 2010 (2009-07-17)
|
||||||
|
@ -190,7 +190,7 @@ Illusion, 4, U, 2|2, -, Creature - Illusion, Cyril Van Der Haegen, -
|
||||||
Merfolk, 5, U, 1|1, -, Creature - Merfolk, Warren Mahy, -
|
Merfolk, 5, U, 1|1, -, Creature - Merfolk, Warren Mahy, -
|
||||||
Vampire, 6, B, *|*, -, Creature - Vampire, Kekai Kotaki, -
|
Vampire, 6, B, *|*, -, Creature - Vampire, Kekai Kotaki, -
|
||||||
Zombie Giant, 7, B, 5|5, -, Creature - Zombie Giant, Igor Kieryluk, -
|
Zombie Giant, 7, B, 5|5, -, Creature - Zombie Giant, Igor Kieryluk, -
|
||||||
Elemental, 8, R, 7|1, -, Creature - Elemental, Anthony Francisco, Trample‚ haste
|
Elemental, 8, R, 7|1, -, Creature - Elemental, Anthony Francisco, Trample<EFBFBD> haste
|
||||||
Beast, 9, G, 4|4, -, Creature - Beast, Steve Prescott, -
|
Beast, 9, G, 4|4, -, Creature - Beast, Steve Prescott, -
|
||||||
Snake, 10, G, 1|1, -, Creature - Snake, Austin Hsu, -
|
Snake, 10, G, 1|1, -, Creature - Snake, Austin Hsu, -
|
||||||
Wolf, 11, G, 2|2, -, Creature - Wolf, Daren Bader, -
|
Wolf, 11, G, 2|2, -, Creature - Wolf, Daren Bader, -
|
||||||
|
@ -212,7 +212,7 @@ Construct, 6, -, 6|12, -, Artifact Creature - Construct, Jung Park, Trample
|
||||||
|
|
||||||
DDE - Duel Decks: Phyrexia vs. the Coalition (2010-03-19)
|
DDE - Duel Decks: Phyrexia vs. the Coalition (2010-03-19)
|
||||||
|
|
||||||
Hornet, T1, -, 1|1, -, Artifact Creature - Insect, Ron Spencer, Flying‚ haste
|
Hornet, T1, -, 1|1, -, Artifact Creature - Insect, Ron Spencer, Flying<EFBFBD> haste
|
||||||
Minion, T2, B, *|*, -, Creature - Minion, Dave Kendall, -
|
Minion, T2, B, *|*, -, Creature - Minion, Dave Kendall, -
|
||||||
Saproling, T3, G, 1|1, -, Creature - Saproling, Warren Mahy, -
|
Saproling, T3, G, 1|1, -, Creature - Saproling, Warren Mahy, -
|
||||||
|
|
||||||
|
@ -232,7 +232,7 @@ Avatar, 1, W, *|*, -, Creature - Avatar, Vance Kovacs, This creature's power and
|
||||||
Bird, 2, W, 3|3, -, Creature - Bird, Paul Bonner, Flying
|
Bird, 2, W, 3|3, -, Creature - Bird, Paul Bonner, Flying
|
||||||
Zombie, 3, B, 2|2, -, Creature - Zombie, Bud Cook, -
|
Zombie, 3, B, 2|2, -, Creature - Zombie, Bud Cook, -
|
||||||
Beast, 4, G, 3|3, -, Creature - Beast, John Donahue, -
|
Beast, 4, G, 3|3, -, Creature - Beast, John Donahue, -
|
||||||
Ooze, 5, G, 2|2, -, Creature - Ooze, Raymond Swanland, When this creature dies‚ put two 1/1 green Ooze creature tokens onto the battlefield.
|
Ooze, 5, G, 2|2, -, Creature - Ooze, Raymond Swanland, When this creature dies<EFBFBD> put two 1/1 green Ooze creature tokens onto the battlefield.
|
||||||
Ooze, 6, G, 1|1, -, Creature - Ooze, Raymond Swanland, -
|
Ooze, 6, G, 1|1, -, Creature - Ooze, Raymond Swanland, -
|
||||||
|
|
||||||
DDF - Duel Decks: Elspeth vs. Tezzeret (2010-09-03)
|
DDF - Duel Decks: Elspeth vs. Tezzeret (2010-09-03)
|
||||||
|
@ -313,7 +313,7 @@ Sorin Emblem, 3, -, -, -, Emblem - Sorin, Michael Komrack, Creatures you control
|
||||||
DDI - Duel Decks: Venser vs. Koth (2012-03-30)
|
DDI - Duel Decks: Venser vs. Koth (2012-03-30)
|
||||||
|
|
||||||
Koth Emblem, E1, -, -, -, Emblem - Koth, Eric Deschamps, Mountains you control have Tap: This land deals 1 damage to target creature or player.'
|
Koth Emblem, E1, -, -, -, Emblem - Koth, Eric Deschamps, Mountains you control have Tap: This land deals 1 damage to target creature or player.'
|
||||||
Venser Emblem, E2, -, -, -, Emblem - Venser, Eric Deschamps, Whenever you cast a spell‚ exile target permanent.
|
Venser Emblem, E2, -, -, -, Emblem - Venser, Eric Deschamps, Whenever you cast a spell<EFBFBD> exile target permanent.
|
||||||
|
|
||||||
FNM - Friday Night Magic (2012-04-01)
|
FNM - Friday Night Magic (2012-04-01)
|
||||||
|
|
||||||
|
@ -329,7 +329,7 @@ Spirit, 4, U, 1|1, -, Creature - Spirit, Dan Scott, Flying
|
||||||
Demon, 5, B, 5|5, -, Creature - Demon, Kev Walker, Flying
|
Demon, 5, B, 5|5, -, Creature - Demon, Kev Walker, Flying
|
||||||
Zombie, 6, B, 2|2, -, Creature - Zombie, Lucas Graciano, -
|
Zombie, 6, B, 2|2, -, Creature - Zombie, Lucas Graciano, -
|
||||||
Human, 7, R, 1|1, -, Creature - Human, Ryan Pancoast, Haste
|
Human, 7, R, 1|1, -, Creature - Human, Ryan Pancoast, Haste
|
||||||
Tamiyo Emblem, 8, -, -, -, Emblem - Tamiyo, Eric Deschamps, You have no maximum hand size. Whenever a card is put into your graveyard from anywhere‚ you may return it to your hand.
|
Tamiyo Emblem, 8, -, -, -, Emblem - Tamiyo, Eric Deschamps, You have no maximum hand size. Whenever a card is put into your graveyard from anywhere<EFBFBD> you may return it to your hand.
|
||||||
Angel, T1, W, 4|4, Pre-Release, Creature - Angel, James Ryman, Flying
|
Angel, T1, W, 4|4, Pre-Release, Creature - Angel, James Ryman, Flying
|
||||||
Angel, T1F, W, 4|4, Pre-Release, Creature - Angel, James Ryman, Flying
|
Angel, T1F, W, 4|4, Pre-Release, Creature - Angel, James Ryman, Flying
|
||||||
Demon, T5, B, 5|5, Pre-Release, Creature - Demon, Karl Kopinski, Flying
|
Demon, T5, B, 5|5, Pre-Release, Creature - Demon, Karl Kopinski, Flying
|
||||||
|
@ -361,7 +361,7 @@ Knight, 1, W, 2|2, League, Creature - Knight, Lucas Graciano, Vigilance
|
||||||
Bird, 1, W, 1|1, -, Creature - Bird, James Ryman, Flying
|
Bird, 1, W, 1|1, -, Creature - Bird, James Ryman, Flying
|
||||||
Knight, 2, W, 2|2, -, Creature - Knight, Matt Stewart, Vigilance
|
Knight, 2, W, 2|2, -, Creature - Knight, Matt Stewart, Vigilance
|
||||||
Soldier, 3, W, 1|1, -, Creature - Soldier, Steve Prescott, -
|
Soldier, 3, W, 1|1, -, Creature - Soldier, Steve Prescott, -
|
||||||
Assassin, 4, B, 1|1, -, Creature - Assassin, Svetlin Velinov, Whenever this creature deals combat damage to a player‚ that player loses the game.
|
Assassin, 4, B, 1|1, -, Creature - Assassin, Svetlin Velinov, Whenever this creature deals combat damage to a player<EFBFBD> that player loses the game.
|
||||||
Dragon, 5, R, 6|6, -, Creature - Dragon, Mark Zug, Flying
|
Dragon, 5, R, 6|6, -, Creature - Dragon, Mark Zug, Flying
|
||||||
Goblin, 6, R, 1|1, -, Creature - Goblin, Christopher Moeller, -
|
Goblin, 6, R, 1|1, -, Creature - Goblin, Christopher Moeller, -
|
||||||
Centaur, 7, G, 3|3, -, Creature - Centaur, Slawomir Maniak, -
|
Centaur, 7, G, 3|3, -, Creature - Centaur, Slawomir Maniak, -
|
||||||
|
@ -377,11 +377,11 @@ Soldier, 1, R W, 1|1, League, Creature - Soldier, Zoltan Boros, Haste
|
||||||
Angel, 1, W, 4|4, -, Creature - Angel, Steve Argyle, Flying
|
Angel, 1, W, 4|4, -, Creature - Angel, Steve Argyle, Flying
|
||||||
Rat, 2, B, 1|1, -, Creature - Rat, Nils Hamm, -
|
Rat, 2, B, 1|1, -, Creature - Rat, Nils Hamm, -
|
||||||
Frog Lizard, 3, G, 3|3, -, Creature - Frog Lizard, Jack Wang, -
|
Frog Lizard, 3, G, 3|3, -, Creature - Frog Lizard, Jack Wang, -
|
||||||
Cleric, 4, W B, 1|1, -, Creature - Cleric, Jason Chan, {3}{W}{B}{B}‚ {T}‚ Sacrifice this creature: Return a card named Deathpact Angel from your graveyard to the battlefield.
|
Cleric, 4, W B, 1|1, -, Creature - Cleric, Jason Chan, {3}{W}{B}{B}<EFBFBD> {T}<7D> Sacrifice this creature: Return a card named Deathpact Angel from your graveyard to the battlefield.
|
||||||
Horror, 5, U B, 1|1, -, Creature - Horror, Adam Paquette, Flying
|
Horror, 5, U B, 1|1, -, Creature - Horror, Adam Paquette, Flying
|
||||||
Soldier, 6, R W, 1|1, -, Creature - Soldier, David Palumbo, Haste
|
Soldier, 6, R W, 1|1, -, Creature - Soldier, David Palumbo, Haste
|
||||||
Spirit, 7, W B, 1|1, -, Creature - Spirit, Cliff Childs, Flying
|
Spirit, 7, W B, 1|1, -, Creature - Spirit, Cliff Childs, Flying
|
||||||
Domri Emblem, 8, -, -, -, Emblem - Domri, Tyler Jacobson, Creatures you control have double strike‚ trample‚ hexproof‚ and haste.
|
Domri Emblem, 8, -, -, -, Emblem - Domri, Tyler Jacobson, Creatures you control have double strike<EFBFBD> trample<6C> hexproof<6F> and haste.
|
||||||
|
|
||||||
DDK - Duel Decks: Sorin vs. Tibalt (2013-03-15)
|
DDK - Duel Decks: Sorin vs. Tibalt (2013-03-15)
|
||||||
|
|
||||||
|
@ -409,7 +409,7 @@ Saproling, 12, G, 1|1, -, Creature - Saproling, Warren Mahy, -
|
||||||
Treefolk Shaman, 13, G, 2|5, -, Creature - Treefolk Shaman, Zack Stella, -
|
Treefolk Shaman, 13, G, 2|5, -, Creature - Treefolk Shaman, Zack Stella, -
|
||||||
Faerie Rogue, 14, U B, 1|1, -, Creature - Faerie Rogue, E. M. Gist, Flying
|
Faerie Rogue, 14, U B, 1|1, -, Creature - Faerie Rogue, E. M. Gist, Flying
|
||||||
Worm, 15, B G, 1|1, -, Creature - Worm, Chuck Lukacs, -
|
Worm, 15, B G, 1|1, -, Creature - Worm, Chuck Lukacs, -
|
||||||
Elspeth Emblem, 16, -, -, -, Emblem - Elspeth, Volkan Baga, Artifacts‚ creatures‚ enchantments‚ and lands you control have indestructible.
|
Elspeth Emblem, 16, -, -, -, Emblem - Elspeth, Volkan Baga, Artifacts<EFBFBD> creatures<65> enchantments<74> and lands you control have indestructible.
|
||||||
|
|
||||||
M14 - Magic 2014 Core Set (2013-07-19)
|
M14 - Magic 2014 Core Set (2013-07-19)
|
||||||
|
|
||||||
|
@ -425,7 +425,7 @@ Beast, 9, G, 3|3, -, Creature - Beast, John Donahue, -
|
||||||
Saproling, 10, G, 1|1, -, Creature - Saproling, Brad Rigney, -
|
Saproling, 10, G, 1|1, -, Creature - Saproling, Brad Rigney, -
|
||||||
Wolf, 11, G, 2|2, -, Creature - Wolf, Lars Grant-West, -
|
Wolf, 11, G, 2|2, -, Creature - Wolf, Lars Grant-West, -
|
||||||
Liliana Emblem, 12, -, -, -, Emblem - Liliana, D. Alexander Gregory, Swamps you control have Tap: Add {B}{B}{B}{B} to your mana pool.'
|
Liliana Emblem, 12, -, -, -, Emblem - Liliana, D. Alexander Gregory, Swamps you control have Tap: Add {B}{B}{B}{B} to your mana pool.'
|
||||||
Garruk Emblem, 13, -, -, -, Emblem - Garruk, Karl Kopinski, Whenever you cast a creature spell‚ you may search your library for a creature card‚ put it onto the battlefield‚ then shuffle your library.
|
Garruk Emblem, 13, -, -, -, Emblem - Garruk, Karl Kopinski, Whenever you cast a creature spell<EFBFBD> you may search your library for a creature card<72> put it onto the battlefield<6C> then shuffle your library.
|
||||||
Sliver, T1, -, 1|1, League, Creature - Sliver, Vincent Proce, -
|
Sliver, T1, -, 1|1, League, Creature - Sliver, Vincent Proce, -
|
||||||
|
|
||||||
DDL - Duel Decks: Heroes vs. Monsters (2013-09-06)
|
DDL - Duel Decks: Heroes vs. Monsters (2013-09-06)
|
||||||
|
@ -462,11 +462,11 @@ Elemental, 7, R, 3|1, -, Enchantment Creature - Elemental, Greg Staples, -
|
||||||
Centaur, 8, G, 3|3, -, Enchantment Creature - Centaur, Ryan Barger, -
|
Centaur, 8, G, 3|3, -, Enchantment Creature - Centaur, Ryan Barger, -
|
||||||
Wolf, 9, G, 2|2, -, Creature - Wolf, Raoul Vitale, -
|
Wolf, 9, G, 2|2, -, Creature - Wolf, Raoul Vitale, -
|
||||||
Gold, 10, -, -, -, Artifact, Richard Wright, Sacrifice this artifact: Add one mana of any color to your mana pool.
|
Gold, 10, -, -, -, Artifact, Richard Wright, Sacrifice this artifact: Add one mana of any color to your mana pool.
|
||||||
Kiora Emblem, 11, -, -, -, Emblem - Kiora, Scott M. Fischer, At the beginning of your end step‚ put a 9/9 blue Kraken creature token onto the battlefield.
|
Kiora Emblem, 11, -, -, -, Emblem - Kiora, Scott M. Fischer, At the beginning of your end step<EFBFBD> put a 9/9 blue Kraken creature token onto the battlefield.
|
||||||
|
|
||||||
DDM - Duel Decks: Jace vs. Vraska (2014-03-14)
|
DDM - Duel Decks: Jace vs. Vraska (2014-03-14)
|
||||||
|
|
||||||
Assassin, T1, B, 1|1, -, Creature - Assassin, Svetlin Velinov, Whenever this creature deals combat damage to a player‚ that player loses the game.
|
Assassin, T1, B, 1|1, -, Creature - Assassin, Svetlin Velinov, Whenever this creature deals combat damage to a player<EFBFBD> that player loses the game.
|
||||||
|
|
||||||
JOU - Journey into Nyx (2014-05-02)
|
JOU - Journey into Nyx (2014-05-02)
|
||||||
|
|
||||||
|
@ -483,7 +483,7 @@ MD1 - Modern Event Deck 2014 (2014-05-30)
|
||||||
Soldier, 1, W, 1|1, -, Creature - Soldier, Goran Josic, -
|
Soldier, 1, W, 1|1, -, Creature - Soldier, Goran Josic, -
|
||||||
Spirit, 2, W, 1|1, -, Creature - Spirit, Kev Walker, Flying
|
Spirit, 2, W, 1|1, -, Creature - Spirit, Kev Walker, Flying
|
||||||
Myr, 3, -, 1|1, -, Artifact Creature - Myr, Matt Stewart, -
|
Myr, 3, -, 1|1, -, Artifact Creature - Myr, Matt Stewart, -
|
||||||
Elspeth Emblem, 4, -, -, -, Emblem - Elspeth, Volkan Baga, Artifacts‚ creatures‚ enchantments‚ and lands you control have indestructible.
|
Elspeth Emblem, 4, -, -, -, Emblem - Elspeth, Volkan Baga, Artifacts<EFBFBD> creatures<65> enchantments<74> and lands you control have indestructible.
|
||||||
|
|
||||||
CNS - Conspiracy (2014-06-06)
|
CNS - Conspiracy (2014-06-06)
|
||||||
|
|
||||||
|
@ -495,7 +495,7 @@ Elephant, 5, G, 3|3, -, Creature - Elephant, Lars Grant-West, -
|
||||||
Squirrel, 6, G, 1|1, -, Creature - Squirrel, Daniel Ljunggren, -
|
Squirrel, 6, G, 1|1, -, Creature - Squirrel, Daniel Ljunggren, -
|
||||||
Wolf, 7, G, 2|2, -, Creature - Wolf, Raoul Vitale, -
|
Wolf, 7, G, 2|2, -, Creature - Wolf, Raoul Vitale, -
|
||||||
Construct, 8, -, 1|1, -, Artifact Creature - Construct, Adam Paquette, Defender
|
Construct, 8, -, 1|1, -, Artifact Creature - Construct, Adam Paquette, Defender
|
||||||
Dack Emblem, 9, -, -, -, Emblem - Dack, Eric Deschamps, Whenever you cast a spell that targets one or more permanents‚ gain control of those permanents.
|
Dack Emblem, 9, -, -, -, Emblem - Dack, Eric Deschamps, Whenever you cast a spell that targets one or more permanents<EFBFBD> gain control of those permanents.
|
||||||
|
|
||||||
M15 - Magic 2015 Core Set (2014-07-18)
|
M15 - Magic 2015 Core Set (2014-07-18)
|
||||||
|
|
||||||
|
@ -510,11 +510,11 @@ Zombie, 006, B, 2|2, -, Creature - Zombie, Lucas Graciano, -
|
||||||
Dragon, 007, R, 2|2, -, Creature - Dragon, Jack Wang, Flying {R}: This creature gets +1/+0 until end of turn.
|
Dragon, 007, R, 2|2, -, Creature - Dragon, Jack Wang, Flying {R}: This creature gets +1/+0 until end of turn.
|
||||||
Goblin, 008, R, 1|1, -, Creature - Goblin, Karl Kopinski, -
|
Goblin, 008, R, 1|1, -, Creature - Goblin, Karl Kopinski, -
|
||||||
Beast, 009, G, 3|3, -, Creature - Beast, Dave Kendall, -
|
Beast, 009, G, 3|3, -, Creature - Beast, Dave Kendall, -
|
||||||
Insect, 010, G, 1|1, -, Creature - Insect, Martina Pilcerova, Flying‚ deathtouch
|
Insect, 010, G, 1|1, -, Creature - Insect, Martina Pilcerova, Flying<EFBFBD> deathtouch
|
||||||
Treefolk Warrior, 011, G, *|*, -, Creature - Treefolk Warrior, Todd Lockwood, This creature's power and toughness are each equal to the number of Forests you control.
|
Treefolk Warrior, 011, G, *|*, -, Creature - Treefolk Warrior, Todd Lockwood, This creature's power and toughness are each equal to the number of Forests you control.
|
||||||
Land Mine, 012, -, -, -, Artifact, Kev Walker, {R}‚ Sacrifice this artifact: This artifact deals 2 damage to target attacking creature without flying.
|
Land Mine, 012, -, -, -, Artifact, Kev Walker, {R}<EFBFBD> Sacrifice this artifact: This artifact deals 2 damage to target attacking creature without flying.
|
||||||
Ajani Emblem, 013, -, -, -, Emblem - Ajani, Chris Rahn, If a source would deal damage to you or a planeswalker you control‚ prevent all but 1 of that damage.
|
Ajani Emblem, 013, -, -, -, Emblem - Ajani, Chris Rahn, If a source would deal damage to you or a planeswalker you control<EFBFBD> prevent all but 1 of that damage.
|
||||||
Garruk Emblem, 014, -, -, -, Emblem - Garruk, Tyler Jacobson, Whenever a creature attacks you‚ it gets +5/+5 and gains trample until end of turn.
|
Garruk Emblem, 014, -, -, -, Emblem - Garruk, Tyler Jacobson, Whenever a creature attacks you<EFBFBD> it gets +5/+5 and gains trample until end of turn.
|
||||||
|
|
||||||
DDN - Duel Decks: Speed vs. Cunning (2014-09-05)
|
DDN - Duel Decks: Speed vs. Cunning (2014-09-05)
|
||||||
|
|
||||||
|
@ -534,8 +534,8 @@ Bear, 008, G, 4|4, -, Creature - Bear, Kev Walker, -
|
||||||
Snake, 009, G, 1|1, -, Creature - Snake, Lars Grant-West, -
|
Snake, 009, G, 1|1, -, Creature - Snake, Lars Grant-West, -
|
||||||
Spirit Warrior, 010, B G, *|*, -, Creature - Spirit Warrior, Ryan Alexander Lee, -
|
Spirit Warrior, 010, B G, *|*, -, Creature - Spirit Warrior, Ryan Alexander Lee, -
|
||||||
Morph, 011, -, 2|2, -, Creature, Raymond Swanland, (You can cover a face-down creature with this reminder card. A card with morph can be turned face up any time for its morph cost.)
|
Morph, 011, -, 2|2, -, Creature, Raymond Swanland, (You can cover a face-down creature with this reminder card. A card with morph can be turned face up any time for its morph cost.)
|
||||||
Sarkhan Emblem, 012, -, -, -, Emblem - Sarkhan, Daarken, At the beginning of your draw step‚ draw two additional cards. At the beginning of your end step‚ discard your hand.
|
Sarkhan Emblem, 012, -, -, -, Emblem - Sarkhan, Daarken, At the beginning of your draw step<EFBFBD> draw two additional cards. At the beginning of your end step<65> discard your hand.
|
||||||
Sorin Emblem, 013, -, -, -, Emblem - Sorin, Cynthia Sheppard, At the beginning of each opponent's upkeep‚ that player sacrifices a creature.
|
Sorin Emblem, 013, -, -, -, Emblem - Sorin, Cynthia Sheppard, At the beginning of each opponent's upkeep<EFBFBD> that player sacrifices a creature.
|
||||||
|
|
||||||
C14 - Commander 2014 (2014-11-07)
|
C14 - Commander 2014 (2014-11-07)
|
||||||
|
|
||||||
|
@ -546,9 +546,9 @@ Kor Soldier, 004, W, 1|1, -, Creature - Kor Soldier, Daren Bader, -
|
||||||
Pegasus, 005, W, 1|1, -, Creature - Pegasus, Greg Hildebrandt, Flying
|
Pegasus, 005, W, 1|1, -, Creature - Pegasus, Greg Hildebrandt, Flying
|
||||||
Soldier, 006, W, 1|1, -, Creature - Soldier, Goran Josic, -
|
Soldier, 006, W, 1|1, -, Creature - Soldier, Goran Josic, -
|
||||||
Spirit, 007, W, 1|1, -, Creature - Spirit, Ryan Yee, Flying
|
Spirit, 007, W, 1|1, -, Creature - Spirit, Ryan Yee, Flying
|
||||||
Fish, 008, U, 3|3, -, Creature - Fish, Dan Scott, When this creature dies‚ put a 6/6 blue Whale creature token onto the battlefield with "When this creature dies‚ put a 9/9 blue Kraken creature token onto the battlefield."
|
Fish, 008, U, 3|3, -, Creature - Fish, Dan Scott, When this creature dies<EFBFBD> put a 6/6 blue Whale creature token onto the battlefield with "When this creature dies<65> put a 9/9 blue Kraken creature token onto the battlefield."
|
||||||
Kraken, 009, U, 9|9, -, Creature - Kraken, Dan Scott, -
|
Kraken, 009, U, 9|9, -, Creature - Kraken, Dan Scott, -
|
||||||
Whale, 010, U, 6|6, -, Creature - Whale, Dan Scott, When this creature dies‚ put a 9/9 blue Kraken creature token onto the battlefield.
|
Whale, 010, U, 6|6, -, Creature - Whale, Dan Scott, When this creature dies<EFBFBD> put a 9/9 blue Kraken creature token onto the battlefield.
|
||||||
Zombie, 011, U, *|*, -, Creature - Zombie, Dave Kendall, -
|
Zombie, 011, U, *|*, -, Creature - Zombie, Dave Kendall, -
|
||||||
Demon, 012, B, *|*, -, Creature - Demon, Pete Venters, Flying
|
Demon, 012, B, *|*, -, Creature - Demon, Pete Venters, Flying
|
||||||
Demon, 013, B, 5|5, -, Creature - Demon, Kev Walker, Flying
|
Demon, 013, B, 5|5, -, Creature - Demon, Kev Walker, Flying
|
||||||
|
@ -573,26 +573,26 @@ Tuktuk The Returned, 031, -, 5|5, -, Legendary Artifact Creature - Goblin Golem,
|
||||||
Wurm, 032, -, 3|3, -, Artifact Creature - Wurm, Raymond Swanland, Deathtouch
|
Wurm, 032, -, 3|3, -, Artifact Creature - Wurm, Raymond Swanland, Deathtouch
|
||||||
Wurm, 033, -, 3|3, -, Artifact Creature - Wurm, Raymond Swanland, Lifelink
|
Wurm, 033, -, 3|3, -, Artifact Creature - Wurm, Raymond Swanland, Lifelink
|
||||||
Teferi Emblem, 034, -, -, -, Emblem - Teferi, Tyler Jacobson, You may activate loyalty abilities of planeswalkers you control on any player's turn any time you could cast an instant.
|
Teferi Emblem, 034, -, -, -, Emblem - Teferi, Tyler Jacobson, You may activate loyalty abilities of planeswalkers you control on any player's turn any time you could cast an instant.
|
||||||
Nixilis Emblem, 035, -, -, -, Emblem - Nixilis, Daarken, {1}{B}‚ Sacrifice a creature: You gain X life and draw X cards‚ where X is the sacrificed creature's power.
|
Nixilis Emblem, 035, -, -, -, Emblem - Nixilis, Daarken, {1}{B}<EFBFBD> Sacrifice a creature: You gain X life and draw X cards<64> where X is the sacrificed creature's power.
|
||||||
Daretti Emblem, 036, -, -, -, Emblem - Daretti, Dan Scott, Whenever an artifact is put into your graveyard from the battlefield‚ return that card to the battlefield at the beginning of the next end step.
|
Daretti Emblem, 036, -, -, -, Emblem - Daretti, Dan Scott, Whenever an artifact is put into your graveyard from the battlefield<EFBFBD> return that card to the battlefield at the beginning of the next end step.
|
||||||
|
|
||||||
DD3_EVG - Duel Decks Anthology‚ Elves vs. Goblins (2014-12-05)
|
DD3_EVG - Duel Decks Anthology<EFBFBD> Elves vs. Goblins (2014-12-05)
|
||||||
|
|
||||||
Elemental, 001, G, 7|7, -, Creature - Elemental, Anthony S. Waters, Trample
|
Elemental, 001, G, 7|7, -, Creature - Elemental, Anthony S. Waters, Trample
|
||||||
Elf Warrior, 002, G, 1|1, -, Creature - Elf Warrior, Dominick Domingo, -
|
Elf Warrior, 002, G, 1|1, -, Creature - Elf Warrior, Dominick Domingo, -
|
||||||
Goblin, 003, R, 1|1, -, Creature - Goblin, Dave Kendall, -
|
Goblin, 003, R, 1|1, -, Creature - Goblin, Dave Kendall, -
|
||||||
|
|
||||||
DD3_JVC - Duel Decks Anthology‚ Jace vs. Chandra (2014-12-05)
|
DD3_JVC - Duel Decks Anthology<EFBFBD> Jace vs. Chandra (2014-12-05)
|
||||||
|
|
||||||
Elemental Shaman, 004, R, 3|1, -, Creature - Elemental Shaman, Jim Pavelec, -
|
Elemental Shaman, 004, R, 3|1, -, Creature - Elemental Shaman, Jim Pavelec, -
|
||||||
|
|
||||||
DD3_DVD - Duel Decks Anthology‚ Divine vs. Demonic (2014-12-05)
|
DD3_DVD - Duel Decks Anthology<EFBFBD> Divine vs. Demonic (2014-12-05)
|
||||||
|
|
||||||
Spirit, 005, W, 1|1, -, Creature - Spirit, Luca Zontini, Flying
|
Spirit, 005, W, 1|1, -, Creature - Spirit, Luca Zontini, Flying
|
||||||
Demon, 006, B, *|*, -, Creature - Demon, Pete Venters, Flying
|
Demon, 006, B, *|*, -, Creature - Demon, Pete Venters, Flying
|
||||||
Thrull, 007, B, -, -, Creature - Thrull, Veronique Meignaud, -
|
Thrull, 007, B, -, -, Creature - Thrull, Veronique Meignaud, -
|
||||||
|
|
||||||
DD3_GVL - Duel Decks Anthology‚ Garruk vs. Liliana (2014-12-05)
|
DD3_GVL - Duel Decks Anthology<EFBFBD> Garruk vs. Liliana (2014-12-05)
|
||||||
|
|
||||||
Beast, 008, G, 3|3, -, Creature - Beast, John Donahue, -
|
Beast, 008, G, 3|3, -, Creature - Beast, John Donahue, -
|
||||||
Beast, 009, G, 4|4, -, Creature - Beast, Steve Prescott, -
|
Beast, 009, G, 4|4, -, Creature - Beast, Steve Prescott, -
|
||||||
|
@ -650,14 +650,14 @@ Soldier, 003, W, 1|1, -, Creature - Soldier, Steve Prescott, -
|
||||||
Demon, 004, B, 5|5, -, Creature - Demon, Kev Walker, Flying
|
Demon, 004, B, 5|5, -, Creature - Demon, Kev Walker, Flying
|
||||||
Zombie, 005, B, 2|2, -, Creature - Zombie, Lucas Graciano, -
|
Zombie, 005, B, 2|2, -, Creature - Zombie, Lucas Graciano, -
|
||||||
Goblin, 006, R, 1|1, -, Creature - Goblin, Brandon Kitkouski, -
|
Goblin, 006, R, 1|1, -, Creature - Goblin, Brandon Kitkouski, -
|
||||||
Ashaya‚ the Awoken World, 007, G, 4|4, -, Legendary Creature - Elemental, Raymond Swanland, -
|
Ashaya<EFBFBD> the Awoken World, 007, G, 4|4, -, Legendary Creature - Elemental, Raymond Swanland, -
|
||||||
Elemental, 008, G, 2|2, -, Creature - Elemental, Marco Nelor, -
|
Elemental, 008, G, 2|2, -, Creature - Elemental, Marco Nelor, -
|
||||||
Elf Warrior, 009, G, 1|1, -, Creature - Elf Warrior, William O'Connor, -
|
Elf Warrior, 009, G, 1|1, -, Creature - Elf Warrior, William O'Connor, -
|
||||||
Thopter, 010, -, 1|1, -, Artifact Creature - Thopter, Adam Paquette, Flying
|
Thopter, 010, -, 1|1, -, Artifact Creature - Thopter, Adam Paquette, Flying
|
||||||
Thopter, 011, -, 1|1, -, Artifact Creature - Thopter, Svetlin Velinov, Flying
|
Thopter, 011, -, 1|1, -, Artifact Creature - Thopter, Svetlin Velinov, Flying
|
||||||
Jace Emblem, 012, -, -, -, Emblem - Jace, Jaime Jones, Whenever you cast a spell‚ target opponent puts the top five cards of his or her library into his or her graveyard.
|
Jace Emblem, 012, -, -, -, Emblem - Jace, Jaime Jones, Whenever you cast a spell<EFBFBD> target opponent puts the top five cards of his or her library into his or her graveyard.
|
||||||
Liliana Emblem, 013, -, -, -, Emblem - Liliana, Karla Ortiz, Whenever a creature dies‚ return it to the battlefield under your control at the beginning of the next end step.
|
Liliana Emblem, 013, -, -, -, Emblem - Liliana, Karla Ortiz, Whenever a creature dies<EFBFBD> return it to the battlefield under your control at the beginning of the next end step.
|
||||||
Chandra Emblem, 014, -, -, -, Emblem - Chandra, Eric Deschamps, At the beginning of your upkeep‚ this emblem deals 3 damage to you.
|
Chandra Emblem, 014, -, -, -, Emblem - Chandra, Eric Deschamps, At the beginning of your upkeep<EFBFBD> this emblem deals 3 damage to you.
|
||||||
|
|
||||||
DDP - Duel Decks: Zendikar vs. Eldrazi (2015-08-28)
|
DDP - Duel Decks: Zendikar vs. Eldrazi (2015-08-28)
|
||||||
|
|
||||||
|
@ -678,7 +678,7 @@ Kor Ally, 006, W, 1|1, -, Creature - Kor Ally, Jeremy Wilson, -
|
||||||
Octopus, 007, U, 8|8, -, Creature - Octopus, Craig J Spearing, -
|
Octopus, 007, U, 8|8, -, Creature - Octopus, Craig J Spearing, -
|
||||||
Dragon, 008, R, 5|5, -, Creature - Dragon, Raymond Swanland, Flying
|
Dragon, 008, R, 5|5, -, Creature - Dragon, Raymond Swanland, Flying
|
||||||
Plant, 009, G, 1|1, -, Creature - Plant, Sam Burley, -
|
Plant, 009, G, 1|1, -, Creature - Plant, Sam Burley, -
|
||||||
Elemental, 009, R, 3|1, -, Creature - Elemental, Victor Adame Minguez, Trample‚ Haste
|
Elemental, 009, R, 3|1, -, Creature - Elemental, Victor Adame Minguez, Trample<EFBFBD> Haste
|
||||||
Elemental, 011, G R, 5|5, -, Creature - Elemental, Brad Rigney, -
|
Elemental, 011, G R, 5|5, -, Creature - Elemental, Brad Rigney, -
|
||||||
Gideon Emblem, 012, -, -, -, Emblem - Gideon, Eric Deschamps, -
|
Gideon Emblem, 012, -, -, -, Emblem - Gideon, Eric Deschamps, -
|
||||||
Nixilis Emblem, 013, -, -, -, Emblem - Nixilis, Chris Rahn, -
|
Nixilis Emblem, 013, -, -, -, Emblem - Nixilis, Chris Rahn, -
|
||||||
|
@ -696,7 +696,7 @@ Germ, 007, B, -, -, Creature - Germ, Igor Kieryluk, -
|
||||||
Zombie, 008, B, 2|2, -, Creature - Zombie, Lucas Graciano, -
|
Zombie, 008, B, 2|2, -, Creature - Zombie, Lucas Graciano, -
|
||||||
Dragon, 009, R, 5|5, -, Creature - Dragon, Jim Pavelec, Flying
|
Dragon, 009, R, 5|5, -, Creature - Dragon, Jim Pavelec, Flying
|
||||||
Elemental Shaman, 010, R, 3|1, -, Creature - Elemental Shaman, Jim Pavelec, -
|
Elemental Shaman, 010, R, 3|1, -, Creature - Elemental Shaman, Jim Pavelec, -
|
||||||
Lightning Rager, 011, R, 5|1, -, Creature - Elemental, Svetlin Velinov, Trample‚ Haste At the beginning of your end step‚ sacrifice this creature.
|
Lightning Ranger, 011, R, 5|1, -, Creature - Elemental, Svetlin Velinov, Trample<EFBFBD> Haste At the beginning of your end step<65> sacrifice this creature.
|
||||||
Bear, 012, G, 2|2, -, Creature - Bear, Heather Hudson, -
|
Bear, 012, G, 2|2, -, Creature - Bear, Heather Hudson, -
|
||||||
Beast, 013, G, 4|4, -, Creature - Beast, Svetlin Velinov, -
|
Beast, 013, G, 4|4, -, Creature - Beast, Svetlin Velinov, -
|
||||||
Elephant, 014, G, 3|3, -, Creature - Elephant, Lars Grant-West, -
|
Elephant, 014, G, 3|3, -, Creature - Elephant, Lars Grant-West, -
|
||||||
|
@ -708,5 +708,40 @@ Wolf, 019, G, 2|2, -, Creature - Wolf, David Palumbo, -
|
||||||
Elemental, 020, U R, 5|5, -, Creature - Elemental, Randy Gallegos, Flying
|
Elemental, 020, U R, 5|5, -, Creature - Elemental, Randy Gallegos, Flying
|
||||||
Snake, 021, G U, 1|1, -, Creature - Snake, Christopher Moeller, -
|
Snake, 021, G U, 1|1, -, Creature - Snake, Christopher Moeller, -
|
||||||
Spirit, 022, W B, 1|1, -, Creature - Spirit, Cliff Childs, Flying
|
Spirit, 022, W B, 1|1, -, Creature - Spirit, Cliff Childs, Flying
|
||||||
Spirit, 023, -, *|*, -, Enchantment Creature - Spirit, Adam Paquette, This creature's power and toughness are each equal to the number of experience counters you have.
|
Spirit, 023, W B, *|*, -, Enchantment Creature - Spirit, Adam Paquette, This creature's power and toughness are each equal to the number of experience counters you have.
|
||||||
Gold, 024, -, -, -, Artifact, Richard Wright, Sacrifice this artifact: Add one mana of any color to your mana pool.
|
Gold, 024, -, -, -, Artifact, Richard Wright, Sacrifice this artifact: Add one mana of any color to your mana pool.
|
||||||
|
|
||||||
|
OGW - Oath of the Gatewatch (2016-01-22)
|
||||||
|
|
||||||
|
Eldrazi Scion, 001, -, 1|1, -, Creature - Eldrazi Scion, Izzy, Sacrifice this creature: Add {1} to your mana pool.
|
||||||
|
Eldrazi Scion, 002, -, 1|1, -, Creature - Eldrazi Scion, Craig J Spearing, Sacrifice this creature: Add {1} to your mana pool.
|
||||||
|
Eldrazi Scion, 003, -, 1|1, -, Creature - Eldrazi Scion, Svetlin Velinov, Sacrifice this creature: Add {1} to your mana pool.
|
||||||
|
Eldrazi Scion, 004, -, 1|1, -, Creature - Eldrazi Scion, Izzy, Sacrifice this creature: Add {1} to your mana pool.
|
||||||
|
Eldrazi Scion, 005, -, 1|1, -, Creature - Eldrazi Scion, Winona Nelson, Sacrifice this creature: Add {1} to your mana pool.
|
||||||
|
Eldrazi Scion, 006, -, 1|1, -, Creature - Eldrazi Scion, Svetlin Velinov, Sacrifice this creature: Add {1} to your mana pool.
|
||||||
|
Angel, 007, W, 3|3, -, Creature - Angel, Anastasia Ovchinnikova, Flying
|
||||||
|
Zombie, 008, B, 2|2, -, Creature - Zombie, Kev Walker, -
|
||||||
|
Elemental, 009, R, 3|1, -, Creature - Elemental, Raymond Swanland, -
|
||||||
|
Elemental, 010, G, *|*, -, Creature - Elemental, Vincent Proce, -
|
||||||
|
Plant, 011, G, -, -, Creature - Plant, Daren Bader, -
|
||||||
|
|
||||||
|
SOI - Shadows over Innistrad (2016-04-08)
|
||||||
|
|
||||||
|
Angel, 001, W, 4|4, -, Creature - Angel, Magali Villeneuve, Flying
|
||||||
|
Human Soldier, 002, W, 1|1, -, Creature - Human Soldier, Deruchenko Alexander, -
|
||||||
|
Spirit, 003, W, 1|1, -, Creature - Spirit, Jason A. Engle, Flying
|
||||||
|
Vampire Knight, 004, B, 1|1, -, Creature - Vampire Knight, Deruchenko Alexander, Lifelink
|
||||||
|
Zombie, 005, B, 2|2, -, Creature - Zombie, Craig J Spearing, -
|
||||||
|
Devil, 006, R, 1|1, -, Creature - Devil, Wayne England, When this creature dies<65> it deals 1 damage to target creature or player.
|
||||||
|
Insect, 007, G, 1|1, -, Creature - Insect, Christopher Moeller, -
|
||||||
|
Ooze, 008, G, 3|3, -, Creature - Ooze, Nils Hamm, -
|
||||||
|
Wolf, 009, G, 2|2, -, Creature - Wolf, Aaron Miller, -
|
||||||
|
Human Cleric, 010, W B, 1|1, -, Creature - Human Cleric, Min Yum, -
|
||||||
|
Clue, 011, -, -, -, Artifact - Clue, John Avon, {2}‚ Sacrifice this Artifact: Draw a card.
|
||||||
|
Clue, 012, -, -, -, Artifact - Clue, Noah Bradley, {2}‚ Sacrifice this Artifact: Draw a card.
|
||||||
|
Clue, 013, -, -, -, Artifact - Clue, Zezhou Chen, {2}‚ Sacrifice this Artifact: Draw a card.
|
||||||
|
Clue, 014, -, -, -, Artifact - Clue, Cliff Childs, {2}‚ Sacrifice this Artifact: Draw a card.
|
||||||
|
Clue, 015, -, -, -, Artifact - Clue, James Paick, {2}‚ Sacrifice this Artifact: Draw a card.
|
||||||
|
Clue, 016, -, -, -, Artifact - Clue, Franz Vohwinkel, {2}‚ Sacrifice this Artifact: Draw a card.
|
||||||
|
Jace Emblem, 017, -, -, -, Emblem - Jace, Tyler Jacobson, Whenever an opponent casts his or her first spell each turn<72> counter that spell.
|
||||||
|
Arlinn Emblem, 018, -, -, -, Emblem - Arlinn, Winona Nelson, Creatures you control have haste and '{T}: This creature deals damage equal to its power to target creature or player.'
|
||||||
|
|
Can't render this file because it contains an unexpected character in line 549 and column 140.
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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,18 +138,8 @@ 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());
|
|
||||||
if (sourceCard != null) {
|
|
||||||
if (!sourceCard.getCardType().contains(CardType.PLANESWALKER)) {
|
|
||||||
if (sourceCard.getSecondCardFace() != null) {
|
|
||||||
sourceCard = sourceCard.getSecondCardFace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
commandList.add(new EmblemView(emblem, sourceCard));
|
|
||||||
} else {
|
|
||||||
commandList.add(new EmblemView(emblem));
|
commandList.add(new EmblemView(emblem));
|
||||||
}
|
}
|
||||||
}
|
|
||||||
} else if (commandObject instanceof Commander) {
|
} else if (commandObject instanceof Commander) {
|
||||||
Commander commander = (Commander) commandObject;
|
Commander commander = (Commander) commandObject;
|
||||||
if (commander.getControllerId().equals(this.playerId)) {
|
if (commander.getControllerId().equals(this.playerId)) {
|
||||||
|
|
|
@ -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());
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -77,7 +77,7 @@ class AborothCost 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(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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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");
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -165,7 +165,7 @@ class AurraSingBaneOfJediEmblem extends Emblem {
|
||||||
|
|
||||||
// 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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -45,8 +45,7 @@ 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));
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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++;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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));
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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) {
|
||||||
|
@ -116,7 +107,7 @@ 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) {
|
||||||
|
@ -142,29 +133,35 @@ class BecomeSwampEffect extends BecomesBasicLandTargetEffect {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
||||||
|
DelayedTriggeredAbility ability = new AtTheBeginOfYourNextUpkeepDelayedTriggeredAbility(new CyclopeanTombEffect(), Duration.EndOfGame, false);
|
||||||
|
ability.setSourceObject(tomb, game);
|
||||||
|
ability.setControllerId(source.getControllerId());
|
||||||
|
ability.setSourceId(source.getSourceId());
|
||||||
|
game.addDelayedTriggeredAbility(ability);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
@Override
|
|
||||||
public boolean checkTrigger(GameEvent event, Game game) {
|
|
||||||
return event.getPlayerId().equals(this.controllerId);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -172,7 +169,7 @@ 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) {
|
||||||
|
@ -187,113 +184,44 @@ 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);
|
CyclopeanTombCounterWatcher watcher = (CyclopeanTombCounterWatcher) game.getState().getWatchers().get(CyclopeanTombCounterWatcher.class.getName());
|
||||||
Effect effect = new RemoveAllCountersTargetEffect(CounterType.MIRE);
|
if (controller != null && watcher != null) {
|
||||||
effect.setTargetPointer(new FixedTarget((UUID) game.getState().getValue(source.getSourceId().toString() + "_land")));
|
|
||||||
effect.apply(game, source);
|
Set<MageObjectReference> landRef = watcher.landMiredByCyclopeanTombInstance(mor, game);
|
||||||
//CyclopianTombEffect and CyclopeanTombDelayedTriggeredAbility will maintain a loop
|
if (landRef == null || landRef.isEmpty()) { // no lands got mire counter from that instance
|
||||||
//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 true;
|
||||||
}
|
}
|
||||||
return false;
|
FilterLandPermanent filter = new FilterLandPermanent("a land with a mire counter added from the Cyclopean Tomb instance (" + landRef.size() + " left)");
|
||||||
|
Set<PermanentIdPredicate> idPref = new HashSet<>();
|
||||||
|
for (MageObjectReference ref : landRef) {
|
||||||
|
Permanent land = ref.getPermanent(game);
|
||||||
|
if (land != null) {
|
||||||
|
idPref.add(new PermanentIdPredicate(land.getId()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
filter.add(Predicates.or(idPref));
|
||||||
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());
|
|
||||||
|
|
||||||
for(Permanent land : permanents) {
|
|
||||||
if(watcher.landMiredByCyclopeanTombInstance(land, cyclopeanTombInstance, game)) {
|
|
||||||
return land.getCounters(game).getCount(CounterType.MIRE) > 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class ChooseLandEffect extends OneShotEffect {
|
|
||||||
|
|
||||||
public ChooseLandEffect() {
|
|
||||||
super(Outcome.Neutral);
|
|
||||||
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<>();
|
||||||
|
@ -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);
|
||||||
miredLands.add(new MageObjectReference(event.getTargetId(), game));
|
Set<MageObjectReference> miredLands;
|
||||||
|
if (counterData.containsKey(cylopeanTombInstance)) {
|
||||||
|
miredLands = counterData.get(cylopeanTombInstance);
|
||||||
} else {
|
} else {
|
||||||
miredLands = new HashSet<>();
|
miredLands = new HashSet<>();
|
||||||
miredLands.add(new MageObjectReference(event.getTargetId(), game));
|
|
||||||
counterData.put(cylopeanTombInstance, miredLands);
|
counterData.put(cylopeanTombInstance, miredLands);
|
||||||
}
|
}
|
||||||
|
miredLands.add(new MageObjectReference(event.getTargetId(), game));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -45,11 +46,8 @@ 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());
|
||||||
|
if (controller != null) {
|
||||||
|
int lifeLost = 0;
|
||||||
int xValue = source.getManaCostsToPay().getX();
|
int xValue = source.getManaCostsToPay().getX();
|
||||||
for (UUID opponentId : game.getOpponents(source.getControllerId())) {
|
for (UUID opponentId : game.getOpponents(source.getControllerId())) {
|
||||||
damage += game.getPlayer(opponentId).damage(xValue * 2, source.getSourceId(), game, false, true);
|
Player opponent = game.getPlayer(opponentId);
|
||||||
|
if (opponent != null) {
|
||||||
|
lifeLost += opponent.loseLife(xValue * 2, game, false);
|
||||||
}
|
}
|
||||||
game.getPlayer(source.getControllerId()).gainLife(damage, game);
|
}
|
||||||
|
controller.gainLife(lifeLost, game);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -129,7 +129,7 @@ class DovinBaanCantActivateAbilitiesEffect extends ContinuousRuleModifyingEffect
|
||||||
class DovinBaanEmblem extends Emblem {
|
class DovinBaanEmblem extends Emblem {
|
||||||
|
|
||||||
DovinBaanEmblem() {
|
DovinBaanEmblem() {
|
||||||
this.setName("EMBLEM: Dovin Baan");
|
this.setName("Emblem Dovin");
|
||||||
Ability ability = new SimpleStaticAbility(Zone.COMMAND, new DovinBaanCantUntapEffect());
|
Ability ability = new SimpleStaticAbility(Zone.COMMAND, new DovinBaanCantUntapEffect());
|
||||||
this.getAbilities().add(ability);
|
this.getAbilities().add(ability);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,7 +52,7 @@ import mage.players.Player;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author Gal Lerman
|
* @author Gal Lerman
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
public class DustOfMoments extends CardImpl {
|
public class DustOfMoments extends CardImpl {
|
||||||
|
|
||||||
|
@ -78,7 +77,6 @@ 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: 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 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: This is the reason i've copy pasted some logic in DustOfMomentsEffect
|
||||||
|
@ -112,24 +110,24 @@ public class DustOfMoments extends CardImpl {
|
||||||
Player controller = game.getPlayer(source.getControllerId());
|
Player controller = game.getPlayer(source.getControllerId());
|
||||||
MageObject sourceObject = game.getObject(source.getSourceId());
|
MageObject sourceObject = game.getObject(source.getSourceId());
|
||||||
if (controller != null && sourceObject != null) {
|
if (controller != null && sourceObject != null) {
|
||||||
updatePermanents(game, controller, sourceObject);
|
updatePermanents(source, game, controller, sourceObject);
|
||||||
updateSuspended(game, controller, sourceObject);
|
updateSuspended(source, game, controller, sourceObject);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateSuspended(final Game game, final Player controller, final MageObject sourceObject) {
|
private void updateSuspended(final Ability source, final Game game, final Player controller, final MageObject sourceObject) {
|
||||||
final List<Card> exiledCards = game.getExile().getAllCards(game);
|
final List<Card> exiledCards = game.getExile().getAllCards(game);
|
||||||
execute(game, controller, sourceObject, exiledCards);
|
execute(source, game, controller, sourceObject, exiledCards);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updatePermanents(final Game game, final Player controller, final MageObject sourceObject) {
|
private void updatePermanents(final Ability source, final Game game, final Player controller, final MageObject sourceObject) {
|
||||||
List<Permanent> permanents = game.getBattlefield().getAllActivePermanents();
|
List<Permanent> permanents = game.getBattlefield().getAllActivePermanents();
|
||||||
executeP(game, controller, sourceObject, permanents);
|
executeP(source, game, controller, sourceObject, permanents);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void executeP(final Game game, final Player controller, final MageObject sourceObject, final List<Permanent> cards) {
|
private void executeP(final Ability source, final Game game, final Player controller, final MageObject sourceObject, final List<Permanent> cards) {
|
||||||
if (cards == null || cards.isEmpty()) {
|
if (cards == null || cards.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -142,9 +140,9 @@ public class DustOfMoments extends CardImpl {
|
||||||
final Counter modifiedCounter = new Counter(counterName, countersToRemove);
|
final Counter modifiedCounter = new Counter(counterName, countersToRemove);
|
||||||
card.removeCounters(modifiedCounter, game);
|
card.removeCounters(modifiedCounter, game);
|
||||||
} else {
|
} else {
|
||||||
card.addCounters(counter, game);
|
card.addCounters(counter, source, game);
|
||||||
}
|
}
|
||||||
if (!game.isSimulation())
|
if (!game.isSimulation()) {
|
||||||
game.informPlayers(new StringBuilder(sourceObject.getName()).append(": ")
|
game.informPlayers(new StringBuilder(sourceObject.getName()).append(": ")
|
||||||
.append(controller.getLogName()).append(getActionStr()).append("s")
|
.append(controller.getLogName()).append(getActionStr()).append("s")
|
||||||
.append(counter.getCount()).append(" ").append(counterName.toLowerCase())
|
.append(counter.getCount()).append(" ").append(counterName.toLowerCase())
|
||||||
|
@ -152,8 +150,9 @@ public class DustOfMoments extends CardImpl {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void execute(final Game game, final Player controller, final MageObject sourceObject, final List<Card> cards) {
|
private void execute(final Ability source, final Game game, final Player controller, final MageObject sourceObject, final List<Card> cards) {
|
||||||
if (cards == null || cards.isEmpty()) {
|
if (cards == null || cards.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -166,9 +165,9 @@ public class DustOfMoments extends CardImpl {
|
||||||
final Counter modifiedCounter = new Counter(counterName, countersToRemove);
|
final Counter modifiedCounter = new Counter(counterName, countersToRemove);
|
||||||
card.removeCounters(modifiedCounter, game);
|
card.removeCounters(modifiedCounter, game);
|
||||||
} else {
|
} else {
|
||||||
card.addCounters(counter, game);
|
card.addCounters(counter, source, game);
|
||||||
}
|
}
|
||||||
if (!game.isSimulation())
|
if (!game.isSimulation()) {
|
||||||
game.informPlayers(new StringBuilder(sourceObject.getName()).append(": ")
|
game.informPlayers(new StringBuilder(sourceObject.getName()).append(": ")
|
||||||
.append(controller.getLogName()).append(getActionStr()).append("s ")
|
.append(controller.getLogName()).append(getActionStr()).append("s ")
|
||||||
.append(counter.getCount()).append(" ").append(counterName.toLowerCase())
|
.append(counter.getCount()).append(" ").append(counterName.toLowerCase())
|
||||||
|
@ -176,6 +175,7 @@ public class DustOfMoments extends CardImpl {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected abstract boolean shouldRemoveCounters();
|
protected abstract boolean shouldRemoveCounters();
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -44,11 +44,10 @@ public class EnlistedWurm extends CardImpl {
|
||||||
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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -100,11 +100,11 @@ class FulfillContractEffect extends OneShotEffect {
|
||||||
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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -105,12 +105,13 @@ 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) {
|
||||||
|
Permanent sourceObject = game.getPermanent(source.getSourceId());
|
||||||
|
if (sourceObject != null) {
|
||||||
if (targetPointer.getFirst(game, source) != null) {
|
if (targetPointer.getFirst(game, source) != null) {
|
||||||
targetPermanent = game.getPermanent(targetPointer.getFirst(game, source));
|
Permanent targetPermanent = game.getPermanent(targetPointer.getFirst(game, source));
|
||||||
if (targetPermanent != null) {
|
if (targetPermanent != null) {
|
||||||
ContinuousEffect effect = new ExchangeControlTargetEffect(Duration.EndOfGame, "", true);
|
ContinuousEffect effect = new ExchangeControlTargetEffect(Duration.EndOfGame, "", true);
|
||||||
effect.setTargetPointer(targetPointer);
|
effect.setTargetPointer(targetPointer);
|
||||||
|
@ -119,6 +120,7 @@ class GildedDrakeEffect extends OneShotEffect {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sourceObject.sacrifice(source.getSourceId(), game);
|
sourceObject.sacrifice(source.getSourceId(), game);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
159
Mage.Sets/src/mage/cards/h/HallOfGemstone.java
Normal file
159
Mage.Sets/src/mage/cards/h/HallOfGemstone.java
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
134
Mage.Sets/src/mage/cards/h/HarshJudgment.java
Executable file
134
Mage.Sets/src/mage/cards/h/HarshJudgment.java
Executable 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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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;
|
||||||
|
|
|
@ -103,7 +103,7 @@ class ImmaculateMagistrateEffect extends OneShotEffect {
|
||||||
if (permanent != null) {
|
if (permanent != null) {
|
||||||
int count = game.getBattlefield().count(filter, source.getSourceId(), source.getControllerId(), game);
|
int count = game.getBattlefield().count(filter, source.getSourceId(), source.getControllerId(), game);
|
||||||
if (count > 0) {
|
if (count > 0) {
|
||||||
permanent.addCounters(CounterType.P1P1.createInstance(count), game);
|
permanent.addCounters(CounterType.P1P1.createInstance(count), source, game);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue