diff --git a/Mage.Client/pom.xml b/Mage.Client/pom.xml
index 04b1642260a..0e554376ec4 100644
--- a/Mage.Client/pom.xml
+++ b/Mage.Client/pom.xml
@@ -6,7 +6,7 @@
org.mage
mage-root
- 1.4.3
+ 1.4.4
org.mage
diff --git a/Mage.Client/src/main/java/mage/client/deck/generator/DeckGenerator.java b/Mage.Client/src/main/java/mage/client/deck/generator/DeckGenerator.java
index 2a7d8570191..2982c97a126 100644
--- a/Mage.Client/src/main/java/mage/client/deck/generator/DeckGenerator.java
+++ b/Mage.Client/src/main/java/mage/client/deck/generator/DeckGenerator.java
@@ -396,7 +396,8 @@ public class DeckGenerator {
private static Card getBasicLand(ColoredManaSymbol color, Map> basicLands) {
Random random = new Random();
String landName = DeckGeneratorPool.getBasicLandName(color.toString());
- return basicLands.get(landName).get(random.nextInt(basicLands.size() - 1)).getMockCard().copy();
+ List basicLandsInfo = basicLands.get(landName);
+ return basicLandsInfo.get(random.nextInt(basicLandsInfo.size() - 1)).getMockCard().copy();
}
diff --git a/Mage.Client/src/main/java/mage/client/deck/generator/DeckGeneratorPool.java b/Mage.Client/src/main/java/mage/client/deck/generator/DeckGeneratorPool.java
index d45838990ee..3e92fef086e 100644
--- a/Mage.Client/src/main/java/mage/client/deck/generator/DeckGeneratorPool.java
+++ b/Mage.Client/src/main/java/mage/client/deck/generator/DeckGeneratorPool.java
@@ -385,6 +385,12 @@ public class DeckGeneratorPool
if(spellSize < nonLandSize) {
int spellsNeeded = nonLandSize-spellSize;
+
+ // If we haven't got enough spells in reserve to fulfil the amount we need, we can't continue.
+ if(reserveSpells.size() < spellsNeeded) {
+ throw new IllegalStateException("Not enough cards found to generate deck. Please try again");
+ }
+
List spellsToAdd = new ArrayList<>(spellsNeeded);
// Initial reservoir
@@ -401,7 +407,6 @@ public class DeckGeneratorPool
// Add randomly selected spells needed
deckCards.addAll(spellsToAdd);
}
-
// More spells than needed
else if(spellSize > (deckSize - landCount)) {
@@ -410,8 +415,11 @@ public class DeckGeneratorPool
deckCards.remove(random.nextInt(deckCards.size()));
}
}
- if(deckCards.size() != nonLandSize)
+
+ // Not strictly necessary as we check when adding cards, but worth double checking anyway.
+ if(deckCards.size() != nonLandSize) {
throw new IllegalStateException("Not enough cards found to generate deck. Please try again");
+ }
// Return the fixed amount
return deckCards;
diff --git a/Mage.Client/src/main/java/mage/client/dialog/ConnectDialog.java b/Mage.Client/src/main/java/mage/client/dialog/ConnectDialog.java
index 70c2d76a4e4..0866497c431 100644
--- a/Mage.Client/src/main/java/mage/client/dialog/ConnectDialog.java
+++ b/Mage.Client/src/main/java/mage/client/dialog/ConnectDialog.java
@@ -31,16 +31,9 @@
*
* Created on 20-Jan-2010, 9:37:07 PM
*/
-
package mage.client.dialog;
-import mage.client.MageFrame;
-import mage.client.util.Config;
-import mage.remote.Connection;
-import org.apache.log4j.Logger;
-
-import javax.swing.*;
-import java.awt.*;
+import java.awt.Cursor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
@@ -63,10 +56,17 @@ import java.util.concurrent.CancellationException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
+import javax.swing.JOptionPane;
+import javax.swing.SwingWorker;
+import mage.client.MageFrame;
+import static mage.client.dialog.PreferencesDialog.KEY_CONNECTION_URL_SERVER_LIST;
import static mage.client.dialog.PreferencesDialog.KEY_CONNECT_AUTO_CONNECT;
import static mage.client.dialog.PreferencesDialog.KEY_CONNECT_FLAG;
+import mage.client.util.Config;
import mage.client.util.gui.countryBox.CountryItemEditor;
+import mage.remote.Connection;
import mage.remote.Connection.ProxyType;
+import org.apache.log4j.Logger;
/**
* @author BetaSteward_at_googlemail.com
@@ -125,10 +125,9 @@ public class ConnectDialog extends MageDialog {
}
/**
- * This method is called from within the constructor to
- * initialize the form.
- * WARNING: Do NOT modify this code. The content of this method is
- * always regenerated by the Form Editor.
+ * This method is called from within the constructor to initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is always
+ * regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// //GEN-BEGIN:initComponents
@@ -414,7 +413,6 @@ public class ConnectDialog extends MageDialog {
this.hideDialog();
}
-
private void keyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_keyTyped
char c = evt.getKeyChar();
if (!Character.isDigit(c)) {
@@ -430,9 +428,13 @@ public class ConnectDialog extends MageDialog {
private void findPublicServerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
BufferedReader in = null;
try {
+ String serverUrl = PreferencesDialog.getCachedValue(KEY_CONNECTION_URL_SERVER_LIST, "http://xmage.de/files/server-list.txt");
+ if (serverUrl.contains("xmage.info/files/")) {
+ serverUrl = serverUrl.replace("xmage.info/files/", "xmage.de/files/"); // replace old URL if still saved
+ PreferencesDialog.saveValue(KEY_CONNECTION_URL_SERVER_LIST, serverUrl);
+ }
+ URL serverListURL = new URL(serverUrl);
- URL serverListURL = new URL(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_CONNECTION_URL_SERVER_LIST, "http://xmage.de/files/server-list.txt"));
-
Connection.ProxyType configProxyType = Connection.ProxyType.valueByText(PreferencesDialog.getCachedValue(PreferencesDialog.KEY_PROXY_TYPE, "None"));
Proxy p = null;
Proxy.Type type = Proxy.Type.DIRECT;
@@ -541,7 +543,6 @@ public class ConnectDialog extends MageDialog {
// TODO add your handling code here:
}//GEN-LAST:event_chkForceUpdateDBActionPerformed
-
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btnCancel;
private javax.swing.JButton btnConnect;
diff --git a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.form b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.form
index afaf19627ed..b15bbcdd6aa 100644
--- a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.form
+++ b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.form
@@ -82,8 +82,8 @@
-
-
+
+
@@ -159,7 +159,7 @@
-
+
@@ -173,7 +173,7 @@
-
+
@@ -231,7 +231,7 @@
-
+
@@ -381,8 +381,8 @@
-
-
+
+
@@ -528,8 +528,8 @@
-
-
+
+
@@ -537,7 +537,7 @@
-
+
@@ -628,7 +628,7 @@
-
+
@@ -675,6 +675,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java
index 625866f9ce2..48cad49da1e 100644
--- a/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java
+++ b/Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java
@@ -135,6 +135,9 @@ public class PreferencesDialog extends javax.swing.JDialog {
public static final String KEY_STOP_BLOCK = "stopDeclareBlockersStep";
public static final String KEY_STOP_ALL_MAIN_PHASES = "stopOnAllMainPhases";
public static final String KEY_STOP_ALL_END_PHASES = "stopOnAllEndPhases";
+ public static final String KEY_PASS_PRIORITY_CAST = "passPriorityCast";
+ public static final String KEY_PASS_PRIORITY_ACTIVATION = "passPriorityActivation";
+ public static final String KEY_AUTO_ORDER_TRIGGER = "autoOrderTrigger";
// mana auto payment
public static final String KEY_GAME_MANA_AUTOPAYMENT = "gameManaAutopayment";
@@ -394,6 +397,9 @@ public class PreferencesDialog extends javax.swing.JDialog {
cbStopBlock = new javax.swing.JCheckBox();
cbStopOnAllMain = new javax.swing.JCheckBox();
cbStopOnAllEnd = new javax.swing.JCheckBox();
+ cbPassPriorityCast = new javax.swing.JCheckBox();
+ cbPassPriorityActivation = new javax.swing.JCheckBox();
+ cbAutoOrderTrigger = new javax.swing.JCheckBox();
tabImages = new javax.swing.JPanel();
panelCardImages = new javax.swing.JPanel();
cbUseDefaultImageFolder = new javax.swing.JCheckBox();
@@ -629,7 +635,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
.addComponent(cbConfirmEmptyManaPool)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(cbAskMoveToGraveOrder)
- .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ .addContainerGap())
);
nonLandPermanentsInOnePile.getAccessibleContext().setAccessibleName("nonLandPermanentsInOnePile");
@@ -691,8 +697,8 @@ public class PreferencesDialog extends javax.swing.JDialog {
.addContainerGap()
.addComponent(main_card, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(main_game, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(main_game, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(main_gamelog, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
);
@@ -701,7 +707,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
tabsPanel.addTab("Main", tabMain);
- jLabelHeadLine.setText("Choose phases your game will stop on:");
+ jLabelHeadLine.setText("Choose phases your game will stop on if not skipped by a skip action (e.g. F6):");
jLabelYourTurn.setText("Your turn");
@@ -722,7 +728,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
jLabelEndOfTurn.setText("End of turn:");
phases_stopSettings.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Stop settings"));
- phases_stopSettings.setLayout(new java.awt.GridLayout(4, 1));
+ phases_stopSettings.setLayout(new java.awt.GridLayout(7, 1));
cbStopAttack.setSelected(true);
cbStopAttack.setText("Stop on declare attackers step if you skip steps (F4/F5/F7) and attackers are available");
@@ -766,6 +772,39 @@ public class PreferencesDialog extends javax.swing.JDialog {
});
phases_stopSettings.add(cbStopOnAllEnd);
+ cbPassPriorityCast.setText("Pass priority automatically after you have put a spell on the stack");
+ cbPassPriorityCast.setToolTipText("If activated the system passes priority automatically for you if you have put a spell on the stack.");
+ cbPassPriorityCast.setActionCommand("");
+ cbPassPriorityCast.setPreferredSize(new java.awt.Dimension(300, 25));
+ cbPassPriorityCast.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ cbPassPriorityCastActionPerformed(evt);
+ }
+ });
+ phases_stopSettings.add(cbPassPriorityCast);
+
+ cbPassPriorityActivation.setText("Pass priority automatically after you have put an activated ability on the stack");
+ cbPassPriorityActivation.setToolTipText("If activated the system passes priority for you automatically after you have put an activated ability on the stack.");
+ cbPassPriorityActivation.setActionCommand("");
+ cbPassPriorityActivation.setPreferredSize(new java.awt.Dimension(300, 25));
+ cbPassPriorityActivation.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ cbPassPriorityActivationActionPerformed(evt);
+ }
+ });
+ phases_stopSettings.add(cbPassPriorityActivation);
+
+ cbAutoOrderTrigger.setText("Set order for your triggers automatically if all have the same text");
+ cbAutoOrderTrigger.setToolTipText("If activated the order to put on the stack your triggers that trigger at the same time
\nis set automatically if all have the same text.");
+ cbAutoOrderTrigger.setActionCommand("");
+ cbAutoOrderTrigger.setPreferredSize(new java.awt.Dimension(300, 25));
+ cbAutoOrderTrigger.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ cbAutoOrderTriggerActionPerformed(evt);
+ }
+ });
+ phases_stopSettings.add(cbAutoOrderTrigger);
+
javax.swing.GroupLayout tabPhasesLayout = new javax.swing.GroupLayout(tabPhases);
tabPhases.setLayout(tabPhasesLayout);
tabPhasesLayout.setHorizontalGroup(
@@ -876,11 +915,11 @@ public class PreferencesDialog extends javax.swing.JDialog {
.addComponent(jLabelEndOfTurn)
.addComponent(checkBoxEndTurnOthers))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
- .addComponent(phases_stopSettings, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addContainerGap(45, Short.MAX_VALUE))
+ .addComponent(phases_stopSettings, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addContainerGap())
);
- tabsPanel.addTab("Phases", tabPhases);
+ tabsPanel.addTab("Phases & Priority", tabPhases);
panelCardImages.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Card images:"));
@@ -1699,7 +1738,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
save(prefs, dialog.cbGameLogAutoSave, KEY_GAME_LOG_AUTO_SAVE, "true", "false", UPDATE_CACHE_POLICY);
save(prefs, dialog.cbDraftLogAutoSave, KEY_DRAFT_LOG_AUTO_SAVE, "true", "false", UPDATE_CACHE_POLICY);
- // Phases
+ // Phases & Priority
save(prefs, dialog.checkBoxUpkeepYou, UPKEEP_YOU);
save(prefs, dialog.checkBoxDrawYou, DRAW_YOU);
save(prefs, dialog.checkBoxMainYou, MAIN_YOU);
@@ -1720,6 +1759,9 @@ public class PreferencesDialog extends javax.swing.JDialog {
save(prefs, dialog.cbStopBlock, KEY_STOP_BLOCK, "true", "false", UPDATE_CACHE_POLICY);
save(prefs, dialog.cbStopOnAllMain, KEY_STOP_ALL_MAIN_PHASES, "true", "false", UPDATE_CACHE_POLICY);
save(prefs, dialog.cbStopOnAllEnd, KEY_STOP_ALL_END_PHASES, "true", "false", UPDATE_CACHE_POLICY);
+ save(prefs, dialog.cbPassPriorityCast, KEY_PASS_PRIORITY_CAST, "true", "false", UPDATE_CACHE_POLICY);
+ save(prefs, dialog.cbPassPriorityActivation, KEY_PASS_PRIORITY_ACTIVATION, "true", "false", UPDATE_CACHE_POLICY);
+ save(prefs, dialog.cbAutoOrderTrigger, KEY_AUTO_ORDER_TRIGGER, "true", "false", UPDATE_CACHE_POLICY);
// images
save(prefs, dialog.cbUseDefaultImageFolder, KEY_CARD_IMAGES_USE_DEFAULT, "true", "false", UPDATE_CACHE_POLICY);
@@ -2022,6 +2064,18 @@ public class PreferencesDialog extends javax.swing.JDialog {
// TODO add your handling code here:
}//GEN-LAST:event_cbDraftLogAutoSaveActionPerformed
+ private void cbPassPriorityCastActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbPassPriorityCastActionPerformed
+ // TODO add your handling code here:
+ }//GEN-LAST:event_cbPassPriorityCastActionPerformed
+
+ private void cbPassPriorityActivationActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbPassPriorityActivationActionPerformed
+ // TODO add your handling code here:
+ }//GEN-LAST:event_cbPassPriorityActivationActionPerformed
+
+ private void cbAutoOrderTriggerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbAutoOrderTriggerActionPerformed
+ // TODO add your handling code here:
+ }//GEN-LAST:event_cbAutoOrderTriggerActionPerformed
+
private void showProxySettings() {
if (cbProxyType.getSelectedItem() == Connection.ProxyType.SOCKS) {
this.pnlProxy.setVisible(true);
@@ -2122,6 +2176,9 @@ public class PreferencesDialog extends javax.swing.JDialog {
load(prefs, dialog.cbStopBlock, KEY_STOP_BLOCK, "true", "true");
load(prefs, dialog.cbStopOnAllMain, KEY_STOP_ALL_MAIN_PHASES, "true", "false");
load(prefs, dialog.cbStopOnAllEnd, KEY_STOP_ALL_END_PHASES, "true", "false");
+ load(prefs, dialog.cbPassPriorityCast, KEY_PASS_PRIORITY_CAST, "true", "false");
+ load(prefs, dialog.cbPassPriorityActivation, KEY_PASS_PRIORITY_ACTIVATION, "true", "false");
+ load(prefs, dialog.cbAutoOrderTrigger, KEY_AUTO_ORDER_TRIGGER, "true", "true");
}
@@ -2456,7 +2513,10 @@ public class PreferencesDialog extends javax.swing.JDialog {
MageFrame.getPreferences().get(KEY_CONNECT_FLAG, "world"),
PreferencesDialog.getCachedValue(PreferencesDialog.KEY_GAME_ASK_MOVE_TO_GRAVE_ORDER, "true").equals("true"),
PreferencesDialog.getCachedValue(PreferencesDialog.KEY_GAME_MANA_AUTOPAYMENT, "true").equals("true"),
- PreferencesDialog.getCachedValue(PreferencesDialog.KEY_GAME_MANA_AUTOPAYMENT_ONLY_ONE, "true").equals("true")
+ PreferencesDialog.getCachedValue(PreferencesDialog.KEY_GAME_MANA_AUTOPAYMENT_ONLY_ONE, "true").equals("true"),
+ PreferencesDialog.getCachedValue(PreferencesDialog.KEY_PASS_PRIORITY_CAST, "true").equals("true"),
+ PreferencesDialog.getCachedValue(PreferencesDialog.KEY_PASS_PRIORITY_ACTIVATION, "true").equals("true"),
+ PreferencesDialog.getCachedValue(PreferencesDialog.KEY_AUTO_ORDER_TRIGGER, "true").equals("true")
);
}
@@ -2469,6 +2529,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
private javax.swing.JButton btnBrowseImageLocation;
private javax.swing.JCheckBox cbAllowRequestToShowHandCards;
private javax.swing.JCheckBox cbAskMoveToGraveOrder;
+ private javax.swing.JCheckBox cbAutoOrderTrigger;
private javax.swing.JCheckBox cbCheckForNewImages;
private javax.swing.JCheckBox cbConfirmEmptyManaPool;
private javax.swing.JCheckBox cbDraftLogAutoSave;
@@ -2478,6 +2539,8 @@ public class PreferencesDialog extends javax.swing.JDialog {
private javax.swing.JCheckBox cbEnableOtherSounds;
private javax.swing.JCheckBox cbEnableSkipButtonsSounds;
private javax.swing.JCheckBox cbGameLogAutoSave;
+ private javax.swing.JCheckBox cbPassPriorityActivation;
+ private javax.swing.JCheckBox cbPassPriorityCast;
private javax.swing.JComboBox cbPreferedImageLanguage;
private javax.swing.JComboBox cbProxyType;
private javax.swing.JCheckBox cbSaveToZipFiles;
diff --git a/Mage.Client/src/main/java/mage/client/game/FeedbackPanel.java b/Mage.Client/src/main/java/mage/client/game/FeedbackPanel.java
index 256c923a3aa..5c6410b3fac 100644
--- a/Mage.Client/src/main/java/mage/client/game/FeedbackPanel.java
+++ b/Mage.Client/src/main/java/mage/client/game/FeedbackPanel.java
@@ -47,7 +47,9 @@ import mage.client.components.MageTextArea;
import mage.client.dialog.MageDialog;
import mage.client.util.audio.AudioManager;
import mage.client.util.gui.ArrowBuilder;
-import mage.constants.Constants;
+import static mage.constants.Constants.Option.ORIGINAL_ID;
+import static mage.constants.Constants.Option.SECOND_MESSAGE;
+import static mage.constants.Constants.Option.SPECIAL_BUTTON;
import mage.constants.PlayerAction;
import org.apache.log4j.Logger;
@@ -82,64 +84,46 @@ public class FeedbackPanel extends javax.swing.JPanel {
public void init(UUID gameId) {
this.gameId = gameId;
+ helper.init(gameId);
}
public void getFeedback(FeedbackMode mode, String message, boolean special, Map options) {
-
- this.lblMessage.setText(message);
- this.helper.setMessage(message);
+ this.helper.setBasicMessage(message);
+ this.helper.setOriginalId(null); // reference to the feedback causing ability
+ String lblText = addAdditionalText(message, options);
+ this.helper.setTextArea(lblText);
+ this.lblMessage.setText(lblText);
this.mode = mode;
switch (this.mode) {
case INFORM:
- this.btnLeft.setVisible(false);
- this.btnRight.setVisible(false);
- this.helper.setState("", false, "", false);
+ setButtonState("", "", mode);
break;
case QUESTION:
- this.btnLeft.setVisible(true);
- this.btnLeft.setText("Yes");
- this.btnRight.setVisible(true);
- this.btnRight.setText("No");
- this.helper.setState("Yes", true, "No", true);
+ setButtonState("Yes", "No", mode);
+ if (options != null && options.containsKey(ORIGINAL_ID)) {
+ this.helper.setOriginalId((UUID) options.get(ORIGINAL_ID));
+ }
break;
case CONFIRM:
- this.btnLeft.setVisible(true);
- this.btnLeft.setText("OK");
- this.btnRight.setVisible(true);
- this.btnRight.setText("Cancel");
- this.helper.setState("Ok", true, "Cancel", true);
+ setButtonState("OK", "Cancel", mode);
break;
case CANCEL:
- this.btnLeft.setVisible(false);
- this.btnRight.setVisible(true);
- this.btnRight.setText("Cancel");
- this.helper.setState("", false, "Cancel", true);
+ setButtonState("", "Cancel", mode);
this.helper.setUndoEnabled(false);
break;
case SELECT:
- this.btnLeft.setVisible(false);
- this.btnRight.setVisible(true);
- this.btnRight.setText("Done");
- this.helper.setState("", false, "Done", true);
+ setButtonState("", "Done", mode);
break;
case END:
- this.btnLeft.setVisible(false);
- this.btnRight.setVisible(true);
- this.btnRight.setText("Close game");
- this.helper.setState("", false, "Close game", true);
+ setButtonState("", "Close game", mode);
ArrowBuilder.getBuilder().removeAllArrows(gameId);
endWithTimeout();
break;
}
- if (options != null && options.containsKey(Constants.Option.SPECIAL_BUTTON)) {
- String specialText = (String) options.get(Constants.Option.SPECIAL_BUTTON);
- this.btnSpecial.setVisible(true);
- this.btnSpecial.setText(specialText);
- this.helper.setSpecial(specialText, true);
+ if (options != null && options.containsKey(SPECIAL_BUTTON)) {
+ this.setSpecial((String) options.get(SPECIAL_BUTTON), true);
} else {
- this.btnSpecial.setVisible(special);
- this.btnSpecial.setText("Special");
- this.helper.setSpecial("Special", special);
+ this.setSpecial("Special", special);
}
requestFocusIfPossible();
@@ -152,6 +136,32 @@ public class FeedbackPanel extends javax.swing.JPanel {
this.helper.setVisible(true);
}
+ private void setButtonState(String leftText, String rightText, FeedbackMode mode) {
+ btnLeft.setVisible(!leftText.isEmpty());
+ btnLeft.setText(leftText);
+ btnRight.setVisible(!rightText.isEmpty());
+ btnRight.setText(rightText);
+ this.helper.setState(leftText, !leftText.isEmpty(), rightText, !rightText.isEmpty(), mode);
+ }
+
+ private String addAdditionalText(String message, Map options) {
+ if (options != null && options.containsKey(SECOND_MESSAGE)) {
+ return message + getSmallText((String) options.get(SECOND_MESSAGE));
+ } else {
+ return message;
+ }
+ }
+
+ protected String getSmallText(String text) {
+ return "" + text + "
";
+ }
+
+ private void setSpecial(String text, boolean visible) {
+ this.btnSpecial.setText(text);
+ this.btnSpecial.setVisible(visible);
+ this.helper.setSpecial(text, visible);
+ }
+
/**
* Close game window by pressing OK button after 8 seconds
*/
diff --git a/Mage.Client/src/main/java/mage/client/game/GamePanel.java b/Mage.Client/src/main/java/mage/client/game/GamePanel.java
index 6ef44ae48c4..8eec2f6acdb 100644
--- a/Mage.Client/src/main/java/mage/client/game/GamePanel.java
+++ b/Mage.Client/src/main/java/mage/client/game/GamePanel.java
@@ -1997,7 +1997,7 @@ public final class GamePanel extends javax.swing.JPanel {
}
}
if (event.getEventName().equals("action-consumed")) {
- dialog.hideDialog();
+ dialog.removeDialog();
}
}
};
@@ -2016,24 +2016,31 @@ public final class GamePanel extends javax.swing.JPanel {
switch (e.getActionCommand()) {
case CMD_AUTO_ORDER_FIRST:
MageFrame.getClient().sendPlayerAction(TRIGGER_AUTO_ORDER_ABILITY_FIRST, gameId, abilityId);
+ MageFrame.getClient().sendPlayerUUID(gameId, abilityId);
break;
case CMD_AUTO_ORDER_LAST:
MageFrame.getClient().sendPlayerAction(TRIGGER_AUTO_ORDER_ABILITY_LAST, gameId, abilityId);
+ MageFrame.getClient().sendPlayerUUID(gameId, null); // Don't use this but refresh the displayed abilities
break;
case CMD_AUTO_ORDER_NAME_FIRST:
if (abilityRuleText != null) {
MageFrame.getClient().sendPlayerAction(TRIGGER_AUTO_ORDER_NAME_FIRST, gameId, abilityRuleText);
+ MageFrame.getClient().sendPlayerUUID(gameId, abilityId);
}
break;
case CMD_AUTO_ORDER_NAME_LAST:
if (abilityRuleText != null) {
MageFrame.getClient().sendPlayerAction(TRIGGER_AUTO_ORDER_NAME_LAST, gameId, abilityRuleText);
+ MageFrame.getClient().sendPlayerUUID(gameId, null); // Don't use this but refresh the displayed abilities
}
break;
case CMD_AUTO_ORDER_RESET_ALL:
MageFrame.getClient().sendPlayerAction(TRIGGER_AUTO_ORDER_RESET_ALL, gameId, null);
break;
}
+ for (ShowCardsDialog dialog : pickTarget) {
+ dialog.removeDialog();
+ }
}
private void initPopupMenuTriggerOrder() {
diff --git a/Mage.Client/src/main/java/mage/client/game/HelperPanel.java b/Mage.Client/src/main/java/mage/client/game/HelperPanel.java
index 829493e0e1c..3d1d3199c27 100644
--- a/Mage.Client/src/main/java/mage/client/game/HelperPanel.java
+++ b/Mage.Client/src/main/java/mage/client/game/HelperPanel.java
@@ -28,17 +28,33 @@
package mage.client.game;
import java.awt.Color;
+import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridBagLayout;
+import java.awt.Point;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.util.UUID;
import javax.swing.BoxLayout;
import javax.swing.JButton;
+import javax.swing.JMenuItem;
import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities;
import javax.swing.ToolTipManager;
import javax.swing.UIManager;
+import mage.client.MageFrame;
import mage.client.components.MageTextArea;
+import mage.client.game.FeedbackPanel.FeedbackMode;
+import static mage.client.game.FeedbackPanel.FeedbackMode.QUESTION;
+import static mage.constants.PlayerAction.REQUEST_AUTO_ANSWER_ID_NO;
+import static mage.constants.PlayerAction.REQUEST_AUTO_ANSWER_ID_YES;
+import static mage.constants.PlayerAction.REQUEST_AUTO_ANSWER_RESET_ALL;
+import static mage.constants.PlayerAction.REQUEST_AUTO_ANSWER_TEXT_NO;
+import static mage.constants.PlayerAction.REQUEST_AUTO_ANSWER_TEXT_YES;
/**
* Panel with buttons that copy the state of feedback panel.
@@ -64,12 +80,32 @@ public class HelperPanel extends JPanel {
private final int defaultDismissTimeout = ToolTipManager.sharedInstance().getDismissDelay();
private final Object tooltipBackground = UIManager.get("info");
+ private static final String CMD_AUTO_ANSWER_ID_YES = "cmdAutoAnswerIdYes";
+ private static final String CMD_AUTO_ANSWER_ID_NO = "cmdAutoAnswerIdNo";
+ private static final String CMD_AUTO_ANSWER_NAME_YES = "cmdAutoAnswerNameYes";
+ private static final String CMD_AUTO_ANSWER_NAME_NO = "cmdAutoAnswerNameNo";
+ private static final String CMD_AUTO_ANSWER_RESET_ALL = "cmdAutoAnswerResetAll";
+
+ // popup menu for set automatic answers
+ private JPopupMenu popupMenuAskYes;
+ private JPopupMenu popupMenuAskNo;
+
+ // originalId of feedback causing ability
+ private UUID originalId;
+ private String message;
+
+ private UUID gameId;
+
public HelperPanel() {
initComponents();
}
- private void initComponents() {
+ public void init(UUID gameId) {
+ this.gameId = gameId;
+ }
+ private void initComponents() {
+ initPopupMenuTriggerOrder();
setBackground(new Color(0, 0, 0, 100));
//setLayout(new GridBagLayout());
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
@@ -108,72 +144,44 @@ public class HelperPanel extends JPanel {
btnUndo.setVisible(false);
container.add(btnUndo);
- btnLeft.addActionListener(new java.awt.event.ActionListener() {
+ MouseListener checkPopupAdapter = new MouseAdapter() {
+ @Override
+ public void mousePressed(MouseEvent me) {
+ checkPopupMenu(me);
+ }
+
+ @Override
+ public void mouseReleased(MouseEvent me) {
+ checkPopupMenu(me);
+ }
+
+ };
+
+ btnLeft.addMouseListener(checkPopupAdapter);
+ btnLeft.addActionListener(new ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
if (linkLeft != null) {
- {
- Thread worker = new Thread() {
- @Override
- public void run() {
- SwingUtilities.invokeLater(new Runnable() {
- @Override
- public void run() {
- setState("", false, "", false);
- setSpecial("", false);
- linkLeft.doClick();
- }
- });
- }
- };
- worker.start();
- }
+ clickButton(linkLeft);
}
}
});
- btnRight.addActionListener(new java.awt.event.ActionListener() {
+ btnRight.addMouseListener(checkPopupAdapter);
+ btnRight.addActionListener(new ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
if (linkRight != null) {
- Thread worker = new Thread() {
- @Override
- public void run() {
- SwingUtilities.invokeLater(new Runnable() {
- @Override
- public void run() {
- setState("", false, "", false);
- setSpecial("", false);
- linkRight.doClick();
- }
- });
- }
- };
- worker.start();
+ clickButton(linkRight);
}
}
});
- btnSpecial.addActionListener(new java.awt.event.ActionListener() {
+ btnSpecial.addActionListener(new ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
if (linkSpecial != null) {
- {
- Thread worker = new Thread() {
- @Override
- public void run() {
- SwingUtilities.invokeLater(new Runnable() {
- @Override
- public void run() {
- setState("", false, "", false);
- setSpecial("", false);
- linkSpecial.doClick();
- }
- });
- }
- };
- worker.start();
- }
+ clickButton(linkSpecial);
}
}
});
@@ -200,7 +208,7 @@ public class HelperPanel extends JPanel {
}
});
- // sets a darker background and higher simiss time fpr tooltip in the feedback / helper panel
+ // sets a darker background and higher simiss time fur tooltip in the feedback / helper panel
textArea.addMouseListener(new MouseAdapter() {
@Override
@@ -217,15 +225,50 @@ public class HelperPanel extends JPanel {
});
}
- public void setState(String txtLeft, boolean leftVisible, String txtRight, boolean rightVisible) {
+ private void checkPopupMenu(MouseEvent me) {
+ if (me.isPopupTrigger()
+ && originalId != null) { // only Yes/No requests from abilities can be automated
+ JButton source = (JButton) me.getSource();
+ if (source.getActionCommand().startsWith(QUESTION.toString())) {
+ showPopupMenu(me.getComponent(), source.getActionCommand());
+ me.consume();
+ }
+ }
+ }
+
+ private void clickButton(final JButton button) {
+ Thread worker = new Thread() {
+ @Override
+ public void run() {
+ SwingUtilities.invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ setState("", false, "", false, null);
+ setSpecial("", false);
+ button.doClick();
+ }
+ });
+ }
+ };
+ worker.start();
+ }
+
+ public void setState(String txtLeft, boolean leftVisible, String txtRight, boolean rightVisible, FeedbackMode mode) {
this.btnLeft.setVisible(leftVisible);
if (!txtLeft.isEmpty()) {
this.btnLeft.setText(txtLeft);
+ if (mode != null) {
+ this.btnLeft.setActionCommand(mode.toString() + txtLeft);
+ }
}
this.btnRight.setVisible(rightVisible);
if (!txtRight.isEmpty()) {
this.btnRight.setText(txtRight);
+ if (mode != null) {
+ this.btnRight.setActionCommand(mode.toString() + txtRight);
+ }
}
+
}
public void setSpecial(String txtSpecial, boolean specialVisible) {
@@ -251,25 +294,116 @@ public class HelperPanel extends JPanel {
this.linkUndo = undo;
}
- public void setMessage(String message) {
-// if (message.startsWith("Use alternative cost")) {
-// message = "Use alternative cost?";
-// } else if (message.contains("Use ")) {
-// if (message.length() < this.getWidth() / 10) {
-// message = getSmallText(message);
-// } else {
-// message = "Use ability?" + getSmallText(message.substring(0, this.getWidth() / 10));
-// }
-// }
- textArea.setText(message, this.getWidth());
+ public void setOriginalId(UUID originalId) {
+ this.originalId = originalId;
}
- protected String getSmallText(String text) {
- return "" + text + "
";
+ public void setBasicMessage(String message) {
+ this.message = message;
+ this.textArea.setText(message, this.getWidth());
+ }
+
+ public void setTextArea(String message) {
+ this.textArea.setText(message, this.getWidth());
}
@Override
public void requestFocus() {
this.btnRight.requestFocus();
}
+
+ private void initPopupMenuTriggerOrder() {
+
+ ActionListener actionListener = new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ handleAutoAnswerPopupMenuEvent(e);
+ }
+ };
+
+ popupMenuAskYes = new JPopupMenu();
+ popupMenuAskNo = new JPopupMenu();
+
+ // String tooltipText = "";
+ JMenuItem menuItem;
+ menuItem = new JMenuItem("Always Yes for the same text and ability");
+ menuItem.setActionCommand(CMD_AUTO_ANSWER_ID_YES);
+ menuItem.addActionListener(actionListener);
+ menuItem.setToolTipText("If the same question from the same ability would
be asked again, it's automatically answered with Yes.");
+ popupMenuAskYes.add(menuItem);
+
+ menuItem = new JMenuItem("Always No for the same text and ability");
+ menuItem.setActionCommand(CMD_AUTO_ANSWER_ID_NO);
+ menuItem.setToolTipText("If the same question from the same ability would
be asked again, it's automatically answered with No.");
+ menuItem.addActionListener(actionListener);
+ popupMenuAskNo.add(menuItem);
+
+ menuItem = new JMenuItem("Always Yes for the same text");
+ menuItem.setActionCommand(CMD_AUTO_ANSWER_NAME_YES);
+ menuItem.setToolTipText("If the same question would be asked again (regardless from which source),
it's automatically answered with Yes.");
+ menuItem.addActionListener(actionListener);
+ popupMenuAskYes.add(menuItem);
+
+ menuItem = new JMenuItem("Always No for the same text");
+ menuItem.setActionCommand(CMD_AUTO_ANSWER_NAME_NO);
+ menuItem.setToolTipText("If the same question would be asked again (regardless from which source),
it's automatically answered with No.");
+ menuItem.addActionListener(actionListener);
+ popupMenuAskNo.add(menuItem);
+
+ menuItem = new JMenuItem("Delete all automatic Yes/No settings");
+ menuItem.setActionCommand(CMD_AUTO_ANSWER_RESET_ALL);
+ menuItem.addActionListener(actionListener);
+ popupMenuAskYes.add(menuItem);
+
+ menuItem = new JMenuItem("Delete all automatic Yes/No settings");
+ menuItem.setActionCommand(CMD_AUTO_ANSWER_RESET_ALL);
+ menuItem.addActionListener(actionListener);
+ popupMenuAskNo.add(menuItem);
+ }
+
+ public void handleAutoAnswerPopupMenuEvent(ActionEvent e) {
+ switch (e.getActionCommand()) {
+ case CMD_AUTO_ANSWER_ID_YES:
+ MageFrame.getClient().sendPlayerAction(REQUEST_AUTO_ANSWER_ID_YES, gameId, originalId.toString() + "#" + message);
+ clickButton(btnLeft);
+ break;
+ case CMD_AUTO_ANSWER_ID_NO:
+ MageFrame.getClient().sendPlayerAction(REQUEST_AUTO_ANSWER_ID_NO, gameId, originalId.toString() + "#" + message);
+ clickButton(btnRight);
+ break;
+ case CMD_AUTO_ANSWER_NAME_YES:
+ MageFrame.getClient().sendPlayerAction(REQUEST_AUTO_ANSWER_TEXT_YES, gameId, message);
+ clickButton(btnLeft);
+ break;
+ case CMD_AUTO_ANSWER_NAME_NO:
+ MageFrame.getClient().sendPlayerAction(REQUEST_AUTO_ANSWER_TEXT_NO, gameId, message);
+ clickButton(btnRight);
+ break;
+ case CMD_AUTO_ANSWER_RESET_ALL:
+ MageFrame.getClient().sendPlayerAction(REQUEST_AUTO_ANSWER_RESET_ALL, gameId, null);
+ break;
+ }
+ }
+
+ private void showPopupMenu(Component callingComponent, String actionCommand) {
+ // Get the location of the point 'on the screen'
+ Point p = callingComponent.getLocationOnScreen();
+ // Show the JPopupMenu via program
+ // Parameter desc
+ // ----------------
+ // this - represents current frame
+ // 0,0 is the co ordinate where the popup
+ // is shown
+ JPopupMenu menu;
+ if (actionCommand.endsWith("Yes")) {
+ menu = popupMenuAskYes;
+ } else {
+ menu = popupMenuAskNo;
+ }
+ menu.show(this, 0, 0);
+
+ // Now set the location of the JPopupMenu
+ // This location is relative to the screen
+ menu.setLocation(p.x, p.y + callingComponent.getHeight());
+ }
}
diff --git a/Mage.Client/src/main/java/mage/client/game/PlayAreaPanel.java b/Mage.Client/src/main/java/mage/client/game/PlayAreaPanel.java
index f27a619ff56..84ea9ed17bd 100644
--- a/Mage.Client/src/main/java/mage/client/game/PlayAreaPanel.java
+++ b/Mage.Client/src/main/java/mage/client/game/PlayAreaPanel.java
@@ -290,6 +290,18 @@ public class PlayAreaPanel extends javax.swing.JPanel {
}
});
+ menuItem = new JMenuItem("Use requests - reset automatic answers");
+ menuItem.setMnemonic(KeyEvent.VK_T);
+ menuItem.setToolTipText("Deletes all defined automatic answers for Yes/No usage requests.");
+ automaticConfirmsMenu.add(menuItem);
+ // Reset the replacement effcts that were auto selected for the game
+ menuItem.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ MageFrame.getClient().sendPlayerAction(PlayerAction.REQUEST_AUTO_ANSWER_RESET_ALL, gameId, null);
+ }
+ });
+
JMenu handCardsMenu = new JMenu("Cards on hand");
handCardsMenu.setMnemonic(KeyEvent.VK_H);
popupMenu.add(handCardsMenu);
diff --git a/Mage.Client/src/main/java/mage/client/plugins/adapters/MageActionCallback.java b/Mage.Client/src/main/java/mage/client/plugins/adapters/MageActionCallback.java
index 740d7da8e4d..8fe88a82f8b 100644
--- a/Mage.Client/src/main/java/mage/client/plugins/adapters/MageActionCallback.java
+++ b/Mage.Client/src/main/java/mage/client/plugins/adapters/MageActionCallback.java
@@ -131,10 +131,10 @@ public class MageActionCallback implements ActionCallback {
ArrowUtil.drawArrowsForPairedCards(data, parentPoint);
ArrowUtil.drawArrowsForEnchantPlayers(data, parentPoint);
- showPopup(data, parentComponent, parentPoint);
+ showTooltipPopup(data, parentComponent, parentPoint);
}
- private void showPopup(final TransferData data, final Component parentComponent, final Point parentPoint) {
+ private void showTooltipPopup(final TransferData data, final Component parentComponent, final Point parentPoint) {
if (data.component != null) {
String showTooltips = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_SHOW_TOOLTIPS_ANY_ZONE, "true");
if (showTooltips.equals("false")) {
diff --git a/Mage.Client/src/main/java/mage/client/util/gui/Arrow.java b/Mage.Client/src/main/java/mage/client/util/gui/Arrow.java
index b513ea79665..0befa70bed9 100644
--- a/Mage.Client/src/main/java/mage/client/util/gui/Arrow.java
+++ b/Mage.Client/src/main/java/mage/client/util/gui/Arrow.java
@@ -11,11 +11,11 @@ import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Area;
import java.awt.geom.GeneralPath;
-
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Arrow extends JPanel {
+
private static final long serialVersionUID = -4631054277822828303L;
private int startX;
@@ -27,21 +27,25 @@ public class Arrow extends JPanel {
private Composite composite;
private Color color = Color.red;
- public Arrow () {
+ public Arrow() {
setOpaque(false);
setOpacity(0.6f);
}
- protected void paintComponent (Graphics g) {
+ protected void paintComponent(Graphics g) {
super.paintComponent(g);
float ex = endX - startX;
float ey = endY - startY;
- if (ex == 0 && ey == 0) return;
- float length = (float)Math.sqrt(ex * ex + ey * ey);
- float bendPercent = (float)Math.asin(ey / length);
- if (endX > startX) bendPercent = -bendPercent;
+ if (ex == 0 && ey == 0) {
+ return;
+ }
+ float length = (float) Math.sqrt(ex * ex + ey * ey);
+ float bendPercent = (float) Math.asin(ey / length);
+ if (endX > startX) {
+ bendPercent = -bendPercent;
+ }
Area arrow = getArrow(length, bendPercent);
- Graphics2D g2d = (Graphics2D)g;
+ Graphics2D g2d = (Graphics2D) g;
g2d.translate(startX, startY);
g2d.rotate(Math.atan2(ey, ex));
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
@@ -52,16 +56,16 @@ public class Arrow extends JPanel {
g2d.draw(arrow);
}
- private Area getArrow (float length, float bendPercent) {
+ private Area getArrow(float length, float bendPercent) {
float p1x = 0, p1y = 0;
float p2x = length, p2y = 0;
float cx = length / 2, cy = length / 8f * bendPercent;
float adjSize, ex, ey, abs_e;
- adjSize = (float)(bodyWidth / 2 / Math.sqrt(2));
+ adjSize = (float) (bodyWidth / 2 / Math.sqrt(2));
ex = p2x - cx;
ey = p2y - cy;
- abs_e = (float)Math.sqrt(ex * ex + ey * ey);
+ abs_e = (float) Math.sqrt(ex * ex + ey * ey);
ex /= abs_e;
ey /= abs_e;
GeneralPath bodyPath = new GeneralPath();
@@ -71,10 +75,10 @@ public class Arrow extends JPanel {
bodyPath.quadTo(cx, cy, p2x - (ey + ex) * adjSize, p2y + (ex - ey) * adjSize);
bodyPath.closePath();
- adjSize = (float)(headSize / Math.sqrt(2));
+ adjSize = (float) (headSize / Math.sqrt(2));
ex = p2x - cx;
ey = p2y - cy;
- abs_e = (float)Math.sqrt(ex * ex + ey * ey);
+ abs_e = (float) Math.sqrt(ex * ex + ey * ey);
ex /= abs_e;
ey /= abs_e;
GeneralPath headPath = new GeneralPath();
@@ -88,23 +92,23 @@ public class Arrow extends JPanel {
return area;
}
- public int getBodyWidth () {
+ public int getBodyWidth() {
return bodyWidth;
}
- public void setBodyWidth (int bodyWidth) {
+ public void setBodyWidth(int bodyWidth) {
this.bodyWidth = bodyWidth;
}
- public float getHeadSize () {
+ public float getHeadSize() {
return headSize;
}
- public void setHeadSize (float headSize) {
+ public void setHeadSize(float headSize) {
this.headSize = headSize;
}
- public void setArrowLocation (int startX, int startY, int endX, int endY) {
+ public void setArrowLocation(int startX, int startY, int endX, int endY) {
this.startX = startX;
this.startY = startY;
this.endX = endX;
@@ -112,7 +116,7 @@ public class Arrow extends JPanel {
repaint();
}
- public void setOpacity (float opacity) {
+ public void setOpacity(float opacity) {
composite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, opacity);
}
@@ -120,7 +124,7 @@ public class Arrow extends JPanel {
this.color = color;
}
- public static void main (String[] args) {
+ public static void main(String[] args) {
final JFrame frame = new JFrame();
frame.setLayout(new BorderLayout());
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
@@ -130,11 +134,13 @@ public class Arrow extends JPanel {
frame.setResizable(false);
frame.setVisible(true);
frame.getContentPane().addMouseMotionListener(new MouseMotionListener() {
- public void mouseMoved (MouseEvent e) {
+ @Override
+ public void mouseMoved(MouseEvent e) {
arrow.setArrowLocation(320, 240, e.getX(), e.getY());
}
- public void mouseDragged (MouseEvent e) {
+ @Override
+ public void mouseDragged(MouseEvent e) {
}
});
}
diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MagicCardsImageSource.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MagicCardsImageSource.java
index 4c4ff30e053..88653281241 100644
--- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MagicCardsImageSource.java
+++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/MagicCardsImageSource.java
@@ -13,7 +13,7 @@ import org.mage.plugins.card.utils.CardImageUtils;
public class MagicCardsImageSource implements CardImageSource {
private static CardImageSource instance = new MagicCardsImageSource();
-
+
private static final Map setNameTokenReplacement = new HashMap() {
{
put("BFZ", "battle-for-zendikar");
@@ -31,8 +31,8 @@ public class MagicCardsImageSource implements CardImageSource {
put("MM2", "modern-masters-2015");
put("PTC", "prerelease-events");
put("DTK", "dragons-of-tarkir");
- put("GRC","wpngateway");
- put("MBP","media-inserts");
+ put("GRC", "wpngateway");
+ put("MBP", "media-inserts");
put("MLP", "launch-party");
put("WMCQ", "world-magic-cup-qualifier");
put("GPX", "grand-prix");
@@ -40,7 +40,7 @@ public class MagicCardsImageSource implements CardImageSource {
put("MGDC", "magic-game-day-cards");
put("FNMP", "friday-night-magic");
put("FRF", "fate-reforged");
- put("C14", "commander-2014-edition");
+ put("C14", "commander-2014");
put("KTK", "khans-of-tarkir");
put("VMA", "vintage-masters");
put("CNS", "conspiracy");
@@ -130,7 +130,7 @@ public class MagicCardsImageSource implements CardImageSource {
String set = CardImageUtils.updateSet(cardSet, true);
String preferedLanguage = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_CARD_IMAGES_PREF_LANGUAGE, "en");
-
+
StringBuilder url = new StringBuilder("http://magiccards.info/scans/").append(preferedLanguage).append("/");
url.append(set.toLowerCase()).append("/").append(collectorId);
diff --git a/Mage.Client/src/main/resources/card-pictures-tok.txt b/Mage.Client/src/main/resources/card-pictures-tok.txt
index 5af245dd308..eee4bed26eb 100644
--- a/Mage.Client/src/main/resources/card-pictures-tok.txt
+++ b/Mage.Client/src/main/resources/card-pictures-tok.txt
@@ -1,3 +1,6 @@
+#Generate|TOK:BFZ|Eldrazi Scion|
+#Generate|TOK:BFZ|Elemental|
+
#Generate|TOK:DDP|Eldrazi Spawn 1|
#Generate|TOK:DDP|Eldrazi Spawn 2|
#Generate|TOK:DDP|Eldrazi Spawn 3|
@@ -58,14 +61,19 @@
#|Generate|TOK:PTC|Wolf|
#|Generate|TOK:PTC|Wurm|
-#|Generate|TOK:DTK|Djinn Monk|
-#|Generate|TOK:DTK|Dragon|
-#|Generate|TOK:DTK|Goblin|
-#|Generate|TOK:DTK|Morph|
-#|Generate|TOK:DTK|Warrior|
-#|Generate|TOK:DTK|Zombie|
-#|Generate|TOK:DTK|Zombie Horror|
-#|Generate|EMBLEM!:DTK|Emblem Narset Transcendent|
+|Generate|TOK:DTK|Djinn Monk|
+|Generate|TOK:DTK|Dragon|
+|Generate|TOK:DTK|Goblin|
+|Generate|TOK:DTK|Morph|
+|Generate|TOK:DTK|Warrior|
+|Generate|TOK:DTK|Zombie|
+|Generate|TOK:DTK|Zombie Horror|
+|Generate|EMBLEM!:DTK|Emblem Narset|
+
+|Generate|TOK:FRF|Monk|
+|Generate|TOK:FRF|Spirit|
+|Generate|TOK:FRF|Warrior|
+|Generate|TOK:FRF|Manifest|
#|Generate|TOK:GRC|Bird|
#|Generate|TOK:GRC|Golem|
@@ -102,21 +110,59 @@
|Generate|TOK:FNMP|Wolf|
#|Generate|TOK:FNMP|Wurm|
+|Generate|TOK:C14|Angel|
+|Generate|TOK:C14|Cat|
+|Generate|TOK:C14|Goat|
+|Generate|TOK:C14|Kor Soldier|
+|Generate|TOK:C14|Pegasus|
+|Generate|TOK:C14|Soldier|
+|Generate|TOK:C14|Spirit|
+|Generate|TOK:C14|Fish|
+|Generate|TOK:C14|Kraken|
+|Generate|TOK:C14|Whale|
+|Generate|TOK:C14|Zombie 1|
+|Generate|TOK:C14|Demon 1|
+|Generate|TOK:C14|Demon 2|
+|Generate|TOK:C14|Germ|
+|Generate|TOK:C14|Horror|
+|Generate|TOK:C14|Zombie 2|
+|Generate|TOK:C14|Goblin|
+|Generate|TOK:C14|Ape|
+|Generate|TOK:C14|Beast 1|
+|Generate|TOK:C14|Beast 2|
+|Generate|TOK:C14|Elemental|
+|Generate|TOK:C14|Elephant|
+|Generate|TOK:C14|Elf Druid|
+|Generate|TOK:C14|Elf Warrior|
+|Generate|TOK:C14|Treefolk|
+|Generate|TOK:C14|Wolf|
+|Generate|TOK:C14|Gargoyle|
+|Generate|TOK:C14|Myr|
+|Generate|TOK:C14|Pentavite|
+|Generate|TOK:C14|Stoneforged Blade|
+|Generate|TOK:C14|Tuktuk the Returned|
+|Generate|TOK:C14|Wurm 1|
+|Generate|TOK:C14|Wurm 2|
+|Generate|EMBLEM!:C14|Emblem Teferi
+|Generate|EMBLEM!:C14|Emblem Nixilis
+|Generate|EMBLEM!:C14|Emblem Daretti
+
+
|Generate|TOK:DDN|Goblin|
-#|Generate|TOK:KTK|Bear|
-#|Generate|TOK:KTK|Bird|
-#|Generate|TOK:KTK|Goblin|
-#|Generate|TOK:KTK|Morph|
-#|Generate|TOK:KTK|Snake|
-#|Generate|TOK:KTK|Spirit Warrior|
-#|Generate|TOK:KTK|Spirit|
-#|Generate|TOK:KTK|Vampire|
-#|Generate|TOK:KTK|Warrior 1|
-#|Generate|TOK:KTK|Warrior 2|
-#|Generate|TOK:KTK|Zombie|
-#|Generate|EMBLEM!:KTK|Emblem Sarkhan, the Dragonspeaker|
-#|Generate|EMBLEM!:KTK|Emblem Sorin, Solemn Visitor|
+|Generate|TOK:KTK|Bear|
+|Generate|TOK:KTK|Bird|
+|Generate|TOK:KTK|Goblin|
+|Generate|TOK:KTK|Morph|
+|Generate|TOK:KTK|Snake|
+|Generate|TOK:KTK|Spirit Warrior|
+|Generate|TOK:KTK|Spirit|
+|Generate|TOK:KTK|Vampire|
+|Generate|TOK:KTK|Warrior 1|
+|Generate|TOK:KTK|Warrior 2|
+|Generate|TOK:KTK|Zombie|
+|Generate|EMBLEM!:KTK|Emblem Sarkhan|
+|Generate|EMBLEM!:KTK|Emblem Sorin|
|Generate|TOK:M15|Sliver|
|Generate|TOK:M15|Soldier|
@@ -445,4 +491,4 @@
|Generate|TOK:CSP|Marit Lage|
-|Generate|TOK:CHK|Spirit|
\ No newline at end of file
+#|Generate|TOK:CHK|Spirit|
\ No newline at end of file
diff --git a/Mage.Client/src/main/resources/image.url.properties b/Mage.Client/src/main/resources/image.url.properties
index 625d27d3bac..21627b43ec6 100644
--- a/Mage.Client/src/main/resources/image.url.properties
+++ b/Mage.Client/src/main/resources/image.url.properties
@@ -64,6 +64,6 @@ ddd=gvl
unh=uh
dde=pvc
# Remove setname as soon as the images can be downloaded
-ignore.urls=TOK,MM2,V15,BFZ,DDP
+ignore.urls=TOK,V15,DDP
# sets ordered by release time (newest goes first)
token.lookup.order=DDP,BFZ,FVD,FVE,FVL,FVR,V12,V13,V14,V15,TPR,MPRP,DD3,DDO,ORI,MM2,PTC,DTK,FRF,KTK,M15,VMA,CNS,JOU,BNG,THS,DDL,M14,MMA,DGM,GTC,RTR,M13,AVR,DDI,DKA,ISD,M12,NPH,MBS,SOM,M11,ROE,DDE,WWK,ZEN,M10,GVL,ARB,DVD,CFX,JVC,ALA,EVE,SHM,EVG,MOR,LRW,10E,CLS,CHK,GRC
\ No newline at end of file
diff --git a/Mage.Common/pom.xml b/Mage.Common/pom.xml
index f7e64b9d190..4d6c54b54fc 100644
--- a/Mage.Common/pom.xml
+++ b/Mage.Common/pom.xml
@@ -7,7 +7,7 @@
org.mage
mage-root
- 1.4.3
+ 1.4.4
mage-common
diff --git a/Mage.Common/src/mage/constants/Constants.java b/Mage.Common/src/mage/constants/Constants.java
index a5b586c63a8..965346f2819 100644
--- a/Mage.Common/src/mage/constants/Constants.java
+++ b/Mage.Common/src/mage/constants/Constants.java
@@ -83,6 +83,10 @@ public final class Constants {
public static final String POSSIBLE_ATTACKERS = "possibleAttackers";
public static final String SPECIAL_BUTTON = "specialButton";
+ // used to control automatic answers of optional effects
+ public static final String ORIGINAL_ID = "originalId";
+ public static final String SECOND_MESSAGE = "secondMessage";
+ public static final String HINT_TEXT = "hintText";
}
diff --git a/Mage.Common/src/mage/remote/MageVersionException.java b/Mage.Common/src/mage/remote/MageVersionException.java
index 4da5aec0ddc..33108ab2d6b 100644
--- a/Mage.Common/src/mage/remote/MageVersionException.java
+++ b/Mage.Common/src/mage/remote/MageVersionException.java
@@ -1,16 +1,16 @@
/*
* Copyright 2011 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
@@ -20,7 +20,7 @@
* 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.
@@ -38,8 +38,8 @@ public class MageVersionException extends MageException {
private final MageVersion serverVersion;
- public MageVersionException(MageVersion clientVersion, MageVersion serverVersion) {
- super("Wrong client version " + clientVersion + ", expecting version " + serverVersion + ". \r\n\r\nPlease download needed version from http://XMage.info or http://www.slightlymagic.net/forum/viewforum.php?f=70");
+ public MageVersionException(MageVersion clientVersion, MageVersion serverVersion) {
+ super("Wrong client version " + clientVersion + ", expecting version " + serverVersion + ". \r\n\r\nPlease download needed version from http://XMage.de or http://www.slightlymagic.net/forum/viewforum.php?f=70");
this.serverVersion = serverVersion;
}
diff --git a/Mage.Common/src/mage/utils/MageVersion.java b/Mage.Common/src/mage/utils/MageVersion.java
index 6482c0baa74..423f6dc1e51 100644
--- a/Mage.Common/src/mage/utils/MageVersion.java
+++ b/Mage.Common/src/mage/utils/MageVersion.java
@@ -40,8 +40,8 @@ public class MageVersion implements Serializable, Comparable {
*/
public final static int MAGE_VERSION_MAJOR = 1;
public final static int MAGE_VERSION_MINOR = 4;
- public final static int MAGE_VERSION_PATCH = 3;
- public final static String MAGE_VERSION_MINOR_PATCH = "v3";
+ public final static int MAGE_VERSION_PATCH = 4;
+ public final static String MAGE_VERSION_MINOR_PATCH = "v0";
public final static String MAGE_VERSION_INFO = "";
private final int major;
diff --git a/Mage.Common/src/mage/view/GameView.java b/Mage.Common/src/mage/view/GameView.java
index 9f078a75b91..e15827f6e76 100644
--- a/Mage.Common/src/mage/view/GameView.java
+++ b/Mage.Common/src/mage/view/GameView.java
@@ -133,13 +133,18 @@ public class GameView implements Serializable {
new StackAbilityView(game, (StackAbility) stackObject, object.getName(), new CardView(new EmblemView(((Emblem) object), sourceCard))));
checkPaid(stackObject.getId(), ((StackAbility) stackObject));
} else {
- StackAbility stackAbility = ((StackAbility) object);
- stackAbility.newId();
- stack.put(stackObject.getId(), new CardView(((StackAbility) stackObject)));
- checkPaid(stackObject.getId(), ((StackAbility) stackObject));
+ if (object instanceof StackAbility) {
+ StackAbility stackAbility = ((StackAbility) object);
+ stackAbility.newId();
+ stack.put(stackObject.getId(), new CardView(((StackAbility) stackObject)));
+ checkPaid(stackObject.getId(), ((StackAbility) stackObject));
+ } else {
+ logger.fatal("Object can't be cast to StackAbility: " + object.getName() + " " + object.toString());
+ }
}
} else {
- logger.error("Stack Object for stack ability not found: " + stackObject.getStackAbility().getRule());
+ // can happen if a player times out while ability is on the stack
+ logger.debug("Stack Object for stack ability not found: " + stackObject.getStackAbility().getRule());
}
} else {
// Spell
diff --git a/Mage.Common/src/mage/view/UserDataView.java b/Mage.Common/src/mage/view/UserDataView.java
index 1142044993a..fbc3e93bdbe 100644
--- a/Mage.Common/src/mage/view/UserDataView.java
+++ b/Mage.Common/src/mage/view/UserDataView.java
@@ -22,6 +22,9 @@ public class UserDataView implements Serializable {
protected boolean askMoveToGraveOrder;
protected boolean manaPoolAutomatic;
protected boolean manaPoolAutomaticRestricted;
+ protected boolean passPriorityCast;
+ protected boolean passPriorityActivation;
+ protected boolean autoOrderTrigger;
static UserData getDefaultUserData() {
return UserData.getDefaultUserDataView();
@@ -29,7 +32,8 @@ public class UserDataView implements Serializable {
public UserDataView(UserGroup userGroup, int avatarId, boolean showAbilityPickerForced,
boolean allowRequestShowHandCards, boolean confirmEmptyManaPool, UserSkipPrioritySteps userSkipPrioritySteps,
- String flagName, boolean askMoveToGraveOrder, boolean manaPoolAutomatic, boolean manaPoolAutomaticRestricted) {
+ String flagName, boolean askMoveToGraveOrder, boolean manaPoolAutomatic, boolean manaPoolAutomaticRestricted,
+ boolean passPriorityCast, boolean passPriorityActivation, boolean autoOrderTrigger) {
this.groupId = userGroup.getGroupId();
this.avatarId = avatarId;
this.showAbilityPickerForced = showAbilityPickerForced;
@@ -40,23 +44,9 @@ public class UserDataView implements Serializable {
this.askMoveToGraveOrder = askMoveToGraveOrder;
this.manaPoolAutomatic = manaPoolAutomatic;
this.manaPoolAutomaticRestricted = manaPoolAutomaticRestricted;
- }
-
- public void update(UserData userData) {
- this.groupId = userData.getGroupId();
- this.avatarId = userData.getAvatarId();
- this.showAbilityPickerForced = userData.isShowAbilityPickerForced();
- this.allowRequestShowHandCards = userData.isAllowRequestShowHandCards();
- this.userSkipPrioritySteps = userData.getUserSkipPrioritySteps();
- this.confirmEmptyManaPool = userData.confirmEmptyManaPool();
- this.flagName = userData.getFlagName();
- this.askMoveToGraveOrder = userData.askMoveToGraveOrder();
- this.manaPoolAutomatic = userData.isManaPoolAutomatic();
- this.manaPoolAutomaticRestricted = userData.isManaPoolAutomaticRestricted();
- }
-
- public void setGroupId(int groupId) {
- this.groupId = groupId;
+ this.passPriorityCast = passPriorityCast;
+ this.passPriorityActivation = passPriorityActivation;
+ this.autoOrderTrigger = autoOrderTrigger;
}
public int getGroupId() {
@@ -67,72 +57,48 @@ public class UserDataView implements Serializable {
return avatarId;
}
- public void setAvatarId(int avatarId) {
- this.avatarId = avatarId;
- }
-
public boolean isShowAbilityPickerForced() {
return showAbilityPickerForced;
}
- public void setShowAbilityPickerForced(boolean showAbilityPickerForced) {
- this.showAbilityPickerForced = showAbilityPickerForced;
- }
-
public boolean isAllowRequestShowHandCards() {
return allowRequestShowHandCards;
}
- public void setAllowRequestShowHandCards(boolean allowRequestShowHandCards) {
- this.allowRequestShowHandCards = allowRequestShowHandCards;
- }
-
public UserSkipPrioritySteps getUserSkipPrioritySteps() {
return userSkipPrioritySteps;
}
- public void setUserSkipPrioritySteps(UserSkipPrioritySteps userSkipPrioritySteps) {
- this.userSkipPrioritySteps = userSkipPrioritySteps;
- }
-
public boolean confirmEmptyManaPool() {
return confirmEmptyManaPool;
}
- public void setConfirmEmptyManaPool(boolean confirmEmptyManaPool) {
- this.confirmEmptyManaPool = confirmEmptyManaPool;
- }
-
public String getFlagName() {
return flagName;
}
- public void setFlagName(String flagName) {
- this.flagName = flagName;
- }
-
public boolean askMoveToGraveOrder() {
return askMoveToGraveOrder;
}
- public void setAskMoveToGraveOrder(boolean askMoveToGraveOrder) {
- this.askMoveToGraveOrder = askMoveToGraveOrder;
- }
-
public boolean isManaPoolAutomatic() {
return manaPoolAutomatic;
}
- public void setManaPoolAutomatic(boolean manaPoolAutomatic) {
- this.manaPoolAutomatic = manaPoolAutomatic;
- }
-
public boolean isManaPoolAutomaticRestricted() {
return manaPoolAutomaticRestricted;
}
- public void setManaPoolAutomaticRestricted(boolean manaPoolAutomaticRestricted) {
- this.manaPoolAutomaticRestricted = manaPoolAutomaticRestricted;
+ public boolean isPassPriorityCast() {
+ return passPriorityCast;
+ }
+
+ public boolean isPassPriorityActivation() {
+ return passPriorityActivation;
+ }
+
+ public boolean isAutoOrderTrigger() {
+ return autoOrderTrigger;
}
}
diff --git a/Mage.Network/pom.xml b/Mage.Network/pom.xml
index 8111e78e2e0..292612f389d 100644
--- a/Mage.Network/pom.xml
+++ b/Mage.Network/pom.xml
@@ -5,7 +5,7 @@
org.mage
mage-root
- 1.4.3
+ 1.4.4
mage-network
diff --git a/Mage.Plugins/Mage.Counter.Plugin/pom.xml b/Mage.Plugins/Mage.Counter.Plugin/pom.xml
index df8cc7328b3..128d50a5ca8 100644
--- a/Mage.Plugins/Mage.Counter.Plugin/pom.xml
+++ b/Mage.Plugins/Mage.Counter.Plugin/pom.xml
@@ -7,7 +7,7 @@
org.mage
mage-plugins
- 1.4.3
+ 1.4.4
mage-counter-plugin
diff --git a/Mage.Plugins/Mage.Theme.Plugin/pom.xml b/Mage.Plugins/Mage.Theme.Plugin/pom.xml
index eebc730e4a8..f58f45d1d6d 100644
--- a/Mage.Plugins/Mage.Theme.Plugin/pom.xml
+++ b/Mage.Plugins/Mage.Theme.Plugin/pom.xml
@@ -6,7 +6,7 @@
org.mage
mage-plugins
- 1.4.3
+ 1.4.4
mage-theme-plugin
@@ -29,7 +29,7 @@
${project.groupId}
mage-client
- 1.4.3
+ 1.4.4
diff --git a/Mage.Plugins/pom.xml b/Mage.Plugins/pom.xml
index 4e6b8ad8521..e1a1ba632b5 100644
--- a/Mage.Plugins/pom.xml
+++ b/Mage.Plugins/pom.xml
@@ -7,7 +7,7 @@
org.mage
mage-root
- 1.4.3
+ 1.4.4
mage-plugins
diff --git a/Mage.Server.Console/pom.xml b/Mage.Server.Console/pom.xml
index 96de7c38d85..a83675f5e39 100644
--- a/Mage.Server.Console/pom.xml
+++ b/Mage.Server.Console/pom.xml
@@ -6,7 +6,7 @@
org.mage
mage-root
- 1.4.3
+ 1.4.4
org.mage
diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/pom.xml b/Mage.Server.Plugins/Mage.Deck.Constructed/pom.xml
index dabc671779d..ed0bd5025fd 100644
--- a/Mage.Server.Plugins/Mage.Deck.Constructed/pom.xml
+++ b/Mage.Server.Plugins/Mage.Deck.Constructed/pom.xml
@@ -7,7 +7,7 @@
org.mage
mage-server-plugins
- 1.4.3
+ 1.4.4
mage-deck-constructed
diff --git a/Mage.Server.Plugins/Mage.Deck.Limited/pom.xml b/Mage.Server.Plugins/Mage.Deck.Limited/pom.xml
index 3ab629a71a6..978f5fe60ea 100644
--- a/Mage.Server.Plugins/Mage.Deck.Limited/pom.xml
+++ b/Mage.Server.Plugins/Mage.Deck.Limited/pom.xml
@@ -7,7 +7,7 @@
org.mage
mage-server-plugins
- 1.4.3
+ 1.4.4
mage-deck-limited
diff --git a/Mage.Server.Plugins/Mage.Game.CommanderDuel/pom.xml b/Mage.Server.Plugins/Mage.Game.CommanderDuel/pom.xml
index 66972c3a272..e42e4d1eb72 100644
--- a/Mage.Server.Plugins/Mage.Game.CommanderDuel/pom.xml
+++ b/Mage.Server.Plugins/Mage.Game.CommanderDuel/pom.xml
@@ -7,7 +7,7 @@
org.mage
mage-server-plugins
- 1.4.3
+ 1.4.4
mage-game-commanderduel
diff --git a/Mage.Server.Plugins/Mage.Game.CommanderFreeForAll/pom.xml b/Mage.Server.Plugins/Mage.Game.CommanderFreeForAll/pom.xml
index ccfa64fc609..7b4738d4885 100644
--- a/Mage.Server.Plugins/Mage.Game.CommanderFreeForAll/pom.xml
+++ b/Mage.Server.Plugins/Mage.Game.CommanderFreeForAll/pom.xml
@@ -6,7 +6,7 @@
org.mage
mage-server-plugins
- 1.4.3
+ 1.4.4
mage-game-commanderfreeforall
diff --git a/Mage.Server.Plugins/Mage.Game.FreeForAll/pom.xml b/Mage.Server.Plugins/Mage.Game.FreeForAll/pom.xml
index a608c789705..551b33a9650 100644
--- a/Mage.Server.Plugins/Mage.Game.FreeForAll/pom.xml
+++ b/Mage.Server.Plugins/Mage.Game.FreeForAll/pom.xml
@@ -7,7 +7,7 @@
org.mage
mage-server-plugins
- 1.4.3
+ 1.4.4
mage-game-freeforall
diff --git a/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/pom.xml b/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/pom.xml
index 7f1ff12438f..8f037f31689 100644
--- a/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/pom.xml
+++ b/Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/pom.xml
@@ -7,7 +7,7 @@
org.mage
mage-server-plugins
- 1.4.3
+ 1.4.4
mage-game-tinyleadersduel
diff --git a/Mage.Server.Plugins/Mage.Game.TwoPlayerDuel/pom.xml b/Mage.Server.Plugins/Mage.Game.TwoPlayerDuel/pom.xml
index 7c6e74649f0..f5febf5042b 100644
--- a/Mage.Server.Plugins/Mage.Game.TwoPlayerDuel/pom.xml
+++ b/Mage.Server.Plugins/Mage.Game.TwoPlayerDuel/pom.xml
@@ -7,7 +7,7 @@
org.mage
mage-server-plugins
- 1.4.3
+ 1.4.4
mage-game-twoplayerduel
diff --git a/Mage.Server.Plugins/Mage.Player.AI.DraftBot/pom.xml b/Mage.Server.Plugins/Mage.Player.AI.DraftBot/pom.xml
index bf21ad2d2fe..cb6012e3f6e 100644
--- a/Mage.Server.Plugins/Mage.Player.AI.DraftBot/pom.xml
+++ b/Mage.Server.Plugins/Mage.Player.AI.DraftBot/pom.xml
@@ -7,7 +7,7 @@
org.mage
mage-server-plugins
- 1.4.3
+ 1.4.4
mage-player-ai-draftbot
diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/pom.xml b/Mage.Server.Plugins/Mage.Player.AI.MA/pom.xml
index 4495a41f8a6..23942195fde 100644
--- a/Mage.Server.Plugins/Mage.Player.AI.MA/pom.xml
+++ b/Mage.Server.Plugins/Mage.Player.AI.MA/pom.xml
@@ -7,7 +7,7 @@
org.mage
mage-server-plugins
- 1.4.3
+ 1.4.4
mage-player-ai-ma
diff --git a/Mage.Server.Plugins/Mage.Player.AI/pom.xml b/Mage.Server.Plugins/Mage.Player.AI/pom.xml
index 51788aff21a..43387e7f257 100644
--- a/Mage.Server.Plugins/Mage.Player.AI/pom.xml
+++ b/Mage.Server.Plugins/Mage.Player.AI/pom.xml
@@ -7,7 +7,7 @@
org.mage
mage-server-plugins
- 1.4.3
+ 1.4.4
mage-player-ai
diff --git a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java
index f0cda34d2a2..c9913b4f111 100644
--- a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java
+++ b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java
@@ -148,6 +148,7 @@ import mage.target.common.TargetDiscard;
import mage.target.common.TargetPermanentOrPlayer;
import mage.target.common.TargetSpellOrPermanent;
import mage.util.Copier;
+import mage.util.MessageToClient;
import mage.util.TreeNode;
import org.apache.log4j.Logger;
@@ -1323,6 +1324,11 @@ public class ComputerPlayer extends PlayerImpl implements Player {
@Override
public boolean chooseUse(Outcome outcome, String message, Ability source, Game game) {
+ return this.chooseUse(outcome, new MessageToClient(message), source, game);
+ }
+
+ @Override
+ public boolean chooseUse(Outcome outcome, MessageToClient message, Ability source, Game game) {
log.debug("chooseUse: " + outcome.isGood());
// Be proactive! Always use abilities, the evaluation function will decide if it's good or not
// Otherwise some abilities won't be used by AI like LoseTargetEffect that has "bad" outcome
diff --git a/Mage.Server.Plugins/Mage.Player.AIMCTS/pom.xml b/Mage.Server.Plugins/Mage.Player.AIMCTS/pom.xml
index 62c8e069013..5107921f395 100644
--- a/Mage.Server.Plugins/Mage.Player.AIMCTS/pom.xml
+++ b/Mage.Server.Plugins/Mage.Player.AIMCTS/pom.xml
@@ -7,7 +7,7 @@
org.mage
mage-server-plugins
- 1.4.3
+ 1.4.4
mage-player-ai-mcts
diff --git a/Mage.Server.Plugins/Mage.Player.AIMinimax/pom.xml b/Mage.Server.Plugins/Mage.Player.AIMinimax/pom.xml
index 696f0b3043f..c18ef70a712 100644
--- a/Mage.Server.Plugins/Mage.Player.AIMinimax/pom.xml
+++ b/Mage.Server.Plugins/Mage.Player.AIMinimax/pom.xml
@@ -7,7 +7,7 @@
org.mage
mage-server-plugins
- 1.4.3
+ 1.4.4
mage-player-aiminimax
diff --git a/Mage.Server.Plugins/Mage.Player.Human/pom.xml b/Mage.Server.Plugins/Mage.Player.Human/pom.xml
index 28493362e66..c1b13ea06a1 100644
--- a/Mage.Server.Plugins/Mage.Player.Human/pom.xml
+++ b/Mage.Server.Plugins/Mage.Player.Human/pom.xml
@@ -7,7 +7,7 @@
org.mage
mage-server-plugins
- 1.4.3
+ 1.4.4
mage-player-human
diff --git a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java
index aed2451d8bd..73fba0f4eae 100644
--- a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java
+++ b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java
@@ -63,6 +63,7 @@ import mage.constants.ManaType;
import mage.constants.Outcome;
import mage.constants.PhaseStep;
import mage.constants.PlayerAction;
+import static mage.constants.PlayerAction.REQUEST_AUTO_ANSWER_RESET_ALL;
import static mage.constants.PlayerAction.TRIGGER_AUTO_ORDER_RESET_ALL;
import mage.constants.RangeOfInfluence;
import mage.constants.Zone;
@@ -89,6 +90,7 @@ import mage.target.common.TargetCreatureOrPlayer;
import mage.target.common.TargetDefender;
import mage.util.GameLog;
import mage.util.ManaUtil;
+import mage.util.MessageToClient;
import org.apache.log4j.Logger;
/**
@@ -105,7 +107,7 @@ public class HumanPlayer extends PlayerImpl {
protected static FilterBlockingCreature filterBlock = new FilterBlockingCreature();
protected final Choice replacementEffectChoice;
- private static final Logger log = Logger.getLogger(HumanPlayer.class);
+ private static final Logger logger = Logger.getLogger(HumanPlayer.class);
protected HashSet autoSelectReplacementEffects = new HashSet<>();
protected ManaCost currentlyUnpaidMana;
@@ -115,6 +117,9 @@ public class HumanPlayer extends PlayerImpl {
protected Set triggerAutoOrderNameFirst = new HashSet<>();
protected Set triggerAutoOrderNameLast = new HashSet<>();
+ protected Map requestAutoAnswerId = new HashMap<>();
+ protected Map requestAutoAnswerText = new HashMap<>();
+
public HumanPlayer(String name, RangeOfInfluence range, int skill) {
super(name, range);
replacementEffectChoice = new ChoiceImpl(true);
@@ -131,53 +136,30 @@ public class HumanPlayer extends PlayerImpl {
protected void waitForResponse(Game game) {
response.clear();
- log.debug("Waiting response from player: " + getId());
+ logger.debug("Waiting response from player: " + getId());
game.resumeTimer(getTurnControlledBy());
synchronized (response) {
try {
response.wait();
- log.debug("Got response from player: " + getId());
+ logger.debug("Got response from player: " + getId());
} catch (InterruptedException ex) {
- ex.printStackTrace();
+ logger.error("Response error for player " + getName() + " gameId: " + game.getId(), ex);
} finally {
game.pauseTimer(getTurnControlledBy());
}
}
}
- protected void waitForBooleanResponse(Game game) {
- do {
- waitForResponse(game);
- } while (response.getBoolean() == null && !abort);
- }
-
- protected void waitForUUIDResponse(Game game) {
- do {
- waitForResponse(game);
- } while (response.getUUID() == null && !abort);
- }
-
- protected void waitForStringResponse(Game game) {
- do {
- waitForResponse(game);
- } while (response.getString() == null && !abort);
- }
-
- protected void waitForIntegerResponse(Game game) {
- do {
- waitForResponse(game);
- } while (response.getInteger() == null && !abort);
- }
-
@Override
public boolean chooseMulligan(Game game) {
updateGameStatePriority("chooseMulligan", game);
int nextHandSize = game.mulliganDownTo(playerId);
- game.fireAskPlayerEvent(playerId, new StringBuilder("Mulligan ")
- .append(getHand().size() > nextHandSize ? "down to " : "for free, draw ")
- .append(nextHandSize)
- .append(nextHandSize == 1 ? " card?" : " cards?").toString());
- waitForBooleanResponse(game);
+ do {
+ game.fireAskPlayerEvent(playerId, new MessageToClient("Mulligan "
+ + (getHand().size() > nextHandSize ? "down to " : "for free, draw ")
+ + nextHandSize + (nextHandSize == 1 ? " card?" : " cards?")), null);
+ waitForResponse(game);
+ } while (response.getBoolean() == null && !abort);
if (!abort) {
return response.getBoolean();
}
@@ -186,15 +168,51 @@ public class HumanPlayer extends PlayerImpl {
@Override
public boolean chooseUse(Outcome outcome, String message, Ability source, Game game) {
+ return this.chooseUse(outcome, new MessageToClient(message), source, game);
+ }
+
+ @Override
+ public boolean chooseUse(Outcome outcome, MessageToClient message, Ability source, Game game) {
+ if (source != null) {
+ Boolean answer = requestAutoAnswerId.get(source.getOriginalId() + "#" + message.getMessage());
+ if (answer != null) {
+ return answer;
+ } else {
+ answer = requestAutoAnswerText.get(message.getMessage());
+ if (answer != null) {
+ return answer;
+ }
+ }
+ }
updateGameStatePriority("chooseUse", game);
- game.fireAskPlayerEvent(playerId, addSecondLineWithObjectName(message, source == null ? null : source.getSourceId(), game));
- waitForBooleanResponse(game);
+ do {
+ if (message.getSecondMessage() == null) {
+ message.setSecondMessage(getRelatedObjectName(source, game));
+ }
+ game.fireAskPlayerEvent(playerId, message, source);
+ waitForResponse(game);
+ } while (response.getBoolean() == null && !abort);
if (!abort) {
return response.getBoolean();
}
return false;
}
+ private String getRelatedObjectName(Ability source, Game game) {
+ if (source != null) {
+ return getRelatedObjectName(source.getSourceId(), game);
+ }
+ return null;
+ }
+
+ private String getRelatedObjectName(UUID sourceId, Game game) {
+ MageObject mageObject = game.getObject(sourceId);
+ if (mageObject != null) {
+ return mageObject.getLogName();
+ }
+ return null;
+ }
+
private String addSecondLineWithObjectName(String message, UUID sourceId, Game game) {
if (sourceId != null) {
MageObject mageObject = game.getPermanent(sourceId);
@@ -232,7 +250,7 @@ public class HumanPlayer extends PlayerImpl {
while (!abort) {
game.fireChooseChoiceEvent(playerId, replacementEffectChoice);
waitForResponse(game);
- log.debug("Choose effect: " + response.getString());
+ logger.debug("Choose effect: " + response.getString());
if (response.getString() != null) {
if (response.getString().startsWith("#")) {
autoSelectReplacementEffects.add(response.getString().substring(1));
@@ -304,7 +322,7 @@ public class HumanPlayer extends PlayerImpl {
List chosen = target.getTargets();
options.put("chosen", (Serializable) chosen);
- game.fireSelectTargetEvent(getId(), addSecondLineWithObjectName(target.getMessage(), sourceId, game), targetIds, required, getOptions(target, options));
+ game.fireSelectTargetEvent(getId(), new MessageToClient(target.getMessage(), getRelatedObjectName(sourceId, game)), targetIds, required, getOptions(target, options));
waitForResponse(game);
if (response.getUUID() != null) {
if (!targetIds.contains(response.getUUID())) {
@@ -370,7 +388,7 @@ public class HumanPlayer extends PlayerImpl {
required = false;
}
- game.fireSelectTargetEvent(getId(), addSecondLineWithObjectName(target.getMessage(), source == null ? null : source.getSourceId(), game), possibleTargets, required, getOptions(target, null));
+ game.fireSelectTargetEvent(getId(), new MessageToClient(target.getMessage(), getRelatedObjectName(source, game)), possibleTargets, required, getOptions(target, null));
waitForResponse(game);
if (response.getUUID() != null) {
if (target.getTargets().contains(response.getUUID())) {
@@ -438,7 +456,7 @@ public class HumanPlayer extends PlayerImpl {
options.put("choosable", (Serializable) choosable);
}
- game.fireSelectTargetEvent(playerId, target.getMessage(), cards, required, options);
+ game.fireSelectTargetEvent(playerId, new MessageToClient(target.getMessage()), cards, required, options);
waitForResponse(game);
if (response.getUUID() != null) {
if (target.canTarget(response.getUUID(), cards, game)) {
@@ -492,7 +510,7 @@ public class HumanPlayer extends PlayerImpl {
if (!choosable.isEmpty()) {
options.put("choosable", (Serializable) choosable);
}
- game.fireSelectTargetEvent(playerId, addSecondLineWithObjectName(target.getMessage(), source == null ? null : source.getSourceId(), game), cards, required, options);
+ game.fireSelectTargetEvent(playerId, new MessageToClient(target.getMessage(), getRelatedObjectName(source, game)), cards, required, options);
waitForResponse(game);
if (response.getUUID() != null) {
if (target.getTargets().contains(response.getUUID())) { // if already included remove it
@@ -521,7 +539,7 @@ public class HumanPlayer extends PlayerImpl {
public boolean chooseTargetAmount(Outcome outcome, TargetAmount target, Ability source, Game game) {
updateGameStatePriority("chooseTargetAmount", game);
while (!abort) {
- game.fireSelectTargetEvent(playerId, addSecondLineWithObjectName(target.getMessage() + "\n Amount remaining:" + target.getAmountRemaining(), source == null ? null : source.getSourceId(), game),
+ game.fireSelectTargetEvent(playerId, new MessageToClient(target.getMessage() + "\n Amount remaining:" + target.getAmountRemaining(), getRelatedObjectName(source, game)),
target.possibleTargets(source == null ? null : source.getSourceId(), playerId, game),
target.isRequired(source),
getOptions(target, null));
@@ -544,6 +562,18 @@ public class HumanPlayer extends PlayerImpl {
public boolean priority(Game game) {
passed = false;
if (!abort) {
+ if (getJustActivatedType() != null) {
+ if (userData.isPassPriorityCast() && getJustActivatedType().equals(AbilityType.SPELL)) {
+ setJustActivatedType(null);
+ pass(game);
+ return false;
+ }
+ if (userData.isPassPriorityActivation() && getJustActivatedType().equals(AbilityType.ACTIVATED)) {
+ setJustActivatedType(null);
+ pass(game);
+ return false;
+ }
+ }
if (passedAllTurns) {
if (passWithManaPoolCheck(game)) {
return false;
@@ -675,35 +705,43 @@ public class HumanPlayer extends PlayerImpl {
@Override
public TriggeredAbility chooseTriggeredAbility(List abilities, Game game) {
- // try to set trigger auto order
- List abilitiesWithNoOrderSet = new ArrayList<>();
- TriggeredAbility abilityOrderLast = null;
- for (TriggeredAbility ability : abilities) {
- if (triggerAutoOrderAbilityFirst.contains(ability.getOriginalId())) {
- return ability;
- }
- if (triggerAutoOrderNameFirst.contains(ability.getRule())) {
- return ability;
- }
- if (triggerAutoOrderAbilityLast.contains(ability.getOriginalId())) {
- abilityOrderLast = ability;
- continue;
- }
- if (triggerAutoOrderNameLast.contains(ability.getRule())) {
- abilityOrderLast = ability;
- continue;
- }
- abilitiesWithNoOrderSet.add(ability);
- }
- if (abilitiesWithNoOrderSet.isEmpty()) {
- return abilityOrderLast;
- }
- if (abilitiesWithNoOrderSet.size() == 1) {
- return abilitiesWithNoOrderSet.iterator().next();
- }
-
- updateGameStatePriority("chooseTriggeredAbility", game);
+ String autoOrderRuleText = null;
+ boolean autoOrderUse = getUserData().isAutoOrderTrigger();
while (!abort) {
+ // try to set trigger auto order
+ List abilitiesWithNoOrderSet = new ArrayList<>();
+ TriggeredAbility abilityOrderLast = null;
+ for (TriggeredAbility ability : abilities) {
+ if (triggerAutoOrderAbilityFirst.contains(ability.getOriginalId())) {
+ return ability;
+ }
+ if (triggerAutoOrderNameFirst.contains(ability.getRule())) {
+ return ability;
+ }
+ if (triggerAutoOrderAbilityLast.contains(ability.getOriginalId())) {
+ abilityOrderLast = ability;
+ continue;
+ }
+ if (triggerAutoOrderNameLast.contains(ability.getRule())) {
+ abilityOrderLast = ability;
+ continue;
+ }
+ if (autoOrderUse) {
+ if (autoOrderRuleText == null) {
+ autoOrderRuleText = ability.getRule();
+ } else if (!ability.getRule().equals(autoOrderRuleText)) {
+ autoOrderUse = false;
+ }
+ }
+ abilitiesWithNoOrderSet.add(ability);
+ }
+ if (abilitiesWithNoOrderSet.isEmpty()) {
+ return abilityOrderLast;
+ }
+ if (abilitiesWithNoOrderSet.size() == 1 || autoOrderUse) {
+ return abilitiesWithNoOrderSet.iterator().next();
+ }
+ updateGameStatePriority("chooseTriggeredAbility", game);
game.fireSelectTargetTriggeredAbilityEvent(playerId, "Pick triggered ability (goes to the stack first)", abilitiesWithNoOrderSet);
waitForResponse(game);
if (response.getUUID() != null) {
@@ -779,8 +817,10 @@ public class HumanPlayer extends PlayerImpl {
public int announceXMana(int min, int max, String message, Game game, Ability ability) {
int xValue = 0;
updateGameStatePriority("announceXMana", game);
- game.fireGetAmountEvent(playerId, message, min, max);
- waitForIntegerResponse(game);
+ do {
+ game.fireGetAmountEvent(playerId, message, min, max);
+ waitForResponse(game);
+ } while (response.getInteger() == null && !abort);
if (response != null && response.getInteger() != null) {
xValue = response.getInteger();
}
@@ -791,8 +831,10 @@ public class HumanPlayer extends PlayerImpl {
public int announceXCost(int min, int max, String message, Game game, Ability ability, VariableCost variableCost) {
int xValue = 0;
updateGameStatePriority("announceXCost", game);
- game.fireGetAmountEvent(playerId, message, min, max);
- waitForIntegerResponse(game);
+ do {
+ game.fireGetAmountEvent(playerId, message, min, max);
+ waitForResponse(game);
+ } while (response.getInteger() == null && !abort);
if (response != null && response.getInteger() != null) {
xValue = response.getInteger();
}
@@ -1043,7 +1085,8 @@ public class HumanPlayer extends PlayerImpl {
protected void selectCombatGroup(UUID defenderId, UUID blockerId, Game game) {
updateGameStatePriority("selectCombatGroup", game);
TargetAttackingCreature target = new TargetAttackingCreature();
- game.fireSelectTargetEvent(playerId, addSecondLineWithObjectName("Select attacker to block", blockerId, game), target.possibleTargets(null, playerId, game), false, getOptions(target, null));
+ game.fireSelectTargetEvent(playerId, new MessageToClient("Select attacker to block", getRelatedObjectName(blockerId, game)),
+ target.possibleTargets(null, playerId, game), false, getOptions(target, null));
waitForResponse(game);
if (response.getBoolean() != null) {
// do nothing
@@ -1066,6 +1109,7 @@ public class HumanPlayer extends PlayerImpl {
int remainingDamage = damage;
while (remainingDamage > 0 && canRespond()) {
Target target = new TargetCreatureOrPlayer();
+ target.setNotTarget(true);
if (singleTargetName != null) {
target.setTargetName(singleTargetName);
}
@@ -1090,8 +1134,10 @@ public class HumanPlayer extends PlayerImpl {
@Override
public int getAmount(int min, int max, String message, Game game) {
updateGameStatePriority("getAmount", game);
- game.fireGetAmountEvent(playerId, message, min, max);
- waitForIntegerResponse(game);
+ do {
+ game.fireGetAmountEvent(playerId, message, min, max);
+ waitForResponse(game);
+ } while (response.getInteger() == null && !abort);
if (response != null && response.getInteger() != null) {
return response.getInteger();
} else {
@@ -1178,11 +1224,7 @@ public class HumanPlayer extends PlayerImpl {
if (!ability.getSourceId().equals(getCastSourceIdWithAlternateMana()) && ability.getManaCostsToPay().convertedManaCost() > 0) {
return true;
}
- if (ability instanceof ManaAbility) {
- return true;
- }
- // if ability has no mana costs you have to pick it from ability picker
- return false;
+ return ability instanceof ManaAbility;
}
return true;
}
@@ -1257,8 +1299,10 @@ public class HumanPlayer extends PlayerImpl {
@Override
public boolean choosePile(Outcome outcome, String message, List extends Card> pile1, List extends Card> pile2, Game game) {
updateGameStatePriority("choosePile", game);
- game.fireChoosePileEvent(playerId, message, pile1, pile2);
- waitForBooleanResponse(game);
+ do {
+ game.fireChoosePileEvent(playerId, message, pile1, pile2);
+ waitForResponse(game);
+ } while (response.getBoolean() == null && !abort);
if (!abort) {
return response.getBoolean();
}
@@ -1270,7 +1314,7 @@ public class HumanPlayer extends PlayerImpl {
synchronized (response) {
response.setString(responseString);
response.notify();
- log.debug("Got response string from player: " + getId());
+ logger.debug("Got response string from player: " + getId());
}
}
@@ -1280,7 +1324,7 @@ public class HumanPlayer extends PlayerImpl {
response.setManaType(manaType);
response.setResponseManaTypePlayerId(manaTypePlayerId);
response.notify();
- log.debug("Got response mana type from player: " + getId());
+ logger.debug("Got response mana type from player: " + getId());
}
}
@@ -1289,7 +1333,7 @@ public class HumanPlayer extends PlayerImpl {
synchronized (response) {
response.setUUID(responseUUID);
response.notify();
- log.debug("Got response UUID from player: " + getId());
+ logger.debug("Got response UUID from player: " + getId());
}
}
@@ -1298,7 +1342,7 @@ public class HumanPlayer extends PlayerImpl {
synchronized (response) {
response.setBoolean(responseBoolean);
response.notify();
- log.debug("Got response boolean from player: " + getId());
+ logger.debug("Got response boolean from player: " + getId());
}
}
@@ -1307,7 +1351,7 @@ public class HumanPlayer extends PlayerImpl {
synchronized (response) {
response.setInteger(responseInteger);
response.notify();
- log.debug("Got response integer from player: " + getId());
+ logger.debug("Got response integer from player: " + getId());
}
}
@@ -1316,7 +1360,7 @@ public class HumanPlayer extends PlayerImpl {
abort = true;
synchronized (response) {
response.notify();
- log.debug("Got cancel action from player: " + getId());
+ logger.debug("Got cancel action from player: " + getId());
}
}
@@ -1325,7 +1369,7 @@ public class HumanPlayer extends PlayerImpl {
synchronized (response) {
response.setInteger(0);
response.notify();
- log.debug("Got skip action from player: " + getId());
+ logger.debug("Got skip action from player: " + getId());
}
}
@@ -1336,7 +1380,7 @@ public class HumanPlayer extends PlayerImpl {
protected void updateGameStatePriority(String methodName, Game game) {
if (game.getState().getPriorityPlayerId() != null) { // don't do it if priority was set to null before (e.g. discard in cleanaup)
- log.debug("Setting game priority to " + getId() + " [" + methodName + "]");
+ logger.debug("Setting game priority to " + getId() + " [" + methodName + "]");
game.getState().setPriorityPlayerId(getId());
}
}
@@ -1354,11 +1398,43 @@ public class HumanPlayer extends PlayerImpl {
case TRIGGER_AUTO_ORDER_RESET_ALL:
setTriggerAutoOrder(playerAction, game, data);
break;
+ case REQUEST_AUTO_ANSWER_ID_NO:
+ case REQUEST_AUTO_ANSWER_ID_YES:
+ case REQUEST_AUTO_ANSWER_TEXT_NO:
+ case REQUEST_AUTO_ANSWER_TEXT_YES:
+ case REQUEST_AUTO_ANSWER_RESET_ALL:
+ setRequestAutoAnswer(playerAction, game, data);
+ break;
default:
super.sendPlayerAction(playerAction, game, data);
}
}
+ private void setRequestAutoAnswer(PlayerAction playerAction, Game game, Object data) {
+ if (playerAction.equals(REQUEST_AUTO_ANSWER_RESET_ALL)) {
+ requestAutoAnswerId.clear();
+ requestAutoAnswerText.clear();
+ return;
+ }
+ if (data instanceof String) {
+ String key = (String) data;
+ switch (playerAction) {
+ case REQUEST_AUTO_ANSWER_ID_NO:
+ requestAutoAnswerId.put(key, false);
+ break;
+ case REQUEST_AUTO_ANSWER_TEXT_NO:
+ requestAutoAnswerText.put(key, false);
+ break;
+ case REQUEST_AUTO_ANSWER_ID_YES:
+ requestAutoAnswerId.put(key, true);
+ break;
+ case REQUEST_AUTO_ANSWER_TEXT_YES:
+ requestAutoAnswerText.put(key, true);
+ break;
+ }
+ }
+ }
+
private void setTriggerAutoOrder(PlayerAction playerAction, Game game, Object data) {
if (playerAction.equals(TRIGGER_AUTO_ORDER_RESET_ALL)) {
triggerAutoOrderAbilityFirst.clear();
diff --git a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/pom.xml b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/pom.xml
index 06efa02a054..4bb3a3af1af 100644
--- a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/pom.xml
+++ b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/pom.xml
@@ -7,7 +7,7 @@
org.mage
mage-server-plugins
- 1.4.3
+ 1.4.4
mage-tournament-boosterdraft
diff --git a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/JimDavisCube.java b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/JimDavisCube.java
new file mode 100644
index 00000000000..cb363a30f89
--- /dev/null
+++ b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/cubes/JimDavisCube.java
@@ -0,0 +1,512 @@
+/*
+ * 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.tournament.cubes;
+
+import mage.game.draft.DraftCube;
+import mage.game.draft.DraftCube.CardIdentity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class JimDavisCube extends DraftCube {
+
+ public JimDavisCube() {
+ super("Jim Davis's Cube (469 cards)"); // https://docs.google.com/spreadsheets/d/1pZ3aQR-Kb5MmMDNh1sOtMt4vSrJEWNixyZDZrQSBJb4/edit#gid=0
+
+ cubeCards.add(new CardIdentity("Abbot of Keral Keep", ""));
+ cubeCards.add(new CardIdentity("Abrupt Decay", ""));
+ cubeCards.add(new CardIdentity("Absorb", ""));
+ cubeCards.add(new CardIdentity("Academy Ruins", ""));
+ cubeCards.add(new CardIdentity("Accorder Paladin", ""));
+ cubeCards.add(new CardIdentity("Advantageous Proclamation", ""));
+ cubeCards.add(new CardIdentity("AEther Vial", ""));
+ cubeCards.add(new CardIdentity("Agent of Acquisitions", ""));
+ cubeCards.add(new CardIdentity("Ajani Vengeant", ""));
+ cubeCards.add(new CardIdentity("Ancient Den", ""));
+ cubeCards.add(new CardIdentity("Ancient Tomb", ""));
+ cubeCards.add(new CardIdentity("Angel of Serenity", ""));
+ cubeCards.add(new CardIdentity("Animate Dead", ""));
+ cubeCards.add(new CardIdentity("Ankh of Mishra", ""));
+ cubeCards.add(new CardIdentity("Arcbound Ravager", ""));
+ cubeCards.add(new CardIdentity("Arid Mesa", ""));
+ cubeCards.add(new CardIdentity("Armageddon", ""));
+ cubeCards.add(new CardIdentity("Ashen Rider", ""));
+ cubeCards.add(new CardIdentity("Avacyn's Pilgrim", ""));
+ cubeCards.add(new CardIdentity("Avenger of Zendikar", ""));
+ cubeCards.add(new CardIdentity("Azorius Signet", ""));
+ cubeCards.add(new CardIdentity("Backup Plan", ""));
+ cubeCards.add(new CardIdentity("Badlands", ""));
+ cubeCards.add(new CardIdentity("Balance", ""));
+ cubeCards.add(new CardIdentity("Baleful Strix", ""));
+ cubeCards.add(new CardIdentity("Baneslayer Angel", ""));
+ cubeCards.add(new CardIdentity("Batterskull", ""));
+ cubeCards.add(new CardIdentity("Battle Screech", ""));
+ cubeCards.add(new CardIdentity("Battlefield Forge", ""));
+ cubeCards.add(new CardIdentity("Bayou", ""));
+ cubeCards.add(new CardIdentity("Bazaar of Baghdad", ""));
+ cubeCards.add(new CardIdentity("Birds of Paradise", ""));
+ cubeCards.add(new CardIdentity("Birthing Pod", ""));
+ cubeCards.add(new CardIdentity("Bitterblossom", ""));
+ cubeCards.add(new CardIdentity("Blackcleave Cliffs", ""));
+ cubeCards.add(new CardIdentity("Blade Splicer", ""));
+ cubeCards.add(new CardIdentity("Blightning", ""));
+ cubeCards.add(new CardIdentity("Blinkmoth Nexus", ""));
+ cubeCards.add(new CardIdentity("Blood Artist", ""));
+ cubeCards.add(new CardIdentity("Blood Crypt", ""));
+ cubeCards.add(new CardIdentity("Bloodbraid Elf", ""));
+ cubeCards.add(new CardIdentity("Bloodghast", ""));
+ cubeCards.add(new CardIdentity("Bloodsoaked Champion", ""));
+ cubeCards.add(new CardIdentity("Bloodstained Mire", ""));
+ cubeCards.add(new CardIdentity("Bonesplitter", ""));
+ cubeCards.add(new CardIdentity("Boros Charm", ""));
+ cubeCards.add(new CardIdentity("Boros Reckoner", ""));
+ cubeCards.add(new CardIdentity("Braids, Cabal Minion", ""));
+ cubeCards.add(new CardIdentity("Brain Freeze", ""));
+ cubeCards.add(new CardIdentity("Brainstorm", ""));
+ cubeCards.add(new CardIdentity("Breeding Pool", ""));
+ cubeCards.add(new CardIdentity("Brimaz, King of Oreskos", ""));
+ cubeCards.add(new CardIdentity("Broodmate Dragon", ""));
+ cubeCards.add(new CardIdentity("Cabal Ritual", ""));
+ cubeCards.add(new CardIdentity("Careful Study", ""));
+ cubeCards.add(new CardIdentity("Carrion Feeder", ""));
+ cubeCards.add(new CardIdentity("Celestial Colonnade", ""));
+ cubeCards.add(new CardIdentity("Chained to the Rocks", ""));
+ cubeCards.add(new CardIdentity("Chain Lightning", ""));
+ cubeCards.add(new CardIdentity("Champion of the Parish", ""));
+ cubeCards.add(new CardIdentity("Chandra's Phoenix", ""));
+ cubeCards.add(new CardIdentity("Chromatic Sphere", ""));
+ cubeCards.add(new CardIdentity("Chromatic Star", ""));
+ cubeCards.add(new CardIdentity("Chrome Mox", ""));
+ cubeCards.add(new CardIdentity("City of Brass", ""));
+ cubeCards.add(new CardIdentity("City of Traitors", ""));
+ cubeCards.add(new CardIdentity("Clifftop Retreat", ""));
+ cubeCards.add(new CardIdentity("Coalition Relic", ""));
+ cubeCards.add(new CardIdentity("Coercive Portal", ""));
+ cubeCards.add(new CardIdentity("Cogwork Librarian", ""));
+ cubeCards.add(new CardIdentity("Collected Company", ""));
+ cubeCards.add(new CardIdentity("Condescend", ""));
+ cubeCards.add(new CardIdentity("Copperline Gorge", ""));
+ cubeCards.add(new CardIdentity("Council's Judgment", ""));
+ cubeCards.add(new CardIdentity("Counterspell", ""));
+ cubeCards.add(new CardIdentity("Court Hussar", ""));
+ cubeCards.add(new CardIdentity("Cranial Plating", ""));
+ cubeCards.add(new CardIdentity("Creeping Tar Pit", ""));
+ cubeCards.add(new CardIdentity("Crop Rotation", ""));
+ cubeCards.add(new CardIdentity("Crucible of Worlds", ""));
+ cubeCards.add(new CardIdentity("Cruel Ultimatum", ""));
+ cubeCards.add(new CardIdentity("Cryptic Command", ""));
+ cubeCards.add(new CardIdentity("Curse of Shallow Graves", ""));
+ cubeCards.add(new CardIdentity("Cursed Scroll", ""));
+ cubeCards.add(new CardIdentity("Damnation", ""));
+ cubeCards.add(new CardIdentity("Dark Confidant", ""));
+ cubeCards.add(new CardIdentity("Dark Ritual", ""));
+ cubeCards.add(new CardIdentity("Darkslick Shores", ""));
+ cubeCards.add(new CardIdentity("Darksteel Citadel", ""));
+ cubeCards.add(new CardIdentity("Daze", ""));
+ cubeCards.add(new CardIdentity("Deal Broker", ""));
+ cubeCards.add(new CardIdentity("Deathrite Shaman", ""));
+ cubeCards.add(new CardIdentity("Delver of Secrets", ""));
+ cubeCards.add(new CardIdentity("Demonic Tutor", ""));
+ cubeCards.add(new CardIdentity("Deranged Hermit", ""));
+ cubeCards.add(new CardIdentity("Detention Sphere", ""));
+ cubeCards.add(new CardIdentity("Dig Through Time", ""));
+ cubeCards.add(new CardIdentity("Dimir Signet", ""));
+ cubeCards.add(new CardIdentity("Diregraf Ghoul", ""));
+ cubeCards.add(new CardIdentity("Dismember", ""));
+ cubeCards.add(new CardIdentity("Dragon Hunter", ""));
+ cubeCards.add(new CardIdentity("Dragonlord Atarka", ""));
+ cubeCards.add(new CardIdentity("Dream Halls", ""));
+ cubeCards.add(new CardIdentity("Dryad Militant", ""));
+ cubeCards.add(new CardIdentity("Dust Bowl", ""));
+ cubeCards.add(new CardIdentity("Dwarven Blastminer", ""));
+ cubeCards.add(new CardIdentity("Edric, Spymaster of Trest", ""));
+ cubeCards.add(new CardIdentity("Eidolon of the Great Revel", ""));
+ cubeCards.add(new CardIdentity("Electrolyze", ""));
+ cubeCards.add(new CardIdentity("Elspeth, Knight-Errant", ""));
+ cubeCards.add(new CardIdentity("Emrakul, the Aeons Torn", ""));
+ cubeCards.add(new CardIdentity("Engineered Explosives", ""));
+ cubeCards.add(new CardIdentity("Enlightened Tutor", ""));
+ cubeCards.add(new CardIdentity("Entomb", ""));
+ cubeCards.add(new CardIdentity("Etched Champion", ""));
+ cubeCards.add(new CardIdentity("Eternal Witness", ""));
+ cubeCards.add(new CardIdentity("Etherium Sculptor", ""));
+ cubeCards.add(new CardIdentity("Ethersworn Canonist", ""));
+ cubeCards.add(new CardIdentity("Eureka", ""));
+ cubeCards.add(new CardIdentity("Everflowing Chalice", ""));
+ cubeCards.add(new CardIdentity("Expedition Map", ""));
+ cubeCards.add(new CardIdentity("Experiment One", ""));
+ cubeCards.add(new CardIdentity("Explore", ""));
+ cubeCards.add(new CardIdentity("Fact or Fiction", ""));
+ cubeCards.add(new CardIdentity("Faithless Looting", ""));
+ cubeCards.add(new CardIdentity("Falkenrath Aristocrat", ""));
+ cubeCards.add(new CardIdentity("Far // Away", ""));
+ cubeCards.add(new CardIdentity("Fastbond", ""));
+ cubeCards.add(new CardIdentity("Fauna Shaman", ""));
+ cubeCards.add(new CardIdentity("Figure of Destiny", ""));
+ cubeCards.add(new CardIdentity("Fire // Ice", ""));
+ cubeCards.add(new CardIdentity("Fireblast", ""));
+ cubeCards.add(new CardIdentity("Firebolt", ""));
+ cubeCards.add(new CardIdentity("Firedrinker Satyr", ""));
+ cubeCards.add(new CardIdentity("Firestorm", ""));
+ cubeCards.add(new CardIdentity("Flagstones of Trokair", ""));
+ cubeCards.add(new CardIdentity("Flametongue Kavu", ""));
+ cubeCards.add(new CardIdentity("Flesh Carver", ""));
+ cubeCards.add(new CardIdentity("Flickerwisp", ""));
+ cubeCards.add(new CardIdentity("Flinthoof Boar", ""));
+ cubeCards.add(new CardIdentity("Flooded Strand", ""));
+ cubeCards.add(new CardIdentity("Force of Will", ""));
+ cubeCards.add(new CardIdentity("Forgotten Cave", ""));
+ cubeCards.add(new CardIdentity("Frantic Search", ""));
+ cubeCards.add(new CardIdentity("Frogmite", ""));
+ cubeCards.add(new CardIdentity("Fulminator Mage", ""));
+ cubeCards.add(new CardIdentity("Gaea's Cradle", ""));
+ cubeCards.add(new CardIdentity("Galvanic Blast", ""));
+ cubeCards.add(new CardIdentity("Gamble", ""));
+ cubeCards.add(new CardIdentity("Garruk Wildspeaker", ""));
+ cubeCards.add(new CardIdentity("Geist of Saint Traft", ""));
+ cubeCards.add(new CardIdentity("Gemstone Mine", ""));
+ cubeCards.add(new CardIdentity("Genesis Hydra", ""));
+ cubeCards.add(new CardIdentity("Ghitu Encampment", ""));
+ cubeCards.add(new CardIdentity("Ghor-Clan Rampager", ""));
+ cubeCards.add(new CardIdentity("Gifts Ungiven", ""));
+ cubeCards.add(new CardIdentity("Gilded Lotus", ""));
+ cubeCards.add(new CardIdentity("Gitaxian Probe", ""));
+ cubeCards.add(new CardIdentity("Glint Hawk Idol", ""));
+ cubeCards.add(new CardIdentity("Gnarled Scarhide", ""));
+ cubeCards.add(new CardIdentity("Go for the Throat", ""));
+ cubeCards.add(new CardIdentity("Goblin Electromancer", ""));
+ cubeCards.add(new CardIdentity("Goblin Guide", ""));
+ cubeCards.add(new CardIdentity("Goblin Rabblemaster", ""));
+ cubeCards.add(new CardIdentity("Goblin Welder", ""));
+ cubeCards.add(new CardIdentity("Godless Shrine", ""));
+ cubeCards.add(new CardIdentity("Golgari Rot Farm", ""));
+ cubeCards.add(new CardIdentity("Grave Titan", ""));
+ cubeCards.add(new CardIdentity("Gravecrawler", ""));
+ cubeCards.add(new CardIdentity("Great Furnace", ""));
+ cubeCards.add(new CardIdentity("Greater Gargadon", ""));
+ cubeCards.add(new CardIdentity("Green Sun's Zenith", ""));
+ cubeCards.add(new CardIdentity("Grim Lavamancer", ""));
+ cubeCards.add(new CardIdentity("Grim Monolith", ""));
+ cubeCards.add(new CardIdentity("Griselbrand", ""));
+ cubeCards.add(new CardIdentity("Grisly Salvage", ""));
+ cubeCards.add(new CardIdentity("Gush", ""));
+ cubeCards.add(new CardIdentity("Hallowed Fountain", ""));
+ cubeCards.add(new CardIdentity("Hallowed Spiritkeeper", ""));
+ cubeCards.add(new CardIdentity("Hangarback Walker", ""));
+ cubeCards.add(new CardIdentity("Harmonize", ""));
+ cubeCards.add(new CardIdentity("Heartbeat of Spring", ""));
+ cubeCards.add(new CardIdentity("Hellrider", ""));
+ cubeCards.add(new CardIdentity("Hellspark Elemental", ""));
+ cubeCards.add(new CardIdentity("Helm of Awakening", ""));
+ cubeCards.add(new CardIdentity("Hero of Bladehold", ""));
+ cubeCards.add(new CardIdentity("Hex Parasite", ""));
+ cubeCards.add(new CardIdentity("Hinterland Harbor", ""));
+ cubeCards.add(new CardIdentity("Hokori, Dust Drinker", ""));
+ cubeCards.add(new CardIdentity("Hooting Mandrills", ""));
+ cubeCards.add(new CardIdentity("Horizon Canopy", ""));
+ cubeCards.add(new CardIdentity("Hymn to Tourach", ""));
+ cubeCards.add(new CardIdentity("Icefeather Aven", ""));
+ cubeCards.add(new CardIdentity("Imperial Recruiter", ""));
+ cubeCards.add(new CardIdentity("Imperial Seal", ""));
+ cubeCards.add(new CardIdentity("Inferno Titan", ""));
+ cubeCards.add(new CardIdentity("Inquisition of Kozilek", ""));
+ cubeCards.add(new CardIdentity("Isamaru, Hound of Konda", ""));
+ cubeCards.add(new CardIdentity("Isochron Scepter", ""));
+ cubeCards.add(new CardIdentity("Isolated Chapel", ""));
+ cubeCards.add(new CardIdentity("Izzet Signet", ""));
+ cubeCards.add(new CardIdentity("Jace, the Mind Sculptor", ""));
+ cubeCards.add(new CardIdentity("Jace, Vryn's Prodigy", ""));
+ cubeCards.add(new CardIdentity("Jeskai Ascendancy", ""));
+ cubeCards.add(new CardIdentity("Joraga Treespeaker", ""));
+ cubeCards.add(new CardIdentity("Kami of Ancient Law", ""));
+ cubeCards.add(new CardIdentity("Karakas", ""));
+ cubeCards.add(new CardIdentity("Karn Liberated", ""));
+ cubeCards.add(new CardIdentity("Keranos, God of Storms", ""));
+ cubeCards.add(new CardIdentity("Kessig Wolf Run", ""));
+ cubeCards.add(new CardIdentity("Kiki-Jiki, Mirror Breaker", ""));
+ cubeCards.add(new CardIdentity("Kira, Great Glass-Spinner", ""));
+ cubeCards.add(new CardIdentity("Kird Ape", ""));
+ cubeCards.add(new CardIdentity("Kitchen Finks", ""));
+ cubeCards.add(new CardIdentity("Knight of the Reliquary", ""));
+ cubeCards.add(new CardIdentity("Kolaghan's Command", ""));
+ cubeCards.add(new CardIdentity("Kytheon, Hero of Akros", ""));
+ cubeCards.add(new CardIdentity("Land Tax", ""));
+ cubeCards.add(new CardIdentity("Life from the Loam", ""));
+ cubeCards.add(new CardIdentity("Lightning Bolt", ""));
+ cubeCards.add(new CardIdentity("Lightning Helix", ""));
+ cubeCards.add(new CardIdentity("Lightning Mauler", ""));
+ cubeCards.add(new CardIdentity("Liliana of the Veil", ""));
+ cubeCards.add(new CardIdentity("Lim-Dul's Vault", ""));
+ cubeCards.add(new CardIdentity("Lingering Souls", ""));
+ cubeCards.add(new CardIdentity("Lion's Eye Diamond", ""));
+ cubeCards.add(new CardIdentity("Llanowar Elves", ""));
+ cubeCards.add(new CardIdentity("Loam Lion", ""));
+ cubeCards.add(new CardIdentity("Lodestone Golem", ""));
+ cubeCards.add(new CardIdentity("Lore Seeker", ""));
+ cubeCards.add(new CardIdentity("Lotus Cobra", ""));
+ cubeCards.add(new CardIdentity("Lotus Petal", ""));
+ cubeCards.add(new CardIdentity("Maelstrom Pulse", ""));
+ cubeCards.add(new CardIdentity("Magma Jet", ""));
+ cubeCards.add(new CardIdentity("Mana Confluence", ""));
+ cubeCards.add(new CardIdentity("Mana Leak", ""));
+ cubeCards.add(new CardIdentity("Mardu Woe-Reaper", ""));
+ cubeCards.add(new CardIdentity("Marsh Flats", ""));
+ cubeCards.add(new CardIdentity("Martial Coup", ""));
+ cubeCards.add(new CardIdentity("Master of Etherium", ""));
+ cubeCards.add(new CardIdentity("Maze of Ith", ""));
+ cubeCards.add(new CardIdentity("Meloku the Clouded Mirror", ""));
+ cubeCards.add(new CardIdentity("Memnite", ""));
+ cubeCards.add(new CardIdentity("Memory Jar", ""));
+ cubeCards.add(new CardIdentity("Memory Lapse", ""));
+ cubeCards.add(new CardIdentity("Mentor of the Meek", ""));
+ cubeCards.add(new CardIdentity("Metalworker", ""));
+ cubeCards.add(new CardIdentity("Mind Stone", ""));
+ cubeCards.add(new CardIdentity("Mindslaver", ""));
+ cubeCards.add(new CardIdentity("Mirari's Wake", ""));
+ cubeCards.add(new CardIdentity("Mishra's Factory", ""));
+ cubeCards.add(new CardIdentity("Misty Rainforest", ""));
+ cubeCards.add(new CardIdentity("Molten Rain", ""));
+ cubeCards.add(new CardIdentity("Moment's Peace", ""));
+ cubeCards.add(new CardIdentity("Monastery Mentor", ""));
+ cubeCards.add(new CardIdentity("Monastery Swiftspear", ""));
+ cubeCards.add(new CardIdentity("Mother of Runes", ""));
+ cubeCards.add(new CardIdentity("Mox Diamond", ""));
+ cubeCards.add(new CardIdentity("Mox Opal", ""));
+ cubeCards.add(new CardIdentity("Mulldrifter", ""));
+ cubeCards.add(new CardIdentity("Murderous Cut", ""));
+ cubeCards.add(new CardIdentity("Mutavault", ""));
+ cubeCards.add(new CardIdentity("Myr Battlesphere", ""));
+ cubeCards.add(new CardIdentity("Myrsmith", ""));
+ cubeCards.add(new CardIdentity("Mystical Tutor", ""));
+ cubeCards.add(new CardIdentity("Necropotence", ""));
+ cubeCards.add(new CardIdentity("Nether Void", ""));
+ cubeCards.add(new CardIdentity("Nimble Mongoose", ""));
+ cubeCards.add(new CardIdentity("Noble Hierarch", ""));
+ cubeCards.add(new CardIdentity("Oath of Druids", ""));
+ cubeCards.add(new CardIdentity("Oblivion Ring", ""));
+ cubeCards.add(new CardIdentity("Ohran Viper", ""));
+ cubeCards.add(new CardIdentity("Oona's Prowler", ""));
+ cubeCards.add(new CardIdentity("Ophiomancer", ""));
+ cubeCards.add(new CardIdentity("Opposition", ""));
+ cubeCards.add(new CardIdentity("Oracle of Mul Daya", ""));
+ cubeCards.add(new CardIdentity("Orzhov Signet", ""));
+ cubeCards.add(new CardIdentity("Outpost Siege", ""));
+ cubeCards.add(new CardIdentity("Overgrown Tomb", ""));
+ cubeCards.add(new CardIdentity("Pack Rat", ""));
+ cubeCards.add(new CardIdentity("Path to Exile", ""));
+ cubeCards.add(new CardIdentity("Pernicious Deed", ""));
+ cubeCards.add(new CardIdentity("Phantasmal Image", ""));
+ cubeCards.add(new CardIdentity("Phyrexian Arena", ""));
+ cubeCards.add(new CardIdentity("Phyrexian Metamorph", ""));
+ cubeCards.add(new CardIdentity("Phyrexian Revoker", ""));
+ cubeCards.add(new CardIdentity("Phyrexian Tower", ""));
+ cubeCards.add(new CardIdentity("Pia and Kiran Nalaar", ""));
+ cubeCards.add(new CardIdentity("Plateau", ""));
+ cubeCards.add(new CardIdentity("Plow Under", ""));
+ cubeCards.add(new CardIdentity("Polluted Delta", ""));
+ cubeCards.add(new CardIdentity("Ponder", ""));
+ cubeCards.add(new CardIdentity("Porcelain Legionnaire", ""));
+ cubeCards.add(new CardIdentity("Power Play", ""));
+ cubeCards.add(new CardIdentity("Precinct Captain", ""));
+ cubeCards.add(new CardIdentity("Precursor Golem", ""));
+ cubeCards.add(new CardIdentity("Preordain", ""));
+ cubeCards.add(new CardIdentity("Primeval Titan", ""));
+ cubeCards.add(new CardIdentity("Prismatic Lens", ""));
+ cubeCards.add(new CardIdentity("Prophetic Bolt", ""));
+ cubeCards.add(new CardIdentity("Putrid Imp", ""));
+ cubeCards.add(new CardIdentity("Qasali Pridemage", ""));
+ cubeCards.add(new CardIdentity("Rakdos Cackler", ""));
+ cubeCards.add(new CardIdentity("Rancor", ""));
+ cubeCards.add(new CardIdentity("Ranger of Eos", ""));
+ cubeCards.add(new CardIdentity("Ratchet Bomb", ""));
+ cubeCards.add(new CardIdentity("Ravenous Baboons", ""));
+ cubeCards.add(new CardIdentity("Razorverge Thicket", ""));
+ cubeCards.add(new CardIdentity("Reanimate", ""));
+ cubeCards.add(new CardIdentity("Reckless Charge", ""));
+ cubeCards.add(new CardIdentity("Reckless Waif", ""));
+ cubeCards.add(new CardIdentity("Reclamation Sage", ""));
+ cubeCards.add(new CardIdentity("Recurring Nightmare", ""));
+ cubeCards.add(new CardIdentity("Regrowth", ""));
+ cubeCards.add(new CardIdentity("Relic Seeker", ""));
+ cubeCards.add(new CardIdentity("Remand", ""));
+ cubeCards.add(new CardIdentity("Restoration Angel", ""));
+ cubeCards.add(new CardIdentity("Reveillark", ""));
+ cubeCards.add(new CardIdentity("Rishadan Port", ""));
+ cubeCards.add(new CardIdentity("Rofellos, Llanowar Emissary", ""));
+ cubeCards.add(new CardIdentity("Rude Awakening", ""));
+ cubeCards.add(new CardIdentity("Sacred Foundry", ""));
+ cubeCards.add(new CardIdentity("Sagu Mauler", ""));
+ cubeCards.add(new CardIdentity("Sakura-Tribe Elder", ""));
+ cubeCards.add(new CardIdentity("Sarcomancy", ""));
+ cubeCards.add(new CardIdentity("Sarkhan, the Dragonspeaker", ""));
+ cubeCards.add(new CardIdentity("Savannah", ""));
+ cubeCards.add(new CardIdentity("Scalding Tarn", ""));
+ cubeCards.add(new CardIdentity("Scavenging Ooze", ""));
+ cubeCards.add(new CardIdentity("Scroll Rack", ""));
+ cubeCards.add(new CardIdentity("Scrubland", ""));
+ cubeCards.add(new CardIdentity("Seachrome Coast", ""));
+ cubeCards.add(new CardIdentity("Searing Blaze", ""));
+ cubeCards.add(new CardIdentity("Seat of the Synod", ""));
+ cubeCards.add(new CardIdentity("Seeker of the Way", ""));
+ cubeCards.add(new CardIdentity("Seething Song", ""));
+ cubeCards.add(new CardIdentity("Sensei's Divining Top", ""));
+ cubeCards.add(new CardIdentity("Shadowmage Infiltrator", ""));
+ cubeCards.add(new CardIdentity("Shardless Agent", ""));
+ cubeCards.add(new CardIdentity("Shelldock Isle", ""));
+ cubeCards.add(new CardIdentity("Show and Tell", ""));
+ cubeCards.add(new CardIdentity("Shrapnel Blast", ""));
+ cubeCards.add(new CardIdentity("Shriekmaw", ""));
+ cubeCards.add(new CardIdentity("Siege Rhino", ""));
+ cubeCards.add(new CardIdentity("Signal Pest", ""));
+ cubeCards.add(new CardIdentity("Simic Growth Chamber", ""));
+ cubeCards.add(new CardIdentity("Simic Signet", ""));
+ cubeCards.add(new CardIdentity("Sinkhole", ""));
+ cubeCards.add(new CardIdentity("Skullclamp", ""));
+ cubeCards.add(new CardIdentity("Skyshroud Elite", ""));
+ cubeCards.add(new CardIdentity("Smallpox", ""));
+ cubeCards.add(new CardIdentity("Smokestack", ""));
+ cubeCards.add(new CardIdentity("Snapcaster Mage", ""));
+ cubeCards.add(new CardIdentity("Sneak Attack", ""));
+ cubeCards.add(new CardIdentity("Soldier of the Pantheon", ""));
+ cubeCards.add(new CardIdentity("Solemn Simulacrum", ""));
+ cubeCards.add(new CardIdentity("Sorin, Lord of Innistrad", ""));
+ cubeCards.add(new CardIdentity("Spear of Heliod", ""));
+ cubeCards.add(new CardIdentity("Spectral Procession", ""));
+ cubeCards.add(new CardIdentity("Spellskite", ""));
+ cubeCards.add(new CardIdentity("Sphere of Resistance", ""));
+ cubeCards.add(new CardIdentity("Sphinx's Revelation", ""));
+ cubeCards.add(new CardIdentity("Squee, Goblin Nabob", ""));
+ cubeCards.add(new CardIdentity("Standstill", ""));
+ cubeCards.add(new CardIdentity("Steam Vents", ""));
+ cubeCards.add(new CardIdentity("Steel Overseer", ""));
+ cubeCards.add(new CardIdentity("Steppe Lynx", ""));
+ cubeCards.add(new CardIdentity("Stoke the Flames", ""));
+ cubeCards.add(new CardIdentity("Stomping Ground", ""));
+ cubeCards.add(new CardIdentity("Stoneforge Mystic", ""));
+ cubeCards.add(new CardIdentity("Strangleroot Geist", ""));
+ cubeCards.add(new CardIdentity("Stratus Dancer", ""));
+ cubeCards.add(new CardIdentity("Strip Mine", ""));
+ cubeCards.add(new CardIdentity("Stromkirk Noble", ""));
+ cubeCards.add(new CardIdentity("Student of Warfare", ""));
+ cubeCards.add(new CardIdentity("Sudden Demise", ""));
+ cubeCards.add(new CardIdentity("Sudden Shock", ""));
+ cubeCards.add(new CardIdentity("Sulfur Falls", ""));
+ cubeCards.add(new CardIdentity("Sulfuric Vortex", ""));
+ cubeCards.add(new CardIdentity("Sun Titan", ""));
+ cubeCards.add(new CardIdentity("Sundering Titan", ""));
+ cubeCards.add(new CardIdentity("Survival of the Fittest", ""));
+ cubeCards.add(new CardIdentity("Sword of Feast and Famine", ""));
+ cubeCards.add(new CardIdentity("Sword of Fire and Ice", ""));
+ cubeCards.add(new CardIdentity("Swords to Plowshares", ""));
+ cubeCards.add(new CardIdentity("Sylvan Library", ""));
+ cubeCards.add(new CardIdentity("Taiga", ""));
+ cubeCards.add(new CardIdentity("Tangle Wire", ""));
+ cubeCards.add(new CardIdentity("Tarmogoyf", ""));
+ cubeCards.add(new CardIdentity("Tasigur, the Golden Fang", ""));
+ cubeCards.add(new CardIdentity("Teetering Peaks", ""));
+ cubeCards.add(new CardIdentity("Temple Garden", ""));
+ cubeCards.add(new CardIdentity("Temple of Epiphany", ""));
+ cubeCards.add(new CardIdentity("Temple of Malice", ""));
+ cubeCards.add(new CardIdentity("Temple of Silence", ""));
+ cubeCards.add(new CardIdentity("Tendrils of Agony", ""));
+ cubeCards.add(new CardIdentity("Terastodon", ""));
+ cubeCards.add(new CardIdentity("Terminate", ""));
+ cubeCards.add(new CardIdentity("Tezzeret, Agent of Bolas", ""));
+ cubeCards.add(new CardIdentity("Thalia, Guardian of Thraben", ""));
+ cubeCards.add(new CardIdentity("The Abyss", ""));
+ cubeCards.add(new CardIdentity("The Tabernacle at Pendrell Vale", ""));
+ cubeCards.add(new CardIdentity("Thirst for Knowledge", ""));
+ cubeCards.add(new CardIdentity("Thopter Engineer", ""));
+ cubeCards.add(new CardIdentity("Thopter Spy Network", ""));
+ cubeCards.add(new CardIdentity("Thoughtseize", ""));
+ cubeCards.add(new CardIdentity("Thragtusk", ""));
+ cubeCards.add(new CardIdentity("Thran Dynamo", ""));
+ cubeCards.add(new CardIdentity("Thundermaw Hellkite", ""));
+ cubeCards.add(new CardIdentity("Tidehollow Sculler", ""));
+ cubeCards.add(new CardIdentity("Time Spiral", ""));
+ cubeCards.add(new CardIdentity("Timetwister", ""));
+ cubeCards.add(new CardIdentity("Tin Street Hooligan", ""));
+ cubeCards.add(new CardIdentity("Tinker", ""));
+ cubeCards.add(new CardIdentity("Tolarian Academy", ""));
+ cubeCards.add(new CardIdentity("Tooth and Nail", ""));
+ cubeCards.add(new CardIdentity("Tormented Hero", ""));
+ cubeCards.add(new CardIdentity("Tranquil Thicket", ""));
+ cubeCards.add(new CardIdentity("Treachery", ""));
+ cubeCards.add(new CardIdentity("Treasure Cruise", ""));
+ cubeCards.add(new CardIdentity("Tree of Tales", ""));
+ cubeCards.add(new CardIdentity("Treetop Village", ""));
+ cubeCards.add(new CardIdentity("Trinket Mage", ""));
+ cubeCards.add(new CardIdentity("Tropical Island", ""));
+ cubeCards.add(new CardIdentity("Trygon Predator", ""));
+ cubeCards.add(new CardIdentity("Tundra", ""));
+ cubeCards.add(new CardIdentity("Turnabout", ""));
+ cubeCards.add(new CardIdentity("Ugin, the Spirit Dragon", ""));
+ cubeCards.add(new CardIdentity("Umezawa's Jitte", ""));
+ cubeCards.add(new CardIdentity("Underground Sea", ""));
+ cubeCards.add(new CardIdentity("Unexpectedly Absent", ""));
+ cubeCards.add(new CardIdentity("Upheaval", ""));
+ cubeCards.add(new CardIdentity("Urborg, Tomb of Yawgmoth", ""));
+ cubeCards.add(new CardIdentity("Vampire Lacerator", ""));
+ cubeCards.add(new CardIdentity("Vampiric Tutor", ""));
+ cubeCards.add(new CardIdentity("Vault of Whispers", ""));
+ cubeCards.add(new CardIdentity("Vault Skirge", ""));
+ cubeCards.add(new CardIdentity("Vedalken Shackles", ""));
+ cubeCards.add(new CardIdentity("Vendilion Clique", ""));
+ cubeCards.add(new CardIdentity("Vengevine", ""));
+ cubeCards.add(new CardIdentity("Venser, Shaper Savant", ""));
+ cubeCards.add(new CardIdentity("Verdant Catacombs", ""));
+ cubeCards.add(new CardIdentity("Vindicate", ""));
+ cubeCards.add(new CardIdentity("Volcanic Island", ""));
+ cubeCards.add(new CardIdentity("Volrath's Stronghold", ""));
+ cubeCards.add(new CardIdentity("Voltaic Key", ""));
+ cubeCards.add(new CardIdentity("Wall of Blossoms", ""));
+ cubeCards.add(new CardIdentity("Wall of Omens", ""));
+ cubeCards.add(new CardIdentity("Wall of Roots", ""));
+ cubeCards.add(new CardIdentity("Wasteland", ""));
+ cubeCards.add(new CardIdentity("Waterfront Bouncer", ""));
+ cubeCards.add(new CardIdentity("Watery Grave", ""));
+ cubeCards.add(new CardIdentity("Wheel of Fortune", ""));
+ cubeCards.add(new CardIdentity("Whisperwood Elemental", ""));
+ cubeCards.add(new CardIdentity("Wild Nacatl", ""));
+ cubeCards.add(new CardIdentity("Wildfire", ""));
+ cubeCards.add(new CardIdentity("Windbrisk Heights", ""));
+ cubeCards.add(new CardIdentity("Windswept Heath", ""));
+ cubeCards.add(new CardIdentity("Winter Orb", ""));
+ cubeCards.add(new CardIdentity("Wooded Foothills", ""));
+ cubeCards.add(new CardIdentity("Woodland Cemetery", ""));
+ cubeCards.add(new CardIdentity("Worm Harvest", ""));
+ cubeCards.add(new CardIdentity("Wrath of God", ""));
+ cubeCards.add(new CardIdentity("Wurmcoil Engine", ""));
+ cubeCards.add(new CardIdentity("Xathrid Necromancer", ""));
+ cubeCards.add(new CardIdentity("Yawgmoth's Will", ""));
+ cubeCards.add(new CardIdentity("Young Pyromancer", ""));
+ cubeCards.add(new CardIdentity("Zombie Cutthroat", ""));
+ cubeCards.add(new CardIdentity("Zurgo Bellstriker", ""));
+ }
+}
diff --git a/Mage.Server.Plugins/Mage.Tournament.Constructed/pom.xml b/Mage.Server.Plugins/Mage.Tournament.Constructed/pom.xml
index 884159dba8a..ece1bd9e9ef 100644
--- a/Mage.Server.Plugins/Mage.Tournament.Constructed/pom.xml
+++ b/Mage.Server.Plugins/Mage.Tournament.Constructed/pom.xml
@@ -7,7 +7,7 @@
org.mage
mage-server-plugins
- 1.4.3
+ 1.4.4
mage-tournament-constructed
diff --git a/Mage.Server.Plugins/Mage.Tournament.Sealed/pom.xml b/Mage.Server.Plugins/Mage.Tournament.Sealed/pom.xml
index 30abbd2009c..7b3ed663f08 100644
--- a/Mage.Server.Plugins/Mage.Tournament.Sealed/pom.xml
+++ b/Mage.Server.Plugins/Mage.Tournament.Sealed/pom.xml
@@ -7,7 +7,7 @@
org.mage
mage-server-plugins
- 1.4.3
+ 1.4.4
mage-tournament-sealed
diff --git a/Mage.Server.Plugins/pom.xml b/Mage.Server.Plugins/pom.xml
index 49073190dca..590c8fbc00d 100644
--- a/Mage.Server.Plugins/pom.xml
+++ b/Mage.Server.Plugins/pom.xml
@@ -6,7 +6,7 @@
org.mage
mage-root
- 1.4.3
+ 1.4.4
mage-server-plugins
diff --git a/Mage.Server.Tests/pom.xml b/Mage.Server.Tests/pom.xml
index 1eb763cc402..86f9ba4ac36 100644
--- a/Mage.Server.Tests/pom.xml
+++ b/Mage.Server.Tests/pom.xml
@@ -5,7 +5,7 @@
org.mage
mage-root
- 1.4.3
+ 1.4.4
mage-server-tests
diff --git a/Mage.Server/config/config.xml b/Mage.Server/config/config.xml
index ed3c5934d05..1f6ee48d304 100644
--- a/Mage.Server/config/config.xml
+++ b/Mage.Server/config/config.xml
@@ -56,6 +56,7 @@
+
@@ -70,8 +71,8 @@
-
+
diff --git a/Mage.Server/pom.xml b/Mage.Server/pom.xml
index 0a27e589d6a..faf30a99c6a 100644
--- a/Mage.Server/pom.xml
+++ b/Mage.Server/pom.xml
@@ -6,7 +6,7 @@
org.mage
mage-root
- 1.4.3
+ 1.4.4
mage-server
diff --git a/Mage.Server/release/config/config.xml b/Mage.Server/release/config/config.xml
index b551d9672de..6d2727eae67 100644
--- a/Mage.Server/release/config/config.xml
+++ b/Mage.Server/release/config/config.xml
@@ -42,6 +42,7 @@
+
@@ -56,8 +57,8 @@
-
+
diff --git a/Mage.Server/src/main/java/mage/server/Session.java b/Mage.Server/src/main/java/mage/server/Session.java
index 7daed680633..5c2e8f76cf1 100644
--- a/Mage.Server/src/main/java/mage/server/Session.java
+++ b/Mage.Server/src/main/java/mage/server/Session.java
@@ -163,7 +163,9 @@ public class Session {
userDataView.isShowAbilityPickerForced(), userDataView.isAllowRequestShowHandCards(),
userDataView.confirmEmptyManaPool(), userDataView.getUserSkipPrioritySteps(),
userDataView.getFlagName(), userDataView.askMoveToGraveOrder(),
- userDataView.isManaPoolAutomatic(), userDataView.isAllowRequestShowHandCards());
+ userDataView.isManaPoolAutomatic(), userDataView.isAllowRequestShowHandCards(),
+ userDataView.isPassPriorityCast(), userDataView.isPassPriorityActivation(),
+ userDataView.isAutoOrderTrigger());
user.setUserData(userData);
} else {
if (userData.getAvatarId() == 51) { // Update special avatar if first avatar is selected
diff --git a/Mage.Sets/pom.xml b/Mage.Sets/pom.xml
index a206bff7596..bf208a1fcc7 100644
--- a/Mage.Sets/pom.xml
+++ b/Mage.Sets/pom.xml
@@ -7,7 +7,7 @@
org.mage
mage-root
- 1.4.3
+ 1.4.4
org.mage
diff --git a/Mage.Sets/src/mage/sets/alliances/BalduvianWarMakers1.java b/Mage.Sets/src/mage/sets/alliances/BalduvianWarMakers1.java
new file mode 100644
index 00000000000..3922ab3d508
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/BalduvianWarMakers1.java
@@ -0,0 +1,66 @@
+/*
+ * 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.sets.alliances;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.keyword.HasteAbility;
+import mage.abilities.keyword.RampageAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class BalduvianWarMakers1 extends CardImpl {
+
+ public BalduvianWarMakers1(UUID ownerId) {
+ super(ownerId, 97, "Balduvian War-Makers", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{4}{R}");
+ this.expansionSetCode = "ALL";
+ this.subtype.add("Human");
+ this.subtype.add("Barbarian");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // Haste
+ this.addAbility(HasteAbility.getInstance());
+ // Rampage 1
+ this.addAbility(new RampageAbility(1));
+ }
+
+ public BalduvianWarMakers1(final BalduvianWarMakers1 card) {
+ super(card);
+ }
+
+ @Override
+ public BalduvianWarMakers1 copy() {
+ return new BalduvianWarMakers1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/BalduvianWarMakers2.java b/Mage.Sets/src/mage/sets/alliances/BalduvianWarMakers2.java
new file mode 100644
index 00000000000..175ba8a2141
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/BalduvianWarMakers2.java
@@ -0,0 +1,51 @@
+/*
+ * 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.sets.alliances;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class BalduvianWarMakers2 extends BalduvianWarMakers1 {
+
+ public BalduvianWarMakers2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 98;
+ }
+
+ public BalduvianWarMakers2(final BalduvianWarMakers2 card) {
+ super(card);
+ }
+
+ @Override
+ public BalduvianWarMakers2 copy() {
+ return new BalduvianWarMakers2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/GorillaBerserkers1.java b/Mage.Sets/src/mage/sets/alliances/GorillaBerserkers1.java
new file mode 100644
index 00000000000..9c5d4381512
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/GorillaBerserkers1.java
@@ -0,0 +1,71 @@
+/*
+ * 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.sets.alliances;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.common.combat.CantBeBlockedByOneEffect;
+import mage.abilities.keyword.RampageAbility;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class GorillaBerserkers1 extends CardImpl {
+
+ public GorillaBerserkers1(UUID ownerId) {
+ super(ownerId, 75, "Gorilla Berserkers", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{G}{G}");
+ this.expansionSetCode = "ALL";
+ this.subtype.add("Ape");
+ this.subtype.add("Berserker");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(3);
+
+ // Trample
+ this.addAbility(TrampleAbility.getInstance());
+ // Rampage 2
+ this.addAbility(new RampageAbility(2));
+ // Gorilla Berserkers can't be blocked except by three or more creatures.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBeBlockedByOneEffect(3)));
+ }
+
+ public GorillaBerserkers1(final GorillaBerserkers1 card) {
+ super(card);
+ }
+
+ @Override
+ public GorillaBerserkers1 copy() {
+ return new GorillaBerserkers1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/GorillaBerserkers2.java b/Mage.Sets/src/mage/sets/alliances/GorillaBerserkers2.java
new file mode 100644
index 00000000000..1991e685628
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/GorillaBerserkers2.java
@@ -0,0 +1,51 @@
+/*
+ * 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.sets.alliances;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class GorillaBerserkers2 extends GorillaBerserkers1 {
+
+ public GorillaBerserkers2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 76;
+ }
+
+ public GorillaBerserkers2(final GorillaBerserkers2 card) {
+ super(card);
+ }
+
+ @Override
+ public GorillaBerserkers2 copy() {
+ return new GorillaBerserkers2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/InsidiousBookworms1.java b/Mage.Sets/src/mage/sets/alliances/InsidiousBookworms1.java
new file mode 100644
index 00000000000..893647e1340
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/InsidiousBookworms1.java
@@ -0,0 +1,69 @@
+/*
+ * 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.sets.alliances;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.DiesTriggeredAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.DoIfCostPaid;
+import mage.abilities.effects.common.discard.DiscardTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.target.TargetPlayer;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class InsidiousBookworms1 extends CardImpl {
+
+ public InsidiousBookworms1(UUID ownerId) {
+ super(ownerId, 12, "Insidious Bookworms", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{B}");
+ this.expansionSetCode = "ALL";
+ this.subtype.add("Worm");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // When Insidious Bookworms dies, you may pay {1}{B}. If you do, target player discards a card at random.
+ Ability ability = new DiesTriggeredAbility(new DoIfCostPaid(new DiscardTargetEffect(1, true), new ManaCostsImpl("{1}{B}")));
+ ability.addTarget(new TargetPlayer());
+ this.addAbility(ability);
+ }
+
+ public InsidiousBookworms1(final InsidiousBookworms1 card) {
+ super(card);
+ }
+
+ @Override
+ public InsidiousBookworms1 copy() {
+ return new InsidiousBookworms1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/InsidiousBookworms2.java b/Mage.Sets/src/mage/sets/alliances/InsidiousBookworms2.java
new file mode 100644
index 00000000000..6b8167641ec
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/InsidiousBookworms2.java
@@ -0,0 +1,51 @@
+/*
+ * 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.sets.alliances;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class InsidiousBookworms2 extends InsidiousBookworms1 {
+
+ public InsidiousBookworms2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 13;
+ }
+
+ public InsidiousBookworms2(final InsidiousBookworms2 card) {
+ super(card);
+ }
+
+ @Override
+ public InsidiousBookworms2 copy() {
+ return new InsidiousBookworms2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/KeeperOfTresserhorn.java b/Mage.Sets/src/mage/sets/alliances/KeeperOfTresserhorn.java
new file mode 100644
index 00000000000..0b4b039c706
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/KeeperOfTresserhorn.java
@@ -0,0 +1,73 @@
+/*
+ * 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.sets.alliances;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.AttacksAndIsNotBlockedTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.LoseLifeTargetEffect;
+import mage.abilities.effects.common.continuous.AssignNoCombatDamageSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class KeeperOfTresserhorn extends CardImpl {
+
+ public KeeperOfTresserhorn(UUID ownerId) {
+ super(ownerId, 14, "Keeper of Tresserhorn", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{5}{B}");
+ this.expansionSetCode = "ALL";
+ this.subtype.add("Avatar");
+ this.power = new MageInt(6);
+ this.toughness = new MageInt(6);
+
+ // Whenever Keeper of Tresserhorn attacks and isn't blocked, it assigns no combat damage this turn and defending player loses 2 life.
+ Effect effect = new AssignNoCombatDamageSourceEffect(Duration.EndOfTurn);
+ effect.setText("it assigns no combat damage this turn");
+ Ability ability = new AttacksAndIsNotBlockedTriggeredAbility(effect, false, true);
+ effect = new LoseLifeTargetEffect(2);
+ effect.setText("and defending player loses 2 life");
+ ability.addEffect(effect);
+ this.addAbility(ability);
+ }
+
+ public KeeperOfTresserhorn(final KeeperOfTresserhorn card) {
+ super(card);
+ }
+
+ @Override
+ public KeeperOfTresserhorn copy() {
+ return new KeeperOfTresserhorn(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/LimDulsHighGuard1.java b/Mage.Sets/src/mage/sets/alliances/LimDulsHighGuard1.java
new file mode 100644
index 00000000000..6c260c65c1b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/LimDulsHighGuard1.java
@@ -0,0 +1,68 @@
+/*
+ * 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.sets.alliances;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.RegenerateSourceEffect;
+import mage.abilities.keyword.FirstStrikeAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class LimDulsHighGuard1 extends CardImpl {
+
+ public LimDulsHighGuard1(UUID ownerId) {
+ super(ownerId, 17, "Lim-Dul's High Guard", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{B}{B}");
+ this.expansionSetCode = "ALL";
+ this.subtype.add("Skeleton");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(1);
+
+ // First strike
+ this.addAbility(FirstStrikeAbility.getInstance());
+ // {1}{B}: Regenerate Lim-Dul's High Guard.
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateSourceEffect(), new ManaCostsImpl("{1}{B}")));
+ }
+
+ public LimDulsHighGuard1(final LimDulsHighGuard1 card) {
+ super(card);
+ }
+
+ @Override
+ public LimDulsHighGuard1 copy() {
+ return new LimDulsHighGuard1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/LimDulsHighGuard2.java b/Mage.Sets/src/mage/sets/alliances/LimDulsHighGuard2.java
new file mode 100644
index 00000000000..f3eeba47ccf
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/LimDulsHighGuard2.java
@@ -0,0 +1,51 @@
+/*
+ * 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.sets.alliances;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class LimDulsHighGuard2 extends LimDulsHighGuard1 {
+
+ public LimDulsHighGuard2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 18;
+ }
+
+ public LimDulsHighGuard2(final LimDulsHighGuard2 card) {
+ super(card);
+ }
+
+ @Override
+ public LimDulsHighGuard2 copy() {
+ return new LimDulsHighGuard2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/LimDulsPaladin.java b/Mage.Sets/src/mage/sets/alliances/LimDulsPaladin.java
new file mode 100644
index 00000000000..a534ba9793f
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/LimDulsPaladin.java
@@ -0,0 +1,123 @@
+/*
+ * 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.sets.alliances;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.AttacksAndIsNotBlockedTriggeredAbility;
+import mage.abilities.common.BecomesBlockedTriggeredAbility;
+import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
+import mage.abilities.costs.common.DiscardTargetCost;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.effects.common.LoseLifeTargetEffect;
+import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect;
+import mage.abilities.effects.common.continuous.AssignNoCombatDamageSourceEffect;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.target.common.TargetCardInHand;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class LimDulsPaladin extends CardImpl {
+
+ public LimDulsPaladin(UUID ownerId) {
+ super(ownerId, 191, "Lim-Dul's Paladin", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{B}{R}");
+ this.expansionSetCode = "ALL";
+ this.subtype.add("Human");
+ this.subtype.add("Knight");
+ this.power = new MageInt(0);
+ this.toughness = new MageInt(3);
+
+ // Trample
+ this.addAbility(TrampleAbility.getInstance());
+ // At the beginning of your upkeep, you may discard a card. If you don't, sacrifice Lim-Dul's Paladin and draw a card.
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new LimDulsPaladinEffect(), TargetController.YOU, false));
+ // Whenever Lim-Dul's Paladin becomes blocked, it gets +6/+3 until end of turn.
+ this.addAbility(new BecomesBlockedTriggeredAbility(new BoostSourceEffect(6, 3, Duration.EndOfTurn), false));
+ // Whenever Lim-Dul's Paladin attacks and isn't blocked, it assigns no combat damage to defending player this turn and that player loses 4 life.
+ Effect effect = new AssignNoCombatDamageSourceEffect(Duration.EndOfTurn);
+ effect.setText("it assigns no combat damage this turn");
+ Ability ability = new AttacksAndIsNotBlockedTriggeredAbility(effect, false, true);
+ effect = new LoseLifeTargetEffect(4);
+ effect.setText("and defending player loses 4 life");
+ ability.addEffect(effect);
+ this.addAbility(ability);
+ }
+
+ public LimDulsPaladin(final LimDulsPaladin card) {
+ super(card);
+ }
+
+ @Override
+ public LimDulsPaladin copy() {
+ return new LimDulsPaladin(this);
+ }
+}
+
+class LimDulsPaladinEffect extends SacrificeSourceUnlessPaysEffect {
+
+ public LimDulsPaladinEffect() {
+ super(new DiscardTargetCost(new TargetCardInHand()));
+ staticText = "you may discard a card. If you don't, sacrifice {this} and draw a card.";
+ }
+
+ public LimDulsPaladinEffect(final LimDulsPaladinEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public LimDulsPaladinEffect copy() {
+ return new LimDulsPaladinEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent permanent = game.getPermanent(source.getSourceId());
+ if(permanent != null) {
+ super.apply(game, source);
+ // Not in play anymore -> was sacrificed, draw a card
+ if(game.getPermanent(source.getSourceId()) == null) {
+ return new DrawCardSourceControllerEffect(1).apply(game, source);
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/PhyrexianDevourer.java b/Mage.Sets/src/mage/sets/alliances/PhyrexianDevourer.java
index a7ba4876f7b..36a4e5d6da8 100644
--- a/Mage.Sets/src/mage/sets/alliances/PhyrexianDevourer.java
+++ b/Mage.Sets/src/mage/sets/alliances/PhyrexianDevourer.java
@@ -27,8 +27,6 @@
*/
package mage.sets.alliances;
-import java.util.ArrayList;
-import java.util.List;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
@@ -100,10 +98,7 @@ class PhyrexianDevourerStateTriggeredAbility extends StateTriggeredAbility {
@Override
public boolean checkTrigger(GameEvent event, Game game) {
Permanent permanent = game.getPermanent(getSourceId());
- if(permanent != null && permanent.getPower().getValue() >= 7){
- return true;
- }
- return false;
+ return permanent != null && permanent.getPower().getValue() >= 7;
}
@Override
@@ -134,9 +129,9 @@ class PhyrexianDevourerEffect extends OneShotEffect {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
Card card = null;
- for (Cost cost: source.getCosts()) {
+ for (Cost cost : source.getCosts()) {
if (cost instanceof ExileTopCardLibraryCost) {
- card = ((ExileTopCardLibraryCost)cost).getCard();
+ card = ((ExileTopCardLibraryCost) cost).getCard();
}
}
if (card != null) {
@@ -170,7 +165,7 @@ class ExileTopCardLibraryCost extends CostImpl {
if (controller != null) {
card = controller.getLibrary().getFromTop(game);
if (card != null) {
- paid = controller.moveCardToExileWithInfo(card, null, "", sourceId, game, Zone.LIBRARY, true);
+ paid = controller.moveCards(card, null, Zone.EXILED, ability, game);
}
}
return paid;
diff --git a/Mage.Sets/src/mage/sets/alliances/RitualOfTheMachine.java b/Mage.Sets/src/mage/sets/alliances/RitualOfTheMachine.java
new file mode 100644
index 00000000000..c9fc32a7e9f
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/RitualOfTheMachine.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.alliances;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class RitualOfTheMachine extends mage.sets.masterseditionii.RitualOfTheMachine {
+
+ public RitualOfTheMachine(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 24;
+ this.expansionSetCode = "ALL";
+ }
+
+ public RitualOfTheMachine(final RitualOfTheMachine card) {
+ super(card);
+ }
+
+ @Override
+ public RitualOfTheMachine copy() {
+ return new RitualOfTheMachine(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/SoldeviAdnate1.java b/Mage.Sets/src/mage/sets/alliances/SoldeviAdnate1.java
new file mode 100644
index 00000000000..6dc868b548c
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/SoldeviAdnate1.java
@@ -0,0 +1,83 @@
+/*
+ * 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.sets.alliances;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.Mana;
+import mage.ObjectColor;
+import mage.abilities.Ability;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.dynamicvalue.common.SacrificeCostConvertedMana;
+import mage.abilities.mana.DynamicManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.CardTypePredicate;
+import mage.filter.predicate.mageobject.ColorPredicate;
+import mage.target.common.TargetControlledPermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class SoldeviAdnate1 extends CardImpl {
+
+ private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("black or artifact creature");
+
+ static {
+ filter.add(Predicates.or(new ColorPredicate(ObjectColor.BLACK), new CardTypePredicate(CardType.ARTIFACT)));
+ }
+
+ public SoldeviAdnate1(UUID ownerId) {
+ super(ownerId, 25, "Soldevi Adnate", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{B}");
+ this.expansionSetCode = "ALL";
+ this.subtype.add("Human");
+ this.subtype.add("Cleric");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(2);
+
+ // {T}, Sacrifice a black or artifact creature: Add to your mana pool an amount of {B} equal to the sacrificed creature's converted mana cost.
+ Ability ability = new DynamicManaAbility(Mana.BlackMana, new SacrificeCostConvertedMana("creature"),
+ new TapSourceCost(), "add to your mana pool an amount of {B} equal to the sacrificed creature's converted mana cost");
+ ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(filter)));
+ this.addAbility(ability);
+ }
+
+ public SoldeviAdnate1(final SoldeviAdnate1 card) {
+ super(card);
+ }
+
+ @Override
+ public SoldeviAdnate1 copy() {
+ return new SoldeviAdnate1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/SoldeviAdnate2.java b/Mage.Sets/src/mage/sets/alliances/SoldeviAdnate2.java
new file mode 100644
index 00000000000..644ac231489
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/SoldeviAdnate2.java
@@ -0,0 +1,55 @@
+/*
+ * 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.sets.alliances;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class SoldeviAdnate2 extends SoldeviAdnate1 {
+
+ public SoldeviAdnate2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 26;
+ }
+
+ public SoldeviAdnate2(final SoldeviAdnate2 card) {
+ super(card);
+ }
+
+ @Override
+ public SoldeviAdnate2 copy() {
+ return new SoldeviAdnate2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/SwampMosquito1.java b/Mage.Sets/src/mage/sets/alliances/SwampMosquito1.java
new file mode 100644
index 00000000000..de42480ab1a
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/SwampMosquito1.java
@@ -0,0 +1,69 @@
+/*
+ * 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.sets.alliances;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.AttacksAndIsNotBlockedTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.counter.AddPoisonCounterTargetEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class SwampMosquito1 extends CardImpl {
+
+ public SwampMosquito1(UUID ownerId) {
+ super(ownerId, 30, "Swamp Mosquito", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{B}");
+ this.expansionSetCode = "ALL";
+ this.subtype.add("Insect");
+ this.power = new MageInt(0);
+ this.toughness = new MageInt(1);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+ // Whenever Swamp Mosquito attacks and isn't blocked, defending player gets a poison counter.
+ Effect effect = new AddPoisonCounterTargetEffect(1);
+ effect.setText("defending player gets a poison counter");
+ this.addAbility(new AttacksAndIsNotBlockedTriggeredAbility(effect, false, true));
+ }
+
+ public SwampMosquito1(final SwampMosquito1 card) {
+ super(card);
+ }
+
+ @Override
+ public SwampMosquito1 copy() {
+ return new SwampMosquito1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/SwampMosquito2.java b/Mage.Sets/src/mage/sets/alliances/SwampMosquito2.java
new file mode 100644
index 00000000000..9b44a183cb3
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/SwampMosquito2.java
@@ -0,0 +1,51 @@
+/*
+ * 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.sets.alliances;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class SwampMosquito2 extends SwampMosquito1 {
+
+ public SwampMosquito2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 31;
+ }
+
+ public SwampMosquito2(final SwampMosquito2 card) {
+ super(card);
+ }
+
+ @Override
+ public SwampMosquito2 copy() {
+ return new SwampMosquito2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/VisceridArmor1.java b/Mage.Sets/src/mage/sets/alliances/VisceridArmor1.java
new file mode 100644
index 00000000000..dbb63d09e49
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/VisceridArmor1.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.alliances;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class VisceridArmor1 extends mage.sets.masterseditionii.VisceridArmor {
+
+ public VisceridArmor1(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 60;
+ this.expansionSetCode = "ALL";
+ }
+
+ public VisceridArmor1(final VisceridArmor1 card) {
+ super(card);
+ }
+
+ @Override
+ public VisceridArmor1 copy() {
+ return new VisceridArmor1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/VisceridArmor2.java b/Mage.Sets/src/mage/sets/alliances/VisceridArmor2.java
new file mode 100644
index 00000000000..18ce8c47e5d
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/VisceridArmor2.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.alliances;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class VisceridArmor2 extends mage.sets.masterseditionii.VisceridArmor {
+
+ public VisceridArmor2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 61;
+ this.expansionSetCode = "ALL";
+ }
+
+ public VisceridArmor2(final VisceridArmor2 card) {
+ super(card);
+ }
+
+ @Override
+ public VisceridArmor2 copy() {
+ return new VisceridArmor2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/YavimayaAncients1.java b/Mage.Sets/src/mage/sets/alliances/YavimayaAncients1.java
new file mode 100644
index 00000000000..c215b3b8332
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/YavimayaAncients1.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.alliances;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class YavimayaAncients1 extends mage.sets.masterseditionii.YavimayaAncients {
+
+ public YavimayaAncients1(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 91;
+ this.expansionSetCode = "ALL";
+ this.rarity = Rarity.COMMON;
+ }
+
+ public YavimayaAncients1(final YavimayaAncients1 card) {
+ super(card);
+ }
+
+ @Override
+ public YavimayaAncients1 copy() {
+ return new YavimayaAncients1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/alliances/YavimayaAncients2.java b/Mage.Sets/src/mage/sets/alliances/YavimayaAncients2.java
new file mode 100644
index 00000000000..a3df8b2b283
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/alliances/YavimayaAncients2.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.alliances;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class YavimayaAncients2 extends mage.sets.masterseditionii.YavimayaAncients {
+
+ public YavimayaAncients2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 92;
+ this.expansionSetCode = "ALL";
+ this.rarity = Rarity.COMMON;
+ }
+
+ public YavimayaAncients2(final YavimayaAncients2 card) {
+ super(card);
+ }
+
+ @Override
+ public YavimayaAncients2 copy() {
+ return new YavimayaAncients2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/anthologyjacevschandra/Ophidian.java b/Mage.Sets/src/mage/sets/anthologyjacevschandra/Ophidian.java
new file mode 100644
index 00000000000..3816fda1c85
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/anthologyjacevschandra/Ophidian.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.anthologyjacevschandra;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Ophidian extends mage.sets.vintagemasters.Ophidian {
+
+ public Ophidian(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 9;
+ this.expansionSetCode = "DD3";
+ }
+
+ public Ophidian(final Ophidian card) {
+ super(card);
+ }
+
+ @Override
+ public Ophidian copy() {
+ return new Ophidian(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/AshnodsBattleGear.java b/Mage.Sets/src/mage/sets/antiquities/AshnodsBattleGear.java
new file mode 100644
index 00000000000..faef4ae4a09
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/antiquities/AshnodsBattleGear.java
@@ -0,0 +1,75 @@
+/*
+ * 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.sets.antiquities;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.common.SkipUntapOptionalAbility;
+import mage.abilities.condition.common.SourceTappedCondition;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.decorator.ConditionalContinuousEffect;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.target.common.TargetControlledCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class AshnodsBattleGear extends CardImpl {
+
+ public AshnodsBattleGear(UUID ownerId) {
+ super(ownerId, 4, "Ashnod's Battle Gear", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{2}");
+ this.expansionSetCode = "ATQ";
+
+ // You may choose not to untap Ashnod's Battle Gear during your untap step.
+ this.addAbility(new SkipUntapOptionalAbility());
+ // {2}, {tap}: Target creature you control gets +2/-2 for as long as Ashnod's Battle Gear remains tapped.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ConditionalContinuousEffect(
+ new BoostTargetEffect(2, -2, Duration.Custom), SourceTappedCondition.getInstance(),
+ "target creature you control gets +2/-2 for as long as {this} remains tapped"), new ManaCostsImpl("{2}"));
+ ability.addCost(new TapSourceCost());
+ ability.addTarget(new TargetControlledCreaturePermanent());
+ this.addAbility(ability);
+ }
+
+ public AshnodsBattleGear(final AshnodsBattleGear card) {
+ super(card);
+ }
+
+ @Override
+ public AshnodsBattleGear copy() {
+ return new AshnodsBattleGear(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/Detonate.java b/Mage.Sets/src/mage/sets/antiquities/Detonate.java
new file mode 100644
index 00000000000..532834aed00
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/antiquities/Detonate.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.antiquities;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Detonate extends mage.sets.fifthedition.Detonate {
+
+ public Detonate(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 89;
+ this.expansionSetCode = "ATQ";
+ }
+
+ public Detonate(final Detonate card) {
+ super(card);
+ }
+
+ @Override
+ public Detonate copy() {
+ return new Detonate(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/DwarvenWeaponsmith.java b/Mage.Sets/src/mage/sets/antiquities/DwarvenWeaponsmith.java
new file mode 100644
index 00000000000..e6ae84b22ad
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/antiquities/DwarvenWeaponsmith.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.antiquities;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class DwarvenWeaponsmith extends mage.sets.revisededition.DwarvenWeaponsmith {
+
+ public DwarvenWeaponsmith(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 90;
+ this.expansionSetCode = "ATQ";
+ }
+
+ public DwarvenWeaponsmith(final DwarvenWeaponsmith card) {
+ super(card);
+ }
+
+ @Override
+ public DwarvenWeaponsmith copy() {
+ return new DwarvenWeaponsmith(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/GateToPhyrexia.java b/Mage.Sets/src/mage/sets/antiquities/GateToPhyrexia.java
index 1d2a88c9abc..4d902ed4b3b 100644
--- a/Mage.Sets/src/mage/sets/antiquities/GateToPhyrexia.java
+++ b/Mage.Sets/src/mage/sets/antiquities/GateToPhyrexia.java
@@ -91,4 +91,9 @@ class GateToPhyrexiaAbility extends LimitedTimesPerTurnActivatedAbility {
}
return super.canActivate(playerId, game);
}
+
+ @Override
+ public String getRule() {
+ return "Sacrifice a creature: Destroy target artifact. Activate this ability only during your upkeep and only once each turn.";
+ }
}
diff --git a/Mage.Sets/src/mage/sets/antiquities/OrcishMechanics.java b/Mage.Sets/src/mage/sets/antiquities/OrcishMechanics.java
new file mode 100644
index 00000000000..652a31eb97a
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/antiquities/OrcishMechanics.java
@@ -0,0 +1,73 @@
+/*
+ * 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.sets.antiquities;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledArtifactPermanent;
+import mage.target.common.TargetControlledPermanent;
+import mage.target.common.TargetCreatureOrPlayer;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class OrcishMechanics extends CardImpl {
+
+ public OrcishMechanics(UUID ownerId) {
+ super(ownerId, 92, "Orcish Mechanics", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{R}");
+ this.expansionSetCode = "ATQ";
+ this.subtype.add("Orc");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // {tap}, Sacrifice an artifact: Orcish Mechanics deals 2 damage to target creature or player.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(2), new TapSourceCost());
+ ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledArtifactPermanent("an artifact"))));
+ ability.addTarget(new TargetCreatureOrPlayer());
+ this.addAbility(ability);
+ }
+
+ public OrcishMechanics(final OrcishMechanics card) {
+ super(card);
+ }
+
+ @Override
+ public OrcishMechanics copy() {
+ return new OrcishMechanics(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/PriestOfYawgmoth.java b/Mage.Sets/src/mage/sets/antiquities/PriestOfYawgmoth.java
new file mode 100644
index 00000000000..e648e0db971
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/antiquities/PriestOfYawgmoth.java
@@ -0,0 +1,73 @@
+/*
+ * 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.sets.antiquities;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.Mana;
+import mage.abilities.Ability;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.dynamicvalue.common.SacrificeCostConvertedMana;
+import mage.abilities.mana.DynamicManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterControlledArtifactPermanent;
+import mage.target.common.TargetControlledPermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class PriestOfYawgmoth extends CardImpl {
+
+ public PriestOfYawgmoth(UUID ownerId) {
+ super(ownerId, 49, "Priest of Yawgmoth", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{B}");
+ this.expansionSetCode = "ATQ";
+ this.subtype.add("Human");
+ this.subtype.add("Cleric");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(2);
+
+ // {T}, Sacrifice an artifact: Add to your mana pool an amount of {B} equal to the sacrificed artifact's converted mana cost.
+ Ability ability = new DynamicManaAbility(Mana.BlackMana, new SacrificeCostConvertedMana("artifact"),
+ new TapSourceCost(), "add to your mana pool an amount of {B} equal to the sacrificed artifact's converted mana cost");
+ ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledArtifactPermanent())));
+ this.addAbility(ability);
+ }
+
+ public PriestOfYawgmoth(final PriestOfYawgmoth card) {
+ super(card);
+ }
+
+ @Override
+ public PriestOfYawgmoth copy() {
+ return new PriestOfYawgmoth(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/antiquities/TawnossWeaponry.java b/Mage.Sets/src/mage/sets/antiquities/TawnossWeaponry.java
new file mode 100644
index 00000000000..153f22154a2
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/antiquities/TawnossWeaponry.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.antiquities;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class TawnossWeaponry extends mage.sets.fifthedition.TawnossWeaponry {
+
+ public TawnossWeaponry(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 35;
+ this.expansionSetCode = "ATQ";
+ }
+
+ public TawnossWeaponry(final TawnossWeaponry card) {
+ super(card);
+ }
+
+ @Override
+ public TawnossWeaponry copy() {
+ return new TawnossWeaponry(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/apocalypse/DwarvenLandslide.java b/Mage.Sets/src/mage/sets/apocalypse/DwarvenLandslide.java
index 4edae4f5649..c6168855cc6 100644
--- a/Mage.Sets/src/mage/sets/apocalypse/DwarvenLandslide.java
+++ b/Mage.Sets/src/mage/sets/apocalypse/DwarvenLandslide.java
@@ -41,6 +41,7 @@ import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.filter.common.FilterControlledLandPermanent;
+import mage.filter.common.FilterLandPermanent;
import mage.game.Game;
import mage.target.common.TargetControlledPermanent;
import mage.target.common.TargetLandPermanent;
@@ -62,6 +63,7 @@ public class DwarvenLandslide extends CardImpl {
this.addAbility(new KickerAbility(kickerCosts));
// Destroy target land. If Dwarven Landslide was kicked, destroy another target land.
getSpellAbility().addEffect(new DestroyTargetEffect("Destroy target land. If {this} was kicked, destroy another target land"));
+ getSpellAbility().addTarget(new TargetLandPermanent());
}
public DwarvenLandslide(final DwarvenLandslide card) {
@@ -70,7 +72,9 @@ public class DwarvenLandslide extends CardImpl {
@Override
public void adjustTargets(Ability ability, Game game) {
- ability.addTarget(new TargetLandPermanent(KickedCondition.getInstance().apply(game, ability) ? 2 : 1));
+ if (KickedCondition.getInstance().apply(game, ability)) {
+ getSpellAbility().addTarget(new TargetLandPermanent(new FilterLandPermanent("land (Kicker)")));
+ }
}
@Override
diff --git a/Mage.Sets/src/mage/sets/arabiannights/MerchantShip.java b/Mage.Sets/src/mage/sets/arabiannights/MerchantShip.java
new file mode 100644
index 00000000000..6f4fa5ff9b7
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/arabiannights/MerchantShip.java
@@ -0,0 +1,76 @@
+/*
+ * 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.sets.arabiannights;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.AttacksAndIsNotBlockedTriggeredAbility;
+import mage.abilities.common.ControlsPermanentsControllerTriggeredAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.common.GainLifeEffect;
+import mage.abilities.effects.common.SacrificeSourceEffect;
+import mage.abilities.effects.common.combat.CantAttackUnlessDefenderControllsPermanent;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.Filter;
+import mage.filter.common.FilterLandPermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class MerchantShip extends CardImpl {
+
+ public MerchantShip(UUID ownerId) {
+ super(ownerId, 23, "Merchant Ship", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{U}");
+ this.expansionSetCode = "ARN";
+ this.subtype.add("Human");
+ this.power = new MageInt(0);
+ this.toughness = new MageInt(2);
+
+ // Merchant Ship can't attack unless defending player controls an Island.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackUnlessDefenderControllsPermanent(new FilterLandPermanent("Island", "an Island"))));
+ // Whenever Merchant Ship attacks and isn't blocked, you gain 2 life.
+ this.addAbility(new AttacksAndIsNotBlockedTriggeredAbility(new GainLifeEffect(2)));
+ // When you control no Islands, sacrifice Merchant Ship.
+ this.addAbility(new ControlsPermanentsControllerTriggeredAbility(
+ new FilterLandPermanent("Island", "no Islands"), Filter.ComparisonType.Equal, 0,
+ new SacrificeSourceEffect()));
+ }
+
+ public MerchantShip(final MerchantShip card) {
+ super(card);
+ }
+
+ @Override
+ public MerchantShip copy() {
+ return new MerchantShip(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/arabiannights/SorceressQueen.java b/Mage.Sets/src/mage/sets/arabiannights/SorceressQueen.java
new file mode 100644
index 00000000000..879a3dc6386
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/arabiannights/SorceressQueen.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.arabiannights;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class SorceressQueen extends mage.sets.revisededition.SorceressQueen {
+
+ public SorceressQueen(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 13;
+ this.expansionSetCode = "ARN";
+ this.rarity = Rarity.UNCOMMON;
+ }
+
+ public SorceressQueen(final SorceressQueen card) {
+ super(card);
+ }
+
+ @Override
+ public SorceressQueen copy() {
+ return new SorceressQueen(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/avacynrestored/AvacynAngelOfHope.java b/Mage.Sets/src/mage/sets/avacynrestored/AvacynAngelOfHope.java
index c826ac7ef58..8ad91046a02 100644
--- a/Mage.Sets/src/mage/sets/avacynrestored/AvacynAngelOfHope.java
+++ b/Mage.Sets/src/mage/sets/avacynrestored/AvacynAngelOfHope.java
@@ -28,10 +28,6 @@
package mage.sets.avacynrestored;
import java.util.UUID;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.Rarity;
-import mage.constants.Zone;
import mage.MageInt;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.Effect;
@@ -40,6 +36,10 @@ import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.IndestructibleAbility;
import mage.abilities.keyword.VigilanceAbility;
import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
import mage.filter.common.FilterControlledPermanent;
@@ -57,13 +57,15 @@ public class AvacynAngelOfHope extends CardImpl {
this.power = new MageInt(8);
this.toughness = new MageInt(8);
+ // Flying, vigilance, indestructible
this.addAbility(FlyingAbility.getInstance());
this.addAbility(VigilanceAbility.getInstance());
+ this.addAbility(IndestructibleAbility.getInstance());
- // Avacyn, Angel of Hope and other permanents you control are indestructible.
- FilterControlledPermanent filter = new FilterControlledPermanent("Avacyn, Angel of Hope and other permanents you control");
- Effect effect = new GainAbilityAllEffect(IndestructibleAbility.getInstance(), Duration.WhileOnBattlefield, filter, false);
- effect.setText("{this} and other permanents you control are indestructible");
+ // Other permanents you control are indestructible.
+ FilterControlledPermanent filter = new FilterControlledPermanent("Other permanents you control");
+ Effect effect = new GainAbilityAllEffect(IndestructibleAbility.getInstance(), Duration.WhileOnBattlefield, filter, true);
+ effect.setText("Other permanents you control are indestructible");
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect));
}
diff --git a/Mage.Sets/src/mage/sets/avacynrestored/Cloudshift.java b/Mage.Sets/src/mage/sets/avacynrestored/Cloudshift.java
index 49d08482134..42c785000e2 100644
--- a/Mage.Sets/src/mage/sets/avacynrestored/Cloudshift.java
+++ b/Mage.Sets/src/mage/sets/avacynrestored/Cloudshift.java
@@ -27,15 +27,15 @@
*/
package mage.sets.avacynrestored;
-import mage.constants.CardType;
-import mage.constants.Rarity;
+import java.util.UUID;
+import mage.abilities.effects.Effect;
import mage.abilities.effects.common.ExileTargetForSourceEffect;
import mage.abilities.effects.common.ReturnToBattlefieldUnderYourControlTargetEffect;
import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
import mage.target.common.TargetControlledCreaturePermanent;
-import java.util.UUID;
-
/**
*
* @author noxx
@@ -46,10 +46,11 @@ public class Cloudshift extends CardImpl {
super(ownerId, 12, "Cloudshift", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{W}");
this.expansionSetCode = "AVR";
-
// Exile target creature you control, then return that card to the battlefield under your control.
this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent());
- this.getSpellAbility().addEffect(new ExileTargetForSourceEffect());
+ Effect effect = new ExileTargetForSourceEffect();
+ effect.setApplyEffectsAfter();
+ this.getSpellAbility().addEffect(effect);
this.getSpellAbility().addEffect(new ReturnToBattlefieldUnderYourControlTargetEffect(true));
}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/BarrageTyrant.java b/Mage.Sets/src/mage/sets/battleforzendikar/BarrageTyrant.java
new file mode 100644
index 00000000000..d2c7973283f
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/BarrageTyrant.java
@@ -0,0 +1,90 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.dynamicvalue.common.SacrificeCostCreaturesPower;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.filter.predicate.mageobject.ColorlessPredicate;
+import mage.filter.predicate.permanent.AnotherPredicate;
+import mage.target.common.TargetControlledCreaturePermanent;
+import mage.target.common.TargetCreatureOrPlayer;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class BarrageTyrant extends CardImpl {
+
+ private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("another colorless creature");
+
+ static {
+ filter.add(new AnotherPredicate());
+ filter.add(new ColorlessPredicate());
+ }
+
+ public BarrageTyrant(UUID ownerId) {
+ super(ownerId, 127, "Barrage Tyrant", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{4}{R}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.power = new MageInt(5);
+ this.toughness = new MageInt(3);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+
+ // {2}{R}, Sacrifice another colorless creature: Barrage Tyrant deals damage equal to the sacrificed creature's power to target creature or player.
+ Effect effect = new DamageTargetEffect(new SacrificeCostCreaturesPower());
+ effect.setText("{this} deals damage equal to the sacrificed creature's power to target creature or player");
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{2}{R}"));
+ ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(filter)));
+ ability.addTarget(new TargetCreatureOrPlayer());
+ this.addAbility(ability);
+ }
+
+ public BarrageTyrant(final BarrageTyrant card) {
+ super(card);
+ }
+
+ @Override
+ public BarrageTyrant copy() {
+ return new BarrageTyrant(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/BlightHerder.java b/Mage.Sets/src/mage/sets/battleforzendikar/BlightHerder.java
new file mode 100644
index 00000000000..d6317ebf1bf
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/BlightHerder.java
@@ -0,0 +1,118 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.CastSourceTriggeredAbility;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.cards.CardImpl;
+import mage.cards.Cards;
+import mage.cards.CardsImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.filter.FilterCard;
+import mage.filter.predicate.other.OwnerPredicate;
+import mage.game.Game;
+import mage.game.permanent.token.EldraziScionToken;
+import mage.players.Player;
+import mage.target.Target;
+import mage.target.common.TargetCardInExile;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class BlightHerder extends CardImpl {
+
+ public BlightHerder(UUID ownerId) {
+ super(ownerId, 2, "Blight Herder", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{5}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Processor");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(5);
+
+ // When you cast Blight Herder, you may put two cards your opponents own from exile into their owners' graveyards. If you do, put three 1/1 colorless Eldrazi Scion creature tokens onto the battlefield. They have "Sacrifice this creature: Add {1} to your mana pool."
+ this.addAbility(new CastSourceTriggeredAbility(new BlightHerderEffect(), true));
+ }
+
+ public BlightHerder(final BlightHerder card) {
+ super(card);
+ }
+
+ @Override
+ public BlightHerder copy() {
+ return new BlightHerder(this);
+ }
+}
+
+class BlightHerderEffect extends OneShotEffect {
+
+ private final static FilterCard filter = new FilterCard("cards your opponents own from exile");
+
+ static {
+ filter.add(new OwnerPredicate(TargetController.OPPONENT));
+ }
+
+ public BlightHerderEffect() {
+ super(Outcome.PutCreatureInPlay);
+ this.staticText = "you may put two cards your opponents own from exile into their owners' graveyards. If you do, put three 1/1 colorless Eldrazi Scion creature tokens onto the battlefield. They have \"Sacrifice this creature: Add {1} to your mana pool.";
+ }
+
+ public BlightHerderEffect(final BlightHerderEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public BlightHerderEffect copy() {
+ return new BlightHerderEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller != null) {
+ Target target = new TargetCardInExile(2, 2, filter, null);
+ if (target.canChoose(source.getSourceId(), source.getControllerId(), game)) {
+ if (controller.chooseTarget(outcome, target, source, game)) {
+ Cards cardsToGraveyard = new CardsImpl(target.getTargets());
+ controller.moveCards(cardsToGraveyard, null, Zone.GRAVEYARD, source, game);
+ return new CreateTokenEffect(new EldraziScionToken(), 3).apply(game, source);
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/BreakerOfArmies.java b/Mage.Sets/src/mage/sets/battleforzendikar/BreakerOfArmies.java
new file mode 100644
index 00000000000..2ab9d9d7361
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/BreakerOfArmies.java
@@ -0,0 +1,65 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.common.combat.MustBeBlockedByAllSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class BreakerOfArmies extends CardImpl {
+
+ public BreakerOfArmies(UUID ownerId) {
+ super(ownerId, 3, "Breaker of Armies", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{8}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.power = new MageInt(10);
+ this.toughness = new MageInt(8);
+
+ // All creatures able to block Breaker of Armies do so.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new MustBeBlockedByAllSourceEffect(Duration.WhileOnBattlefield)));
+ }
+
+ public BreakerOfArmies(final BreakerOfArmies card) {
+ super(card);
+ }
+
+ @Override
+ public BreakerOfArmies copy() {
+ return new BreakerOfArmies(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/BroodButcher.java b/Mage.Sets/src/mage/sets/battleforzendikar/BroodButcher.java
new file mode 100644
index 00000000000..15f532eb8db
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/BroodButcher.java
@@ -0,0 +1,87 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.game.permanent.token.EldraziScionToken;
+import mage.target.common.TargetControlledCreaturePermanent;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class BroodButcher extends CardImpl {
+
+ private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("a creature");
+
+ public BroodButcher(UUID ownerId) {
+ super(ownerId, 199, "Brood Butcher", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{B}{G}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Drone");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+
+ // When Brood Butcher enters the battlefield, put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has "Sacrifice this creature: Add {1} to your mana pool."
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new EldraziScionToken()), false));
+
+ // {B}{G}, Sacrifice a creature: Target creature gets -2/-2 until end of turn.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(-2, -2, Duration.EndOfTurn), new ManaCostsImpl("{B}{G}"));
+ ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(filter)));
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+ }
+
+ public BroodButcher(final BroodButcher card) {
+ super(card);
+ }
+
+ @Override
+ public BroodButcher copy() {
+ return new BroodButcher(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/CanopyVista.java b/Mage.Sets/src/mage/sets/battleforzendikar/CanopyVista.java
new file mode 100644
index 00000000000..d6fc7f74027
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/CanopyVista.java
@@ -0,0 +1,79 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.common.EntersBattlefieldAbility;
+import mage.abilities.condition.Condition;
+import mage.abilities.condition.InvertCondition;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.decorator.ConditionalOneShotEffect;
+import mage.abilities.effects.common.TapSourceEffect;
+import mage.abilities.mana.GreenManaAbility;
+import mage.abilities.mana.WhiteManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterLandPermanent;
+import mage.filter.predicate.mageobject.SupertypePredicate;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class CanopyVista extends CardImpl {
+
+ private static final FilterLandPermanent filter = new FilterLandPermanent();
+
+ static {
+ filter.add(new SupertypePredicate("Basic"));
+ }
+
+ public CanopyVista(UUID ownerId) {
+ super(ownerId, 234, "Canopy Vista", Rarity.RARE, new CardType[]{CardType.LAND}, "");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Forest");
+ this.subtype.add("Plains");
+
+ // Canopy Vista enters the battlefield tapped unless you control two or more basic lands.
+ Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(filter, PermanentsOnTheBattlefieldCondition.CountType.MORE_THAN, 1));
+ String abilityText = "tapped unless you control two or more basic lands";
+ this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText));
+ this.addAbility(new GreenManaAbility());
+ this.addAbility(new WhiteManaAbility());
+ }
+
+ public CanopyVista(final CanopyVista card) {
+ super(card);
+ }
+
+ @Override
+ public CanopyVista copy() {
+ return new CanopyVista(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/CinderGlade.java b/Mage.Sets/src/mage/sets/battleforzendikar/CinderGlade.java
new file mode 100644
index 00000000000..69cad63bd57
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/CinderGlade.java
@@ -0,0 +1,79 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.common.EntersBattlefieldAbility;
+import mage.abilities.condition.Condition;
+import mage.abilities.condition.InvertCondition;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.decorator.ConditionalOneShotEffect;
+import mage.abilities.effects.common.TapSourceEffect;
+import mage.abilities.mana.GreenManaAbility;
+import mage.abilities.mana.RedManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterLandPermanent;
+import mage.filter.predicate.mageobject.SupertypePredicate;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class CinderGlade extends CardImpl {
+
+ private static final FilterLandPermanent filter = new FilterLandPermanent();
+
+ static {
+ filter.add(new SupertypePredicate("Basic"));
+ }
+
+ public CinderGlade(UUID ownerId) {
+ super(ownerId, 235, "Cinder Glade", Rarity.RARE, new CardType[]{CardType.LAND}, "");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Mountain");
+ this.subtype.add("Forest");
+
+ // Cinder Glade enters the battlefield tapped unless you control two or more basic lands.
+ Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(filter, PermanentsOnTheBattlefieldCondition.CountType.MORE_THAN, 1));
+ String abilityText = "tapped unless you control two or more basic lands";
+ this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText));
+ this.addAbility(new RedManaAbility());
+ this.addAbility(new GreenManaAbility());
+ }
+
+ public CinderGlade(final CinderGlade card) {
+ super(card);
+ }
+
+ @Override
+ public CinderGlade copy() {
+ return new CinderGlade(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/CoastalDiscovery.java b/Mage.Sets/src/mage/sets/battleforzendikar/CoastalDiscovery.java
new file mode 100644
index 00000000000..36c7f87a4f6
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/CoastalDiscovery.java
@@ -0,0 +1,62 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.keyword.AwakenAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class CoastalDiscovery extends CardImpl {
+
+ public CoastalDiscovery(UUID ownerId) {
+ super(ownerId, 73, "Coastal Discovery", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{3}{U}");
+ this.expansionSetCode = "BFZ";
+
+ // Draw two cards.
+ this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(2));
+
+ // Awaken 4 - {5}U}
+ this.addAbility(new AwakenAbility(this, 4, "{5}{U}"));
+ }
+
+ public CoastalDiscovery(final CoastalDiscovery card) {
+ super(card);
+ }
+
+ @Override
+ public CoastalDiscovery copy() {
+ return new CoastalDiscovery(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/DeathlessBehemoth.java b/Mage.Sets/src/mage/sets/battleforzendikar/DeathlessBehemoth.java
new file mode 100644
index 00000000000..aac83b5c1bb
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/DeathlessBehemoth.java
@@ -0,0 +1,81 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.ActivateAsSorceryActivatedAbility;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.effects.common.ReturnToHandSourceEffect;
+import mage.abilities.keyword.VigilanceAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledPermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+import mage.target.common.TargetControlledPermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class DeathlessBehemoth extends CardImpl {
+
+ private final static FilterControlledPermanent filter = new FilterControlledPermanent("two Eldrazi Scions");
+ static {
+ filter.add(Predicates.and(
+ new SubtypePredicate("Eldrazi"),
+ new SubtypePredicate("Scion")));
+ }
+
+ public DeathlessBehemoth(UUID ownerId) {
+ super(ownerId, 5, "Deathless Behemoth", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{6}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.power = new MageInt(6);
+ this.toughness = new MageInt(6);
+
+ // Vigilance
+ this.addAbility(VigilanceAbility.getInstance());
+
+ // Sacrifice two Eldrazi Scions: Return Deathless Behemoth from your graveyard to your hand. Activate this ability only any time you could cast a sorcery.
+ this.addAbility(new ActivateAsSorceryActivatedAbility(Zone.GRAVEYARD,
+ new ReturnToHandSourceEffect(), new SacrificeTargetCost(new TargetControlledPermanent(2, 2, filter, true))));
+ }
+
+ public DeathlessBehemoth(final DeathlessBehemoth card) {
+ super(card);
+ }
+
+ @Override
+ public DeathlessBehemoth copy() {
+ return new DeathlessBehemoth(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/DefiantBloodlord.java b/Mage.Sets/src/mage/sets/battleforzendikar/DefiantBloodlord.java
new file mode 100644
index 00000000000..e1bb3d98f1a
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/DefiantBloodlord.java
@@ -0,0 +1,110 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.effects.common.LoseLifeTargetEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.events.GameEvent.EventType;
+import mage.target.common.TargetOpponent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class DefiantBloodlord extends CardImpl {
+
+ public DefiantBloodlord(UUID ownerId) {
+ super(ownerId, 107, "Defiant Bloodlord", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{5}{B}{B}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Vampire");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(5);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+
+ // Whenever you gain life, target opponent loses that much life.
+ DefiantBloodlordTriggeredAbility ability = new DefiantBloodlordTriggeredAbility();
+ ability.addTarget(new TargetOpponent());
+ this.addAbility(ability);
+ }
+
+ public DefiantBloodlord(final DefiantBloodlord card) {
+ super(card);
+ }
+
+ @Override
+ public DefiantBloodlord copy() {
+ return new DefiantBloodlord(this);
+ }
+}
+
+class DefiantBloodlordTriggeredAbility extends TriggeredAbilityImpl {
+
+ public DefiantBloodlordTriggeredAbility() {
+ super(Zone.BATTLEFIELD, null);
+ }
+
+ public DefiantBloodlordTriggeredAbility(final DefiantBloodlordTriggeredAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public DefiantBloodlordTriggeredAbility copy() {
+ return new DefiantBloodlordTriggeredAbility(this);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == EventType.GAINED_LIFE;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ if (event.getPlayerId().equals(this.controllerId)) {
+ this.getEffects().clear();
+ this.addEffect(new LoseLifeTargetEffect(event.getAmount()));
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public String getRule() {
+ return "Whenever you gain life, target opponent loses that much life.";
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/DesolationTwin.java b/Mage.Sets/src/mage/sets/battleforzendikar/DesolationTwin.java
new file mode 100644
index 00000000000..83c7cb97d34
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/DesolationTwin.java
@@ -0,0 +1,112 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.events.GameEvent.EventType;
+import mage.game.permanent.token.Token;
+import mage.game.stack.Spell;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class DesolationTwin extends CardImpl {
+
+ public DesolationTwin(UUID ownerId) {
+ super(ownerId, 6, "Desolation Twin", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{10}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.power = new MageInt(10);
+ this.toughness = new MageInt(10);
+
+ // When you cast Desolation Twin, put a 10/10 colorless Eldrazi creature token onto the battlefield.
+ this.addAbility(new DesolationTwinOnCastAbility());
+ }
+
+ public DesolationTwin(final DesolationTwin card) {
+ super(card);
+ }
+
+ @Override
+ public DesolationTwin copy() {
+ return new DesolationTwin(this);
+ }
+}
+
+class DesolationTwinOnCastAbility extends TriggeredAbilityImpl {
+
+ DesolationTwinOnCastAbility() {
+ super(Zone.STACK, new CreateTokenEffect(new EldraziToken()));
+ }
+
+ DesolationTwinOnCastAbility(DesolationTwinOnCastAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == EventType.SPELL_CAST;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ Spell spell = (Spell) game.getObject(event.getTargetId());
+ return this.getSourceId().equals(spell.getSourceId());
+ }
+
+ @Override
+ public DesolationTwinOnCastAbility copy() {
+ return new DesolationTwinOnCastAbility(this);
+ }
+
+ @Override
+ public String getRule() {
+ return "When you cast {this}, " + super.getRule();
+ }
+}
+
+class EldraziToken extends Token {
+
+ public EldraziToken() {
+ super("Eldrazi", "10/10 colorless Eldrazi creature token");
+ cardType.add(CardType.CREATURE);
+ subtype.add("Eldrazi");
+ power = new MageInt(10);
+ toughness = new MageInt(10);
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/DominatorDrone.java b/Mage.Sets/src/mage/sets/battleforzendikar/DominatorDrone.java
new file mode 100644
index 00000000000..c577d070c32
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/DominatorDrone.java
@@ -0,0 +1,92 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.TriggeredAbility;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition.CountType;
+import mage.abilities.decorator.ConditionalTriggeredAbility;
+import mage.abilities.effects.common.DamagePlayersEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.abilities.keyword.IngestAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.filter.common.FilterControlledPermanent;
+import mage.filter.predicate.mageobject.ColorlessPredicate;
+import mage.filter.predicate.permanent.AnotherPredicate;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class DominatorDrone extends CardImpl {
+
+ private static final FilterControlledPermanent filter = new FilterControlledPermanent("another colorless creature");
+
+ static {
+ filter.add(new AnotherPredicate());
+ filter.add(new ColorlessPredicate());
+ }
+
+ public DominatorDrone(UUID ownerId) {
+ super(ownerId, 92, "Dominator Drone", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{B}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Drone");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(2);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+
+ // Ingest (Whenever this creature deals combat damage to a player, that player exiles the top card of his or her library.)
+ this.addAbility(new IngestAbility());
+
+ // When Dominator Drone enters the battlefield, if you control another colorless creature, each opponent loses 2 life.
+ TriggeredAbility triggeredAbility = new EntersBattlefieldTriggeredAbility(new DamagePlayersEffect(2, TargetController.OPPONENT));
+ this.addAbility(new ConditionalTriggeredAbility(
+ triggeredAbility,
+ new PermanentsOnTheBattlefieldCondition(filter, CountType.MORE_THAN, 0),
+ "When {this} enters the battlefield, if you control another colorless creature, each opponent loses 2 life."));
+
+ }
+
+ public DominatorDrone(final DominatorDrone card) {
+ super(card);
+ }
+
+ @Override
+ public DominatorDrone copy() {
+ return new DominatorDrone(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/DrownerOfHope.java b/Mage.Sets/src/mage/sets/battleforzendikar/DrownerOfHope.java
new file mode 100644
index 00000000000..c71ed280b54
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/DrownerOfHope.java
@@ -0,0 +1,94 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.effects.common.TapTargetEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledPermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+import mage.game.permanent.token.EldraziScionToken;
+import mage.target.common.TargetControlledPermanent;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class DrownerOfHope extends CardImpl {
+
+ private static final FilterControlledPermanent filter = new FilterControlledPermanent("an Eldrazi Scion");
+
+ static {
+ filter.add(Predicates.and(
+ new SubtypePredicate("Eldrazi"),
+ new SubtypePredicate("Scion")));
+ }
+
+ public DrownerOfHope(UUID ownerId) {
+ super(ownerId, 57, "Drowner of Hope", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{5}{U}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.power = new MageInt(5);
+ this.toughness = new MageInt(5);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+
+ // When Drowner of Hope enters the battlefield, put two 1/1 colorless Eldrazi Scion creature tokens onto the battlefield. They have "Sacrifice this creature: Add {1} to your mana pool."
+ Effect effect = new CreateTokenEffect(new EldraziScionToken(), 2);
+ effect.setText("put two 1/1 colorless Eldrazi Scion creature tokens onto the battlefield. They have \"Sacrifice this creature: Add {1} to your mana pool");
+ this.addAbility(new EntersBattlefieldTriggeredAbility(effect, false));
+
+ // Sacrifice an Eldrazi Scion: Tap target creature.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new TapTargetEffect(), new SacrificeTargetCost(new TargetControlledPermanent(filter)));
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+ }
+
+ public DrownerOfHope(final DrownerOfHope card) {
+ super(card);
+ }
+
+ @Override
+ public DrownerOfHope copy() {
+ return new DrownerOfHope(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/EldraziDevastator.java b/Mage.Sets/src/mage/sets/battleforzendikar/EldraziDevastator.java
new file mode 100644
index 00000000000..75c5c88beaa
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/EldraziDevastator.java
@@ -0,0 +1,62 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class EldraziDevastator extends CardImpl {
+
+ public EldraziDevastator(UUID ownerId) {
+ super(ownerId, 7, "Eldrazi Devastator", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{8}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.power = new MageInt(8);
+ this.toughness = new MageInt(9);
+
+ // Trample
+ this.addAbility(TrampleAbility.getInstance());
+ }
+
+ public EldraziDevastator(final EldraziDevastator card) {
+ super(card);
+ }
+
+ @Override
+ public EldraziDevastator copy() {
+ return new EldraziDevastator(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/FathomFeeder.java b/Mage.Sets/src/mage/sets/battleforzendikar/FathomFeeder.java
new file mode 100644
index 00000000000..7b2034d276a
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/FathomFeeder.java
@@ -0,0 +1,118 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.keyword.DeathtouchAbility;
+import mage.abilities.keyword.DevoidAbility;
+import mage.abilities.keyword.IngestAbility;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.players.Player;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class FathomFeeder extends CardImpl {
+
+ public FathomFeeder(UUID ownerId) {
+ super(ownerId, 203, "Fathom Feeder", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{U}{B}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Drone");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+
+ // Deathtouch
+ this.addAbility(DeathtouchAbility.getInstance());
+
+ // Ingest
+ this.addAbility(new IngestAbility());
+
+ // {3}{U}{B}: Draw a card. Each opponent exiles the top card of his or her library.
+ Effect effect = new FathomFeederEffect();
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), new ManaCostsImpl("{3}{U}{B}"));
+ ability.addEffect(effect);
+ this.addAbility(ability);
+ }
+
+ public FathomFeeder(final FathomFeeder card) {
+ super(card);
+ }
+
+ @Override
+ public FathomFeeder copy() {
+ return new FathomFeeder(this);
+ }
+}
+
+class FathomFeederEffect extends OneShotEffect {
+ public FathomFeederEffect() {
+ super(Outcome.Exile);
+ this.staticText = "Each opponent exiles the top card of his or her library";
+ }
+
+ public FathomFeederEffect(final FathomFeederEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public FathomFeederEffect copy() {
+ return new FathomFeederEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ for (UUID opponentId: game.getOpponents(source.getControllerId())) {
+ Player player = game.getPlayer(opponentId);
+ if (player != null) {
+ Card card = player.getLibrary().getFromTop(game);
+ if (card != null) {
+ player.moveCards(card, Zone.LIBRARY, Zone.EXILED, source, game);
+ }
+ }
+ }
+ return true;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/FelidarCub.java b/Mage.Sets/src/mage/sets/battleforzendikar/FelidarCub.java
new file mode 100644
index 00000000000..c6afaf9d4c5
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/FelidarCub.java
@@ -0,0 +1,70 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeSourceCost;
+import mage.abilities.effects.common.DestroyTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.target.common.TargetEnchantmentPermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class FelidarCub extends CardImpl {
+
+ public FelidarCub(UUID ownerId) {
+ super(ownerId, 25, "Felidar Cub", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{W}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Cat");
+ this.subtype.add("Beast");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Sacrifice Felidar Cub: Destroy target enchantment.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroyTargetEffect(), new SacrificeSourceCost());
+ ability.addTarget(new TargetEnchantmentPermanent());
+ this.addAbility(ability);
+ }
+
+ public FelidarCub(final FelidarCub card) {
+ super(card);
+ }
+
+ @Override
+ public FelidarCub copy() {
+ return new FelidarCub(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/ForerunnerOfSlaughter.java b/Mage.Sets/src/mage/sets/battleforzendikar/ForerunnerOfSlaughter.java
new file mode 100644
index 00000000000..45bdcdabc95
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/ForerunnerOfSlaughter.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class ForerunnerOfSlaughter extends mage.sets.zendikarvseldrazi.ForerunnerOfSlaughter {
+
+ public ForerunnerOfSlaughter(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 204;
+ this.expansionSetCode = "BFZ";
+ }
+
+ public ForerunnerOfSlaughter(final ForerunnerOfSlaughter card) {
+ super(card);
+ }
+
+ @Override
+ public ForerunnerOfSlaughter copy() {
+ return new ForerunnerOfSlaughter(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Forest1.java b/Mage.Sets/src/mage/sets/battleforzendikar/Forest1.java
new file mode 100644
index 00000000000..d62397e6e1d
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Forest1.java
@@ -0,0 +1,51 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Forest1 extends mage.cards.basiclands.Forest {
+
+ public Forest1(UUID ownerId) {
+ super(ownerId, 270);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Forest1(final Forest1 card) {
+ super(card);
+ }
+
+ @Override
+ public Forest1 copy() {
+ return new Forest1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Forest2.java b/Mage.Sets/src/mage/sets/battleforzendikar/Forest2.java
new file mode 100644
index 00000000000..ec7f4c906a8
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Forest2.java
@@ -0,0 +1,51 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Forest2 extends mage.cards.basiclands.Forest {
+
+ public Forest2(UUID ownerId) {
+ super(ownerId, 271);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Forest2(final Forest2 card) {
+ super(card);
+ }
+
+ @Override
+ public Forest2 copy() {
+ return new Forest2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Forest3.java b/Mage.Sets/src/mage/sets/battleforzendikar/Forest3.java
new file mode 100644
index 00000000000..951dce0ba38
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Forest3.java
@@ -0,0 +1,51 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Forest3 extends mage.cards.basiclands.Forest {
+
+ public Forest3(UUID ownerId) {
+ super(ownerId, 272);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Forest3(final Forest3 card) {
+ super(card);
+ }
+
+ @Override
+ public Forest3 copy() {
+ return new Forest3(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Forest4.java b/Mage.Sets/src/mage/sets/battleforzendikar/Forest4.java
new file mode 100644
index 00000000000..647fe973505
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Forest4.java
@@ -0,0 +1,51 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Forest4 extends mage.cards.basiclands.Forest {
+
+ public Forest4(UUID ownerId) {
+ super(ownerId, 273);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Forest4(final Forest4 card) {
+ super(card);
+ }
+
+ @Override
+ public Forest4 copy() {
+ return new Forest4(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Forest5.java b/Mage.Sets/src/mage/sets/battleforzendikar/Forest5.java
new file mode 100644
index 00000000000..22ed1741346
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Forest5.java
@@ -0,0 +1,51 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Forest5 extends mage.cards.basiclands.Forest {
+
+ public Forest5(UUID ownerId) {
+ super(ownerId, 274);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Forest5(final Forest5 card) {
+ super(card);
+ }
+
+ @Override
+ public Forest5 copy() {
+ return new Forest5(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/GideonAllyOfZendikar.java b/Mage.Sets/src/mage/sets/battleforzendikar/GideonAllyOfZendikar.java
new file mode 100644
index 00000000000..eb6e52d3e8d
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/GideonAllyOfZendikar.java
@@ -0,0 +1,126 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.LoyaltyAbility;
+import mage.abilities.common.EntersBattlefieldAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.effects.common.GetEmblemEffect;
+import mage.abilities.effects.common.PreventAllDamageToSourceEffect;
+import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect;
+import mage.abilities.effects.common.continuous.BoostControlledEffect;
+import mage.abilities.effects.common.counter.AddCountersSourceEffect;
+import mage.abilities.keyword.IndestructibleAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.counters.CounterType;
+import mage.game.command.Emblem;
+import mage.game.permanent.token.Token;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class GideonAllyOfZendikar extends CardImpl {
+
+ public GideonAllyOfZendikar(UUID ownerId) {
+ super(ownerId, 29, "Gideon, Ally of Zendikar", Rarity.MYTHIC, new CardType[]{CardType.PLANESWALKER}, "{2}{W}{W}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Gideon");
+
+ this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.LOYALTY.createInstance(4)), false));
+
+ // +1: Until end of turn, Gideon, Ally of Zendikar becomes a 5/5 Human Soldier Ally creature with indestructible that's still a planeswalker. Prevent all damage that would be dealt to him this turn.
+ LoyaltyAbility ability = new LoyaltyAbility(new BecomesCreatureSourceEffect(new GideonAllyOfZendikarToken(), "planeswalker", Duration.EndOfTurn), 1);
+ Effect effect = new PreventAllDamageToSourceEffect(Duration.EndOfTurn);
+ effect.setText("Prevent all damage that would be dealt to him this turn");
+ ability.addEffect(effect);
+ this.addAbility(ability);
+
+ // 0: Put a 2/2 white Knight Ally creature token onto the battlefield.
+ this.addAbility(new LoyaltyAbility(new CreateTokenEffect(new KnightAllyToken()), 0));
+
+ // -4: You get an emblem with "Creatures you control get +1/+1."
+ this.addAbility(new LoyaltyAbility(new GetEmblemEffect(new GideonAllyOfZendikarEmblem()), -4));
+ }
+
+ public GideonAllyOfZendikar(final GideonAllyOfZendikar card) {
+ super(card);
+ }
+
+ @Override
+ public GideonAllyOfZendikar copy() {
+ return new GideonAllyOfZendikar(this);
+ }
+}
+
+class GideonAllyOfZendikarEmblem extends Emblem {
+
+ public GideonAllyOfZendikarEmblem() {
+ this.setName("EMBLEM: Gideon, Ally of Zendikar");
+ BoostControlledEffect effect = new BoostControlledEffect(1, 1, Duration.EndOfGame);
+ Ability ability = new SimpleStaticAbility(Zone.COMMAND, effect);
+ this.getAbilities().add(ability);
+ }
+}
+
+class GideonAllyOfZendikarToken extends Token {
+
+ public GideonAllyOfZendikarToken() {
+ super("", "5/5 Human Soldier Ally creature with indestructible");
+ cardType.add(CardType.CREATURE);
+ subtype.add("Human");
+ subtype.add("Soldier");
+ subtype.add("Ally");
+ power = new MageInt(5);
+ toughness = new MageInt(5);
+
+ addAbility(IndestructibleAbility.getInstance());
+ }
+}
+
+class KnightAllyToken extends Token {
+
+ public KnightAllyToken() {
+ super("Knight Ally", "2/2 white Knight Ally creature token");
+ cardType.add(CardType.CREATURE);
+ subtype.add("Knight");
+ subtype.add("Ally");
+ color.setWhite(true);
+ power = new MageInt(2);
+ toughness = new MageInt(2);
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/GideonsReproach.java b/Mage.Sets/src/mage/sets/battleforzendikar/GideonsReproach.java
new file mode 100644
index 00000000000..c12411f150e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/GideonsReproach.java
@@ -0,0 +1,60 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.target.common.TargetAttackingOrBlockingCreature;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class GideonsReproach extends CardImpl {
+
+ public GideonsReproach(UUID ownerId) {
+ super(ownerId, 30, "Gideon's Reproach", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{W}");
+ this.expansionSetCode = "BFZ";
+
+ // Gideon's Reproach deals 4 damage to target attacking or blocking creature.
+ getSpellAbility().addEffect(new DamageTargetEffect(4));
+ getSpellAbility().addTarget(new TargetAttackingOrBlockingCreature());
+ }
+
+ public GideonsReproach(final GideonsReproach card) {
+ super(card);
+ }
+
+ @Override
+ public GideonsReproach copy() {
+ return new GideonsReproach(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/GuardianOfTazeem.java b/Mage.Sets/src/mage/sets/battleforzendikar/GuardianOfTazeem.java
new file mode 100644
index 00000000000..d82f72d6ad5
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/GuardianOfTazeem.java
@@ -0,0 +1,164 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.effects.ContinuousEffect;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.DontUntapInControllersNextUntapStepTargetEffect;
+import mage.abilities.effects.common.TapTargetEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.permanent.ControllerPredicate;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.permanent.Permanent;
+import mage.target.common.TargetCreaturePermanent;
+import mage.target.targetpointer.FixedTarget;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class GuardianOfTazeem extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature an opponent controls");
+
+ static {
+ filter.add(new ControllerPredicate(TargetController.OPPONENT));
+ }
+
+ public GuardianOfTazeem(UUID ownerId) {
+ super(ownerId, 78, "Guardian of Tazeem", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{U}{U}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Sphinx");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(5);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+
+ // Landfall - Whenever a land enters the battlefield under you control, tap target creature an opponent controls. If that land is an Island, that creature doesn't untap during its controller's next untap step.
+ Ability ability = new GuardianOfTazeemTriggeredAbility();
+ ability.addTarget(new TargetCreaturePermanent(filter));
+ this.addAbility(ability);
+ }
+
+ public GuardianOfTazeem(final GuardianOfTazeem card) {
+ super(card);
+ }
+
+ @Override
+ public GuardianOfTazeem copy() {
+ return new GuardianOfTazeem(this);
+ }
+}
+
+class GuardianOfTazeemTriggeredAbility extends TriggeredAbilityImpl {
+
+ public GuardianOfTazeemTriggeredAbility() {
+ super(Zone.BATTLEFIELD, new TapTargetEffect(), false);
+ addEffect(new GuardianOfTazeemEffect());
+ }
+
+ public GuardianOfTazeemTriggeredAbility(final GuardianOfTazeemTriggeredAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public GuardianOfTazeemTriggeredAbility copy() {
+ return new GuardianOfTazeemTriggeredAbility(this);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ Permanent permanent = game.getPermanent(event.getTargetId());
+ if (permanent != null
+ && permanent.getCardType().contains(CardType.LAND)
+ && permanent.getControllerId().equals(getControllerId())) {
+ for (Effect effect : getEffects()) {
+ if (effect instanceof GuardianOfTazeemEffect) {
+ effect.setTargetPointer(new FixedTarget(permanent, game));
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public String getRule() {
+ return "Landfall - Whenever a land enters the battlefield under your control, " + super.getRule();
+ }
+}
+
+class GuardianOfTazeemEffect extends OneShotEffect {
+
+ public GuardianOfTazeemEffect() {
+ super(Outcome.Benefit);
+ this.staticText = "If that land is an Island, that creature doesn't untap during its controller's next untap step";
+ }
+
+ public GuardianOfTazeemEffect(final GuardianOfTazeemEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public GuardianOfTazeemEffect copy() {
+ return new GuardianOfTazeemEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent land = game.getPermanentOrLKIBattlefield(getTargetPointer().getFirst(game, source));
+ Permanent targetCreature = game.getPermanent(source.getFirstTarget());
+ if (land != null && targetCreature != null) {
+ if (land.hasSubtype("Island")) {
+ ContinuousEffect effect = new DontUntapInControllersNextUntapStepTargetEffect("that creature");
+ effect.setTargetPointer(new FixedTarget(targetCreature, game));
+ game.addEffect(effect, source);
+ }
+ }
+ return true;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/HedronArchive.java b/Mage.Sets/src/mage/sets/battleforzendikar/HedronArchive.java
new file mode 100644
index 00000000000..460abc0d4e7
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/HedronArchive.java
@@ -0,0 +1,72 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.Mana;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeSourceCost;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.GenericManaCost;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.mana.SimpleManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class HedronArchive extends CardImpl {
+
+ public HedronArchive(UUID ownerId) {
+ super(ownerId, 223, "Hedron Archive", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{4}");
+ this.expansionSetCode = "BFZ";
+
+ // {T}: Add {2} to your mana pool.
+ this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, Mana.ColorlessMana(2), new TapSourceCost()));
+
+ // {2}, {T}, Sacrifice Hedron Archive: Draw two cards.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(2), new GenericManaCost(2));
+ ability.addCost(new TapSourceCost());
+ ability.addCost(new SacrificeSourceCost());
+ this.addAbility(ability);
+ }
+
+ public HedronArchive(final HedronArchive card) {
+ super(card);
+ }
+
+ @Override
+ public HedronArchive copy() {
+ return new HedronArchive(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/HeroOfGomaFada.java b/Mage.Sets/src/mage/sets/battleforzendikar/HeroOfGomaFada.java
new file mode 100644
index 00000000000..1ea0b04ce62
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/HeroOfGomaFada.java
@@ -0,0 +1,72 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.AllyEntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.common.continuous.GainAbilityAllEffect;
+import mage.abilities.keyword.IndestructibleAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.filter.common.FilterControlledCreaturePermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class HeroOfGomaFada extends CardImpl {
+
+ public HeroOfGomaFada(UUID ownerId) {
+ super(ownerId, 31, "Hero of Goma Fada", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{4}{W}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Human");
+ this.subtype.add("Knight");
+ this.subtype.add("Ally");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(3);
+
+ // Rally - Whenever Hero of Goma Fada or another Ally enters the battlefield under your control, creatures you control gain indestructible until end of turn.
+ Ability ability = new AllyEntersBattlefieldTriggeredAbility(
+ new GainAbilityAllEffect(IndestructibleAbility.getInstance(), Duration.EndOfTurn,
+ new FilterControlledCreaturePermanent("creatures you control")), false);
+ this.addAbility(ability);
+ }
+
+ public HeroOfGomaFada(final HeroOfGomaFada card) {
+ super(card);
+ }
+
+ @Override
+ public HeroOfGomaFada copy() {
+ return new HeroOfGomaFada(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/IncubatorDrone.java b/Mage.Sets/src/mage/sets/battleforzendikar/IncubatorDrone.java
new file mode 100644
index 00000000000..c6e27dff96f
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/IncubatorDrone.java
@@ -0,0 +1,69 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.game.permanent.token.EldraziScionToken;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class IncubatorDrone extends CardImpl {
+
+ public IncubatorDrone(UUID ownerId) {
+ super(ownerId, 60, "Incubator Drone", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{U}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Drone");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(3);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+
+ // Whenever Incubator Drone enters the battlefield, put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has "Sacrifice this creature: Add {1} to your mana pool."
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new EldraziScionToken())));
+ }
+
+ public IncubatorDrone(final IncubatorDrone card) {
+ super(card);
+ }
+
+ @Override
+ public IncubatorDrone copy() {
+ return new IncubatorDrone(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Island1.java b/Mage.Sets/src/mage/sets/battleforzendikar/Island1.java
new file mode 100644
index 00000000000..d7c7643785a
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Island1.java
@@ -0,0 +1,51 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Island1 extends mage.cards.basiclands.Island {
+
+ public Island1(UUID ownerId) {
+ super(ownerId, 255);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Island1(final Island1 card) {
+ super(card);
+ }
+
+ @Override
+ public Island1 copy() {
+ return new Island1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Island2.java b/Mage.Sets/src/mage/sets/battleforzendikar/Island2.java
new file mode 100644
index 00000000000..191e7a9c944
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Island2.java
@@ -0,0 +1,51 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Island2 extends mage.cards.basiclands.Island {
+
+ public Island2(UUID ownerId) {
+ super(ownerId, 256);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Island2(final Island2 card) {
+ super(card);
+ }
+
+ @Override
+ public Island2 copy() {
+ return new Island2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Island3.java b/Mage.Sets/src/mage/sets/battleforzendikar/Island3.java
new file mode 100644
index 00000000000..d097e0fe234
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Island3.java
@@ -0,0 +1,51 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Island3 extends mage.cards.basiclands.Island {
+
+ public Island3(UUID ownerId) {
+ super(ownerId, 257);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Island3(final Island3 card) {
+ super(card);
+ }
+
+ @Override
+ public Island3 copy() {
+ return new Island3(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Island4.java b/Mage.Sets/src/mage/sets/battleforzendikar/Island4.java
new file mode 100644
index 00000000000..7346a47f65e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Island4.java
@@ -0,0 +1,51 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Island4 extends mage.cards.basiclands.Island {
+
+ public Island4(UUID ownerId) {
+ super(ownerId, 258);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Island4(final Island4 card) {
+ super(card);
+ }
+
+ @Override
+ public Island4 copy() {
+ return new Island4(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Island5.java b/Mage.Sets/src/mage/sets/battleforzendikar/Island5.java
new file mode 100644
index 00000000000..508d1081cc6
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Island5.java
@@ -0,0 +1,51 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Island5 extends mage.cards.basiclands.Island {
+
+ public Island5(UUID ownerId) {
+ super(ownerId, 259);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Island5(final Island5 card) {
+ super(card);
+ }
+
+ @Override
+ public Island5 copy() {
+ return new Island5(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/KioraMasterOfTheDepths.java b/Mage.Sets/src/mage/sets/battleforzendikar/KioraMasterOfTheDepths.java
new file mode 100644
index 00000000000..2cabb3005db
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/KioraMasterOfTheDepths.java
@@ -0,0 +1,261 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.MageObject;
+import mage.abilities.Ability;
+import mage.abilities.LoyaltyAbility;
+import mage.abilities.common.EntersBattlefieldAbility;
+import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.effects.common.GetEmblemEffect;
+import mage.abilities.effects.common.counter.AddCountersSourceEffect;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.cards.Cards;
+import mage.cards.CardsImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.SetTargetPointer;
+import mage.constants.Zone;
+import mage.counters.CounterType;
+import mage.filter.common.FilterCreatureCard;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.common.FilterLandCard;
+import mage.filter.common.FilterLandPermanent;
+import mage.game.Game;
+import mage.game.command.Emblem;
+import mage.game.permanent.Permanent;
+import mage.game.permanent.token.Token;
+import mage.players.Player;
+import mage.target.TargetCard;
+import mage.target.common.TargetCreaturePermanent;
+import mage.target.common.TargetLandPermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class KioraMasterOfTheDepths extends CardImpl {
+
+ public KioraMasterOfTheDepths(UUID ownerId) {
+ super(ownerId, 213, "Kiora, Master of the Depths", Rarity.MYTHIC, new CardType[]{CardType.PLANESWALKER}, "{2}{G}{U}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Kiora");
+
+ this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.LOYALTY.createInstance(4)), false));
+
+ // +1: Untap up to one target creature and up to one target land.
+ LoyaltyAbility ability1 = new LoyaltyAbility(new KioraUntapEffect(), 1);
+ ability1.addTarget(new TargetCreaturePermanent(0, 1, new FilterCreaturePermanent(), false));
+ ability1.addTarget(new TargetLandPermanent(0, 1, new FilterLandPermanent(), false));
+ this.addAbility(ability1);
+
+ // -2: Reveal the top four cards of your library. You may put a creature card and/or a land card from among them into your hand. Put the rest into your graveyard.
+ this.addAbility(new LoyaltyAbility(new KioraRevealEffect(), -2));
+
+ // -8: You get an emblem with "Whenever a creature enters the battlefield under your control, you may have it fight target creature." Then put three 8/8 blue Octopus creature tokens onto the battlefield.
+ Effect effect = new CreateTokenEffect(new OctopusToken(), 3);
+ effect.setText("Then put three 8/8 blue Octopus creature tokens onto the battlefield");
+ LoyaltyAbility ability3 = new LoyaltyAbility(new GetEmblemEffect(new KioraMasterOfTheDepthsEmblem()), -8);
+ ability3.addEffect(effect);
+ this.addAbility(ability3);
+ }
+
+ public KioraMasterOfTheDepths(final KioraMasterOfTheDepths card) {
+ super(card);
+ }
+
+ @Override
+ public KioraMasterOfTheDepths copy() {
+ return new KioraMasterOfTheDepths(this);
+ }
+}
+
+class KioraUntapEffect extends OneShotEffect {
+
+ public KioraUntapEffect() {
+ super(Outcome.Untap);
+ this.staticText = "Untap up to one target creature and up to one target land";
+ }
+
+ public KioraUntapEffect(final KioraUntapEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public KioraUntapEffect copy() {
+ return new KioraUntapEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent firstTarget = game.getPermanent(source.getTargets().get(0).getFirstTarget());
+ Permanent secondTarget = game.getPermanent(source.getTargets().get(1).getFirstTarget());
+ if (firstTarget != null) {
+ firstTarget.untap(game);
+ }
+ if (secondTarget != null) {
+ return secondTarget.untap(game);
+ }
+ return true;
+ }
+}
+
+class KioraRevealEffect extends OneShotEffect {
+
+ public KioraRevealEffect() {
+ super(Outcome.DrawCard);
+ this.staticText = "Reveal the top four cards of your library. You may put a creature card and/or a land card from among them into your hand. Put the rest into your graveyard";
+ }
+
+ public KioraRevealEffect(final KioraRevealEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public KioraRevealEffect copy() {
+ return new KioraRevealEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player player = game.getPlayer(source.getControllerId());
+ MageObject sourceObject = game.getObject(source.getSourceId());
+ if (sourceObject != null && player != null) {
+ Cards cards = new CardsImpl(Zone.PICK);
+ boolean creatureCardFound = false;
+ boolean landCardFound = false;
+ int count = Math.min(player.getLibrary().size(), 4);
+ for (int i = 0; i < count; i++) {
+ Card card = player.getLibrary().removeFromTop(game);
+ if (card != null) {
+ game.setZone(card.getId(), Zone.PICK);
+ cards.add(card);
+ if (card.getCardType().contains(CardType.CREATURE)) {
+ creatureCardFound = true;
+ }
+ if (card.getCardType().contains(CardType.LAND)) {
+ landCardFound = true;
+ }
+ }
+ }
+
+ if (!cards.isEmpty()) {
+ player.revealCards(sourceObject.getName(), cards, game);
+ if ((creatureCardFound || landCardFound)
+ && player.chooseUse(Outcome.DrawCard,
+ "Put a creature card and/or a land card into your hand?", source, game)) {
+ TargetCard target = new TargetCard(Zone.PICK, new FilterCreatureCard("creature card to put into your hand"));
+ if (creatureCardFound && player.choose(Outcome.DrawCard, cards, target, game)) {
+ Card card = cards.get(target.getFirstTarget(), game);
+ if (card != null) {
+ cards.remove(card);
+ card.moveToZone(Zone.HAND, source.getSourceId(), game, false);
+ }
+ }
+
+ target = new TargetCard(Zone.PICK, new FilterLandCard("land card to put into your hand"));
+ if (landCardFound && player.choose(Outcome.DrawCard, cards, target, game)) {
+ Card card = cards.get(target.getFirstTarget(), game);
+ if (card != null) {
+ cards.remove(card);
+ card.moveToZone(Zone.HAND, source.getSourceId(), game, false);
+ }
+ }
+ }
+ }
+ player.moveCards(cards, Zone.PICK, Zone.GRAVEYARD, source, game);
+ return true;
+ }
+ return false;
+ }
+}
+
+class KioraMasterOfTheDepthsEmblem extends Emblem {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Creatures");
+
+ public KioraMasterOfTheDepthsEmblem() {
+ this.setName("EMBLEM: Kiora, Master of the Depths");
+
+ Ability ability = new EntersBattlefieldControlledTriggeredAbility(Zone.COMMAND,
+ new KioraFightEffect(), filter, true, SetTargetPointer.PERMANENT,
+ "Whenever a creature enters the battlefield under your control, you may have it fight target creature.");
+ ability.addTarget(new TargetCreaturePermanent());
+ this.getAbilities().add(ability);
+ }
+}
+
+class KioraFightEffect extends OneShotEffect {
+
+ KioraFightEffect() {
+ super(Outcome.Damage);
+ }
+
+ KioraFightEffect(final KioraFightEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent triggeredCreature = game.getPermanent(getTargetPointer().getFirst(game, source));
+ Permanent target = game.getPermanent(source.getFirstTarget());
+ if (triggeredCreature != null
+ && target != null
+ && triggeredCreature.getCardType().contains(CardType.CREATURE)
+ && target.getCardType().contains(CardType.CREATURE)) {
+ triggeredCreature.fight(target, source, game);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public KioraFightEffect copy() {
+ return new KioraFightEffect(this);
+ }
+}
+
+class OctopusToken extends Token {
+
+ public OctopusToken() {
+ super("Octopus", "8/8 blue Octopus creature token");
+ cardType.add(CardType.CREATURE);
+ color.setBlue(true);
+ subtype.add("Octopus");
+ power = new MageInt(8);
+ toughness = new MageInt(8);
+ this.setOriginalExpansionSetCode("BFZ");
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/KozileksChanneler.java b/Mage.Sets/src/mage/sets/battleforzendikar/KozileksChanneler.java
new file mode 100644
index 00000000000..f2542a772a9
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/KozileksChanneler.java
@@ -0,0 +1,65 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.Mana;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.mana.SimpleManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class KozileksChanneler extends CardImpl {
+
+ public KozileksChanneler(UUID ownerId) {
+ super(ownerId, 10, "Kozilek's Channeler", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{5}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(4);
+
+ // {T}: Add {2} to your mana pool.
+ this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, Mana.ColorlessMana(2), new TapSourceCost()));
+ }
+
+ public KozileksChanneler(final KozileksChanneler card) {
+ super(card);
+ }
+
+ @Override
+ public KozileksChanneler copy() {
+ return new KozileksChanneler(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/LanternScout.java b/Mage.Sets/src/mage/sets/battleforzendikar/LanternScout.java
new file mode 100644
index 00000000000..c06ef6c5116
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/LanternScout.java
@@ -0,0 +1,83 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.AllyEntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.continuous.GainAbilityAllEffect;
+import mage.abilities.keyword.LifelinkAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.filter.FilterPermanent;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.CardIdPredicate;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class LanternScout extends CardImpl {
+
+ public LanternScout(UUID ownerId) {
+ super(ownerId, 37, "Lantern Scout", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{W}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Human");
+ this.subtype.add("Scout");
+ this.subtype.add("Ally");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(2);
+
+ FilterPermanent filter = new FilterPermanent("{this} or another Ally");
+ filter.add(Predicates.or(
+ new CardIdPredicate(this.getId()),
+ new SubtypePredicate("Ally")));
+
+ // Rally - Whenever Lantern Scout or another Ally enters the battlefield under your control, creatures you control gain lifelink until end of turn.
+ Effect effect = new GainAbilityAllEffect(LifelinkAbility.getInstance(), Duration.EndOfTurn, new FilterControlledCreaturePermanent());
+ effect.setText("creatures you control gain lifelink until end of turn");
+ Ability ability = new AllyEntersBattlefieldTriggeredAbility(
+ effect, false);
+ this.addAbility(ability);
+ }
+
+ public LanternScout(final LanternScout card) {
+ super(card);
+ }
+
+ @Override
+ public LanternScout copy() {
+ return new LanternScout(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/LumberingFalls.java b/Mage.Sets/src/mage/sets/battleforzendikar/LumberingFalls.java
new file mode 100644
index 00000000000..1ab770d2fc0
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/LumberingFalls.java
@@ -0,0 +1,89 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.EntersBattlefieldTappedAbility;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect;
+import mage.abilities.keyword.HexproofAbility;
+import mage.abilities.mana.BlueManaAbility;
+import mage.abilities.mana.GreenManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.game.permanent.token.Token;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class LumberingFalls extends CardImpl {
+
+ public LumberingFalls(UUID ownerId) {
+ super(ownerId, 239, "Lumbering Falls", Rarity.RARE, new CardType[]{CardType.LAND}, "");
+ this.expansionSetCode = "BFZ";
+
+ // Lumbering Falls enters the battlefield tapped.
+ this.addAbility(new EntersBattlefieldTappedAbility());
+
+ // {T}: Add {G} or {U} to your mana pool.
+ this.addAbility(new BlueManaAbility());
+ this.addAbility(new GreenManaAbility());
+
+ // {2}{G}{U}: Lumbering Falls becomes a 3/3 green and blue Elemental creature with hexproof until end of turn. It's still a land.
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BecomesCreatureSourceEffect(new LumberingFallsToken(), "land", Duration.EndOfTurn), new ManaCostsImpl("{2}{G}{U}")));
+ }
+
+ public LumberingFalls(final LumberingFalls card) {
+ super(card);
+ }
+
+ @Override
+ public LumberingFalls copy() {
+ return new LumberingFalls(this);
+ }
+}
+
+class LumberingFallsToken extends Token {
+
+ public LumberingFallsToken() {
+ super("", "3/3 green and blue Elemental creature with hexproof");
+ cardType.add(CardType.CREATURE);
+ subtype.add("Elemental");
+ color.setBlue(true);
+ color.setGreen(true);
+ power = new MageInt(3);
+ toughness = new MageInt(3);
+ addAbility(HexproofAbility.getInstance());
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/MistIntruder.java b/Mage.Sets/src/mage/sets/battleforzendikar/MistIntruder.java
new file mode 100644
index 00000000000..87ee253668f
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/MistIntruder.java
@@ -0,0 +1,71 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.keyword.DevoidAbility;
+import mage.abilities.keyword.FlyingAbility;
+import mage.abilities.keyword.IngestAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class MistIntruder extends CardImpl {
+
+ public MistIntruder(UUID ownerId) {
+ super(ownerId, 61, "Mist Intruder", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{U}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Drone");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(2);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+
+ // Ingest
+ this.addAbility(new IngestAbility());
+ }
+
+ public MistIntruder(final MistIntruder card) {
+ super(card);
+ }
+
+ @Override
+ public MistIntruder copy() {
+ return new MistIntruder(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Mountain1.java b/Mage.Sets/src/mage/sets/battleforzendikar/Mountain1.java
new file mode 100644
index 00000000000..049c251e4c5
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Mountain1.java
@@ -0,0 +1,51 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Mountain1 extends mage.cards.basiclands.Mountain {
+
+ public Mountain1(UUID ownerId) {
+ super(ownerId, 265);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Mountain1(final Mountain1 card) {
+ super(card);
+ }
+
+ @Override
+ public Mountain1 copy() {
+ return new Mountain1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Mountain2.java b/Mage.Sets/src/mage/sets/battleforzendikar/Mountain2.java
new file mode 100644
index 00000000000..adb01c46713
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Mountain2.java
@@ -0,0 +1,51 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Mountain2 extends mage.cards.basiclands.Mountain {
+
+ public Mountain2(UUID ownerId) {
+ super(ownerId, 266);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Mountain2(final Mountain2 card) {
+ super(card);
+ }
+
+ @Override
+ public Mountain2 copy() {
+ return new Mountain2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Mountain3.java b/Mage.Sets/src/mage/sets/battleforzendikar/Mountain3.java
new file mode 100644
index 00000000000..38e5f5c4b61
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Mountain3.java
@@ -0,0 +1,51 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Mountain3 extends mage.cards.basiclands.Mountain {
+
+ public Mountain3(UUID ownerId) {
+ super(ownerId, 267);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Mountain3(final Mountain3 card) {
+ super(card);
+ }
+
+ @Override
+ public Mountain3 copy() {
+ return new Mountain3(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Mountain4.java b/Mage.Sets/src/mage/sets/battleforzendikar/Mountain4.java
new file mode 100644
index 00000000000..3d72ef0dbc1
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Mountain4.java
@@ -0,0 +1,51 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Mountain4 extends mage.cards.basiclands.Mountain {
+
+ public Mountain4(UUID ownerId) {
+ super(ownerId, 268);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Mountain4(final Mountain4 card) {
+ super(card);
+ }
+
+ @Override
+ public Mountain4 copy() {
+ return new Mountain4(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Mountain5.java b/Mage.Sets/src/mage/sets/battleforzendikar/Mountain5.java
new file mode 100644
index 00000000000..913411db522
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Mountain5.java
@@ -0,0 +1,51 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Mountain5 extends mage.cards.basiclands.Mountain {
+
+ public Mountain5(UUID ownerId) {
+ super(ownerId, 269);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Mountain5(final Mountain5 card) {
+ super(card);
+ }
+
+ @Override
+ public Mountain5 copy() {
+ return new Mountain5(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/NissasRenewal.java b/Mage.Sets/src/mage/sets/battleforzendikar/NissasRenewal.java
new file mode 100644
index 00000000000..c1fd2e8648b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/NissasRenewal.java
@@ -0,0 +1,62 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.effects.common.GainLifeEffect;
+import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterBasicLandCard;
+import mage.target.common.TargetCardInLibrary;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class NissasRenewal extends CardImpl {
+
+ public NissasRenewal(UUID ownerId) {
+ super(ownerId, 180, "Nissa's Renewal", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{5}{G}");
+ this.expansionSetCode = "BFZ";
+
+ // Search your library for up to three basic land cards, put them onto the battlefield tapped, then shuffle your library. You gain 7 life.
+ this.getSpellAbility().addEffect(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(0, 3, new FilterBasicLandCard()), true));
+ this.getSpellAbility().addEffect(new GainLifeEffect(7));
+ }
+
+ public NissasRenewal(final NissasRenewal card) {
+ super(card);
+ }
+
+ @Override
+ public NissasRenewal copy() {
+ return new NissasRenewal(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/ObNixilisReignited.java b/Mage.Sets/src/mage/sets/battleforzendikar/ObNixilisReignited.java
new file mode 100644
index 00000000000..82ea5a1df23
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/ObNixilisReignited.java
@@ -0,0 +1,131 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.LoyaltyAbility;
+import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.common.EntersBattlefieldAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.DestroyTargetEffect;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.effects.common.GetEmblemTargetPlayerEffect;
+import mage.abilities.effects.common.LoseLifeSourceControllerEffect;
+import mage.abilities.effects.common.counter.AddCountersSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.counters.CounterType;
+import mage.game.Game;
+import mage.game.command.Emblem;
+import mage.game.events.GameEvent;
+import mage.game.events.GameEvent.EventType;
+import mage.target.common.TargetCreaturePermanent;
+import mage.target.common.TargetOpponent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class ObNixilisReignited extends CardImpl {
+
+ public ObNixilisReignited(UUID ownerId) {
+ super(ownerId, 119, "Ob Nixilis Reignited", Rarity.MYTHIC, new CardType[]{CardType.PLANESWALKER}, "{3}{B}{B}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Nixilis");
+
+ this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.LOYALTY.createInstance(5)), false));
+
+ // +1: You draw a card and you lose 1 life.
+ LoyaltyAbility ability1 = new LoyaltyAbility(new DrawCardSourceControllerEffect(1), 1);
+ ability1.addEffect(new LoseLifeSourceControllerEffect(1));
+ this.addAbility(ability1);
+
+ // -3: Destroy target creature.
+ LoyaltyAbility ability2 = new LoyaltyAbility(new DestroyTargetEffect(), -3);
+ ability2.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability2);
+
+ // -8: Target opponent gets an emblem with "Whenever a player draws a card, you lose 2 life."
+ Effect effect = new GetEmblemTargetPlayerEffect(new ObNixilisReignitedEmblem());
+ effect.setText("Target opponent gets an emblem with \"Whenever a player draws a card, you lose 2 life.\"");
+ LoyaltyAbility ability3 = new LoyaltyAbility(effect, -8);
+ ability3.addTarget(new TargetOpponent());
+ this.addAbility(ability3);
+ }
+
+ public ObNixilisReignited(final ObNixilisReignited card) {
+ super(card);
+ }
+
+ @Override
+ public ObNixilisReignited copy() {
+ return new ObNixilisReignited(this);
+ }
+}
+
+class ObNixilisReignitedEmblem extends Emblem {
+
+ public ObNixilisReignitedEmblem() {
+ setName("EMBLEM: Ob Nixilis Reignited");
+
+ this.getAbilities().add(new ObNixilisEmblemTriggeredAbility(new LoseLifeSourceControllerEffect(2), false));
+ }
+}
+
+class ObNixilisEmblemTriggeredAbility extends TriggeredAbilityImpl {
+
+ public ObNixilisEmblemTriggeredAbility(Effect effect, boolean optional) {
+ super(Zone.COMMAND, effect, optional);
+ }
+
+ public ObNixilisEmblemTriggeredAbility(final ObNixilisEmblemTriggeredAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == EventType.DREW_CARD;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ return event.getPlayerId() != null;
+ }
+
+ @Override
+ public String getRule() {
+ return "Whenever a player draws a card, you lose 2 life.";
+ }
+
+ @Override
+ public ObNixilisEmblemTriggeredAbility copy() {
+ return new ObNixilisEmblemTriggeredAbility(this);
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/OblivionSower.java b/Mage.Sets/src/mage/sets/battleforzendikar/OblivionSower.java
new file mode 100644
index 00000000000..bfc7d1b0917
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/OblivionSower.java
@@ -0,0 +1,119 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.CastSourceTriggeredAbility;
+import mage.abilities.effects.common.ExileCardsFromTopOfLibraryTargetEffect;
+import mage.cards.CardImpl;
+import mage.cards.Cards;
+import mage.cards.CardsImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.FilterCard;
+import mage.filter.common.FilterLandCard;
+import mage.filter.predicate.other.OwnerIdPredicate;
+import mage.game.Game;
+import mage.players.Player;
+import mage.target.TargetCard;
+import mage.target.common.TargetOpponent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class OblivionSower extends CardImpl {
+
+ public OblivionSower(UUID ownerId) {
+ super(ownerId, 11, "Oblivion Sower", Rarity.MYTHIC, new CardType[]{CardType.CREATURE}, "{6}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.power = new MageInt(5);
+ this.toughness = new MageInt(8);
+
+ // When you cast Oblivion Sower, target opponent exiles the top four cards of his or her library, then you may put any number of land cards that player owns from exile onto the battlefield under your control.
+ Ability ability = new CastSourceTriggeredAbility(new ExileCardsFromTopOfLibraryTargetEffect(4, "target opponent"), false);
+ ability.addEffect(new OblivionSowerEffect());
+ ability.addTarget(new TargetOpponent());
+ this.addAbility(ability);
+ }
+
+ public OblivionSower(final OblivionSower card) {
+ super(card);
+ }
+
+ @Override
+ public OblivionSower copy() {
+ return new OblivionSower(this);
+ }
+}
+
+class OblivionSowerEffect extends OneShotEffect {
+
+ public OblivionSowerEffect() {
+ super(Outcome.PutLandInPlay);
+ this.staticText = ", then you may put any number of land cards that player owns from exile onto the battlefield under your control";
+ }
+
+ public OblivionSowerEffect(final OblivionSowerEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public OblivionSowerEffect copy() {
+ return new OblivionSowerEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ Player targetPlayer = game.getPlayer(getTargetPointer().getFirst(game, source));
+ if (controller != null && targetPlayer != null) {
+ FilterLandCard filter = new FilterLandCard();
+ filter.add(new OwnerIdPredicate(targetPlayer.getId()));
+ Cards exiledCards = new CardsImpl();
+ exiledCards.addAll(game.getExile().getAllCards(game));
+ Cards exiledLands = new CardsImpl();
+ exiledLands.addAll(exiledCards.getCards(filter, source.getSourceId(), controller.getId(), game));
+ if (!exiledLands.isEmpty() && controller.chooseUse(outcome, "Put lands into play?", source, game)) {
+ FilterCard filterToPlay = new FilterCard("Lands owned by " + targetPlayer.getName() + " to put into play under your control");
+ TargetCard targetCards = new TargetCard(0, exiledLands.size(), Zone.EXILED, filterToPlay);
+ if (controller.chooseTarget(outcome, exiledLands, targetCards, source, game)) {
+ controller.moveCards(new CardsImpl(targetCards.getTargets()), null, Zone.BATTLEFIELD, source, game);
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/OmnathLocusOfRage.java b/Mage.Sets/src/mage/sets/battleforzendikar/OmnathLocusOfRage.java
new file mode 100644
index 00000000000..c09d7fe5080
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/OmnathLocusOfRage.java
@@ -0,0 +1,101 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.DiesThisOrAnotherCreatureTriggeredAbility;
+import mage.abilities.common.LandfallAbility;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+import mage.filter.predicate.permanent.ControllerPredicate;
+import mage.game.permanent.token.Token;
+import mage.target.common.TargetCreatureOrPlayer;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class OmnathLocusOfRage extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Elemental you control");
+
+ static {
+ filter.add(new SubtypePredicate("Elemental"));
+ filter.add(new ControllerPredicate(TargetController.YOU));
+ }
+
+ public OmnathLocusOfRage(UUID ownerId) {
+ super(ownerId, 217, "Omnath, Locus of Rage", Rarity.MYTHIC, new CardType[]{CardType.CREATURE}, "{3}{R}{R}{G}{G}");
+ this.expansionSetCode = "BFZ";
+ this.supertype.add("Legendary");
+ this.subtype.add("Elemental");
+ this.power = new MageInt(5);
+ this.toughness = new MageInt(5);
+
+ // Landfall - Whenever a land enters the battlefield under your control, put a 5/5 red and green Elemental creature token onto the battlefield.
+ this.addAbility(new LandfallAbility(new CreateTokenEffect(new OmnathElementalToken()), false));
+
+ // Whenever Omnath, Locus of Rage or another Elemental you control dies, Omnath deals 3 damage to target creature or player.
+ Ability ability = new DiesThisOrAnotherCreatureTriggeredAbility(new DamageTargetEffect(3), false, filter);
+ ability.addTarget(new TargetCreatureOrPlayer());
+ this.addAbility(ability);
+ }
+
+ public OmnathLocusOfRage(final OmnathLocusOfRage card) {
+ super(card);
+ }
+
+ @Override
+ public OmnathLocusOfRage copy() {
+ return new OmnathLocusOfRage(this);
+ }
+}
+
+class OmnathElementalToken extends Token {
+
+ OmnathElementalToken() {
+ super("Elemental", "5/5 red and green Elemental creature token");
+ setTokenType(1);
+ setOriginalExpansionSetCode("BFZ");
+ cardType.add(CardType.CREATURE);
+ subtype.add("Elemental");
+
+ color.setRed(true);
+ color.setGreen(true);
+ power = new MageInt(5);
+ toughness = new MageInt(5);
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/OranRiefHydra.java b/Mage.Sets/src/mage/sets/battleforzendikar/OranRiefHydra.java
new file mode 100644
index 00000000000..b3f7679d293
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/OranRiefHydra.java
@@ -0,0 +1,155 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.counters.CounterType;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.permanent.Permanent;
+import mage.target.targetpointer.FixedTarget;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class OranRiefHydra extends CardImpl {
+
+ public OranRiefHydra(UUID ownerId) {
+ super(ownerId, 181, "Oran-Rief Hydra", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{4}{G}{G}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Hydra");
+ this.power = new MageInt(5);
+ this.toughness = new MageInt(5);
+
+ // Trample
+ this.addAbility(TrampleAbility.getInstance());
+
+ // Landfall - Whenever a land enters the battlefield under your control, put a +1/+1 counter on Oran-Rief Hydra.
+ // If that land is a Forest, put two +1/+1 counters on Oran-Rief Hydra instead.
+ this.addAbility(new OranRiefHydraTriggeredAbility());
+ }
+
+ public OranRiefHydra(final OranRiefHydra card) {
+ super(card);
+ }
+
+ @Override
+ public OranRiefHydra copy() {
+ return new OranRiefHydra(this);
+ }
+}
+
+class OranRiefHydraTriggeredAbility extends TriggeredAbilityImpl {
+
+ private static final String text = "Landfall - Whenever a land enters the battlefield under your control, put a +1/+1 counter on Oran-Rief Hydra. "
+ + "If that land is a Forest, put two +1/+1 counters on Oran-Rief Hydra instead.";
+
+ public OranRiefHydraTriggeredAbility() {
+ super(Zone.BATTLEFIELD, new OranRiefHydraEffect());
+ }
+
+ public OranRiefHydraTriggeredAbility(final OranRiefHydraTriggeredAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public OranRiefHydraTriggeredAbility copy() {
+ return new OranRiefHydraTriggeredAbility(this);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ Permanent permanent = game.getPermanent(event.getTargetId());
+ if (permanent != null
+ && permanent.getCardType().contains(CardType.LAND)
+ && permanent.getControllerId().equals(getControllerId())) {
+ Permanent sourcePermanent = game.getPermanent(getSourceId());
+ if (sourcePermanent != null)
+ for (Effect effect : getEffects()) {
+ if (effect instanceof OranRiefHydraEffect) {
+ effect.setTargetPointer(new FixedTarget(permanent, game));
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public String getRule() {
+ return text;
+ }
+}
+
+class OranRiefHydraEffect extends OneShotEffect {
+
+ public OranRiefHydraEffect() {
+ super(Outcome.BoostCreature);
+ }
+
+ public OranRiefHydraEffect(final OranRiefHydraEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public OranRiefHydraEffect copy() {
+ return new OranRiefHydraEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent land = game.getPermanentOrLKIBattlefield(getTargetPointer().getFirst(game, source));
+ Permanent sourcePermanent = game.getPermanent(source.getSourceId());
+ if (land != null && sourcePermanent != null) {
+ if (land.hasSubtype("Forest")) {
+ sourcePermanent.addCounters(CounterType.P1P1.createInstance(2), game);
+ } else {
+ sourcePermanent.addCounters(CounterType.P1P1.createInstance(), game);
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Plains1.java b/Mage.Sets/src/mage/sets/battleforzendikar/Plains1.java
new file mode 100644
index 00000000000..4b2a1798cf6
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Plains1.java
@@ -0,0 +1,51 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Plains1 extends mage.cards.basiclands.Plains {
+
+ public Plains1(UUID ownerId) {
+ super(ownerId, 250);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Plains1(final Plains1 card) {
+ super(card);
+ }
+
+ @Override
+ public Plains1 copy() {
+ return new Plains1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Plains2.java b/Mage.Sets/src/mage/sets/battleforzendikar/Plains2.java
new file mode 100644
index 00000000000..d278d488fbd
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Plains2.java
@@ -0,0 +1,51 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Plains2 extends mage.cards.basiclands.Plains {
+
+ public Plains2(UUID ownerId) {
+ super(ownerId, 251);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Plains2(final Plains2 card) {
+ super(card);
+ }
+
+ @Override
+ public Plains2 copy() {
+ return new Plains2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Plains3.java b/Mage.Sets/src/mage/sets/battleforzendikar/Plains3.java
new file mode 100644
index 00000000000..93a2b32e206
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Plains3.java
@@ -0,0 +1,51 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Plains3 extends mage.cards.basiclands.Plains {
+
+ public Plains3(UUID ownerId) {
+ super(ownerId, 252);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Plains3(final Plains3 card) {
+ super(card);
+ }
+
+ @Override
+ public Plains3 copy() {
+ return new Plains3(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Plains4.java b/Mage.Sets/src/mage/sets/battleforzendikar/Plains4.java
new file mode 100644
index 00000000000..7c95ef89458
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Plains4.java
@@ -0,0 +1,51 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Plains4 extends mage.cards.basiclands.Plains {
+
+ public Plains4(UUID ownerId) {
+ super(ownerId, 253);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Plains4(final Plains4 card) {
+ super(card);
+ }
+
+ @Override
+ public Plains4 copy() {
+ return new Plains4(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Plains5.java b/Mage.Sets/src/mage/sets/battleforzendikar/Plains5.java
new file mode 100644
index 00000000000..df7ccc8563b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Plains5.java
@@ -0,0 +1,51 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Plains5 extends mage.cards.basiclands.Plains {
+
+ public Plains5(UUID ownerId) {
+ super(ownerId, 254);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Plains5(final Plains5 card) {
+ super(card);
+ }
+
+ @Override
+ public Plains5 copy() {
+ return new Plains5(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/PlanarOutburst.java b/Mage.Sets/src/mage/sets/battleforzendikar/PlanarOutburst.java
new file mode 100644
index 00000000000..20819210fb9
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/PlanarOutburst.java
@@ -0,0 +1,71 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.effects.common.DestroyAllEffect;
+import mage.abilities.keyword.AwakenAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.CardTypePredicate;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class PlanarOutburst extends CardImpl {
+
+ private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("nonland creatures");
+
+ static {
+ filter.add(Predicates.not(new CardTypePredicate(CardType.LAND)));
+ }
+
+ public PlanarOutburst(UUID ownerId) {
+ super(ownerId, 42, "Planar Outburst", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{3}{W}{W}");
+ this.expansionSetCode = "BFZ";
+
+ // Destroy all nonland creatures.
+ this.getSpellAbility().addEffect(new DestroyAllEffect(filter, false));
+
+ // Awaken 4-{5}{W}{W}{W}
+ this.addAbility(new AwakenAbility(this, 4, "{5}{W}{W}{W}"));
+ }
+
+ public PlanarOutburst(final PlanarOutburst card) {
+ super(card);
+ }
+
+ @Override
+ public PlanarOutburst copy() {
+ return new PlanarOutburst(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/PrairieStream.java b/Mage.Sets/src/mage/sets/battleforzendikar/PrairieStream.java
new file mode 100644
index 00000000000..872fca6ef52
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/PrairieStream.java
@@ -0,0 +1,79 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.common.EntersBattlefieldAbility;
+import mage.abilities.condition.Condition;
+import mage.abilities.condition.InvertCondition;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.decorator.ConditionalOneShotEffect;
+import mage.abilities.effects.common.TapSourceEffect;
+import mage.abilities.mana.BlueManaAbility;
+import mage.abilities.mana.WhiteManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterLandPermanent;
+import mage.filter.predicate.mageobject.SupertypePredicate;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class PrairieStream extends CardImpl {
+
+ private static final FilterLandPermanent filter = new FilterLandPermanent();
+
+ static {
+ filter.add(new SupertypePredicate("Basic"));
+ }
+
+ public PrairieStream(UUID ownerId) {
+ super(ownerId, 241, "Prairie Stream", Rarity.RARE, new CardType[]{CardType.LAND}, "");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Plains");
+ this.subtype.add("Island");
+
+ // Prairie Stream enters the battlefield tapped unless you control two or more basic lands.
+ Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(filter, PermanentsOnTheBattlefieldCondition.CountType.MORE_THAN, 1));
+ String abilityText = "tapped unless you control two or more basic lands";
+ this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText));
+ this.addAbility(new WhiteManaAbility());
+ this.addAbility(new BlueManaAbility());
+ }
+
+ public PrairieStream(final PrairieStream card) {
+ super(card);
+ }
+
+ @Override
+ public PrairieStream copy() {
+ return new PrairieStream(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/RadiantFlames.java b/Mage.Sets/src/mage/sets/battleforzendikar/RadiantFlames.java
new file mode 100644
index 00000000000..da9829e3905
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/RadiantFlames.java
@@ -0,0 +1,62 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.dynamicvalue.common.ColorsOfManaSpentToCastCount;
+import mage.abilities.effects.common.DamageAllEffect;
+import mage.cards.CardImpl;
+import mage.constants.AbilityWord;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterCreaturePermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class RadiantFlames extends CardImpl {
+
+ public RadiantFlames(UUID ownerId) {
+ super(ownerId, 151, "Radiant Flames", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{2}{R}");
+ this.expansionSetCode = "BFZ";
+
+ // Converge — Radiant Flames deals X damage to each creature, where X is the number of colors of mana spent to cast Radiant Flames.
+ getSpellAbility().setAbilityWord(AbilityWord.CONVERGE);
+ getSpellAbility().addEffect(new DamageAllEffect(ColorsOfManaSpentToCastCount.getInstance(), new FilterCreaturePermanent()));
+ }
+
+ public RadiantFlames(final RadiantFlames card) {
+ super(card);
+ }
+
+ @Override
+ public RadiantFlames copy() {
+ return new RadiantFlames(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/RetreatToEmeria.java b/Mage.Sets/src/mage/sets/battleforzendikar/RetreatToEmeria.java
new file mode 100644
index 00000000000..6aa51bd4f38
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/RetreatToEmeria.java
@@ -0,0 +1,81 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Mode;
+import mage.abilities.common.LandfallAbility;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.effects.common.continuous.BoostControlledEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.game.permanent.token.Token;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class RetreatToEmeria extends CardImpl {
+
+ public RetreatToEmeria(UUID ownerId) {
+ super(ownerId, 44, "Retreat to Emeria", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{3}{W}");
+ this.expansionSetCode = "BFZ";
+
+ // Landfall - Whenever a land enters the battlefield under you control, choose one - Put a 1/1 white Kor Ally creature token onto the battlefield; or Creatures you control get +1/+1 until end of turn.
+ LandfallAbility ability = new LandfallAbility(new CreateTokenEffect(new KorAllyToken()), false);
+ Mode mode = new Mode();
+ mode.getEffects().add(new BoostControlledEffect(1, 1, Duration.EndOfTurn));
+ ability.addMode(mode);
+ this.addAbility(ability);
+ }
+
+ public RetreatToEmeria(final RetreatToEmeria card) {
+ super(card);
+ }
+
+ @Override
+ public RetreatToEmeria copy() {
+ return new RetreatToEmeria(this);
+ }
+}
+
+class KorAllyToken extends Token {
+
+ public KorAllyToken() {
+ super("Kor Ally", "1/1 white Kor Ally creature token");
+ cardType.add(CardType.CREATURE);
+ subtype.add("Kor");
+ subtype.add("Ally");
+ color.setWhite(true);
+ power = new MageInt(1);
+ toughness = new MageInt(1);
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/RetreatToKazandu.java b/Mage.Sets/src/mage/sets/battleforzendikar/RetreatToKazandu.java
index 9e6a22241c0..8d767821c63 100644
--- a/Mage.Sets/src/mage/sets/battleforzendikar/RetreatToKazandu.java
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/RetreatToKazandu.java
@@ -37,7 +37,7 @@ public class RetreatToKazandu extends mage.sets.zendikarvseldrazi.RetreatToKazan
public RetreatToKazandu(UUID ownerId) {
super(ownerId);
- this.cardNumber = 999;
+ this.cardNumber = 186;
this.expansionSetCode = "BFZ";
}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/RollingThunder.java b/Mage.Sets/src/mage/sets/battleforzendikar/RollingThunder.java
new file mode 100644
index 00000000000..5201f9e3cea
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/RollingThunder.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class RollingThunder extends mage.sets.tempestremastered.RollingThunder {
+
+ public RollingThunder(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 154;
+ this.expansionSetCode = "BFZ";
+ }
+
+ public RollingThunder(final RollingThunder card) {
+ super(card);
+ }
+
+ @Override
+ public RollingThunder copy() {
+ return new RollingThunder(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/RuinousPath.java b/Mage.Sets/src/mage/sets/battleforzendikar/RuinousPath.java
new file mode 100644
index 00000000000..61df7d66f0b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/RuinousPath.java
@@ -0,0 +1,64 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.effects.common.DestroyTargetEffect;
+import mage.abilities.keyword.AwakenAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.target.common.TargetCreatureOrPlaneswalker;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class RuinousPath extends CardImpl {
+
+ public RuinousPath(UUID ownerId) {
+ super(ownerId, 123, "Ruinous Path", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{1}{B}{B}");
+ this.expansionSetCode = "BFZ";
+
+ // Destroy target creature or planeswalker.
+ this.getSpellAbility().addEffect(new DestroyTargetEffect());
+ this.getSpellAbility().addTarget(new TargetCreatureOrPlaneswalker());
+
+ // Awaken 4-{5}{B}{B}
+ this.addAbility(new AwakenAbility(this, 4, "{5}{B}{B}"));
+ }
+
+ public RuinousPath(final RuinousPath card) {
+ super(card);
+ }
+
+ @Override
+ public RuinousPath copy() {
+ return new RuinousPath(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/ScytheLeopard.java b/Mage.Sets/src/mage/sets/battleforzendikar/ScytheLeopard.java
new file mode 100644
index 00000000000..7e1b5ded1bc
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/ScytheLeopard.java
@@ -0,0 +1,64 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.LandfallAbility;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class ScytheLeopard extends CardImpl {
+
+ public ScytheLeopard(UUID ownerId) {
+ super(ownerId, 188, "Scythe Leopard", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{G}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Cat");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // Landfall-Whenever a land enters the battlefield under your control, Scythe Leopard gets +1/+1 until end of turn.
+ this.addAbility(new LandfallAbility(new BoostSourceEffect(1, 1, Duration.EndOfTurn), false));
+ }
+
+ public ScytheLeopard(final ScytheLeopard card) {
+ super(card);
+ }
+
+ @Override
+ public ScytheLeopard copy() {
+ return new ScytheLeopard(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/SheerDrop.java b/Mage.Sets/src/mage/sets/battleforzendikar/SheerDrop.java
new file mode 100644
index 00000000000..23eb73d84ae
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/SheerDrop.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class SheerDrop extends mage.sets.zendikarvseldrazi.SheerDrop {
+
+ public SheerDrop(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 48;
+ this.expansionSetCode = "BFZ";
+ }
+
+ public SheerDrop(final SheerDrop card) {
+ super(card);
+ }
+
+ @Override
+ public SheerDrop copy() {
+ return new SheerDrop(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Skitterskin.java b/Mage.Sets/src/mage/sets/battleforzendikar/Skitterskin.java
new file mode 100644
index 00000000000..02439832d6a
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Skitterskin.java
@@ -0,0 +1,90 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.ActivateIfConditionActivatedAbility;
+import mage.abilities.common.CantBlockAbility;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.RegenerateSourceEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.filter.predicate.mageobject.ColorlessPredicate;
+import mage.filter.predicate.permanent.AnotherPredicate;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Skitterskin extends CardImpl {
+
+ private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("you control another colorless creature");
+
+ static {
+ filter.add(new AnotherPredicate());
+ filter.add(new ColorlessPredicate());
+ }
+
+ public Skitterskin(UUID ownerId) {
+ super(ownerId, 97, "Skitterskin", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{B}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Drone");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(3);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+
+ // Skitterskin can't block.
+ this.addAbility(new CantBlockAbility());
+
+ // {1}{B}: Regenerate Skitterskin. Activate this ability only if you control another colorless creature.
+ Ability ability = new ActivateIfConditionActivatedAbility(Zone.BATTLEFIELD,
+ new RegenerateSourceEffect(),
+ new ManaCostsImpl("{1}{B}"),
+ new PermanentsOnTheBattlefieldCondition(filter));
+ this.addAbility(ability);
+ }
+
+ public Skitterskin(final Skitterskin card) {
+ super(card);
+ }
+
+ @Override
+ public Skitterskin copy() {
+ return new Skitterskin(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/SmolderingMarsh.java b/Mage.Sets/src/mage/sets/battleforzendikar/SmolderingMarsh.java
new file mode 100644
index 00000000000..cf49a37bcaa
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/SmolderingMarsh.java
@@ -0,0 +1,79 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.common.EntersBattlefieldAbility;
+import mage.abilities.condition.Condition;
+import mage.abilities.condition.InvertCondition;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.decorator.ConditionalOneShotEffect;
+import mage.abilities.effects.common.TapSourceEffect;
+import mage.abilities.mana.BlackManaAbility;
+import mage.abilities.mana.RedManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterLandPermanent;
+import mage.filter.predicate.mageobject.SupertypePredicate;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class SmolderingMarsh extends CardImpl {
+
+ private static final FilterLandPermanent filter = new FilterLandPermanent();
+
+ static {
+ filter.add(new SupertypePredicate("Basic"));
+ }
+
+ public SmolderingMarsh(UUID ownerId) {
+ super(ownerId, 247, "Smoldering Marsh", Rarity.RARE, new CardType[]{CardType.LAND}, "");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Swamp");
+ this.subtype.add("Mountain");
+
+ // Smoldering Marsh enters the battlefield tapped unless you control two or more basic lands.
+ Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(filter, PermanentsOnTheBattlefieldCondition.CountType.MORE_THAN, 1));
+ String abilityText = "tapped unless you control two or more basic lands";
+ this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText));
+ this.addAbility(new BlackManaAbility());
+ this.addAbility(new RedManaAbility());
+ }
+
+ public SmolderingMarsh(final SmolderingMarsh card) {
+ super(card);
+ }
+
+ @Override
+ public SmolderingMarsh copy() {
+ return new SmolderingMarsh(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/SmotheringAbomination.java b/Mage.Sets/src/mage/sets/battleforzendikar/SmotheringAbomination.java
new file mode 100644
index 00000000000..93158d66475
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/SmotheringAbomination.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.effects.common.SacrificeControllerEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.events.GameEvent.EventType;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class SmotheringAbomination extends CardImpl {
+
+ public SmotheringAbomination(UUID ownerId) {
+ super(ownerId, 99, "Smothering Abomination", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{B}{B}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Eldrazi");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(3);
+
+ // Devoid
+ this.addAbility(new DevoidAbility(this.color));
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+
+ // At the beginning of your upkeep, sacrifice a creature
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(new SacrificeControllerEffect(
+ new FilterCreaturePermanent(), 1, null), TargetController.YOU, false));
+
+ // Whenever you sacrifice a creature, draw a card.
+ this.addAbility(new SmotheringAbominationTriggeredAbility());
+ }
+
+ public SmotheringAbomination(final SmotheringAbomination card) {
+ super(card);
+ }
+
+ @Override
+ public SmotheringAbomination copy() {
+ return new SmotheringAbomination(this);
+ }
+}
+
+class SmotheringAbominationTriggeredAbility extends TriggeredAbilityImpl {
+
+ public SmotheringAbominationTriggeredAbility() {
+ super(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1));
+ }
+
+ public SmotheringAbominationTriggeredAbility(final SmotheringAbominationTriggeredAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public SmotheringAbominationTriggeredAbility copy() {
+ return new SmotheringAbominationTriggeredAbility(this);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == EventType.SACRIFICED_PERMANENT;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ return event.getPlayerId().equals(this.getControllerId())
+ && game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD).getCardType().contains(CardType.CREATURE);
+ }
+
+ @Override
+ public String getRule() {
+ return "Whenever you sacrifice a creature, " + super.getRule();
+ }
+}
+
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/StasisSnare.java b/Mage.Sets/src/mage/sets/battleforzendikar/StasisSnare.java
new file mode 100644
index 00000000000..ac6704bb5cd
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/StasisSnare.java
@@ -0,0 +1,112 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.common.delayed.OnLeaveReturnExiledToBattlefieldAbility;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
+import mage.abilities.effects.common.ExileTargetEffect;
+import mage.abilities.keyword.FlashAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.permanent.ControllerPredicate;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.target.common.TargetCreaturePermanent;
+import mage.util.CardUtil;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class StasisSnare extends CardImpl {
+
+ private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("creature an opponent controls");
+
+ static {
+ filter.add(new ControllerPredicate(TargetController.OPPONENT));
+ }
+
+ public StasisSnare(UUID ownerId) {
+ super(ownerId, 50, "Stasis Snare", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}{W}");
+ this.expansionSetCode = "BFZ";
+
+ // Flash
+ this.addAbility(FlashAbility.getInstance());
+
+ // When Stasis Snare enters the battlefield, exile target creature an opponent controls until Stasis Snare leaves the battlefield.
+ Ability ability = new EntersBattlefieldTriggeredAbility(new StasisSnareExileEffect());
+ ability.addTarget(new TargetCreaturePermanent(filter));
+ ability.addEffect(new CreateDelayedTriggeredAbilityEffect(new OnLeaveReturnExiledToBattlefieldAbility()));
+ this.addAbility(ability);
+ }
+
+ public StasisSnare(final StasisSnare card) {
+ super(card);
+ }
+
+ @Override
+ public StasisSnare copy() {
+ return new StasisSnare(this);
+ }
+}
+
+class StasisSnareExileEffect extends OneShotEffect {
+
+ public StasisSnareExileEffect() {
+ super(Outcome.Benefit);
+ this.staticText = "exile target creature an opponent controls until Stasis Snare leaves the battlefield";
+ }
+
+ public StasisSnareExileEffect(final StasisSnareExileEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public StasisSnareExileEffect copy() {
+ return new StasisSnareExileEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent permanent = game.getPermanent(source.getSourceId());
+ // If Stasis Snare leaves the battlefield before its triggered ability resolves,
+ // the target won't be exiled.
+ if (permanent != null) {
+ return new ExileTargetEffect(CardUtil.getCardExileZoneId(game, source), permanent.getIdName()).apply(game, source);
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/SunkenHollow.java b/Mage.Sets/src/mage/sets/battleforzendikar/SunkenHollow.java
new file mode 100644
index 00000000000..6a585b8ca82
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/SunkenHollow.java
@@ -0,0 +1,79 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.common.EntersBattlefieldAbility;
+import mage.abilities.condition.Condition;
+import mage.abilities.condition.InvertCondition;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.decorator.ConditionalOneShotEffect;
+import mage.abilities.effects.common.TapSourceEffect;
+import mage.abilities.mana.BlackManaAbility;
+import mage.abilities.mana.BlueManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterLandPermanent;
+import mage.filter.predicate.mageobject.SupertypePredicate;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class SunkenHollow extends CardImpl {
+
+ private static final FilterLandPermanent filter = new FilterLandPermanent();
+
+ static {
+ filter.add(new SupertypePredicate("Basic"));
+ }
+
+ public SunkenHollow(UUID ownerId) {
+ super(ownerId, 248, "Sunken Hollow", Rarity.RARE, new CardType[]{CardType.LAND}, "");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Island");
+ this.subtype.add("Swamp");
+
+ // Sunken Hollow enters the battlefield tapped unless you control two or more basic lands.
+ Condition controls = new InvertCondition(new PermanentsOnTheBattlefieldCondition(filter, PermanentsOnTheBattlefieldCondition.CountType.MORE_THAN, 1));
+ String abilityText = "tapped unless you control two or more basic lands";
+ this.addAbility(new EntersBattlefieldAbility(new ConditionalOneShotEffect(new TapSourceEffect(), controls, abilityText), abilityText));
+ this.addAbility(new BlueManaAbility());
+ this.addAbility(new BlackManaAbility());
+ }
+
+ public SunkenHollow(final SunkenHollow card) {
+ super(card);
+ }
+
+ @Override
+ public SunkenHollow copy() {
+ return new SunkenHollow(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Swamp1.java b/Mage.Sets/src/mage/sets/battleforzendikar/Swamp1.java
new file mode 100644
index 00000000000..bea737b3749
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Swamp1.java
@@ -0,0 +1,51 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Swamp1 extends mage.cards.basiclands.Swamp {
+
+ public Swamp1(UUID ownerId) {
+ super(ownerId, 260);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Swamp1(final Swamp1 card) {
+ super(card);
+ }
+
+ @Override
+ public Swamp1 copy() {
+ return new Swamp1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Swamp2.java b/Mage.Sets/src/mage/sets/battleforzendikar/Swamp2.java
new file mode 100644
index 00000000000..0436899d9cd
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Swamp2.java
@@ -0,0 +1,51 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Swamp2 extends mage.cards.basiclands.Swamp {
+
+ public Swamp2(UUID ownerId) {
+ super(ownerId, 261);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Swamp2(final Swamp2 card) {
+ super(card);
+ }
+
+ @Override
+ public Swamp2 copy() {
+ return new Swamp2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Swamp3.java b/Mage.Sets/src/mage/sets/battleforzendikar/Swamp3.java
new file mode 100644
index 00000000000..4bceb8a424f
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Swamp3.java
@@ -0,0 +1,51 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Swamp3 extends mage.cards.basiclands.Swamp {
+
+ public Swamp3(UUID ownerId) {
+ super(ownerId, 262);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Swamp3(final Swamp3 card) {
+ super(card);
+ }
+
+ @Override
+ public Swamp3 copy() {
+ return new Swamp3(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Swamp4.java b/Mage.Sets/src/mage/sets/battleforzendikar/Swamp4.java
new file mode 100644
index 00000000000..87bd2b49c77
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Swamp4.java
@@ -0,0 +1,51 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Swamp4 extends mage.cards.basiclands.Swamp {
+
+ public Swamp4(UUID ownerId) {
+ super(ownerId, 263);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Swamp4(final Swamp4 card) {
+ super(card);
+ }
+
+ @Override
+ public Swamp4 copy() {
+ return new Swamp4(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/Swamp5.java b/Mage.Sets/src/mage/sets/battleforzendikar/Swamp5.java
new file mode 100644
index 00000000000..b2ebc6e3935
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/Swamp5.java
@@ -0,0 +1,51 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Swamp5 extends mage.cards.basiclands.Swamp {
+
+ public Swamp5(UUID ownerId) {
+ super(ownerId, 264);
+ this.expansionSetCode = "BFZ";
+ }
+
+ public Swamp5(final Swamp5 card) {
+ super(card);
+ }
+
+ @Override
+ public Swamp5 copy() {
+ return new Swamp5(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/TajuruWarcaller.java b/Mage.Sets/src/mage/sets/battleforzendikar/TajuruWarcaller.java
new file mode 100644
index 00000000000..ea6a0665eed
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/TajuruWarcaller.java
@@ -0,0 +1,66 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.AllyEntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.common.continuous.BoostControlledEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class TajuruWarcaller extends CardImpl {
+
+ public TajuruWarcaller(UUID ownerId) {
+ super(ownerId, 195, "Tajuru Warcaller", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{G}{G}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Elf");
+ this.subtype.add("Warrior");
+ this.subtype.add("Ally");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(1);
+
+ // Rally-Whenever Tajuru Warcaller or another Ally enters the battlefield under your control, creatures you control get +2/+2 until end of turn.
+ this.addAbility(new AllyEntersBattlefieldTriggeredAbility(new BoostControlledEffect(2, 2, Duration.EndOfTurn), false));
+ }
+
+ public TajuruWarcaller(final TajuruWarcaller card) {
+ super(card);
+ }
+
+ @Override
+ public TajuruWarcaller copy() {
+ return new TajuruWarcaller(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/TandemTactics.java b/Mage.Sets/src/mage/sets/battleforzendikar/TandemTactics.java
new file mode 100644
index 00000000000..d766749c509
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/TandemTactics.java
@@ -0,0 +1,66 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.GainLifeEffect;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class TandemTactics extends CardImpl {
+
+ public TandemTactics(UUID ownerId) {
+ super(ownerId, 52, "Tandem Tactics", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{W}");
+ this.expansionSetCode = "BFZ";
+
+ // Up to two target creatures each get +1/+2 until end of turn. You gain 2 life.
+ Effect effect = new BoostTargetEffect(1, 2, Duration.EndOfTurn);
+ effect.setText("Up to two target creatures each get +1/+2 until end of turn");
+ this.getSpellAbility().addEffect(effect);
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 2));
+ this.getSpellAbility().addEffect(new GainLifeEffect(2));
+ }
+
+ public TandemTactics(final TandemTactics card) {
+ super(card);
+ }
+
+ @Override
+ public TandemTactics copy() {
+ return new TandemTactics(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/TitansPresence.java b/Mage.Sets/src/mage/sets/battleforzendikar/TitansPresence.java
new file mode 100644
index 00000000000..f19f583b71d
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/TitansPresence.java
@@ -0,0 +1,117 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.List;
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.costs.common.RevealTargetFromHandCost;
+import mage.abilities.effects.OneShotEffect;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreatureCard;
+import mage.filter.predicate.mageobject.ColorlessPredicate;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+import mage.target.common.TargetCardInHand;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class TitansPresence extends CardImpl {
+
+ private static final FilterCreatureCard filter = new FilterCreatureCard("a colorless creature card from your hand to reveal");
+
+ static {
+ filter.add(new ColorlessPredicate());
+ }
+
+ public TitansPresence(UUID ownerId) {
+ super(ownerId, 14, "Titan's Presence", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{3}");
+ this.expansionSetCode = "BFZ";
+
+ // As an additional cost to cast Titan's Presence, reveal a colorless creature card from your hand.
+ this.getSpellAbility().addCost(new RevealTargetFromHandCost(new TargetCardInHand(filter)));
+
+ // Exile target creature if its power is less than or equal to the revealed card's power.
+ this.getSpellAbility().addEffect(new TitansPresenceEffect());
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent());
+ }
+
+ public TitansPresence(final TitansPresence card) {
+ super(card);
+ }
+
+ @Override
+ public TitansPresence copy() {
+ return new TitansPresence(this);
+ }
+}
+
+class TitansPresenceEffect extends OneShotEffect {
+
+ public TitansPresenceEffect() {
+ super(Outcome.Exile);
+ staticText = "Exile target creature if its power is less than or equal to the revealed card's power";
+ }
+
+ public TitansPresenceEffect(TitansPresenceEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ RevealTargetFromHandCost cost = (RevealTargetFromHandCost) source.getCosts().get(0);
+ Permanent creature = game.getPermanent(getTargetPointer().getFirst(game, source));
+ Player controller = game.getPlayer(source.getControllerId());
+ if (cost != null && creature != null && controller != null) {
+ List revealedCards = cost.getRevealedCards();
+ if (!revealedCards.isEmpty()) {
+ Card card = revealedCards.iterator().next();
+ if (card != null && card.getPower().getValue() >= creature.getPower().getValue()) {
+ controller.moveCards(creature, null, Zone.EXILED, source, game);
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public TitansPresenceEffect copy() {
+ return new TitansPresenceEffect(this);
+ }
+
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/UlamogTheCeaselessHunger.java b/Mage.Sets/src/mage/sets/battleforzendikar/UlamogTheCeaselessHunger.java
new file mode 100644
index 00000000000..5b6d8c45eb9
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/UlamogTheCeaselessHunger.java
@@ -0,0 +1,191 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.ExileTargetEffect;
+import mage.abilities.keyword.IndestructibleAbility;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.FilterPermanent;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.events.GameEvent.EventType;
+import mage.game.permanent.Permanent;
+import mage.game.stack.Spell;
+import mage.players.Player;
+import mage.target.TargetPermanent;
+import mage.target.targetpointer.FixedTarget;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class UlamogTheCeaselessHunger extends CardImpl {
+
+ public UlamogTheCeaselessHunger(UUID ownerId) {
+ super(ownerId, 15, "Ulamog, the Ceaseless Hunger", Rarity.MYTHIC, new CardType[]{CardType.CREATURE}, "{10}");
+ this.expansionSetCode = "BFZ";
+ this.supertype.add("Legendary");
+ this.subtype.add("Eldrazi");
+ this.power = new MageInt(10);
+ this.toughness = new MageInt(10);
+
+ // When you cast Ulamog, the Ceaseless Hunger, exile two target permanents.
+ this.addAbility(new UlamogExilePermanentsOnCastAbility());
+
+ // Indestructible
+ this.addAbility(IndestructibleAbility.getInstance());
+
+ // Whenever Ulamog attacks, defending player exiles the top twenty cards of his or her library.
+ Effect effect = new UlamogExileLibraryEffect();
+ effect.setText("defending player exiles the top twenty cards of his or her library");
+ this.addAbility(new UlamogAttackTriggeredAbility(effect));
+ }
+
+ public UlamogTheCeaselessHunger(final UlamogTheCeaselessHunger card) {
+ super(card);
+ }
+
+ @Override
+ public UlamogTheCeaselessHunger copy() {
+ return new UlamogTheCeaselessHunger(this);
+ }
+}
+
+class UlamogExilePermanentsOnCastAbility extends TriggeredAbilityImpl {
+
+ UlamogExilePermanentsOnCastAbility() {
+ super(Zone.STACK, new ExileTargetEffect("exile two target permanents"));
+ this.addTarget(new TargetPermanent(2, new FilterPermanent()));
+ }
+
+ UlamogExilePermanentsOnCastAbility(UlamogExilePermanentsOnCastAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == EventType.SPELL_CAST;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ Spell spell = (Spell) game.getObject(event.getTargetId());
+ return this.getSourceId().equals(spell.getSourceId());
+ }
+
+ @Override
+ public UlamogExilePermanentsOnCastAbility copy() {
+ return new UlamogExilePermanentsOnCastAbility(this);
+ }
+
+ @Override
+ public String getRule() {
+ return "When you cast {this}, " + super.getRule();
+ }
+}
+
+class UlamogAttackTriggeredAbility extends TriggeredAbilityImpl {
+
+ public UlamogAttackTriggeredAbility(Effect effect) {
+ super(Zone.BATTLEFIELD, effect);
+ }
+
+ public UlamogAttackTriggeredAbility(final UlamogAttackTriggeredAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public UlamogAttackTriggeredAbility copy() {
+ return new UlamogAttackTriggeredAbility(this);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == EventType.ATTACKER_DECLARED;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ Permanent sourcePermanent = game.getPermanent(this.getSourceId());
+ if (sourcePermanent != null && event.getSourceId() == this.getSourceId()) {
+ UUID defender = game.getCombat().getDefendingPlayerId(this.getSourceId(), game);
+ this.getEffects().get(0).setTargetPointer(new FixedTarget(defender));
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public String getRule() {
+ return new StringBuilder("Whenever {this} attacks, ").append(super.getRule()).toString();
+ }
+}
+
+class UlamogExileLibraryEffect extends OneShotEffect {
+
+ public UlamogExileLibraryEffect() {
+ super(Outcome.Exile);
+ this.staticText = "defending player exiles the top twenty cards of his or her library";
+ }
+
+ public UlamogExileLibraryEffect(final UlamogExileLibraryEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public UlamogExileLibraryEffect copy() {
+ return new UlamogExileLibraryEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player defender = game.getPlayer(targetPointer.getFirst(game, source));
+ if (defender != null) {
+ int count = Math.min(defender.getLibrary().size(), 20);
+ for (int i = 0; i < count; i++) {
+ Card card = defender.getLibrary().removeFromTop(game);
+ if (card != null) {
+ card.moveToExile(null, null, source.getSourceId(), game);
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/UndergrowthChampion.java b/Mage.Sets/src/mage/sets/battleforzendikar/UndergrowthChampion.java
new file mode 100644
index 00000000000..504b6eec6a6
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/UndergrowthChampion.java
@@ -0,0 +1,144 @@
+/*
+ * 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.sets.battleforzendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.LandfallAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.PreventionEffectImpl;
+import mage.abilities.effects.common.counter.AddCountersSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.PhaseStep;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.counters.CounterType;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.permanent.Permanent;
+import mage.game.turn.Step;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class UndergrowthChampion extends CardImpl {
+
+ public UndergrowthChampion(UUID ownerId) {
+ super(ownerId, 197, "Undergrowth Champion", Rarity.MYTHIC, new CardType[]{CardType.CREATURE}, "{1}{G}{G}");
+ this.expansionSetCode = "BFZ";
+ this.subtype.add("Elemental");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // If damage would be dealt to Undergrowth Champion while it has a +1/+1 counter on it, prevent that damage and remove a +1/+1 counter from Undergrowth Champion.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new UndergrowthChampionPreventionEffect()));
+
+ // Landfall-Whenever a land enters the battlefield under your control, put a +1/+1 counter on Undergrowth Champion.
+ this.addAbility(new LandfallAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false));
+ }
+
+ public UndergrowthChampion(final UndergrowthChampion card) {
+ super(card);
+ }
+
+ @Override
+ public UndergrowthChampion copy() {
+ return new UndergrowthChampion(this);
+ }
+}
+
+class UndergrowthChampionPreventionEffect extends PreventionEffectImpl {
+
+ // remember turn and phase step to check if counter in this step was already removed
+ private int turn = 0;
+ private Step combatPhaseStep = null;
+
+ public UndergrowthChampionPreventionEffect() {
+ super(Duration.WhileOnBattlefield);
+ staticText = "If damage would be dealt to {this} while it has a +1/+1 counter on it, prevent that damage and remove a +1/+1 counter from {this}";
+ }
+
+ public UndergrowthChampionPreventionEffect(final UndergrowthChampionPreventionEffect effect) {
+ super(effect);
+ this.turn = effect.turn;
+ this.combatPhaseStep = effect.combatPhaseStep;
+ }
+
+ @Override
+ public UndergrowthChampionPreventionEffect copy() {
+ return new UndergrowthChampionPreventionEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ return true;
+ }
+
+ @Override
+ public boolean replaceEvent(GameEvent event, Ability source, Game game) {
+ Permanent permanent = game.getPermanent(source.getSourceId());
+ if (permanent != null) {
+ boolean removeCounter = true;
+ // check if in the same combat damage step already a counter was removed
+ if (game.getTurn().getPhase().getStep().getType().equals(PhaseStep.COMBAT_DAMAGE)) {
+ if (game.getTurnNum() == turn
+ && game.getTurn().getStep().equals(combatPhaseStep)) {
+ removeCounter = false;
+ } else {
+ turn = game.getTurnNum();
+ combatPhaseStep = game.getTurn().getStep();
+ }
+ }
+
+ if(removeCounter && permanent.getCounters().containsKey(CounterType.P1P1)) {
+ preventDamageAction(event, source, game);
+ StringBuilder sb = new StringBuilder(permanent.getName()).append(": ");
+ permanent.removeCounters(CounterType.P1P1.createInstance(), game);
+ sb.append("Removed a +1/+1 counter ");
+ game.informPlayers(sb.toString());
+ }
+ }
+
+ return false;
+ }
+
+ @Override
+ public boolean applies(GameEvent event, Ability source, Game game) {
+ if (super.applies(event, source, game)) {
+ if (event.getTargetId().equals(source.getSourceId())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/Mage.Sets/src/mage/sets/battleforzendikar/VeteranWarleader.java b/Mage.Sets/src/mage/sets/battleforzendikar/VeteranWarleader.java
index d3c4b53ea7f..e46455b6092 100644
--- a/Mage.Sets/src/mage/sets/battleforzendikar/VeteranWarleader.java
+++ b/Mage.Sets/src/mage/sets/battleforzendikar/VeteranWarleader.java
@@ -37,7 +37,7 @@ public class VeteranWarleader extends mage.sets.zendikarvseldrazi.VeteranWarlead
public VeteranWarleader(UUID ownerId) {
super(ownerId);
- this.cardNumber = 999;
+ this.cardNumber = 221;
this.expansionSetCode = "BFZ";
}
diff --git a/Mage.Sets/src/mage/sets/bornofthegods/AstralCornucopia.java b/Mage.Sets/src/mage/sets/bornofthegods/AstralCornucopia.java
index def4ee17b9a..d371e9adcc1 100644
--- a/Mage.Sets/src/mage/sets/bornofthegods/AstralCornucopia.java
+++ b/Mage.Sets/src/mage/sets/bornofthegods/AstralCornucopia.java
@@ -90,10 +90,11 @@ class AstralCornucopiaEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null) {
- Object obj = getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
- if (obj != null && obj instanceof SpellAbility
- && permanent.getZoneChangeCounter(game) - 1 == ((SpellAbility) obj).getSourceObjectZoneChangeCounter()) {
- int amount = ((SpellAbility) obj).getManaCostsToPay().getX();
+ SpellAbility spellAbility = (SpellAbility) getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
+ if (spellAbility != null
+ && spellAbility.getSourceId().equals(source.getSourceId())
+ && permanent.getZoneChangeCounter(game) - 1 == spellAbility.getSourceObjectZoneChangeCounter()) {
+ int amount = spellAbility.getManaCostsToPay().getX();
if (amount > 0) {
permanent.addCounters(CounterType.CHARGE.createInstance(amount), game);
}
diff --git a/Mage.Sets/src/mage/sets/bornofthegods/BrimazKingOfOreskos.java b/Mage.Sets/src/mage/sets/bornofthegods/BrimazKingOfOreskos.java
index 7d967d2d226..8ebc5ab5fc8 100644
--- a/Mage.Sets/src/mage/sets/bornofthegods/BrimazKingOfOreskos.java
+++ b/Mage.Sets/src/mage/sets/bornofthegods/BrimazKingOfOreskos.java
@@ -64,10 +64,10 @@ public class BrimazKingOfOreskos extends CardImpl {
// Vigilance
this.addAbility(VigilanceAbility.getInstance());
-
+
// Whenever Brimaz, King of Oreskos attacks, put a 1/1 white Cat Soldier creature token with vigilance onto the battlefield attacking.
this.addAbility(new AttacksTriggeredAbility(new CreateTokenEffect(new CatSoldierCreatureToken(), 1, false, true), false));
-
+
// Whenever Brimaz blocks a creature, put a 1/1 white Cat Soldier creature token with vigilance onto the battlefield blocking that creature.
this.addAbility(new BlocksCreatureTriggeredAbility(new BrimazKingOfOreskosEffect(), false, true));
}
@@ -83,44 +83,49 @@ public class BrimazKingOfOreskos extends CardImpl {
}
class BrimazKingOfOreskosEffect extends OneShotEffect {
-
+
public BrimazKingOfOreskosEffect() {
super(Outcome.Benefit);
this.staticText = "put a 1/1 white Cat Soldier creature token with vigilance onto the battlefield blocking that creature";
}
-
+
public BrimazKingOfOreskosEffect(final BrimazKingOfOreskosEffect effect) {
super(effect);
}
-
+
@Override
public BrimazKingOfOreskosEffect copy() {
return new BrimazKingOfOreskosEffect(this);
}
-
+
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
-
+
if (controller != null) {
Token token = new CatSoldierCreatureToken();
token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId());
- Permanent catToken = game.getPermanent(token.getLastAddedToken());
- Permanent attackingCreature = game.getPermanent(getTargetPointer().getFirst(game, source));
- if (catToken != null && attackingCreature != null && game.getState().getCombat() != null) {
+ Permanent attackingCreature = game.getPermanent(getTargetPointer().getFirst(game, source));
+ if (attackingCreature != null && game.getState().getCombat() != null) {
// Possible ruling (see Ætherplasm)
// The token you put onto the battlefield is blocking the attacking creature,
// even if the block couldn't legally be declared (for example, if that creature
- // enters the battlefield tapped, or it can't block, or the attacking creature
+ // enters the battlefield tapped, or it can't block, or the attacking creature
// has protection from it)
CombatGroup combatGroup = game.getState().getCombat().findGroup(attackingCreature.getId());
if (combatGroup != null) {
- combatGroup.addBlocker(catToken.getId(), source.getControllerId(), game);
- game.getCombat().addBlockingGroup(catToken.getId(),attackingCreature.getId() , source.getControllerId(), game);
+ for (UUID tokenId : token.getLastAddedTokenIds()) {
+ Permanent catToken = game.getPermanent(tokenId);
+ if (catToken != null) {
+ combatGroup.addBlocker(tokenId, source.getControllerId(), game);
+ game.getCombat().addBlockingGroup(tokenId, attackingCreature.getId(), controller.getId(), game);
+ }
+ }
+ combatGroup.pickBlockerOrder(attackingCreature.getControllerId(), game);
}
}
return true;
- }
+ }
return false;
}
}
diff --git a/Mage.Sets/src/mage/sets/bornofthegods/ImpetuousSunchaser.java b/Mage.Sets/src/mage/sets/bornofthegods/ImpetuousSunchaser.java
index 3e50e54d85d..2a8c1ac7024 100644
--- a/Mage.Sets/src/mage/sets/bornofthegods/ImpetuousSunchaser.java
+++ b/Mage.Sets/src/mage/sets/bornofthegods/ImpetuousSunchaser.java
@@ -30,12 +30,10 @@ package mage.sets.bornofthegods;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.AttacksEachTurnStaticAbility;
-import mage.abilities.effects.common.combat.AttacksIfAbleSourceEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.HasteAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
-import mage.constants.Duration;
import mage.constants.Rarity;
/**
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/BloodthirstyOgre.java b/Mage.Sets/src/mage/sets/championsofkamigawa/BloodthirstyOgre.java
index ac0d7e7614c..d1a0b5dda3c 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/BloodthirstyOgre.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/BloodthirstyOgre.java
@@ -28,14 +28,11 @@
package mage.sets.championsofkamigawa;
import java.util.UUID;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.Rarity;
-import mage.constants.Zone;
import mage.MageInt;
import mage.abilities.Ability;
+import mage.abilities.common.ActivateIfConditionActivatedAbility;
import mage.abilities.common.SimpleActivatedAbility;
-import mage.abilities.costs.common.ControlPermanentCost;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.dynamicvalue.common.CountersCount;
@@ -43,6 +40,10 @@ import mage.abilities.dynamicvalue.common.SignInversionDynamicValue;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
import mage.counters.CounterType;
import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.SubtypePredicate;
@@ -54,7 +55,8 @@ import mage.target.common.TargetCreaturePermanent;
*/
public class BloodthirstyOgre extends CardImpl {
- private static final FilterControlledPermanent filter = new FilterControlledPermanent("Demon");
+ private static final FilterControlledPermanent filter = new FilterControlledPermanent("you control a Demon");
+
static {
filter.add(new SubtypePredicate("Demon"));
}
@@ -71,11 +73,13 @@ public class BloodthirstyOgre extends CardImpl {
// {T}: Put a devotion counter on Bloodthirsty Ogre
this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.DEVOTION.createInstance()),new TapSourceCost()));
+
// {T}: Target creature gets -X/-X until end of turn, where X is the number of devotion counters on Bloodthirsty Ogre. Activate this ability only if you control a Demon.
DynamicValue devotionCounters = new SignInversionDynamicValue(new CountersCount(CounterType.DEVOTION));
- Ability ability;
- ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(devotionCounters,devotionCounters, Duration.EndOfTurn, true),new TapSourceCost());
- ability.addCost(new ControlPermanentCost(filter));
+ Ability ability = new ActivateIfConditionActivatedAbility(Zone.BATTLEFIELD,
+ new BoostTargetEffect(devotionCounters,devotionCounters, Duration.EndOfTurn, true),
+ new TapSourceCost(),
+ new PermanentsOnTheBattlefieldCondition(filter));
ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability);
}
@@ -87,6 +91,6 @@ public class BloodthirstyOgre extends CardImpl {
@Override
public BloodthirstyOgre copy() {
return new BloodthirstyOgre(this);
- }
+ }
}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/championsofkamigawa/OrochiHatchery.java b/Mage.Sets/src/mage/sets/championsofkamigawa/OrochiHatchery.java
index 56a0e0acb1b..1e2e16c7413 100644
--- a/Mage.Sets/src/mage/sets/championsofkamigawa/OrochiHatchery.java
+++ b/Mage.Sets/src/mage/sets/championsofkamigawa/OrochiHatchery.java
@@ -91,10 +91,11 @@ class OrochiHatcheryEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null) {
- Object obj = getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
- if (obj != null && obj instanceof SpellAbility
- && permanent.getZoneChangeCounter(game) - 1 == ((SpellAbility) obj).getSourceObjectZoneChangeCounter()) {;
- int amount = ((SpellAbility) obj).getManaCostsToPay().getX();
+ SpellAbility spellAbility = (SpellAbility) getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
+ if (spellAbility != null
+ && spellAbility.getSourceId().equals(source.getSourceId())
+ && permanent.getZoneChangeCounter(game) - 1 == spellAbility.getSourceObjectZoneChangeCounter()) {
+ int amount = spellAbility.getManaCostsToPay().getX();
if (amount > 0) {
permanent.addCounters(CounterType.CHARGE.createInstance(amount), game);
}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/HeidarRimewindMaster.java b/Mage.Sets/src/mage/sets/coldsnap/HeidarRimewindMaster.java
new file mode 100644
index 00000000000..6011ac418d9
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/HeidarRimewindMaster.java
@@ -0,0 +1,86 @@
+/*
+ * 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.sets.coldsnap;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.ActivateIfConditionActivatedAbility;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition.CountType;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.GenericManaCost;
+import mage.abilities.effects.common.ReturnToHandTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledPermanent;
+import mage.filter.predicate.mageobject.SupertypePredicate;
+import mage.target.TargetPermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class HeidarRimewindMaster extends CardImpl {
+
+ private static final FilterControlledPermanent filter = new FilterControlledPermanent("you control four or more snow permanents");
+
+ static {
+ filter.add(new SupertypePredicate("Snow"));
+ }
+
+ public HeidarRimewindMaster(UUID ownerId) {
+ super(ownerId, 36, "Heidar, Rimewind Master", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{4}{U}");
+ this.expansionSetCode = "CSP";
+ this.supertype.add("Legendary");
+ this.subtype.add("Human");
+ this.subtype.add("Wizard");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // {2}, {tap}: Return target permanent to its owner's hand. Activate this ability only if you control four or more snow permanents.
+ Ability ability = new ActivateIfConditionActivatedAbility(Zone.BATTLEFIELD,
+ new ReturnToHandTargetEffect(),
+ new GenericManaCost(2),
+ new PermanentsOnTheBattlefieldCondition(filter, CountType.MORE_THAN, 3));
+ ability.addCost(new TapSourceCost());
+ ability.addTarget(new TargetPermanent());
+ this.addAbility(ability);
+ }
+
+ public HeidarRimewindMaster(final HeidarRimewindMaster card) {
+ super(card);
+ }
+
+ @Override
+ public HeidarRimewindMaster copy() {
+ return new HeidarRimewindMaster(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/RimeTransfusion.java b/Mage.Sets/src/mage/sets/coldsnap/RimeTransfusion.java
new file mode 100644
index 00000000000..8bef2a6f1ea
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/RimeTransfusion.java
@@ -0,0 +1,97 @@
+/*
+ * 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.sets.coldsnap;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.common.SimpleEvasionAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.AttachEffect;
+import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesSourceEffect;
+import mage.abilities.effects.common.continuous.BoostEnchantedEffect;
+import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
+import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
+import mage.abilities.keyword.EnchantAbility;
+import mage.cards.CardImpl;
+import mage.constants.AttachmentType;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.SupertypePredicate;
+import mage.target.TargetPermanent;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class RimeTransfusion extends CardImpl {
+
+ static final String rule = "and has \"{snow}: This creature can't be blocked this turn except by snow creatures.\"";
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("except by snow creatures until end of turn");
+
+ static {
+ filter.add(Predicates.not(new SupertypePredicate("Snow")));
+ }
+
+ public RimeTransfusion(UUID ownerId) {
+ super(ownerId, 68, "Rime Transfusion", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}");
+ this.expansionSetCode = "CSP";
+ this.supertype.add("Snow");
+ this.subtype.add("Aura");
+
+ // Enchant creature
+ TargetPermanent auraTarget = new TargetCreaturePermanent();
+ this.getSpellAbility().addTarget(auraTarget);
+ this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
+ Ability ability = new EnchantAbility(auraTarget.getTargetName());
+ this.addAbility(ability);
+
+ // Enchanted creature gets +2/+1 and has "{snow}: This creature can't be blocked this turn except by snow creatures."
+ SimpleStaticAbility ability2 = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(2, 1, Duration.WhileOnBattlefield));
+ Ability gainedAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainAbilitySourceEffect(new SimpleEvasionAbility(new CantBeBlockedByCreaturesSourceEffect(filter, Duration.EndOfTurn))),new ManaCostsImpl("{snow}"));
+ ability2.addEffect(new GainAbilityAttachedEffect(gainedAbility, AttachmentType.AURA, Duration.WhileOnBattlefield, rule));
+ this.addAbility(ability2);
+ }
+
+ public RimeTransfusion(final RimeTransfusion card) {
+ super(card);
+ }
+
+ @Override
+ public RimeTransfusion copy() {
+ return new RimeTransfusion(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/RimewindCryomancer.java b/Mage.Sets/src/mage/sets/coldsnap/RimewindCryomancer.java
new file mode 100644
index 00000000000..41775a35a3b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/RimewindCryomancer.java
@@ -0,0 +1,85 @@
+/*
+ * 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.sets.coldsnap;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.ActivateIfConditionActivatedAbility;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition.CountType;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.GenericManaCost;
+import mage.abilities.effects.common.CounterTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledPermanent;
+import mage.filter.predicate.mageobject.SupertypePredicate;
+import mage.target.common.TargetActivatedAbility;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class RimewindCryomancer extends CardImpl {
+
+ private static final FilterControlledPermanent filter = new FilterControlledPermanent("you control four or more snow permanents");
+
+ static {
+ filter.add(new SupertypePredicate("Snow"));
+ }
+
+ public RimewindCryomancer(UUID ownerId) {
+ super(ownerId, 43, "Rimewind Cryomancer", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{U}");
+ this.expansionSetCode = "CSP";
+ this.subtype.add("Human");
+ this.subtype.add("Wizard");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(3);
+
+ // {1}, {tap}: Counter target activated ability. Activate this ability only if you control four or more snow permanents.
+ Ability ability = new ActivateIfConditionActivatedAbility(Zone.BATTLEFIELD,
+ new CounterTargetEffect(),
+ new GenericManaCost(1),
+ new PermanentsOnTheBattlefieldCondition(filter, CountType.MORE_THAN, 3));
+ ability.addCost(new TapSourceCost());
+ ability.addTarget(new TargetActivatedAbility());
+ this.addAbility(ability);
+ }
+
+ public RimewindCryomancer(final RimewindCryomancer card) {
+ super(card);
+ }
+
+ @Override
+ public RimewindCryomancer copy() {
+ return new RimewindCryomancer(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/coldsnap/RimewindTaskmage.java b/Mage.Sets/src/mage/sets/coldsnap/RimewindTaskmage.java
new file mode 100644
index 00000000000..420ca2ecc6c
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/coldsnap/RimewindTaskmage.java
@@ -0,0 +1,85 @@
+/*
+ * 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.sets.coldsnap;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.ActivateIfConditionActivatedAbility;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition.CountType;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.GenericManaCost;
+import mage.abilities.effects.common.MayTapOrUntapTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledPermanent;
+import mage.filter.predicate.mageobject.SupertypePredicate;
+import mage.target.TargetPermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class RimewindTaskmage extends CardImpl {
+
+ private static final FilterControlledPermanent filter = new FilterControlledPermanent("you control four or more snow permanents");
+
+ static {
+ filter.add(new SupertypePredicate("Snow"));
+ }
+
+ public RimewindTaskmage(UUID ownerId) {
+ super(ownerId, 44, "Rimewind Taskmage", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{U}");
+ this.expansionSetCode = "CSP";
+ this.subtype.add("Human");
+ this.subtype.add("Wizard");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(2);
+
+ // {1}, {tap}: You may tap or untap target permanent. Activate this ability only if you control four or more snow permanents.
+ Ability ability = new ActivateIfConditionActivatedAbility(Zone.BATTLEFIELD,
+ new MayTapOrUntapTargetEffect(),
+ new GenericManaCost(1),
+ new PermanentsOnTheBattlefieldCondition(filter, CountType.MORE_THAN, 3));
+ ability.addCost(new TapSourceCost());
+ ability.addTarget(new TargetPermanent());
+ this.addAbility(ability);
+ }
+
+ public RimewindTaskmage(final RimewindTaskmage card) {
+ super(card);
+ }
+
+ @Override
+ public RimewindTaskmage copy() {
+ return new RimewindTaskmage(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/commander/ScatteringStroke.java b/Mage.Sets/src/mage/sets/commander/ScatteringStroke.java
index ec8b95d2c5e..7f7cdd7bccc 100644
--- a/Mage.Sets/src/mage/sets/commander/ScatteringStroke.java
+++ b/Mage.Sets/src/mage/sets/commander/ScatteringStroke.java
@@ -30,7 +30,7 @@ package mage.sets.commander;
import java.util.UUID;
import mage.Mana;
import mage.abilities.Ability;
-import mage.abilities.common.delayed.AtTheBeginOMainPhaseDelayedTriggeredAbility;
+import mage.abilities.common.delayed.AtTheBeginOfMainPhaseDelayedTriggeredAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.AddManaToManaPoolSourceControllerEffect;
@@ -96,8 +96,8 @@ class ScatteringStrokeEffect extends OneShotEffect {
game.getStack().counter(spell.getId(), source.getSourceId(), game);
if (ClashEffect.getInstance().apply(game, source)) {
Effect effect = new AddManaToManaPoolSourceControllerEffect(new Mana(0,0,0,0,0,spell.getConvertedManaCost(),0));
- AtTheBeginOMainPhaseDelayedTriggeredAbility delayedAbility =
- new AtTheBeginOMainPhaseDelayedTriggeredAbility(effect, true, TargetController.YOU, AtTheBeginOMainPhaseDelayedTriggeredAbility.PhaseSelection.NEXT_MAIN);
+ AtTheBeginOfMainPhaseDelayedTriggeredAbility delayedAbility =
+ new AtTheBeginOfMainPhaseDelayedTriggeredAbility(effect, true, TargetController.YOU, AtTheBeginOfMainPhaseDelayedTriggeredAbility.PhaseSelection.NEXT_MAIN);
delayedAbility.setSourceId(source.getSourceId());
delayedAbility.setControllerId(source.getControllerId());
delayedAbility.setSourceObject(source.getSourceObject(game), game);
diff --git a/Mage.Sets/src/mage/sets/commander2013/HullBreach.java b/Mage.Sets/src/mage/sets/commander2013/HullBreach.java
index c47d23d6667..d6a51a65743 100644
--- a/Mage.Sets/src/mage/sets/commander2013/HullBreach.java
+++ b/Mage.Sets/src/mage/sets/commander2013/HullBreach.java
@@ -50,7 +50,6 @@ public class HullBreach extends CardImpl {
super(ownerId, 193, "Hull Breach", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{R}{G}");
this.expansionSetCode = "C13";
-
// Choose one - Destroy target artifact;
this.getSpellAbility().addEffect(new DestroyTargetEffect());
Target target = new TargetArtifactPermanent();
@@ -63,18 +62,14 @@ public class HullBreach extends CardImpl {
this.getSpellAbility().addMode(mode);
// or destroy target artifact and target enchantment.
mode = new Mode();
- mode.getEffects().add(new DestroyTargetEffect());
- target = new TargetArtifactPermanent();
- mode.getTargets().add(target);
Effect effect = new DestroyTargetEffect();
effect.setTargetPointer(new SecondTargetPointer());
- effect.setText("and target enchantment");
+ effect.setText("destroy target artifact and target enchantment");
mode.getEffects().add(effect);
- target = new TargetPermanent(new FilterEnchantmentPermanent());
- mode.getTargets().add(target);
+ mode.getTargets().add(new TargetArtifactPermanent());
+ mode.getTargets().add(new TargetPermanent(new FilterEnchantmentPermanent()));
this.getSpellAbility().addMode(mode);
-
}
public HullBreach(final HullBreach card) {
diff --git a/Mage.Sets/src/mage/sets/commander2013/JelevaNephaliasScourge.java b/Mage.Sets/src/mage/sets/commander2013/JelevaNephaliasScourge.java
index 4fbc4aba7cb..965cb69fd59 100644
--- a/Mage.Sets/src/mage/sets/commander2013/JelevaNephaliasScourge.java
+++ b/Mage.Sets/src/mage/sets/commander2013/JelevaNephaliasScourge.java
@@ -116,7 +116,7 @@ class JelevaNephaliasScourgeEffect extends OneShotEffect {
Player player = game.getPlayer(playerId);
if (player != null) {
int cardsToExile = Math.min(player.getLibrary().size(), xValue);
- for(int i = 0; i < cardsToExile; i++) {
+ for (int i = 0; i < cardsToExile; i++) {
Card card = player.getLibrary().removeFromTop(game);
if (card != null) {
card.moveToExile(CardUtil.getCardExileZoneId(game, source), sourceCard.getName(), source.getSourceId(), game);
@@ -170,7 +170,7 @@ class JelevaNephaliasCastEffect extends OneShotEffect {
class JelevaNephaliasWatcher extends Watcher {
- private Map manaSpendToCast = new HashMap<>(); // cast
+ private final Map manaSpendToCast = new HashMap<>(); // cast
public JelevaNephaliasWatcher() {
super("ManaPaidToCastJelevaNephalias", WatcherScope.CARD);
@@ -190,10 +190,10 @@ class JelevaNephaliasWatcher extends Watcher {
if (event.getType() == GameEvent.EventType.SPELL_CAST && event.getSourceId().equals(sourceId)) {
if (!game.getStack().isEmpty()) {
for (StackObject stackObject : game.getStack()) {
- if (stackObject instanceof Spell && ((Spell)stackObject).getSourceId().equals(sourceId)) {
+ if (stackObject instanceof Spell && ((Spell) stackObject).getSourceId().equals(sourceId)) {
Card card = game.getCard(sourceId);
if (!manaSpendToCast.containsValue(card.getZoneChangeCounter(game))) {
- manaSpendToCast.put(new Integer(card.getZoneChangeCounter(game)), new Integer(((Spell)stackObject).getSpellAbility().getManaCostsToPay().convertedManaCost()));
+ manaSpendToCast.put(card.getZoneChangeCounter(game), ((Spell) stackObject).getSpellAbility().getManaCostsToPay().convertedManaCost());
}
}
}
diff --git a/Mage.Sets/src/mage/sets/commander2013/OloroAgelessAscetic.java b/Mage.Sets/src/mage/sets/commander2013/OloroAgelessAscetic.java
index 569209b09f5..766fb5bd628 100644
--- a/Mage.Sets/src/mage/sets/commander2013/OloroAgelessAscetic.java
+++ b/Mage.Sets/src/mage/sets/commander2013/OloroAgelessAscetic.java
@@ -29,23 +29,20 @@ package mage.sets.commander2013;
import java.util.UUID;
import mage.MageInt;
-import mage.abilities.Ability;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.GainLifeControllerTriggeredAbility;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.dynamicvalue.common.StaticValue;
-import mage.abilities.effects.OneShotEffect;
-import mage.abilities.effects.common.DamagePlayersEffect;
+import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.GainLifeEffect;
+import mage.abilities.effects.common.LoseLifeOpponentsEffect;
import mage.cards.CardImpl;
import mage.constants.CardType;
-import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.constants.TargetController;
import mage.constants.Zone;
-import mage.game.Game;
/**
*
@@ -65,11 +62,17 @@ public class OloroAgelessAscetic extends CardImpl {
// At the beginning of your upkeep, you gain 2 life.
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new GainLifeEffect(2), TargetController.YOU, false));
+
// Whenever you gain life, you may pay {1}. If you do, draw a card and each opponent loses 1 life.
- this.addAbility(new GainLifeControllerTriggeredAbility(new DoIfCostPaid(new OloroAgelessAsceticEffect(), new GenericManaCost(1)),false));
+ DoIfCostPaid effect = new DoIfCostPaid(new DrawCardSourceControllerEffect(1), new GenericManaCost(1));
+ Effect effectToAdd = new LoseLifeOpponentsEffect(1);
+ effectToAdd.setText("and each opponent loses 1 life");
+ effect.addEffect(effectToAdd);
+ this.addAbility(new GainLifeControllerTriggeredAbility(effect, false));
+
// At the beginning of your upkeep, if Oloro, Ageless Ascetic is in the command zone, you gain 2 life.
this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.COMMAND,
- new GainLifeEffect(new StaticValue(2), "if Oloro, Ageless Ascetic is in the command zone, you gain 2 life"),TargetController.YOU, false));
+ new GainLifeEffect(new StaticValue(2), "if {this} is in the command zone, you gain 2 life"), TargetController.YOU, false));
}
public OloroAgelessAscetic(final OloroAgelessAscetic card) {
@@ -81,27 +84,3 @@ public class OloroAgelessAscetic extends CardImpl {
return new OloroAgelessAscetic(this);
}
}
-
-class OloroAgelessAsceticEffect extends OneShotEffect {
-
- public OloroAgelessAsceticEffect() {
- super(Outcome.Benefit);
- this.staticText = "draw a card and each opponent loses 1 life";
- }
-
- public OloroAgelessAsceticEffect(final OloroAgelessAsceticEffect effect) {
- super(effect);
- }
-
- @Override
- public OloroAgelessAsceticEffect copy() {
- return new OloroAgelessAsceticEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- new DrawCardSourceControllerEffect(1).apply(game, source);
- new DamagePlayersEffect(1, TargetController.OPPONENT).apply(game, source);
- return false;
- }
-}
diff --git a/Mage.Sets/src/mage/sets/commander2013/TemptWithReflections.java b/Mage.Sets/src/mage/sets/commander2013/TemptWithReflections.java
index 53cecb0c1c1..a32f7140ef4 100644
--- a/Mage.Sets/src/mage/sets/commander2013/TemptWithReflections.java
+++ b/Mage.Sets/src/mage/sets/commander2013/TemptWithReflections.java
@@ -40,12 +40,9 @@ import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.game.Game;
import mage.game.permanent.Permanent;
-import mage.game.permanent.token.EmptyToken;
-import mage.game.permanent.token.Token;
import mage.players.Player;
import mage.players.PlayerList;
import mage.target.common.TargetControlledCreaturePermanent;
-import mage.util.CardUtil;
/**
*
@@ -57,7 +54,6 @@ public class TemptWithReflections extends CardImpl {
super(ownerId, 60, "Tempt with Reflections", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{3}{U}");
this.expansionSetCode = "C13";
-
// Tempting offer - Choose target creature you control. Put a token onto the battlefield that's a copy of that creature. Each opponent may put a token onto the battlefield that's a copy of that creature. For each opponent who does, put a token onto the battlefield that's a copy of that creature.
this.getSpellAbility().addEffect(new TemptWithReflectionsEffect());
this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent());
@@ -115,16 +111,16 @@ class TemptWithReflectionsEffect extends OneShotEffect {
player = playerList.getNext(game);
} while (!player.getId().equals(game.getActivePlayerId()));
- for (UUID playerId: playersSaidYes) {
+ for (UUID playerId : playersSaidYes) {
effect = new PutTokenOntoBattlefieldCopyTargetEffect(playerId);
effect.setTargetPointer(getTargetPointer());
- effect.apply(game, source);
+ effect.apply(game, source);
}
if (playersSaidYes.size() > 0) {
effect = new PutTokenOntoBattlefieldCopyTargetEffect();
effect.setTargetPointer(getTargetPointer());
- effect.apply(game, source);
+ effect.apply(game, source);
}
return true;
}
diff --git a/Mage.Sets/src/mage/sets/commander2014/LifebloodHydra.java b/Mage.Sets/src/mage/sets/commander2014/LifebloodHydra.java
index fe68627ce7a..89228518820 100644
--- a/Mage.Sets/src/mage/sets/commander2014/LifebloodHydra.java
+++ b/Mage.Sets/src/mage/sets/commander2014/LifebloodHydra.java
@@ -94,10 +94,11 @@ class LifebloodHydraComesIntoPlayEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null && !permanent.isFaceDown(game)) {
- Object obj = getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
- if (obj != null && obj instanceof SpellAbility
- && permanent.getZoneChangeCounter(game) - 1 == ((SpellAbility) obj).getSourceObjectZoneChangeCounter()) {
- int amount = ((SpellAbility) obj).getManaCostsToPay().getX();
+ SpellAbility spellAbility = (SpellAbility) getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
+ if (spellAbility != null
+ && spellAbility.getSourceId().equals(source.getSourceId())
+ && permanent.getZoneChangeCounter(game) - 1 == spellAbility.getSourceObjectZoneChangeCounter()) {
+ int amount = spellAbility.getManaCostsToPay().getX();
if (amount > 0) {
permanent.addCounters(CounterType.P1P1.createInstance(amount), game);
}
diff --git a/Mage.Sets/src/mage/sets/commander2014/TeferiTemporalArchmage.java b/Mage.Sets/src/mage/sets/commander2014/TeferiTemporalArchmage.java
index bbe6c7346a5..4990384fa41 100644
--- a/Mage.Sets/src/mage/sets/commander2014/TeferiTemporalArchmage.java
+++ b/Mage.Sets/src/mage/sets/commander2014/TeferiTemporalArchmage.java
@@ -51,7 +51,6 @@ import mage.filter.FilterCard;
import mage.filter.FilterPermanent;
import mage.game.Game;
import mage.game.command.Emblem;
-import mage.game.permanent.Permanent;
import mage.target.TargetPermanent;
/**
@@ -65,7 +64,6 @@ public class TeferiTemporalArchmage extends CardImpl {
this.expansionSetCode = "C14";
this.subtype.add("Teferi");
-
this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.LOYALTY.createInstance(5)), false));
// +1: Look at the top two cards of your library. Put one of them into your hand and the other on the bottom of your library.
@@ -73,13 +71,13 @@ public class TeferiTemporalArchmage extends CardImpl {
new StaticValue(2), false, new StaticValue(1), new FilterCard(), Zone.LIBRARY, false, false), 1));
// -1: Untap up to four target permanents.
- LoyaltyAbility loyaltyAbility = new LoyaltyAbility(new UntapTargetEffect(), -1);
- loyaltyAbility.addTarget(new TargetPermanent(0,4, new FilterPermanent(), false));
+ LoyaltyAbility loyaltyAbility = new LoyaltyAbility(new UntapTargetEffect(), -1);
+ loyaltyAbility.addTarget(new TargetPermanent(0, 4, new FilterPermanent(), false));
this.addAbility(loyaltyAbility);
// -10: You get an emblem with "You may activate loyalty abilities of planeswalkers you control on any player's turn any time you could cast an instant."
this.addAbility(new LoyaltyAbility(new GetEmblemEffect(new TeferiTemporalArchmageEmblem()), -10));
-
+
// Teferi, Temporal Archmage can be your commander.
this.addAbility(CanBeYourCommanderAbility.getInstance());
@@ -96,7 +94,9 @@ public class TeferiTemporalArchmage extends CardImpl {
}
class TeferiTemporalArchmageEmblem extends Emblem {
+
// "You may activate loyalty abilities of planeswalkers you control on any player's turn any time you could cast an instant."
+
public TeferiTemporalArchmageEmblem() {
this.setName("EMBLEM: Teferi, Temporal Archmage");
this.getAbilities().add(new SimpleStaticAbility(Zone.COMMAND, new TeferiTemporalArchmageAsThoughEffect()));
@@ -114,7 +114,6 @@ class TeferiTemporalArchmageAsThoughEffect extends AsThoughEffectImpl {
super(effect);
}
-
@Override
public boolean apply(Game game, Ability source) {
return true;
@@ -135,7 +134,7 @@ class TeferiTemporalArchmageAsThoughEffect extends AsThoughEffectImpl {
@Override
public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) {
- return false; // Not used
+ return false; // Not used
}
}
diff --git a/Mage.Sets/src/mage/sets/conflux/ApocalypseHydra.java b/Mage.Sets/src/mage/sets/conflux/ApocalypseHydra.java
index 2996412edd2..a195c86159a 100644
--- a/Mage.Sets/src/mage/sets/conflux/ApocalypseHydra.java
+++ b/Mage.Sets/src/mage/sets/conflux/ApocalypseHydra.java
@@ -96,10 +96,11 @@ class ApocalypseHydraEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null) {
- Object obj = getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
- if (obj != null && obj instanceof SpellAbility
- && permanent.getZoneChangeCounter(game) - 1 == ((SpellAbility) obj).getSourceObjectZoneChangeCounter()) {
- int amount = ((SpellAbility) obj).getManaCostsToPay().getX();
+ SpellAbility spellAbility = (SpellAbility) getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
+ if (spellAbility != null
+ && spellAbility.getSourceId().equals(source.getSourceId())
+ && permanent.getZoneChangeCounter(game) - 1 == spellAbility.getSourceObjectZoneChangeCounter()) {
+ int amount = spellAbility.getManaCostsToPay().getX();
if (amount > 0) {
if (amount < 5) {
permanent.addCounters(CounterType.P1P1.createInstance(amount), game);
diff --git a/Mage.Sets/src/mage/sets/conspiracy/AcademyElite.java b/Mage.Sets/src/mage/sets/conspiracy/AcademyElite.java
index 9a249cfa5b3..97809e24314 100644
--- a/Mage.Sets/src/mage/sets/conspiracy/AcademyElite.java
+++ b/Mage.Sets/src/mage/sets/conspiracy/AcademyElite.java
@@ -100,9 +100,10 @@ class AcademyEliteEffect1 extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null) {
- Object obj = getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
- if (obj != null && obj instanceof SpellAbility
- && permanent.getZoneChangeCounter(game) - 1 == ((SpellAbility) obj).getSourceObjectZoneChangeCounter()) {
+ SpellAbility spellAbility = (SpellAbility) getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
+ if (spellAbility != null
+ && spellAbility.getSourceId().equals(source.getSourceId())
+ && permanent.getZoneChangeCounter(game) - 1 == spellAbility.getSourceObjectZoneChangeCounter()) {
CardsInAllGraveyardsCount instantsAndSorceries = new CardsInAllGraveyardsCount(new FilterInstantOrSorceryCard("instant or sorcery cards"));
int instantsAndSorceriesCount = instantsAndSorceries.calculate(game, source, this);
if (instantsAndSorceriesCount > 0) {
diff --git a/Mage.Sets/src/mage/sets/conspiracy/GrenzoDungeonWarden.java b/Mage.Sets/src/mage/sets/conspiracy/GrenzoDungeonWarden.java
index 5195b3ef392..e583ec71adf 100644
--- a/Mage.Sets/src/mage/sets/conspiracy/GrenzoDungeonWarden.java
+++ b/Mage.Sets/src/mage/sets/conspiracy/GrenzoDungeonWarden.java
@@ -34,6 +34,7 @@ import mage.abilities.SpellAbility;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.mana.GenericManaCost;
+import mage.abilities.effects.EntersBattlefieldEffect;
import mage.abilities.effects.OneShotEffect;
import mage.cards.Card;
import mage.cards.CardImpl;
@@ -94,10 +95,11 @@ class GrenzoDungeonWardenEtBEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null) {
- Object obj = getValue(mage.abilities.effects.EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
- if (obj != null && obj instanceof SpellAbility
- && permanent.getZoneChangeCounter(game) - 1 == ((SpellAbility) obj).getSourceObjectZoneChangeCounter()) {
- int amount = ((Ability) obj).getManaCostsToPay().getX();
+ SpellAbility spellAbility = (SpellAbility) getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
+ if (spellAbility != null
+ && spellAbility.getSourceId().equals(source.getSourceId())
+ && permanent.getZoneChangeCounter(game) - 1 == spellAbility.getSourceObjectZoneChangeCounter()) {
+ int amount = spellAbility.getManaCostsToPay().getX();
if (amount > 0) {
permanent.addCounters(CounterType.P1P1.createInstance(amount), game);
}
diff --git a/Mage.Sets/src/mage/sets/darksteel/PulseOfTheForge.java b/Mage.Sets/src/mage/sets/darksteel/PulseOfTheForge.java
new file mode 100644
index 00000000000..0771972dbfd
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/darksteel/PulseOfTheForge.java
@@ -0,0 +1,99 @@
+/*
+ * 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.sets.darksteel;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.players.Player;
+import mage.target.TargetPlayer;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class PulseOfTheForge extends CardImpl {
+
+ public PulseOfTheForge(UUID ownerId) {
+ super(ownerId, 66, "Pulse of the Forge", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{1}{R}{R}");
+ this.expansionSetCode = "DST";
+
+ // Pulse of the Forge deals 4 damage to target player. Then if that player has more life than you, return Pulse of the Forge to its owner's hand.
+ this.getSpellAbility().addEffect(new DamageTargetEffect(4));
+ this.getSpellAbility().addTarget(new TargetPlayer());
+ this.getSpellAbility().addEffect(new PulseOfTheForgeReturnToHandEffect());
+ }
+
+ public PulseOfTheForge(final PulseOfTheForge card) {
+ super(card);
+ }
+
+ @Override
+ public PulseOfTheForge copy() {
+ return new PulseOfTheForge(this);
+ }
+}
+
+class PulseOfTheForgeReturnToHandEffect extends OneShotEffect {
+
+ PulseOfTheForgeReturnToHandEffect() {
+ super(Outcome.Benefit);
+ this.staticText = "Then if that player has more life than you, return {this} to its owner's hand";
+ }
+
+ PulseOfTheForgeReturnToHandEffect(final PulseOfTheForgeReturnToHandEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public PulseOfTheForgeReturnToHandEffect copy() {
+ return new PulseOfTheForgeReturnToHandEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller != null) {
+ Player player = game.getPlayer(source.getFirstTarget());
+ if (player != null && player.getLife() > controller.getLife()) {
+ Card card = game.getCard(source.getSourceId());
+ controller.moveCards(card, null, Zone.HAND, source, game);
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/dissension/MomirVigSimicVisionary.java b/Mage.Sets/src/mage/sets/dissension/MomirVigSimicVisionary.java
index 0492eea1491..8a23b3a4427 100644
--- a/Mage.Sets/src/mage/sets/dissension/MomirVigSimicVisionary.java
+++ b/Mage.Sets/src/mage/sets/dissension/MomirVigSimicVisionary.java
@@ -27,20 +27,30 @@
*/
package mage.sets.dissension;
+import java.util.Set;
import java.util.UUID;
import mage.MageInt;
+import mage.MageObject;
import mage.ObjectColor;
+import mage.abilities.Ability;
import mage.abilities.common.SpellCastControllerTriggeredAbility;
import mage.abilities.effects.Effect;
-import mage.abilities.effects.common.RevealLibraryPutIntoHandEffect;
+import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.search.SearchLibraryPutOnLibraryEffect;
+import mage.cards.Card;
import mage.cards.CardImpl;
+import mage.cards.Cards;
+import mage.cards.CardsImpl;
import mage.constants.CardType;
+import mage.constants.Outcome;
import mage.constants.Rarity;
+import mage.constants.Zone;
import mage.filter.FilterSpell;
import mage.filter.common.FilterCreatureCard;
import mage.filter.predicate.mageobject.CardTypePredicate;
import mage.filter.predicate.mageobject.ColorPredicate;
+import mage.game.Game;
+import mage.players.Player;
import mage.target.common.TargetCardInLibrary;
/**
@@ -76,9 +86,7 @@ public class MomirVigSimicVisionary extends CardImpl {
this.addAbility(new SpellCastControllerTriggeredAbility(effect, filter, true));
// Whenever you cast a blue creature spell, reveal the top card of your library. If it's a creature card, put that card into your hand.
- Effect effect2 = new RevealLibraryPutIntoHandEffect(1, new FilterCreatureCard(), false);
- effect2.setText("reveal the top card of your library. If it's a creature card, put that card into your hand");
- this.addAbility(new SpellCastControllerTriggeredAbility(effect2, filter2, false));
+ this.addAbility(new SpellCastControllerTriggeredAbility(new MomirVigSimicVisionaryEffect(), filter2, false));
}
@@ -91,3 +99,44 @@ public class MomirVigSimicVisionary extends CardImpl {
return new MomirVigSimicVisionary(this);
}
}
+
+class MomirVigSimicVisionaryEffect extends OneShotEffect {
+
+ public MomirVigSimicVisionaryEffect() {
+ super(Outcome.DrawCard);
+ this.staticText = "reveal the top card of your library. If it's a creature card, put that card into your hand";
+ }
+
+ public MomirVigSimicVisionaryEffect(final MomirVigSimicVisionaryEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public MomirVigSimicVisionaryEffect copy() {
+ return new MomirVigSimicVisionaryEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ MageObject sourceObject = game.getObject(source.getSourceId());
+ if (controller == null || sourceObject == null) {
+ return false;
+ }
+
+ CardsImpl cards = new CardsImpl();
+ cards.addAll(controller.getLibrary().getTopCards(game, 1));
+ controller.revealCards(sourceObject.getIdName(), cards, game);
+
+ Set cardsList = cards.getCards(game);
+ Cards cardsToHand = new CardsImpl();
+ for (Card card : cardsList) {
+ if (card.getCardType().contains(CardType.CREATURE)) {
+ cardsToHand.add(card);
+ cards.remove(card);
+ }
+ }
+ controller.moveCards(cardsToHand, null, Zone.HAND, source, game);
+ return true;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/dissension/PillarOfTheParuns.java b/Mage.Sets/src/mage/sets/dissension/PillarOfTheParuns.java
index 8278800e994..629823f495a 100644
--- a/Mage.Sets/src/mage/sets/dissension/PillarOfTheParuns.java
+++ b/Mage.Sets/src/mage/sets/dissension/PillarOfTheParuns.java
@@ -27,6 +27,7 @@
*/
package mage.sets.dissension;
+import java.util.UUID;
import mage.ConditionalMana;
import mage.MageObject;
import mage.Mana;
@@ -39,11 +40,8 @@ import mage.abilities.mana.conditional.ManaCondition;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
-import mage.filter.predicate.mageobject.MulticoloredPredicate;
import mage.game.Game;
-import java.util.UUID;
-
/**
*
* @author noxx
diff --git a/Mage.Sets/src/mage/sets/dragonsmaze/PlasmCapture.java b/Mage.Sets/src/mage/sets/dragonsmaze/PlasmCapture.java
index 88a299b5c98..cf82ebbf9e1 100644
--- a/Mage.Sets/src/mage/sets/dragonsmaze/PlasmCapture.java
+++ b/Mage.Sets/src/mage/sets/dragonsmaze/PlasmCapture.java
@@ -1,168 +1,168 @@
-/*
- * 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.sets.dragonsmaze;
-
-import java.util.UUID;
-
-import mage.constants.CardType;
-import mage.constants.Outcome;
-import mage.constants.Rarity;
-import mage.constants.TargetController;
-import mage.Mana;
-import mage.abilities.Ability;
-import mage.abilities.common.delayed.AtTheBeginOMainPhaseDelayedTriggeredAbility;
-import mage.abilities.common.delayed.AtTheBeginOMainPhaseDelayedTriggeredAbility.PhaseSelection;
-import mage.abilities.effects.OneShotEffect;
-import mage.abilities.effects.common.ManaEffect;
-import mage.cards.CardImpl;
-import mage.choices.ChoiceColor;
-import mage.game.Game;
-import mage.game.stack.Spell;
-import mage.players.Player;
-import mage.target.TargetSpell;
-
-/**
- *
- * @author LevelX2
- */
-public class PlasmCapture extends CardImpl {
-
- public PlasmCapture(UUID ownerId) {
- super(ownerId, 91, "Plasm Capture", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{G}{G}{U}{U}");
- this.expansionSetCode = "DGM";
-
-
- // Counter target spell. At the beginning of your next precombat main phase, add X mana in any combination of colors to your mana pool, where X is that spell's converted mana cost.
- this.getSpellAbility().addTarget(new TargetSpell());
- this.getSpellAbility().addEffect(new PlasmCaptureCounterEffect());
- }
-
- public PlasmCapture(final PlasmCapture card) {
- super(card);
- }
-
- @Override
- public PlasmCapture copy() {
- return new PlasmCapture(this);
- }
-}
-
-class PlasmCaptureCounterEffect extends OneShotEffect {
-
- public PlasmCaptureCounterEffect() {
- super(Outcome.Benefit);
- this.staticText = "Counter target spell. At the beginning of your next precombat main phase, add X mana in any combination of colors to your mana pool, where X is that spell's converted mana cost";
- }
-
- public PlasmCaptureCounterEffect(final PlasmCaptureCounterEffect effect) {
- super(effect);
- }
-
- @Override
- public PlasmCaptureCounterEffect copy() {
- return new PlasmCaptureCounterEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Spell spell = game.getStack().getSpell(getTargetPointer().getFirst(game, source));
- if (spell != null) {
- game.getStack().counter(getTargetPointer().getFirst(game, source), source.getSourceId(), game);
- // mana gets added also if counter is not successful
- int mana = spell.getConvertedManaCost();
- AtTheBeginOMainPhaseDelayedTriggeredAbility delayedAbility =
- new AtTheBeginOMainPhaseDelayedTriggeredAbility(new PlasmCaptureManaEffect(mana), false, TargetController.YOU, PhaseSelection.NEXT_PRECOMBAT_MAIN);
- delayedAbility.setSourceId(source.getSourceId());
- delayedAbility.setControllerId(source.getControllerId());
- delayedAbility.setSourceObject(source.getSourceObject(game), game);
- game.addDelayedTriggeredAbility(delayedAbility);
- return true;
- }
- return false;
- }
-}
-
-class PlasmCaptureManaEffect extends ManaEffect {
-
- int amountOfMana;
-
- public PlasmCaptureManaEffect(int amountOfMana) {
- super();
- this.amountOfMana = amountOfMana;
- this.staticText = "add X mana in any combination of colors to your mana pool, where X is that spell's converted mana cost";
- }
-
- public PlasmCaptureManaEffect(final PlasmCaptureManaEffect effect) {
- super(effect);
- this.amountOfMana = effect.amountOfMana;
- }
-
- @Override
- public PlasmCaptureManaEffect copy() {
- return new PlasmCaptureManaEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Player player = game.getPlayer(source.getControllerId());
- if(player != null){
- Mana mana = new Mana();
- for(int i = 0; i < amountOfMana; i++){
- ChoiceColor choiceColor = new ChoiceColor();
- while (!player.choose(Outcome.Benefit, choiceColor, game)) {
- if (!player.canRespond()) {
- return false;
- }
- }
-
- if (choiceColor.getColor().isBlack()) {
- mana.addBlack();
- } else if (choiceColor.getColor().isBlue()) {
- mana.addBlue();
- } else if (choiceColor.getColor().isRed()) {
- mana.addRed();
- } else if (choiceColor.getColor().isGreen()) {
- mana.addGreen();
- } else if (choiceColor.getColor().isWhite()) {
- mana.addWhite();
- }
- }
-
- player.getManaPool().addMana(mana, game, source);
- return true;
-
- }
- return false;
- }
-
- @Override
- public Mana getMana(Game game, Ability source) {
- return null;
- }
-
-}
+/*
+ * 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.sets.dragonsmaze;
+
+import java.util.UUID;
+
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.Mana;
+import mage.abilities.Ability;
+import mage.abilities.common.delayed.AtTheBeginOfMainPhaseDelayedTriggeredAbility;
+import mage.abilities.common.delayed.AtTheBeginOfMainPhaseDelayedTriggeredAbility.PhaseSelection;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.ManaEffect;
+import mage.cards.CardImpl;
+import mage.choices.ChoiceColor;
+import mage.game.Game;
+import mage.game.stack.Spell;
+import mage.players.Player;
+import mage.target.TargetSpell;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class PlasmCapture extends CardImpl {
+
+ public PlasmCapture(UUID ownerId) {
+ super(ownerId, 91, "Plasm Capture", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{G}{G}{U}{U}");
+ this.expansionSetCode = "DGM";
+
+
+ // Counter target spell. At the beginning of your next precombat main phase, add X mana in any combination of colors to your mana pool, where X is that spell's converted mana cost.
+ this.getSpellAbility().addTarget(new TargetSpell());
+ this.getSpellAbility().addEffect(new PlasmCaptureCounterEffect());
+ }
+
+ public PlasmCapture(final PlasmCapture card) {
+ super(card);
+ }
+
+ @Override
+ public PlasmCapture copy() {
+ return new PlasmCapture(this);
+ }
+}
+
+class PlasmCaptureCounterEffect extends OneShotEffect {
+
+ public PlasmCaptureCounterEffect() {
+ super(Outcome.Benefit);
+ this.staticText = "Counter target spell. At the beginning of your next precombat main phase, add X mana in any combination of colors to your mana pool, where X is that spell's converted mana cost";
+ }
+
+ public PlasmCaptureCounterEffect(final PlasmCaptureCounterEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public PlasmCaptureCounterEffect copy() {
+ return new PlasmCaptureCounterEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Spell spell = game.getStack().getSpell(getTargetPointer().getFirst(game, source));
+ if (spell != null) {
+ game.getStack().counter(getTargetPointer().getFirst(game, source), source.getSourceId(), game);
+ // mana gets added also if counter is not successful
+ int mana = spell.getConvertedManaCost();
+ AtTheBeginOfMainPhaseDelayedTriggeredAbility delayedAbility =
+ new AtTheBeginOfMainPhaseDelayedTriggeredAbility(new PlasmCaptureManaEffect(mana), false, TargetController.YOU, PhaseSelection.NEXT_PRECOMBAT_MAIN);
+ delayedAbility.setSourceId(source.getSourceId());
+ delayedAbility.setControllerId(source.getControllerId());
+ delayedAbility.setSourceObject(source.getSourceObject(game), game);
+ game.addDelayedTriggeredAbility(delayedAbility);
+ return true;
+ }
+ return false;
+ }
+}
+
+class PlasmCaptureManaEffect extends ManaEffect {
+
+ int amountOfMana;
+
+ public PlasmCaptureManaEffect(int amountOfMana) {
+ super();
+ this.amountOfMana = amountOfMana;
+ this.staticText = "add X mana in any combination of colors to your mana pool, where X is that spell's converted mana cost";
+ }
+
+ public PlasmCaptureManaEffect(final PlasmCaptureManaEffect effect) {
+ super(effect);
+ this.amountOfMana = effect.amountOfMana;
+ }
+
+ @Override
+ public PlasmCaptureManaEffect copy() {
+ return new PlasmCaptureManaEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player player = game.getPlayer(source.getControllerId());
+ if(player != null){
+ Mana mana = new Mana();
+ for(int i = 0; i < amountOfMana; i++){
+ ChoiceColor choiceColor = new ChoiceColor();
+ while (!player.choose(Outcome.Benefit, choiceColor, game)) {
+ if (!player.canRespond()) {
+ return false;
+ }
+ }
+
+ if (choiceColor.getColor().isBlack()) {
+ mana.addBlack();
+ } else if (choiceColor.getColor().isBlue()) {
+ mana.addBlue();
+ } else if (choiceColor.getColor().isRed()) {
+ mana.addRed();
+ } else if (choiceColor.getColor().isGreen()) {
+ mana.addGreen();
+ } else if (choiceColor.getColor().isWhite()) {
+ mana.addWhite();
+ }
+ }
+
+ player.getManaPool().addMana(mana, game, source);
+ return true;
+
+ }
+ return false;
+ }
+
+ @Override
+ public Mana getMana(Game game, Ability source) {
+ return null;
+ }
+
+}
diff --git a/Mage.Sets/src/mage/sets/dragonsmaze/ProgenitorMimic.java b/Mage.Sets/src/mage/sets/dragonsmaze/ProgenitorMimic.java
index 416209d7782..34aacc41a2a 100644
--- a/Mage.Sets/src/mage/sets/dragonsmaze/ProgenitorMimic.java
+++ b/Mage.Sets/src/mage/sets/dragonsmaze/ProgenitorMimic.java
@@ -53,7 +53,7 @@ import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.game.permanent.token.EmptyToken;
import mage.util.CardUtil;
-import mage.util.functions.ApplyToPermanent;
+import mage.util.functions.AbilityApplier;
/**
*
@@ -61,6 +61,12 @@ import mage.util.functions.ApplyToPermanent;
*/
public class ProgenitorMimic extends CardImpl {
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("no Token");
+
+ static {
+ filter.add(Predicates.not(new TokenPredicate()));
+ }
+
public ProgenitorMimic(UUID ownerId) {
super(ownerId, 92, "Progenitor Mimic", Rarity.MYTHIC, new CardType[]{CardType.CREATURE}, "{4}{G}{U}");
this.expansionSetCode = "DGM";
@@ -72,11 +78,17 @@ public class ProgenitorMimic extends CardImpl {
// You may have Progenitor Mimic enter the battlefield as a copy of any creature on the battlefield
// except it gains "At the beginning of your upkeep, if this creature isn't a token,
// put a token onto the battlefield that's a copy of this creature."
+ AbilityApplier applier = new AbilityApplier(
+ new ConditionalTriggeredAbility(
+ new BeginningOfUpkeepTriggeredAbility(new ProgenitorMimicCopyEffect(), TargetController.YOU, false),
+ new SourceMatchesFilterCondition(filter),
+ "At the beginning of your upkeep, if this creature isn't a token, put a token onto the battlefield that's a copy of this creature.")
+ );
this.addAbility(new SimpleStaticAbility(
Zone.BATTLEFIELD,
- new EntersBattlefieldEffect(new CopyPermanentEffect(new ProgenitorMimicApplyToPermanent()),
- "You may have {this} enter the battlefield as a copy of any creature on the battlefield except it gains \"At the beginning of your upkeep, if this creature isn't a token, put a token onto the battlefield that's a copy of this creature.\"",
- true)));
+ new EntersBattlefieldEffect(new CopyPermanentEffect(applier),
+ "You may have {this} enter the battlefield as a copy of any creature on the battlefield except it gains \"At the beginning of your upkeep, if this creature isn't a token, put a token onto the battlefield that's a copy of this creature.\"",
+ true)));
}
public ProgenitorMimic(final ProgenitorMimic card) {
@@ -89,24 +101,6 @@ public class ProgenitorMimic extends CardImpl {
}
}
-class ProgenitorMimicApplyToPermanent extends ApplyToPermanent {
-
- private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("no Token");
- static {
- filter.add(Predicates.not(new TokenPredicate()));
- }
-
- @Override
- public Boolean apply(Game game, Permanent permanent) {
- Ability ability = new ConditionalTriggeredAbility(
- new BeginningOfUpkeepTriggeredAbility(new ProgenitorMimicCopyEffect(), TargetController.YOU, false),
- new SourceMatchesFilterCondition(filter),
- "At the beginning of your upkeep, if this creature isn't a token, put a token onto the battlefield that's a copy of this creature.");
- permanent.addAbility(ability, game);
- return true;
- }
-}
-
class ProgenitorMimicCopyEffect extends OneShotEffect {
public ProgenitorMimicCopyEffect() {
@@ -144,14 +138,14 @@ class ProgenitorMimicCopyEffect extends OneShotEffect {
// if it was no copy of copy take the target itself
copyFromPermanent = game.getPermanentOrLKIBattlefield(source.getSourceId());
}
-
- if (copyFromPermanent != null) {
- EmptyToken token = new EmptyToken();
+
+ if (copyFromPermanent != null) {
+ EmptyToken token = new EmptyToken();
CardUtil.copyTo(token).from(copyFromPermanent); // needed so that entersBattlefied triggered abilities see the attributes (e.g. Master Biomancer)
token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId());
Permanent newPermanentToken = game.getPermanent(token.getLastAddedToken());
if (newPermanentToken != null) {
- game.copyPermanent(copyFromPermanent, newPermanentToken, source, null);
+ game.copyPermanent(copyFromPermanent, newPermanentToken, source, null);
return true;
}
}
diff --git a/Mage.Sets/src/mage/sets/dragonsmaze/SavagebornHydra.java b/Mage.Sets/src/mage/sets/dragonsmaze/SavagebornHydra.java
index 294084fe22a..1ed4e842ea6 100644
--- a/Mage.Sets/src/mage/sets/dragonsmaze/SavagebornHydra.java
+++ b/Mage.Sets/src/mage/sets/dragonsmaze/SavagebornHydra.java
@@ -34,6 +34,7 @@ import mage.abilities.SpellAbility;
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.EntersBattlefieldEffect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.keyword.DoubleStrikeAbility;
@@ -95,12 +96,11 @@ class SavageBornHydraEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null) {
- Object obj = getValue(mage.abilities.effects.EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
- if (obj != null && obj instanceof SpellAbility
- && permanent.getZoneChangeCounter(game) - 1 == ((SpellAbility) obj).getSourceObjectZoneChangeCounter()) {
- // delete to prevent using it again if put into battlefield from other effect
- setValue(mage.abilities.effects.EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY, null);
- int amount = ((SpellAbility) obj).getManaCostsToPay().getX();
+ SpellAbility spellAbility = (SpellAbility) getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
+ if (spellAbility != null
+ && spellAbility.getSourceId().equals(source.getSourceId())
+ && permanent.getZoneChangeCounter(game) - 1 == spellAbility.getSourceObjectZoneChangeCounter()) {
+ int amount = spellAbility.getManaCostsToPay().getX();
if (amount > 0) {
permanent.addCounters(CounterType.P1P1.createInstance(amount), game);
}
diff --git a/Mage.Sets/src/mage/sets/elvesvsgoblins/SkirkDrillSergeant.java b/Mage.Sets/src/mage/sets/elvesvsgoblins/SkirkDrillSergeant.java
index fc751e65248..55756cd3dbf 100644
--- a/Mage.Sets/src/mage/sets/elvesvsgoblins/SkirkDrillSergeant.java
+++ b/Mage.Sets/src/mage/sets/elvesvsgoblins/SkirkDrillSergeant.java
@@ -1,133 +1,133 @@
-/*
- * 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.sets.elvesvsgoblins;
-
-import java.util.UUID;
-import mage.MageInt;
-import mage.MageObject;
-import mage.abilities.Ability;
-import mage.abilities.common.DiesCreatureTriggeredAbility;
-import mage.abilities.costs.mana.ManaCostsImpl;
-import mage.abilities.effects.OneShotEffect;
-import mage.abilities.effects.common.DoIfCostPaid;
-import mage.cards.Card;
-import mage.cards.CardImpl;
-import mage.cards.Cards;
-import mage.cards.CardsImpl;
-import mage.constants.CardType;
-import mage.constants.Outcome;
-import mage.constants.Rarity;
-import mage.constants.Zone;
-import mage.filter.common.FilterCreaturePermanent;
-import mage.filter.common.FilterPermanentCard;
-import mage.filter.predicate.mageobject.SubtypePredicate;
-import mage.game.Game;
-import mage.players.Player;
-
-/**
- *
- * @author LevelX2
- */
-public class SkirkDrillSergeant extends CardImpl {
-
- private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("{this} or another Goblin");
-
- static {
- filter.add(new SubtypePredicate("Goblin"));
- }
-
- public SkirkDrillSergeant(UUID ownerId) {
- super(ownerId, 49, "Skirk Drill Sergeant", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{R}");
- this.expansionSetCode = "EVG";
- this.subtype.add("Goblin");
-
- this.power = new MageInt(2);
- this.toughness = new MageInt(1);
-
- // Whenever Skirk Drill Sergeant or another Goblin dies, you may pay {2}{R}. If you do, reveal the top card of your library. If it's a Goblin permanent card, put it onto the battlefield. Otherwise, put it into your graveyard.
- this.addAbility(new DiesCreatureTriggeredAbility(new DoIfCostPaid(new SkirkDrillSergeantEffect(), new ManaCostsImpl("{2}{R}")), false, filter));
-
- }
-
- public SkirkDrillSergeant(final SkirkDrillSergeant card) {
- super(card);
- }
-
- @Override
- public SkirkDrillSergeant copy() {
- return new SkirkDrillSergeant(this);
- }
-}
-
-class SkirkDrillSergeantEffect extends OneShotEffect {
-
- private static final FilterPermanentCard filter = new FilterPermanentCard("Goblin permanent card");
-
- static {
- filter.add(new SubtypePredicate("Goblin"));
- }
-
- public SkirkDrillSergeantEffect() {
- super(Outcome.PutCreatureInPlay);
- this.staticText = "reveal the top card of your library. If it's a Goblin permanent card, put it onto the battlefield. Otherwise, put it into your graveyard";
- }
-
- public SkirkDrillSergeantEffect(final SkirkDrillSergeantEffect effect) {
- super(effect);
- }
-
- @Override
- public SkirkDrillSergeantEffect copy() {
- return new SkirkDrillSergeantEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Player player = game.getPlayer(source.getControllerId());
- MageObject sourceObject = game.getObject(source.getSourceId());
- if (player == null || sourceObject == null) {
- return false;
- }
-
- if (player.getLibrary().size() > 0) {
- Card card = player.getLibrary().getFromTop(game);
- Cards cards = new CardsImpl();
- cards.add(card);
- player.revealCards(sourceObject.getName(), cards, game);
-
- if (card != null) {
- if (filter.match(card, game)) {
- player.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, source.getSourceId());
- } else {
- player.moveCards(card, Zone.LIBRARY, Zone.GRAVEYARD, source, game);
- }
- }
- }
- return true;
- }
-}
+/*
+ * 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.sets.elvesvsgoblins;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.MageObject;
+import mage.abilities.Ability;
+import mage.abilities.common.DiesThisOrAnotherCreatureTriggeredAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.DoIfCostPaid;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.cards.Cards;
+import mage.cards.CardsImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.common.FilterPermanentCard;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+import mage.game.Game;
+import mage.players.Player;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class SkirkDrillSergeant extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("{this} or another Goblin");
+
+ static {
+ filter.add(new SubtypePredicate("Goblin"));
+ }
+
+ public SkirkDrillSergeant(UUID ownerId) {
+ super(ownerId, 49, "Skirk Drill Sergeant", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{R}");
+ this.expansionSetCode = "EVG";
+ this.subtype.add("Goblin");
+
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(1);
+
+ // Whenever Skirk Drill Sergeant or another Goblin dies, you may pay {2}{R}. If you do, reveal the top card of your library. If it's a Goblin permanent card, put it onto the battlefield. Otherwise, put it into your graveyard.
+ this.addAbility(new DiesThisOrAnotherCreatureTriggeredAbility(new DoIfCostPaid(new SkirkDrillSergeantEffect(), new ManaCostsImpl("{2}{R}")), false, filter));
+
+ }
+
+ public SkirkDrillSergeant(final SkirkDrillSergeant card) {
+ super(card);
+ }
+
+ @Override
+ public SkirkDrillSergeant copy() {
+ return new SkirkDrillSergeant(this);
+ }
+}
+
+class SkirkDrillSergeantEffect extends OneShotEffect {
+
+ private static final FilterPermanentCard filter = new FilterPermanentCard("Goblin permanent card");
+
+ static {
+ filter.add(new SubtypePredicate("Goblin"));
+ }
+
+ public SkirkDrillSergeantEffect() {
+ super(Outcome.PutCreatureInPlay);
+ this.staticText = "reveal the top card of your library. If it's a Goblin permanent card, put it onto the battlefield. Otherwise, put it into your graveyard";
+ }
+
+ public SkirkDrillSergeantEffect(final SkirkDrillSergeantEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public SkirkDrillSergeantEffect copy() {
+ return new SkirkDrillSergeantEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player player = game.getPlayer(source.getControllerId());
+ MageObject sourceObject = game.getObject(source.getSourceId());
+ if (player == null || sourceObject == null) {
+ return false;
+ }
+
+ if (player.getLibrary().size() > 0) {
+ Card card = player.getLibrary().getFromTop(game);
+ Cards cards = new CardsImpl();
+ cards.add(card);
+ player.revealCards(sourceObject.getName(), cards, game);
+
+ if (card != null) {
+ if (filter.match(card, game)) {
+ player.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, source.getSourceId());
+ } else {
+ player.moveCards(card, Zone.LIBRARY, Zone.GRAVEYARD, source, game);
+ }
+ }
+ }
+ return true;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/eventide/DivinityOfPride.java b/Mage.Sets/src/mage/sets/eventide/DivinityOfPride.java
index 19558dcc7f7..19190e1ec5a 100644
--- a/Mage.Sets/src/mage/sets/eventide/DivinityOfPride.java
+++ b/Mage.Sets/src/mage/sets/eventide/DivinityOfPride.java
@@ -28,11 +28,6 @@
package mage.sets.eventide;
import java.util.UUID;
-
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.Rarity;
-import mage.constants.Zone;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
@@ -42,6 +37,10 @@ import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.LifelinkAbility;
import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
import mage.game.Game;
import mage.players.Player;
@@ -57,15 +56,19 @@ public class DivinityOfPride extends CardImpl {
this.subtype.add("Spirit");
this.subtype.add("Avatar");
-
this.power = new MageInt(4);
this.toughness = new MageInt(4);
+ // Flying
this.addAbility(FlyingAbility.getInstance());
+
+ // Lifelink
this.addAbility(LifelinkAbility.getInstance());
+
+ // Divinity of Pride gets +4/+4 as long as you have 25 or more life.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD,
new ConditionalContinuousEffect(new BoostSourceEffect(4, 4, Duration.WhileOnBattlefield),
- new DivinityOfPrideCondition(),
- "Divinity of Pride gets +4/+4 as long as you have 25 or more life")));
+ new DivinityOfPrideCondition(),
+ "{this} gets +4/+4 as long as you have 25 or more life")));
}
public DivinityOfPride(final DivinityOfPride card) {
@@ -85,4 +88,4 @@ class DivinityOfPrideCondition implements Condition {
Player player = game.getPlayer(source.getControllerId());
return player != null && player.getLife() >= 25;
}
-}
\ No newline at end of file
+}
diff --git a/Mage.Sets/src/mage/sets/exodus/HighGround.java b/Mage.Sets/src/mage/sets/exodus/HighGround.java
new file mode 100644
index 00000000000..7b5c3164f32
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/exodus/HighGround.java
@@ -0,0 +1,62 @@
+/*
+ * 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.sets.exodus;
+
+import java.util.UUID;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.common.combat.CanBlockAdditionalCreatureAllEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class HighGround extends CardImpl {
+
+ public HighGround(UUID ownerId) {
+ super(ownerId, 7, "High Ground", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{W}");
+ this.expansionSetCode = "EXO";
+
+ // Each creature you control can block an additional creature.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CanBlockAdditionalCreatureAllEffect(1, new FilterControlledCreaturePermanent("Each creature you control"), Duration.WhileOnBattlefield)));
+ }
+
+ public HighGround(final HighGround card) {
+ super(card);
+ }
+
+ @Override
+ public HighGround copy() {
+ return new HighGround(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/exodus/MedicineBag.java b/Mage.Sets/src/mage/sets/exodus/MedicineBag.java
new file mode 100644
index 00000000000..c17bd95ef57
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/exodus/MedicineBag.java
@@ -0,0 +1,69 @@
+/*
+ * 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.sets.exodus;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.DiscardCardCost;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.RegenerateTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class MedicineBag extends CardImpl {
+
+ public MedicineBag(UUID ownerId) {
+ super(ownerId, 133, "Medicine Bag", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{3}");
+ this.expansionSetCode = "EXO";
+
+ // {1}, {tap}, Discard a card: Regenerate target creature.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateTargetEffect(), new ManaCostsImpl("{1}"));
+ ability.addCost(new TapSourceCost());
+ ability.addCost(new DiscardCardCost());
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+ }
+
+ public MedicineBag(final MedicineBag card) {
+ super(card);
+ }
+
+ @Override
+ public MedicineBag copy() {
+ return new MedicineBag(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/exodus/RecklessOgre.java b/Mage.Sets/src/mage/sets/exodus/RecklessOgre.java
new file mode 100644
index 00000000000..b6c3cd8bef4
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/exodus/RecklessOgre.java
@@ -0,0 +1,64 @@
+/*
+ * 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.sets.exodus;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.AttacksAloneTriggeredAbility;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class RecklessOgre extends CardImpl {
+
+ public RecklessOgre(UUID ownerId) {
+ super(ownerId, 98, "Reckless Ogre", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{R}");
+ this.expansionSetCode = "EXO";
+ this.subtype.add("Ogre");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(2);
+
+ // Whenever Reckless Ogre attacks alone, it gets +3/+0 until end of turn.
+ this.addAbility(new AttacksAloneTriggeredAbility(new BoostSourceEffect(3, 0, Duration.EndOfTurn)));
+ }
+
+ public RecklessOgre(final RecklessOgre card) {
+ super(card);
+ }
+
+ @Override
+ public RecklessOgre copy() {
+ return new RecklessOgre(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/exodus/SkyshroudElite.java b/Mage.Sets/src/mage/sets/exodus/SkyshroudElite.java
new file mode 100644
index 00000000000..718847d5734
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/exodus/SkyshroudElite.java
@@ -0,0 +1,83 @@
+/*
+ * 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.sets.exodus;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition.CountType;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.decorator.ConditionalContinuousEffect;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.filter.common.FilterLandPermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.SupertypePredicate;
+import mage.filter.predicate.permanent.ControllerPredicate;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class SkyshroudElite extends CardImpl {
+
+ private static final FilterLandPermanent filter = new FilterLandPermanent("nonbasic land");
+
+ static {
+ filter.add(Predicates.not(new SupertypePredicate("Basic")));
+ filter.add(new ControllerPredicate(TargetController.OPPONENT));
+ }
+
+ public SkyshroudElite(UUID ownerId) {
+ super(ownerId, 123, "Skyshroud Elite", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{G}");
+ this.expansionSetCode = "EXO";
+ this.subtype.add("Elf");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // Skyshroud Elite gets +1/+2 as long as an opponent controls a nonbasic land.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD,
+ new ConditionalContinuousEffect(new BoostSourceEffect(1, 2, Duration.WhileOnBattlefield),
+ new PermanentsOnTheBattlefieldCondition(filter, CountType.MORE_THAN, 0, false),
+ "{this} gets +1/+2 as long as an opponent controls a nonbasic land")));
+ }
+
+ public SkyshroudElite(final SkyshroudElite card) {
+ super(card);
+ }
+
+ @Override
+ public SkyshroudElite copy() {
+ return new SkyshroudElite(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fallenempires/FarrelsZealot1.java b/Mage.Sets/src/mage/sets/fallenempires/FarrelsZealot1.java
new file mode 100644
index 00000000000..808050be6d3
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fallenempires/FarrelsZealot1.java
@@ -0,0 +1,70 @@
+/*
+ * 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.sets.fallenempires;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.AttacksAndIsNotBlockedTriggeredAbility;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.effects.common.continuous.AssignNoCombatDamageSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class FarrelsZealot1 extends CardImpl {
+
+ public FarrelsZealot1(UUID ownerId) {
+ super(ownerId, 139, "Farrel's Zealot", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{W}{W}");
+ this.expansionSetCode = "FEM";
+ this.subtype.add("Human");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Whenever Farrel's Zealot attacks and isn't blocked, you may have it deal 3 damage to target creature. If you do, Farrel's Zealot assigns no combat damage this turn.
+ Ability ability = new AttacksAndIsNotBlockedTriggeredAbility(new DamageTargetEffect(3), true);
+ ability.addEffect(new AssignNoCombatDamageSourceEffect(Duration.EndOfTurn, true));
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+ }
+
+ public FarrelsZealot1(final FarrelsZealot1 card) {
+ super(card);
+ }
+
+ @Override
+ public FarrelsZealot1 copy() {
+ return new FarrelsZealot1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fallenempires/FarrelsZealot2.java b/Mage.Sets/src/mage/sets/fallenempires/FarrelsZealot2.java
new file mode 100644
index 00000000000..f87feed1cdc
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fallenempires/FarrelsZealot2.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.fallenempires;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class FarrelsZealot2 extends FarrelsZealot1 {
+
+ public FarrelsZealot2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 140;
+ }
+
+ public FarrelsZealot2(final FarrelsZealot2 card) {
+ super(card);
+ }
+
+ @Override
+ public FarrelsZealot2 copy() {
+ return new FarrelsZealot2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fallenempires/FarrelsZealot3.java b/Mage.Sets/src/mage/sets/fallenempires/FarrelsZealot3.java
new file mode 100644
index 00000000000..af5d84df989
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fallenempires/FarrelsZealot3.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.fallenempires;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class FarrelsZealot3 extends FarrelsZealot1 {
+
+ public FarrelsZealot3(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 141;
+ }
+
+ public FarrelsZealot3(final FarrelsZealot3 card) {
+ super(card);
+ }
+
+ @Override
+ public FarrelsZealot3 copy() {
+ return new FarrelsZealot3(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fallenempires/IcatianScout1.java b/Mage.Sets/src/mage/sets/fallenempires/IcatianScout1.java
new file mode 100644
index 00000000000..dbbff9b4d93
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fallenempires/IcatianScout1.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.fallenempires;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class IcatianScout1 extends mage.sets.masterseditionii.IcatianScout {
+
+ public IcatianScout1(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 157;
+ this.expansionSetCode = "FEM";
+ }
+
+ public IcatianScout1(final IcatianScout1 card) {
+ super(card);
+ }
+
+ @Override
+ public IcatianScout1 copy() {
+ return new IcatianScout1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fallenempires/IcatianScout2.java b/Mage.Sets/src/mage/sets/fallenempires/IcatianScout2.java
new file mode 100644
index 00000000000..325181c2609
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fallenempires/IcatianScout2.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.fallenempires;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class IcatianScout2 extends mage.sets.masterseditionii.IcatianScout {
+
+ public IcatianScout2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 158;
+ this.expansionSetCode = "FEM";
+ }
+
+ public IcatianScout2(final IcatianScout2 card) {
+ super(card);
+ }
+
+ @Override
+ public IcatianScout2 copy() {
+ return new IcatianScout2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fallenempires/IcatianScout3.java b/Mage.Sets/src/mage/sets/fallenempires/IcatianScout3.java
new file mode 100644
index 00000000000..0fe56bc4118
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fallenempires/IcatianScout3.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.fallenempires;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class IcatianScout3 extends mage.sets.masterseditionii.IcatianScout {
+
+ public IcatianScout3(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 159;
+ this.expansionSetCode = "FEM";
+ }
+
+ public IcatianScout3(final IcatianScout3 card) {
+ super(card);
+ }
+
+ @Override
+ public IcatianScout3 copy() {
+ return new IcatianScout3(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fallenempires/IcatianScout4.java b/Mage.Sets/src/mage/sets/fallenempires/IcatianScout4.java
new file mode 100644
index 00000000000..06810fad545
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fallenempires/IcatianScout4.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.fallenempires;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class IcatianScout4 extends mage.sets.masterseditionii.IcatianScout {
+
+ public IcatianScout4(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 160;
+ this.expansionSetCode = "FEM";
+ }
+
+ public IcatianScout4(final IcatianScout4 card) {
+ super(card);
+ }
+
+ @Override
+ public IcatianScout4 copy() {
+ return new IcatianScout4(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fallenempires/MindstabThrull1.java b/Mage.Sets/src/mage/sets/fallenempires/MindstabThrull1.java
new file mode 100644
index 00000000000..aa808c7a34d
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fallenempires/MindstabThrull1.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.fallenempires;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class MindstabThrull1 extends mage.sets.mastersedition.MindstabThrull {
+
+ public MindstabThrull1(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 19;
+ this.expansionSetCode = "FEM";
+ }
+
+ public MindstabThrull1(final MindstabThrull1 card) {
+ super(card);
+ }
+
+ @Override
+ public MindstabThrull1 copy() {
+ return new MindstabThrull1(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fallenempires/MindstabThrull2.java b/Mage.Sets/src/mage/sets/fallenempires/MindstabThrull2.java
new file mode 100644
index 00000000000..73e816795d5
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fallenempires/MindstabThrull2.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.fallenempires;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class MindstabThrull2 extends mage.sets.mastersedition.MindstabThrull {
+
+ public MindstabThrull2(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 20;
+ this.expansionSetCode = "FEM";
+ }
+
+ public MindstabThrull2(final MindstabThrull2 card) {
+ super(card);
+ }
+
+ @Override
+ public MindstabThrull2 copy() {
+ return new MindstabThrull2(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fallenempires/MindstabThrull3.java b/Mage.Sets/src/mage/sets/fallenempires/MindstabThrull3.java
new file mode 100644
index 00000000000..b4e3420b828
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fallenempires/MindstabThrull3.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.fallenempires;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class MindstabThrull3 extends mage.sets.mastersedition.MindstabThrull {
+
+ public MindstabThrull3(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 21;
+ this.expansionSetCode = "FEM";
+ }
+
+ public MindstabThrull3(final MindstabThrull3 card) {
+ super(card);
+ }
+
+ @Override
+ public MindstabThrull3 copy() {
+ return new MindstabThrull3(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fallenempires/SpiritShield.java b/Mage.Sets/src/mage/sets/fallenempires/SpiritShield.java
new file mode 100644
index 00000000000..e87d4341153
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fallenempires/SpiritShield.java
@@ -0,0 +1,75 @@
+/*
+ * 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.sets.fallenempires;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.common.SkipUntapOptionalAbility;
+import mage.abilities.condition.common.SourceTappedCondition;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.decorator.ConditionalContinuousEffect;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class SpiritShield extends CardImpl {
+
+ public SpiritShield(UUID ownerId) {
+ super(ownerId, 175, "Spirit Shield", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{3}");
+ this.expansionSetCode = "FEM";
+
+ // You may choose not to untap Spirit Shield during your untap step.
+ this.addAbility(new SkipUntapOptionalAbility());
+ // {2}, {tap}: Target creature gets +0/+2 for as long as Spirit Shield remains tapped.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ConditionalContinuousEffect(
+ new BoostTargetEffect(0, 2, Duration.Custom), SourceTappedCondition.getInstance(),
+ "target creature gets +0/+2 for as long as {this} remains tapped"), new ManaCostsImpl("{2}"));
+ ability.addCost(new TapSourceCost());
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+ }
+
+ public SpiritShield(final SpiritShield card) {
+ super(card);
+ }
+
+ @Override
+ public SpiritShield copy() {
+ return new SpiritShield(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fallenempires/ZelyonSword.java b/Mage.Sets/src/mage/sets/fallenempires/ZelyonSword.java
new file mode 100644
index 00000000000..5983121da70
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fallenempires/ZelyonSword.java
@@ -0,0 +1,75 @@
+/*
+ * 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.sets.fallenempires;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.common.SkipUntapOptionalAbility;
+import mage.abilities.condition.common.SourceTappedCondition;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.decorator.ConditionalContinuousEffect;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class ZelyonSword extends CardImpl {
+
+ public ZelyonSword(UUID ownerId) {
+ super(ownerId, 176, "Zelyon Sword", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{3}");
+ this.expansionSetCode = "FEM";
+
+ // You may choose not to untap Zelyon Sword during your untap step.
+ this.addAbility(new SkipUntapOptionalAbility());
+ // {3}, {tap}: Target creature gets +2/+0 for as long as Zelyon Sword remains tapped.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ConditionalContinuousEffect(
+ new BoostTargetEffect(2, 0, Duration.Custom), SourceTappedCondition.getInstance(),
+ "target creature gets +2/+0 for as long as {this} remains tapped"), new ManaCostsImpl("{3}"));
+ ability.addCost(new TapSourceCost());
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+ }
+
+ public ZelyonSword(final ZelyonSword card) {
+ super(card);
+ }
+
+ @Override
+ public ZelyonSword copy() {
+ return new ZelyonSword(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fatereforged/Sandblast.java b/Mage.Sets/src/mage/sets/fatereforged/Sandblast.java
index d2b497ee17d..46fd1e1e28f 100644
--- a/Mage.Sets/src/mage/sets/fatereforged/Sandblast.java
+++ b/Mage.Sets/src/mage/sets/fatereforged/Sandblast.java
@@ -46,7 +46,8 @@ public class Sandblast extends CardImpl {
// Sandblast deals 5 damage to target attacking or blocking creature.
getSpellAbility().addEffect(new DamageTargetEffect(5));
- getSpellAbility().addTarget(new TargetAttackingOrBlockingCreature()); }
+ getSpellAbility().addTarget(new TargetAttackingOrBlockingCreature());
+ }
public Sandblast(final Sandblast card) {
super(card);
diff --git a/Mage.Sets/src/mage/sets/fifthdawn/RiteOfPassage.java b/Mage.Sets/src/mage/sets/fifthdawn/RiteOfPassage.java
index b0e425fdd15..8e915e6965b 100644
--- a/Mage.Sets/src/mage/sets/fifthdawn/RiteOfPassage.java
+++ b/Mage.Sets/src/mage/sets/fifthdawn/RiteOfPassage.java
@@ -53,12 +53,11 @@ public class RiteOfPassage extends CardImpl {
super(ownerId, 91, "Rite of Passage", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}");
this.expansionSetCode = "5DN";
-
// Whenever a creature you control is dealt damage, put a +1/+1 counter on it.
Effect effect = new AddCountersTargetEffect(CounterType.P1P1.createInstance());
effect.setText("put a +1/+1 counter on it");
this.addAbility(new RiteOfPassageTriggeredAbility(effect));
-
+
}
public RiteOfPassage(final RiteOfPassage card) {
@@ -74,7 +73,7 @@ public class RiteOfPassage extends CardImpl {
class RiteOfPassageTriggeredAbility extends TriggeredAbilityImpl {
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent();
-
+
public RiteOfPassageTriggeredAbility(Effect effect) {
super(Zone.BATTLEFIELD, effect);
}
@@ -108,6 +107,6 @@ class RiteOfPassageTriggeredAbility extends TriggeredAbilityImpl {
@Override
public String getRule() {
- return "Whenever {this} is dealt damage, " + super.getRule();
+ return "Whenever a creature you control is dealt damage, " + super.getRule();
}
-}
\ No newline at end of file
+}
diff --git a/Mage.Sets/src/mage/sets/fifthedition/BrothersOfFire.java b/Mage.Sets/src/mage/sets/fifthedition/BrothersOfFire.java
new file mode 100644
index 00000000000..b0436a20e5b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fifthedition/BrothersOfFire.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.fifthedition;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class BrothersOfFire extends mage.sets.fourthedition.BrothersOfFire {
+
+ public BrothersOfFire(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 214;
+ this.expansionSetCode = "5ED";
+ }
+
+ public BrothersOfFire(final BrothersOfFire card) {
+ super(card);
+ }
+
+ @Override
+ public BrothersOfFire copy() {
+ return new BrothersOfFire(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fifthedition/CrawGiant.java b/Mage.Sets/src/mage/sets/fifthedition/CrawGiant.java
new file mode 100644
index 00000000000..2007c7018b8
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fifthedition/CrawGiant.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.fifthedition;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class CrawGiant extends mage.sets.legends.CrawGiant {
+
+ public CrawGiant(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 147;
+ this.expansionSetCode = "5ED";
+ }
+
+ public CrawGiant(final CrawGiant card) {
+ super(card);
+ }
+
+ @Override
+ public CrawGiant copy() {
+ return new CrawGiant(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fifthedition/CursedLand.java b/Mage.Sets/src/mage/sets/fifthedition/CursedLand.java
new file mode 100644
index 00000000000..06e21410275
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fifthedition/CursedLand.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.fifthedition;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class CursedLand extends mage.sets.fourthedition.CursedLand {
+
+ public CursedLand(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 14;
+ this.expansionSetCode = "5ED";
+ }
+
+ public CursedLand(final CursedLand card) {
+ super(card);
+ }
+
+ @Override
+ public CursedLand copy() {
+ return new CursedLand(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fifthedition/Detonate.java b/Mage.Sets/src/mage/sets/fifthedition/Detonate.java
new file mode 100644
index 00000000000..bbd019d09da
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fifthedition/Detonate.java
@@ -0,0 +1,83 @@
+/*
+ * 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.sets.fifthedition;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.SpellAbility;
+import mage.abilities.dynamicvalue.common.ManacostVariableValue;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.DamageTargetControllerEffect;
+import mage.abilities.effects.common.DestroyTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.Filter;
+import mage.filter.common.FilterArtifactPermanent;
+import mage.filter.predicate.mageobject.ConvertedManaCostPredicate;
+import mage.game.Game;
+import mage.target.common.TargetArtifactPermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Detonate extends CardImpl {
+
+ public Detonate(UUID ownerId) {
+ super(ownerId, 218, "Detonate", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{X}{R}");
+ this.expansionSetCode = "5ED";
+
+ // Destroy target artifact with converted mana cost X. It can't be regenerated. Detonate deals X damage to that artifact's controller.
+ this.getSpellAbility().addEffect(new DestroyTargetEffect(true));
+ this.getSpellAbility().addTarget(new TargetArtifactPermanent(new FilterArtifactPermanent("artifact with converted mana cost X")));
+ Effect effect = new DamageTargetControllerEffect(new ManacostVariableValue());
+ effect.setText("{this} deals X damage to that artifact's controller");
+ this.getSpellAbility().addEffect(effect);
+ }
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ if(ability instanceof SpellAbility) {
+ ability.getTargets().clear();
+ int xValue = ability.getManaCostsToPay().getX();
+ FilterArtifactPermanent filter = new FilterArtifactPermanent("artifact with converted mana cost X");
+ filter.add(new ConvertedManaCostPredicate(Filter.ComparisonType.Equal, xValue));
+ ability.addTarget(new TargetArtifactPermanent(filter));
+ }
+ }
+
+ public Detonate(final Detonate card) {
+ super(card);
+ }
+
+ @Override
+ public Detonate copy() {
+ return new Detonate(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fifthedition/Feedback.java b/Mage.Sets/src/mage/sets/fifthedition/Feedback.java
new file mode 100644
index 00000000000..7b730ff3174
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fifthedition/Feedback.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.fifthedition;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Feedback extends mage.sets.limitedalpha.Feedback {
+
+ public Feedback(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 85;
+ this.expansionSetCode = "5ED";
+ }
+
+ public Feedback(final Feedback card) {
+ super(card);
+ }
+
+ @Override
+ public Feedback copy() {
+ return new Feedback(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fifthedition/Heal.java b/Mage.Sets/src/mage/sets/fifthedition/Heal.java
index fd8451be21e..36445dd90be 100644
--- a/Mage.Sets/src/mage/sets/fifthedition/Heal.java
+++ b/Mage.Sets/src/mage/sets/fifthedition/Heal.java
@@ -37,7 +37,7 @@ public class Heal extends mage.sets.iceage.Heal {
public Heal(UUID ownerId) {
super(ownerId);
- this.cardNumber = 309;
+ this.cardNumber = 308;
this.expansionSetCode = "5ED";
}
diff --git a/Mage.Sets/src/mage/sets/fifthedition/IcatianScout.java b/Mage.Sets/src/mage/sets/fifthedition/IcatianScout.java
new file mode 100644
index 00000000000..63b53cec3fd
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fifthedition/IcatianScout.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.fifthedition;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class IcatianScout extends mage.sets.masterseditionii.IcatianScout {
+
+ public IcatianScout(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 313;
+ this.expansionSetCode = "5ED";
+ }
+
+ public IcatianScout(final IcatianScout card) {
+ super(card);
+ }
+
+ @Override
+ public IcatianScout copy() {
+ return new IcatianScout(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fifthedition/LivingArtifact.java b/Mage.Sets/src/mage/sets/fifthedition/LivingArtifact.java
new file mode 100644
index 00000000000..6bf5d34c1fb
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fifthedition/LivingArtifact.java
@@ -0,0 +1,146 @@
+/*
+ * 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.sets.fifthedition;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
+import mage.abilities.condition.common.SourceHasCounterCondition;
+import mage.abilities.costs.common.RemoveCountersSourceCost;
+import mage.abilities.decorator.ConditionalTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.AttachEffect;
+import mage.abilities.effects.common.DoIfCostPaid;
+import mage.abilities.effects.common.GainLifeEffect;
+import mage.abilities.effects.common.counter.AddCountersSourceEffect;
+import mage.abilities.keyword.EnchantAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.counters.CounterType;
+import mage.game.Game;
+import mage.game.events.GameEvent.EventType;
+import mage.game.events.GameEvent;
+import mage.target.TargetPermanent;
+import mage.target.common.TargetArtifactPermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class LivingArtifact extends CardImpl {
+
+ public LivingArtifact(UUID ownerId) {
+ super(ownerId, 173, "Living Artifact", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{G}");
+ this.expansionSetCode = "5ED";
+ this.subtype.add("Aura");
+
+ // Enchant artifact
+ TargetPermanent auraTarget = new TargetArtifactPermanent();
+ this.getSpellAbility().addTarget(auraTarget);
+ this.getSpellAbility().addEffect(new AttachEffect(Outcome.Benefit));
+ Ability ability = new EnchantAbility(auraTarget.getTargetName());
+ this.addAbility(ability);
+ // Whenever you're dealt damage, put that many vitality counters on Living Artifact.
+ this.addAbility(new LivingArtifactTriggeredAbility());
+ // At the beginning of your upkeep, you may remove a vitality counter from Living Artifact. If you do, you gain 1 life.
+ this.addAbility(new ConditionalTriggeredAbility(new BeginningOfUpkeepTriggeredAbility(new DoIfCostPaid(new GainLifeEffect(1),
+ new RemoveCountersSourceCost(CounterType.VITALITY.createInstance(1))), TargetController.YOU, false),
+ new SourceHasCounterCondition(CounterType.VITALITY, 1), "At the beginning of your upkeep, you may remove a vitality counter from {this}. If you do, you gain 1 life"));
+ }
+
+ public LivingArtifact(final LivingArtifact card) {
+ super(card);
+ }
+
+ @Override
+ public LivingArtifact copy() {
+ return new LivingArtifact(this);
+ }
+}
+
+class LivingArtifactTriggeredAbility extends TriggeredAbilityImpl {
+
+ public LivingArtifactTriggeredAbility() {
+ super(Zone.BATTLEFIELD, new LivingArtifactEffect(), false);
+ }
+
+ public LivingArtifactTriggeredAbility(final LivingArtifactTriggeredAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public LivingArtifactTriggeredAbility copy() {
+ return new LivingArtifactTriggeredAbility(this);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == EventType.DAMAGED_PLAYER;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ if (event.getTargetId().equals(this.getControllerId())) {
+ this.getEffects().get(0).setValue("damageAmount", event.getAmount());
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public String getRule() {
+ return "Whenever you're dealt damage, put that many charge counters on {this}.";
+ }
+}
+
+class LivingArtifactEffect extends OneShotEffect {
+
+ public LivingArtifactEffect() {
+ super(Outcome.Benefit);
+ }
+
+ public LivingArtifactEffect(final LivingArtifactEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public LivingArtifactEffect copy() {
+ return new LivingArtifactEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ return new AddCountersSourceEffect(CounterType.VITALITY.createInstance((Integer) this.getValue("damageAmount"))).apply(game, source);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fifthedition/MindstabThrull.java b/Mage.Sets/src/mage/sets/fifthedition/MindstabThrull.java
new file mode 100644
index 00000000000..aa8dd718894
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fifthedition/MindstabThrull.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.fifthedition;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class MindstabThrull extends mage.sets.mastersedition.MindstabThrull {
+
+ public MindstabThrull(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 40;
+ this.expansionSetCode = "5ED";
+ }
+
+ public MindstabThrull(final MindstabThrull card) {
+ super(card);
+ }
+
+ @Override
+ public MindstabThrull copy() {
+ return new MindstabThrull(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fifthedition/MurkDwellers.java b/Mage.Sets/src/mage/sets/fifthedition/MurkDwellers.java
new file mode 100644
index 00000000000..2ef577fec3b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fifthedition/MurkDwellers.java
@@ -0,0 +1,64 @@
+/*
+ * 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.sets.fifthedition;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.AttacksAndIsNotBlockedTriggeredAbility;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class MurkDwellers extends CardImpl {
+
+ public MurkDwellers(UUID ownerId) {
+ super(ownerId, 42, "Murk Dwellers", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{B}");
+ this.expansionSetCode = "5ED";
+ this.subtype.add("Zombie");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Whenever Murk Dwellers attacks and isn't blocked, it gets +2/+0 until end of combat.
+ this.addAbility(new AttacksAndIsNotBlockedTriggeredAbility(new BoostSourceEffect(2, 0, Duration.EndOfCombat)));
+ }
+
+ public MurkDwellers(final MurkDwellers card) {
+ super(card);
+ }
+
+ @Override
+ public MurkDwellers copy() {
+ return new MurkDwellers(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fifthedition/Recall.java b/Mage.Sets/src/mage/sets/fifthedition/Recall.java
index 605470d167b..f1af05b0fa4 100644
--- a/Mage.Sets/src/mage/sets/fifthedition/Recall.java
+++ b/Mage.Sets/src/mage/sets/fifthedition/Recall.java
@@ -73,7 +73,7 @@ class RecallEffect extends OneShotEffect {
public RecallEffect() {
super(Outcome.ReturnToHand);
- this.staticText = "Discard X cards, then return a card from your graveyard to your hand for each card discarded this way. ";
+ this.staticText = "Discard X cards, then return a card from your graveyard to your hand for each card discarded this way";
}
public RecallEffect(final RecallEffect effect) {
diff --git a/Mage.Sets/src/mage/sets/fifthedition/SorceressQueen.java b/Mage.Sets/src/mage/sets/fifthedition/SorceressQueen.java
new file mode 100644
index 00000000000..ed72daee11f
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fifthedition/SorceressQueen.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.fifthedition;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class SorceressQueen extends mage.sets.revisededition.SorceressQueen {
+
+ public SorceressQueen(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 56;
+ this.expansionSetCode = "5ED";
+ }
+
+ public SorceressQueen(final SorceressQueen card) {
+ super(card);
+ }
+
+ @Override
+ public SorceressQueen copy() {
+ return new SorceressQueen(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fifthedition/TawnossWeaponry.java b/Mage.Sets/src/mage/sets/fifthedition/TawnossWeaponry.java
new file mode 100644
index 00000000000..441cd543b49
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fifthedition/TawnossWeaponry.java
@@ -0,0 +1,75 @@
+/*
+ * 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.sets.fifthedition;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.common.SkipUntapOptionalAbility;
+import mage.abilities.condition.common.SourceTappedCondition;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.decorator.ConditionalContinuousEffect;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class TawnossWeaponry extends CardImpl {
+
+ public TawnossWeaponry(UUID ownerId) {
+ super(ownerId, 401, "Tawnos's Weaponry", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{2}");
+ this.expansionSetCode = "5ED";
+
+ // You may choose not to untap Tawnos's Weaponry during your untap step.
+ this.addAbility(new SkipUntapOptionalAbility());
+ // {2}, {tap}: Target creature gets +1/+1 for as long as Tawnos's Weaponry remains tapped.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ConditionalContinuousEffect(
+ new BoostTargetEffect(1, 1, Duration.Custom), SourceTappedCondition.getInstance(),
+ "target creature gets +1/+1 for as long as {this} remains tapped"), new ManaCostsImpl("{2}"));
+ ability.addCost(new TapSourceCost());
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+ }
+
+ public TawnossWeaponry(final TawnossWeaponry card) {
+ super(card);
+ }
+
+ @Override
+ public TawnossWeaponry copy() {
+ return new TawnossWeaponry(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fifthedition/TheWretched.java b/Mage.Sets/src/mage/sets/fifthedition/TheWretched.java
index bfe1f16d8a4..32971790008 100644
--- a/Mage.Sets/src/mage/sets/fifthedition/TheWretched.java
+++ b/Mage.Sets/src/mage/sets/fifthedition/TheWretched.java
@@ -53,10 +53,10 @@ import mage.watchers.common.BlockedAttackerWatcher;
/**
*
* @author jeffwadsworth
- *
+ *
5/1/2009 The ability grants you control of all creatures that are blocking it as the ability resolves. This will include
* any creatures that were put onto the battlefield blocking it.
-5/1/2009 Any blocking creatures that regenerated during combat will have been removed from combat. Since such creatures
+5/1/2009 Any blocking creatures that regenerated during combat will have been removed from combat. Since such creatures
* are no longer in combat, they cannot be blocking The Wretched, which means you won't be able to gain control of them.
5/1/2009 If The Wretched itself regenerated during combat, then it will have been removed from combat. Since it is no longer
* in combat, there cannot be any creatures blocking it, which means you won't be able to gain control of any creatures.
@@ -64,7 +64,7 @@ import mage.watchers.common.BlockedAttackerWatcher;
* combat damage step). For example, if it's blocked by a 7/7 creature and is destroyed, its ability won't trigger at all.
10/1/2009 If The Wretched leaves the battlefield, you no longer control it, so the duration of its control-change effect ends.
10/1/2009 If you lose control of The Wretched before its ability resolves, you won't gain control of the creatures blocking it at all.
-10/1/2009 Once the ability resolves, it doesn't care whether the permanents you gained control of remain creatures, only that
+10/1/2009 Once the ability resolves, it doesn't care whether the permanents you gained control of remain creatures, only that
* they remain on the battlefield.
*/
@@ -96,6 +96,7 @@ class TheWretchedEffect extends OneShotEffect {
TheWretchedEffect() {
super(Outcome.Benefit);
+ staticText = "gain control of all creatures blocking {this} for as long as you control {this}";
}
TheWretchedEffect(final TheWretchedEffect effect) {
@@ -114,7 +115,7 @@ class TheWretchedEffect extends OneShotEffect {
if (!new SourceOnBattlefieldControlUnchangedCondition().apply(game, source)) {
return false;
}
-
+
for (CombatGroup combatGroup :game.getCombat().getGroups()) {
if (combatGroup.getAttackers().contains(source.getSourceId())) {
for(UUID creatureId: combatGroup.getBlockers()) {
@@ -123,7 +124,7 @@ class TheWretchedEffect extends OneShotEffect {
ContinuousEffect effect = new ConditionalContinuousEffect(new GainControlTargetEffect(Duration.Custom, source.getControllerId()), new SourceOnBattlefieldControlUnchangedCondition(), "");
effect.setTargetPointer(new FixedTarget(blocker.getId()));
game.addEffect(effect, source);
-
+
}
}
}
diff --git a/Mage.Sets/src/mage/sets/fifthedition/Wanderlust.java b/Mage.Sets/src/mage/sets/fifthedition/Wanderlust.java
new file mode 100644
index 00000000000..206e8abeec2
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fifthedition/Wanderlust.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.fifthedition;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Wanderlust extends mage.sets.unlimitededition.Wanderlust {
+
+ public Wanderlust(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 201;
+ this.expansionSetCode = "5ED";
+ }
+
+ public Wanderlust(final Wanderlust card) {
+ super(card);
+ }
+
+ @Override
+ public Wanderlust copy() {
+ return new Wanderlust(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fifthedition/WarpArtifact.java b/Mage.Sets/src/mage/sets/fifthedition/WarpArtifact.java
new file mode 100644
index 00000000000..27207beb936
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fifthedition/WarpArtifact.java
@@ -0,0 +1,76 @@
+/*
+ * 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.sets.fifthedition;
+
+import java.util.UUID;
+import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.AttachEffect;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.keyword.EnchantAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.target.TargetPermanent;
+import mage.target.common.TargetArtifactPermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class WarpArtifact extends CardImpl {
+
+ public WarpArtifact(UUID ownerId) {
+ super(ownerId, 66, "Warp Artifact", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{B}{B}");
+ this.expansionSetCode = "5ED";
+ this.subtype.add("Aura");
+
+ // Enchant artifact
+ TargetPermanent auraTarget = new TargetArtifactPermanent();
+ this.getSpellAbility().addTarget(auraTarget);
+ this.getSpellAbility().addEffect(new AttachEffect(Outcome.Detriment));
+ this.addAbility(new EnchantAbility(auraTarget.getTargetName()));
+ // At the beginning of the upkeep of enchanted artifact's controller, Warp Artifact deals 1 damage to that player.
+ Effect effect = new DamageTargetEffect(1);
+ effect.setText("{this} deals 1 damage to that player");
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, effect,
+ TargetController.CONTROLLER_ATTACHED_TO, false, true));
+ }
+
+ public WarpArtifact(final WarpArtifact card) {
+ super(card);
+ }
+
+ @Override
+ public WarpArtifact copy() {
+ return new WarpArtifact(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fifthedition/WindsOfChange.java b/Mage.Sets/src/mage/sets/fifthedition/WindsOfChange.java
index bcc08cf0532..c056c1ec218 100644
--- a/Mage.Sets/src/mage/sets/fifthedition/WindsOfChange.java
+++ b/Mage.Sets/src/mage/sets/fifthedition/WindsOfChange.java
@@ -27,10 +27,11 @@
*/
package mage.sets.fifthedition;
+import java.util.HashMap;
+import java.util.Map;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
-import mage.cards.Card;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Outcome;
@@ -49,7 +50,6 @@ public class WindsOfChange extends CardImpl {
super(ownerId, 275, "Winds of Change", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{R}");
this.expansionSetCode = "5ED";
-
// Each player shuffles the cards from his or her hand into his or her library, then draws that many cards.
this.getSpellAbility().addEffect(new WindsOfChangeEffect());
}
@@ -84,19 +84,19 @@ class WindsOfChangeEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
- for (UUID playerId : controller.getInRange()) {
+ Map permanentsCount = new HashMap<>();
+ for (UUID playerId : game.getState().getPlayersInRange(source.getControllerId(), game)) {
Player player = game.getPlayer(playerId);
if (player != null) {
- int cardsHand = player.getHand().size();
- if (cardsHand > 0){
- for (Card card: player.getHand().getCards(game)) {
- player.removeFromHand(card, game);
- card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true);
- }
- game.informPlayers(player.getLogName() + " shuffles the cards from his or her hand into his or her library");
- player.shuffleLibrary(game);
- player.drawCards(cardsHand, game);
- }
+ permanentsCount.put(playerId, player.getHand().size());
+ player.moveCards(player.getHand(), Zone.HAND, Zone.LIBRARY, source, game);
+ player.shuffleLibrary(game);
+ }
+ }
+ for (UUID playerId : game.getState().getPlayersInRange(source.getControllerId(), game)) {
+ Player player = game.getPlayer(playerId);
+ if (player != null && permanentsCount.containsKey(playerId)) {
+ player.drawCards(permanentsCount.get(playerId), game);
}
}
return true;
diff --git a/Mage.Sets/src/mage/sets/fifthedition/WolverinePack.java b/Mage.Sets/src/mage/sets/fifthedition/WolverinePack.java
new file mode 100644
index 00000000000..f482b988c14
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fifthedition/WolverinePack.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.fifthedition;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class WolverinePack extends mage.sets.legends.WolverinePack {
+
+ public WolverinePack(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 206;
+ this.expansionSetCode = "5ED";
+ this.rarity = Rarity.UNCOMMON;
+ }
+
+ public WolverinePack(final WolverinePack card) {
+ super(card);
+ }
+
+ @Override
+ public WolverinePack copy() {
+ return new WolverinePack(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fourthedition/AshnodsBattleGear.java b/Mage.Sets/src/mage/sets/fourthedition/AshnodsBattleGear.java
new file mode 100644
index 00000000000..562af8a8fad
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fourthedition/AshnodsBattleGear.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.fourthedition;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class AshnodsBattleGear extends mage.sets.antiquities.AshnodsBattleGear {
+
+ public AshnodsBattleGear(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 314;
+ this.expansionSetCode = "4ED";
+ }
+
+ public AshnodsBattleGear(final AshnodsBattleGear card) {
+ super(card);
+ }
+
+ @Override
+ public AshnodsBattleGear copy() {
+ return new AshnodsBattleGear(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fourthedition/Blessing.java b/Mage.Sets/src/mage/sets/fourthedition/Blessing.java
index 081b3a0bbfd..c05d454aa17 100644
--- a/Mage.Sets/src/mage/sets/fourthedition/Blessing.java
+++ b/Mage.Sets/src/mage/sets/fourthedition/Blessing.java
@@ -51,7 +51,7 @@ import mage.target.common.TargetCreaturePermanent;
public class Blessing extends CardImpl {
public Blessing(UUID ownerId) {
- super(ownerId, 1, "Blessing", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{W}{W}");
+ super(ownerId, 259, "Blessing", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{W}{W}");
this.expansionSetCode = "4ED";
this.subtype.add("Aura");
diff --git a/Mage.Sets/src/mage/sets/fourthedition/BrothersOfFire.java b/Mage.Sets/src/mage/sets/fourthedition/BrothersOfFire.java
new file mode 100644
index 00000000000..b7b8b28f26f
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fourthedition/BrothersOfFire.java
@@ -0,0 +1,75 @@
+/*
+ * 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.sets.fourthedition;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.DamageControllerEffect;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.target.common.TargetCreatureOrPlayer;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class BrothersOfFire extends CardImpl {
+
+ public BrothersOfFire(UUID ownerId) {
+ super(ownerId, 197, "Brothers of Fire", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{R}{R}");
+ this.expansionSetCode = "4ED";
+ this.subtype.add("Human");
+ this.subtype.add("Shaman");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // {1}{R}{R}: Brothers of Fire deals 1 damage to target creature or player and 1 damage to you.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(1), new ManaCostsImpl("{1}{R}{R}"));
+ Effect effect = new DamageControllerEffect(1);
+ effect.setText("and 1 damage to you");
+ ability.addEffect(effect);
+ ability.addTarget(new TargetCreatureOrPlayer());
+ this.addAbility(ability);
+ }
+
+ public BrothersOfFire(final BrothersOfFire card) {
+ super(card);
+ }
+
+ @Override
+ public BrothersOfFire copy() {
+ return new BrothersOfFire(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/eighthedition/GiantOctopus.java b/Mage.Sets/src/mage/sets/fourthedition/Conversion.java
similarity index 82%
rename from Mage.Sets/src/mage/sets/eighthedition/GiantOctopus.java
rename to Mage.Sets/src/mage/sets/fourthedition/Conversion.java
index 81c464613c1..856dc943dfb 100644
--- a/Mage.Sets/src/mage/sets/eighthedition/GiantOctopus.java
+++ b/Mage.Sets/src/mage/sets/fourthedition/Conversion.java
@@ -25,7 +25,7 @@
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
-package mage.sets.eighthedition;
+package mage.sets.fourthedition;
import java.util.UUID;
@@ -33,20 +33,20 @@ import java.util.UUID;
*
* @author LevelX2
*/
-public class GiantOctopus extends mage.sets.seventhedition.GiantOctopus {
+public class Conversion extends mage.sets.limitedalpha.Conversion {
- public GiantOctopus(UUID ownerId) {
+ public Conversion(UUID ownerId) {
super(ownerId);
- this.cardNumber = 3;
- this.expansionSetCode = "8ED";
+ this.cardNumber = 269;
+ this.expansionSetCode = "4ED";
}
- public GiantOctopus(final GiantOctopus card) {
+ public Conversion(final Conversion card) {
super(card);
}
@Override
- public GiantOctopus copy() {
- return new GiantOctopus(this);
+ public Conversion copy() {
+ return new Conversion(this);
}
}
diff --git a/Mage.Sets/src/mage/sets/fourthedition/CosmicHorror.java b/Mage.Sets/src/mage/sets/fourthedition/CosmicHorror.java
new file mode 100644
index 00000000000..85d57bd54d5
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fourthedition/CosmicHorror.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.fourthedition;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class CosmicHorror extends mage.sets.legends.CosmicHorror {
+
+ public CosmicHorror(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 10;
+ this.expansionSetCode = "4ED";
+ }
+
+ public CosmicHorror(final CosmicHorror card) {
+ super(card);
+ }
+
+ @Override
+ public CosmicHorror copy() {
+ return new CosmicHorror(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fourthedition/CursedLand.java b/Mage.Sets/src/mage/sets/fourthedition/CursedLand.java
new file mode 100644
index 00000000000..0ae7aa71922
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fourthedition/CursedLand.java
@@ -0,0 +1,76 @@
+/*
+ * 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.sets.fourthedition;
+
+import java.util.UUID;
+import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.AttachEffect;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.keyword.EnchantAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.target.TargetPermanent;
+import mage.target.common.TargetLandPermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class CursedLand extends CardImpl {
+
+ public CursedLand(UUID ownerId) {
+ super(ownerId, 11, "Cursed Land", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{B}{B}");
+ this.expansionSetCode = "4ED";
+ this.subtype.add("Aura");
+
+ // Enchant land
+ TargetPermanent auraTarget = new TargetLandPermanent();
+ this.getSpellAbility().addTarget(auraTarget);
+ this.getSpellAbility().addEffect(new AttachEffect(Outcome.Detriment));
+ this.addAbility(new EnchantAbility(auraTarget.getTargetName()));
+ // At the beginning of the upkeep of enchanted land's controller, Cursed Land deals 1 damage to that player.
+ Effect effect = new DamageTargetEffect(1);
+ effect.setText("{this} deals 1 damage to that player");
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, effect,
+ TargetController.CONTROLLER_ATTACHED_TO, false, true));
+ }
+
+ public CursedLand(final CursedLand card) {
+ super(card);
+ }
+
+ @Override
+ public CursedLand copy() {
+ return new CursedLand(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fourthedition/Detonate.java b/Mage.Sets/src/mage/sets/fourthedition/Detonate.java
new file mode 100644
index 00000000000..e8f17c68212
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fourthedition/Detonate.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.fourthedition;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Detonate extends mage.sets.fifthedition.Detonate {
+
+ public Detonate(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 202;
+ this.expansionSetCode = "4ED";
+ }
+
+ public Detonate(final Detonate card) {
+ super(card);
+ }
+
+ @Override
+ public Detonate copy() {
+ return new Detonate(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fourthedition/Feedback.java b/Mage.Sets/src/mage/sets/fourthedition/Feedback.java
new file mode 100644
index 00000000000..937483999ee
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fourthedition/Feedback.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.fourthedition;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Feedback extends mage.sets.limitedalpha.Feedback {
+
+ public Feedback(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 71;
+ this.expansionSetCode = "4ED";
+ }
+
+ public Feedback(final Feedback card) {
+ super(card);
+ }
+
+ @Override
+ public Feedback copy() {
+ return new Feedback(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fourthedition/LivingArtifact.java b/Mage.Sets/src/mage/sets/fourthedition/LivingArtifact.java
new file mode 100644
index 00000000000..de94d1ea7a4
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fourthedition/LivingArtifact.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.fourthedition;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class LivingArtifact extends mage.sets.fifthedition.LivingArtifact {
+
+ public LivingArtifact(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 143;
+ this.expansionSetCode = "4ED";
+ }
+
+ public LivingArtifact(final LivingArtifact card) {
+ super(card);
+ }
+
+ @Override
+ public LivingArtifact copy() {
+ return new LivingArtifact(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fourthedition/MurkDwellers.java b/Mage.Sets/src/mage/sets/fourthedition/MurkDwellers.java
new file mode 100644
index 00000000000..ce073a57889
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fourthedition/MurkDwellers.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.fourthedition;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class MurkDwellers extends mage.sets.fifthedition.MurkDwellers {
+
+ public MurkDwellers(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 32;
+ this.expansionSetCode = "4ED";
+ }
+
+ public MurkDwellers(final MurkDwellers card) {
+ super(card);
+ }
+
+ @Override
+ public MurkDwellers copy() {
+ return new MurkDwellers(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fourthedition/SorceressQueen.java b/Mage.Sets/src/mage/sets/fourthedition/SorceressQueen.java
new file mode 100644
index 00000000000..3d2619efd74
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fourthedition/SorceressQueen.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.fourthedition;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class SorceressQueen extends mage.sets.revisededition.SorceressQueen {
+
+ public SorceressQueen(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 46;
+ this.expansionSetCode = "4ED";
+ }
+
+ public SorceressQueen(final SorceressQueen card) {
+ super(card);
+ }
+
+ @Override
+ public SorceressQueen copy() {
+ return new SorceressQueen(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fourthedition/TawnossWeaponry.java b/Mage.Sets/src/mage/sets/fourthedition/TawnossWeaponry.java
new file mode 100644
index 00000000000..eb3b9a1d162
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fourthedition/TawnossWeaponry.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.fourthedition;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class TawnossWeaponry extends mage.sets.fifthedition.TawnossWeaponry {
+
+ public TawnossWeaponry(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 367;
+ this.expansionSetCode = "4ED";
+ }
+
+ public TawnossWeaponry(final TawnossWeaponry card) {
+ super(card);
+ }
+
+ @Override
+ public TawnossWeaponry copy() {
+ return new TawnossWeaponry(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fourthedition/Wanderlust.java b/Mage.Sets/src/mage/sets/fourthedition/Wanderlust.java
new file mode 100644
index 00000000000..8f940308276
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fourthedition/Wanderlust.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.fourthedition;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Wanderlust extends mage.sets.unlimitededition.Wanderlust {
+
+ public Wanderlust(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 169;
+ this.expansionSetCode = "4ED";
+ }
+
+ public Wanderlust(final Wanderlust card) {
+ super(card);
+ }
+
+ @Override
+ public Wanderlust copy() {
+ return new Wanderlust(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fourthedition/WarpArtifact.java b/Mage.Sets/src/mage/sets/fourthedition/WarpArtifact.java
new file mode 100644
index 00000000000..7cac4f6ce78
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fourthedition/WarpArtifact.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.fourthedition;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class WarpArtifact extends mage.sets.fifthedition.WarpArtifact {
+
+ public WarpArtifact(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 53;
+ this.expansionSetCode = "4ED";
+ }
+
+ public WarpArtifact(final WarpArtifact card) {
+ super(card);
+ }
+
+ @Override
+ public WarpArtifact copy() {
+ return new WarpArtifact(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fridaynightmagic/Ophidian.java b/Mage.Sets/src/mage/sets/fridaynightmagic/Ophidian.java
new file mode 100644
index 00000000000..495eb7f297b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fridaynightmagic/Ophidian.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.fridaynightmagic;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Ophidian extends mage.sets.vintagemasters.Ophidian {
+
+ public Ophidian(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 13;
+ this.expansionSetCode = "FNMP";
+ this.rarity = Rarity.UNCOMMON;
+ }
+
+ public Ophidian(final Ophidian card) {
+ super(card);
+ }
+
+ @Override
+ public Ophidian copy() {
+ return new Ophidian(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/fridaynightmagic/Roast.java b/Mage.Sets/src/mage/sets/fridaynightmagic/Roast.java
new file mode 100644
index 00000000000..f3a5c42eb43
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/fridaynightmagic/Roast.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.fridaynightmagic;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class Roast extends mage.sets.dragonsoftarkir.Roast {
+
+ public Roast(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 186;
+ this.expansionSetCode = "FNMP";
+ }
+
+ public Roast(final Roast card) {
+ super(card);
+ }
+
+ @Override
+ public Roast copy() {
+ return new Roast(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/futuresight/LlanowarAugur.java b/Mage.Sets/src/mage/sets/futuresight/LlanowarAugur.java
index 3ff72547630..318db51af82 100644
--- a/Mage.Sets/src/mage/sets/futuresight/LlanowarAugur.java
+++ b/Mage.Sets/src/mage/sets/futuresight/LlanowarAugur.java
@@ -33,7 +33,10 @@ import mage.abilities.Ability;
import mage.abilities.condition.common.IsStepCondition;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.decorator.ConditionalActivatedAbility;
+import mage.abilities.effects.Effect;
import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
+import mage.abilities.keyword.TrampleAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Duration;
@@ -59,12 +62,16 @@ public class LlanowarAugur extends CardImpl {
// Sacrifice Llanowar Augur: Target creature gets +3/+3 and gains trample until end of turn.
// Activate this ability only during your upkeep.
- Ability ability = new ConditionalActivatedAbility(Zone.BATTLEFIELD,
- new BoostTargetEffect(3, 3, Duration.EndOfTurn),
- new SacrificeSourceCost(),
+ Effect effect = new BoostTargetEffect(3, 3, Duration.EndOfTurn);
+ effect.setText("Target creature gets +3/+3");
+ Ability ability = new ConditionalActivatedAbility(Zone.BATTLEFIELD,
+ effect,
+ new SacrificeSourceCost(),
new IsStepCondition(PhaseStep.UPKEEP),
null
- );
+ );
+ effect = new GainAbilityTargetEffect(TrampleAbility.getInstance(), Duration.EndOfTurn, "and gains trample until end of turn");
+ ability.addEffect(effect);
ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/sets/futuresight/MagusOfTheMoon.java b/Mage.Sets/src/mage/sets/futuresight/MagusOfTheMoon.java
index d6ee678b76b..f8add1d6b61 100644
--- a/Mage.Sets/src/mage/sets/futuresight/MagusOfTheMoon.java
+++ b/Mage.Sets/src/mage/sets/futuresight/MagusOfTheMoon.java
@@ -28,6 +28,12 @@
package mage.sets.futuresight;
import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.ContinuousEffectImpl;
+import mage.abilities.mana.RedManaAbility;
+import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Layer;
@@ -35,12 +41,6 @@ import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.constants.SubLayer;
import mage.constants.Zone;
-import mage.MageInt;
-import mage.abilities.Ability;
-import mage.abilities.common.SimpleStaticAbility;
-import mage.abilities.effects.ContinuousEffectImpl;
-import mage.abilities.mana.RedManaAbility;
-import mage.cards.CardImpl;
import mage.filter.common.FilterLandPermanent;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.SupertypePredicate;
@@ -53,6 +53,12 @@ import mage.game.permanent.Permanent;
*/
public class MagusOfTheMoon extends CardImpl {
+ private static final FilterLandPermanent filter = new FilterLandPermanent();
+
+ static {
+ filter.add(Predicates.not(new SupertypePredicate("Basic")));
+ }
+
public MagusOfTheMoon(UUID ownerId) {
super(ownerId, 101, "Magus of the Moon", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{R}");
this.expansionSetCode = "FUT";
@@ -74,53 +80,49 @@ public class MagusOfTheMoon extends CardImpl {
public MagusOfTheMoon copy() {
return new MagusOfTheMoon(this);
}
-}
-class MagusOfTheMoonEffect extends ContinuousEffectImpl {
+ class MagusOfTheMoonEffect extends ContinuousEffectImpl {
- private static final FilterLandPermanent filter = new FilterLandPermanent();
- static {
- filter.add(Predicates.not(new SupertypePredicate("Basic")));
- }
-
- MagusOfTheMoonEffect() {
- super(Duration.WhileOnBattlefield, Outcome.Detriment);
- this.staticText = "Nonbasic lands are Mountains";
- }
-
- MagusOfTheMoonEffect(final MagusOfTheMoonEffect effect) {
- super(effect);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- return false;
- }
-
- @Override
- public MagusOfTheMoonEffect copy() {
- return new MagusOfTheMoonEffect(this);
- }
-
- @Override
- public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) {
- for (Permanent land: game.getBattlefield().getActivePermanents(filter, source.getControllerId(), game)) {
- switch (layer) {
- case AbilityAddingRemovingEffects_6:
- land.removeAllAbilities(source.getSourceId(), game);
- land.addAbility(new RedManaAbility(), source.getSourceId(), game);
- break;
- case TypeChangingEffects_4:
- land.getSubtype().clear();
- land.getSubtype().add("Mountain");
- break;
- }
+ MagusOfTheMoonEffect() {
+ super(Duration.WhileOnBattlefield, Outcome.Detriment);
+ this.staticText = "Nonbasic lands are Mountains";
+ }
+
+ MagusOfTheMoonEffect(final MagusOfTheMoonEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ return false;
+ }
+
+ @Override
+ public MagusOfTheMoonEffect copy() {
+ return new MagusOfTheMoonEffect(this);
+ }
+
+ @Override
+ public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) {
+ for (Permanent land : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), game)) {
+ switch (layer) {
+ case AbilityAddingRemovingEffects_6:
+ land.removeAllAbilities(source.getSourceId(), game);
+ land.addAbility(new RedManaAbility(), source.getSourceId(), game);
+ break;
+ case TypeChangingEffects_4:
+ land.getSubtype().clear();
+ land.getSubtype().add("Mountain");
+ break;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public boolean hasLayer(Layer layer) {
+ return layer == Layer.AbilityAddingRemovingEffects_6 || layer == Layer.TypeChangingEffects_4;
}
- return true;
}
- @Override
- public boolean hasLayer(Layer layer) {
- return layer == Layer.AbilityAddingRemovingEffects_6 || layer == Layer.TypeChangingEffects_4;
- }
}
diff --git a/Mage.Sets/src/mage/sets/futuresight/NimbusMaze.java b/Mage.Sets/src/mage/sets/futuresight/NimbusMaze.java
index a5c250207e9..75026f82f29 100644
--- a/Mage.Sets/src/mage/sets/futuresight/NimbusMaze.java
+++ b/Mage.Sets/src/mage/sets/futuresight/NimbusMaze.java
@@ -28,20 +28,21 @@
package mage.sets.futuresight;
import java.util.UUID;
-
+import mage.Mana;
import mage.abilities.Ability;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
import mage.abilities.costs.CostImpl;
-import mage.abilities.mana.BlueManaAbility;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.effects.common.BasicManaEffect;
+import mage.abilities.mana.ActivateIfConditionManaAbility;
import mage.abilities.mana.ColorlessManaAbility;
-import mage.abilities.mana.WhiteManaAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
-import mage.constants.TargetController;
+import mage.constants.Zone;
import mage.filter.FilterPermanent;
-import mage.filter.predicate.mageobject.CardTypePredicate;
+import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.SubtypePredicate;
-import mage.filter.predicate.permanent.ControllerPredicate;
import mage.game.Game;
/**
@@ -50,14 +51,12 @@ import mage.game.Game;
*/
public class NimbusMaze extends CardImpl {
- private static final FilterPermanent controlIsland = new FilterPermanent("you control an Island");
- private static final FilterPermanent controlPlains = new FilterPermanent("you control a Plains");
+ private static final FilterControlledPermanent controlIsland = new FilterControlledPermanent("you control an Island");
+ private static final FilterControlledPermanent controlPlains = new FilterControlledPermanent("you control a Plains");
+
static {
controlIsland.add(new SubtypePredicate("Island"));
- controlIsland.add(new ControllerPredicate(TargetController.YOU));
-
controlPlains.add(new SubtypePredicate("Plains"));
- controlPlains.add(new ControllerPredicate(TargetController.YOU));
}
public NimbusMaze(UUID ownerId) {
@@ -67,13 +66,17 @@ public class NimbusMaze extends CardImpl {
// {tap}: Add {1} to your mana pool.
this.addAbility(new ColorlessManaAbility());
// {tap}: Add {W} to your mana pool. Activate this ability only if you control an Island.
- Ability addW = new WhiteManaAbility();
- addW.addCost(new FilterPermanentCost(controlIsland));
- this.addAbility(addW);
+ this.addAbility(new ActivateIfConditionManaAbility(
+ Zone.BATTLEFIELD,
+ new BasicManaEffect(Mana.WhiteMana),
+ new TapSourceCost(),
+ new PermanentsOnTheBattlefieldCondition(controlIsland)));
// {tap}: Add {U} to your mana pool. Activate this ability only if you control a Plains.
- Ability addU = new BlueManaAbility();
- addU.addCost(new FilterPermanentCost(controlPlains));
- this.addAbility(addU);
+ this.addAbility(new ActivateIfConditionManaAbility(
+ Zone.BATTLEFIELD,
+ new BasicManaEffect(Mana.BlueMana),
+ new TapSourceCost(),
+ new PermanentsOnTheBattlefieldCondition(controlPlains)));
}
public NimbusMaze(final NimbusMaze card) {
diff --git a/Mage.Sets/src/mage/sets/futuresight/YixlidJailer.java b/Mage.Sets/src/mage/sets/futuresight/YixlidJailer.java
index 4e35a0f736c..dd701feb7e7 100644
--- a/Mage.Sets/src/mage/sets/futuresight/YixlidJailer.java
+++ b/Mage.Sets/src/mage/sets/futuresight/YixlidJailer.java
@@ -72,59 +72,59 @@ public class YixlidJailer extends CardImpl {
public YixlidJailer copy() {
return new YixlidJailer(this);
}
-}
-class YixlidJailerEffect extends ContinuousEffectImpl {
+ class YixlidJailerEffect extends ContinuousEffectImpl {
- YixlidJailerEffect() {
- super(Duration.WhileOnBattlefield, Outcome.LoseAbility);
- staticText = "Cards in graveyards lose all abilities.";
- }
+ YixlidJailerEffect() {
+ super(Duration.WhileOnBattlefield, Outcome.LoseAbility);
+ staticText = "Cards in graveyards lose all abilities.";
+ }
- YixlidJailerEffect(final YixlidJailerEffect effect) {
- super(effect);
- }
+ YixlidJailerEffect(final YixlidJailerEffect effect) {
+ super(effect);
+ }
- @Override
- public YixlidJailerEffect copy() {
- return new YixlidJailerEffect(this);
- }
+ @Override
+ public YixlidJailerEffect copy() {
+ return new YixlidJailerEffect(this);
+ }
- @Override
- public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) {
- if (layer == Layer.AbilityAddingRemovingEffects_6) {
- Player controller = game.getPlayer(source.getControllerId());
- if (controller != null) {
- for (UUID playerId : controller.getInRange()) {
- Player player = game.getPlayer(playerId);
- if (player != null) {
- for (Card card : player.getGraveyard().getCards(game)) {
- if (card != null) {
- card.getAbilities(game).clear(); // Will the abilities ever come back????
- // TODO: Fix that (LevelX2)
- // game.getContinuousEffects().removeGainedEffectsForSource(card.getId());
- // game.getState().resetTriggersForSourceId(card.getId());
- Abilities abilities = game.getState().getAllOtherAbilities(card.getId());
- if (abilities != null) {
- abilities.clear();
+ @Override
+ public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) {
+ if (layer == Layer.AbilityAddingRemovingEffects_6) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller != null) {
+ for (UUID playerId : controller.getInRange()) {
+ Player player = game.getPlayer(playerId);
+ if (player != null) {
+ for (Card card : player.getGraveyard().getCards(game)) {
+ if (card != null) {
+ card.getAbilities(game).clear(); // Will the abilities ever come back????
+ // TODO: Fix that (LevelX2)
+ // game.getContinuousEffects().removeGainedEffectsForSource(card.getId());
+ // game.getState().resetTriggersForSourceId(card.getId());
+ Abilities abilities = game.getState().getAllOtherAbilities(card.getId());
+ if (abilities != null) {
+ abilities.clear();
+ }
}
}
}
}
+ return true;
}
- return true;
}
+ return false;
}
- return false;
- }
- @Override
- public boolean apply(Game game, Ability source) {
- return false;
- }
+ @Override
+ public boolean apply(Game game, Ability source) {
+ return false;
+ }
- @Override
- public boolean hasLayer(Layer layer) {
- return layer == Layer.AbilityAddingRemovingEffects_6;
+ @Override
+ public boolean hasLayer(Layer layer) {
+ return layer == Layer.AbilityAddingRemovingEffects_6;
+ }
}
}
diff --git a/Mage.Sets/src/mage/sets/gameday/RadiantFlames.java b/Mage.Sets/src/mage/sets/gameday/RadiantFlames.java
new file mode 100644
index 00000000000..c546687f514
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/gameday/RadiantFlames.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.gameday;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class RadiantFlames extends mage.sets.battleforzendikar.RadiantFlames {
+
+ public RadiantFlames(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 48;
+ this.expansionSetCode = "MGDC";
+ }
+
+ public RadiantFlames(final RadiantFlames card) {
+ super(card);
+ }
+
+ @Override
+ public RadiantFlames copy() {
+ return new RadiantFlames(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/gameday/StasisSnare.java b/Mage.Sets/src/mage/sets/gameday/StasisSnare.java
new file mode 100644
index 00000000000..7cbba70bbb6
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/gameday/StasisSnare.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.gameday;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class StasisSnare extends mage.sets.battleforzendikar.StasisSnare {
+
+ public StasisSnare(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 47;
+ this.expansionSetCode = "MGDC";
+ }
+
+ public StasisSnare(final StasisSnare card) {
+ super(card);
+ }
+
+ @Override
+ public StasisSnare copy() {
+ return new StasisSnare(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/gatecrash/DiluvianPrimordial.java b/Mage.Sets/src/mage/sets/gatecrash/DiluvianPrimordial.java
index b97e56ead71..21565e11e57 100644
--- a/Mage.Sets/src/mage/sets/gatecrash/DiluvianPrimordial.java
+++ b/Mage.Sets/src/mage/sets/gatecrash/DiluvianPrimordial.java
@@ -73,20 +73,20 @@ public class DiluvianPrimordial extends CardImpl {
this.addAbility(FlyingAbility.getInstance());
// When Diluvian Primordial enters the battlefield, for each opponent, you may cast up to one target instant or sorcery card from that player's graveyard without paying its mana cost. If a card cast this way would be put into a graveyard this turn, exile it instead.
- this.addAbility(new EntersBattlefieldTriggeredAbility(new DiluvianPrimordialEffect(),false));
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new DiluvianPrimordialEffect(), false));
}
@Override
public void adjustTargets(Ability ability, Game game) {
if (ability instanceof EntersBattlefieldTriggeredAbility) {
ability.getTargets().clear();
- for(UUID opponentId : game.getOpponents(ability.getControllerId())) {
+ for (UUID opponentId : game.getOpponents(ability.getControllerId())) {
Player opponent = game.getPlayer(opponentId);
if (opponent != null) {
FilterCard filter = new FilterCard("instant or sorcery card from " + opponent.getLogName() + "'s graveyard");
filter.add(new OwnerIdPredicate(opponentId));
- filter.add(Predicates.or(new CardTypePredicate(CardType.INSTANT),new CardTypePredicate(CardType.SORCERY)));
- TargetCardInOpponentsGraveyard target = new TargetCardInOpponentsGraveyard(0,1, filter);
+ filter.add(Predicates.or(new CardTypePredicate(CardType.INSTANT), new CardTypePredicate(CardType.SORCERY)));
+ TargetCardInOpponentsGraveyard target = new TargetCardInOpponentsGraveyard(0, 1, filter);
ability.addTarget(target);
}
}
@@ -123,17 +123,16 @@ class DiluvianPrimordialEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
- for (Target target: source.getTargets()) {
+ for (Target target : source.getTargets()) {
if (target instanceof TargetCardInOpponentsGraveyard) {
Card targetCard = game.getCard(target.getFirstTarget());
if (targetCard != null) {
- if (controller.chooseUse(outcome, "Cast " + targetCard.getLogName() +"?", source, game)) {
- // TODO: Handle the case if the cast is not possible, so the replacement effect shouldn't be active
- ContinuousEffect effect = new DiluvianPrimordialReplacementEffect();
- effect.setTargetPointer(new FixedTarget(targetCard.getId()));
- game.addEffect(effect, source);
-
- controller.cast(targetCard.getSpellAbility(), game, true);
+ if (controller.chooseUse(outcome, "Cast " + targetCard.getLogName() + "?", source, game)) {
+ if (controller.cast(targetCard.getSpellAbility(), game, true)) {
+ ContinuousEffect effect = new DiluvianPrimordialReplacementEffect();
+ effect.setTargetPointer(new FixedTarget(targetCard.getId(), game.getState().getZoneChangeCounter(targetCard.getId())));
+ game.addEffect(effect, source);
+ }
}
}
}
@@ -169,7 +168,7 @@ class DiluvianPrimordialReplacementEffect extends ReplacementEffectImpl {
public boolean replaceEvent(GameEvent event, Ability source, Game game) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
- Card card = game.getCard(((FixedTarget)getTargetPointer()).getTarget());
+ Card card = game.getCard(getTargetPointer().getFirst(game, source));
if (card != null) {
controller.moveCards(card, Zone.STACK, Zone.EXILED, source, game);
return true;
diff --git a/Mage.Sets/src/mage/sets/gatecrash/NimbusSwimmer.java b/Mage.Sets/src/mage/sets/gatecrash/NimbusSwimmer.java
index a47c15bc88a..e7dbf68a9cb 100644
--- a/Mage.Sets/src/mage/sets/gatecrash/NimbusSwimmer.java
+++ b/Mage.Sets/src/mage/sets/gatecrash/NimbusSwimmer.java
@@ -87,10 +87,11 @@ class NimbusSwimmerEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null) {
- Object obj = getValue(mage.abilities.effects.EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
- if (obj != null && obj instanceof SpellAbility
- && permanent.getZoneChangeCounter(game) - 1 == ((SpellAbility) obj).getSourceObjectZoneChangeCounter()) {
- int amount = ((SpellAbility) obj).getManaCostsToPay().getX();
+ SpellAbility spellAbility = (SpellAbility) getValue(mage.abilities.effects.EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
+ if (spellAbility != null
+ && spellAbility.getSourceId().equals(source.getSourceId())
+ && permanent.getZoneChangeCounter(game) - 1 == spellAbility.getSourceObjectZoneChangeCounter()) {
+ int amount = spellAbility.getManaCostsToPay().getX();
if (amount > 0) {
permanent.addCounters(CounterType.P1P1.createInstance(amount), game);
}
diff --git a/Mage.Sets/src/mage/sets/iceage/LegionsOfLimDul.java b/Mage.Sets/src/mage/sets/iceage/LegionsOfLimDul.java
new file mode 100644
index 00000000000..9a721589270
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/iceage/LegionsOfLimDul.java
@@ -0,0 +1,72 @@
+/*
+ * 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.sets.iceage;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.keyword.LandwalkAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterLandPermanent;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+import mage.filter.predicate.mageobject.SupertypePredicate;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class LegionsOfLimDul extends CardImpl {
+
+ private static final FilterLandPermanent filter = new FilterLandPermanent("snow swamp");
+
+ static {
+ filter.add(new SupertypePredicate("Snow"));
+ filter.add(new SubtypePredicate("Swamp"));
+ }
+
+ public LegionsOfLimDul(UUID ownerId) {
+ super(ownerId, 30, "Legions of Lim-Dul", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{B}{B}");
+ this.expansionSetCode = "ICE";
+ this.subtype.add("Zombie");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(3);
+
+ // Snow swampwalk
+ this.addAbility(new LandwalkAbility(filter));
+ }
+
+ public LegionsOfLimDul(final LegionsOfLimDul card) {
+ super(card);
+ }
+
+ @Override
+ public LegionsOfLimDul copy() {
+ return new LegionsOfLimDul(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/iceage/MeriekeRiBerit.java b/Mage.Sets/src/mage/sets/iceage/MeriekeRiBerit.java
new file mode 100644
index 00000000000..50e2a856a49
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/iceage/MeriekeRiBerit.java
@@ -0,0 +1,168 @@
+/*
+ * 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.sets.iceage;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.DelayedTriggeredAbility;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.condition.common.SourceOnBattlefieldControlUnchangedCondition;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.decorator.ConditionalContinuousEffect;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.DontUntapInControllersUntapStepSourceEffect;
+import mage.abilities.effects.common.continuous.GainControlTargetEffect;
+import mage.abilities.effects.common.DestroyTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.events.GameEvent.EventType;
+import mage.game.events.ZoneChangeEvent;
+import mage.game.permanent.Permanent;
+import mage.target.TargetPermanent;
+import mage.target.targetpointer.FixedTarget;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class MeriekeRiBerit extends CardImpl {
+
+ public MeriekeRiBerit(UUID ownerId) {
+ super(ownerId, 375, "Merieke Ri Berit", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{W}{U}{B}");
+ this.expansionSetCode = "ICE";
+ this.supertype.add("Legendary");
+ this.subtype.add("Human");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // Merieke Ri Berit doesn't untap during your untap step.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new DontUntapInControllersUntapStepSourceEffect()));
+
+ // {tap}: Gain control of target creature for as long as you control Merieke Ri Berit. When Merieke Ri Berit leaves the battlefield or becomes untapped, destroy that creature. It can't be regenerated.
+ ConditionalContinuousEffect MeriekeRiBeritGainControlEffect = new ConditionalContinuousEffect(
+ new GainControlTargetEffect(Duration.Custom),
+ new SourceOnBattlefieldControlUnchangedCondition(),
+ "Gain control of target creature for as long as you control {this}");
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, MeriekeRiBeritGainControlEffect, new TapSourceCost());
+ ability.addTarget(new TargetPermanent(new FilterCreaturePermanent("target creature")));
+ ability.addEffect(new MeriekeRiBeritCreateDelayedTriggerEffect());
+ this.addAbility(ability);
+
+ }
+
+ public MeriekeRiBerit(final MeriekeRiBerit card) {
+ super(card);
+ }
+
+ @Override
+ public MeriekeRiBerit copy() {
+ return new MeriekeRiBerit(this);
+ }
+}
+
+class MeriekeRiBeritCreateDelayedTriggerEffect extends OneShotEffect {
+
+ public MeriekeRiBeritCreateDelayedTriggerEffect() {
+ super(Outcome.Detriment);
+ this.staticText = "When {this} leaves the battlefield or becomes untapped, destroy that creature. It can't be regenerated.";
+ }
+
+ public MeriekeRiBeritCreateDelayedTriggerEffect(final MeriekeRiBeritCreateDelayedTriggerEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public MeriekeRiBeritCreateDelayedTriggerEffect copy() {
+ return new MeriekeRiBeritCreateDelayedTriggerEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Permanent controlledCreature = game.getPermanent(source.getFirstTarget());
+ if (controlledCreature != null) {
+ DelayedTriggeredAbility delayedAbility = new MeriekeRiBeritDelayedTriggeredAbility();
+ delayedAbility.getEffects().get(0).setTargetPointer(new FixedTarget(controlledCreature.getId()));
+ delayedAbility.setSourceId(source.getSourceId());
+ delayedAbility.setControllerId(source.getControllerId());
+ delayedAbility.setSourceObject(source.getSourceObject(game), game);
+ delayedAbility.init(game);
+ game.addDelayedTriggeredAbility(delayedAbility);
+ return true;
+ }
+ return false;
+ }
+}
+
+class MeriekeRiBeritDelayedTriggeredAbility extends DelayedTriggeredAbility {
+
+ MeriekeRiBeritDelayedTriggeredAbility() {
+ super(new DestroyTargetEffect(true), Duration.EndOfGame, true);
+ }
+
+ MeriekeRiBeritDelayedTriggeredAbility(MeriekeRiBeritDelayedTriggeredAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == EventType.ZONE_CHANGE
+ || event.getType() == EventType.UNTAPPED;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ if (event.getSourceId() != null) {
+ if (GameEvent.EventType.ZONE_CHANGE.equals(event.getType())
+ && event.getTargetId().equals(getSourceId())) {
+ ZoneChangeEvent zEvent = (ZoneChangeEvent) event;
+ return zEvent.getFromZone().equals(Zone.BATTLEFIELD);
+ }
+ }
+ return GameEvent.EventType.UNTAPPED.equals(event.getType())
+ && event.getTargetId() != null && event.getTargetId().equals(getSourceId());
+ }
+
+ @Override
+ public MeriekeRiBeritDelayedTriggeredAbility copy() {
+ return new MeriekeRiBeritDelayedTriggeredAbility(this);
+ }
+
+ @Override
+ public String getRule() {
+ return "When {this} leaves the battlefield or becomes untapped, destroy that creature. It can't be regenerated.";
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/iceage/RimeDryad.java b/Mage.Sets/src/mage/sets/iceage/RimeDryad.java
new file mode 100644
index 00000000000..52c0dc56319
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/iceage/RimeDryad.java
@@ -0,0 +1,72 @@
+/*
+ * 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.sets.iceage;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.keyword.LandwalkAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterLandPermanent;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+import mage.filter.predicate.mageobject.SupertypePredicate;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class RimeDryad extends CardImpl {
+
+ private static final FilterLandPermanent filter = new FilterLandPermanent("snow forest");
+
+ static {
+ filter.add(new SupertypePredicate("Snow"));
+ filter.add(new SubtypePredicate("Forest"));
+ }
+
+ public RimeDryad(UUID ownerId) {
+ super(ownerId, 148, "Rime Dryad", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{G}");
+ this.expansionSetCode = "ICE";
+ this.subtype.add("Dryad");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(2);
+
+ // Snow forestwalk
+ this.addAbility(new LandwalkAbility(filter));
+ }
+
+ public RimeDryad(final RimeDryad card) {
+ super(card);
+ }
+
+ @Override
+ public RimeDryad copy() {
+ return new RimeDryad(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/iceage/TorGiant.java b/Mage.Sets/src/mage/sets/iceage/TorGiant.java
index 406c02c838d..17f4c54c3de 100644
--- a/Mage.Sets/src/mage/sets/iceage/TorGiant.java
+++ b/Mage.Sets/src/mage/sets/iceage/TorGiant.java
@@ -40,7 +40,7 @@ import mage.cards.CardImpl;
public class TorGiant extends CardImpl {
public TorGiant(UUID ownerId) {
- super(ownerId, 76, "Tor Giant", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{R}");
+ super(ownerId, 220, "Tor Giant", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{R}");
this.expansionSetCode = "ICE";
this.subtype.add("Giant");
diff --git a/Mage.Sets/src/mage/sets/iceage/ZuranSpellcaster.java b/Mage.Sets/src/mage/sets/iceage/ZuranSpellcaster.java
new file mode 100644
index 00000000000..198a9ccadbe
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/iceage/ZuranSpellcaster.java
@@ -0,0 +1,68 @@
+/*
+ * 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.sets.iceage;
+
+import java.util.UUID;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.MageInt;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.cards.CardImpl;
+import mage.target.common.TargetCreatureOrPlayer;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class ZuranSpellcaster extends CardImpl {
+
+ public ZuranSpellcaster(UUID ownerId) {
+ super(ownerId, 111, "Zuran Spellcaster", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{U}");
+ this.expansionSetCode = "ICE";
+ this.subtype.add("Human");
+ this.subtype.add("Wizard");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // {T}: Zuran Spellcaster deals 1 damage to target creature or player.
+ SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(1), new TapSourceCost()); ability.addTarget(new TargetCreatureOrPlayer());
+ this.addAbility(ability);
+ }
+
+ public ZuranSpellcaster(final ZuranSpellcaster card) {
+ super(card);
+ }
+
+ @Override
+ public ZuranSpellcaster copy() {
+ return new ZuranSpellcaster(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/innistrad/BloodlineKeeper.java b/Mage.Sets/src/mage/sets/innistrad/BloodlineKeeper.java
index 94a3961d9d5..90391f49bf5 100644
--- a/Mage.Sets/src/mage/sets/innistrad/BloodlineKeeper.java
+++ b/Mage.Sets/src/mage/sets/innistrad/BloodlineKeeper.java
@@ -1,131 +1,106 @@
-/*
- * 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.sets.innistrad;
-
-import java.util.UUID;
-
-import mage.constants.CardType;
-import mage.constants.Rarity;
-import mage.MageInt;
-import mage.abilities.Ability;
-import mage.abilities.common.SimpleActivatedAbility;
-import mage.abilities.costs.CostImpl;
-import mage.abilities.costs.common.TapSourceCost;
-import mage.abilities.costs.mana.ColoredManaCost;
-import mage.abilities.effects.common.CreateTokenEffect;
-import mage.abilities.effects.common.TransformSourceEffect;
-import mage.abilities.keyword.FlyingAbility;
-import mage.abilities.keyword.TransformAbility;
-import mage.cards.CardImpl;
-import mage.constants.ColoredManaSymbol;
-import mage.constants.Zone;
-import mage.filter.common.FilterControlledCreaturePermanent;
-import mage.filter.predicate.mageobject.SubtypePredicate;
-import mage.game.Game;
-import mage.game.permanent.token.Token;
-
-/**
- *
- * @author Loki
- */
-public class BloodlineKeeper extends CardImpl {
-
- public BloodlineKeeper(UUID ownerId) {
- super(ownerId, 90, "Bloodline Keeper", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{B}{B}");
- this.expansionSetCode = "ISD";
- this.subtype.add("Vampire");
-
- this.power = new MageInt(3);
- this.toughness = new MageInt(3);
-
- this.canTransform = true;
- this.secondSideCard = new LordOfLineage(ownerId);
-
- this.addAbility(FlyingAbility.getInstance());
- // {T}: Put a 2/2 black Vampire creature token with flying onto the battlefield.
- this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new VampireToken()), new TapSourceCost()));
- // {B}: Transform Bloodline Keeper. Activate this ability only if you control five or more Vampires.
- this.addAbility(new TransformAbility());
- Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new TransformSourceEffect(true), new ColoredManaCost(ColoredManaSymbol.B));
- ability.addCost(new ControlFiveVampiresCost());
- this.addAbility(ability);
- }
-
- public BloodlineKeeper(final BloodlineKeeper card) {
- super(card);
- }
-
- @Override
- public BloodlineKeeper copy() {
- return new BloodlineKeeper(this);
- }
-}
-
-class VampireToken extends Token {
- VampireToken() {
- super("Vampire", "a 2/2 black Vampire creature token with flying");
- cardType.add(CardType.CREATURE);
- color.setBlack(true);
- subtype.add("Vampire");
- power = new MageInt(2);
- toughness = new MageInt(2);
- addAbility(FlyingAbility.getInstance());
- }
-}
-
-class ControlFiveVampiresCost extends CostImpl {
- private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent();
-
- static {
- filter.add(new SubtypePredicate("Vampire"));
- }
-
- public ControlFiveVampiresCost() {
- this.text = "Activate this ability only if you control five or more Vampires";
- }
-
- public ControlFiveVampiresCost(final ControlFiveVampiresCost cost) {
- super(cost);
- }
-
- @Override
- public boolean canPay(Ability ability, UUID sourceId, UUID controllerId, Game game) {
- return game.getBattlefield().contains(filter, controllerId, 5, game);
- }
-
- @Override
- public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana) {
- this.paid = true;
- return paid;
- }
-
- @Override
- public ControlFiveVampiresCost copy() {
- return new ControlFiveVampiresCost(this);
- }
-}
\ No newline at end of file
+/*
+ * 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.sets.innistrad;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.ActivateIfConditionActivatedAbility;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition.CountType;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.CreateTokenEffect;
+import mage.abilities.effects.common.TransformSourceEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.abilities.keyword.TransformAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledPermanent;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+import mage.game.permanent.token.Token;
+
+/**
+ *
+ * @author Loki
+ */
+public class BloodlineKeeper extends CardImpl {
+
+ private static final FilterControlledPermanent filter = new FilterControlledPermanent("you control five or more Vampires");
+
+ static {
+ filter.add(new SubtypePredicate("Vampire"));
+ }
+
+ public BloodlineKeeper(UUID ownerId) {
+ super(ownerId, 90, "Bloodline Keeper", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{B}{B}");
+ this.expansionSetCode = "ISD";
+ this.subtype.add("Vampire");
+
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ this.canTransform = true;
+ this.secondSideCard = new LordOfLineage(ownerId);
+
+ this.addAbility(FlyingAbility.getInstance());
+ // {T}: Put a 2/2 black Vampire creature token with flying onto the battlefield.
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new CreateTokenEffect(new VampireToken()), new TapSourceCost()));
+ // {B}: Transform Bloodline Keeper. Activate this ability only if you control five or more Vampires.
+ this.addAbility(new TransformAbility());
+ Ability ability = new ActivateIfConditionActivatedAbility(Zone.BATTLEFIELD,
+ new TransformSourceEffect(true),
+ new ManaCostsImpl("{B}"),
+ new PermanentsOnTheBattlefieldCondition(filter, CountType.MORE_THAN, 4));
+ this.addAbility(ability);
+ }
+
+ public BloodlineKeeper(final BloodlineKeeper card) {
+ super(card);
+ }
+
+ @Override
+ public BloodlineKeeper copy() {
+ return new BloodlineKeeper(this);
+ }
+}
+
+class VampireToken extends Token {
+ VampireToken() {
+ super("Vampire", "a 2/2 black Vampire creature token with flying");
+ cardType.add(CardType.CREATURE);
+ color.setBlack(true);
+ subtype.add("Vampire");
+ power = new MageInt(2);
+ toughness = new MageInt(2);
+ addAbility(FlyingAbility.getInstance());
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/innistrad/CacklingCounterpart.java b/Mage.Sets/src/mage/sets/innistrad/CacklingCounterpart.java
index 3d0174773d9..069e6abedf2 100644
--- a/Mage.Sets/src/mage/sets/innistrad/CacklingCounterpart.java
+++ b/Mage.Sets/src/mage/sets/innistrad/CacklingCounterpart.java
@@ -28,13 +28,13 @@
package mage.sets.innistrad;
import java.util.UUID;
-import mage.constants.CardType;
-import mage.constants.Rarity;
-import mage.constants.TimingRule;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.PutTokenOntoBattlefieldCopyTargetEffect;
import mage.abilities.keyword.FlashbackAbility;
import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.TimingRule;
import mage.target.common.TargetControlledCreaturePermanent;
/**
@@ -46,7 +46,6 @@ public class CacklingCounterpart extends CardImpl {
super(ownerId, 46, "Cackling Counterpart", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{1}{U}{U}");
this.expansionSetCode = "ISD";
-
// Put a token onto the battlefield that's a copy of target creature you control.
this.getSpellAbility().addEffect(new PutTokenOntoBattlefieldCopyTargetEffect());
this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent());
@@ -64,5 +63,3 @@ public class CacklingCounterpart extends CardImpl {
return new CacklingCounterpart(this);
}
}
-
-
diff --git a/Mage.Sets/src/mage/sets/innistrad/EvilTwin.java b/Mage.Sets/src/mage/sets/innistrad/EvilTwin.java
index e6cb8e4ccdc..3cf16f8fbe3 100644
--- a/Mage.Sets/src/mage/sets/innistrad/EvilTwin.java
+++ b/Mage.Sets/src/mage/sets/innistrad/EvilTwin.java
@@ -28,10 +28,8 @@
package mage.sets.innistrad;
import java.util.UUID;
-import mage.constants.CardType;
-import mage.constants.Rarity;
-import mage.constants.Zone;
import mage.MageInt;
+import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
@@ -41,6 +39,9 @@ import mage.abilities.effects.EntersBattlefieldEffect;
import mage.abilities.effects.common.CopyPermanentEffect;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.ObjectSourcePlayer;
import mage.filter.predicate.ObjectSourcePlayerPredicate;
@@ -55,8 +56,6 @@ import mage.util.functions.ApplyToPermanent;
*/
public class EvilTwin extends CardImpl {
-
-
public EvilTwin(UUID ownerId) {
super(ownerId, 212, "Evil Twin", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{U}{B}");
this.expansionSetCode = "ISD";
@@ -69,8 +68,8 @@ public class EvilTwin extends CardImpl {
this.addAbility(new SimpleStaticAbility(
Zone.BATTLEFIELD,
new EntersBattlefieldEffect(new CopyPermanentEffect(new EvilTwinApplyToPermanent()),
- "You may have {this} enter the battlefield as a copy of any creature on the battlefield except it gains \"{U}{B}, {T}: Destroy target creature with the same name as this creature\"",
- true)));
+ "You may have {this} enter the battlefield as a copy of any creature on the battlefield except it gains \"{U}{B}, {T}: Destroy target creature with the same name as this creature\"",
+ true)));
}
public EvilTwin(final EvilTwin card) {
@@ -99,6 +98,16 @@ class EvilTwinApplyToPermanent extends ApplyToPermanent {
permanent.addAbility(ability, game);
return true;
}
+
+ @Override
+ public Boolean apply(Game game, MageObject mageObject) {
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroyTargetEffect(), new ManaCostsImpl("{U}{B}"));
+ ability.addCost(new TapSourceCost());
+ ability.addTarget(new TargetCreaturePermanent(filter));
+ mageObject.getAbilities().add(ability);
+ return true;
+ }
+
}
class EvilTwinPredicate implements ObjectSourcePlayerPredicate> {
diff --git a/Mage.Sets/src/mage/sets/innistrad/MikaeusTheLunarch.java b/Mage.Sets/src/mage/sets/innistrad/MikaeusTheLunarch.java
index b2e510508ab..c87a6c44bc4 100644
--- a/Mage.Sets/src/mage/sets/innistrad/MikaeusTheLunarch.java
+++ b/Mage.Sets/src/mage/sets/innistrad/MikaeusTheLunarch.java
@@ -110,10 +110,11 @@ class MikaeusTheLunarchEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null) {
- Object obj = getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
- if (obj != null && obj instanceof SpellAbility
- && permanent.getZoneChangeCounter(game) - 1 == ((SpellAbility) obj).getSourceObjectZoneChangeCounter()) {
- int amount = ((SpellAbility) obj).getManaCostsToPay().getX();
+ SpellAbility spellAbility = (SpellAbility) getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
+ if (spellAbility != null
+ && spellAbility.getSourceId().equals(source.getSourceId())
+ && permanent.getZoneChangeCounter(game) - 1 == spellAbility.getSourceObjectZoneChangeCounter()) {
+ int amount = spellAbility.getManaCostsToPay().getX();
if (amount > 0) {
permanent.addCounters(CounterType.P1P1.createInstance(amount), game);
}
diff --git a/Mage.Sets/src/mage/sets/innistrad/SilentDeparture.java b/Mage.Sets/src/mage/sets/innistrad/SilentDeparture.java
index 1d0444e8c57..a567c980624 100644
--- a/Mage.Sets/src/mage/sets/innistrad/SilentDeparture.java
+++ b/Mage.Sets/src/mage/sets/innistrad/SilentDeparture.java
@@ -28,13 +28,12 @@
package mage.sets.innistrad;
import java.util.UUID;
-
-import mage.constants.CardType;
-import mage.constants.Rarity;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.ReturnToHandTargetEffect;
import mage.abilities.keyword.FlashbackAbility;
import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
import mage.constants.TimingRule;
import mage.target.common.TargetCreaturePermanent;
@@ -48,7 +47,6 @@ public class SilentDeparture extends CardImpl {
super(ownerId, 75, "Silent Departure", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{U}");
this.expansionSetCode = "ISD";
-
// Return target creature to its owner's hand.
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
this.getSpellAbility().addEffect(new ReturnToHandTargetEffect());
diff --git a/Mage.Sets/src/mage/sets/innistrad/TravelPreparations.java b/Mage.Sets/src/mage/sets/innistrad/TravelPreparations.java
index d34f3ea38dc..24bb9763d6a 100644
--- a/Mage.Sets/src/mage/sets/innistrad/TravelPreparations.java
+++ b/Mage.Sets/src/mage/sets/innistrad/TravelPreparations.java
@@ -28,13 +28,14 @@
package mage.sets.innistrad;
import java.util.UUID;
-import mage.constants.CardType;
-import mage.constants.Rarity;
-import mage.constants.TimingRule;
import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.Effect;
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
import mage.abilities.keyword.FlashbackAbility;
import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.TimingRule;
import mage.counters.CounterType;
import mage.target.common.TargetCreaturePermanent;
@@ -48,10 +49,12 @@ public class TravelPreparations extends CardImpl {
super(ownerId, 206, "Travel Preparations", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{1}{G}");
this.expansionSetCode = "ISD";
-
// Put a +1/+1 counter on each of up to two target creatures.
- this.getSpellAbility().addEffect(new AddCountersTargetEffect(CounterType.P1P1.createInstance()));
+ Effect effect = new AddCountersTargetEffect(CounterType.P1P1.createInstance());
+ effect.setText("Put a +1/+1 counter on each of up to two target creatures");
+ this.getSpellAbility().addEffect(effect);
this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 2));
+
// Flashback {1}{W}
this.addAbility(new FlashbackAbility(new ManaCostsImpl("{1}{W}"), TimingRule.SORCERY));
}
diff --git a/Mage.Sets/src/mage/sets/invasion/PlagueSpores.java b/Mage.Sets/src/mage/sets/invasion/PlagueSpores.java
index db32455cf27..9d1f8fefc0e 100644
--- a/Mage.Sets/src/mage/sets/invasion/PlagueSpores.java
+++ b/Mage.Sets/src/mage/sets/invasion/PlagueSpores.java
@@ -43,7 +43,7 @@ import mage.target.common.TargetLandPermanent;
/**
*
* @author LoneFox
-
+ *
*/
public class PlagueSpores extends CardImpl {
@@ -58,7 +58,7 @@ public class PlagueSpores extends CardImpl {
this.expansionSetCode = "INV";
// Destroy target nonblack creature and target land. They can't be regenerated.
- Effect effect = new DestroyTargetEffect(true);
+ Effect effect = new DestroyTargetEffect(true, true);
effect.setText("Destroy target nonblack creature and target land. They can't be regenerated.");
this.getSpellAbility().addEffect(effect);
this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter));
diff --git a/Mage.Sets/src/mage/sets/invasion/RogueKavu.java b/Mage.Sets/src/mage/sets/invasion/RogueKavu.java
new file mode 100644
index 00000000000..4d428a0844c
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/invasion/RogueKavu.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.invasion;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class RogueKavu extends mage.sets.ninthedition.RogueKavu {
+
+ public RogueKavu(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 160;
+ this.expansionSetCode = "INV";
+ }
+
+ public RogueKavu(final RogueKavu card) {
+ super(card);
+ }
+
+ @Override
+ public RogueKavu copy() {
+ return new RogueKavu(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/jacevschandra/Ophidian.java b/Mage.Sets/src/mage/sets/jacevschandra/Ophidian.java
new file mode 100644
index 00000000000..2e3c2045e10
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/jacevschandra/Ophidian.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.jacevschandra;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Ophidian extends mage.sets.vintagemasters.Ophidian {
+
+ public Ophidian(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 9;
+ this.expansionSetCode = "DD2";
+ }
+
+ public Ophidian(final Ophidian card) {
+ super(card);
+ }
+
+ @Override
+ public Ophidian copy() {
+ return new Ophidian(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/journeyintonyx/SpitefulBlow.java b/Mage.Sets/src/mage/sets/journeyintonyx/SpitefulBlow.java
index 48dbb0da2ce..578166c9807 100644
--- a/Mage.Sets/src/mage/sets/journeyintonyx/SpitefulBlow.java
+++ b/Mage.Sets/src/mage/sets/journeyintonyx/SpitefulBlow.java
@@ -33,10 +33,8 @@ import mage.abilities.effects.common.DestroyTargetEffect;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
-import mage.target.Target;
import mage.target.common.TargetCreaturePermanent;
import mage.target.common.TargetLandPermanent;
-import mage.target.targetpointer.SecondTargetPointer;
/**
*
@@ -48,16 +46,12 @@ public class SpitefulBlow extends CardImpl {
super(ownerId, 83, "Spiteful Blow", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{4}{B}{B}");
this.expansionSetCode = "JOU";
-
// Destroy target creature and target land.
- this.getSpellAbility().addEffect(new DestroyTargetEffect());
- this.getSpellAbility().addTarget(new TargetCreaturePermanent());
- Effect effect = new DestroyTargetEffect();
- effect.setText("and target land");
- effect.setTargetPointer(new SecondTargetPointer());
+ Effect effect = new DestroyTargetEffect(false, true);
+ effect.setText("Destroy target creature and target land");
this.getSpellAbility().addEffect(effect);
- Target target = new TargetLandPermanent();
- this.getSpellAbility().addTarget(target);
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent());
+ this.getSpellAbility().addTarget(new TargetLandPermanent());
}
public SpitefulBlow(final SpitefulBlow card) {
diff --git a/Mage.Sets/src/mage/sets/judgepromo/RishadanPort.java b/Mage.Sets/src/mage/sets/judgepromo/RishadanPort.java
new file mode 100644
index 00000000000..5ff68095f0f
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/judgepromo/RishadanPort.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.judgepromo;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class RishadanPort extends mage.sets.mercadianmasques.RishadanPort {
+
+ public RishadanPort(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 98;
+ this.expansionSetCode = "JR";
+ }
+
+ public RishadanPort(final RishadanPort card) {
+ super(card);
+ }
+
+ @Override
+ public RishadanPort copy() {
+ return new RishadanPort(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/judgment/Guiltfeeder.java b/Mage.Sets/src/mage/sets/judgment/Guiltfeeder.java
new file mode 100644
index 00000000000..eb17e664de5
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/judgment/Guiltfeeder.java
@@ -0,0 +1,70 @@
+/*
+ * 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.sets.judgment;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.AttacksAndIsNotBlockedTriggeredAbility;
+import mage.abilities.dynamicvalue.common.CardsInTargetPlayersGraveyardCount;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.LoseLifeTargetEffect;
+import mage.abilities.keyword.FearAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Guiltfeeder extends CardImpl {
+
+ public Guiltfeeder(UUID ownerId) {
+ super(ownerId, 68, "Guiltfeeder", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{B}{B}");
+ this.expansionSetCode = "JUD";
+ this.subtype.add("Horror");
+ this.power = new MageInt(0);
+ this.toughness = new MageInt(4);
+
+ // Fear
+ this.addAbility(FearAbility.getInstance());
+ // Whenever Guiltfeeder attacks and isn't blocked, defending player loses 1 life for each card in his or her graveyard.
+ Effect effect = new LoseLifeTargetEffect(new CardsInTargetPlayersGraveyardCount());
+ effect.setText("defending player loses 1 life for each card in his or her graveyard");
+ this.addAbility(new AttacksAndIsNotBlockedTriggeredAbility(effect, false, true));
+ }
+
+ public Guiltfeeder(final Guiltfeeder card) {
+ super(card);
+ }
+
+ @Override
+ public Guiltfeeder copy() {
+ return new Guiltfeeder(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/BribersPurse.java b/Mage.Sets/src/mage/sets/khansoftarkir/BribersPurse.java
index ae267ccc250..ac166275b31 100644
--- a/Mage.Sets/src/mage/sets/khansoftarkir/BribersPurse.java
+++ b/Mage.Sets/src/mage/sets/khansoftarkir/BribersPurse.java
@@ -94,10 +94,11 @@ class BribersPurseEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null) {
- Object obj = getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
- if (obj != null && obj instanceof SpellAbility
- && permanent.getZoneChangeCounter(game) - 1 == ((SpellAbility) obj).getSourceObjectZoneChangeCounter()) {
- int amount = ((SpellAbility) obj).getManaCostsToPay().getX();
+ SpellAbility spellAbility = (SpellAbility) getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
+ if (spellAbility != null
+ && spellAbility.getSourceId().equals(source.getSourceId())
+ && permanent.getZoneChangeCounter(game) - 1 == spellAbility.getSourceObjectZoneChangeCounter()) {
+ int amount = spellAbility.getManaCostsToPay().getX();
if (amount > 0) {
permanent.addCounters(new Counter("gem", amount), game);
}
diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/HoodedHydra.java b/Mage.Sets/src/mage/sets/khansoftarkir/HoodedHydra.java
index 701624c57fd..9f577aba4dc 100644
--- a/Mage.Sets/src/mage/sets/khansoftarkir/HoodedHydra.java
+++ b/Mage.Sets/src/mage/sets/khansoftarkir/HoodedHydra.java
@@ -111,10 +111,11 @@ class HoodedHydraEffect1 extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null && !permanent.isFaceDown(game)) {
- Object obj = getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
- if (obj != null && obj instanceof SpellAbility
- && permanent.getZoneChangeCounter(game) - 1 == ((SpellAbility) obj).getSourceObjectZoneChangeCounter()) {
- int amount = ((SpellAbility) obj).getManaCostsToPay().getX();
+ SpellAbility spellAbility = (SpellAbility) getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
+ if (spellAbility != null
+ && spellAbility.getSourceId().equals(source.getSourceId())
+ && permanent.getZoneChangeCounter(game) - 1 == spellAbility.getSourceObjectZoneChangeCounter()) {
+ int amount = spellAbility.getManaCostsToPay().getX();
if (amount > 0) {
permanent.addCounters(CounterType.P1P1.createInstance(amount), game);
}
diff --git a/Mage.Sets/src/mage/sets/khansoftarkir/VillainousWealth.java b/Mage.Sets/src/mage/sets/khansoftarkir/VillainousWealth.java
index 4780c7e18a2..cf5fa4b68a7 100644
--- a/Mage.Sets/src/mage/sets/khansoftarkir/VillainousWealth.java
+++ b/Mage.Sets/src/mage/sets/khansoftarkir/VillainousWealth.java
@@ -108,6 +108,7 @@ class VillainousWealthEffect extends OneShotEffect {
OuterLoop:
while (cardsToExile.count(filter, game) > 0) {
TargetCardInExile target = new TargetCardInExile(0, 1, filter, exileId, false);
+ target.setNotTarget(true);
while (cardsToExile.count(filter, game) > 0 && controller.choose(Outcome.PlayForFree, cardsToExile, target, game)) {
Card card = game.getCard(target.getFirstTarget());
if (card != null) {
diff --git a/Mage.Sets/src/mage/sets/launchparty/BlightHerder.java b/Mage.Sets/src/mage/sets/launchparty/BlightHerder.java
new file mode 100644
index 00000000000..01bebfd8478
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/launchparty/BlightHerder.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.launchparty;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class BlightHerder extends mage.sets.battleforzendikar.BlightHerder {
+
+ public BlightHerder(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 32;
+ this.expansionSetCode = "MLP";
+ }
+
+ public BlightHerder(final BlightHerder card) {
+ super(card);
+ }
+
+ @Override
+ public BlightHerder copy() {
+ return new BlightHerder(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/legends/AErathiBerserker.java b/Mage.Sets/src/mage/sets/legends/AErathiBerserker.java
new file mode 100644
index 00000000000..92fd344f643
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/legends/AErathiBerserker.java
@@ -0,0 +1,63 @@
+/*
+ * 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.sets.legends;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.keyword.RampageAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class AErathiBerserker extends CardImpl {
+
+ public AErathiBerserker(UUID ownerId) {
+ super(ownerId, 131, "AErathi Berserker", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{R}{R}{R}");
+ this.expansionSetCode = "LEG";
+ this.subtype.add("Human");
+ this.subtype.add("Berserker");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(4);
+
+ // Rampage 3
+ this.addAbility(new RampageAbility(3));
+ }
+
+ public AErathiBerserker(final AErathiBerserker card) {
+ super(card);
+ }
+
+ @Override
+ public AErathiBerserker copy() {
+ return new AErathiBerserker(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/legends/ArcadesSabboth.java b/Mage.Sets/src/mage/sets/legends/ArcadesSabboth.java
new file mode 100644
index 00000000000..0fe40090c40
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/legends/ArcadesSabboth.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.legends;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class ArcadesSabboth extends mage.sets.masterseditioniii.ArcadesSabboth {
+
+ public ArcadesSabboth(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 258;
+ this.expansionSetCode = "LEG";
+ }
+
+ public ArcadesSabboth(final ArcadesSabboth card) {
+ super(card);
+ }
+
+ @Override
+ public ArcadesSabboth copy() {
+ return new ArcadesSabboth(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/legends/Chromium.java b/Mage.Sets/src/mage/sets/legends/Chromium.java
new file mode 100644
index 00000000000..e051d10c0a6
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/legends/Chromium.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.legends;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Chromium extends mage.sets.masterseditioniii.Chromium {
+
+ public Chromium(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 264;
+ this.expansionSetCode = "LEG";
+ }
+
+ public Chromium(final Chromium card) {
+ super(card);
+ }
+
+ @Override
+ public Chromium copy() {
+ return new Chromium(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/legends/CosmicHorror.java b/Mage.Sets/src/mage/sets/legends/CosmicHorror.java
new file mode 100644
index 00000000000..0f0e6273f24
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/legends/CosmicHorror.java
@@ -0,0 +1,119 @@
+/*
+ * 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.sets.legends;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
+import mage.abilities.costs.Cost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.keyword.FirstStrikeAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class CosmicHorror extends CardImpl {
+
+ public CosmicHorror(UUID ownerId) {
+ super(ownerId, 6, "Cosmic Horror", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{B}{B}{B}");
+ this.expansionSetCode = "LEG";
+ this.subtype.add("Horror");
+ this.power = new MageInt(7);
+ this.toughness = new MageInt(7);
+
+ // First strike
+ this.addAbility(FirstStrikeAbility.getInstance());
+
+ // At the beginning of your upkeep, destroy Cosmic Horror unless you pay {3}{B}{B}{B}. If Cosmic Horror is destroyed this way, it deals 7 damage to you.
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(new CosmicHorrorEffect(new ManaCostsImpl("{3}{B}{B}{B}")), TargetController.YOU, false));
+ }
+
+ public CosmicHorror(final CosmicHorror card) {
+ super(card);
+ }
+
+ @Override
+ public CosmicHorror copy() {
+ return new CosmicHorror(this);
+ }
+}
+
+class CosmicHorrorEffect extends OneShotEffect {
+
+ protected Cost cost;
+
+ public CosmicHorrorEffect(Cost cost) {
+ super(Outcome.DestroyPermanent);
+ this.cost = cost;
+ staticText = "destroy {this} unless you pay {3}{B}{B}{B}. If {this} is destroyed this way it deals 7 damage to you";
+ }
+
+ public CosmicHorrorEffect(final CosmicHorrorEffect effect) {
+ super(effect);
+ this.cost = effect.cost.copy();
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ Permanent cosmicHorror = game.getPermanentOrLKIBattlefield(source.getSourceId());
+ if (controller != null && cosmicHorror != null) {
+ StringBuilder sb = new StringBuilder(cost.getText()).append("?");
+ if (!sb.toString().toLowerCase().startsWith("exile ") && !sb.toString().toLowerCase().startsWith("return ")) {
+ sb.insert(0, "Pay ");
+ }
+ if (controller.chooseUse(Outcome.Benefit, sb.toString(), source, game)) {
+ cost.clearPaid();
+ if (cost.pay(source, game, source.getSourceId(), source.getControllerId(), false)) {
+ return true;
+ }
+ }
+ if (cosmicHorror.destroy(source.getSourceId(), game, false)) {
+ controller.damage(7, source.getSourceId(), game, false, true);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public CosmicHorrorEffect copy() {
+ return new CosmicHorrorEffect(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/legends/CrawGiant.java b/Mage.Sets/src/mage/sets/legends/CrawGiant.java
new file mode 100644
index 00000000000..93af4402d66
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/legends/CrawGiant.java
@@ -0,0 +1,65 @@
+/*
+ * 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.sets.legends;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.keyword.RampageAbility;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class CrawGiant extends CardImpl {
+
+ public CrawGiant(UUID ownerId) {
+ super(ownerId, 94, "Craw Giant", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{G}{G}{G}{G}");
+ this.expansionSetCode = "LEG";
+ this.subtype.add("Giant");
+ this.power = new MageInt(6);
+ this.toughness = new MageInt(4);
+
+ // Trample
+ this.addAbility(TrampleAbility.getInstance());
+ // Rampage 2
+ this.addAbility(new RampageAbility(2));
+ }
+
+ public CrawGiant(final CrawGiant card) {
+ super(card);
+ }
+
+ @Override
+ public CrawGiant copy() {
+ return new CrawGiant(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/legends/FrostGiant.java b/Mage.Sets/src/mage/sets/legends/FrostGiant.java
new file mode 100644
index 00000000000..a4d8b1a1be2
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/legends/FrostGiant.java
@@ -0,0 +1,62 @@
+/*
+ * 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.sets.legends;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.keyword.RampageAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class FrostGiant extends CardImpl {
+
+ public FrostGiant(UUID ownerId) {
+ super(ownerId, 146, "Frost Giant", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{R}{R}{R}");
+ this.expansionSetCode = "LEG";
+ this.subtype.add("Giant");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(4);
+
+ // Rampage 2
+ this.addAbility(new RampageAbility(2));
+ }
+
+ public FrostGiant(final FrostGiant card) {
+ super(card);
+ }
+
+ @Override
+ public FrostGiant copy() {
+ return new FrostGiant(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/legends/HazezonTamar.java b/Mage.Sets/src/mage/sets/legends/HazezonTamar.java
index 21eca703027..19ca690ac55 100644
--- a/Mage.Sets/src/mage/sets/legends/HazezonTamar.java
+++ b/Mage.Sets/src/mage/sets/legends/HazezonTamar.java
@@ -33,7 +33,7 @@ import mage.abilities.Ability;
import mage.abilities.DelayedTriggeredAbility;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.LeavesBattlefieldTriggeredAbility;
-import mage.abilities.common.delayed.AtTheBeginOfNextUpkeepDelayedTriggeredAbility;
+import mage.abilities.common.delayed.AtTheBeginOfYourNextUpkeepDelayedTriggeredAbility;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
@@ -111,7 +111,7 @@ class HazezonTamarEntersEffect extends OneShotEffect {
if (controller != null) {
Effect effect = new CreateTokenEffect(new HazezonTamarSandWarrior(), new PermanentsOnBattlefieldCount(new FilterControlledLandPermanent()));
effect.setText("put X 1/1 Sand Warrior creature tokens that are red, green, and white onto the battlefield, where X is the number of lands you control at that time");
- DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(effect);
+ DelayedTriggeredAbility delayedAbility = new AtTheBeginOfYourNextUpkeepDelayedTriggeredAbility(effect);
delayedAbility.setSourceId(source.getSourceId());
delayedAbility.setControllerId(source.getControllerId());
delayedAbility.setSourceObject(source.getSourceObject(game), game);
diff --git a/Mage.Sets/src/mage/sets/legends/HundingGjornersen.java b/Mage.Sets/src/mage/sets/legends/HundingGjornersen.java
new file mode 100644
index 00000000000..e08fbc96149
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/legends/HundingGjornersen.java
@@ -0,0 +1,64 @@
+/*
+ * 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.sets.legends;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.keyword.RampageAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class HundingGjornersen extends CardImpl {
+
+ public HundingGjornersen(UUID ownerId) {
+ super(ownerId, 271, "Hunding Gjornersen", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{W}{U}{U}");
+ this.expansionSetCode = "LEG";
+ this.supertype.add("Legendary");
+ this.subtype.add("Human");
+ this.subtype.add("Warrior");
+ this.power = new MageInt(5);
+ this.toughness = new MageInt(4);
+
+ // Rampage 1
+ this.addAbility(new RampageAbility(1));
+ }
+
+ public HundingGjornersen(final HundingGjornersen card) {
+ super(card);
+ }
+
+ @Override
+ public HundingGjornersen copy() {
+ return new HundingGjornersen(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/legends/HyperionBlacksmith.java b/Mage.Sets/src/mage/sets/legends/HyperionBlacksmith.java
new file mode 100644
index 00000000000..6eca10aafc0
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/legends/HyperionBlacksmith.java
@@ -0,0 +1,79 @@
+/*
+ * 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.sets.legends;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.effects.common.MayTapOrUntapTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.filter.common.FilterArtifactPermanent;
+import mage.filter.predicate.permanent.ControllerPredicate;
+import mage.target.common.TargetArtifactPermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class HyperionBlacksmith extends CardImpl {
+
+ private static final FilterArtifactPermanent filter = new FilterArtifactPermanent("artifact an opponent controls");
+
+ static {
+ filter.add(new ControllerPredicate(TargetController.OPPONENT));
+ }
+
+ public HyperionBlacksmith(UUID ownerId) {
+ super(ownerId, 150, "Hyperion Blacksmith", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{R}{R}");
+ this.expansionSetCode = "LEG";
+ this.subtype.add("Human");
+ this.subtype.add("Artificer");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // {tap}: You may tap or untap target artifact an opponent controls.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new MayTapOrUntapTargetEffect(), new TapSourceCost());
+ ability.addTarget(new TargetArtifactPermanent(filter));
+ this.addAbility(ability);
+ }
+
+ public HyperionBlacksmith(final HyperionBlacksmith card) {
+ super(card);
+ }
+
+ @Override
+ public HyperionBlacksmith copy() {
+ return new HyperionBlacksmith(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/legends/IvoryGuardians.java b/Mage.Sets/src/mage/sets/legends/IvoryGuardians.java
index 2e3b6a2615a..81e37f4aebb 100644
--- a/Mage.Sets/src/mage/sets/legends/IvoryGuardians.java
+++ b/Mage.Sets/src/mage/sets/legends/IvoryGuardians.java
@@ -54,13 +54,13 @@ import mage.game.Game;
* @author jeffwadsworth
*/
public class IvoryGuardians extends CardImpl {
-
- private static final FilterCard filter = new FilterCard();
-
+
+ private static final FilterCard filter = new FilterCard("red");
+
static {
filter.add(new ColorPredicate(ObjectColor.RED));
}
-
+
private static final String rule = "Creatures named {this} get +1/+1 as long as an opponent controls a nontoken red permanent";
public IvoryGuardians(UUID ownerId) {
@@ -73,10 +73,10 @@ public class IvoryGuardians extends CardImpl {
// Protection from red
this.addAbility(new ProtectionAbility(filter));
-
+
// Creatures named Ivory Guardians get +1/+1 as long as an opponent controls a nontoken red permanent.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ConditionalContinuousEffect(new BoostAllEffect(1, 1, Duration.WhileOnBattlefield), new IvoryGuardiansCondition(), rule)));
-
+
}
public IvoryGuardians(final IvoryGuardians card) {
@@ -103,4 +103,4 @@ class IvoryGuardiansCondition implements Condition {
}
return conditionApplies;
}
-}
\ No newline at end of file
+}
diff --git a/Mage.Sets/src/mage/sets/legends/LadyCaleria.java b/Mage.Sets/src/mage/sets/legends/LadyCaleria.java
new file mode 100644
index 00000000000..0ae9d96bc85
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/legends/LadyCaleria.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.legends;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class LadyCaleria extends mage.sets.masterseditioniii.LadyCaleria {
+
+ public LadyCaleria(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 279;
+ this.expansionSetCode = "LEG";
+ this.rarity = Rarity.RARE;
+ }
+
+ public LadyCaleria(final LadyCaleria card) {
+ super(card);
+ }
+
+ @Override
+ public LadyCaleria copy() {
+ return new LadyCaleria(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/legends/LadyEvangela.java b/Mage.Sets/src/mage/sets/legends/LadyEvangela.java
index c317c54c82b..30743d13b59 100644
--- a/Mage.Sets/src/mage/sets/legends/LadyEvangela.java
+++ b/Mage.Sets/src/mage/sets/legends/LadyEvangela.java
@@ -61,7 +61,6 @@ public class LadyEvangela extends CardImpl {
Effect effect = new PreventDamageByTargetEffect(Duration.EndOfTurn, true);
effect.setText("Prevent all combat damage that would be dealt by target creature this turn.");
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{W}{B}"));
- ability.addEffect(effect);
ability.addCost(new TapSourceCost());
ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability);
diff --git a/Mage.Sets/src/mage/sets/legends/LivonyaSilone.java b/Mage.Sets/src/mage/sets/legends/LivonyaSilone.java
new file mode 100644
index 00000000000..b6fece6b2e9
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/legends/LivonyaSilone.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.legends;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class LivonyaSilone extends mage.sets.masterseditioniii.LivonyaSilone {
+
+ public LivonyaSilone(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 282;
+ this.expansionSetCode = "LEG";
+ this.rarity = Rarity.RARE;
+ }
+
+ public LivonyaSilone(final LivonyaSilone card) {
+ super(card);
+ }
+
+ @Override
+ public LivonyaSilone copy() {
+ return new LivonyaSilone(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/legends/MarhaultElsdragon.java b/Mage.Sets/src/mage/sets/legends/MarhaultElsdragon.java
new file mode 100644
index 00000000000..8cd84f424e1
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/legends/MarhaultElsdragon.java
@@ -0,0 +1,64 @@
+/*
+ * 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.sets.legends;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.keyword.RampageAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class MarhaultElsdragon extends CardImpl {
+
+ public MarhaultElsdragon(UUID ownerId) {
+ super(ownerId, 284, "Marhault Elsdragon", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{R}{R}{G}");
+ this.expansionSetCode = "LEG";
+ this.supertype.add("Legendary");
+ this.subtype.add("Elf");
+ this.subtype.add("Warrior");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(6);
+
+ // Rampage 1
+ this.addAbility(new RampageAbility(1));
+ }
+
+ public MarhaultElsdragon(final MarhaultElsdragon card) {
+ super(card);
+ }
+
+ @Override
+ public MarhaultElsdragon copy() {
+ return new MarhaultElsdragon(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/legends/TorWauki.java b/Mage.Sets/src/mage/sets/legends/TorWauki.java
new file mode 100644
index 00000000000..43ace604e8f
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/legends/TorWauki.java
@@ -0,0 +1,71 @@
+/*
+ * 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.sets.legends;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.target.common.TargetAttackingOrBlockingCreature;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class TorWauki extends CardImpl {
+
+ public TorWauki(UUID ownerId) {
+ super(ownerId, 305, "Tor Wauki", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{B}{B}{R}");
+ this.expansionSetCode = "LEG";
+ this.supertype.add("Legendary");
+ this.subtype.add("Human");
+ this.subtype.add("Archer");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // {T}: Tor Wauki deals 2 damage to target attacking or blocking creature.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(2), new TapSourceCost());
+ ability.addTarget(new TargetAttackingOrBlockingCreature());
+ this.addAbility(ability);
+ }
+
+ public TorWauki(final TorWauki card) {
+ super(card);
+ }
+
+ @Override
+ public TorWauki copy() {
+ return new TorWauki(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/legends/TuknirDeathlock.java b/Mage.Sets/src/mage/sets/legends/TuknirDeathlock.java
new file mode 100644
index 00000000000..15e6d2c4c04
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/legends/TuknirDeathlock.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.legends;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class TuknirDeathlock extends mage.sets.masterseditioniii.TuknirDeathlock {
+
+ public TuknirDeathlock(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 307;
+ this.expansionSetCode = "LEG";
+ this.rarity = Rarity.RARE;
+ }
+
+ public TuknirDeathlock(final TuknirDeathlock card) {
+ super(card);
+ }
+
+ @Override
+ public TuknirDeathlock copy() {
+ return new TuknirDeathlock(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/legends/WolverinePack.java b/Mage.Sets/src/mage/sets/legends/WolverinePack.java
new file mode 100644
index 00000000000..843ba42bbba
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/legends/WolverinePack.java
@@ -0,0 +1,62 @@
+/*
+ * 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.sets.legends;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.keyword.RampageAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class WolverinePack extends CardImpl {
+
+ public WolverinePack(UUID ownerId) {
+ super(ownerId, 128, "Wolverine Pack", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{G}{G}");
+ this.expansionSetCode = "LEG";
+ this.subtype.add("Wolverine");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(4);
+
+ // Rampage 2
+ this.addAbility(new RampageAbility(2));
+ }
+
+ public WolverinePack(final WolverinePack card) {
+ super(card);
+ }
+
+ @Override
+ public WolverinePack copy() {
+ return new WolverinePack(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/limitedalpha/Conversion.java b/Mage.Sets/src/mage/sets/limitedalpha/Conversion.java
new file mode 100644
index 00000000000..fcb7c843371
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/limitedalpha/Conversion.java
@@ -0,0 +1,148 @@
+/*
+ * 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.sets.limitedalpha;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.ContinuousEffect;
+import mage.abilities.effects.ContinuousEffectImpl;
+import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect;
+import mage.abilities.mana.WhiteManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Layer;
+import static mage.constants.Layer.AbilityAddingRemovingEffects_6;
+import static mage.constants.Layer.TypeChangingEffects_4;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.SubLayer;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.filter.common.FilterLandPermanent;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.sets.futuresight.MagusOfTheMoon;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class Conversion extends CardImpl {
+
+ private static final FilterLandPermanent filter = new FilterLandPermanent("Mountain", "Mountains");
+
+ public Conversion(UUID ownerId) {
+ super(ownerId, 199, "Conversion", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{W}{W}");
+ this.expansionSetCode = "LEA";
+
+ // At the beginning of your upkeep, sacrifice Conversion unless you pay {W}{W}.
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(new SacrificeSourceUnlessPaysEffect(new ManaCostsImpl("{W}{W}")), TargetController.YOU, false));
+
+ // All Mountains are Plains.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new ConversionEffect()));
+
+ }
+
+ public Conversion(final Conversion card) {
+ super(card);
+ }
+
+ @Override
+ public Conversion copy() {
+ return new Conversion(this);
+ }
+
+ class ConversionEffect extends ContinuousEffectImpl {
+
+ ConversionEffect() {
+ super(Duration.WhileOnBattlefield, Outcome.Detriment);
+ this.staticText = "All Mountains are Plains";
+ }
+
+ ConversionEffect(final ConversionEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ return false;
+ }
+
+ @Override
+ public ConversionEffect copy() {
+ return new ConversionEffect(this);
+ }
+
+ @Override
+ public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) {
+ for (Permanent land : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), game)) {
+ switch (layer) {
+ case AbilityAddingRemovingEffects_6:
+ land.removeAllAbilities(source.getSourceId(), game);
+ land.addAbility(new WhiteManaAbility(), source.getSourceId(), game);
+ break;
+ case TypeChangingEffects_4:
+ land.getSubtype().clear();
+ land.getSubtype().add("Plains");
+ break;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public boolean hasLayer(Layer layer) {
+ return layer == Layer.AbilityAddingRemovingEffects_6 || layer == Layer.TypeChangingEffects_4;
+ }
+
+ @Override
+ public Set isDependentTo(List allEffectsInLayer) {
+ // the dependent classes needs to be an enclosed class for dependent check of continuous effects
+ Set dependentTo = null;
+ for (ContinuousEffect effect : allEffectsInLayer) {
+ // http://www.mtgsalvation.com/forums/magic-fundamentals/magic-rulings/magic-rulings-archives/286046-conversion-magus-of-the-moon
+ if (MagusOfTheMoon.class.equals(effect.getClass().getEnclosingClass())) {
+ if (dependentTo == null) {
+ dependentTo = new HashSet<>();
+ }
+ dependentTo.add(effect.getId());
+ }
+ }
+ return dependentTo;
+ }
+
+ }
+
+}
diff --git a/Mage.Sets/src/mage/sets/limitedalpha/CopyArtifact.java b/Mage.Sets/src/mage/sets/limitedalpha/CopyArtifact.java
index 2018a4e7f69..ec4ca9b5e08 100644
--- a/Mage.Sets/src/mage/sets/limitedalpha/CopyArtifact.java
+++ b/Mage.Sets/src/mage/sets/limitedalpha/CopyArtifact.java
@@ -28,7 +28,7 @@
package mage.sets.limitedalpha;
import java.util.UUID;
-
+import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.EntersBattlefieldEffect;
@@ -50,7 +50,7 @@ import mage.util.functions.ApplyToPermanent;
/**
*
* @author KholdFuzion
-
+ *
*/
public class CopyArtifact extends CardImpl {
@@ -58,7 +58,6 @@ public class CopyArtifact extends CardImpl {
super(ownerId, 54, "Copy Artifact", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}");
this.expansionSetCode = "LEA";
-
// You may have Copy Artifact enter the battlefield as a copy of any artifact on the battlefield, except it's an enchantment in addition to its other types.
Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new EntersBattlefieldEffect(
new CopyArtifactEffect(),
@@ -79,6 +78,25 @@ public class CopyArtifact extends CardImpl {
class CopyArtifactEffect extends OneShotEffect {
+ ApplyToPermanent applier = new ApplyToPermanent() {
+ @Override
+ public Boolean apply(Game game, Permanent permanent) {
+ if (!permanent.getCardType().contains(CardType.ENCHANTMENT)) {
+ permanent.getCardType().add(CardType.ENCHANTMENT);
+ }
+ return true;
+ }
+
+ @Override
+ public Boolean apply(Game game, MageObject mageObject) {
+ if (!mageObject.getCardType().contains(CardType.ENCHANTMENT)) {
+ mageObject.getCardType().add(CardType.ENCHANTMENT);
+ }
+ return true;
+ }
+
+ };
+
private static final FilterPermanent filter = new FilterPermanent("artifact");
static {
@@ -104,16 +122,7 @@ class CopyArtifactEffect extends OneShotEffect {
player.choose(Outcome.Copy, target, source.getSourceId(), game);
Permanent copyFromPermanent = game.getPermanent(target.getFirstTarget());
if (copyFromPermanent != null) {
- game.copyPermanent(copyFromPermanent, sourcePermanent, source, new ApplyToPermanent() {
- @Override
- public Boolean apply(Game game, Permanent permanent) {
- if (!permanent.getCardType().contains(CardType.ENCHANTMENT)) {
- permanent.getCardType().add(CardType.ENCHANTMENT);
- }
- return true;
- }
- });
-
+ game.copyPermanent(copyFromPermanent, sourcePermanent, source, applier);
return true;
}
}
diff --git a/Mage.Sets/src/mage/sets/limitedalpha/CursedLand.java b/Mage.Sets/src/mage/sets/limitedalpha/CursedLand.java
new file mode 100644
index 00000000000..d6e94cef77c
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/limitedalpha/CursedLand.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.limitedalpha;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class CursedLand extends mage.sets.fourthedition.CursedLand {
+
+ public CursedLand(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 6;
+ this.expansionSetCode = "LEA";
+ }
+
+ public CursedLand(final CursedLand card) {
+ super(card);
+ }
+
+ @Override
+ public CursedLand copy() {
+ return new CursedLand(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/limitedalpha/Feedback.java b/Mage.Sets/src/mage/sets/limitedalpha/Feedback.java
new file mode 100644
index 00000000000..083eb5edfaa
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/limitedalpha/Feedback.java
@@ -0,0 +1,76 @@
+/*
+ * 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.sets.limitedalpha;
+
+import java.util.UUID;
+import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.AttachEffect;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.keyword.EnchantAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.target.TargetPermanent;
+import mage.target.common.TargetEnchantmentPermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Feedback extends CardImpl {
+
+ public Feedback(UUID ownerId) {
+ super(ownerId, 58, "Feedback", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{U}");
+ this.expansionSetCode = "LEA";
+ this.subtype.add("Aura");
+
+ // Enchant enchantment
+ TargetPermanent auraTarget = new TargetEnchantmentPermanent();
+ this.getSpellAbility().addTarget(auraTarget);
+ this.getSpellAbility().addEffect(new AttachEffect(Outcome.Detriment));
+ this.addAbility(new EnchantAbility(auraTarget.getTargetName()));
+ // At the beginning of the upkeep of enchanted enchantment's controller, Feedback deals 1 damage to that player.
+ Effect effect = new DamageTargetEffect(1);
+ effect.setText("{this} deals 1 damage to that player");
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, effect,
+ TargetController.CONTROLLER_ATTACHED_TO, false, true));
+ }
+
+ public Feedback(final Feedback card) {
+ super(card);
+ }
+
+ @Override
+ public Feedback copy() {
+ return new Feedback(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/limitedalpha/GraniteGargoyle.java b/Mage.Sets/src/mage/sets/limitedalpha/GraniteGargoyle.java
new file mode 100644
index 00000000000..44e51b615b4
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/limitedalpha/GraniteGargoyle.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.limitedalpha;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class GraniteGargoyle extends mage.sets.revisededition.GraniteGargoyle {
+
+ public GraniteGargoyle(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 156;
+ this.expansionSetCode = "LEA";
+ }
+
+ public GraniteGargoyle(final GraniteGargoyle card) {
+ super(card);
+ }
+
+ @Override
+ public GraniteGargoyle copy() {
+ return new GraniteGargoyle(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/limitedalpha/LivingArtifact.java b/Mage.Sets/src/mage/sets/limitedalpha/LivingArtifact.java
new file mode 100644
index 00000000000..12961075cd6
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/limitedalpha/LivingArtifact.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.limitedalpha;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class LivingArtifact extends mage.sets.fifthedition.LivingArtifact {
+
+ public LivingArtifact(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 117;
+ this.expansionSetCode = "LEA";
+ }
+
+ public LivingArtifact(final LivingArtifact card) {
+ super(card);
+ }
+
+ @Override
+ public LivingArtifact copy() {
+ return new LivingArtifact(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/limitedalpha/Sacrifice.java b/Mage.Sets/src/mage/sets/limitedalpha/Sacrifice.java
new file mode 100644
index 00000000000..678d76f7bc0
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/limitedalpha/Sacrifice.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.limitedalpha;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Sacrifice extends mage.sets.unlimitededition.Sacrifice {
+
+ public Sacrifice(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 33;
+ this.expansionSetCode = "LEA";
+ }
+
+ public Sacrifice(final Sacrifice card) {
+ super(card);
+ }
+
+ @Override
+ public Sacrifice copy() {
+ return new Sacrifice(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/limitedalpha/TwoHeadedGiantOfForiys.java b/Mage.Sets/src/mage/sets/limitedalpha/TwoHeadedGiantOfForiys.java
new file mode 100644
index 00000000000..827c9c8a62d
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/limitedalpha/TwoHeadedGiantOfForiys.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.limitedalpha;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class TwoHeadedGiantOfForiys extends mage.sets.masterseditioniv.TwoHeadedGiantOfForiys {
+
+ public TwoHeadedGiantOfForiys(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 180;
+ this.expansionSetCode = "LEA";
+ this.rarity = Rarity.RARE;
+ }
+
+ public TwoHeadedGiantOfForiys(final TwoHeadedGiantOfForiys card) {
+ super(card);
+ }
+
+ @Override
+ public TwoHeadedGiantOfForiys copy() {
+ return new TwoHeadedGiantOfForiys(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/limitedalpha/VesuvanDoppelganger.java b/Mage.Sets/src/mage/sets/limitedalpha/VesuvanDoppelganger.java
new file mode 100644
index 00000000000..af28ac5b006
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/limitedalpha/VesuvanDoppelganger.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.limitedalpha;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class VesuvanDoppelganger extends mage.sets.unlimitededition.VesuvanDoppelganger {
+
+ public VesuvanDoppelganger(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 88;
+ this.expansionSetCode = "LEA";
+ }
+
+ public VesuvanDoppelganger(final VesuvanDoppelganger card) {
+ super(card);
+ }
+
+ @Override
+ public VesuvanDoppelganger copy() {
+ return new VesuvanDoppelganger(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/limitedalpha/Wanderlust.java b/Mage.Sets/src/mage/sets/limitedalpha/Wanderlust.java
new file mode 100644
index 00000000000..0945cecfaa0
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/limitedalpha/Wanderlust.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.limitedalpha;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Wanderlust extends mage.sets.unlimitededition.Wanderlust {
+
+ public Wanderlust(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 135;
+ this.expansionSetCode = "LEA";
+ }
+
+ public Wanderlust(final Wanderlust card) {
+ super(card);
+ }
+
+ @Override
+ public Wanderlust copy() {
+ return new Wanderlust(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/limitedalpha/WarpArtifact.java b/Mage.Sets/src/mage/sets/limitedalpha/WarpArtifact.java
new file mode 100644
index 00000000000..758a2d582b9
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/limitedalpha/WarpArtifact.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.limitedalpha;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class WarpArtifact extends mage.sets.fifthedition.WarpArtifact {
+
+ public WarpArtifact(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 42;
+ this.expansionSetCode = "LEA";
+ }
+
+ public WarpArtifact(final WarpArtifact card) {
+ super(card);
+ }
+
+ @Override
+ public WarpArtifact copy() {
+ return new WarpArtifact(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/limitedbeta/Conversion.java b/Mage.Sets/src/mage/sets/limitedbeta/Conversion.java
new file mode 100644
index 00000000000..ea00db87fc2
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/limitedbeta/Conversion.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.limitedbeta;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class Conversion extends mage.sets.limitedalpha.Conversion {
+
+ public Conversion(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 201;
+ this.expansionSetCode = "LEB";
+ }
+
+ public Conversion(final Conversion card) {
+ super(card);
+ }
+
+ @Override
+ public Conversion copy() {
+ return new Conversion(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/limitedbeta/CursedLand.java b/Mage.Sets/src/mage/sets/limitedbeta/CursedLand.java
new file mode 100644
index 00000000000..69f25a35977
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/limitedbeta/CursedLand.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.limitedbeta;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class CursedLand extends mage.sets.fourthedition.CursedLand {
+
+ public CursedLand(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 6;
+ this.expansionSetCode = "LEB";
+ }
+
+ public CursedLand(final CursedLand card) {
+ super(card);
+ }
+
+ @Override
+ public CursedLand copy() {
+ return new CursedLand(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/limitedbeta/Feedback.java b/Mage.Sets/src/mage/sets/limitedbeta/Feedback.java
new file mode 100644
index 00000000000..61edab0c87a
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/limitedbeta/Feedback.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.limitedbeta;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Feedback extends mage.sets.limitedalpha.Feedback {
+
+ public Feedback(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 58;
+ this.expansionSetCode = "LEB";
+ }
+
+ public Feedback(final Feedback card) {
+ super(card);
+ }
+
+ @Override
+ public Feedback copy() {
+ return new Feedback(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/limitedbeta/GraniteGargoyle.java b/Mage.Sets/src/mage/sets/limitedbeta/GraniteGargoyle.java
new file mode 100644
index 00000000000..821fa3fb5cd
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/limitedbeta/GraniteGargoyle.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.limitedbeta;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class GraniteGargoyle extends mage.sets.revisededition.GraniteGargoyle {
+
+ public GraniteGargoyle(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 157;
+ this.expansionSetCode = "LEB";
+ }
+
+ public GraniteGargoyle(final GraniteGargoyle card) {
+ super(card);
+ }
+
+ @Override
+ public GraniteGargoyle copy() {
+ return new GraniteGargoyle(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/limitedbeta/LivingArtifact.java b/Mage.Sets/src/mage/sets/limitedbeta/LivingArtifact.java
new file mode 100644
index 00000000000..df82b676745
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/limitedbeta/LivingArtifact.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.limitedbeta;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class LivingArtifact extends mage.sets.fifthedition.LivingArtifact {
+
+ public LivingArtifact(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 117;
+ this.expansionSetCode = "LEB";
+ }
+
+ public LivingArtifact(final LivingArtifact card) {
+ super(card);
+ }
+
+ @Override
+ public LivingArtifact copy() {
+ return new LivingArtifact(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/limitedbeta/Sacrifice.java b/Mage.Sets/src/mage/sets/limitedbeta/Sacrifice.java
new file mode 100644
index 00000000000..e218a2307dc
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/limitedbeta/Sacrifice.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.limitedbeta;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Sacrifice extends mage.sets.unlimitededition.Sacrifice {
+
+ public Sacrifice(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 33;
+ this.expansionSetCode = "LEB";
+ }
+
+ public Sacrifice(final Sacrifice card) {
+ super(card);
+ }
+
+ @Override
+ public Sacrifice copy() {
+ return new Sacrifice(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/limitedbeta/TwoHeadedGiantOfForiys.java b/Mage.Sets/src/mage/sets/limitedbeta/TwoHeadedGiantOfForiys.java
new file mode 100644
index 00000000000..721a37aa934
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/limitedbeta/TwoHeadedGiantOfForiys.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.limitedbeta;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class TwoHeadedGiantOfForiys extends mage.sets.masterseditioniv.TwoHeadedGiantOfForiys {
+
+ public TwoHeadedGiantOfForiys(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 181;
+ this.expansionSetCode = "LEB";
+ this.rarity = Rarity.RARE;
+ }
+
+ public TwoHeadedGiantOfForiys(final TwoHeadedGiantOfForiys card) {
+ super(card);
+ }
+
+ @Override
+ public TwoHeadedGiantOfForiys copy() {
+ return new TwoHeadedGiantOfForiys(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/limitedbeta/VesuvanDoppelganger.java b/Mage.Sets/src/mage/sets/limitedbeta/VesuvanDoppelganger.java
new file mode 100644
index 00000000000..774d3949b69
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/limitedbeta/VesuvanDoppelganger.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.limitedbeta;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class VesuvanDoppelganger extends mage.sets.unlimitededition.VesuvanDoppelganger {
+
+ public VesuvanDoppelganger(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 88;
+ this.expansionSetCode = "LEB";
+ }
+
+ public VesuvanDoppelganger(final VesuvanDoppelganger card) {
+ super(card);
+ }
+
+ @Override
+ public VesuvanDoppelganger copy() {
+ return new VesuvanDoppelganger(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/limitedbeta/Wanderlust.java b/Mage.Sets/src/mage/sets/limitedbeta/Wanderlust.java
new file mode 100644
index 00000000000..037a3591fcb
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/limitedbeta/Wanderlust.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.limitedbeta;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Wanderlust extends mage.sets.unlimitededition.Wanderlust {
+
+ public Wanderlust(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 135;
+ this.expansionSetCode = "LEB";
+ }
+
+ public Wanderlust(final Wanderlust card) {
+ super(card);
+ }
+
+ @Override
+ public Wanderlust copy() {
+ return new Wanderlust(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/limitedbeta/WarpArtifact.java b/Mage.Sets/src/mage/sets/limitedbeta/WarpArtifact.java
new file mode 100644
index 00000000000..50673ecf58e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/limitedbeta/WarpArtifact.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.limitedbeta;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class WarpArtifact extends mage.sets.fifthedition.WarpArtifact {
+
+ public WarpArtifact(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 42;
+ this.expansionSetCode = "LEB";
+ }
+
+ public WarpArtifact(final WarpArtifact card) {
+ super(card);
+ }
+
+ @Override
+ public WarpArtifact copy() {
+ return new WarpArtifact(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/magic2010/MasterOfTheWildHunt.java b/Mage.Sets/src/mage/sets/magic2010/MasterOfTheWildHunt.java
index 3d0c31b8d20..1e626c76a5d 100644
--- a/Mage.Sets/src/mage/sets/magic2010/MasterOfTheWildHunt.java
+++ b/Mage.Sets/src/mage/sets/magic2010/MasterOfTheWildHunt.java
@@ -1,37 +1,35 @@
/*
-* 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.
-*/
-
+ * 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.sets.magic2010;
-import mage.constants.CardType;
-import mage.constants.Outcome;
-import mage.constants.Rarity;
-import mage.constants.Zone;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.OnEventTriggeredAbility;
@@ -40,6 +38,10 @@ import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.SubtypePredicate;
@@ -51,10 +53,6 @@ import mage.game.permanent.token.WolfToken;
import mage.players.Player;
import mage.target.common.TargetCreaturePermanent;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
-
/**
*
* @author BetaSteward_at_googlemail.com
@@ -72,7 +70,10 @@ public class MasterOfTheWildHunt extends CardImpl {
this.power = new MageInt(3);
this.toughness = new MageInt(3);
+ // At the beginning of your upkeep, put a 2/2 green Wolf creature token onto the battlefield.
this.addAbility(new OnEventTriggeredAbility(EventType.UPKEEP_STEP_PRE, "beginning of your upkeep", new CreateTokenEffect(wolfToken)));
+
+ // {T}: Tap all untapped Wolf creatures you control. Each Wolf tapped this way deals damage equal to its power to target creature. That creature deals damage equal to its power divided as its controller chooses among any number of those Wolves.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new MasterOfTheWildHuntEffect(), new TapSourceCost());
ability.addTarget(new TargetCreaturePermanent());
this.addAbility(ability);
@@ -116,7 +117,7 @@ class MasterOfTheWildHuntEffect extends OneShotEffect {
List wolves = new ArrayList<>();
Permanent target = game.getPermanent(source.getFirstTarget());
if (target != null && game.getBattlefield().countAll(filter, source.getControllerId(), game) > 0) {
- for (Permanent permanent: game.getBattlefield().getAllActivePermanents(filter, source.getControllerId(), game)) {
+ for (Permanent permanent : game.getBattlefield().getAllActivePermanents(filter, source.getControllerId(), game)) {
permanent.tap(game);
target.damage(permanent.getToughness().getValue(), permanent.getId(), game, false, true);
wolves.add(permanent.getId());
@@ -128,4 +129,4 @@ class MasterOfTheWildHuntEffect extends OneShotEffect {
return false;
}
-}
\ No newline at end of file
+}
diff --git a/Mage.Sets/src/mage/sets/magic2010/ProteanHydra.java b/Mage.Sets/src/mage/sets/magic2010/ProteanHydra.java
index 29285cf79c8..e84b732672a 100644
--- a/Mage.Sets/src/mage/sets/magic2010/ProteanHydra.java
+++ b/Mage.Sets/src/mage/sets/magic2010/ProteanHydra.java
@@ -102,10 +102,11 @@ public class ProteanHydra extends CardImpl {
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null) {
- Object obj = getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
- if (obj != null && obj instanceof SpellAbility
- && permanent.getZoneChangeCounter(game) - 1 == ((SpellAbility) obj).getSourceObjectZoneChangeCounter()) {
- int amount = ((SpellAbility) obj).getManaCostsToPay().getX();
+ SpellAbility spellAbility = (SpellAbility) getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
+ if (spellAbility != null
+ && spellAbility.getSourceId().equals(source.getSourceId())
+ && permanent.getZoneChangeCounter(game) - 1 == spellAbility.getSourceObjectZoneChangeCounter()) {
+ int amount = spellAbility.getManaCostsToPay().getX();
if (amount > 0) {
permanent.addCounters(CounterType.P1P1.createInstance(amount), game);
}
diff --git a/Mage.Sets/src/mage/sets/magic2010/WarpWorld.java b/Mage.Sets/src/mage/sets/magic2010/WarpWorld.java
index ef4217d5967..3fac6066e28 100644
--- a/Mage.Sets/src/mage/sets/magic2010/WarpWorld.java
+++ b/Mage.Sets/src/mage/sets/magic2010/WarpWorld.java
@@ -27,25 +27,25 @@
*/
package mage.sets.magic2010;
-import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
-import java.util.List;
+import java.util.LinkedHashSet;
import java.util.Map;
+import java.util.Set;
import java.util.UUID;
-import mage.constants.CardType;
-import mage.constants.Outcome;
-import mage.constants.Rarity;
-import mage.constants.Zone;
+import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.CardsImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
-import mage.players.PlayerList;
/**
*
@@ -57,7 +57,6 @@ public class WarpWorld extends CardImpl {
super(ownerId, 163, "Warp World", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{5}{R}{R}{R}");
this.expansionSetCode = "M10";
-
// Each player shuffles all permanents he or she owns into his or her library, then reveals that many cards from the top of his or her library. Each player puts all artifact, creature, and land cards revealed this way onto the battlefield, then does the same for enchantment cards, then puts all cards revealed this way that weren't put onto the battlefield on the bottom of his or her library.
this.getSpellAbility().addEffect(new WarpWorldEffect());
}
@@ -90,105 +89,99 @@ class WarpWorldEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- Map> permanentsOwned = new HashMap<>();
-
+ MageObject sourceObject = source.getSourceObject(game);
+ if (sourceObject == null) {
+ return false;
+ }
+ Map> permanentsOwned = new HashMap<>();
Collection permanents = game.getBattlefield().getAllPermanents();
for (Permanent permanent : permanents) {
- List list = permanentsOwned.get(permanent.getOwnerId());
- if (list == null) {
- list = new ArrayList<>();
+ Set set = permanentsOwned.get(permanent.getOwnerId());
+ if (set == null) {
+ set = new LinkedHashSet<>();
}
- list.add(permanent);
- permanentsOwned.put(permanent.getOwnerId(), list);
+ set.add(permanent);
+ permanentsOwned.put(permanent.getOwnerId(), set);
}
// shuffle permanents into owner's library
Map permanentsCount = new HashMap<>();
- PlayerList playerList = game.getPlayerList();
- playerList.setCurrent(game.getActivePlayerId());
- Player player = game.getPlayer(game.getActivePlayerId());
- do {
- List list = permanentsOwned.remove(player.getId());
- Integer count = 0;
- if (list != null) {
- count = list.size();
- for (Permanent permanent : list) {
- permanent.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true);
+ for (UUID playerId : game.getState().getPlayersInRange(source.getControllerId(), game)) {
+ Player player = game.getPlayer(playerId);
+ if (player != null) {
+ Set set = permanentsOwned.remove(playerId);
+ Integer count = 0;
+ if (set != null) {
+ count = set.size();
+ player.moveCards(set, Zone.BATTLEFIELD, Zone.LIBRARY, source, game);
}
+
+ if (count > 0) {
+ player.shuffleLibrary(game);
+ }
+ permanentsCount.put(playerId, count);
}
+ }
- if (count > 0) {
- player.shuffleLibrary(game);
- }
-
- permanentsCount.put(player.getId(), count);
- player = playerList.getNext(game);
- } while (!player.getId().equals(game.getActivePlayerId()));
-
+ game.applyEffects(); // so effects from creatures that were on the battlefield won't trigger from draw or later put into play
Map cardsRevealed = new HashMap<>();
// draw cards and reveal them
- playerList.setCurrent(game.getActivePlayerId());
- player = game.getPlayer(game.getActivePlayerId());
- do {
- Integer count = Math.min(permanentsCount.get(player.getId()), player.getLibrary().size());
- CardsImpl cards = new CardsImpl();
- for (int i = 0; i < count; i++) {
- Card card = player.getLibrary().removeFromTop(game);
- if (card != null) {
- cards.add(card);
+ for (UUID playerId : game.getState().getPlayersInRange(source.getControllerId(), game)) {
+ Player player = game.getPlayer(playerId);
+ if (player != null) {
+ Integer count = Math.min(permanentsCount.get(player.getId()), player.getLibrary().size());
+ CardsImpl cards = new CardsImpl();
+ for (int i = 0; i < count; i++) {
+ Card card = player.getLibrary().removeFromTop(game);
+ if (card != null) {
+ cards.add(card);
+ }
}
+ player.revealCards(sourceObject.getIdName() + " (" + player.getName() + ")", cards, game);
+ cardsRevealed.put(player.getId(), cards);
}
- player.revealCards("Warp World " + player.getName(), cards, game);
-
- cardsRevealed.put(player.getId(), cards);
-
- player = playerList.getNext(game);
- } while (!player.getId().equals(game.getActivePlayerId()));
-
+ }
// put artifacts, creaturs and lands onto the battlefield
- playerList.setCurrent(game.getActivePlayerId());
- player = game.getPlayer(game.getActivePlayerId());
- do {
- CardsImpl cards = cardsRevealed.get(player.getId());
- for (Card card : cards.getCards(game)) {
- if (card != null && (card.getCardType().contains(CardType.ARTIFACT)
- || card.getCardType().contains(CardType.CREATURE)
- || card.getCardType().contains(CardType.LAND))) {
- card.putOntoBattlefield(game, Zone.HAND, source.getSourceId(), player.getId());
- cards.remove(card);
+ for (UUID playerId : game.getState().getPlayersInRange(source.getControllerId(), game)) {
+ Player player = game.getPlayer(playerId);
+ if (player != null) {
+ CardsImpl cards = cardsRevealed.get(player.getId());
+ for (Card card : cards.getCards(game)) {
+ if (card != null && (card.getCardType().contains(CardType.ARTIFACT)
+ || card.getCardType().contains(CardType.CREATURE)
+ || card.getCardType().contains(CardType.LAND))) {
+ card.putOntoBattlefield(game, Zone.HAND, source.getSourceId(), player.getId());
+ cards.remove(card);
+ }
}
+
}
-
- player = playerList.getNext(game);
- } while (!player.getId().equals(game.getActivePlayerId()));
-
+ }
// put enchantments onto the battlefield
- playerList.setCurrent(game.getActivePlayerId());
- player = game.getPlayer(game.getActivePlayerId());
- do {
- CardsImpl cards = cardsRevealed.get(player.getId());
- for (Card card : cards.getCards(game)) {
- if (card != null && card.getCardType().contains(CardType.ENCHANTMENT)) {
- card.putOntoBattlefield(game, Zone.HAND, source.getSourceId(), player.getId());
- cards.remove(card);
+ for (UUID playerId : game.getState().getPlayersInRange(source.getControllerId(), game)) {
+ Player player = game.getPlayer(playerId);
+ if (player != null) {
+ CardsImpl cards = cardsRevealed.get(player.getId());
+ for (Card card : cards.getCards(game)) {
+ if (card != null && card.getCardType().contains(CardType.ENCHANTMENT)) {
+ card.putOntoBattlefield(game, Zone.HAND, source.getSourceId(), player.getId());
+ cards.remove(card);
+ }
}
+
}
-
- player = playerList.getNext(game);
- } while (!player.getId().equals(game.getActivePlayerId()));
-
+ }
// put the rest of the cards on buttom of the library
- playerList.setCurrent(game.getActivePlayerId());
- player = game.getPlayer(game.getActivePlayerId());
- do {
- CardsImpl cards = cardsRevealed.get(player.getId());
- player.putCardsOnBottomOfLibrary(cards, game, source, false);
- player = playerList.getNext(game);
- } while (!player.getId().equals(game.getActivePlayerId()));
-
+ for (UUID playerId : game.getState().getPlayersInRange(source.getControllerId(), game)) {
+ Player player = game.getPlayer(playerId);
+ if (player != null) {
+ CardsImpl cards = cardsRevealed.get(player.getId());
+ player.putCardsOnBottomOfLibrary(cards, game, source, false);
+ }
+ }
return true;
}
}
diff --git a/Mage.Sets/src/mage/sets/magic2012/PhantasmalImage.java b/Mage.Sets/src/mage/sets/magic2012/PhantasmalImage.java
index 3fef0ff88fb..54d717c7b30 100644
--- a/Mage.Sets/src/mage/sets/magic2012/PhantasmalImage.java
+++ b/Mage.Sets/src/mage/sets/magic2012/PhantasmalImage.java
@@ -29,6 +29,7 @@ package mage.sets.magic2012;
import java.util.UUID;
import mage.MageInt;
+import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.common.BecomesTargetTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
@@ -115,6 +116,18 @@ class PhantasmalImageCopyEffect extends OneShotEffect {
//permanent.addAbility(new BecomesTargetTriggeredAbility(new SacrificeSourceEffect()), game);
return true;
}
+
+ @Override
+ public Boolean apply(Game game, MageObject mageObject) {
+ if (!mageObject.getSubtype().contains("Illusion")) {
+ mageObject.getSubtype().add("Illusion");
+ }
+ // Add directly because the created permanent is only used to copy from, so there is no need to add the ability to e.g. TriggeredAbilities
+ mageObject.getAbilities().add(new BecomesTargetTriggeredAbility(new SacrificeSourceEffect()));
+ //permanent.addAbility(new BecomesTargetTriggeredAbility(new SacrificeSourceEffect()), game);
+ return true;
+ }
+
});
return true;
diff --git a/Mage.Sets/src/mage/sets/magic2012/PrimordialHydra.java b/Mage.Sets/src/mage/sets/magic2012/PrimordialHydra.java
index 420d7def57d..76a4fe38a78 100644
--- a/Mage.Sets/src/mage/sets/magic2012/PrimordialHydra.java
+++ b/Mage.Sets/src/mage/sets/magic2012/PrimordialHydra.java
@@ -98,10 +98,11 @@ class PrimordialHydraEntersEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null) {
- Object obj = getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
- if (obj != null && obj instanceof SpellAbility
- && permanent.getZoneChangeCounter(game) - 1 == ((SpellAbility) obj).getSourceObjectZoneChangeCounter()) {
- int amount = ((SpellAbility) obj).getManaCostsToPay().getX();
+ SpellAbility spellAbility = (SpellAbility) getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
+ if (spellAbility != null
+ && spellAbility.getSourceId().equals(source.getSourceId())
+ && permanent.getZoneChangeCounter(game) - 1 == spellAbility.getSourceObjectZoneChangeCounter()) {
+ int amount = spellAbility.getManaCostsToPay().getX();
if (amount > 0) {
permanent.addCounters(CounterType.P1P1.createInstance(amount), game);
}
diff --git a/Mage.Sets/src/mage/sets/magic2012/SwiftfootBoots.java b/Mage.Sets/src/mage/sets/magic2012/SwiftfootBoots.java
index c328b1ed5a4..ba46bfa6aec 100644
--- a/Mage.Sets/src/mage/sets/magic2012/SwiftfootBoots.java
+++ b/Mage.Sets/src/mage/sets/magic2012/SwiftfootBoots.java
@@ -58,6 +58,7 @@ public class SwiftfootBoots extends CardImpl {
Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(HexproofAbility.getInstance(), AttachmentType.EQUIPMENT));
Effect effect = new GainAbilityAttachedEffect(HasteAbility.getInstance(), AttachmentType.EQUIPMENT);
effect.setText("and haste");
+ ability.addEffect(effect);
this.addAbility(ability);
// Equip {1}
diff --git a/Mage.Sets/src/mage/sets/magic2013/NefaroxOverlordOfGrixis.java b/Mage.Sets/src/mage/sets/magic2013/NefaroxOverlordOfGrixis.java
index a6f7b79e94e..ef64887d860 100644
--- a/Mage.Sets/src/mage/sets/magic2013/NefaroxOverlordOfGrixis.java
+++ b/Mage.Sets/src/mage/sets/magic2013/NefaroxOverlordOfGrixis.java
@@ -29,7 +29,7 @@ package mage.sets.magic2013;
import java.util.UUID;
import mage.MageInt;
-import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.common.AttacksAloneTriggeredAbility;
import mage.abilities.effects.common.SacrificeEffect;
import mage.abilities.keyword.ExaltedAbility;
import mage.abilities.keyword.FlyingAbility;
@@ -37,12 +37,7 @@ import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.constants.Zone;
-import mage.filter.common.FilterControlledPermanent;
-import mage.filter.predicate.mageobject.CardTypePredicate;
-import mage.game.Game;
-import mage.game.events.GameEvent;
-import mage.game.events.GameEvent.EventType;
-import mage.target.targetpointer.FixedTarget;
+import mage.filter.common.FilterControlledCreaturePermanent;
/**
*
@@ -64,7 +59,8 @@ public class NefaroxOverlordOfGrixis extends CardImpl {
// Exalted
this.addAbility(new ExaltedAbility());
// Whenever Nefarox, Overlord of Grixis attacks alone, defending player sacrifices a creature.
- this.addAbility(new NefaroxOverlordOfGrixisTriggeredAbility());
+ this.addAbility(new AttacksAloneTriggeredAbility(new SacrificeEffect(
+ new FilterControlledCreaturePermanent("a creature"), 1, "defending player")));
}
public NefaroxOverlordOfGrixis(final NefaroxOverlordOfGrixis card) {
@@ -76,52 +72,3 @@ public class NefaroxOverlordOfGrixis extends CardImpl {
return new NefaroxOverlordOfGrixis(this);
}
}
-
-class NefaroxOverlordOfGrixisTriggeredAbility extends TriggeredAbilityImpl {
-
- private static final FilterControlledPermanent filter;
-
- static {
- filter = new FilterControlledPermanent(" a creature");
- filter.add(new CardTypePredicate(CardType.CREATURE));
- }
-
- public NefaroxOverlordOfGrixisTriggeredAbility() {
- super(Zone.BATTLEFIELD, new SacrificeEffect(filter, 1, "defending player"));
- }
-
- public NefaroxOverlordOfGrixisTriggeredAbility(final NefaroxOverlordOfGrixisTriggeredAbility ability) {
- super(ability);
- }
-
- @Override
- public NefaroxOverlordOfGrixisTriggeredAbility copy() {
- return new NefaroxOverlordOfGrixisTriggeredAbility(this);
- }
-
- @Override
- public boolean checkEventType(GameEvent event, Game game) {
- return event.getType() == EventType.DECLARED_ATTACKERS;
- }
-
- @Override
- public boolean checkTrigger(GameEvent event, Game game) {
- if (game.getActivePlayerId().equals(this.controllerId) ) {
- UUID nefarox = this.getSourceId();
- if (nefarox != null) {
- if (game.getCombat().attacksAlone() && nefarox == game.getCombat().getAttackers().get(0)) {
- UUID defender = game.getCombat().getDefenderId(nefarox);
- this.getEffects().get(0).setTargetPointer(new FixedTarget(defender));
- return true;
- }
- }
- }
- return false;
- }
-
- @Override
- public String getRule() {
- return "Whenever {this} attacks alone, defending player sacrifices a creature.";
- }
-
-}
diff --git a/Mage.Sets/src/mage/sets/magic2014/MaraudingMaulhorn.java b/Mage.Sets/src/mage/sets/magic2014/MaraudingMaulhorn.java
index a43e8d31670..3a4ab14bfe0 100644
--- a/Mage.Sets/src/mage/sets/magic2014/MaraudingMaulhorn.java
+++ b/Mage.Sets/src/mage/sets/magic2014/MaraudingMaulhorn.java
@@ -41,14 +41,16 @@ import mage.constants.Rarity;
import mage.constants.Zone;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.predicate.mageobject.NamePredicate;
+import mage.watchers.common.AttackedThisTurnWatcher;
/**
*
* @author jeffwadsworth
*/
public class MaraudingMaulhorn extends CardImpl {
-
- private final static FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("creature named Advocate of the Beast");
+
+ private final static FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("creature named Advocate of the Beast");
+
static {
filter.add(new NamePredicate("Advocate of the Beast"));
}
@@ -67,8 +69,8 @@ public class MaraudingMaulhorn extends CardImpl {
new PermanentsOnTheBattlefieldCondition(filter, PermanentsOnTheBattlefieldCondition.CountType.FEWER_THAN, 1));
effect.setText("{this} attacks each combat if able unless you control a creature named Advocate of the Beast");
- this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect));
-
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect), new AttackedThisTurnWatcher());
+
}
public MaraudingMaulhorn(final MaraudingMaulhorn card) {
diff --git a/Mage.Sets/src/mage/sets/magic2014/VastwoodHydra.java b/Mage.Sets/src/mage/sets/magic2014/VastwoodHydra.java
index 1face405913..128e2d989fd 100644
--- a/Mage.Sets/src/mage/sets/magic2014/VastwoodHydra.java
+++ b/Mage.Sets/src/mage/sets/magic2014/VastwoodHydra.java
@@ -102,10 +102,11 @@ class VastwoodHydraEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null) {
- Object obj = getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
- if (obj != null && obj instanceof SpellAbility
- && permanent.getZoneChangeCounter(game) - 1 == ((SpellAbility) obj).getSourceObjectZoneChangeCounter()) {
- int amount = ((SpellAbility) obj).getManaCostsToPay().getX();
+ SpellAbility spellAbility = (SpellAbility) getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
+ if (spellAbility != null
+ && spellAbility.getSourceId().equals(source.getSourceId())
+ && permanent.getZoneChangeCounter(game) - 1 == spellAbility.getSourceObjectZoneChangeCounter()) {
+ int amount = spellAbility.getManaCostsToPay().getX();
if (amount > 0) {
permanent.addCounters(CounterType.P1P1.createInstance(amount), game);
}
diff --git a/Mage.Sets/src/mage/sets/magic2015/GenesisHydra.java b/Mage.Sets/src/mage/sets/magic2015/GenesisHydra.java
index 39a891f9009..af7a92c7e13 100644
--- a/Mage.Sets/src/mage/sets/magic2015/GenesisHydra.java
+++ b/Mage.Sets/src/mage/sets/magic2015/GenesisHydra.java
@@ -101,10 +101,10 @@ class GenesisHydraEntersBattlefieldEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null) {
- Object obj = getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
- if (obj != null && obj instanceof SpellAbility
- && permanent.getZoneChangeCounter(game) - 1 == ((SpellAbility) obj).getSourceObjectZoneChangeCounter()) {
- SpellAbility spellAbility = (SpellAbility) obj;
+ SpellAbility spellAbility = (SpellAbility) getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
+ if (spellAbility != null
+ && spellAbility.getSourceId().equals(source.getSourceId())
+ && permanent.getZoneChangeCounter(game) - 1 == spellAbility.getSourceObjectZoneChangeCounter()) {
if (spellAbility.getSourceId().equals(source.getSourceId())) { // put into play by normal cast
int amount = spellAbility.getManaCostsToPay().getX();
if (amount > 0) {
diff --git a/Mage.Sets/src/mage/sets/magic2015/KurkeshOnakkeAncient.java b/Mage.Sets/src/mage/sets/magic2015/KurkeshOnakkeAncient.java
index 91c880acb42..961a2c742fe 100644
--- a/Mage.Sets/src/mage/sets/magic2015/KurkeshOnakkeAncient.java
+++ b/Mage.Sets/src/mage/sets/magic2015/KurkeshOnakkeAncient.java
@@ -80,15 +80,15 @@ public class KurkeshOnakkeAncient extends CardImpl {
}
class KurkeshOnakkeAncientTriggeredAbility extends TriggeredAbilityImpl {
-
+
KurkeshOnakkeAncientTriggeredAbility() {
super(Zone.BATTLEFIELD, new KurkeshOnakkeAncientEffect(), false);
}
-
+
KurkeshOnakkeAncientTriggeredAbility(final KurkeshOnakkeAncientTriggeredAbility ability) {
super(ability);
}
-
+
@Override
public KurkeshOnakkeAncientTriggeredAbility copy() {
return new KurkeshOnakkeAncientTriggeredAbility(this);
@@ -98,11 +98,11 @@ class KurkeshOnakkeAncientTriggeredAbility extends TriggeredAbilityImpl {
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == EventType.ACTIVATED_ABILITY;
}
-
+
@Override
public boolean checkTrigger(GameEvent event, Game game) {
Card source = game.getPermanentOrLKIBattlefield(event.getSourceId());
- if (source.getCardType().contains(CardType.ARTIFACT)) {
+ if (source != null && source.getCardType().contains(CardType.ARTIFACT)) {
StackAbility stackAbility = (StackAbility) game.getStack().getStackObject(event.getSourceId());
if (!(stackAbility.getStackAbility() instanceof ManaAbility)) {
Effect effect = this.getEffects().get(0);
@@ -112,7 +112,7 @@ class KurkeshOnakkeAncientTriggeredAbility extends TriggeredAbilityImpl {
}
return false;
}
-
+
@Override
public String getRule() {
return "Whenever you activate an ability of an artifact, if it isn't a mana ability, you may pay {R}. If you do, copy that ability. You may choose new targets for the copy.";
@@ -120,21 +120,21 @@ class KurkeshOnakkeAncientTriggeredAbility extends TriggeredAbilityImpl {
}
class KurkeshOnakkeAncientEffect extends OneShotEffect {
-
+
KurkeshOnakkeAncientEffect() {
super(Outcome.Benefit);
this.staticText = ", you may pay {R}. If you do, copy that ability. You may choose new targets for the copy.";
}
-
+
KurkeshOnakkeAncientEffect(final KurkeshOnakkeAncientEffect effect) {
super(effect);
}
-
+
@Override
public KurkeshOnakkeAncientEffect copy() {
return new KurkeshOnakkeAncientEffect(this);
}
-
+
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
diff --git a/Mage.Sets/src/mage/sets/magic2015/MercurialPretender.java b/Mage.Sets/src/mage/sets/magic2015/MercurialPretender.java
index c1e14cdf255..6196ee8db79 100644
--- a/Mage.Sets/src/mage/sets/magic2015/MercurialPretender.java
+++ b/Mage.Sets/src/mage/sets/magic2015/MercurialPretender.java
@@ -47,7 +47,7 @@ import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.target.Target;
import mage.target.TargetPermanent;
-import mage.util.functions.ApplyToPermanent;
+import mage.util.functions.AbilityApplier;
/**
*
@@ -82,6 +82,7 @@ public class MercurialPretender extends CardImpl {
return new MercurialPretender(this);
}
}
+
class MercurialPretenderCopyEffect extends OneShotEffect {
public MercurialPretenderCopyEffect() {
@@ -103,16 +104,10 @@ class MercurialPretenderCopyEffect extends OneShotEffect {
player.choose(Outcome.Copy, target, source.getSourceId(), game);
Permanent copyFromPermanent = game.getPermanent(target.getFirstTarget());
if (copyFromPermanent != null) {
- game.copyPermanent(copyFromPermanent, sourcePermanent, source, new ApplyToPermanent() {
- @Override
- public Boolean apply(Game game, Permanent permanent) {
+ game.copyPermanent(copyFromPermanent, sourcePermanent, source,
// {2}{U}{U}: Return this creature to its owner's hand.
- Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnToHandSourceEffect(true), new ManaCostsImpl("{2}{U}{U}"));
- permanent.addAbility(ability, game);
- return true;
- }
- });
-
+ new AbilityApplier(new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnToHandSourceEffect(true), new ManaCostsImpl("{2}{U}{U}")))
+ );
return true;
}
}
diff --git a/Mage.Sets/src/mage/sets/magicorigins/DwynensElite.java b/Mage.Sets/src/mage/sets/magicorigins/DwynensElite.java
index d13a3b9fcf0..6ad3180ae6c 100644
--- a/Mage.Sets/src/mage/sets/magicorigins/DwynensElite.java
+++ b/Mage.Sets/src/mage/sets/magicorigins/DwynensElite.java
@@ -48,7 +48,7 @@ import mage.game.permanent.token.ElfToken;
* @author fireshoes
*/
public class DwynensElite extends CardImpl {
-
+
private static final FilterControlledPermanent filter = new FilterControlledPermanent("another Elf");
static {
@@ -69,7 +69,7 @@ public class DwynensElite extends CardImpl {
this.addAbility(new ConditionalTriggeredAbility(
triggeredAbility,
new PermanentsOnTheBattlefieldCondition(filter, CountType.MORE_THAN, 0),
- "When {this} enters the battlefield, if you control another Elf, put a 1/1 green Elf Warrior creature token onto the battlefield"));
+ "When {this} enters the battlefield, if you control another Elf, put a 1/1 green Elf Warrior creature token onto the battlefield."));
}
public DwynensElite(final DwynensElite card) {
diff --git a/Mage.Sets/src/mage/sets/magicorigins/HangarbackWalker.java b/Mage.Sets/src/mage/sets/magicorigins/HangarbackWalker.java
index f438ef8f52f..0b0a72bf055 100644
--- a/Mage.Sets/src/mage/sets/magicorigins/HangarbackWalker.java
+++ b/Mage.Sets/src/mage/sets/magicorigins/HangarbackWalker.java
@@ -101,10 +101,11 @@ class HangarbackWalkerEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null) {
- Object obj = getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
- if (obj != null && obj instanceof SpellAbility
- && permanent.getZoneChangeCounter(game) - 1 == ((SpellAbility) obj).getSourceObjectZoneChangeCounter()) {
- int amount = ((SpellAbility) obj).getManaCostsToPay().getX();
+ SpellAbility spellAbility = (SpellAbility) getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
+ if (spellAbility != null
+ && spellAbility.getSourceId().equals(source.getSourceId())
+ && permanent.getZoneChangeCounter(game) - 1 == spellAbility.getSourceObjectZoneChangeCounter()) {
+ int amount = spellAbility.getManaCostsToPay().getX();
if (amount > 0) {
permanent.addCounters(CounterType.P1P1.createInstance(amount), game);
}
diff --git a/Mage.Sets/src/mage/sets/magicorigins/LilianaDefiantNecromancer.java b/Mage.Sets/src/mage/sets/magicorigins/LilianaDefiantNecromancer.java
index 68e4320e8b6..c3abacd4394 100644
--- a/Mage.Sets/src/mage/sets/magicorigins/LilianaDefiantNecromancer.java
+++ b/Mage.Sets/src/mage/sets/magicorigins/LilianaDefiantNecromancer.java
@@ -57,7 +57,6 @@ import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.ConvertedManaCostPredicate;
import mage.filter.predicate.mageobject.SupertypePredicate;
-import mage.filter.predicate.permanent.ControllerPredicate;
import mage.game.Game;
import mage.game.command.Emblem;
import mage.target.common.TargetCardInYourGraveyard;
@@ -84,7 +83,6 @@ public class LilianaDefiantNecromancer extends CardImpl {
this.color.setBlack(true);
this.nightCard = true;
- // this.canTransform = true;
this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.LOYALTY.createInstance(3)), false));
@@ -97,7 +95,7 @@ public class LilianaDefiantNecromancer extends CardImpl {
ability.addTarget(new TargetCardInYourGraveyard(filter));
this.addAbility(ability);
- //-8: You get an emblem with "Whenever a creature you control dies, return it to the battlefield under your control at the beginning of the next end step.";
+ //-8: You get an emblem with "Whenever a creature dies, return it to the battlefield under your control at the beginning of the next end step.";
this.addAbility(new LoyaltyAbility(new GetEmblemEffect(new LilianaDefiantNecromancerEmblem()), -8));
}
@@ -130,11 +128,7 @@ public class LilianaDefiantNecromancer extends CardImpl {
class LilianaDefiantNecromancerEmblem extends Emblem {
- private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("a creature you control");
-
- static {
- filter.add(new ControllerPredicate(TargetController.YOU));
- }
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("a creature");
// You get an emblem with "Whenever a creature you control dies, return it to the battlefield under your control at the beginning of the next end step."
public LilianaDefiantNecromancerEmblem() {
diff --git a/Mage.Sets/src/mage/sets/magicorigins/NissasPilgrimage.java b/Mage.Sets/src/mage/sets/magicorigins/NissasPilgrimage.java
index 7fd632cb301..442643c5ffc 100644
--- a/Mage.Sets/src/mage/sets/magicorigins/NissasPilgrimage.java
+++ b/Mage.Sets/src/mage/sets/magicorigins/NissasPilgrimage.java
@@ -1,125 +1,126 @@
-/*
- * 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.sets.magicorigins;
-
-import java.util.UUID;
-import mage.MageObject;
-import mage.abilities.Ability;
-import mage.abilities.condition.common.SpellMasteryCondition;
-import mage.abilities.effects.OneShotEffect;
-import mage.cards.Card;
-import mage.cards.CardImpl;
-import mage.cards.Cards;
-import mage.cards.CardsImpl;
-import mage.constants.CardType;
-import mage.constants.Outcome;
-import mage.constants.Rarity;
-import mage.constants.Zone;
-import mage.filter.FilterCard;
-import mage.filter.common.FilterBasicLandCard;
-import mage.filter.predicate.mageobject.SubtypePredicate;
-import mage.game.Game;
-import mage.players.Player;
-import mage.target.common.TargetCardInLibrary;
-
-/**
- *
- * @author LevelX2
- */
-public class NissasPilgrimage extends CardImpl {
-
- public NissasPilgrimage(UUID ownerId) {
- super(ownerId, 190, "Nissa's Pilgrimage", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{2}{G}");
- this.expansionSetCode = "ORI";
-
- // Search your library for up to two basic Forest cards, reveal those cards, and put one onto the battlefield tapped and the rest into your hand. Then shuffle your library.
- // Spell Mastery — If there are two or more instant and/or sorcery cards in your graveyard, search your library for up to three basic Forest cards instead of two.
- this.getSpellAbility().addEffect(new NissasPilgrimageEffect());
- }
-
- public NissasPilgrimage(final NissasPilgrimage card) {
- super(card);
- }
-
- @Override
- public NissasPilgrimage copy() {
- return new NissasPilgrimage(this);
- }
-}
-
-class NissasPilgrimageEffect extends OneShotEffect {
-
- private static final FilterCard filter = new FilterBasicLandCard("basic Forest");
-
- static {
- filter.add(new SubtypePredicate("Forest"));
- }
-
- public NissasPilgrimageEffect() {
- super(Outcome.Benefit);
- this.staticText = "Search your library for up to two basic Forest cards, reveal those cards, and put one onto the battlefield tapped and the rest into your hand. Then shuffle your library."
- + "
Spell Mastery — If there are two or more instant and/or sorcery cards in your graveyard, search your library for up to three basic Forest cards instead of two.";
- }
-
- public NissasPilgrimageEffect(final NissasPilgrimageEffect effect) {
- super(effect);
- }
-
- @Override
- public NissasPilgrimageEffect copy() {
- return new NissasPilgrimageEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Player controller = game.getPlayer(source.getControllerId());
- MageObject sourceObject = source.getSourceObject(game);
- if (controller != null && sourceObject != null) {
- int number = 2;
- if (SpellMasteryCondition.getInstance().apply(game, source)) {
- number++;
- }
- TargetCardInLibrary target = new TargetCardInLibrary(0, number, filter);
- controller.searchLibrary(target, game);
- if (!target.getTargets().isEmpty()) {
- Cards cards = new CardsImpl(target.getTargets());
- controller.revealCards(sourceObject.getIdName(), cards, game);
- if (!cards.isEmpty()) {
- Card card = cards.getRandom(game);
- if (card != null) {
- cards.remove(card);
- controller.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, source.getSourceId(), true);
- controller.moveCards(cards, Zone.LIBRARY, Zone.HAND, source, game);
- }
- }
- }
- return true;
- }
- return false;
- }
-}
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.magicorigins;
+
+import java.util.UUID;
+import mage.MageObject;
+import mage.abilities.Ability;
+import mage.abilities.condition.common.SpellMasteryCondition;
+import mage.abilities.effects.OneShotEffect;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.cards.Cards;
+import mage.cards.CardsImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.FilterCard;
+import mage.filter.common.FilterBasicLandCard;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+import mage.game.Game;
+import mage.players.Player;
+import mage.target.common.TargetCardInLibrary;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class NissasPilgrimage extends CardImpl {
+
+ public NissasPilgrimage(UUID ownerId) {
+ super(ownerId, 190, "Nissa's Pilgrimage", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{2}{G}");
+ this.expansionSetCode = "ORI";
+
+ // Search your library for up to two basic Forest cards, reveal those cards, and put one onto the battlefield tapped and the rest into your hand. Then shuffle your library.
+ // Spell Mastery — If there are two or more instant and/or sorcery cards in your graveyard, search your library for up to three basic Forest cards instead of two.
+ this.getSpellAbility().addEffect(new NissasPilgrimageEffect());
+ }
+
+ public NissasPilgrimage(final NissasPilgrimage card) {
+ super(card);
+ }
+
+ @Override
+ public NissasPilgrimage copy() {
+ return new NissasPilgrimage(this);
+ }
+}
+
+class NissasPilgrimageEffect extends OneShotEffect {
+
+ private static final FilterCard filter = new FilterBasicLandCard("basic Forest");
+
+ static {
+ filter.add(new SubtypePredicate("Forest"));
+ }
+
+ public NissasPilgrimageEffect() {
+ super(Outcome.Benefit);
+ this.staticText = "Search your library for up to two basic Forest cards, reveal those cards, and put one onto the battlefield tapped and the rest into your hand. Then shuffle your library."
+ + "
Spell Mastery — If there are two or more instant and/or sorcery cards in your graveyard, search your library for up to three basic Forest cards instead of two.";
+ }
+
+ public NissasPilgrimageEffect(final NissasPilgrimageEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public NissasPilgrimageEffect copy() {
+ return new NissasPilgrimageEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ MageObject sourceObject = source.getSourceObject(game);
+ if (controller != null && sourceObject != null) {
+ int number = 2;
+ if (SpellMasteryCondition.getInstance().apply(game, source)) {
+ number++;
+ }
+ TargetCardInLibrary target = new TargetCardInLibrary(0, number, filter);
+ controller.searchLibrary(target, game);
+ if (!target.getTargets().isEmpty()) {
+ Cards cards = new CardsImpl(target.getTargets());
+ controller.revealCards(sourceObject.getIdName(), cards, game);
+ if (!cards.isEmpty()) {
+ Card card = cards.getRandom(game);
+ if (card != null) {
+ cards.remove(card);
+ controller.putOntoBattlefieldWithInfo(card, game, Zone.LIBRARY, source.getSourceId(), true);
+ controller.moveCards(cards, Zone.LIBRARY, Zone.HAND, source, game);
+ }
+ }
+ }
+ controller.shuffleLibrary(game);
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/magicorigins/SeismicElemental.java b/Mage.Sets/src/mage/sets/magicorigins/SeismicElemental.java
index 3f67be9e03c..ea83725bd99 100644
--- a/Mage.Sets/src/mage/sets/magicorigins/SeismicElemental.java
+++ b/Mage.Sets/src/mage/sets/magicorigins/SeismicElemental.java
@@ -45,13 +45,13 @@ import mage.filter.predicate.mageobject.AbilityPredicate;
* @author LevelX2
*/
public class SeismicElemental extends CardImpl {
-
- private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Creatures without flying");
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures without flying");
static {
filter.add(Predicates.not(new AbilityPredicate(FlyingAbility.class)));
}
-
+
public SeismicElemental(UUID ownerId) {
super(ownerId, 161, "Seismic Elemental", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{R}{R}");
this.expansionSetCode = "ORI";
diff --git a/Mage.Sets/src/mage/sets/magicorigins/TheGreatAurora.java b/Mage.Sets/src/mage/sets/magicorigins/TheGreatAurora.java
index 93e61a08d9e..c6fc391ddf2 100644
--- a/Mage.Sets/src/mage/sets/magicorigins/TheGreatAurora.java
+++ b/Mage.Sets/src/mage/sets/magicorigins/TheGreatAurora.java
@@ -117,10 +117,12 @@ class TheGreatAuroraEffect extends OneShotEffect {
for (Permanent permanent : list) {
player.moveCardToLibraryWithInfo(permanent, source.getSourceId(), game, Zone.BATTLEFIELD, true, true);
}
- player.getLibrary().shuffle();
+ player.shuffleLibrary(game);
}
}
+ game.applyEffects(); // so effects from creatures that were on the battlefield won't trigger from draw or put into play
+
// Draw cards
for (UUID playerId : game.getState().getPlayersInRange(source.getControllerId(), game)) {
Player player = game.getPlayer(playerId);
diff --git a/Mage.Sets/src/mage/sets/mastersedition/BrothersOfFire.java b/Mage.Sets/src/mage/sets/mastersedition/BrothersOfFire.java
new file mode 100644
index 00000000000..2d485e3c98b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mastersedition/BrothersOfFire.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.mastersedition;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class BrothersOfFire extends mage.sets.fourthedition.BrothersOfFire {
+
+ public BrothersOfFire(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 89;
+ this.expansionSetCode = "MED";
+ }
+
+ public BrothersOfFire(final BrothersOfFire card) {
+ super(card);
+ }
+
+ @Override
+ public BrothersOfFire copy() {
+ return new BrothersOfFire(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mastersedition/GraniteGargoyle.java b/Mage.Sets/src/mage/sets/mastersedition/GraniteGargoyle.java
new file mode 100644
index 00000000000..c0b301e1e18
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mastersedition/GraniteGargoyle.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.mastersedition;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class GraniteGargoyle extends mage.sets.revisededition.GraniteGargoyle {
+
+ public GraniteGargoyle(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 99;
+ this.expansionSetCode = "MED";
+ this.rarity = Rarity.UNCOMMON;
+ }
+
+ public GraniteGargoyle(final GraniteGargoyle card) {
+ super(card);
+ }
+
+ @Override
+ public GraniteGargoyle copy() {
+ return new GraniteGargoyle(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mastersedition/MindstabThrull.java b/Mage.Sets/src/mage/sets/mastersedition/MindstabThrull.java
new file mode 100644
index 00000000000..2d36d067a28
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mastersedition/MindstabThrull.java
@@ -0,0 +1,68 @@
+/*
+ * 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.sets.mastersedition;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.AttacksAndIsNotBlockedTriggeredAbility;
+import mage.abilities.costs.common.SacrificeSourceCost;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.DoIfCostPaid;
+import mage.abilities.effects.common.discard.DiscardTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class MindstabThrull extends CardImpl {
+
+ public MindstabThrull(UUID ownerId) {
+ super(ownerId, 76, "Mindstab Thrull", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{B}{B}");
+ this.expansionSetCode = "MED";
+ this.subtype.add("Thrull");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Whenever Mindstab Thrull attacks and isn't blocked, you may sacrifice it. If you do, defending player discards three cards.
+ Effect effect = new DiscardTargetEffect(3);
+ effect.setText("defending player discards three cards");
+ this.addAbility(new AttacksAndIsNotBlockedTriggeredAbility(new DoIfCostPaid(effect, new SacrificeSourceCost()), false, true));
+ }
+
+ public MindstabThrull(final MindstabThrull card) {
+ super(card);
+ }
+
+ @Override
+ public MindstabThrull copy() {
+ return new MindstabThrull(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mastersedition/OrcishMechanics.java b/Mage.Sets/src/mage/sets/mastersedition/OrcishMechanics.java
new file mode 100644
index 00000000000..e3f0311be5e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mastersedition/OrcishMechanics.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.mastersedition;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class OrcishMechanics extends mage.sets.antiquities.OrcishMechanics {
+
+ public OrcishMechanics(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 106;
+ this.expansionSetCode = "MED";
+ this.rarity = Rarity.UNCOMMON;
+ }
+
+ public OrcishMechanics(final OrcishMechanics card) {
+ super(card);
+ }
+
+ @Override
+ public OrcishMechanics copy() {
+ return new OrcishMechanics(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mastersedition/VesuvanDoppelganger.java b/Mage.Sets/src/mage/sets/mastersedition/VesuvanDoppelganger.java
new file mode 100644
index 00000000000..ed540f33231
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mastersedition/VesuvanDoppelganger.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.mastersedition;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class VesuvanDoppelganger extends mage.sets.unlimitededition.VesuvanDoppelganger {
+
+ public VesuvanDoppelganger(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 54;
+ this.expansionSetCode = "MED";
+ }
+
+ public VesuvanDoppelganger(final VesuvanDoppelganger card) {
+ super(card);
+ }
+
+ @Override
+ public VesuvanDoppelganger copy() {
+ return new VesuvanDoppelganger(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mastersedition/Wanderlust.java b/Mage.Sets/src/mage/sets/mastersedition/Wanderlust.java
new file mode 100644
index 00000000000..06e9dbc2523
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mastersedition/Wanderlust.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.mastersedition;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Wanderlust extends mage.sets.unlimitededition.Wanderlust {
+
+ public Wanderlust(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 137;
+ this.expansionSetCode = "MED";
+ this.rarity = Rarity.COMMON;
+ }
+
+ public Wanderlust(final Wanderlust card) {
+ super(card);
+ }
+
+ @Override
+ public Wanderlust copy() {
+ return new Wanderlust(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/masterseditionii/AngelOfFury.java b/Mage.Sets/src/mage/sets/masterseditionii/AngelOfFury.java
new file mode 100644
index 00000000000..e72554ff411
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/masterseditionii/AngelOfFury.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.masterseditionii;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class AngelOfFury extends mage.sets.portalsecondage.AngelOfFury {
+
+ public AngelOfFury(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 2;
+ this.expansionSetCode = "ME2";
+ }
+
+ public AngelOfFury(final AngelOfFury card) {
+ super(card);
+ }
+
+ @Override
+ public AngelOfFury copy() {
+ return new AngelOfFury(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/masterseditionii/FarrelsZealot.java b/Mage.Sets/src/mage/sets/masterseditionii/FarrelsZealot.java
new file mode 100644
index 00000000000..f3dbcb9a019
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/masterseditionii/FarrelsZealot.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.masterseditionii;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class FarrelsZealot extends mage.sets.fallenempires.FarrelsZealot1 {
+
+ public FarrelsZealot(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 14;
+ this.expansionSetCode = "ME2";
+ this.rarity = Rarity.UNCOMMON;
+ }
+
+ public FarrelsZealot(final FarrelsZealot card) {
+ super(card);
+ }
+
+ @Override
+ public FarrelsZealot copy() {
+ return new FarrelsZealot(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/masterseditionii/IcatianScout.java b/Mage.Sets/src/mage/sets/masterseditionii/IcatianScout.java
new file mode 100644
index 00000000000..bc644954181
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/masterseditionii/IcatianScout.java
@@ -0,0 +1,76 @@
+/*
+ * 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.sets.masterseditionii;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
+import mage.abilities.keyword.FirstStrikeAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class IcatianScout extends CardImpl {
+
+ public IcatianScout(UUID ownerId) {
+ super(ownerId, 17, "Icatian Scout", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{W}");
+ this.expansionSetCode = "ME2";
+ this.subtype.add("Human");
+ this.subtype.add("Soldier");
+ this.subtype.add("Scout");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // {1}, {tap}: Target creature gains first strike until end of turn.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainAbilityTargetEffect(
+ FirstStrikeAbility.getInstance(), Duration.EndOfTurn), new ManaCostsImpl("{1}"));
+ ability.addCost(new TapSourceCost());
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+ }
+
+ public IcatianScout(final IcatianScout card) {
+ super(card);
+ }
+
+ @Override
+ public IcatianScout copy() {
+ return new IcatianScout(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/masterseditionii/LimDulsHighGuard.java b/Mage.Sets/src/mage/sets/masterseditionii/LimDulsHighGuard.java
new file mode 100644
index 00000000000..5fa1e9b10f3
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/masterseditionii/LimDulsHighGuard.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.masterseditionii;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class LimDulsHighGuard extends mage.sets.alliances.LimDulsHighGuard1 {
+
+ public LimDulsHighGuard(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 103;
+ this.expansionSetCode = "ME2";
+ this.rarity = Rarity.UNCOMMON;
+ }
+
+ public LimDulsHighGuard(final LimDulsHighGuard card) {
+ super(card);
+ }
+
+ @Override
+ public LimDulsHighGuard copy() {
+ return new LimDulsHighGuard(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/masterseditionii/RitualOfTheMachine.java b/Mage.Sets/src/mage/sets/masterseditionii/RitualOfTheMachine.java
new file mode 100644
index 00000000000..82c21f61ecf
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/masterseditionii/RitualOfTheMachine.java
@@ -0,0 +1,78 @@
+/*
+ * 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.sets.masterseditionii;
+
+import java.util.UUID;
+import mage.ObjectColor;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.effects.common.continuous.GainControlTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.CardTypePredicate;
+import mage.filter.predicate.mageobject.ColorPredicate;
+import mage.target.common.TargetControlledCreaturePermanent;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class RitualOfTheMachine extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("nonartifact, nonblack creature");
+
+ static {
+ filter.add(Predicates.not(new CardTypePredicate(CardType.ARTIFACT)));
+ filter.add(Predicates.not(new ColorPredicate(ObjectColor.BLACK)));
+ }
+
+ public RitualOfTheMachine(UUID ownerId) {
+ super(ownerId, 109, "Ritual of the Machine", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{2}{B}{B}");
+ this.expansionSetCode = "ME2";
+
+ // As an additional cost to cast Ritual of the Machine, sacrifice a creature.
+ this.getSpellAbility().addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(new FilterControlledCreaturePermanent("a creature"))));
+ // Gain control of target nonartifact, nonblack creature.
+ this.getSpellAbility().addEffect(new GainControlTargetEffect(Duration.EndOfGame));
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter));
+ }
+
+ public RitualOfTheMachine(final RitualOfTheMachine card) {
+ super(card);
+ }
+
+ @Override
+ public RitualOfTheMachine copy() {
+ return new RitualOfTheMachine(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/masterseditionii/VisceridArmor.java b/Mage.Sets/src/mage/sets/masterseditionii/VisceridArmor.java
new file mode 100644
index 00000000000..f4b9c4d6210
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/masterseditionii/VisceridArmor.java
@@ -0,0 +1,79 @@
+/*
+ * 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.sets.masterseditionii;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.AttachEffect;
+import mage.abilities.effects.common.ReturnToHandSourceEffect;
+import mage.abilities.effects.common.continuous.BoostEnchantedEffect;
+import mage.abilities.keyword.EnchantAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.target.TargetPermanent;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class VisceridArmor extends CardImpl {
+
+ public VisceridArmor(UUID ownerId) {
+ super(ownerId, 72, "Viscerid Armor", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}");
+ this.expansionSetCode = "ME2";
+ this.subtype.add("Aura");
+
+ // Enchant creature
+ TargetPermanent auraTarget = new TargetCreaturePermanent();
+ this.getSpellAbility().addTarget(auraTarget);
+ this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
+ Ability ability = new EnchantAbility(auraTarget.getTargetName());
+ this.addAbility(ability);
+ // Enchanted creature gets +1/+1.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(1, 1, Duration.WhileOnBattlefield)));
+ // {1}{U}: Return Viscerid Armor to its owner's hand.
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnToHandSourceEffect(true), new ManaCostsImpl("{1}{U}")));
+ }
+
+ public VisceridArmor(final VisceridArmor card) {
+ super(card);
+ }
+
+ @Override
+ public VisceridArmor copy() {
+ return new VisceridArmor(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/masterseditionii/WolfPack.java b/Mage.Sets/src/mage/sets/masterseditionii/WolfPack.java
new file mode 100644
index 00000000000..6bf9aeb6bfa
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/masterseditionii/WolfPack.java
@@ -0,0 +1,62 @@
+/*
+ * 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.sets.masterseditionii;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.DamageAsThoughNotBlockedAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class WolfPack extends CardImpl {
+
+ public WolfPack(UUID ownerId) {
+ super(ownerId, 187, "Wolf Pack", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{6}{G}{G}");
+ this.expansionSetCode = "ME2";
+ this.subtype.add("Wolf");
+ this.power = new MageInt(7);
+ this.toughness = new MageInt(6);
+
+ // You may have Wolf Pack assign its combat damage as though it weren't blocked.
+ this.addAbility(DamageAsThoughNotBlockedAbility.getInstance());
+ }
+
+ public WolfPack(final WolfPack card) {
+ super(card);
+ }
+
+ @Override
+ public WolfPack copy() {
+ return new WolfPack(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/masterseditionii/YavimayaAncients.java b/Mage.Sets/src/mage/sets/masterseditionii/YavimayaAncients.java
new file mode 100644
index 00000000000..a9c4568dc8a
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/masterseditionii/YavimayaAncients.java
@@ -0,0 +1,66 @@
+/*
+ * 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.sets.masterseditionii;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class YavimayaAncients extends CardImpl {
+
+ public YavimayaAncients(UUID ownerId) {
+ super(ownerId, 190, "Yavimaya Ancients", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{G}{G}");
+ this.expansionSetCode = "ME2";
+ this.subtype.add("Treefolk");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(7);
+
+ // {G}: Yavimaya Ancients gets +1/-2 until end of turn.
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(1, -2, Duration.EndOfTurn), new ManaCostsImpl("{G}")));
+ }
+
+ public YavimayaAncients(final YavimayaAncients card) {
+ super(card);
+ }
+
+ @Override
+ public YavimayaAncients copy() {
+ return new YavimayaAncients(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/masterseditionii/ZuranSpellcaster.java b/Mage.Sets/src/mage/sets/masterseditionii/ZuranSpellcaster.java
new file mode 100644
index 00000000000..7c28041325d
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/masterseditionii/ZuranSpellcaster.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.masterseditionii;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class ZuranSpellcaster extends mage.sets.iceage.ZuranSpellcaster {
+
+ public ZuranSpellcaster(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 76;
+ this.expansionSetCode = "ME2";
+ }
+
+ public ZuranSpellcaster(final ZuranSpellcaster card) {
+ super(card);
+ }
+
+ @Override
+ public ZuranSpellcaster copy() {
+ return new ZuranSpellcaster(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/masterseditioniii/ArcadesSabboth.java b/Mage.Sets/src/mage/sets/masterseditioniii/ArcadesSabboth.java
new file mode 100644
index 00000000000..0820d13dadb
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/masterseditioniii/ArcadesSabboth.java
@@ -0,0 +1,97 @@
+/*
+ * 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.sets.masterseditioniii;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect;
+import mage.abilities.effects.common.continuous.BoostAllEffect;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.permanent.AttackingPredicate;
+import mage.filter.predicate.permanent.ControllerPredicate;
+import mage.filter.predicate.permanent.TappedPredicate;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class ArcadesSabboth extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("untapped creatures you control");
+
+ static {
+ filter.add(new ControllerPredicate(TargetController.YOU));
+ filter.add(Predicates.not(new TappedPredicate()));
+ filter.add(Predicates.not(new AttackingPredicate()));
+ }
+
+ public ArcadesSabboth(UUID ownerId) {
+ super(ownerId, 142, "Arcades Sabboth", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{G}{G}{W}{W}{U}{U}");
+ this.expansionSetCode = "ME3";
+ this.supertype.add("Legendary");
+ this.subtype.add("Elder");
+ this.subtype.add("Dragon");
+ this.power = new MageInt(7);
+ this.toughness = new MageInt(7);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+
+ // At the beginning of your upkeep, sacrifice Arcades Sabboth unless you pay {G}{W}{U}.
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(
+ new SacrificeSourceUnlessPaysEffect(new ManaCostsImpl("{G}{W}{U}")), TargetController.YOU, false));
+
+ // Each untapped creature you control gets +0/+2 as long as it's not attacking.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostAllEffect(0, 2, Duration.WhileOnBattlefield, filter, false)));
+
+ // {W}: Arcades Sabboth gets +0/+1 until end of turn.
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(0, 1, Duration.EndOfTurn), new ManaCostsImpl("{W}")));
+ }
+
+ public ArcadesSabboth(final ArcadesSabboth card) {
+ super(card);
+ }
+
+ @Override
+ public ArcadesSabboth copy() {
+ return new ArcadesSabboth(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/masterseditioniii/Chromium.java b/Mage.Sets/src/mage/sets/masterseditioniii/Chromium.java
new file mode 100644
index 00000000000..cc0e032a460
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/masterseditioniii/Chromium.java
@@ -0,0 +1,74 @@
+/*
+ * 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.sets.masterseditioniii;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.abilities.keyword.RampageAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Chromium extends CardImpl {
+
+ public Chromium(UUID ownerId) {
+ super(ownerId, 147, "Chromium", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{W}{W}{U}{U}{B}{B}");
+ this.expansionSetCode = "ME3";
+ this.supertype.add("Legendary");
+ this.subtype.add("Elder");
+ this.subtype.add("Dragon");
+ this.power = new MageInt(7);
+ this.toughness = new MageInt(7);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+ // Rampage 2
+ this.addAbility(new RampageAbility(2));
+ // At the beginning of your upkeep, sacrifice Chromium unless you pay {W}{U}{B}.
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(new SacrificeSourceUnlessPaysEffect(
+ new ManaCostsImpl("{W}{U}{B}")), TargetController.YOU, false));
+ }
+
+ public Chromium(final Chromium card) {
+ super(card);
+ }
+
+ @Override
+ public Chromium copy() {
+ return new Chromium(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/masterseditioniii/CosmicHorror.java b/Mage.Sets/src/mage/sets/masterseditioniii/CosmicHorror.java
new file mode 100644
index 00000000000..a43202b347a
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/masterseditioniii/CosmicHorror.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.masterseditioniii;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class CosmicHorror extends mage.sets.legends.CosmicHorror {
+
+ public CosmicHorror(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 61;
+ this.expansionSetCode = "ME3";
+ }
+
+ public CosmicHorror(final CosmicHorror card) {
+ super(card);
+ }
+
+ @Override
+ public CosmicHorror copy() {
+ return new CosmicHorror(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/masterseditioniii/ForcedRetreat.java b/Mage.Sets/src/mage/sets/masterseditioniii/ForcedRetreat.java
new file mode 100644
index 00000000000..4ab6fb188bf
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/masterseditioniii/ForcedRetreat.java
@@ -0,0 +1,60 @@
+/*
+ * 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.sets.masterseditioniii;
+
+import java.util.UUID;
+import mage.abilities.effects.common.PutOnLibraryTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class ForcedRetreat extends CardImpl {
+
+ public ForcedRetreat(UUID ownerId) {
+ super(ownerId, 37, "Forced Retreat", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{2}{U}");
+ this.expansionSetCode = "ME3";
+
+ // Put target creature on top of its owner's library.
+ this.getSpellAbility().addEffect(new PutOnLibraryTargetEffect(true));
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent());
+ }
+
+ public ForcedRetreat(final ForcedRetreat card) {
+ super(card);
+ }
+
+ @Override
+ public ForcedRetreat copy() {
+ return new ForcedRetreat(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/masterseditioniii/FrostGiant.java b/Mage.Sets/src/mage/sets/masterseditioniii/FrostGiant.java
new file mode 100644
index 00000000000..3775baa11b9
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/masterseditioniii/FrostGiant.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.masterseditioniii;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class FrostGiant extends mage.sets.legends.FrostGiant {
+
+ public FrostGiant(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 101;
+ this.expansionSetCode = "ME3";
+ }
+
+ public FrostGiant(final FrostGiant card) {
+ super(card);
+ }
+
+ @Override
+ public FrostGiant copy() {
+ return new FrostGiant(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/masterseditioniii/GuanYuSaintedWarrior.java b/Mage.Sets/src/mage/sets/masterseditioniii/GuanYuSaintedWarrior.java
new file mode 100644
index 00000000000..87fd01dfd43
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/masterseditioniii/GuanYuSaintedWarrior.java
@@ -0,0 +1,69 @@
+/*
+ * 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.sets.masterseditioniii;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.DiesTriggeredAbility;
+import mage.abilities.effects.common.ShuffleIntoLibrarySourceEffect;
+import mage.abilities.keyword.HorsemanshipAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class GuanYuSaintedWarrior extends CardImpl {
+
+ public GuanYuSaintedWarrior(UUID ownerId) {
+ super(ownerId, 12, "Guan Yu, Sainted Warrior", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{W}{W}");
+ this.expansionSetCode = "ME3";
+ this.supertype.add("Legendary");
+ this.subtype.add("Human");
+ this.subtype.add("Soldier");
+ this.subtype.add("Warrior");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(5);
+
+ // Horsemanship
+ this.addAbility(HorsemanshipAbility.getInstance());
+ // When Guan Yu, Sainted Warrior is put into your graveyard from the battlefield, you may shuffle Guan Yu into your library.
+ this.addAbility(new DiesTriggeredAbility(new ShuffleIntoLibrarySourceEffect(), true));
+ }
+
+ public GuanYuSaintedWarrior(final GuanYuSaintedWarrior card) {
+ super(card);
+ }
+
+ @Override
+ public GuanYuSaintedWarrior copy() {
+ return new GuanYuSaintedWarrior(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/masterseditioniii/HundingGjornersen.java b/Mage.Sets/src/mage/sets/masterseditioniii/HundingGjornersen.java
new file mode 100644
index 00000000000..a124aaa1bef
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/masterseditioniii/HundingGjornersen.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.masterseditioniii;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class HundingGjornersen extends mage.sets.legends.HundingGjornersen {
+
+ public HundingGjornersen(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 152;
+ this.expansionSetCode = "ME3";
+ }
+
+ public HundingGjornersen(final HundingGjornersen card) {
+ super(card);
+ }
+
+ @Override
+ public HundingGjornersen copy() {
+ return new HundingGjornersen(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/masterseditioniii/KoboldDrillSergeant.java b/Mage.Sets/src/mage/sets/masterseditioniii/KoboldDrillSergeant.java
index 225d0176d3e..19390b22d4c 100644
--- a/Mage.Sets/src/mage/sets/masterseditioniii/KoboldDrillSergeant.java
+++ b/Mage.Sets/src/mage/sets/masterseditioniii/KoboldDrillSergeant.java
@@ -31,6 +31,7 @@ import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.Effect;
import mage.abilities.effects.common.continuous.BoostControlledEffect;
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
import mage.abilities.keyword.TrampleAbility;
@@ -47,7 +48,7 @@ import mage.filter.predicate.mageobject.SubtypePredicate;
* @author ilcartographer
*/
public class KoboldDrillSergeant extends CardImpl {
-
+
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Kobold creatures");
static {
@@ -62,9 +63,11 @@ public class KoboldDrillSergeant extends CardImpl {
this.power = new MageInt(1);
this.toughness = new MageInt(2);
- // Other Kobold creatures you control get +0/+1 and have trample.
+ // Other Kobold creatures you control get +0/+1 and have trample.
Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostControlledEffect(0, 1, Duration.WhileOnBattlefield, filter, true));
- ability.addEffect(new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.WhileOnBattlefield, filter, true));
+ Effect effect = new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.WhileOnBattlefield, filter, true);
+ effect.setText("and have trample");
+ ability.addEffect(effect);
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/sets/masterseditioniii/LadyCaleria.java b/Mage.Sets/src/mage/sets/masterseditioniii/LadyCaleria.java
new file mode 100644
index 00000000000..ae90dcbaee8
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/masterseditioniii/LadyCaleria.java
@@ -0,0 +1,71 @@
+/*
+ * 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.sets.masterseditioniii;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.target.common.TargetAttackingOrBlockingCreature;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class LadyCaleria extends CardImpl {
+
+ public LadyCaleria(UUID ownerId) {
+ super(ownerId, 157, "Lady Caleria", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{G}{G}{W}{W}");
+ this.expansionSetCode = "ME3";
+ this.supertype.add("Legendary");
+ this.subtype.add("Human");
+ this.subtype.add("Archer");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(6);
+
+ // {T}: Lady Caleria deals 3 damage to target attacking or blocking creature.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(3), new TapSourceCost());
+ ability.addTarget(new TargetAttackingOrBlockingCreature());
+ this.addAbility(ability);
+ }
+
+ public LadyCaleria(final LadyCaleria card) {
+ super(card);
+ }
+
+ @Override
+ public LadyCaleria copy() {
+ return new LadyCaleria(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/masterseditioniii/LivonyaSilone.java b/Mage.Sets/src/mage/sets/masterseditioniii/LivonyaSilone.java
new file mode 100644
index 00000000000..7f44414c988
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/masterseditioniii/LivonyaSilone.java
@@ -0,0 +1,75 @@
+/*
+ * 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.sets.masterseditioniii;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.keyword.FirstStrikeAbility;
+import mage.abilities.keyword.LandwalkAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterLandPermanent;
+import mage.filter.predicate.mageobject.SupertypePredicate;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class LivonyaSilone extends CardImpl {
+
+ private static final FilterLandPermanent filter = new FilterLandPermanent("Legendary land");
+
+ static {
+ filter.add(new SupertypePredicate("Legendary"));
+ }
+
+ public LivonyaSilone(UUID ownerId) {
+ super(ownerId, 160, "Livonya Silone", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{R}{R}{G}{G}");
+ this.expansionSetCode = "ME3";
+ this.supertype.add("Legendary");
+ this.subtype.add("Human");
+ this.subtype.add("Warrior");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(4);
+
+ // First strike
+ this.addAbility(FirstStrikeAbility.getInstance());
+ // legendary landwalk
+ this.addAbility(new LandwalkAbility(filter));
+ }
+
+ public LivonyaSilone(final LivonyaSilone card) {
+ super(card);
+ }
+
+ @Override
+ public LivonyaSilone copy() {
+ return new LivonyaSilone(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/masterseditioniii/MarhaultElsdragon.java b/Mage.Sets/src/mage/sets/masterseditioniii/MarhaultElsdragon.java
new file mode 100644
index 00000000000..3269d81cd5e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/masterseditioniii/MarhaultElsdragon.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.masterseditioniii;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class MarhaultElsdragon extends mage.sets.legends.MarhaultElsdragon {
+
+ public MarhaultElsdragon(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 161;
+ this.expansionSetCode = "ME3";
+ }
+
+ public MarhaultElsdragon(final MarhaultElsdragon card) {
+ super(card);
+ }
+
+ @Override
+ public MarhaultElsdragon copy() {
+ return new MarhaultElsdragon(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/masterseditioniii/SlashingTiger.java b/Mage.Sets/src/mage/sets/masterseditioniii/SlashingTiger.java
new file mode 100644
index 00000000000..0075609f813
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/masterseditioniii/SlashingTiger.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.masterseditioniii;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class SlashingTiger extends mage.sets.portalthreekingdoms.SlashingTiger {
+
+ public SlashingTiger(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 133;
+ this.expansionSetCode = "ME3";
+ this.rarity = Rarity.COMMON;
+ }
+
+ public SlashingTiger(final SlashingTiger card) {
+ super(card);
+ }
+
+ @Override
+ public SlashingTiger copy() {
+ return new SlashingTiger(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/masterseditioniii/TorWauki.java b/Mage.Sets/src/mage/sets/masterseditioniii/TorWauki.java
new file mode 100644
index 00000000000..bfd68ec93bb
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/masterseditioniii/TorWauki.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.masterseditioniii;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class TorWauki extends mage.sets.legends.TorWauki {
+
+ public TorWauki(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 182;
+ this.expansionSetCode = "ME3";
+ }
+
+ public TorWauki(final TorWauki card) {
+ super(card);
+ }
+
+ @Override
+ public TorWauki copy() {
+ return new TorWauki(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/masterseditioniii/TuknirDeathlock.java b/Mage.Sets/src/mage/sets/masterseditioniii/TuknirDeathlock.java
new file mode 100644
index 00000000000..dff5f112c7a
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/masterseditioniii/TuknirDeathlock.java
@@ -0,0 +1,77 @@
+/*
+ * 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.sets.masterseditioniii;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class TuknirDeathlock extends CardImpl {
+
+ public TuknirDeathlock(UUID ownerId) {
+ super(ownerId, 184, "Tuknir Deathlock", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{R}{R}{G}{G}");
+ this.expansionSetCode = "ME3";
+ this.supertype.add("Legendary");
+ this.subtype.add("Human");
+ this.subtype.add("Wizard");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+ // {R}{G}, {tap}: Target creature gets +2/+2 until end of turn.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(2, 2, Duration.EndOfTurn), new ManaCostsImpl("{R}{G}"));
+ ability.addCost(new TapSourceCost());
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+ }
+
+ public TuknirDeathlock(final TuknirDeathlock card) {
+ super(card);
+ }
+
+ @Override
+ public TuknirDeathlock copy() {
+ return new TuknirDeathlock(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/masterseditioniii/WeiNightRaiders.java b/Mage.Sets/src/mage/sets/masterseditioniii/WeiNightRaiders.java
new file mode 100644
index 00000000000..9f9001e97d4
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/masterseditioniii/WeiNightRaiders.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.masterseditioniii;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class WeiNightRaiders extends mage.sets.portalthreekingdoms.WeiNightRaiders {
+
+ public WeiNightRaiders(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 81;
+ this.expansionSetCode = "ME3";
+ }
+
+ public WeiNightRaiders(final WeiNightRaiders card) {
+ super(card);
+ }
+
+ @Override
+ public WeiNightRaiders copy() {
+ return new WeiNightRaiders(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/masterseditioniii/ZodiacDragon.java b/Mage.Sets/src/mage/sets/masterseditioniii/ZodiacDragon.java
new file mode 100644
index 00000000000..8cd972b8ca2
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/masterseditioniii/ZodiacDragon.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.masterseditioniii;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class ZodiacDragon extends mage.sets.portalthreekingdoms.ZodiacDragon {
+
+ public ZodiacDragon(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 112;
+ this.expansionSetCode = "ME3";
+ }
+
+ public ZodiacDragon(final ZodiacDragon card) {
+ super(card);
+ }
+
+ @Override
+ public ZodiacDragon copy() {
+ return new ZodiacDragon(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/masterseditioniv/Conversion.java b/Mage.Sets/src/mage/sets/masterseditioniv/Conversion.java
new file mode 100644
index 00000000000..afca2b79f50
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/masterseditioniv/Conversion.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.masterseditioniv;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class Conversion extends mage.sets.limitedalpha.Conversion {
+
+ public Conversion(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 9;
+ this.expansionSetCode = "ME4";
+ this.rarity = Rarity.RARE;
+ }
+
+ public Conversion(final Conversion card) {
+ super(card);
+ }
+
+ @Override
+ public Conversion copy() {
+ return new Conversion(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/masterseditioniv/Detonate.java b/Mage.Sets/src/mage/sets/masterseditioniv/Detonate.java
new file mode 100644
index 00000000000..4fc34356daf
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/masterseditioniv/Detonate.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.masterseditioniv;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Detonate extends mage.sets.fifthedition.Detonate {
+
+ public Detonate(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 111;
+ this.expansionSetCode = "ME4";
+ }
+
+ public Detonate(final Detonate card) {
+ super(card);
+ }
+
+ @Override
+ public Detonate copy() {
+ return new Detonate(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/masterseditioniv/OrcishMechanics.java b/Mage.Sets/src/mage/sets/masterseditioniv/OrcishMechanics.java
new file mode 100644
index 00000000000..ffb1f92ce4e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/masterseditioniv/OrcishMechanics.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.masterseditioniv;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class OrcishMechanics extends mage.sets.antiquities.OrcishMechanics {
+
+ public OrcishMechanics(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 129;
+ this.expansionSetCode = "ME4";
+ this.rarity = Rarity.UNCOMMON;
+ }
+
+ public OrcishMechanics(final OrcishMechanics card) {
+ super(card);
+ }
+
+ @Override
+ public OrcishMechanics copy() {
+ return new OrcishMechanics(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/masterseditioniv/TawnossWeaponry.java b/Mage.Sets/src/mage/sets/masterseditioniv/TawnossWeaponry.java
new file mode 100644
index 00000000000..5552c3316d4
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/masterseditioniv/TawnossWeaponry.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.masterseditioniv;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class TawnossWeaponry extends mage.sets.fifthedition.TawnossWeaponry {
+
+ public TawnossWeaponry(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 232;
+ this.expansionSetCode = "ME4";
+ }
+
+ public TawnossWeaponry(final TawnossWeaponry card) {
+ super(card);
+ }
+
+ @Override
+ public TawnossWeaponry copy() {
+ return new TawnossWeaponry(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/masterseditioniv/TwoHeadedGiantOfForiys.java b/Mage.Sets/src/mage/sets/masterseditioniv/TwoHeadedGiantOfForiys.java
new file mode 100644
index 00000000000..2ae39054866
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/masterseditioniv/TwoHeadedGiantOfForiys.java
@@ -0,0 +1,67 @@
+/*
+ * 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.sets.masterseditioniv;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.common.combat.CanBlockAdditionalCreatureEffect;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class TwoHeadedGiantOfForiys extends CardImpl {
+
+ public TwoHeadedGiantOfForiys(UUID ownerId) {
+ super(ownerId, 139, "Two-Headed Giant of Foriys", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{4}{R}");
+ this.expansionSetCode = "ME4";
+ this.subtype.add("Giant");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(4);
+
+ // Trample
+ this.addAbility(TrampleAbility.getInstance());
+ // Two-Headed Giant of Foriys can block an additional creature.
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CanBlockAdditionalCreatureEffect()));
+ }
+
+ public TwoHeadedGiantOfForiys(final TwoHeadedGiantOfForiys card) {
+ super(card);
+ }
+
+ @Override
+ public TwoHeadedGiantOfForiys copy() {
+ return new TwoHeadedGiantOfForiys(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/masterseditioniv/WarpArtifact.java b/Mage.Sets/src/mage/sets/masterseditioniv/WarpArtifact.java
new file mode 100644
index 00000000000..d9dfb231282
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/masterseditioniv/WarpArtifact.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.masterseditioniv;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class WarpArtifact extends mage.sets.fifthedition.WarpArtifact {
+
+ public WarpArtifact(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 100;
+ this.expansionSetCode = "ME4";
+ this.rarity = Rarity.COMMON;
+ }
+
+ public WarpArtifact(final WarpArtifact card) {
+ super(card);
+ }
+
+ @Override
+ public WarpArtifact copy() {
+ return new WarpArtifact(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/masterseditioniv/WickedPact.java b/Mage.Sets/src/mage/sets/masterseditioniv/WickedPact.java
new file mode 100644
index 00000000000..50d791d1f02
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/masterseditioniv/WickedPact.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.masterseditioniv;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class WickedPact extends mage.sets.portal.WickedPact {
+
+ public WickedPact(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 102;
+ this.expansionSetCode = "ME4";
+ this.rarity = Rarity.UNCOMMON;
+ }
+
+ public WickedPact(final WickedPact card) {
+ super(card);
+ }
+
+ @Override
+ public WickedPact copy() {
+ return new WickedPact(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mediainserts/AeronautTinkerer.java b/Mage.Sets/src/mage/sets/mediainserts/AeronautTinkerer.java
new file mode 100644
index 00000000000..872d6eacf3c
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mediainserts/AeronautTinkerer.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.mediainserts;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class AeronautTinkerer extends mage.sets.magic2015.AeronautTinkerer {
+
+ public AeronautTinkerer(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 118;
+ this.expansionSetCode = "MBP";
+ }
+
+ public AeronautTinkerer(final AeronautTinkerer card) {
+ super(card);
+ }
+
+ @Override
+ public AeronautTinkerer copy() {
+ return new AeronautTinkerer(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mediainserts/ArashinSovereign.java b/Mage.Sets/src/mage/sets/mediainserts/ArashinSovereign.java
new file mode 100644
index 00000000000..58fb78efed5
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mediainserts/ArashinSovereign.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.mediainserts;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class ArashinSovereign extends mage.sets.dragonsoftarkir.ArashinSovereign {
+
+ public ArashinSovereign(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 112;
+ this.expansionSetCode = "MBP";
+ this.rarity = Rarity.SPECIAL;
+ }
+
+ public ArashinSovereign(final ArashinSovereign card) {
+ super(card);
+ }
+
+ @Override
+ public ArashinSovereign copy() {
+ return new ArashinSovereign(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mediainserts/ArchfiendOfDepravity.java b/Mage.Sets/src/mage/sets/mediainserts/ArchfiendOfDepravity.java
new file mode 100644
index 00000000000..0df29acf88d
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mediainserts/ArchfiendOfDepravity.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.mediainserts;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class ArchfiendOfDepravity extends mage.sets.fatereforged.ArchfiendOfDepravity {
+
+ public ArchfiendOfDepravity(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 109;
+ this.expansionSetCode = "MBP";
+ this.rarity = Rarity.SPECIAL;
+ }
+
+ public ArchfiendOfDepravity(final ArchfiendOfDepravity card) {
+ super(card);
+ }
+
+ @Override
+ public ArchfiendOfDepravity copy() {
+ return new ArchfiendOfDepravity(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mediainserts/BoltwingMarauder.java b/Mage.Sets/src/mage/sets/mediainserts/BoltwingMarauder.java
new file mode 100644
index 00000000000..575017da956
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mediainserts/BoltwingMarauder.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.mediainserts;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class BoltwingMarauder extends mage.sets.dragonsoftarkir.BoltwingMarauder {
+
+ public BoltwingMarauder(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 115;
+ this.expansionSetCode = "MBP";
+ this.rarity = Rarity.SPECIAL;
+ }
+
+ public BoltwingMarauder(final BoltwingMarauder card) {
+ super(card);
+ }
+
+ @Override
+ public BoltwingMarauder copy() {
+ return new BoltwingMarauder(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mediainserts/ChandraFireOfKaladesh.java b/Mage.Sets/src/mage/sets/mediainserts/ChandraFireOfKaladesh.java
new file mode 100644
index 00000000000..ccb17f9bdc8
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mediainserts/ChandraFireOfKaladesh.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.mediainserts;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class ChandraFireOfKaladesh extends mage.sets.magicorigins.ChandraFireOfKaladesh {
+
+ public ChandraFireOfKaladesh(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 127;
+ this.expansionSetCode = "MBP";
+ this.rarity = Rarity.SPECIAL;
+ }
+
+ public ChandraFireOfKaladesh(final ChandraFireOfKaladesh card) {
+ super(card);
+ }
+
+ @Override
+ public ChandraFireOfKaladesh copy() {
+ return new ChandraFireOfKaladesh(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mediainserts/ChandraRoaringFlame.java b/Mage.Sets/src/mage/sets/mediainserts/ChandraRoaringFlame.java
new file mode 100644
index 00000000000..6dd12eff6b3
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mediainserts/ChandraRoaringFlame.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.mediainserts;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class ChandraRoaringFlame extends mage.sets.magicorigins.ChandraRoaringFlame {
+
+ public ChandraRoaringFlame(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 127;
+ this.expansionSetCode = "MBP";
+ this.rarity = Rarity.SPECIAL;
+ }
+
+ public ChandraRoaringFlame(final ChandraRoaringFlame card) {
+ super(card);
+ }
+
+ @Override
+ public ChandraRoaringFlame copy() {
+ return new ChandraRoaringFlame(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mediainserts/DragonFodder.java b/Mage.Sets/src/mage/sets/mediainserts/DragonFodder.java
new file mode 100644
index 00000000000..c7dd1bcc48c
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mediainserts/DragonFodder.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.mediainserts;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class DragonFodder extends mage.sets.shardsofalara.DragonFodder {
+
+ public DragonFodder(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 119;
+ this.expansionSetCode = "MBP";
+ }
+
+ public DragonFodder(final DragonFodder card) {
+ super(card);
+ }
+
+ @Override
+ public DragonFodder copy() {
+ return new DragonFodder(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mediainserts/DragonlordsServant.java b/Mage.Sets/src/mage/sets/mediainserts/DragonlordsServant.java
new file mode 100644
index 00000000000..2e017e7ab44
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mediainserts/DragonlordsServant.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.mediainserts;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class DragonlordsServant extends mage.sets.dragonsoftarkir.DragonlordsServant {
+
+ public DragonlordsServant(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 120;
+ this.expansionSetCode = "MBP";
+ this.rarity = Rarity.SPECIAL;
+ }
+
+ public DragonlordsServant(final DragonlordsServant card) {
+ super(card);
+ }
+
+ @Override
+ public DragonlordsServant copy() {
+ return new DragonlordsServant(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mediainserts/DragonscaleGeneral.java b/Mage.Sets/src/mage/sets/mediainserts/DragonscaleGeneral.java
new file mode 100644
index 00000000000..fcdf0a9354e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mediainserts/DragonscaleGeneral.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.mediainserts;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class DragonscaleGeneral extends mage.sets.fatereforged.DragonscaleGeneral {
+
+ public DragonscaleGeneral(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 107;
+ this.expansionSetCode = "MBP";
+ this.rarity = Rarity.SPECIAL;
+ }
+
+ public DragonscaleGeneral(final DragonscaleGeneral card) {
+ super(card);
+ }
+
+ @Override
+ public DragonscaleGeneral copy() {
+ return new DragonscaleGeneral(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mediainserts/EvolvingWilds.java b/Mage.Sets/src/mage/sets/mediainserts/EvolvingWilds.java
new file mode 100644
index 00000000000..d921ecdf4dc
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mediainserts/EvolvingWilds.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.mediainserts;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class EvolvingWilds extends mage.sets.riseoftheeldrazi.EvolvingWilds {
+
+ public EvolvingWilds(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 121;
+ this.expansionSetCode = "MBP";
+ }
+
+ public EvolvingWilds(final EvolvingWilds card) {
+ super(card);
+ }
+
+ @Override
+ public EvolvingWilds copy() {
+ return new EvolvingWilds(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mediainserts/FlamerushRider.java b/Mage.Sets/src/mage/sets/mediainserts/FlamerushRider.java
new file mode 100644
index 00000000000..e005213db30
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mediainserts/FlamerushRider.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.mediainserts;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class FlamerushRider extends mage.sets.fatereforged.FlamerushRider {
+
+ public FlamerushRider(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 110;
+ this.expansionSetCode = "MBP";
+ this.rarity = Rarity.SPECIAL;
+ }
+
+ public FlamerushRider(final FlamerushRider card) {
+ super(card);
+ }
+
+ @Override
+ public FlamerushRider copy() {
+ return new FlamerushRider(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mediainserts/FoeRazerRegent.java b/Mage.Sets/src/mage/sets/mediainserts/FoeRazerRegent.java
new file mode 100644
index 00000000000..bde27d9ff55
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mediainserts/FoeRazerRegent.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.mediainserts;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class FoeRazerRegent extends mage.sets.dragonsoftarkir.FoeRazerRegent {
+
+ public FoeRazerRegent(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 122;
+ this.expansionSetCode = "MBP";
+ this.rarity = Rarity.SPECIAL;
+ }
+
+ public FoeRazerRegent(final FoeRazerRegent card) {
+ super(card);
+ }
+
+ @Override
+ public FoeRazerRegent copy() {
+ return new FoeRazerRegent(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mediainserts/GideonBattleForged.java b/Mage.Sets/src/mage/sets/mediainserts/GideonBattleForged.java
new file mode 100644
index 00000000000..785e67304d1
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mediainserts/GideonBattleForged.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.mediainserts;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class GideonBattleForged extends mage.sets.magicorigins.GideonBattleForged {
+
+ public GideonBattleForged(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 124;
+ this.expansionSetCode = "MBP";
+ this.rarity = Rarity.SPECIAL;
+ }
+
+ public GideonBattleForged(final GideonBattleForged card) {
+ super(card);
+ }
+
+ @Override
+ public GideonBattleForged copy() {
+ return new GideonBattleForged(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mediainserts/HarbingerOfTheHunt.java b/Mage.Sets/src/mage/sets/mediainserts/HarbingerOfTheHunt.java
new file mode 100644
index 00000000000..d084f6b9cca
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mediainserts/HarbingerOfTheHunt.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.mediainserts;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class HarbingerOfTheHunt extends mage.sets.dragonsoftarkir.HarbingerOfTheHunt {
+
+ public HarbingerOfTheHunt(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 116;
+ this.expansionSetCode = "MBP";
+ this.rarity = Rarity.SPECIAL;
+ }
+
+ public HarbingerOfTheHunt(final HarbingerOfTheHunt card) {
+ super(card);
+ }
+
+ @Override
+ public HarbingerOfTheHunt copy() {
+ return new HarbingerOfTheHunt(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mediainserts/JaceTelepathUnbound.java b/Mage.Sets/src/mage/sets/mediainserts/JaceTelepathUnbound.java
new file mode 100644
index 00000000000..7e1084a51f7
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mediainserts/JaceTelepathUnbound.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.mediainserts;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class JaceTelepathUnbound extends mage.sets.magicorigins.JaceTelepathUnbound {
+
+ public JaceTelepathUnbound(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 125;
+ this.expansionSetCode = "MBP";
+ this.rarity = Rarity.SPECIAL;
+ }
+
+ public JaceTelepathUnbound(final JaceTelepathUnbound card) {
+ super(card);
+ }
+
+ @Override
+ public JaceTelepathUnbound copy() {
+ return new JaceTelepathUnbound(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mediainserts/JaceVrynsProdigy.java b/Mage.Sets/src/mage/sets/mediainserts/JaceVrynsProdigy.java
new file mode 100644
index 00000000000..dae017224c7
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mediainserts/JaceVrynsProdigy.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.mediainserts;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class JaceVrynsProdigy extends mage.sets.magicorigins.JaceVrynsProdigy {
+
+ public JaceVrynsProdigy(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 125;
+ this.expansionSetCode = "MBP";
+ this.rarity = Rarity.SPECIAL;
+ }
+
+ public JaceVrynsProdigy(final JaceVrynsProdigy card) {
+ super(card);
+ }
+
+ @Override
+ public JaceVrynsProdigy copy() {
+ return new JaceVrynsProdigy(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mediainserts/KytheonHeroOfAkros.java b/Mage.Sets/src/mage/sets/mediainserts/KytheonHeroOfAkros.java
new file mode 100644
index 00000000000..49f8b6f13e3
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mediainserts/KytheonHeroOfAkros.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.mediainserts;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class KytheonHeroOfAkros extends mage.sets.magicorigins.KytheonHeroOfAkros {
+
+ public KytheonHeroOfAkros(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 124;
+ this.expansionSetCode = "MBP";
+ this.rarity = Rarity.SPECIAL;
+ }
+
+ public KytheonHeroOfAkros(final KytheonHeroOfAkros card) {
+ super(card);
+ }
+
+ @Override
+ public KytheonHeroOfAkros copy() {
+ return new KytheonHeroOfAkros(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mediainserts/LilianaDefiantNecromancer.java b/Mage.Sets/src/mage/sets/mediainserts/LilianaDefiantNecromancer.java
new file mode 100644
index 00000000000..455dae6edc6
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mediainserts/LilianaDefiantNecromancer.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.mediainserts;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class LilianaDefiantNecromancer extends mage.sets.magicorigins.LilianaDefiantNecromancer {
+
+ public LilianaDefiantNecromancer(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 126;
+ this.expansionSetCode = "MBP";
+ this.rarity = Rarity.SPECIAL;
+ }
+
+ public LilianaDefiantNecromancer(final LilianaDefiantNecromancer card) {
+ super(card);
+ }
+
+ @Override
+ public LilianaDefiantNecromancer copy() {
+ return new LilianaDefiantNecromancer(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mediainserts/LilianaHereticalHealer.java b/Mage.Sets/src/mage/sets/mediainserts/LilianaHereticalHealer.java
new file mode 100644
index 00000000000..c9c611d459e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mediainserts/LilianaHereticalHealer.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.mediainserts;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class LilianaHereticalHealer extends mage.sets.magicorigins.LilianaHereticalHealer {
+
+ public LilianaHereticalHealer(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 126;
+ this.expansionSetCode = "MBP";
+ this.rarity = Rarity.SPECIAL;
+ }
+
+ public LilianaHereticalHealer(final LilianaHereticalHealer card) {
+ super(card);
+ }
+
+ @Override
+ public LilianaHereticalHealer copy() {
+ return new LilianaHereticalHealer(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mediainserts/NecromasterDragon.java b/Mage.Sets/src/mage/sets/mediainserts/NecromasterDragon.java
new file mode 100644
index 00000000000..919494239c3
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mediainserts/NecromasterDragon.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.mediainserts;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class NecromasterDragon extends mage.sets.dragonsoftarkir.NecromasterDragon {
+
+ public NecromasterDragon(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 114;
+ this.expansionSetCode = "MBP";
+ this.rarity = Rarity.SPECIAL;
+ }
+
+ public NecromasterDragon(final NecromasterDragon card) {
+ super(card);
+ }
+
+ @Override
+ public NecromasterDragon copy() {
+ return new NecromasterDragon(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mediainserts/NissaSageAnimist.java b/Mage.Sets/src/mage/sets/mediainserts/NissaSageAnimist.java
new file mode 100644
index 00000000000..a002b3b2d74
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mediainserts/NissaSageAnimist.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.mediainserts;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class NissaSageAnimist extends mage.sets.magicorigins.NissaSageAnimist {
+
+ public NissaSageAnimist(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 128;
+ this.expansionSetCode = "MBP";
+ this.rarity = Rarity.SPECIAL;
+ }
+
+ public NissaSageAnimist(final NissaSageAnimist card) {
+ super(card);
+ }
+
+ @Override
+ public NissaSageAnimist copy() {
+ return new NissaSageAnimist(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mediainserts/NissaVastwoodSeer.java b/Mage.Sets/src/mage/sets/mediainserts/NissaVastwoodSeer.java
new file mode 100644
index 00000000000..90661eda135
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mediainserts/NissaVastwoodSeer.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.mediainserts;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class NissaVastwoodSeer extends mage.sets.magicorigins.NissaVastwoodSeer {
+
+ public NissaVastwoodSeer(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 128;
+ this.expansionSetCode = "MBP";
+ this.rarity = Rarity.SPECIAL;
+ }
+
+ public NissaVastwoodSeer(final NissaVastwoodSeer card) {
+ super(card);
+ }
+
+ @Override
+ public NissaVastwoodSeer copy() {
+ return new NissaVastwoodSeer(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mediainserts/PristineSkywise.java b/Mage.Sets/src/mage/sets/mediainserts/PristineSkywise.java
new file mode 100644
index 00000000000..bc1e7f07476
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mediainserts/PristineSkywise.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.mediainserts;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class PristineSkywise extends mage.sets.dragonsoftarkir.PristineSkywise {
+
+ public PristineSkywise(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 113;
+ this.expansionSetCode = "MBP";
+ this.rarity = Rarity.SPECIAL;
+ }
+
+ public PristineSkywise(final PristineSkywise card) {
+ super(card);
+ }
+
+ @Override
+ public PristineSkywise copy() {
+ return new PristineSkywise(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mediainserts/RelicSeeker.java b/Mage.Sets/src/mage/sets/mediainserts/RelicSeeker.java
index bf67641740e..cd117abe57b 100644
--- a/Mage.Sets/src/mage/sets/mediainserts/RelicSeeker.java
+++ b/Mage.Sets/src/mage/sets/mediainserts/RelicSeeker.java
@@ -1,55 +1,55 @@
-/*
- * 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.sets.mediainserts;
-
-import java.util.UUID;
-import mage.constants.Rarity;
-
-/**
- *
- * @author LevelX2
- */
-public class RelicSeeker extends mage.sets.magicorigins.RelicSeeker {
-
- public RelicSeeker(UUID ownerId) {
- super(ownerId);
- this.cardNumber = 107;
- this.expansionSetCode = "MBP";
- this.rarity = Rarity.RARE;
-
- }
-
- public RelicSeeker(final RelicSeeker card) {
- super(card);
- }
-
- @Override
- public RelicSeeker copy() {
- return new RelicSeeker(this);
- }
-}
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.mediainserts;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class RelicSeeker extends mage.sets.magicorigins.RelicSeeker {
+
+ public RelicSeeker(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 123;
+ this.expansionSetCode = "MBP";
+ this.rarity = Rarity.RARE;
+
+ }
+
+ public RelicSeeker(final RelicSeeker card) {
+ super(card);
+ }
+
+ @Override
+ public RelicSeeker copy() {
+ return new RelicSeeker(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mediainserts/RuinousPath.java b/Mage.Sets/src/mage/sets/mediainserts/RuinousPath.java
new file mode 100644
index 00000000000..317fed6ec02
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mediainserts/RuinousPath.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.mediainserts;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class RuinousPath extends mage.sets.battleforzendikar.RuinousPath {
+
+ public RuinousPath(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 129;
+ this.expansionSetCode = "MBP";
+ this.rarity = Rarity.SPECIAL;
+ }
+
+ public RuinousPath(final RuinousPath card) {
+ super(card);
+ }
+
+ @Override
+ public RuinousPath copy() {
+ return new RuinousPath(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mediainserts/SageEyeAvengers.java b/Mage.Sets/src/mage/sets/mediainserts/SageEyeAvengers.java
new file mode 100644
index 00000000000..004ee5eec53
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mediainserts/SageEyeAvengers.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.mediainserts;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class SageEyeAvengers extends mage.sets.fatereforged.SageEyeAvengers {
+
+ public SageEyeAvengers(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 108;
+ this.expansionSetCode = "MBP";
+ this.rarity = Rarity.SPECIAL;
+ }
+
+ public SageEyeAvengers(final SageEyeAvengers card) {
+ super(card);
+ }
+
+ @Override
+ public SageEyeAvengers copy() {
+ return new SageEyeAvengers(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mediainserts/ScytheLeopard.java b/Mage.Sets/src/mage/sets/mediainserts/ScytheLeopard.java
new file mode 100644
index 00000000000..ebc04fcffca
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mediainserts/ScytheLeopard.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.mediainserts;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class ScytheLeopard extends mage.sets.battleforzendikar.ScytheLeopard {
+
+ public ScytheLeopard(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 130;
+ this.expansionSetCode = "MBP";
+ this.rarity = Rarity.SPECIAL;
+ }
+
+ public ScytheLeopard(final ScytheLeopard card) {
+ super(card);
+ }
+
+ @Override
+ public ScytheLeopard copy() {
+ return new ScytheLeopard(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mediainserts/SultaiCharm.java b/Mage.Sets/src/mage/sets/mediainserts/SultaiCharm.java
new file mode 100644
index 00000000000..31421bc84ea
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mediainserts/SultaiCharm.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.mediainserts;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class SultaiCharm extends mage.sets.khansoftarkir.SultaiCharm {
+
+ public SultaiCharm(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 117;
+ this.expansionSetCode = "MBP";
+ this.rarity = Rarity.SPECIAL;
+ }
+
+ public SultaiCharm(final SultaiCharm card) {
+ super(card);
+ }
+
+ @Override
+ public SultaiCharm copy() {
+ return new SultaiCharm(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mediainserts/TemurWarShaman.java b/Mage.Sets/src/mage/sets/mediainserts/TemurWarShaman.java
new file mode 100644
index 00000000000..f7a8e287ae1
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mediainserts/TemurWarShaman.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.mediainserts;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class TemurWarShaman extends mage.sets.fatereforged.TemurWarShaman {
+
+ public TemurWarShaman(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 111;
+ this.expansionSetCode = "MBP";
+ this.rarity = Rarity.SPECIAL;
+ }
+
+ public TemurWarShaman(final TemurWarShaman card) {
+ super(card);
+ }
+
+ @Override
+ public TemurWarShaman copy() {
+ return new TemurWarShaman(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mirage/Brushwagg.java b/Mage.Sets/src/mage/sets/mirage/Brushwagg.java
new file mode 100644
index 00000000000..9881a68a2a4
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mirage/Brushwagg.java
@@ -0,0 +1,64 @@
+/*
+ * 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.sets.mirage;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.BlocksOrBecomesBlockedTriggeredAbility;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Brushwagg extends CardImpl {
+
+ public Brushwagg(UUID ownerId) {
+ super(ownerId, 106, "Brushwagg", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{G}{G}");
+ this.expansionSetCode = "MIR";
+ this.subtype.add("Brushwagg");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(2);
+
+ // Whenever Brushwagg blocks or becomes blocked, it gets -2/+2 until end of turn.
+ this.addAbility(new BlocksOrBecomesBlockedTriggeredAbility(new BoostSourceEffect(-2, 2, Duration.EndOfTurn), false));
+ }
+
+ public Brushwagg(final Brushwagg card) {
+ super(card);
+ }
+
+ @Override
+ public Brushwagg copy() {
+ return new Brushwagg(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mirage/CoralFighters.java b/Mage.Sets/src/mage/sets/mirage/CoralFighters.java
new file mode 100644
index 00000000000..2d1c89dcf63
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mirage/CoralFighters.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.mirage;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class CoralFighters extends mage.sets.venservskoth.CoralFighters {
+
+ public CoralFighters(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 59;
+ this.expansionSetCode = "MIR";
+ }
+
+ public CoralFighters(final CoralFighters card) {
+ super(card);
+ }
+
+ @Override
+ public CoralFighters copy() {
+ return new CoralFighters(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mirage/CryptCobra.java b/Mage.Sets/src/mage/sets/mirage/CryptCobra.java
new file mode 100644
index 00000000000..95459bda11f
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mirage/CryptCobra.java
@@ -0,0 +1,66 @@
+/*
+ * 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.sets.mirage;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.AttacksAndIsNotBlockedTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.counter.AddPoisonCounterTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class CryptCobra extends CardImpl {
+
+ public CryptCobra(UUID ownerId) {
+ super(ownerId, 12, "Crypt Cobra", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{B}");
+ this.expansionSetCode = "MIR";
+ this.subtype.add("Snake");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // Whenever Crypt Cobra attacks and isn't blocked, defending player gets a poison counter.
+ Effect effect = new AddPoisonCounterTargetEffect(1);
+ effect.setText("defending player gets a poison counter");
+ this.addAbility(new AttacksAndIsNotBlockedTriggeredAbility(effect, false, true));
+ }
+
+ public CryptCobra(final CryptCobra card) {
+ super(card);
+ }
+
+ @Override
+ public CryptCobra copy() {
+ return new CryptCobra(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mirage/HorribleHordes.java b/Mage.Sets/src/mage/sets/mirage/HorribleHordes.java
new file mode 100644
index 00000000000..e51cb4f7ecb
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mirage/HorribleHordes.java
@@ -0,0 +1,62 @@
+/*
+ * 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.sets.mirage;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.keyword.RampageAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class HorribleHordes extends CardImpl {
+
+ public HorribleHordes(UUID ownerId) {
+ super(ownerId, 269, "Horrible Hordes", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{3}");
+ this.expansionSetCode = "MIR";
+ this.subtype.add("Spirit");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Rampage 1
+ this.addAbility(new RampageAbility(1));
+ }
+
+ public HorribleHordes(final HorribleHordes card) {
+ super(card);
+ }
+
+ @Override
+ public HorribleHordes copy() {
+ return new HorribleHordes(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mirage/MerfolkSeer.java b/Mage.Sets/src/mage/sets/mirage/MerfolkSeer.java
new file mode 100644
index 00000000000..08d85b6ecf7
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mirage/MerfolkSeer.java
@@ -0,0 +1,66 @@
+/*
+ * 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.sets.mirage;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.DiesTriggeredAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.DoIfCostPaid;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class MerfolkSeer extends CardImpl {
+
+ public MerfolkSeer(UUID ownerId) {
+ super(ownerId, 76, "Merfolk Seer", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{U}");
+ this.expansionSetCode = "MIR";
+ this.subtype.add("Merfolk");
+ this.subtype.add("Wizard");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // When Merfolk Seer dies, you may pay {1}{U}. If you do, draw a card.
+ this.addAbility(new DiesTriggeredAbility(new DoIfCostPaid(new DrawCardSourceControllerEffect(1), new ManaCostsImpl("{1}{U}"))));
+ }
+
+ public MerfolkSeer(final MerfolkSeer card) {
+ super(card);
+ }
+
+ @Override
+ public MerfolkSeer copy() {
+ return new MerfolkSeer(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mirage/NettletoothDjinn.java b/Mage.Sets/src/mage/sets/mirage/NettletoothDjinn.java
new file mode 100644
index 00000000000..c14f72308f1
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mirage/NettletoothDjinn.java
@@ -0,0 +1,63 @@
+/*
+ * 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.sets.mirage;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
+import mage.abilities.effects.common.DamageControllerEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class NettletoothDjinn extends CardImpl {
+
+ public NettletoothDjinn(UUID ownerId) {
+ super(ownerId, 130, "Nettletooth Djinn", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{G}");
+ this.expansionSetCode = "MIR";
+ this.subtype.add("Djinn");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(4);
+
+ // At the beginning of your upkeep, Nettletooth Djinn deals 1 damage to you.
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(new DamageControllerEffect(1), TargetController.YOU, false)); }
+
+ public NettletoothDjinn(final NettletoothDjinn card) {
+ super(card);
+ }
+
+ @Override
+ public NettletoothDjinn copy() {
+ return new NettletoothDjinn(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mirage/TeekasDragon.java b/Mage.Sets/src/mage/sets/mirage/TeekasDragon.java
new file mode 100644
index 00000000000..80f95a882b0
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mirage/TeekasDragon.java
@@ -0,0 +1,68 @@
+/*
+ * 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.sets.mirage;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.keyword.FlyingAbility;
+import mage.abilities.keyword.RampageAbility;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class TeekasDragon extends CardImpl {
+
+ public TeekasDragon(UUID ownerId) {
+ super(ownerId, 285, "Teeka's Dragon", Rarity.RARE, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{9}");
+ this.expansionSetCode = "MIR";
+ this.subtype.add("Dragon");
+ this.power = new MageInt(5);
+ this.toughness = new MageInt(5);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+ // trample
+ this.addAbility(TrampleAbility.getInstance());
+ // rampage 4
+ this.addAbility(new RampageAbility(4));
+ }
+
+ public TeekasDragon(final TeekasDragon card) {
+ super(card);
+ }
+
+ @Override
+ public TeekasDragon copy() {
+ return new TeekasDragon(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mirrodin/ChaliceOfTheVoid.java b/Mage.Sets/src/mage/sets/mirrodin/ChaliceOfTheVoid.java
index e36d852e5ba..afab045802d 100644
--- a/Mage.Sets/src/mage/sets/mirrodin/ChaliceOfTheVoid.java
+++ b/Mage.Sets/src/mage/sets/mirrodin/ChaliceOfTheVoid.java
@@ -88,10 +88,11 @@ class ChaliceOfTheVoidEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null) {
- Object obj = getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
- if (obj != null && obj instanceof SpellAbility
- && permanent.getZoneChangeCounter(game) - 1 == ((SpellAbility) obj).getSourceObjectZoneChangeCounter()) {
- int amount = ((SpellAbility) obj).getManaCostsToPay().getX();
+ SpellAbility spellAbility = (SpellAbility) getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
+ if (spellAbility != null
+ && spellAbility.getSourceId().equals(source.getSourceId())
+ && permanent.getZoneChangeCounter(game) - 1 == spellAbility.getSourceObjectZoneChangeCounter()) {
+ int amount = spellAbility.getManaCostsToPay().getX();
if (amount > 0) {
permanent.addCounters(CounterType.CHARGE.createInstance(amount), game);
}
diff --git a/Mage.Sets/src/mage/sets/mirrodin/Detonate.java b/Mage.Sets/src/mage/sets/mirrodin/Detonate.java
new file mode 100644
index 00000000000..3a24b785993
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mirrodin/Detonate.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.mirrodin;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Detonate extends mage.sets.fifthedition.Detonate {
+
+ public Detonate(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 88;
+ this.expansionSetCode = "MRD";
+ }
+
+ public Detonate(final Detonate card) {
+ super(card);
+ }
+
+ @java.lang.Override
+ public Detonate copy() {
+ return new Detonate(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mirrodin/DrossScorpion.java b/Mage.Sets/src/mage/sets/mirrodin/DrossScorpion.java
new file mode 100644
index 00000000000..727d367e7f9
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/mirrodin/DrossScorpion.java
@@ -0,0 +1,75 @@
+/*
+ * 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.sets.mirrodin;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.DiesThisOrAnotherCreatureTriggeredAbility;
+import mage.abilities.effects.common.UntapTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.CardTypePredicate;
+import mage.target.common.TargetArtifactPermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class DrossScorpion extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("artifact creature");
+
+ static {
+ filter.add(new CardTypePredicate(CardType.ARTIFACT));
+ }
+
+ public DrossScorpion(UUID ownerId) {
+ super(ownerId, 164, "Dross Scorpion", Rarity.COMMON, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{4}");
+ this.expansionSetCode = "MRD";
+ this.subtype.add("Scorpion");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(1);
+
+ // Whenever Dross Scorpion or another artifact creature dies, you may untap target artifact.
+ Ability ability = new DiesThisOrAnotherCreatureTriggeredAbility(new UntapTargetEffect(), true, filter);
+ ability.addTarget(new TargetArtifactPermanent());
+ this.addAbility(ability);
+ }
+
+ public DrossScorpion(final DrossScorpion card) {
+ super(card);
+ }
+
+ @java.lang.Override
+ public DrossScorpion copy() {
+ return new DrossScorpion(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/mirrodinbesieged/Cryptoplasm.java b/Mage.Sets/src/mage/sets/mirrodinbesieged/Cryptoplasm.java
index 64202e88ca3..083bee110ab 100644
--- a/Mage.Sets/src/mage/sets/mirrodinbesieged/Cryptoplasm.java
+++ b/Mage.Sets/src/mage/sets/mirrodinbesieged/Cryptoplasm.java
@@ -25,17 +25,20 @@
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
-
package mage.sets.mirrodinbesieged;
-import mage.constants.CardType;
-import mage.constants.Rarity;
+import java.util.UUID;
import mage.MageInt;
+import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
-import mage.abilities.effects.ContinuousEffectImpl;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.CopyEffect;
import mage.cards.CardImpl;
-import mage.constants.*;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.permanent.AnotherPredicate;
import mage.game.Game;
@@ -43,12 +46,11 @@ import mage.game.permanent.Permanent;
import mage.target.common.TargetCreaturePermanent;
import mage.util.functions.ApplyToPermanent;
-import java.util.UUID;
-
/**
* @author Loki
*/
public class Cryptoplasm extends CardImpl {
+
final static FilterCreaturePermanent filter = new FilterCreaturePermanent();
static {
@@ -64,7 +66,7 @@ public class Cryptoplasm extends CardImpl {
this.toughness = new MageInt(2);
// At the beginning of your upkeep, you may have Cryptoplasm become a copy of another target creature. If you do, Cryptoplasm gains this ability.
- Ability ability = new BeginningOfUpkeepTriggeredAbility(new CryptoplasmTransformEffect(), TargetController.YOU, true);
+ Ability ability = new BeginningOfUpkeepTriggeredAbility(new CryptoplasmEffect(), TargetController.YOU, true);
ability.addTarget(new TargetCreaturePermanent(filter));
this.addAbility(ability);
}
@@ -80,43 +82,48 @@ public class Cryptoplasm extends CardImpl {
}
-class CryptoplasmTransformEffect extends ContinuousEffectImpl {
+class CryptoplasmEffect extends OneShotEffect {
- CryptoplasmTransformEffect() {
- super(Duration.WhileOnBattlefield, Layer.CopyEffects_1, SubLayer.NA, Outcome.Copy);
- staticText = "you may have {this} become a copy of another target creature. If you do, {this} gains this ability";
+ public CryptoplasmEffect() {
+ super(Outcome.Copy);
+ this.staticText = "you may have {this} become a copy of another target creature. If you do, {this} gains this ability";
}
- CryptoplasmTransformEffect(final CryptoplasmTransformEffect effect) {
+ public CryptoplasmEffect(final CryptoplasmEffect effect) {
super(effect);
}
@Override
- public boolean apply(Game game, final Ability source) {
- Permanent creature = game.getPermanent(targetPointer.getFirst(game, source));
- Permanent permanent = game.getPermanent(source.getSourceId());
-
- if (creature == null || permanent == null) {
- return false;
- }
-
- game.copyPermanent(creature, permanent, source, new ApplyToPermanent() {
- @Override
- public Boolean apply(Game game, Permanent permanent) {
- Ability upkeepAbility = new BeginningOfUpkeepTriggeredAbility(new CryptoplasmTransformEffect(), TargetController.YOU, true);
- upkeepAbility.addTarget(new TargetCreaturePermanent());
- permanent.addAbility(upkeepAbility, source.getSourceId(), game);
- return true;
- }
- });
-
-
- return true;
+ public CryptoplasmEffect copy() {
+ return new CryptoplasmEffect(this);
}
@Override
- public CryptoplasmTransformEffect copy() {
- return new CryptoplasmTransformEffect(this);
- }
+ public boolean apply(Game game, final Ability source) {
+ Permanent creatureToCopy = game.getPermanent(getTargetPointer().getFirst(game, source));
+ if (creatureToCopy != null) {
+ CopyEffect effect = new CopyEffect(creatureToCopy, source.getSourceId());
+ effect.setApplier(new ApplyToPermanent() {
+ @Override
+ public Boolean apply(Game game, Permanent permanent) {
+ Ability upkeepAbility = new BeginningOfUpkeepTriggeredAbility(new CryptoplasmEffect(), TargetController.YOU, true);
+ upkeepAbility.addTarget(new TargetCreaturePermanent());
+ permanent.addAbility(upkeepAbility, source.getSourceId(), game);
+ return true;
+ }
+ @Override
+ public Boolean apply(Game game, MageObject mageObject) {
+ Ability upkeepAbility = new BeginningOfUpkeepTriggeredAbility(new CryptoplasmEffect(), TargetController.YOU, true);
+ upkeepAbility.addTarget(new TargetCreaturePermanent());
+ mageObject.getAbilities().add(upkeepAbility);
+ return true;
+ }
+
+ });
+ game.addEffect(effect, source);
+
+ }
+ return true;
+ }
}
diff --git a/Mage.Sets/src/mage/sets/modernmasters2015/WorldheartPhoenix.java b/Mage.Sets/src/mage/sets/modernmasters2015/WorldheartPhoenix.java
index 3eb2340d635..31277520f32 100644
--- a/Mage.Sets/src/mage/sets/modernmasters2015/WorldheartPhoenix.java
+++ b/Mage.Sets/src/mage/sets/modernmasters2015/WorldheartPhoenix.java
@@ -136,11 +136,12 @@ public class WorldheartPhoenix extends CardImpl {
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null) {
- Object obj = getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
- if (obj != null && obj instanceof SpellAbility
- && permanent.getZoneChangeCounter(game) - 1 == ((SpellAbility) obj).getSourceObjectZoneChangeCounter()) {
+ SpellAbility spellAbility = (SpellAbility) getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
+ if (spellAbility != null
+ && spellAbility.getSourceId().equals(source.getSourceId())
+ && permanent.getZoneChangeCounter(game) - 1 == spellAbility.getSourceObjectZoneChangeCounter()) {
// TODO: No perfect solution because there could be other effects that allow to cast the card for this mana cost
- if (((SpellAbility) obj).getManaCosts().getText().equals("{W}{U}{B}{R}{G}")) {
+ if (spellAbility.getManaCosts().getText().equals("{W}{U}{B}{R}{G}")) {
permanent.addCounters(CounterType.P1P1.createInstance(2), game);
}
}
diff --git a/Mage.Sets/src/mage/sets/morningtide/GrimoireThief.java b/Mage.Sets/src/mage/sets/morningtide/GrimoireThief.java
new file mode 100644
index 00000000000..47338c04dea
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/morningtide/GrimoireThief.java
@@ -0,0 +1,253 @@
+/*
+ * 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.sets.morningtide;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.UUID;
+import mage.MageInt;
+import mage.MageObject;
+import mage.abilities.Ability;
+import mage.abilities.common.BecomesTappedTriggeredAbility;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.costs.common.SacrificeSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.AsThoughEffectImpl;
+import mage.abilities.effects.OneShotEffect;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.cards.Cards;
+import mage.cards.CardsImpl;
+import mage.cards.SplitCard;
+import mage.constants.AsThoughEffectType;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.game.ExileZone;
+import mage.game.Game;
+import mage.game.stack.Spell;
+import mage.game.stack.StackObject;
+import mage.players.Player;
+import mage.target.common.TargetOpponent;
+import mage.util.CardUtil;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class GrimoireThief extends CardImpl {
+
+ protected static final String VALUE_PREFIX = "ExileZones";
+
+ public GrimoireThief(UUID ownerId) {
+ super(ownerId, 35, "Grimoire Thief", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{U}{U}");
+ this.expansionSetCode = "MOR";
+ this.subtype.add("Merfolk");
+ this.subtype.add("Rogue");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Whenever Grimoire Thief becomes tapped, exile the top three cards of target opponent's library face down.
+ Ability ability = new BecomesTappedTriggeredAbility(new GrimoireThiefExileEffect(), false);
+ ability.addTarget(new TargetOpponent());
+ this.addAbility(ability);
+
+ // You may look at cards exiled with Grimoire Thief.
+ this.addAbility(new SimpleStaticAbility(Zone.ALL, new GrimoireThiefLookEffect()));
+
+ // {U}, Sacrifice Grimoire Thief: Turn all cards exiled with Grimoire Thief face up. Counter all spells with those names.
+ Ability ability2 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GrimoireThiefCounterspellEffect(), new ManaCostsImpl("{U}"));
+ ability2.addCost(new SacrificeSourceCost());
+ this.addAbility(ability2);
+
+ }
+
+ public GrimoireThief(final GrimoireThief card) {
+ super(card);
+ }
+
+ @Override
+ public GrimoireThief copy() {
+ return new GrimoireThief(this);
+ }
+}
+
+class GrimoireThiefExileEffect extends OneShotEffect {
+
+ public GrimoireThiefExileEffect() {
+ super(Outcome.Discard);
+ staticText = "exile the top three cards of target opponent's library face down";
+ }
+
+ public GrimoireThiefExileEffect(final GrimoireThiefExileEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player targetOpponent = game.getPlayer(source.getFirstTarget());
+ if (targetOpponent != null) {
+ Set cards = targetOpponent.getLibrary().getTopCards(game, 3);
+ MageObject sourceObject = source.getSourceObject(game);
+ if (!cards.isEmpty() && sourceObject != null) {
+ for (Card card : cards) {
+ card.setFaceDown(true, game);
+ }
+ UUID exileZoneId = CardUtil.getExileZoneId(game, source.getSourceId(), source.getSourceObjectZoneChangeCounter());
+ targetOpponent.moveCardsToExile(cards, source, game, false, exileZoneId, sourceObject.getIdName());
+ for (Card card : cards) {
+ card.setFaceDown(true, game);
+ }
+ Set exileZones = (Set) game.getState().getValue(GrimoireThief.VALUE_PREFIX + source.getSourceId().toString());
+ if (exileZones == null) {
+ exileZones = new HashSet<>();
+ game.getState().setValue(GrimoireThief.VALUE_PREFIX + source.getSourceId().toString(), exileZones);
+ }
+ exileZones.add(exileZoneId);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public GrimoireThiefExileEffect copy() {
+ return new GrimoireThiefExileEffect(this);
+ }
+}
+
+class GrimoireThiefLookEffect extends AsThoughEffectImpl {
+
+ public GrimoireThiefLookEffect() {
+ super(AsThoughEffectType.LOOK_AT_FACE_DOWN, Duration.EndOfGame, Outcome.Benefit);
+ staticText = "You may look at the cards exiled with {this}";
+ }
+
+ public GrimoireThiefLookEffect(final GrimoireThiefLookEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ return true;
+ }
+
+ @Override
+ public GrimoireThiefLookEffect copy() {
+ return new GrimoireThiefLookEffect(this);
+ }
+
+ @Override
+ public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) {
+ if (affectedControllerId.equals(source.getControllerId()) && game.getState().getZone(objectId).equals(Zone.EXILED)) {
+ Player controller = game.getPlayer(source.getControllerId());
+ MageObject sourceObject = source.getSourceObject(game);
+ if (controller != null && sourceObject != null) {
+ Card card = game.getCard(objectId);
+ if (card != null && card.isFaceDown(game)) {
+ Set exileZones = (Set) game.getState().getValue(GrimoireThief.VALUE_PREFIX + source.getSourceId().toString());
+ if (exileZones != null) {
+ for (ExileZone exileZone : game.getExile().getExileZones()) {
+ if (exileZone.contains(objectId)) {
+ if (!exileZones.contains(exileZone.getId())) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+}
+
+class GrimoireThiefCounterspellEffect extends OneShotEffect {
+
+ public GrimoireThiefCounterspellEffect() {
+ super(Outcome.Discard);
+ staticText = "Turn all cards exiled with {this} face up. Counter all spells with those names";
+ }
+
+ public GrimoireThiefCounterspellEffect(final GrimoireThiefCounterspellEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Cards cards = new CardsImpl();
+ MageObject sourceObject = game.getObject(source.getSourceId());
+ Set exileZones = (Set) game.getState().getValue(GrimoireThief.VALUE_PREFIX + source.getSourceId().toString());
+ if (exileZones != null) {
+ for (ExileZone exileZone : game.getExile().getExileZones()) {
+ if (!exileZone.isEmpty()) {
+ cards.addAll(exileZone.getCards(game));
+ }
+ }
+ // set face up first
+ for (Card card : cards.getCards(game)) {
+ card.setFaceDown(false, game);
+ }
+ // then counter any with the same name as the card exiled with Grimoire Thief
+ for (Card card : cards.getCards(game)) {
+ for (Iterator iterator = game.getStack().iterator(); iterator.hasNext();) {
+ StackObject stackObject = iterator.next();
+ MageObject mageObject = game.getObject(card.getId());
+ // handle split cards
+ if (mageObject instanceof SplitCard) {
+ if (stackObject instanceof Spell
+ && (stackObject.getName().contains(((SplitCard)mageObject).getLeftHalfCard().getName())
+ || stackObject.getName().contains(((SplitCard)mageObject).getRightHalfCard().getName()))) {
+ Spell spell = (Spell) stackObject;
+ spell.counter(source.getSourceId(), game);
+ game.informPlayers(sourceObject.getLogName() + ": the split-card spell named " + spell.getName() + " was countered.");
+ }
+ }
+ if (stackObject instanceof Spell
+ && stackObject.getName().contains(card.getName())) {
+ Spell spell = (Spell) stackObject;
+ spell.counter(source.getSourceId(), game);
+ game.informPlayers(sourceObject.getLogName() + ": the spell named " + spell.getName() + " was countered.");
+ }
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public GrimoireThiefCounterspellEffect copy() {
+ return new GrimoireThiefCounterspellEffect(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/morningtide/KinsbaileCavalier.java b/Mage.Sets/src/mage/sets/morningtide/KinsbaileCavalier.java
index c7bacdd92a1..a16e1c7aadf 100644
--- a/Mage.Sets/src/mage/sets/morningtide/KinsbaileCavalier.java
+++ b/Mage.Sets/src/mage/sets/morningtide/KinsbaileCavalier.java
@@ -47,7 +47,7 @@ import mage.filter.predicate.mageobject.SubtypePredicate;
*/
public class KinsbaileCavalier extends CardImpl {
- private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("Knight");
+ private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("Knight creatures");
static {
filter.add(new SubtypePredicate("Knight"));
diff --git a/Mage.Sets/src/mage/sets/morningtide/LunkErrant.java b/Mage.Sets/src/mage/sets/morningtide/LunkErrant.java
new file mode 100644
index 00000000000..4c73889e2ad
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/morningtide/LunkErrant.java
@@ -0,0 +1,75 @@
+/*
+ * 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.sets.morningtide;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.AttacksAloneTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class LunkErrant extends CardImpl {
+
+ public LunkErrant(UUID ownerId) {
+ super(ownerId, 94, "Lunk Errant", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{5}{R}");
+ this.expansionSetCode = "MOR";
+ this.subtype.add("Giant");
+ this.subtype.add("Warrior");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(4);
+
+ // Whenever Lunk Errant attacks alone, it gets +1/+1 and gains trample until end of turn.
+ Effect effect = new BoostSourceEffect(1, 1, Duration.EndOfTurn);
+ effect.setText("it gets +1/+1");
+ Ability ability = new AttacksAloneTriggeredAbility(effect);
+ effect = new GainAbilitySourceEffect(TrampleAbility.getInstance(), Duration.EndOfTurn);
+ effect.setText("and gains trample until end of turn");
+ ability.addEffect(effect);
+ this.addAbility(ability);
+ }
+
+ public LunkErrant(final LunkErrant card) {
+ super(card);
+ }
+
+ @Override
+ public LunkErrant copy() {
+ return new LunkErrant(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/nemesis/FlowstoneArmor.java b/Mage.Sets/src/mage/sets/nemesis/FlowstoneArmor.java
new file mode 100644
index 00000000000..78ddf85917b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/nemesis/FlowstoneArmor.java
@@ -0,0 +1,75 @@
+/*
+ * 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.sets.nemesis;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.common.SkipUntapOptionalAbility;
+import mage.abilities.condition.common.SourceTappedCondition;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.decorator.ConditionalContinuousEffect;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class FlowstoneArmor extends CardImpl {
+
+ public FlowstoneArmor(UUID ownerId) {
+ super(ownerId, 131, "Flowstone Armor", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{3}");
+ this.expansionSetCode = "NMS";
+
+ // You may choose not to untap Flowstone Armor during your untap step.
+ this.addAbility(new SkipUntapOptionalAbility());
+ // {3}, {tap}: Target creature gets +1/-1 for as long as Flowstone Armor remains tapped.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ConditionalContinuousEffect(
+ new BoostTargetEffect(1, -1, Duration.Custom), SourceTappedCondition.getInstance(),
+ "target creature gets +1/-1 for as long as {this} remains tapped"), new ManaCostsImpl("{3}"));
+ ability.addCost(new TapSourceCost());
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+ }
+
+ public FlowstoneArmor(final FlowstoneArmor card) {
+ super(card);
+ }
+
+ @Override
+ public FlowstoneArmor copy() {
+ return new FlowstoneArmor(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/nemesis/Woodripper.java b/Mage.Sets/src/mage/sets/nemesis/Woodripper.java
new file mode 100644
index 00000000000..38a2f942a43
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/nemesis/Woodripper.java
@@ -0,0 +1,75 @@
+/*
+ * 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.sets.nemesis;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.RemoveCountersSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.DestroyTargetEffect;
+import mage.abilities.keyword.FadingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.counters.CounterType;
+import mage.target.common.TargetArtifactPermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Woodripper extends CardImpl {
+
+ public Woodripper(UUID ownerId) {
+ super(ownerId, 125, "Woodripper", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{G}{G}");
+ this.expansionSetCode = "NMS";
+ this.subtype.add("Beast");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(6);
+
+ // Fading 3
+ this.addAbility(new FadingAbility(3, this));
+ // {1}, Remove a fade counter from Woodripper: Destroy target artifact.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroyTargetEffect(), new ManaCostsImpl("{1}"));
+ ability.addCost(new RemoveCountersSourceCost(CounterType.FADE.createInstance()));
+ ability.addTarget(new TargetArtifactPermanent());
+ this.addAbility(ability);
+ }
+
+ public Woodripper(final Woodripper card) {
+ super(card);
+ }
+
+ @Override
+ public Woodripper copy() {
+ return new Woodripper(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/newphyrexia/LeechingBite.java b/Mage.Sets/src/mage/sets/newphyrexia/LeechingBite.java
index 7ab4a6277b2..54869297d22 100644
--- a/Mage.Sets/src/mage/sets/newphyrexia/LeechingBite.java
+++ b/Mage.Sets/src/mage/sets/newphyrexia/LeechingBite.java
@@ -28,18 +28,15 @@
package mage.sets.newphyrexia;
import java.util.UUID;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Duration;
-import mage.constants.Layer;
-import mage.constants.Outcome;
import mage.constants.Rarity;
-import mage.constants.SubLayer;
-import mage.abilities.Ability;
-import mage.abilities.effects.ContinuousEffectImpl;
-import mage.cards.CardImpl;
-import mage.game.Game;
-import mage.game.permanent.Permanent;
+import mage.filter.common.FilterCreaturePermanent;
import mage.target.common.TargetCreaturePermanent;
+import mage.target.targetpointer.SecondTargetPointer;
/**
*
@@ -51,9 +48,16 @@ public class LeechingBite extends CardImpl {
super(ownerId, 113, "Leeching Bite", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{G}");
this.expansionSetCode = "NPH";
-
- this.getSpellAbility().addEffect(new LeechingBiteEffect());
- this.getSpellAbility().addTarget(new TargetCreaturePermanent(2));
+ // Target creature gets +1/+1 until end of turn. Another target creature gets -1/-1 until end of turn.
+ Effect effect = new BoostTargetEffect(1, 1, Duration.EndOfTurn);
+ effect.setText("Target creature gets +1/+1 until end of turn");
+ this.getSpellAbility().addEffect(effect);
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent(new FilterCreaturePermanent("creature (getting the +1/+1 counter)")));
+ effect = new BoostTargetEffect(-1, -1, Duration.EndOfTurn);
+ effect.setText("Another target creature gets -1/-1 until end of turn");
+ effect.setTargetPointer(new SecondTargetPointer());
+ this.getSpellAbility().addEffect(effect);
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent(new FilterCreaturePermanent("creature (getting the -1/-1 counter)")));
}
public LeechingBite(final LeechingBite card) {
@@ -65,35 +69,3 @@ public class LeechingBite extends CardImpl {
return new LeechingBite(this);
}
}
-
-class LeechingBiteEffect extends ContinuousEffectImpl {
-
- public LeechingBiteEffect() {
- super(Duration.EndOfTurn, Layer.PTChangingEffects_7, SubLayer.ModifyPT_7c, Outcome.BoostCreature);
- this.staticText = "Target creature gets +1/+1 until end of turn. Another target creature gets -1/-1 until end of turn";
- }
-
- public LeechingBiteEffect(final LeechingBiteEffect effect) {
- super(effect);
- }
-
- @Override
- public LeechingBiteEffect copy() {
- return new LeechingBiteEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Permanent permanent = game.getPermanent(source.getFirstTarget());
- if (permanent != null) {
- permanent.addPower(1);
- permanent.addToughness(1);
- }
- permanent = game.getPermanent(source.getTargets().get(0).getTargets().get(1));
- if (permanent != null) {
- permanent.addPower(-1);
- permanent.addToughness(-1);
- }
- return true;
- }
-}
diff --git a/Mage.Sets/src/mage/sets/newphyrexia/PhyrexianMetamorph.java b/Mage.Sets/src/mage/sets/newphyrexia/PhyrexianMetamorph.java
index 681c7882c45..25a6c37427b 100644
--- a/Mage.Sets/src/mage/sets/newphyrexia/PhyrexianMetamorph.java
+++ b/Mage.Sets/src/mage/sets/newphyrexia/PhyrexianMetamorph.java
@@ -25,20 +25,20 @@
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
-
package mage.sets.newphyrexia;
import java.util.UUID;
-import mage.constants.CardType;
-import mage.constants.Rarity;
-import mage.constants.Zone;
import mage.MageInt;
+import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.EntersBattlefieldEffect;
import mage.abilities.effects.common.CopyPermanentEffect;
import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
import mage.filter.FilterPermanent;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.CardTypePredicate;
@@ -51,7 +51,7 @@ import mage.util.functions.ApplyToPermanent;
* @author Loki
*/
public class PhyrexianMetamorph extends CardImpl {
-
+
private static final FilterPermanent filter = new FilterPermanent("artifact or creature");
static {
@@ -59,8 +59,8 @@ public class PhyrexianMetamorph extends CardImpl {
new CardTypePredicate(CardType.ARTIFACT),
new CardTypePredicate(CardType.CREATURE)));
}
-
- public PhyrexianMetamorph (UUID ownerId) {
+
+ public PhyrexianMetamorph(UUID ownerId) {
super(ownerId, 42, "Phyrexian Metamorph", Rarity.RARE, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{3}{UP}");
this.expansionSetCode = "NPH";
this.subtype.add("Shapeshifter");
@@ -71,13 +71,19 @@ public class PhyrexianMetamorph extends CardImpl {
ApplyToPermanent phyrexianMetamorphApplier = new ApplyToPermanent() {
@Override
public Boolean apply(Game game, Permanent permanent) {
- if (!permanent.getCardType().contains(CardType.ARTIFACT)) {
- permanent.getCardType().add(CardType.ARTIFACT);
+ return apply(game, (MageObject) permanent);
+ }
+
+ @Override
+ public Boolean apply(Game game, MageObject mageObject) {
+ if (!mageObject.getCardType().contains(CardType.ARTIFACT)) {
+ mageObject.getCardType().add(CardType.ARTIFACT);
}
return true;
}
+
};
-
+
// {UP} ( can be paid with either {U} or 2 life.)
// You may have Phyrexian Metamorph enter the battlefield as a copy of any artifact or creature on the battlefield, except it's an artifact in addition to its other types.
Effect effect = new CopyPermanentEffect(filter, phyrexianMetamorphApplier);
@@ -86,7 +92,7 @@ public class PhyrexianMetamorph extends CardImpl {
this.addAbility(ability);
}
- public PhyrexianMetamorph (final PhyrexianMetamorph card) {
+ public PhyrexianMetamorph(final PhyrexianMetamorph card) {
super(card);
}
diff --git a/Mage.Sets/src/mage/sets/newphyrexia/Spellskite.java b/Mage.Sets/src/mage/sets/newphyrexia/Spellskite.java
index ba7b8ebc634..5a9ee31b04a 100644
--- a/Mage.Sets/src/mage/sets/newphyrexia/Spellskite.java
+++ b/Mage.Sets/src/mage/sets/newphyrexia/Spellskite.java
@@ -120,33 +120,44 @@ class SpellskiteEffect extends OneShotEffect {
target.addTarget(source.getSourceId(), stackObject.getStackAbility(), game);
}
} else {
- Player player = game.getPlayer(source.getControllerId());
- for (Target target : targets) {
- for (UUID targetId : target.getTargets()) {
- MageObject object = game.getObject(targetId);
- String name;
- if (object == null) {
- Player targetPlayer = game.getPlayer(targetId);
- name = targetPlayer.getLogName();
- } else {
- name = object.getLogName();
- }
- if (!targetId.equals(source.getSourceId()) && target.getTargets().contains(source.getSourceId())) {
- // you can't change this target to Spellskite because Spellskite is already another targetId of that target.
- twoTimesTarget = true;
- continue;
- }
- if (name != null && player.chooseUse(Outcome.Neutral, "Change target from " + name + " to " + sourceObject.getLogName() + "?", source, game)) {
+ Player controller = game.getPlayer(source.getControllerId());
+ boolean validTargets = false;
+ do {
+ for (Target target : targets) {
+ for (UUID targetId : target.getTargets()) {
+ MageObject object = game.getObject(targetId);
+ String name;
+ if (object == null) {
+ Player targetPlayer = game.getPlayer(targetId);
+ name = targetPlayer.getLogName();
+ } else {
+ name = object.getLogName();
+ }
+ if (!targetId.equals(source.getSourceId()) && target.getTargets().contains(source.getSourceId())) {
+ // you can't change this target to Spellskite because Spellskite is already another targetId of that target.
+ twoTimesTarget = true;
+ continue;
+ }
if (target.canTarget(stackObject.getControllerId(), source.getSourceId(), sourceAbility, game)) {
- oldTarget = game.getObject(targets.getFirstTarget());
- target.remove(targetId);
- // The source is still the spell on the stack
- target.addTarget(source.getSourceId(), stackObject.getStackAbility(), game);
- break;
+ validTargets = true;
+ if (name != null
+ && controller.chooseUse(Outcome.Neutral, "Change target from " + name + " to " + sourceObject.getLogName() + "?", source, game)) {
+ oldTarget = game.getObject(targetId);
+ target.remove(targetId);
+ // The source is still the spell on the stack
+ target.addTarget(source.getSourceId(), stackObject.getStackAbility(), game);
+ break;
+ }
}
}
+ if (oldTarget != null) {
+ break;
+ }
}
- }
+ if (oldTarget == null) {
+ game.informPlayer(controller, "You have to select at least one target to change to spellskite!");
+ }
+ } while (validTargets && oldTarget == null);
}
if (oldTarget != null) {
game.informPlayers(sourceObject.getLogName() + ": Changed target of " + stackObject.getLogName() + " from " + oldTarget.getLogName() + " to " + sourceObject.getLogName());
diff --git a/Mage.Sets/src/mage/sets/ninthedition/AvenWindreader.java b/Mage.Sets/src/mage/sets/ninthedition/AvenWindreader.java
index 1c4b2d5ec6c..f2df72e840b 100644
--- a/Mage.Sets/src/mage/sets/ninthedition/AvenWindreader.java
+++ b/Mage.Sets/src/mage/sets/ninthedition/AvenWindreader.java
@@ -32,16 +32,12 @@ import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
-import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.RevealTargetPlayerLibraryEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
-import mage.cards.CardsImpl;
import mage.constants.CardType;
-import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.constants.Zone;
-import mage.game.Game;
-import mage.players.Player;
import mage.target.TargetPlayer;
/**
@@ -62,8 +58,9 @@ public class AvenWindreader extends CardImpl {
// Flying
this.addAbility(FlyingAbility.getInstance());
+
// {1}{U}: Target player reveals the top card of his or her library.
- Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new RevealTopCardTargetPlayerEffect(), new ManaCostsImpl("{1}{U}"));
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new RevealTargetPlayerLibraryEffect(1), new ManaCostsImpl("{1}{U}"));
ability.addTarget(new TargetPlayer());
this.addAbility(ability);
}
@@ -77,31 +74,3 @@ public class AvenWindreader extends CardImpl {
return new AvenWindreader(this);
}
}
-
-class RevealTopCardTargetPlayerEffect extends OneShotEffect {
-
- public RevealTopCardTargetPlayerEffect() {
- super(Outcome.Benefit);
- this.staticText = "Target player reveals the top card of his or her library.";
- }
-
- public RevealTopCardTargetPlayerEffect(final RevealTopCardTargetPlayerEffect effect) {
- super(effect);
- }
-
- @Override
- public RevealTopCardTargetPlayerEffect copy() {
- return new RevealTopCardTargetPlayerEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Player player = game.getPlayer(source.getFirstTarget());
- if (player != null) {
- CardsImpl cards = new CardsImpl();
- cards.add(player.getLibrary().removeFromTop(game));
- player.revealCards("Top card of target player's library", cards, game);
- }
- return false;
- }
-}
diff --git a/Mage.Sets/src/mage/sets/ninthedition/GiantOctopus.java b/Mage.Sets/src/mage/sets/ninthedition/Biorhythm.java
similarity index 84%
rename from Mage.Sets/src/mage/sets/ninthedition/GiantOctopus.java
rename to Mage.Sets/src/mage/sets/ninthedition/Biorhythm.java
index 938f1942a84..f9019b96086 100644
--- a/Mage.Sets/src/mage/sets/ninthedition/GiantOctopus.java
+++ b/Mage.Sets/src/mage/sets/ninthedition/Biorhythm.java
@@ -31,22 +31,22 @@ import java.util.UUID;
/**
*
- * @author LevelX2
+ * @author LoneFox
*/
-public class GiantOctopus extends mage.sets.seventhedition.GiantOctopus {
+public class Biorhythm extends mage.sets.onslaught.Biorhythm {
- public GiantOctopus(UUID ownerId) {
+ public Biorhythm(UUID ownerId) {
super(ownerId);
- this.cardNumber = 4;
+ this.cardNumber = 231;
this.expansionSetCode = "9ED";
}
- public GiantOctopus(final GiantOctopus card) {
+ public Biorhythm(final Biorhythm card) {
super(card);
}
@Override
- public GiantOctopus copy() {
- return new GiantOctopus(this);
+ public Biorhythm copy() {
+ return new Biorhythm(this);
}
}
diff --git a/Mage.Sets/src/mage/sets/ninthedition/FinalPunishment.java b/Mage.Sets/src/mage/sets/ninthedition/FinalPunishment.java
new file mode 100644
index 00000000000..1db22add0bc
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/ninthedition/FinalPunishment.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.ninthedition;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class FinalPunishment extends mage.sets.scourge.FinalPunishment {
+
+ public FinalPunishment(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 131;
+ this.expansionSetCode = "9ED";
+ }
+
+ public FinalPunishment(final FinalPunishment card) {
+ super(card);
+ }
+
+ @Override
+ public FinalPunishment copy() {
+ return new FinalPunishment(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/ninthedition/RogueKavu.java b/Mage.Sets/src/mage/sets/ninthedition/RogueKavu.java
new file mode 100644
index 00000000000..88b9d47c882
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/ninthedition/RogueKavu.java
@@ -0,0 +1,64 @@
+/*
+ * 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.sets.ninthedition;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.AttacksAloneTriggeredAbility;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class RogueKavu extends CardImpl {
+
+ public RogueKavu(UUID ownerId) {
+ super(ownerId, 213, "Rogue Kavu", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{R}");
+ this.expansionSetCode = "9ED";
+ this.subtype.add("Kavu");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // Whenever Rogue Kavu attacks alone, it gets +2/+0 until end of turn.
+ this.addAbility(new AttacksAloneTriggeredAbility(new BoostSourceEffect(2, 0, Duration.EndOfTurn)));
+ }
+
+ public RogueKavu(final RogueKavu card) {
+ super(card);
+ }
+
+ @Override
+ public RogueKavu copy() {
+ return new RogueKavu(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/odyssey/Decimate.java b/Mage.Sets/src/mage/sets/odyssey/Decimate.java
index a5f40f11349..e4c7b92ee7f 100644
--- a/Mage.Sets/src/mage/sets/odyssey/Decimate.java
+++ b/Mage.Sets/src/mage/sets/odyssey/Decimate.java
@@ -48,9 +48,8 @@ public class Decimate extends CardImpl {
super(ownerId, 287, "Decimate", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{2}{R}{G}");
this.expansionSetCode = "ODY";
-
// Destroy target artifact, target creature, target enchantment, and target land.
- Effect effect = new DestroyTargetEffect();
+ Effect effect = new DestroyTargetEffect(false, true);
effect.setText("Destroy target artifact, target creature, target enchantment, and target land.");
this.getSpellAbility().addEffect(effect);
this.getSpellAbility().addTarget(new TargetArtifactPermanent());
diff --git a/Mage.Sets/src/mage/sets/onslaught/AirdropCondor.java b/Mage.Sets/src/mage/sets/onslaught/AirdropCondor.java
new file mode 100644
index 00000000000..433fb6e541b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/onslaught/AirdropCondor.java
@@ -0,0 +1,85 @@
+/*
+ * 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.sets.onslaught;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.dynamicvalue.common.SacrificeCostCreaturesPower;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+import mage.target.common.TargetControlledCreaturePermanent;
+import mage.target.common.TargetCreatureOrPlayer;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class AirdropCondor extends CardImpl {
+
+ private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("a Goblin creature");
+
+ static {
+ filter.add(new SubtypePredicate("Goblin"));
+ }
+
+ public AirdropCondor(UUID ownerId) {
+ super(ownerId, 186, "Airdrop Condor", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{4}{R}");
+ this.expansionSetCode = "ONS";
+ this.subtype.add("Bird");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+
+ // {1}{R}, Sacrifice a Goblin creature: Airdrop Condor deals damage equal to the sacrificed creature's power to target creature or player.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(new SacrificeCostCreaturesPower()), new ManaCostsImpl("{1}{R}"));
+ ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(filter)));
+ ability.addTarget(new TargetCreatureOrPlayer());
+ this.addAbility(ability);
+ }
+
+ public AirdropCondor(final AirdropCondor card) {
+ super(card);
+ }
+
+ @Override
+ public AirdropCondor copy() {
+ return new AirdropCondor(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/onslaught/Biorhythm.java b/Mage.Sets/src/mage/sets/onslaught/Biorhythm.java
new file mode 100644
index 00000000000..d3ddf2be150
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/onslaught/Biorhythm.java
@@ -0,0 +1,99 @@
+/*
+ * 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.sets.onslaught;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.effects.OneShotEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.game.Game;
+import mage.players.Player;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Biorhythm extends CardImpl {
+
+ public Biorhythm(UUID ownerId) {
+ super(ownerId, 247, "Biorhythm", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{6}{G}{G}");
+ this.expansionSetCode = "ONS";
+
+ // Each player's life total becomes the number of creatures he or she controls.
+ this.getSpellAbility().addEffect(new BiorhythmEffect());
+ }
+
+ public Biorhythm(final Biorhythm card) {
+ super(card);
+ }
+
+ @Override
+ public Biorhythm copy() {
+ return new Biorhythm(this);
+ }
+}
+
+class BiorhythmEffect extends OneShotEffect {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent();
+
+ public BiorhythmEffect() {
+ super(Outcome.Neutral);
+ this.staticText = "Each player's life total becomes the number of creatures he or she controls";
+ }
+
+ public BiorhythmEffect(final BiorhythmEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public BiorhythmEffect copy() {
+ return new BiorhythmEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ for(UUID playerId : game.getState().getPlayersInRange(source.getControllerId(), game)) {
+ Player player = game.getPlayer(playerId);
+ if(player != null) {
+ int diff = player.getLife() - game.getBattlefield().countAll(filter, playerId, game);
+ if(diff > 0) {
+ player.loseLife(diff, game);
+ }
+ if(diff < 0) {
+ player.gainLife(-diff, game);
+ }
+ }
+ }
+ return true;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/onslaught/CabalSlaver.java b/Mage.Sets/src/mage/sets/onslaught/CabalSlaver.java
index ac9da8f9eae..93c38299370 100644
--- a/Mage.Sets/src/mage/sets/onslaught/CabalSlaver.java
+++ b/Mage.Sets/src/mage/sets/onslaught/CabalSlaver.java
@@ -43,6 +43,7 @@ import mage.filter.predicate.mageobject.SubtypePredicate;
* @author markedagain
*/
public class CabalSlaver extends CardImpl {
+
private static final FilterPermanent filter = new FilterPermanent("Goblin");
static {
@@ -58,7 +59,7 @@ public class CabalSlaver extends CardImpl {
this.toughness = new MageInt(1);
// Whenever a Goblin deals combat damage to a player, that player discards a card.
- this.addAbility(new DealsDamageToAPlayerAllTriggeredAbility(new DiscardTargetEffect(1),filter, false, SetTargetPointer.NONE, true));
+ this.addAbility(new DealsDamageToAPlayerAllTriggeredAbility(new DiscardTargetEffect(1), filter, false, SetTargetPointer.PLAYER, true));
}
public CabalSlaver(final CabalSlaver card) {
diff --git a/Mage.Sets/src/mage/sets/onslaught/ChainOfVapor.java b/Mage.Sets/src/mage/sets/onslaught/ChainOfVapor.java
index dd376b43af1..a87a9bfec3f 100644
--- a/Mage.Sets/src/mage/sets/onslaught/ChainOfVapor.java
+++ b/Mage.Sets/src/mage/sets/onslaught/ChainOfVapor.java
@@ -28,6 +28,7 @@
package mage.sets.onslaught;
import java.util.UUID;
+import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.Mode;
import mage.abilities.effects.OneShotEffect;
@@ -87,34 +88,31 @@ class ChainOfVaporEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
- if (controller == null) {
+ MageObject sourceObject = source.getSourceObject(game);
+ if (controller == null || sourceObject == null) {
return false;
}
Permanent permanent = game.getPermanent(source.getFirstTarget());
if (permanent != null) {
controller.moveCards(permanent, null, Zone.HAND, source, game);
Player player = game.getPlayer(permanent.getControllerId());
- if (player.chooseUse(Outcome.ReturnToHand, "Sacrifice a land to copy this spell?", source, game)) {
- TargetControlledPermanent target = new TargetControlledPermanent(new FilterControlledLandPermanent());
- if (player.chooseTarget(Outcome.Sacrifice, target, source, game)) {
- Permanent land = game.getPermanent(target.getFirstTarget());
- if (land != null) {
- if (land.sacrifice(source.getSourceId(), game)) {
- Spell spell = game.getStack().getSpell(source.getSourceId());
- if (spell != null) {
- Spell copy = spell.copySpell();
- copy.setControllerId(player.getId());
- copy.setCopiedSpell(true);
- game.getStack().push(copy);
- copy.chooseNewTargets(game, player.getId());
- String activateMessage = copy.getActivatedMessage(game);
- if (activateMessage.startsWith(" casts ")) {
- activateMessage = activateMessage.substring(6);
- }
- game.informPlayers(player.getLogName() + " copies " + activateMessage);
- return true;
+ TargetControlledPermanent target = new TargetControlledPermanent(0, 1, new FilterControlledLandPermanent("a land to sacrifice (to be able to copy " + sourceObject.getName() + ")"), true);
+ if (player.chooseTarget(Outcome.Sacrifice, target, source, game)) {
+ Permanent land = game.getPermanent(target.getFirstTarget());
+ if (land != null && land.sacrifice(source.getSourceId(), game)) {
+ if (player.chooseUse(outcome, "Copy the spell?", source, game)) {
+ Spell spell = game.getStack().getSpell(source.getSourceId());
+ if (spell != null) {
+ Spell copy = spell.copySpell();
+ copy.setControllerId(player.getId());
+ copy.setCopiedSpell(true);
+ game.getStack().push(copy);
+ copy.chooseNewTargets(game, player.getId());
+ String activateMessage = copy.getActivatedMessage(game);
+ if (activateMessage.startsWith(" casts ")) {
+ activateMessage = activateMessage.substring(6);
}
- return false;
+ game.informPlayers(player.getLogName() + " " + activateMessage);
}
}
}
diff --git a/Mage.Sets/src/mage/sets/onslaught/HarshMercy.java b/Mage.Sets/src/mage/sets/onslaught/HarshMercy.java
new file mode 100644
index 00000000000..d0dce29fb32
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/onslaught/HarshMercy.java
@@ -0,0 +1,125 @@
+/*
+ * 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.sets.onslaught;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.UUID;
+import mage.MageObject;
+import mage.abilities.Ability;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.DestroyAllEffect;
+import mage.cards.CardImpl;
+import mage.cards.repository.CardRepository;
+import mage.choices.Choice;
+import mage.choices.ChoiceImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.filter.FilterPermanent;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+import mage.game.Game;
+import mage.players.Player;
+
+/**
+ *
+ * @author pcasaretto
+ */
+public class HarshMercy extends CardImpl {
+
+ public HarshMercy(UUID ownerId) {
+ super(ownerId, 39, "Harsh Mercy", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{2}{W}");
+ this.expansionSetCode = "ONS";
+
+ // Each player chooses a creature type. Destroy all creatures that aren't of a type chosen this way. They can't be regenerated.
+ this.getSpellAbility().addEffect(new HarshMercyEffect());
+ }
+
+ public HarshMercy(final HarshMercy card) {
+ super(card);
+ }
+
+ @Override
+ public HarshMercy copy() {
+ return new HarshMercy(this);
+ }
+}
+
+class HarshMercyEffect extends OneShotEffect {
+
+ public HarshMercyEffect() {
+ super(Outcome.DestroyPermanent);
+ this.staticText = "Each player chooses a creature type. Destroy all creatures that aren't of a type chosen this way. They can't be regenerated.";
+ }
+
+ public HarshMercyEffect(final HarshMercyEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public HarshMercyEffect copy() {
+ return new HarshMercyEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ MageObject sourceObject = game.getObject(source.getSourceId());
+ if (controller != null && sourceObject != null) {
+ Set chosenTypes = new HashSet<>();
+ PlayerIteration:
+ for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) {
+ Player player = game.getPlayer(playerId);
+ Choice typeChoice = new ChoiceImpl(true);
+ typeChoice.setMessage("Choose a creature type");
+ typeChoice.setChoices(CardRepository.instance.getCreatureTypes());
+ while (!player.choose(Outcome.DestroyPermanent, typeChoice, game)) {
+ if (!player.canRespond()) {
+ continue PlayerIteration;
+ }
+ }
+ String chosenType = typeChoice.getChoice();
+ if (chosenType != null) {
+ game.informPlayers(sourceObject.getIdName() + ": " + player.getLogName() + " has chosen " + chosenType);
+ chosenTypes.add(chosenType);
+ }
+ }
+
+ FilterPermanent filter = new FilterCreaturePermanent("creatures");
+ for (String type : chosenTypes) {
+ filter.add(Predicates.not(new SubtypePredicate(type)));
+ }
+
+ return new DestroyAllEffect(filter, true).apply(game, source);
+ }
+ return false;
+ }
+
+}
diff --git a/Mage.Sets/src/mage/sets/onslaught/Oblation.java b/Mage.Sets/src/mage/sets/onslaught/Oblation.java
index af44e16f604..5bf88ee64a5 100644
--- a/Mage.Sets/src/mage/sets/onslaught/Oblation.java
+++ b/Mage.Sets/src/mage/sets/onslaught/Oblation.java
@@ -50,7 +50,6 @@ public class Oblation extends CardImpl {
super(ownerId, 46, "Oblation", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{2}{W}");
this.expansionSetCode = "ONS";
-
// The owner of target nonland permanent shuffles it into his or her library, then draws two cards.
this.getSpellAbility().addEffect(new OblationEffect());
this.getSpellAbility().addTarget(new TargetNonlandPermanent());
@@ -67,21 +66,21 @@ public class Oblation extends CardImpl {
}
class OblationEffect extends OneShotEffect {
-
+
OblationEffect() {
super(Outcome.Removal);
this.staticText = "The owner of target nonland permanent shuffles it into his or her library, then draws two cards";
}
-
+
OblationEffect(final OblationEffect effect) {
super(effect);
}
-
+
@Override
public OblationEffect copy() {
return new OblationEffect(this);
}
-
+
@Override
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(targetPointer.getFirst(game, source));
@@ -90,6 +89,9 @@ class OblationEffect extends OneShotEffect {
if (player != null) {
player.moveCardToLibraryWithInfo(permanent, source.getSourceId(), game, Zone.BATTLEFIELD, true, true);
player.shuffleLibrary(game);
+
+ game.applyEffects(); // so effects from creatures that were on the battlefield won't trigger from draw
+
player.drawCards(2, game);
return true;
}
diff --git a/Mage.Sets/src/mage/sets/onslaught/RotlungReanimator.java b/Mage.Sets/src/mage/sets/onslaught/RotlungReanimator.java
index 15ec38fc4df..38ce5a39a6d 100644
--- a/Mage.Sets/src/mage/sets/onslaught/RotlungReanimator.java
+++ b/Mage.Sets/src/mage/sets/onslaught/RotlungReanimator.java
@@ -29,7 +29,7 @@ package mage.sets.onslaught;
import java.util.UUID;
import mage.MageInt;
-import mage.abilities.common.DiesCreatureTriggeredAbility;
+import mage.abilities.common.DiesThisOrAnotherCreatureTriggeredAbility;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.cards.CardImpl;
import mage.constants.CardType;
@@ -59,7 +59,7 @@ public class RotlungReanimator extends CardImpl {
this.toughness = new MageInt(2);
// Whenever Rotlung Reanimator or another Cleric dies, put a 2/2 black Zombie creature token onto the battlefield.
- this.addAbility(new DiesCreatureTriggeredAbility(new CreateTokenEffect(new ZombieToken()), false, filter));
+ this.addAbility(new DiesThisOrAnotherCreatureTriggeredAbility(new CreateTokenEffect(new ZombieToken()), false, filter));
}
public RotlungReanimator(final RotlungReanimator card) {
diff --git a/Mage.Sets/src/mage/sets/planarchaos/BoomBust.java b/Mage.Sets/src/mage/sets/planarchaos/BoomBust.java
index b73609a114a..9bfd48af8f8 100644
--- a/Mage.Sets/src/mage/sets/planarchaos/BoomBust.java
+++ b/Mage.Sets/src/mage/sets/planarchaos/BoomBust.java
@@ -25,32 +25,25 @@
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
-
package mage.sets.planarchaos;
import java.util.UUID;
-
-import mage.constants.CardType;
-import mage.constants.Rarity;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DestroyAllEffect;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.cards.SplitCard;
+import mage.constants.CardType;
+import mage.constants.Rarity;
import mage.constants.TargetController;
import mage.filter.common.FilterLandPermanent;
import mage.filter.predicate.permanent.ControllerPredicate;
import mage.target.TargetPermanent;
-/**
- *
- * @author LevelX2
- */
-
-
public class BoomBust extends SplitCard {
private static final FilterLandPermanent filter1 = new FilterLandPermanent("land you control");
private static final FilterLandPermanent filter2 = new FilterLandPermanent("land you don't control");
+
static {
filter1.add(new ControllerPredicate(TargetController.YOU));
filter2.add(new ControllerPredicate(TargetController.NOT_YOU));
@@ -62,7 +55,7 @@ public class BoomBust extends SplitCard {
// Boom
// Destroy target land you control and target land you don't control.
- Effect effect = new DestroyTargetEffect();
+ Effect effect = new DestroyTargetEffect(false, true);
effect.setText("Destroy target land you control and target land you don't control");
getLeftHalfCard().getSpellAbility().addEffect(effect);
getLeftHalfCard().getSpellAbility().addTarget(new TargetPermanent(filter1));
diff --git a/Mage.Sets/src/mage/sets/planarchaos/SerendibSorcerer.java b/Mage.Sets/src/mage/sets/planarchaos/SerendibSorcerer.java
new file mode 100644
index 00000000000..acc479365bf
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/planarchaos/SerendibSorcerer.java
@@ -0,0 +1,79 @@
+/*
+ * 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.sets.planarchaos;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.effects.common.continuous.SetPowerToughnessTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.permanent.AnotherPredicate;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class SerendibSorcerer extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("target creature other than {this}");
+
+ static {
+ filter.add(new AnotherPredicate());
+ }
+
+ public SerendibSorcerer(UUID ownerId) {
+ super(ownerId, 61, "Serendib Sorcerer", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{U}{U}");
+ this.expansionSetCode = "PLC";
+ this.subtype.add("Human");
+ this.subtype.add("Wizard");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // {tap}: Target creature other than Serendib Sorcerer becomes 0/2 until end of turn.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new SetPowerToughnessTargetEffect(0, 2, Duration.EndOfTurn), new TapSourceCost());
+ ability.addTarget(new TargetCreaturePermanent(filter));
+ this.addAbility(ability);
+ }
+
+ public SerendibSorcerer(final SerendibSorcerer card) {
+ super(card);
+ }
+
+ @Override
+ public SerendibSorcerer copy() {
+ return new SerendibSorcerer(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/planechase/BoshIronGolem.java b/Mage.Sets/src/mage/sets/planechase/BoshIronGolem.java
index 769221d7eb9..34c051fa009 100644
--- a/Mage.Sets/src/mage/sets/planechase/BoshIronGolem.java
+++ b/Mage.Sets/src/mage/sets/planechase/BoshIronGolem.java
@@ -29,24 +29,20 @@ package mage.sets.planechase;
import java.util.UUID;
-import mage.constants.CardType;
-import mage.constants.Rarity;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
-import mage.abilities.costs.Cost;
import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.costs.mana.ManaCostsImpl;
-import mage.abilities.effects.OneShotEffect;
+import mage.abilities.dynamicvalue.common.SacrificeCostConvertedMana;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.keyword.TrampleAbility;
import mage.cards.CardImpl;
-import mage.constants.Outcome;
+import mage.constants.CardType;
+import mage.constants.Rarity;
import mage.constants.Zone;
-import mage.filter.common.FilterControlledPermanent;
-import mage.filter.predicate.mageobject.CardTypePredicate;
-import mage.game.Game;
-import mage.game.permanent.Permanent;
-import mage.players.Player;
+import mage.filter.common.FilterControlledArtifactPermanent;
import mage.target.common.TargetControlledPermanent;
import mage.target.common.TargetCreatureOrPlayer;
@@ -55,13 +51,7 @@ import mage.target.common.TargetCreatureOrPlayer;
* @author jeffwadsworth
*/
public class BoshIronGolem extends CardImpl {
-
- private static final FilterControlledPermanent filter = new FilterControlledPermanent("artifact");
-
- static {
- filter.add(new CardTypePredicate(CardType.ARTIFACT));
- }
-
+
public BoshIronGolem(UUID ownerId) {
super(ownerId, 108, "Bosh, Iron Golem", Rarity.RARE, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{8}");
this.expansionSetCode = "HOP";
@@ -73,10 +63,12 @@ public class BoshIronGolem extends CardImpl {
// Trample
this.addAbility(TrampleAbility.getInstance());
-
+
// {3}{R}, Sacrifice an artifact: Bosh, Iron Golem deals damage equal to the sacrificed artifact's converted mana cost to target creature or player.
- Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoshIronGolemEffect(), new ManaCostsImpl("{3}{R}"));
- ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(filter)));
+ Effect effect = new DamageTargetEffect(new SacrificeCostConvertedMana("artifact"));
+ effect.setText("{this} deals damage equal to the sacrificed artifact's converted mana cost to target creature or player");
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new ManaCostsImpl("{3}{R}"));
+ ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledArtifactPermanent("an artifact"))));
ability.addTarget(new TargetCreatureOrPlayer());
this.addAbility(ability);
}
@@ -90,45 +82,3 @@ public class BoshIronGolem extends CardImpl {
return new BoshIronGolem(this);
}
}
-
-class BoshIronGolemEffect extends OneShotEffect {
-
- public BoshIronGolemEffect() {
- super(Outcome.Damage);
- staticText = "{this} deals damage equal to the sacrificed artifact's converted mana cost to target creature or player";
- }
-
- public BoshIronGolemEffect(final BoshIronGolemEffect effect) {
- super(effect);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- int amount = 0;
- for (Cost cost: source.getCosts()) {
- if (cost instanceof SacrificeTargetCost && ((SacrificeTargetCost)cost).getPermanents().size() > 0) {
- amount = ((SacrificeTargetCost)cost).getPermanents().get(0).getManaCost().convertedManaCost();
- break;
- }
- }
- if (amount > 0) {
- Permanent permanent = game.getPermanent(source.getFirstTarget());
- if (permanent != null) {
- permanent.damage(amount, source.getSourceId(), game, false, true);
- return true;
- }
- Player player = game.getPlayer(source.getFirstTarget());
- if (player != null) {
- player.damage(amount, source.getSourceId(), game, false, true);
- return true;
- }
- }
- return false;
- }
-
- @Override
- public BoshIronGolemEffect copy() {
- return new BoshIronGolemEffect(this);
- }
-
-}
diff --git a/Mage.Sets/src/mage/sets/planechase/IvyElemental.java b/Mage.Sets/src/mage/sets/planechase/IvyElemental.java
index ab427c6c982..757482edb40 100644
--- a/Mage.Sets/src/mage/sets/planechase/IvyElemental.java
+++ b/Mage.Sets/src/mage/sets/planechase/IvyElemental.java
@@ -85,10 +85,10 @@ class IvyElementalEntersBattlefieldEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null) {
- Object obj = getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
- if (obj != null && obj instanceof SpellAbility
- && permanent.getZoneChangeCounter(game) - 1 == ((SpellAbility) obj).getSourceObjectZoneChangeCounter()) {
- SpellAbility spellAbility = (SpellAbility) obj;
+ SpellAbility spellAbility = (SpellAbility) getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
+ if (spellAbility != null
+ && spellAbility.getSourceId().equals(source.getSourceId())
+ && permanent.getZoneChangeCounter(game) - 1 == spellAbility.getSourceObjectZoneChangeCounter()) {
if (spellAbility.getSourceId().equals(source.getSourceId())) { // put into play by normal cast
int amount = spellAbility.getManaCostsToPay().getX();
if (amount > 0) {
diff --git a/Mage.Sets/src/mage/sets/planechase2012/SakashimasStudent.java b/Mage.Sets/src/mage/sets/planechase2012/SakashimasStudent.java
index f0a0c1e585d..e16d11cbd58 100644
--- a/Mage.Sets/src/mage/sets/planechase2012/SakashimasStudent.java
+++ b/Mage.Sets/src/mage/sets/planechase2012/SakashimasStudent.java
@@ -28,16 +28,17 @@
package mage.sets.planechase2012;
import java.util.UUID;
-import mage.constants.CardType;
-import mage.constants.Rarity;
-import mage.constants.Zone;
import mage.MageInt;
+import mage.MageObject;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.EntersBattlefieldEffect;
import mage.abilities.effects.common.CopyPermanentEffect;
import mage.abilities.keyword.NinjutsuAbility;
import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.util.functions.ApplyToPermanent;
@@ -60,7 +61,7 @@ public class SakashimasStudent extends CardImpl {
// Ninjutsu {1}{U}
this.addAbility(new NinjutsuAbility(new ManaCostsImpl("{1}{U}")));
// You may have Sakashima's Student enter the battlefield as a copy of any creature on the battlefield, except it's still a Ninja in addition to its other creature types.
- this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD,new EntersBattlefieldEffect(
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new EntersBattlefieldEffect(
new CopyPermanentEffect(new SakashimasStudentApplyToPermanent()),
"You may have {this} enter the battlefield as a copy of any creature on the battlefield, except it's still a Ninja in addition to its other creature types",
true)));
@@ -86,4 +87,13 @@ class SakashimasStudentApplyToPermanent extends ApplyToPermanent {
}
return true;
}
+
+ @Override
+ public Boolean apply(Game game, MageObject mageObject) {
+ if (!mageObject.getSubtype().contains("Ninja")) {
+ mageObject.getSubtype().add("Ninja");
+ }
+ return true;
+ }
+
}
diff --git a/Mage.Sets/src/mage/sets/planeshift/DralnusPet.java b/Mage.Sets/src/mage/sets/planeshift/DralnusPet.java
index c8c9218dbdd..5a94ca0d4ee 100644
--- a/Mage.Sets/src/mage/sets/planeshift/DralnusPet.java
+++ b/Mage.Sets/src/mage/sets/planeshift/DralnusPet.java
@@ -112,11 +112,12 @@ class DralnusPetEffect extends OneShotEffect {
Player controller = game.getPlayer(source.getControllerId());
Permanent permanent = game.getPermanent(source.getSourceId());
if (controller != null && permanent != null) {
- Object obj = getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
- if (obj != null && obj instanceof SpellAbility
- && permanent.getZoneChangeCounter(game) - 1 == ((SpellAbility) obj).getSourceObjectZoneChangeCounter()) {
+ SpellAbility spellAbility = (SpellAbility) getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
+ if (spellAbility != null
+ && spellAbility.getSourceId().equals(source.getSourceId())
+ && permanent.getZoneChangeCounter(game) - 1 == spellAbility.getSourceObjectZoneChangeCounter()) {
int cmc = 0;
- for (Cost cost : ((SpellAbility) obj).getCosts()) {
+ for (Cost cost : spellAbility.getCosts()) {
if (cost instanceof DiscardCardCost && ((DiscardCardCost) cost).getCards().size() > 0) {
cmc = ((DiscardCardCost) cost).getCards().get(0).getManaCost().convertedManaCost();
}
diff --git a/Mage.Sets/src/mage/sets/portal/AlabasterDragon.java b/Mage.Sets/src/mage/sets/portal/AlabasterDragon.java
new file mode 100644
index 00000000000..4d786359483
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/portal/AlabasterDragon.java
@@ -0,0 +1,65 @@
+/*
+ * 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.sets.portal;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.DiesTriggeredAbility;
+import mage.abilities.effects.common.ShuffleIntoLibrarySourceEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class AlabasterDragon extends CardImpl {
+
+ public AlabasterDragon(UUID ownerId) {
+ super(ownerId, 163, "Alabaster Dragon", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{4}{W}{W}");
+ this.expansionSetCode = "POR";
+ this.subtype.add("Dragon");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(4);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+ // When Alabaster Dragon dies, shuffle it into its owner's library.
+ this.addAbility(new DiesTriggeredAbility(new ShuffleIntoLibrarySourceEffect())); }
+
+ public AlabasterDragon(final AlabasterDragon card) {
+ super(card);
+ }
+
+ @Override
+ public AlabasterDragon copy() {
+ return new AlabasterDragon(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/portal/WickedPact.java b/Mage.Sets/src/mage/sets/portal/WickedPact.java
new file mode 100644
index 00000000000..814ac4a641a
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/portal/WickedPact.java
@@ -0,0 +1,72 @@
+/*
+ * 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.sets.portal;
+
+import java.util.UUID;
+import mage.ObjectColor;
+import mage.abilities.effects.common.DestroyTargetEffect;
+import mage.abilities.effects.common.LoseLifeSourceControllerEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.Predicates;
+import mage.filter.predicate.mageobject.ColorPredicate;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class WickedPact extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("nonblack creature");
+
+ static {
+ filter.add(Predicates.not(new ColorPredicate(ObjectColor.BLACK)));
+ }
+
+ public WickedPact(UUID ownerId) {
+ super(ownerId, 40, "Wicked Pact", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{1}{B}{B}");
+ this.expansionSetCode = "POR";
+
+ // Destroy two target nonblack creatures. You lose 5 life.
+ this.getSpellAbility().addEffect(new DestroyTargetEffect());
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent(2, 2, filter, false));
+ this.getSpellAbility().addEffect(new LoseLifeSourceControllerEffect(5));
+ }
+
+ public WickedPact(final WickedPact card) {
+ super(card);
+ }
+
+ @Override
+ public WickedPact copy() {
+ return new WickedPact(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/portalsecondage/AbyssalNightstalker.java b/Mage.Sets/src/mage/sets/portalsecondage/AbyssalNightstalker.java
new file mode 100644
index 00000000000..9514f3b27e3
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/portalsecondage/AbyssalNightstalker.java
@@ -0,0 +1,66 @@
+/*
+ * 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.sets.portalsecondage;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.discard.DiscardTargetEffect;
+import mage.abilities.common.AttacksAndIsNotBlockedTriggeredAbility;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class AbyssalNightstalker extends CardImpl {
+
+ public AbyssalNightstalker(UUID ownerId) {
+ super(ownerId, 1, "Abyssal Nightstalker", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{B}");
+ this.expansionSetCode = "PO2";
+ this.subtype.add("Nightstalker");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Whenever Abyssal Nightstalker attacks and isn't blocked, defending player discards a card.
+ Effect effect = new DiscardTargetEffect(1);
+ effect.setText("defending player discards a card");
+ this.addAbility(new AttacksAndIsNotBlockedTriggeredAbility(effect, false, true));
+ }
+
+ public AbyssalNightstalker(final AbyssalNightstalker card) {
+ super(card);
+ }
+
+ @Override
+ public AbyssalNightstalker copy() {
+ return new AbyssalNightstalker(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/portalsecondage/AngelOfFury.java b/Mage.Sets/src/mage/sets/portalsecondage/AngelOfFury.java
new file mode 100644
index 00000000000..4b439141963
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/portalsecondage/AngelOfFury.java
@@ -0,0 +1,66 @@
+/*
+ * 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.sets.portalsecondage;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.DiesTriggeredAbility;
+import mage.abilities.effects.common.ShuffleIntoLibrarySourceEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class AngelOfFury extends CardImpl {
+
+ public AngelOfFury(UUID ownerId) {
+ super(ownerId, 127, "Angel of Fury", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{4}{W}{W}");
+ this.expansionSetCode = "PO2";
+ this.subtype.add("Angel");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(5);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+ // When Angel of Fury is put into your graveyard from the battlefield, you may shuffle it into your library.
+ this.addAbility(new DiesTriggeredAbility(new ShuffleIntoLibrarySourceEffect(), true));
+ }
+
+ public AngelOfFury(final AngelOfFury card) {
+ super(card);
+ }
+
+ @Override
+ public AngelOfFury copy() {
+ return new AngelOfFury(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/portalsecondage/DenizenOfTheDeep.java b/Mage.Sets/src/mage/sets/portalsecondage/DenizenOfTheDeep.java
new file mode 100644
index 00000000000..6a651acbe73
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/portalsecondage/DenizenOfTheDeep.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.portalsecondage;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class DenizenOfTheDeep extends mage.sets.tenthedition.DenizenOfTheDeep {
+
+ public DenizenOfTheDeep(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 36;
+ this.expansionSetCode = "PO2";
+ }
+
+ public DenizenOfTheDeep(final DenizenOfTheDeep card) {
+ super(card);
+ }
+
+ @Override
+ public DenizenOfTheDeep copy() {
+ return new DenizenOfTheDeep(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/portalsecondage/JaggedLightning.java b/Mage.Sets/src/mage/sets/portalsecondage/JaggedLightning.java
new file mode 100644
index 00000000000..e3288cd2418
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/portalsecondage/JaggedLightning.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.portalsecondage;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class JaggedLightning extends mage.sets.urzassaga.JaggedLightning {
+
+ public JaggedLightning(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 106;
+ this.expansionSetCode = "PO2";
+ }
+
+ public JaggedLightning(final JaggedLightning card) {
+ super(card);
+ }
+
+ @Override
+ public JaggedLightning copy() {
+ return new JaggedLightning(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/portalthreekingdoms/FalseMourning.java b/Mage.Sets/src/mage/sets/portalthreekingdoms/FalseMourning.java
new file mode 100644
index 00000000000..5f33ccffb45
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/portalthreekingdoms/FalseMourning.java
@@ -0,0 +1,60 @@
+/*
+ * 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.sets.portalthreekingdoms;
+
+import java.util.UUID;
+import mage.abilities.effects.common.PutOnLibraryTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.target.common.TargetCardInYourGraveyard;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class FalseMourning extends CardImpl {
+
+ public FalseMourning(UUID ownerId) {
+ super(ownerId, 134, "False Mourning", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{G}");
+ this.expansionSetCode = "PTK";
+
+ // Put target card from your graveyard on top of your library.
+ this.getSpellAbility().addEffect(new PutOnLibraryTargetEffect(true));
+ this.getSpellAbility().addTarget(new TargetCardInYourGraveyard());
+ }
+
+ public FalseMourning(final FalseMourning card) {
+ super(card);
+ }
+
+ @Override
+ public FalseMourning copy() {
+ return new FalseMourning(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/portalthreekingdoms/FlankingTroops.java b/Mage.Sets/src/mage/sets/portalthreekingdoms/FlankingTroops.java
new file mode 100644
index 00000000000..d6c3305c138
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/portalthreekingdoms/FlankingTroops.java
@@ -0,0 +1,68 @@
+/*
+ * 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.sets.portalthreekingdoms;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.AttacksTriggeredAbility;
+import mage.abilities.effects.common.TapTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class FlankingTroops extends CardImpl {
+
+ public FlankingTroops(UUID ownerId) {
+ super(ownerId, 5, "Flanking Troops", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{W}{W}");
+ this.expansionSetCode = "PTK";
+ this.subtype.add("Human");
+ this.subtype.add("Soldier");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Whenever Flanking Troops attacks, you may tap target creature.
+ Ability ability = new AttacksTriggeredAbility(new TapTargetEffect(), true);
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+ }
+
+ public FlankingTroops(final FlankingTroops card) {
+ super(card);
+ }
+
+ @Override
+ public FlankingTroops copy() {
+ return new FlankingTroops(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/portalthreekingdoms/ForcedRetreat.java b/Mage.Sets/src/mage/sets/portalthreekingdoms/ForcedRetreat.java
new file mode 100644
index 00000000000..21f5c31634e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/portalthreekingdoms/ForcedRetreat.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.portalthreekingdoms;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class ForcedRetreat extends mage.sets.masterseditioniii.ForcedRetreat {
+
+ public ForcedRetreat(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 44;
+ this.expansionSetCode = "PTK";
+ }
+
+ public ForcedRetreat(final ForcedRetreat card) {
+ super(card);
+ }
+
+ @Override
+ public ForcedRetreat copy() {
+ return new ForcedRetreat(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/portalthreekingdoms/GuanYuSaintedWarrior.java b/Mage.Sets/src/mage/sets/portalthreekingdoms/GuanYuSaintedWarrior.java
new file mode 100644
index 00000000000..a5ad17bba71
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/portalthreekingdoms/GuanYuSaintedWarrior.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.portalthreekingdoms;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class GuanYuSaintedWarrior extends mage.sets.masterseditioniii.GuanYuSaintedWarrior {
+
+ public GuanYuSaintedWarrior(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 6;
+ this.expansionSetCode = "PTK";
+ this.rarity = Rarity.RARE;
+ }
+
+ public GuanYuSaintedWarrior(final GuanYuSaintedWarrior card) {
+ super(card);
+ }
+
+ @Override
+ public GuanYuSaintedWarrior copy() {
+ return new GuanYuSaintedWarrior(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/portalthreekingdoms/MaChaoWesternWarrior.java b/Mage.Sets/src/mage/sets/portalthreekingdoms/MaChaoWesternWarrior.java
new file mode 100644
index 00000000000..02d3e2c645a
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/portalthreekingdoms/MaChaoWesternWarrior.java
@@ -0,0 +1,73 @@
+/*
+ * 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.sets.portalthreekingdoms;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.AttacksAloneTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.combat.CantBeBlockedSourceEffect;
+import mage.abilities.keyword.HorsemanshipAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class MaChaoWesternWarrior extends CardImpl {
+
+ public MaChaoWesternWarrior(UUID ownerId) {
+ super(ownerId, 116, "Ma Chao, Western Warrior", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{R}{R}");
+ this.expansionSetCode = "PTK";
+ this.supertype.add("Legendary");
+ this.subtype.add("Human");
+ this.subtype.add("Soldier");
+ this.subtype.add("Warrior");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // Horsemanship
+ this.addAbility(HorsemanshipAbility.getInstance());
+ // Whenever Ma Chao, Western Warrior attacks alone, it can't be blocked this combat.
+ Effect effect = new CantBeBlockedSourceEffect(Duration.EndOfCombat);
+ effect.setText("it can't be blocked this combat");
+ this.addAbility(new AttacksAloneTriggeredAbility(effect));
+ }
+
+ public MaChaoWesternWarrior(final MaChaoWesternWarrior card) {
+ super(card);
+ }
+
+ @Override
+ public MaChaoWesternWarrior copy() {
+ return new MaChaoWesternWarrior(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/portalthreekingdoms/SagesKnowledge.java b/Mage.Sets/src/mage/sets/portalthreekingdoms/SagesKnowledge.java
new file mode 100644
index 00000000000..2ede43fdb7d
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/portalthreekingdoms/SagesKnowledge.java
@@ -0,0 +1,68 @@
+/*
+ * 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.sets.portalthreekingdoms;
+
+import java.util.UUID;
+import mage.abilities.effects.common.ReturnFromGraveyardToHandTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.FilterCard;
+import mage.filter.predicate.mageobject.CardTypePredicate;
+import mage.target.common.TargetCardInYourGraveyard;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class SagesKnowledge extends CardImpl {
+
+ public static final FilterCard filter = new FilterCard("sorcery card from your graveyard");
+
+ static {
+ filter.add(new CardTypePredicate(CardType.SORCERY));
+ }
+
+ public SagesKnowledge(UUID ownerId) {
+ super(ownerId, 52, "Sage's Knowledge", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{2}{U}");
+ this.expansionSetCode = "PTK";
+
+ // Return target sorcery card from your graveyard to your hand.
+ this.getSpellAbility().addEffect(new ReturnFromGraveyardToHandTargetEffect());
+ this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(filter));
+ }
+
+ public SagesKnowledge(final SagesKnowledge card) {
+ super(card);
+ }
+
+ @Override
+ public SagesKnowledge copy() {
+ return new SagesKnowledge(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/portalthreekingdoms/ShuDefender.java b/Mage.Sets/src/mage/sets/portalthreekingdoms/ShuDefender.java
new file mode 100644
index 00000000000..30532cf1f45
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/portalthreekingdoms/ShuDefender.java
@@ -0,0 +1,65 @@
+/*
+ * 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.sets.portalthreekingdoms;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.BlocksTriggeredAbility;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class ShuDefender extends CardImpl {
+
+ public ShuDefender(UUID ownerId) {
+ super(ownerId, 20, "Shu Defender", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{W}");
+ this.expansionSetCode = "PTK";
+ this.subtype.add("Human");
+ this.subtype.add("Soldier");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Whenever Shu Defender blocks, it gets +0/+2 until end of turn.
+ this.addAbility(new BlocksTriggeredAbility(new BoostSourceEffect(0, 2, Duration.EndOfTurn), false));
+ }
+
+ public ShuDefender(final ShuDefender card) {
+ super(card);
+ }
+
+ @Override
+ public ShuDefender copy() {
+ return new ShuDefender(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/portalthreekingdoms/SlashingTiger.java b/Mage.Sets/src/mage/sets/portalthreekingdoms/SlashingTiger.java
new file mode 100644
index 00000000000..fa80e8677c5
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/portalthreekingdoms/SlashingTiger.java
@@ -0,0 +1,64 @@
+/*
+ * 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.sets.portalthreekingdoms;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.BecomesBlockedTriggeredAbility;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class SlashingTiger extends CardImpl {
+
+ public SlashingTiger(UUID ownerId) {
+ super(ownerId, 145, "Slashing Tiger", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{G}{G}");
+ this.expansionSetCode = "PTK";
+ this.subtype.add("Cat");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // Whenever Slashing Tiger becomes blocked, it gets +2/+2 until end of turn.
+ this.addAbility(new BecomesBlockedTriggeredAbility(new BoostSourceEffect(2, 2, Duration.EndOfTurn), false));
+ }
+
+ public SlashingTiger(final SlashingTiger card) {
+ super(card);
+ }
+
+ @Override
+ public SlashingTiger copy() {
+ return new SlashingTiger(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/portalthreekingdoms/TaoistMystic.java b/Mage.Sets/src/mage/sets/portalthreekingdoms/TaoistMystic.java
new file mode 100644
index 00000000000..655f5825eb1
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/portalthreekingdoms/TaoistMystic.java
@@ -0,0 +1,74 @@
+/*
+ * 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.sets.portalthreekingdoms;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleEvasionAbility;
+import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesSourceEffect;
+import mage.abilities.keyword.HorsemanshipAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.AbilityPredicate;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class TaoistMystic extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures with horsemanship");
+
+ static {
+ filter.add(new AbilityPredicate(HorsemanshipAbility.class));
+ }
+
+ public TaoistMystic(UUID ownerId) {
+ super(ownerId, 151, "Taoist Mystic", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{G}");
+ this.expansionSetCode = "PTK";
+ this.subtype.add("Human");
+ this.subtype.add("Mystic");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Taoist Mystic can't be blocked by creatures with horsemanship.
+ this.addAbility(new SimpleEvasionAbility(new CantBeBlockedByCreaturesSourceEffect(filter, Duration.WhileOnBattlefield)));
+ }
+
+ public TaoistMystic(final TaoistMystic card) {
+ super(card);
+ }
+
+ @Override
+ public TaoistMystic copy() {
+ return new TaoistMystic(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/portalthreekingdoms/TrainedCheetah.java b/Mage.Sets/src/mage/sets/portalthreekingdoms/TrainedCheetah.java
new file mode 100644
index 00000000000..51fe695f0c8
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/portalthreekingdoms/TrainedCheetah.java
@@ -0,0 +1,64 @@
+/*
+ * 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.sets.portalthreekingdoms;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.BecomesBlockedTriggeredAbility;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class TrainedCheetah extends CardImpl {
+
+ public TrainedCheetah(UUID ownerId) {
+ super(ownerId, 154, "Trained Cheetah", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{G}");
+ this.expansionSetCode = "PTK";
+ this.subtype.add("Cat");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Whenever Trained Cheetah becomes blocked, it gets +1/+1 until end of turn.
+ this.addAbility(new BecomesBlockedTriggeredAbility(new BoostSourceEffect(1, 1, Duration.EndOfTurn), false));
+ }
+
+ public TrainedCheetah(final TrainedCheetah card) {
+ super(card);
+ }
+
+ @Override
+ public TrainedCheetah copy() {
+ return new TrainedCheetah(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/portalthreekingdoms/WeiAmbushForce.java b/Mage.Sets/src/mage/sets/portalthreekingdoms/WeiAmbushForce.java
new file mode 100644
index 00000000000..6b5af019f7b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/portalthreekingdoms/WeiAmbushForce.java
@@ -0,0 +1,65 @@
+/*
+ * 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.sets.portalthreekingdoms;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.AttacksTriggeredAbility;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class WeiAmbushForce extends CardImpl {
+
+ public WeiAmbushForce(UUID ownerId) {
+ super(ownerId, 85, "Wei Ambush Force", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{B}");
+ this.expansionSetCode = "PTK";
+ this.subtype.add("Human");
+ this.subtype.add("Soldier");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // Whenever Wei Ambush Force attacks, it gets +2/+0 until end of turn.
+ this.addAbility(new AttacksTriggeredAbility(new BoostSourceEffect(2, 0, Duration.EndOfTurn), false));
+ }
+
+ public WeiAmbushForce(final WeiAmbushForce card) {
+ super(card);
+ }
+
+ @Override
+ public WeiAmbushForce copy() {
+ return new WeiAmbushForce(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/portalthreekingdoms/WeiNightRaiders.java b/Mage.Sets/src/mage/sets/portalthreekingdoms/WeiNightRaiders.java
new file mode 100644
index 00000000000..5b20e8e973e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/portalthreekingdoms/WeiNightRaiders.java
@@ -0,0 +1,67 @@
+/*
+ * 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.sets.portalthreekingdoms;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.DealsDamageToOpponentTriggeredAbility;
+import mage.abilities.effects.common.discard.DiscardTargetEffect;
+import mage.abilities.keyword.HorsemanshipAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class WeiNightRaiders extends CardImpl {
+
+ public WeiNightRaiders(UUID ownerId) {
+ super(ownerId, 89, "Wei Night Raiders", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{B}{B}");
+ this.expansionSetCode = "PTK";
+ this.subtype.add("Human");
+ this.subtype.add("Soldier");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Horsemanship
+ this.addAbility(HorsemanshipAbility.getInstance());
+ // Whenever Wei Night Raiders deals damage to an opponent, that player discards a card.
+ this.addAbility(new DealsDamageToOpponentTriggeredAbility(new DiscardTargetEffect(1), false));
+ }
+
+ public WeiNightRaiders(final WeiNightRaiders card) {
+ super(card);
+ }
+
+ @Override
+ public WeiNightRaiders copy() {
+ return new WeiNightRaiders(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/portalthreekingdoms/WolfPack.java b/Mage.Sets/src/mage/sets/portalthreekingdoms/WolfPack.java
new file mode 100644
index 00000000000..89dd5e32a52
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/portalthreekingdoms/WolfPack.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.portalthreekingdoms;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class WolfPack extends mage.sets.masterseditionii.WolfPack {
+
+ public WolfPack(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 158;
+ this.expansionSetCode = "PTK";
+ }
+
+ public WolfPack(final WolfPack card) {
+ super(card);
+ }
+
+ @Override
+ public WolfPack copy() {
+ return new WolfPack(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/portalthreekingdoms/WuScout.java b/Mage.Sets/src/mage/sets/portalthreekingdoms/WuScout.java
new file mode 100644
index 00000000000..9e21e745d98
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/portalthreekingdoms/WuScout.java
@@ -0,0 +1,75 @@
+/*
+ * 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.sets.portalthreekingdoms;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.LookAtTargetPlayerHandEffect;
+import mage.abilities.keyword.HorsemanshipAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.target.common.TargetOpponent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class WuScout extends CardImpl {
+
+ public WuScout(UUID ownerId) {
+ super(ownerId, 62, "Wu Scout", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{U}");
+ this.expansionSetCode = "PTK";
+ this.subtype.add("Human");
+ this.subtype.add("Soldier");
+ this.subtype.add("Scout");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // Horsemanship
+ this.addAbility(HorsemanshipAbility.getInstance());
+ // When Wu Scout enters the battlefield, look at target opponent's hand.
+ Effect effect = new LookAtTargetPlayerHandEffect();
+ effect.setText("look at target opponent's hand");
+ Ability ability = new EntersBattlefieldTriggeredAbility(effect, false);
+ ability.addTarget(new TargetOpponent());
+ this.addAbility(ability);
+ }
+
+ public WuScout(final WuScout card) {
+ super(card);
+ }
+
+ @Override
+ public WuScout copy() {
+ return new WuScout(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/portalthreekingdoms/YuanShaosInfantry.java b/Mage.Sets/src/mage/sets/portalthreekingdoms/YuanShaosInfantry.java
new file mode 100644
index 00000000000..7b082db19ce
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/portalthreekingdoms/YuanShaosInfantry.java
@@ -0,0 +1,68 @@
+/*
+ * 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.sets.portalthreekingdoms;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.AttacksAloneTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.combat.CantBeBlockedSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class YuanShaosInfantry extends CardImpl {
+
+ public YuanShaosInfantry(UUID ownerId) {
+ super(ownerId, 129, "Yuan Shao's Infantry", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{R}");
+ this.expansionSetCode = "PTK";
+ this.subtype.add("Human");
+ this.subtype.add("Soldier");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Whenever Yuan Shao's Infantry attacks alone, Yuan Shao's Infantry can't be blocked this combat.
+ Effect effect = new CantBeBlockedSourceEffect(Duration.EndOfCombat);
+ effect.setText("it can't be blocked this combat");
+ this.addAbility(new AttacksAloneTriggeredAbility(effect));
+ }
+
+ public YuanShaosInfantry(final YuanShaosInfantry card) {
+ super(card);
+ }
+
+ @Override
+ public YuanShaosInfantry copy() {
+ return new YuanShaosInfantry(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/portalthreekingdoms/ZhangHeWeiGeneral.java b/Mage.Sets/src/mage/sets/portalthreekingdoms/ZhangHeWeiGeneral.java
new file mode 100644
index 00000000000..21d68409404
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/portalthreekingdoms/ZhangHeWeiGeneral.java
@@ -0,0 +1,71 @@
+/*
+ * 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.sets.portalthreekingdoms;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.AttacksTriggeredAbility;
+import mage.abilities.effects.common.continuous.BoostControlledEffect;
+import mage.abilities.keyword.HorsemanshipAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.filter.common.FilterCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class ZhangHeWeiGeneral extends CardImpl {
+
+ public ZhangHeWeiGeneral(UUID ownerId) {
+ super(ownerId, 95, "Zhang He, Wei General", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{B}{B}");
+ this.expansionSetCode = "PTK";
+ this.supertype.add("Legendary");
+ this.subtype.add("Human");
+ this.subtype.add("Soldier");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(2);
+
+ // Horsemanship
+ this.addAbility(HorsemanshipAbility.getInstance());
+ // Whenever Zhang He, Wei General attacks, each other creature you control gets +1/+0 until end of turn.
+ this.addAbility(new AttacksTriggeredAbility(new BoostControlledEffect(1, 0, Duration.EndOfTurn,
+ new FilterCreaturePermanent(), true), false));
+ }
+
+ public ZhangHeWeiGeneral(final ZhangHeWeiGeneral card) {
+ super(card);
+ }
+
+ @Override
+ public ZhangHeWeiGeneral copy() {
+ return new ZhangHeWeiGeneral(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/portalthreekingdoms/ZhangLiaoHeroOfHefei.java b/Mage.Sets/src/mage/sets/portalthreekingdoms/ZhangLiaoHeroOfHefei.java
new file mode 100644
index 00000000000..7d3cd947403
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/portalthreekingdoms/ZhangLiaoHeroOfHefei.java
@@ -0,0 +1,65 @@
+/*
+ * 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.sets.portalthreekingdoms;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.DealsDamageToOpponentTriggeredAbility;
+import mage.abilities.effects.common.discard.DiscardTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class ZhangLiaoHeroOfHefei extends CardImpl {
+
+ public ZhangLiaoHeroOfHefei(UUID ownerId) {
+ super(ownerId, 96, "Zhang Liao, Hero of Hefei", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{4}{B}{B}");
+ this.expansionSetCode = "PTK";
+ this.supertype.add("Legendary");
+ this.subtype.add("Human");
+ this.subtype.add("Soldier");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // Whenever Zhang Liao, Hero of Hefei deals damage to an opponent, that opponent discards a card.
+ this.addAbility(new DealsDamageToOpponentTriggeredAbility(new DiscardTargetEffect(1), false));
+ }
+
+ public ZhangLiaoHeroOfHefei(final ZhangLiaoHeroOfHefei card) {
+ super(card);
+ }
+
+ @Override
+ public ZhangLiaoHeroOfHefei copy() {
+ return new ZhangLiaoHeroOfHefei(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/portalthreekingdoms/ZhaoZilongTigerGeneral.java b/Mage.Sets/src/mage/sets/portalthreekingdoms/ZhaoZilongTigerGeneral.java
new file mode 100644
index 00000000000..221dd7ec38c
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/portalthreekingdoms/ZhaoZilongTigerGeneral.java
@@ -0,0 +1,70 @@
+/*
+ * 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.sets.portalthreekingdoms;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.BlocksTriggeredAbility;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.abilities.keyword.HorsemanshipAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class ZhaoZilongTigerGeneral extends CardImpl {
+
+ public ZhaoZilongTigerGeneral(UUID ownerId) {
+ super(ownerId, 33, "Zhao Zilong, Tiger General", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{W}{W}");
+ this.expansionSetCode = "PTK";
+ this.supertype.add("Legendary");
+ this.subtype.add("Human");
+ this.subtype.add("Soldier");
+ this.subtype.add("Warrior");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(3);
+
+ // Horsemanship
+ this.addAbility(HorsemanshipAbility.getInstance());
+ // Whenever Zhao Zilong, Tiger General blocks, it gets +1/+1 until end of turn.
+ this.addAbility(new BlocksTriggeredAbility(new BoostSourceEffect(1, 1, Duration.EndOfTurn), false));
+ }
+
+ public ZhaoZilongTigerGeneral(final ZhaoZilongTigerGeneral card) {
+ super(card);
+ }
+
+ @Override
+ public ZhaoZilongTigerGeneral copy() {
+ return new ZhaoZilongTigerGeneral(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/portalthreekingdoms/ZodiacDragon.java b/Mage.Sets/src/mage/sets/portalthreekingdoms/ZodiacDragon.java
new file mode 100644
index 00000000000..3b6459ec951
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/portalthreekingdoms/ZodiacDragon.java
@@ -0,0 +1,63 @@
+/*
+ * 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.sets.portalthreekingdoms;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.DiesTriggeredAbility;
+import mage.abilities.effects.common.ReturnToHandSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class ZodiacDragon extends CardImpl {
+
+ public ZodiacDragon(UUID ownerId) {
+ super(ownerId, 131, "Zodiac Dragon", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{7}{R}{R}");
+ this.expansionSetCode = "PTK";
+ this.subtype.add("Dragon");
+ this.power = new MageInt(8);
+ this.toughness = new MageInt(8);
+
+ // When Zodiac Dragon is put into your graveyard from the battlefield, you may return it to your hand.
+ this.addAbility(new DiesTriggeredAbility(new ReturnToHandSourceEffect(), true));
+ }
+
+ public ZodiacDragon(final ZodiacDragon card) {
+ super(card);
+ }
+
+ @Override
+ public ZodiacDragon copy() {
+ return new ZodiacDragon(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/portalthreekingdoms/ZuoCiTheMockingSage.java b/Mage.Sets/src/mage/sets/portalthreekingdoms/ZuoCiTheMockingSage.java
new file mode 100644
index 00000000000..a85f7893719
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/portalthreekingdoms/ZuoCiTheMockingSage.java
@@ -0,0 +1,78 @@
+/*
+ * 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.sets.portalthreekingdoms;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleEvasionAbility;
+import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesSourceEffect;
+import mage.abilities.keyword.HexproofAbility;
+import mage.abilities.keyword.HorsemanshipAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.AbilityPredicate;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class ZuoCiTheMockingSage extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures with horsemanship");
+
+ static {
+ filter.add(new AbilityPredicate(HorsemanshipAbility.class));
+ }
+
+ public ZuoCiTheMockingSage(UUID ownerId) {
+ super(ownerId, 165, "Zuo Ci, the Mocking Sage", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{G}{G}");
+ this.expansionSetCode = "PTK";
+ this.supertype.add("Legendary");
+ this.subtype.add("Human");
+ this.subtype.add("Advisor");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(2);
+
+ // Hexproof
+ this.addAbility(HexproofAbility.getInstance());
+ // Zuo Ci, the Mocking Sage can't be blocked by creatures with horsemanship.
+ this.addAbility(new SimpleEvasionAbility(new CantBeBlockedByCreaturesSourceEffect(filter, Duration.WhileOnBattlefield)));
+ }
+
+ public ZuoCiTheMockingSage(final ZuoCiTheMockingSage card) {
+ super(card);
+ }
+
+ @Override
+ public ZuoCiTheMockingSage copy() {
+ return new ZuoCiTheMockingSage(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/ravnica/Disembowel.java b/Mage.Sets/src/mage/sets/ravnica/Disembowel.java
new file mode 100644
index 00000000000..f9ca7d1503d
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/ravnica/Disembowel.java
@@ -0,0 +1,79 @@
+/*
+ * 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.sets.ravnica;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.SpellAbility;
+import mage.abilities.dynamicvalue.common.ManacostVariableValue;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.DestroyTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.Filter;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.ConvertedManaCostPredicate;
+import mage.game.Game;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Disembowel extends CardImpl {
+
+ public Disembowel(UUID ownerId) {
+ super(ownerId, 85, "Disembowel", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{X}{B}");
+ this.expansionSetCode = "RAV";
+
+ // Destroy target creature with converted mana cost X.
+ this.getSpellAbility().addEffect(new DestroyTargetEffect());
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent(new FilterCreaturePermanent("creature with converted mana cost X")));
+ }
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ if(ability instanceof SpellAbility) {
+ ability.getTargets().clear();
+ int xValue = ability.getManaCostsToPay().getX();
+ FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with converted mana cost X");
+ filter.add(new ConvertedManaCostPredicate(Filter.ComparisonType.Equal, xValue));
+ ability.addTarget(new TargetCreaturePermanent(filter));
+ }
+ }
+
+ public Disembowel(final Disembowel card) {
+ super(card);
+ }
+
+ @Override
+ public Disembowel copy() {
+ return new Disembowel(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/ravnica/FollowedFootsteps.java b/Mage.Sets/src/mage/sets/ravnica/FollowedFootsteps.java
index 4ab45ecce4c..76703050bb3 100644
--- a/Mage.Sets/src/mage/sets/ravnica/FollowedFootsteps.java
+++ b/Mage.Sets/src/mage/sets/ravnica/FollowedFootsteps.java
@@ -30,8 +30,10 @@ package mage.sets.ravnica;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.OnEventTriggeredAbility;
+import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.AttachEffect;
+import mage.abilities.effects.common.PutTokenOntoBattlefieldCopyTargetEffect;
import mage.abilities.keyword.EnchantAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
@@ -40,15 +42,14 @@ import mage.constants.Rarity;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
-import mage.game.permanent.token.EmptyToken;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
-import mage.util.CardUtil;
+import mage.target.targetpointer.FixedTarget;
/**
*
* @author LoneFox
-
+ *
*/
public class FollowedFootsteps extends CardImpl {
@@ -99,10 +100,9 @@ class FollowedFootstepsEffect extends OneShotEffect {
Permanent enchantment = game.getPermanentOrLKIBattlefield(source.getSourceId());
Permanent target = game.getPermanentOrLKIBattlefield(enchantment.getAttachedTo());
if (target != null) {
- EmptyToken token = new EmptyToken();
- CardUtil.copyTo(token).from(target);
- token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId());
- return true;
+ Effect effect = new PutTokenOntoBattlefieldCopyTargetEffect();
+ effect.setTargetPointer(new FixedTarget(enchantment.getAttachedTo()));
+ return effect.apply(game, source);
}
return false;
}
diff --git a/Mage.Sets/src/mage/sets/ravnica/PsychicDrain.java b/Mage.Sets/src/mage/sets/ravnica/PsychicDrain.java
new file mode 100644
index 00000000000..153217668e7
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/ravnica/PsychicDrain.java
@@ -0,0 +1,66 @@
+/*
+ * 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.sets.ravnica;
+
+import java.util.UUID;
+import mage.abilities.dynamicvalue.common.ManacostVariableValue;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.GainLifeEffect;
+import mage.abilities.effects.common.PutLibraryIntoGraveTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.target.TargetPlayer;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class PsychicDrain extends CardImpl {
+
+ public PsychicDrain(UUID ownerId) {
+ super(ownerId, 220, "Psychic Drain", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{X}{U}{B}");
+ this.expansionSetCode = "RAV";
+
+ // Target player puts the top X cards of his or her library into his or her graveyard and you gain X life.
+ this.getSpellAbility().addEffect(new PutLibraryIntoGraveTargetEffect(new ManacostVariableValue()));
+ this.getSpellAbility().addTarget(new TargetPlayer());
+ Effect effect = new GainLifeEffect(new ManacostVariableValue());
+ effect.setText("and you gain X life");
+ this.getSpellAbility().addEffect(effect);
+ }
+
+ public PsychicDrain(final PsychicDrain card) {
+ super(card);
+ }
+
+ @Override
+ public PsychicDrain copy() {
+ return new PsychicDrain(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/returntoravnica/DeviantGlee.java b/Mage.Sets/src/mage/sets/returntoravnica/DeviantGlee.java
index 8aaa3abe553..2470858d5d4 100644
--- a/Mage.Sets/src/mage/sets/returntoravnica/DeviantGlee.java
+++ b/Mage.Sets/src/mage/sets/returntoravnica/DeviantGlee.java
@@ -1,88 +1,88 @@
-/*
- * 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.sets.returntoravnica;
-
-import java.util.UUID;
-import mage.constants.AttachmentType;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.Outcome;
-import mage.constants.Rarity;
-import mage.constants.Zone;
-import mage.abilities.Ability;
-import mage.abilities.common.SimpleActivatedAbility;
-import mage.abilities.common.SimpleStaticAbility;
-import mage.abilities.costs.mana.ManaCostsImpl;
-import mage.abilities.effects.common.AttachEffect;
-import mage.abilities.effects.common.continuous.BoostEnchantedEffect;
-import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
-import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
-import mage.abilities.keyword.EnchantAbility;
-import mage.abilities.keyword.TrampleAbility;
-import mage.cards.CardImpl;
-import mage.target.TargetPermanent;
-import mage.target.common.TargetCreaturePermanent;
-
-/**
- *
- * @author LevelX2
- */
-public class DeviantGlee extends CardImpl {
-
- static final String rule = "and has \"{R}: This creature gains trample until end of turn";
-
- public DeviantGlee (UUID ownerId) {
- super(ownerId, 65, "Deviant Glee", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{B}");
- this.expansionSetCode = "RTR";
- this.subtype.add("Aura");
- this.color.setBlack(true);
-
- // Enchant creature
- TargetPermanent auraTarget = new TargetCreaturePermanent();
- this.getSpellAbility().addTarget(auraTarget);
- this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
- Ability ability = new EnchantAbility(auraTarget.getTargetName());
- this.addAbility(ability);
-
- // Enchanted creature gets +2/+1 and has "{R}: This creature gains trample until end of turn."
- SimpleStaticAbility ability2 = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(2, 1, Duration.WhileOnBattlefield));
- Ability gainedAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainAbilitySourceEffect(TrampleAbility.getInstance(),Duration.EndOfTurn),new ManaCostsImpl("{R}"));
- ability2.addEffect(new GainAbilityAttachedEffect(gainedAbility, AttachmentType.AURA, Duration.WhileOnBattlefield, rule));
- this.addAbility(ability2);
- }
-
- public DeviantGlee (final DeviantGlee card) {
- super(card);
- }
-
- @Override
- public DeviantGlee copy() {
- return new DeviantGlee(this);
- }
-}
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+
+package mage.sets.returntoravnica;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.AttachEffect;
+import mage.abilities.effects.common.continuous.BoostEnchantedEffect;
+import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
+import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
+import mage.abilities.keyword.EnchantAbility;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardImpl;
+import mage.constants.AttachmentType;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.target.TargetPermanent;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class DeviantGlee extends CardImpl {
+
+ static final String rule = "and has \"{R}: This creature gains trample until end of turn.\"";
+
+ public DeviantGlee (UUID ownerId) {
+ super(ownerId, 65, "Deviant Glee", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{B}");
+ this.expansionSetCode = "RTR";
+ this.subtype.add("Aura");
+ this.color.setBlack(true);
+
+ // Enchant creature
+ TargetPermanent auraTarget = new TargetCreaturePermanent();
+ this.getSpellAbility().addTarget(auraTarget);
+ this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature));
+ Ability ability = new EnchantAbility(auraTarget.getTargetName());
+ this.addAbility(ability);
+
+ // Enchanted creature gets +2/+1 and has "{R}: This creature gains trample until end of turn."
+ SimpleStaticAbility ability2 = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(2, 1, Duration.WhileOnBattlefield));
+ Ability gainedAbility = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainAbilitySourceEffect(TrampleAbility.getInstance(),Duration.EndOfTurn),new ManaCostsImpl("{R}"));
+ ability2.addEffect(new GainAbilityAttachedEffect(gainedAbility, AttachmentType.AURA, Duration.WhileOnBattlefield, rule));
+ this.addAbility(ability2);
+ }
+
+ public DeviantGlee (final DeviantGlee card) {
+ super(card);
+ }
+
+ @Override
+ public DeviantGlee copy() {
+ return new DeviantGlee(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/returntoravnica/ManaBloom.java b/Mage.Sets/src/mage/sets/returntoravnica/ManaBloom.java
index 155244c026e..f0d423cd6f4 100644
--- a/Mage.Sets/src/mage/sets/returntoravnica/ManaBloom.java
+++ b/Mage.Sets/src/mage/sets/returntoravnica/ManaBloom.java
@@ -100,12 +100,13 @@ class ManaBloomEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null) {
- Object obj = getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
- if (obj != null && obj instanceof SpellAbility
- && permanent.getZoneChangeCounter(game) - 1 == ((SpellAbility) obj).getSourceObjectZoneChangeCounter()) {
+ SpellAbility spellAbility = (SpellAbility) getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
+ if (spellAbility != null
+ && spellAbility.getSourceId().equals(source.getSourceId())
+ && permanent.getZoneChangeCounter(game) - 1 == spellAbility.getSourceObjectZoneChangeCounter()) {
// delete to prevent using it again if put into battlefield from other effect
setValue(mage.abilities.effects.EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY, null);
- int amount = ((SpellAbility) obj).getManaCostsToPay().getX();
+ int amount = spellAbility.getManaCostsToPay().getX();
if (amount > 0) {
permanent.addCounters(CounterType.CHARGE.createInstance(amount), game);
return true;
diff --git a/Mage.Sets/src/mage/sets/revisededition/Conversion.java b/Mage.Sets/src/mage/sets/revisededition/Conversion.java
new file mode 100644
index 00000000000..d5ad6eb5c9e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/revisededition/Conversion.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.revisededition;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class Conversion extends mage.sets.limitedalpha.Conversion {
+
+ public Conversion(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 198;
+ this.expansionSetCode = "3ED";
+ }
+
+ public Conversion(final Conversion card) {
+ super(card);
+ }
+
+ @Override
+ public Conversion copy() {
+ return new Conversion(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/revisededition/CursedLand.java b/Mage.Sets/src/mage/sets/revisededition/CursedLand.java
new file mode 100644
index 00000000000..bae229c5d22
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/revisededition/CursedLand.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.revisededition;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class CursedLand extends mage.sets.fourthedition.CursedLand {
+
+ public CursedLand(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 6;
+ this.expansionSetCode = "3ED";
+ }
+
+ public CursedLand(final CursedLand card) {
+ super(card);
+ }
+
+ @Override
+ public CursedLand copy() {
+ return new CursedLand(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/revisededition/DwarvenWeaponsmith.java b/Mage.Sets/src/mage/sets/revisededition/DwarvenWeaponsmith.java
new file mode 100644
index 00000000000..e3ebea81631
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/revisededition/DwarvenWeaponsmith.java
@@ -0,0 +1,79 @@
+/*
+ * 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.sets.revisededition;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.condition.common.IsStepCondition;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.decorator.ConditionalActivatedAbility;
+import mage.abilities.effects.common.counter.AddCountersTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.PhaseStep;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.counters.CounterType;
+import mage.filter.common.FilterControlledArtifactPermanent;
+import mage.target.common.TargetControlledPermanent;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class DwarvenWeaponsmith extends CardImpl {
+
+ public DwarvenWeaponsmith(UUID ownerId) {
+ super(ownerId, 144, "Dwarven Weaponsmith", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{R}");
+ this.expansionSetCode = "3ED";
+ this.subtype.add("Dwarf");
+ this.subtype.add("Artificer");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // {tap}, Sacrifice an artifact: Put a +1/+1 counter on target creature. Activate this ability only during your upkeep.
+ Ability ability = new ConditionalActivatedAbility(Zone.BATTLEFIELD, new AddCountersTargetEffect(CounterType.P1P1.createInstance()),
+ new TapSourceCost(), new IsStepCondition(PhaseStep.UPKEEP), null);
+ ability.addCost(new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledArtifactPermanent("an artifact"))));
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+ }
+
+ public DwarvenWeaponsmith(final DwarvenWeaponsmith card) {
+ super(card);
+ }
+
+ @Override
+ public DwarvenWeaponsmith copy() {
+ return new DwarvenWeaponsmith(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/revisededition/Feedback.java b/Mage.Sets/src/mage/sets/revisededition/Feedback.java
new file mode 100644
index 00000000000..31cd18bffbe
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/revisededition/Feedback.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.revisededition;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Feedback extends mage.sets.limitedalpha.Feedback {
+
+ public Feedback(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 58;
+ this.expansionSetCode = "3ED";
+ }
+
+ public Feedback(final Feedback card) {
+ super(card);
+ }
+
+ @Override
+ public Feedback copy() {
+ return new Feedback(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/revisededition/GraniteGargoyle.java b/Mage.Sets/src/mage/sets/revisededition/GraniteGargoyle.java
new file mode 100644
index 00000000000..3191c635ce3
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/revisededition/GraniteGargoyle.java
@@ -0,0 +1,69 @@
+/*
+ * 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.sets.revisededition;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class GraniteGargoyle extends CardImpl {
+
+ public GraniteGargoyle(UUID ownerId) {
+ super(ownerId, 155, "Granite Gargoyle", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{R}");
+ this.expansionSetCode = "3ED";
+ this.subtype.add("Gargoyle");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+ // {R}: Granite Gargoyle gets +0/+1 until end of turn.
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(0, 1, Duration.EndOfTurn), new ManaCostsImpl("{R}")));
+ }
+
+ public GraniteGargoyle(final GraniteGargoyle card) {
+ super(card);
+ }
+
+ @Override
+ public GraniteGargoyle copy() {
+ return new GraniteGargoyle(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/revisededition/LivingArtifact.java b/Mage.Sets/src/mage/sets/revisededition/LivingArtifact.java
new file mode 100644
index 00000000000..11f4e77781d
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/revisededition/LivingArtifact.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.revisededition;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class LivingArtifact extends mage.sets.fifthedition.LivingArtifact {
+
+ public LivingArtifact(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 116;
+ this.expansionSetCode = "3ED";
+ }
+
+ public LivingArtifact(final LivingArtifact card) {
+ super(card);
+ }
+
+ @Override
+ public LivingArtifact copy() {
+ return new LivingArtifact(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/revisededition/Sacrifice.java b/Mage.Sets/src/mage/sets/revisededition/Sacrifice.java
new file mode 100644
index 00000000000..acce4e3f6e8
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/revisededition/Sacrifice.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.revisededition;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Sacrifice extends mage.sets.unlimitededition.Sacrifice {
+
+ public Sacrifice(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 34;
+ this.expansionSetCode = "3ED";
+ }
+
+ public Sacrifice(final Sacrifice card) {
+ super(card);
+ }
+
+ @Override
+ public Sacrifice copy() {
+ return new Sacrifice(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/revisededition/SorceressQueen.java b/Mage.Sets/src/mage/sets/revisededition/SorceressQueen.java
new file mode 100644
index 00000000000..c8bdbd5ed3b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/revisededition/SorceressQueen.java
@@ -0,0 +1,80 @@
+/*
+ * 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.sets.revisededition;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.effects.common.continuous.SetPowerToughnessTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.permanent.AnotherPredicate;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class SorceressQueen extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature other than {this}");
+
+ static {
+ filter.add(new AnotherPredicate());
+ }
+
+ public SorceressQueen(UUID ownerId) {
+ super(ownerId, 39, "Sorceress Queen", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{B}{B}");
+ this.expansionSetCode = "3ED";
+ this.subtype.add("Human");
+ this.subtype.add("Wizard");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // {tap}: Target creature other than Sorceress Queen becomes 0/2 until end of turn.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new SetPowerToughnessTargetEffect(0, 2, Duration.EndOfTurn), new TapSourceCost());
+ ability.addTarget(new TargetCreaturePermanent(filter));
+ this.addAbility(ability);
+
+ }
+
+ public SorceressQueen(final SorceressQueen card) {
+ super(card);
+ }
+
+ @Override
+ public SorceressQueen copy() {
+ return new SorceressQueen(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/revisededition/VesuvanDoppelganger.java b/Mage.Sets/src/mage/sets/revisededition/VesuvanDoppelganger.java
new file mode 100644
index 00000000000..f47eda8e13d
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/revisededition/VesuvanDoppelganger.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.revisededition;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class VesuvanDoppelganger extends mage.sets.unlimitededition.VesuvanDoppelganger {
+
+ public VesuvanDoppelganger(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 88;
+ this.expansionSetCode = "3ED";
+ }
+
+ public VesuvanDoppelganger(final VesuvanDoppelganger card) {
+ super(card);
+ }
+
+ @Override
+ public VesuvanDoppelganger copy() {
+ return new VesuvanDoppelganger(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/revisededition/Wanderlust.java b/Mage.Sets/src/mage/sets/revisededition/Wanderlust.java
new file mode 100644
index 00000000000..522ce6f4bf6
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/revisededition/Wanderlust.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.revisededition;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Wanderlust extends mage.sets.unlimitededition.Wanderlust {
+
+ public Wanderlust(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 134;
+ this.expansionSetCode = "3ED";
+ }
+
+ public Wanderlust(final Wanderlust card) {
+ super(card);
+ }
+
+ @Override
+ public Wanderlust copy() {
+ return new Wanderlust(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/revisededition/WarpArtifact.java b/Mage.Sets/src/mage/sets/revisededition/WarpArtifact.java
new file mode 100644
index 00000000000..d0db483889a
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/revisededition/WarpArtifact.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.revisededition;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class WarpArtifact extends mage.sets.fifthedition.WarpArtifact {
+
+ public WarpArtifact(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 43;
+ this.expansionSetCode = "3ED";
+ }
+
+ public WarpArtifact(final WarpArtifact card) {
+ super(card);
+ }
+
+ @Override
+ public WarpArtifact copy() {
+ return new WarpArtifact(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/riseoftheeldrazi/GideonJura.java b/Mage.Sets/src/mage/sets/riseoftheeldrazi/GideonJura.java
index d01d66c5968..45fdec326b5 100644
--- a/Mage.Sets/src/mage/sets/riseoftheeldrazi/GideonJura.java
+++ b/Mage.Sets/src/mage/sets/riseoftheeldrazi/GideonJura.java
@@ -29,10 +29,6 @@
package mage.sets.riseoftheeldrazi;
import java.util.UUID;
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.Rarity;
-import mage.constants.TurnPhase;
import mage.MageInt;
import mage.MageObjectReference;
import mage.abilities.Ability;
@@ -40,11 +36,15 @@ import mage.abilities.LoyaltyAbility;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.RequirementEffect;
-import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect;
-import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.abilities.effects.common.PreventAllDamageToSourceEffect;
+import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect;
+import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.TurnPhase;
import mage.counters.CounterType;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.permanent.TappedPredicate;
diff --git a/Mage.Sets/src/mage/sets/riseoftheeldrazi/PestilenceDemon.java b/Mage.Sets/src/mage/sets/riseoftheeldrazi/PestilenceDemon.java
index 69e7612cb17..0256675d651 100644
--- a/Mage.Sets/src/mage/sets/riseoftheeldrazi/PestilenceDemon.java
+++ b/Mage.Sets/src/mage/sets/riseoftheeldrazi/PestilenceDemon.java
@@ -25,13 +25,9 @@
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
-
package mage.sets.riseoftheeldrazi;
import java.util.UUID;
-
-import mage.constants.CardType;
-import mage.constants.Rarity;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
@@ -39,7 +35,9 @@ import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
+import mage.constants.CardType;
import mage.constants.Outcome;
+import mage.constants.Rarity;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.permanent.Permanent;
@@ -51,7 +49,7 @@ import mage.players.Player;
*/
public class PestilenceDemon extends CardImpl {
- public PestilenceDemon (UUID ownerId) {
+ public PestilenceDemon(UUID ownerId) {
super(ownerId, 124, "Pestilence Demon", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{5}{B}{B}{B}");
this.expansionSetCode = "ROE";
this.subtype.add("Demon");
@@ -62,7 +60,7 @@ public class PestilenceDemon extends CardImpl {
this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new PestilenceDemonEffect(), new ManaCostsImpl("{B}")));
}
- public PestilenceDemon (final PestilenceDemon card) {
+ public PestilenceDemon(final PestilenceDemon card) {
super(card);
}
@@ -74,6 +72,7 @@ public class PestilenceDemon extends CardImpl {
}
class PestilenceDemonEffect extends OneShotEffect {
+
PestilenceDemonEffect() {
super(Outcome.Damage);
staticText = "{this} deals 1 damage to each creature and each player";
@@ -94,7 +93,7 @@ class PestilenceDemonEffect extends OneShotEffect {
for (UUID playerId : game.getPlayerList()) {
Player p = game.getPlayer(playerId);
if (p != null) {
- p.damage(1, source.getSourceId(), game, true, false);
+ p.damage(1, source.getSourceId(), game, false, true);
}
}
return true;
@@ -105,4 +104,4 @@ class PestilenceDemonEffect extends OneShotEffect {
return new PestilenceDemonEffect(this);
}
-}
\ No newline at end of file
+}
diff --git a/Mage.Sets/src/mage/sets/saviorsofkamigawa/MagaTraitorToMortals.java b/Mage.Sets/src/mage/sets/saviorsofkamigawa/MagaTraitorToMortals.java
index fa2c2afda1e..028f9299594 100644
--- a/Mage.Sets/src/mage/sets/saviorsofkamigawa/MagaTraitorToMortals.java
+++ b/Mage.Sets/src/mage/sets/saviorsofkamigawa/MagaTraitorToMortals.java
@@ -97,10 +97,11 @@ class MagaTraitorToMortalsEnterBattlefieldEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null) {
- Object obj = getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
- if (obj != null && obj instanceof SpellAbility
- && permanent.getZoneChangeCounter(game) - 1 == ((SpellAbility) obj).getSourceObjectZoneChangeCounter()) {
- int amount = ((SpellAbility) obj).getManaCostsToPay().getX();
+ SpellAbility spellAbility = (SpellAbility) getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
+ if (spellAbility != null
+ && spellAbility.getSourceId().equals(source.getSourceId())
+ && permanent.getZoneChangeCounter(game) - 1 == spellAbility.getSourceObjectZoneChangeCounter()) {
+ int amount = spellAbility.getManaCostsToPay().getX();
if (amount > 0) {
permanent.addCounters(CounterType.P1P1.createInstance(amount), game);
}
diff --git a/Mage.Sets/src/mage/sets/saviorsofkamigawa/SakashimaTheImpostor.java b/Mage.Sets/src/mage/sets/saviorsofkamigawa/SakashimaTheImpostor.java
index 5e769b0a006..b902d364f2d 100644
--- a/Mage.Sets/src/mage/sets/saviorsofkamigawa/SakashimaTheImpostor.java
+++ b/Mage.Sets/src/mage/sets/saviorsofkamigawa/SakashimaTheImpostor.java
@@ -29,6 +29,7 @@ package mage.sets.saviorsofkamigawa;
import java.util.UUID;
import mage.MageInt;
+import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.common.SimpleStaticAbility;
@@ -119,6 +120,21 @@ class SakashimaTheImpostorCopyEffect extends OneShotEffect {
), game);
return true;
}
+
+ @Override
+ public Boolean apply(Game game, MageObject mageObject) {
+ if (!mageObject.getSupertype().contains("Legendary")) {
+ mageObject.getSubtype().add("Legendary");
+ }
+ mageObject.setName("Sakashima the Impostor");
+ // {2}{U}{U}: Return Sakashima the Impostor to its owner's hand at the beginning of the next end step
+ mageObject.getAbilities().add(new SimpleActivatedAbility(Zone.BATTLEFIELD,
+ new CreateDelayedTriggeredAbilityEffect(new AtTheBeginOfNextEndStepDelayedTriggeredAbility(new ReturnToHandSourceEffect(true)), false),
+ new ManaCostsImpl("{2}{U}{U}")
+ ));
+ return true;
+ }
+
});
return true;
diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/ChimericMass.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/ChimericMass.java
index e554b7b6c37..6ca59c6d7b8 100644
--- a/Mage.Sets/src/mage/sets/scarsofmirrodin/ChimericMass.java
+++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/ChimericMass.java
@@ -92,10 +92,11 @@ class ChimericMassEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null) {
- Object obj = getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
- if (obj != null && obj instanceof SpellAbility
- && permanent.getZoneChangeCounter(game) - 1 == ((SpellAbility) obj).getSourceObjectZoneChangeCounter()) {
- int amount = ((SpellAbility) obj).getManaCostsToPay().getX();
+ SpellAbility spellAbility = (SpellAbility) getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
+ if (spellAbility != null
+ && spellAbility.getSourceId().equals(source.getSourceId())
+ && permanent.getZoneChangeCounter(game) - 1 == spellAbility.getSourceObjectZoneChangeCounter()) {
+ int amount = spellAbility.getManaCostsToPay().getX();
if (amount > 0) {
permanent.addCounters(CounterType.CHARGE.createInstance(amount), game);
}
diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/MoltenPsyche.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/MoltenPsyche.java
index 42122cfa4cc..2f8ea8af1a8 100644
--- a/Mage.Sets/src/mage/sets/scarsofmirrodin/MoltenPsyche.java
+++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/MoltenPsyche.java
@@ -101,6 +101,9 @@ class MoltenPsycheEffect extends OneShotEffect {
player.shuffleLibrary(game);
}
}
+
+ game.applyEffects(); // so effects from creatures that were on the battlefield won't trigger from draw action
+
for (UUID playerId : cardsToDraw.keySet()) {
Player player = game.getPlayer(playerId);
if (player != null) {
diff --git a/Mage.Sets/src/mage/sets/scarsofmirrodin/NecroticOoze.java b/Mage.Sets/src/mage/sets/scarsofmirrodin/NecroticOoze.java
index 65d7927c47c..e49932fcb04 100644
--- a/Mage.Sets/src/mage/sets/scarsofmirrodin/NecroticOoze.java
+++ b/Mage.Sets/src/mage/sets/scarsofmirrodin/NecroticOoze.java
@@ -1,16 +1,16 @@
/*
* Copyright 2011 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
@@ -20,14 +20,25 @@
* 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.sets.scarsofmirrodin;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.ActivatedAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.ContinuousEffect;
+import mage.abilities.effects.ContinuousEffectImpl;
+import mage.cards.Card;
+import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Layer;
@@ -35,16 +46,10 @@ import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.constants.SubLayer;
import mage.constants.Zone;
-import mage.MageInt;
-import mage.abilities.Ability;
-import mage.abilities.ActivatedAbility;
-import mage.abilities.StaticAbility;
-import mage.abilities.effects.ContinuousEffectImpl;
-import mage.cards.Card;
-import mage.cards.CardImpl;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
+import mage.sets.futuresight.YixlidJailer;
/**
*
@@ -60,7 +65,8 @@ public class NecroticOoze extends CardImpl {
this.power = new MageInt(4);
this.toughness = new MageInt(3);
- this.addAbility(new NecroticOozeAbility());
+ // As long as Necrotic Ooze is on the battlefield, it has all activated abilities of all creature cards in all graveyards
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new NecroticOozeEffect()));
}
public NecroticOoze(final NecroticOoze card) {
@@ -72,48 +78,27 @@ public class NecroticOoze extends CardImpl {
return new NecroticOoze(this);
}
-}
+ class NecroticOozeEffect extends ContinuousEffectImpl {
-class NecroticOozeAbility extends StaticAbility {
+ public NecroticOozeEffect() {
+ super(Duration.WhileOnBattlefield, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility);
+ staticText = "As long as {this} is on the battlefield, it has all activated abilities of all creature cards in all graveyards";
+ }
- public NecroticOozeAbility() {
- super(Zone.BATTLEFIELD, new NecroticOozeEffect());
- }
+ public NecroticOozeEffect(final NecroticOozeEffect effect) {
+ super(effect);
+ }
- public NecroticOozeAbility(final NecroticOozeAbility ability) {
- super(ability);
- }
-
- @Override
- public NecroticOozeAbility copy() {
- return new NecroticOozeAbility(this);
- }
-
-}
-
-class NecroticOozeEffect extends ContinuousEffectImpl {
-
- public NecroticOozeEffect() {
- super(Duration.WhileOnBattlefield, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility);
- staticText = "As long as {this} is on the battlefield, it has all activated abilities of all creature cards in all graveyards";
- }
-
- public NecroticOozeEffect(final NecroticOozeEffect effect) {
- super(effect);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Player controller = game.getPlayer(source.getControllerId());
- if (controller != null) {
+ @Override
+ public boolean apply(Game game, Ability source) {
Permanent perm = game.getPermanent(source.getSourceId());
if (perm != null) {
- for (UUID playerId: controller.getInRange()) {
+ for (UUID playerId : game.getState().getPlayersInRange(source.getControllerId(), game)) {
Player player = game.getPlayer(playerId);
if (player != null) {
- for (Card card: player.getGraveyard().getCards(game)) {
+ for (Card card : player.getGraveyard().getCards(game)) {
if (card.getCardType().contains(CardType.CREATURE)) {
- for (Ability ability: card.getAbilities()) {
+ for (Ability ability : card.getAbilities()) {
if (ability instanceof ActivatedAbility) {
perm.addAbility(ability, game);
}
@@ -122,15 +107,31 @@ class NecroticOozeEffect extends ContinuousEffectImpl {
}
}
}
+ return true;
}
- return true;
+ return false;
+ }
+
+ @Override
+ public NecroticOozeEffect copy() {
+ return new NecroticOozeEffect(this);
+ }
+
+ @Override
+ public Set isDependentTo(List allEffectsInLayer) {
+ // the dependent classes needs to be an enclosed class for dependent check of continuous effects
+ Set dependentTo = null;
+ for (ContinuousEffect effect : allEffectsInLayer) {
+ // http://www.mtgsalvation.com/forums/magic-fundamentals/magic-rulings/magic-rulings-archives/285211-yixlid-jailer-vs-necrotic-ooze
+ if (YixlidJailer.class.equals(effect.getClass().getEnclosingClass())) {
+ if (dependentTo == null) {
+ dependentTo = new HashSet<>();
+ }
+ dependentTo.add(effect.getId());
+ }
+ }
+ return dependentTo;
}
- return false;
}
- @Override
- public NecroticOozeEffect copy() {
- return new NecroticOozeEffect(this);
- }
-
-}
\ No newline at end of file
+}
diff --git a/Mage.Sets/src/mage/sets/scourge/FinalPunishment.java b/Mage.Sets/src/mage/sets/scourge/FinalPunishment.java
new file mode 100644
index 00000000000..6fe0446b51b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/scourge/FinalPunishment.java
@@ -0,0 +1,91 @@
+/*
+ * 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.sets.scourge;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.dynamicvalue.DynamicValue;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.LoseLifeTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.game.Game;
+import mage.target.TargetPlayer;
+import mage.watchers.common.AmountOfDamageAPlayerReceivedThisTurnWatcher;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class FinalPunishment extends CardImpl {
+
+ public FinalPunishment(UUID ownerId) {
+ super(ownerId, 67, "Final Punishment", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{3}{B}{B}");
+ this.expansionSetCode = "SCG";
+
+ // Target player loses life equal to the damage already dealt to him or her this turn.
+ Effect effect = new LoseLifeTargetEffect(new FinalPunishmentAmount());
+ effect.setText("target player loses life equal to the damage already dealt to him or her this turn");
+ this.getSpellAbility().addEffect(effect);
+ this.getSpellAbility().addTarget(new TargetPlayer());
+ this.getSpellAbility().addWatcher(new AmountOfDamageAPlayerReceivedThisTurnWatcher());
+ }
+
+ public FinalPunishment(final FinalPunishment card) {
+ super(card);
+ }
+
+ @Override
+ public FinalPunishment copy() {
+ return new FinalPunishment(this);
+ }
+}
+
+class FinalPunishmentAmount implements DynamicValue {
+
+ @Override
+ public int calculate(Game game, Ability source, Effect effect) {
+ AmountOfDamageAPlayerReceivedThisTurnWatcher watcher
+ = (AmountOfDamageAPlayerReceivedThisTurnWatcher) game.getState().getWatchers().get("AmountOfDamageReceivedThisTurn");
+ if(watcher != null) {
+ return watcher.getAmountOfDamageReceivedThisTurn(source.getFirstTarget());
+ }
+ return 0;
+ }
+
+ @Override
+ public FinalPunishmentAmount copy() {
+ return new FinalPunishmentAmount();
+ }
+
+ @Override
+ public String getMessage() {
+ return "the damage already dealt to him or her this turn";
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/scourge/RavenGuildMaster.java b/Mage.Sets/src/mage/sets/scourge/RavenGuildMaster.java
index 938a4bc5dcb..e6c35248d15 100644
--- a/Mage.Sets/src/mage/sets/scourge/RavenGuildMaster.java
+++ b/Mage.Sets/src/mage/sets/scourge/RavenGuildMaster.java
@@ -29,18 +29,13 @@ package mage.sets.scourge;
import java.util.UUID;
import mage.MageInt;
-import mage.abilities.Ability;
import mage.abilities.common.DealsDamageToAPlayerTriggeredAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
-import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.ExileCardsFromTopOfLibraryTargetEffect;
import mage.abilities.keyword.MorphAbility;
-import mage.cards.Card;
import mage.cards.CardImpl;
import mage.constants.CardType;
-import mage.constants.Outcome;
import mage.constants.Rarity;
-import mage.game.Game;
-import mage.players.Player;
/**
*
@@ -58,8 +53,8 @@ public class RavenGuildMaster extends CardImpl {
this.toughness = new MageInt(1);
// Whenever Raven Guild Master deals combat damage to a player, that player exiles the top ten cards of his or her library.
- this.addAbility(new DealsDamageToAPlayerTriggeredAbility(new RavenGuildMasterEffect(), false, true));
-
+ this.addAbility(new DealsDamageToAPlayerTriggeredAbility(new ExileCardsFromTopOfLibraryTargetEffect(10, "that player"), false, true));
+
// Morph {2}{U}{U}
this.addAbility(new MorphAbility(this, new ManaCostsImpl("{2}{U}{U}")));
}
@@ -73,36 +68,3 @@ public class RavenGuildMaster extends CardImpl {
return new RavenGuildMaster(this);
}
}
-
-class RavenGuildMasterEffect extends OneShotEffect {
-
- public RavenGuildMasterEffect() {
- super(Outcome.Exile);
- this.staticText = "that player exiles the top ten cards of his or her library";
- }
-
- public RavenGuildMasterEffect(final RavenGuildMasterEffect effect) {
- super(effect);
- }
-
- @Override
- public RavenGuildMasterEffect copy() {
- return new RavenGuildMasterEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Player player = game.getPlayer(targetPointer.getFirst(game, source));
- if (player != null) {
- int count = Math.min(player.getLibrary().size(), 10);
- for (int i = 0; i < count; i++) {
- Card card = player.getLibrary().removeFromTop(game);
- if (card != null) {
- card.moveToExile(id, "", source.getSourceId(), game);
- }
- }
- return true;
- }
- return false;
- }
-}
\ No newline at end of file
diff --git a/Mage.Sets/src/mage/sets/scourge/VengefulDead.java b/Mage.Sets/src/mage/sets/scourge/VengefulDead.java
new file mode 100644
index 00000000000..702ee27ee90
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/scourge/VengefulDead.java
@@ -0,0 +1,71 @@
+/*
+ * 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.sets.scourge;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.DiesThisOrAnotherCreatureTriggeredAbility;
+import mage.abilities.effects.common.LoseLifeOpponentsEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class VengefulDead extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("{this} or another Zombie");
+
+ static {
+ filter.add(new SubtypePredicate("Zombie"));
+ }
+
+ public VengefulDead(UUID ownerId) {
+ super(ownerId, 80, "Vengeful Dead", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{B}");
+ this.expansionSetCode = "SCG";
+ this.subtype.add("Zombie");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(2);
+
+ // Whenever Vengeful Dead or another Zombie dies, each opponent loses 1 life.
+ this.addAbility(new DiesThisOrAnotherCreatureTriggeredAbility(new LoseLifeOpponentsEffect(1), false, filter));
+ }
+
+ public VengefulDead(final VengefulDead card) {
+ super(card);
+ }
+
+ @Override
+ public VengefulDead copy() {
+ return new VengefulDead(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/shadowmoor/DemigodOfRevenge.java b/Mage.Sets/src/mage/sets/shadowmoor/DemigodOfRevenge.java
index e64a220bb48..85977dde261 100644
--- a/Mage.Sets/src/mage/sets/shadowmoor/DemigodOfRevenge.java
+++ b/Mage.Sets/src/mage/sets/shadowmoor/DemigodOfRevenge.java
@@ -30,8 +30,8 @@ package mage.sets.shadowmoor;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
-import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.CastSourceTriggeredAbility;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.HasteAbility;
import mage.cards.Card;
@@ -43,8 +43,6 @@ import mage.constants.Zone;
import mage.filter.FilterCard;
import mage.filter.predicate.mageobject.NamePredicate;
import mage.game.Game;
-import mage.game.events.GameEvent;
-import mage.game.events.GameEvent.EventType;
import mage.players.Player;
/**
@@ -64,10 +62,12 @@ public class DemigodOfRevenge extends CardImpl {
// Flying
this.addAbility(FlyingAbility.getInstance());
+
// Haste
this.addAbility(HasteAbility.getInstance());
+
// When you cast Demigod of Revenge, return all cards named Demigod of Revenge from your graveyard to the battlefield.
- this.addAbility(new DemigodOfRevengeTriggeredAbility());
+ this.addAbility(new CastSourceTriggeredAbility(new DemigodOfRevengeReturnEffect()));
}
public DemigodOfRevenge(final DemigodOfRevenge card) {
@@ -80,40 +80,10 @@ public class DemigodOfRevenge extends CardImpl {
}
}
-class DemigodOfRevengeTriggeredAbility extends TriggeredAbilityImpl {
-
- public DemigodOfRevengeTriggeredAbility() {
- super(Zone.STACK, new DemigodOfRevengeReturnEffect(), false);
- }
-
- public DemigodOfRevengeTriggeredAbility(final DemigodOfRevengeTriggeredAbility ability) {
- super(ability);
- }
-
- @Override
- public DemigodOfRevengeTriggeredAbility copy() {
- return new DemigodOfRevengeTriggeredAbility(this);
- }
-
- @Override
- public boolean checkEventType(GameEvent event, Game game) {
- return event.getType() == EventType.SPELL_CAST;
- }
-
- @Override
- public boolean checkTrigger(GameEvent event, Game game) {
- return event.getSourceId().equals(this.getSourceId());
- }
-
- @Override
- public String getRule() {
- return "When you cast {this}, " + super.getRule();
- }
-}
-
class DemigodOfRevengeReturnEffect extends OneShotEffect {
private static final FilterCard filter = new FilterCard();
+
static {
filter.add(new NamePredicate("Demigod of Revenge"));
}
diff --git a/Mage.Sets/src/mage/sets/shadowmoor/EnchantedEvening.java b/Mage.Sets/src/mage/sets/shadowmoor/EnchantedEvening.java
index f90471ad704..9590020f571 100644
--- a/Mage.Sets/src/mage/sets/shadowmoor/EnchantedEvening.java
+++ b/Mage.Sets/src/mage/sets/shadowmoor/EnchantedEvening.java
@@ -54,7 +54,6 @@ public class EnchantedEvening extends CardImpl {
super(ownerId, 140, "Enchanted Evening", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{3}{W/U}{W/U}");
this.expansionSetCode = "SHM";
-
// All permanents are enchantments in addition to their other types.
Effect effect = new EnchangedEveningEffect(CardType.ENCHANTMENT, Duration.WhileOnBattlefield, new FilterPermanent());
effect.setText("All permanents are enchantments in addition to their other types");
@@ -70,37 +69,38 @@ public class EnchantedEvening extends CardImpl {
public EnchantedEvening copy() {
return new EnchantedEvening(this);
}
-}
-class EnchangedEveningEffect extends ContinuousEffectImpl {
+ // need to be enclosed class for dependent check of continuous effects
+ class EnchangedEveningEffect extends ContinuousEffectImpl {
- private final CardType addedCardType;
- private final FilterPermanent filter;
+ private final CardType addedCardType;
+ private final FilterPermanent filter;
- public EnchangedEveningEffect(CardType addedCardType, Duration duration, FilterPermanent filter) {
- super(duration, Layer.TypeChangingEffects_4, SubLayer.NA, Outcome.Benefit);
- this.addedCardType = addedCardType;
- this.filter = filter;
- }
-
- public EnchangedEveningEffect(final EnchangedEveningEffect effect) {
- super(effect);
- this.addedCardType = effect.addedCardType;
- this.filter = effect.filter;
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- for (Permanent permanent : game.getBattlefield().getAllActivePermanents(filter, game)) {
- if (permanent != null && !permanent.getCardType().contains(addedCardType)) {
- permanent.getCardType().add(addedCardType);
- }
+ public EnchangedEveningEffect(CardType addedCardType, Duration duration, FilterPermanent filter) {
+ super(duration, Layer.TypeChangingEffects_4, SubLayer.NA, Outcome.Benefit);
+ this.addedCardType = addedCardType;
+ this.filter = filter;
}
- return true;
- }
- @Override
- public EnchangedEveningEffect copy() {
- return new EnchangedEveningEffect(this);
+ public EnchangedEveningEffect(final EnchangedEveningEffect effect) {
+ super(effect);
+ this.addedCardType = effect.addedCardType;
+ this.filter = effect.filter;
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ for (Permanent permanent : game.getBattlefield().getAllActivePermanents(filter, game)) {
+ if (permanent != null && !permanent.getCardType().contains(addedCardType)) {
+ permanent.getCardType().add(addedCardType);
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public EnchangedEveningEffect copy() {
+ return new EnchangedEveningEffect(this);
+ }
}
}
diff --git a/Mage.Sets/src/mage/sets/shadowmoor/LeechriddenSwamp.java b/Mage.Sets/src/mage/sets/shadowmoor/LeechriddenSwamp.java
index fdbce5bbd6d..900fb98760c 100644
--- a/Mage.Sets/src/mage/sets/shadowmoor/LeechriddenSwamp.java
+++ b/Mage.Sets/src/mage/sets/shadowmoor/LeechriddenSwamp.java
@@ -1,148 +1,123 @@
-/*
- * 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.sets.shadowmoor;
-
-import java.util.UUID;
-
-import mage.constants.CardType;
-import mage.constants.Outcome;
-import mage.constants.Rarity;
-import mage.Mana;
-import mage.ObjectColor;
-import mage.abilities.Ability;
-import mage.abilities.common.EntersBattlefieldTappedAbility;
-import mage.abilities.common.SimpleActivatedAbility;
-import mage.abilities.costs.CostImpl;
-import mage.abilities.costs.common.TapSourceCost;
-import mage.abilities.costs.mana.ManaCostsImpl;
-import mage.abilities.effects.OneShotEffect;
-import mage.abilities.mana.SimpleManaAbility;
-import mage.cards.CardImpl;
-import mage.constants.Zone;
-import mage.filter.common.FilterControlledPermanent;
-import mage.filter.predicate.mageobject.ColorPredicate;
-import mage.game.Game;
-import mage.players.Player;
-import mage.players.Players;
-
-/**
- *
- * @author jeffwadsworth
- */
-public class LeechriddenSwamp extends CardImpl {
-
- public LeechriddenSwamp(UUID ownerId) {
- super(ownerId, 273, "Leechridden Swamp", Rarity.UNCOMMON, new CardType[]{CardType.LAND}, "");
- this.expansionSetCode = "SHM";
- this.subtype.add("Swamp");
-
- // ({tap}: Add {B} to your mana pool.)
- this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, Mana.BlackMana, new TapSourceCost()));
-
- // Leechridden Swamp enters the battlefield tapped.
- this.addAbility(new EntersBattlefieldTappedAbility());
-
- // {B}, {tap}: Each opponent loses 1 life. Activate this ability only if you control two or more black permanents.
- Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new LeechriddenSwampLoseLifeEffect(), new ManaCostsImpl("{B}"));
- ability.addCost(new TapSourceCost());
- ability.addCost(new ControlTwoOrMoreBlackPermanentsCost());
- this.addAbility(ability);
- }
-
- public LeechriddenSwamp(final LeechriddenSwamp card) {
- super(card);
- }
-
- @Override
- public LeechriddenSwamp copy() {
- return new LeechriddenSwamp(this);
- }
-}
-
-class ControlTwoOrMoreBlackPermanentsCost extends CostImpl {
-
- private static final FilterControlledPermanent filter = new FilterControlledPermanent();
-
- static {
- filter.add(new ColorPredicate(ObjectColor.BLACK));
- }
-
- public ControlTwoOrMoreBlackPermanentsCost() {
- this.text = "Activate this ability only if you control two or more black permanents";
- }
-
- public ControlTwoOrMoreBlackPermanentsCost(final ControlTwoOrMoreBlackPermanentsCost cost) {
- super(cost);
- }
-
- @Override
- public boolean canPay(Ability ability, UUID sourceId, UUID controllerId, Game game) {
- return game.getBattlefield().contains(filter, controllerId, 2, game);
- }
-
- @Override
- public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana) {
- this.paid = true;
- return paid;
- }
-
- @Override
- public ControlTwoOrMoreBlackPermanentsCost copy() {
- return new ControlTwoOrMoreBlackPermanentsCost(this);
- }
-}
-
-class LeechriddenSwampLoseLifeEffect extends OneShotEffect {
-
- private static final String effectText = "each opponent loses 1 life";
-
- LeechriddenSwampLoseLifeEffect ( ) {
- super(Outcome.Damage);
- staticText = effectText;
- }
-
- LeechriddenSwampLoseLifeEffect ( LeechriddenSwampLoseLifeEffect effect ) {
- super(effect);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Players players = game.getPlayers();
- for ( Player player : players.values() ) {
- if ( !player.getId().equals(source.getControllerId()) ) {
- player.loseLife(1, game);
- }
- }
- return true;
- }
-
- @Override
- public LeechriddenSwampLoseLifeEffect copy() {
- return new LeechriddenSwampLoseLifeEffect(this);
- }
-}
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.shadowmoor;
+
+import java.util.UUID;
+import mage.Mana;
+import mage.ObjectColor;
+import mage.abilities.Ability;
+import mage.abilities.common.ActivateIfConditionActivatedAbility;
+import mage.abilities.common.EntersBattlefieldTappedAbility;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition.CountType;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.mana.SimpleManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledPermanent;
+import mage.filter.predicate.mageobject.ColorPredicate;
+import mage.game.Game;
+import mage.players.Player;
+import mage.players.Players;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class LeechriddenSwamp extends CardImpl {
+
+ private static final FilterControlledPermanent filter = new FilterControlledPermanent("you control two or more black permanents");
+
+ static {
+ filter.add(new ColorPredicate(ObjectColor.BLACK));
+ }
+
+ public LeechriddenSwamp(UUID ownerId) {
+ super(ownerId, 273, "Leechridden Swamp", Rarity.UNCOMMON, new CardType[]{CardType.LAND}, "");
+ this.expansionSetCode = "SHM";
+ this.subtype.add("Swamp");
+
+ // ({tap}: Add {B} to your mana pool.)
+ this.addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, Mana.BlackMana, new TapSourceCost()));
+
+ // Leechridden Swamp enters the battlefield tapped.
+ this.addAbility(new EntersBattlefieldTappedAbility());
+
+ // {B}, {tap}: Each opponent loses 1 life. Activate this ability only if you control two or more black permanents.
+ Ability ability = new ActivateIfConditionActivatedAbility(Zone.BATTLEFIELD,
+ new LeechriddenSwampLoseLifeEffect(),
+ new ManaCostsImpl("{B}"),
+ new PermanentsOnTheBattlefieldCondition(filter, CountType.MORE_THAN, 1));
+ ability.addCost(new TapSourceCost());
+ this.addAbility(ability);
+ }
+
+ public LeechriddenSwamp(final LeechriddenSwamp card) {
+ super(card);
+ }
+
+ @Override
+ public LeechriddenSwamp copy() {
+ return new LeechriddenSwamp(this);
+ }
+}
+
+class LeechriddenSwampLoseLifeEffect extends OneShotEffect {
+
+ private static final String effectText = "each opponent loses 1 life";
+
+ LeechriddenSwampLoseLifeEffect ( ) {
+ super(Outcome.Damage);
+ staticText = effectText;
+ }
+
+ LeechriddenSwampLoseLifeEffect ( LeechriddenSwampLoseLifeEffect effect ) {
+ super(effect);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Players players = game.getPlayers();
+ for ( Player player : players.values() ) {
+ if ( !player.getId().equals(source.getControllerId()) ) {
+ player.loseLife(1, game);
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public LeechriddenSwampLoseLifeEffect copy() {
+ return new LeechriddenSwampLoseLifeEffect(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/shadowmoor/LureboundScarecrow.java b/Mage.Sets/src/mage/sets/shadowmoor/LureboundScarecrow.java
index fc6cd8c6cef..9ab3c91bb7e 100644
--- a/Mage.Sets/src/mage/sets/shadowmoor/LureboundScarecrow.java
+++ b/Mage.Sets/src/mage/sets/shadowmoor/LureboundScarecrow.java
@@ -35,7 +35,6 @@ import mage.abilities.StateTriggeredAbility;
import mage.abilities.common.AsEntersBattlefieldAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.SacrificeSourceEffect;
-import mage.cards.Card;
import mage.cards.CardImpl;
import mage.choices.ChoiceColor;
import mage.constants.CardType;
@@ -127,20 +126,16 @@ class LureboundScarecrowTriggeredAbility extends StateTriggeredAbility {
@Override
public boolean checkTrigger(GameEvent event, Game game) {
- if (event.getType() == GameEvent.EventType.ZONE_CHANGE || event.getType() == GameEvent.EventType.LOST_CONTROL
- || event.getType() == GameEvent.EventType.COLOR_CHANGED
- || event.getType() == GameEvent.EventType.SPELL_CAST) {
- Card card = game.getCard(this.getSourceId());
- if (card != null) {
- ObjectColor color = (ObjectColor) game.getState().getValue(card.getId() + "_color");
- if (color != null) {
- for (Permanent perm : game.getBattlefield().getAllActivePermanents(controllerId)) {
- if (perm.getColor(game).contains(color)) {
- return false;
- }
+ Permanent permanent = game.getPermanent(getSourceId());
+ if (permanent != null) {
+ ObjectColor color = (ObjectColor) game.getState().getValue(getSourceId() + "_color");
+ if (color != null) {
+ for (Permanent perm : game.getBattlefield().getAllActivePermanents(controllerId)) {
+ if (perm.getColor(game).contains(color)) {
+ return false;
}
- return true;
}
+ return true;
}
}
return false;
diff --git a/Mage.Sets/src/mage/sets/shadowmoor/MadblindMountain.java b/Mage.Sets/src/mage/sets/shadowmoor/MadblindMountain.java
index eb94b65c287..b106cfe9c93 100644
--- a/Mage.Sets/src/mage/sets/shadowmoor/MadblindMountain.java
+++ b/Mage.Sets/src/mage/sets/shadowmoor/MadblindMountain.java
@@ -1,86 +1,89 @@
-/*
- * 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.sets.shadowmoor;
-
-import java.util.UUID;
-import mage.ObjectColor;
-import mage.abilities.Ability;
-import mage.abilities.common.EntersBattlefieldTappedAbility;
-import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
-import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition.CountType;
-import mage.abilities.costs.common.TapSourceCost;
-import mage.abilities.costs.mana.ManaCostsImpl;
-import mage.abilities.decorator.ConditionalActivatedAbility;
-import mage.abilities.effects.common.ShuffleLibrarySourceEffect;
-import mage.abilities.mana.RedManaAbility;
-import mage.cards.CardImpl;
-import mage.constants.CardType;
-import mage.constants.Rarity;
-import mage.constants.Zone;
-import mage.filter.common.FilterControlledPermanent;
-import mage.filter.predicate.mageobject.ColorPredicate;
-
-/**
- *
- * @author jeffwadsworth
- */
-public class MadblindMountain extends CardImpl {
-
- private static final FilterControlledPermanent filter = new FilterControlledPermanent("if you control two or more red permanents");
-
- static {
- filter.add(new ColorPredicate(ObjectColor.RED));
- }
-
- public MadblindMountain(UUID ownerId) {
- super(ownerId, 274, "Madblind Mountain", Rarity.UNCOMMON, new CardType[]{CardType.LAND}, "");
- this.expansionSetCode = "SHM";
- this.subtype.add("Mountain");
-
- // ({tap}: Add {R} to your mana pool.)
- this.addAbility(new RedManaAbility());
-
- // Madblind Mountain enters the battlefield tapped.
- this.addAbility(new EntersBattlefieldTappedAbility());
-
- // {R}, {tap}: Shuffle your library. Activate this ability only if you control two or more red permanents.
- Ability ability = new ConditionalActivatedAbility(Zone.BATTLEFIELD, new ShuffleLibrarySourceEffect(), new ManaCostsImpl("{R}"), new PermanentsOnTheBattlefieldCondition(filter, CountType.MORE_THAN, 1));
- ability.addCost(new TapSourceCost());
- this.addAbility(ability);
-
- }
-
- public MadblindMountain(final MadblindMountain card) {
- super(card);
- }
-
- @Override
- public MadblindMountain copy() {
- return new MadblindMountain(this);
- }
-}
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.shadowmoor;
+
+import java.util.UUID;
+import mage.ObjectColor;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTappedAbility;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition.CountType;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.decorator.ConditionalActivatedAbility;
+import mage.abilities.effects.common.ShuffleLibrarySourceEffect;
+import mage.abilities.mana.RedManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledPermanent;
+import mage.filter.predicate.mageobject.ColorPredicate;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class MadblindMountain extends CardImpl {
+
+ private static final FilterControlledPermanent filter = new FilterControlledPermanent("if you control two or more red permanents");
+
+ static {
+ filter.add(new ColorPredicate(ObjectColor.RED));
+ }
+
+ public MadblindMountain(UUID ownerId) {
+ super(ownerId, 274, "Madblind Mountain", Rarity.UNCOMMON, new CardType[]{CardType.LAND}, "");
+ this.expansionSetCode = "SHM";
+ this.subtype.add("Mountain");
+
+ // ({tap}: Add {R} to your mana pool.)
+ this.addAbility(new RedManaAbility());
+
+ // Madblind Mountain enters the battlefield tapped.
+ this.addAbility(new EntersBattlefieldTappedAbility());
+
+ // {R}, {tap}: Shuffle your library. Activate this ability only if you control two or more red permanents.
+ Ability ability = new ConditionalActivatedAbility(Zone.BATTLEFIELD,
+ new ShuffleLibrarySourceEffect(),
+ new ManaCostsImpl("{R}"),
+ new PermanentsOnTheBattlefieldCondition(filter, CountType.MORE_THAN, 1));
+ ability.addCost(new TapSourceCost());
+ this.addAbility(ability);
+
+ }
+
+ public MadblindMountain(final MadblindMountain card) {
+ super(card);
+ }
+
+ @Override
+ public MadblindMountain copy() {
+ return new MadblindMountain(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/shadowmoor/MoonringIsland.java b/Mage.Sets/src/mage/sets/shadowmoor/MoonringIsland.java
index 4f087d879c2..4dc1458dcbf 100644
--- a/Mage.Sets/src/mage/sets/shadowmoor/MoonringIsland.java
+++ b/Mage.Sets/src/mage/sets/shadowmoor/MoonringIsland.java
@@ -1,88 +1,91 @@
-/*
- * 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.sets.shadowmoor;
-
-import java.util.UUID;
-import mage.ObjectColor;
-import mage.abilities.Ability;
-import mage.abilities.common.EntersBattlefieldTappedAbility;
-import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
-import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition.CountType;
-import mage.abilities.costs.common.TapSourceCost;
-import mage.abilities.costs.mana.ManaCostsImpl;
-import mage.abilities.decorator.ConditionalActivatedAbility;
-import mage.abilities.effects.common.LookLibraryTopCardTargetPlayerEffect;
-import mage.abilities.mana.BlueManaAbility;
-import mage.cards.CardImpl;
-import mage.constants.CardType;
-import mage.constants.Rarity;
-import mage.constants.Zone;
-import mage.filter.common.FilterControlledPermanent;
-import mage.filter.predicate.mageobject.ColorPredicate;
-import mage.target.TargetPlayer;
-
-/**
- *
- * @author jeffwadsworth
- */
-public class MoonringIsland extends CardImpl {
-
- private static final FilterControlledPermanent filter = new FilterControlledPermanent("if you control two or more blue permanents");
-
- static {
- filter.add(new ColorPredicate(ObjectColor.BLUE));
- }
-
- public MoonringIsland(UUID ownerId) {
- super(ownerId, 276, "Moonring Island", Rarity.UNCOMMON, new CardType[]{CardType.LAND}, "");
- this.expansionSetCode = "SHM";
- this.subtype.add("Island");
-
- // ({tap}: Add {U} to your mana pool.)
- this.addAbility(new BlueManaAbility());
-
- // Moonring Island enters the battlefield tapped.
- this.addAbility(new EntersBattlefieldTappedAbility());
-
- // {U}, {tap}: Look at the top card of target player's library. Activate this ability only if you control two or more blue permanents.
- Ability ability = new ConditionalActivatedAbility(Zone.BATTLEFIELD, new LookLibraryTopCardTargetPlayerEffect(), new ManaCostsImpl("{U}"), new PermanentsOnTheBattlefieldCondition(filter, CountType.MORE_THAN, 1));
- ability.addCost(new TapSourceCost());
- ability.addTarget(new TargetPlayer());
- this.addAbility(ability);
-
- }
-
- public MoonringIsland(final MoonringIsland card) {
- super(card);
- }
-
- @Override
- public MoonringIsland copy() {
- return new MoonringIsland(this);
- }
-}
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.shadowmoor;
+
+import java.util.UUID;
+import mage.ObjectColor;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTappedAbility;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition.CountType;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.decorator.ConditionalActivatedAbility;
+import mage.abilities.effects.common.LookLibraryTopCardTargetPlayerEffect;
+import mage.abilities.mana.BlueManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledPermanent;
+import mage.filter.predicate.mageobject.ColorPredicate;
+import mage.target.TargetPlayer;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class MoonringIsland extends CardImpl {
+
+ private static final FilterControlledPermanent filter = new FilterControlledPermanent("if you control two or more blue permanents");
+
+ static {
+ filter.add(new ColorPredicate(ObjectColor.BLUE));
+ }
+
+ public MoonringIsland(UUID ownerId) {
+ super(ownerId, 276, "Moonring Island", Rarity.UNCOMMON, new CardType[]{CardType.LAND}, "");
+ this.expansionSetCode = "SHM";
+ this.subtype.add("Island");
+
+ // ({tap}: Add {U} to your mana pool.)
+ this.addAbility(new BlueManaAbility());
+
+ // Moonring Island enters the battlefield tapped.
+ this.addAbility(new EntersBattlefieldTappedAbility());
+
+ // {U}, {tap}: Look at the top card of target player's library. Activate this ability only if you control two or more blue permanents.
+ Ability ability = new ConditionalActivatedAbility(Zone.BATTLEFIELD,
+ new LookLibraryTopCardTargetPlayerEffect(),
+ new ManaCostsImpl("{U}"),
+ new PermanentsOnTheBattlefieldCondition(filter, CountType.MORE_THAN, 1));
+ ability.addCost(new TapSourceCost());
+ ability.addTarget(new TargetPlayer());
+ this.addAbility(ability);
+
+ }
+
+ public MoonringIsland(final MoonringIsland card) {
+ super(card);
+ }
+
+ @Override
+ public MoonringIsland copy() {
+ return new MoonringIsland(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/shadowmoor/SapseepForest.java b/Mage.Sets/src/mage/sets/shadowmoor/SapseepForest.java
index 9ae7bb434cb..96f78b9329b 100644
--- a/Mage.Sets/src/mage/sets/shadowmoor/SapseepForest.java
+++ b/Mage.Sets/src/mage/sets/shadowmoor/SapseepForest.java
@@ -1,86 +1,89 @@
-/*
- * 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.sets.shadowmoor;
-
-import java.util.UUID;
-import mage.ObjectColor;
-import mage.abilities.Ability;
-import mage.abilities.common.EntersBattlefieldTappedAbility;
-import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
-import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition.CountType;
-import mage.abilities.costs.common.TapSourceCost;
-import mage.abilities.costs.mana.ManaCostsImpl;
-import mage.abilities.decorator.ConditionalActivatedAbility;
-import mage.abilities.effects.common.GainLifeEffect;
-import mage.abilities.mana.GreenManaAbility;
-import mage.cards.CardImpl;
-import mage.constants.CardType;
-import mage.constants.Rarity;
-import mage.constants.Zone;
-import mage.filter.common.FilterControlledPermanent;
-import mage.filter.predicate.mageobject.ColorPredicate;
-
-/**
- *
- * @author jeffwadsworth
- */
-public class SapseepForest extends CardImpl {
-
- private static final FilterControlledPermanent filter = new FilterControlledPermanent("if you control two or more green permanents");
-
- static {
- filter.add(new ColorPredicate(ObjectColor.GREEN));
- }
-
- public SapseepForest(UUID ownerId) {
- super(ownerId, 279, "Sapseep Forest", Rarity.UNCOMMON, new CardType[]{CardType.LAND}, "");
- this.expansionSetCode = "SHM";
- this.subtype.add("Forest");
-
- // ({tap}: Add {G} to your mana pool.)
- this.addAbility(new GreenManaAbility());
-
- // Sapseep Forest enters the battlefield tapped.
- this.addAbility(new EntersBattlefieldTappedAbility());
-
- // {G}, {tap}: You gain 1 life. Activate this ability only if you control two or more green permanents.
- Ability ability = new ConditionalActivatedAbility(Zone.BATTLEFIELD, new GainLifeEffect(1), new ManaCostsImpl("{G}"), new PermanentsOnTheBattlefieldCondition(filter, CountType.MORE_THAN, 1));
- ability.addCost(new TapSourceCost());
- this.addAbility(ability);
-
- }
-
- public SapseepForest(final SapseepForest card) {
- super(card);
- }
-
- @Override
- public SapseepForest copy() {
- return new SapseepForest(this);
- }
-}
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.shadowmoor;
+
+import java.util.UUID;
+import mage.ObjectColor;
+import mage.abilities.Ability;
+import mage.abilities.common.EntersBattlefieldTappedAbility;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
+import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition.CountType;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.decorator.ConditionalActivatedAbility;
+import mage.abilities.effects.common.GainLifeEffect;
+import mage.abilities.mana.GreenManaAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledPermanent;
+import mage.filter.predicate.mageobject.ColorPredicate;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class SapseepForest extends CardImpl {
+
+ private static final FilterControlledPermanent filter = new FilterControlledPermanent("if you control two or more green permanents");
+
+ static {
+ filter.add(new ColorPredicate(ObjectColor.GREEN));
+ }
+
+ public SapseepForest(UUID ownerId) {
+ super(ownerId, 279, "Sapseep Forest", Rarity.UNCOMMON, new CardType[]{CardType.LAND}, "");
+ this.expansionSetCode = "SHM";
+ this.subtype.add("Forest");
+
+ // ({tap}: Add {G} to your mana pool.)
+ this.addAbility(new GreenManaAbility());
+
+ // Sapseep Forest enters the battlefield tapped.
+ this.addAbility(new EntersBattlefieldTappedAbility());
+
+ // {G}, {tap}: You gain 1 life. Activate this ability only if you control two or more green permanents.
+ Ability ability = new ConditionalActivatedAbility(Zone.BATTLEFIELD,
+ new GainLifeEffect(1),
+ new ManaCostsImpl("{G}"),
+ new PermanentsOnTheBattlefieldCondition(filter, CountType.MORE_THAN, 1));
+ ability.addCost(new TapSourceCost());
+ this.addAbility(ability);
+
+ }
+
+ public SapseepForest(final SapseepForest card) {
+ super(card);
+ }
+
+ @Override
+ public SapseepForest copy() {
+ return new SapseepForest(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/shadowmoor/Tatterkite.java b/Mage.Sets/src/mage/sets/shadowmoor/Tatterkite.java
index 781d2d7608f..27c846f33a5 100644
--- a/Mage.Sets/src/mage/sets/shadowmoor/Tatterkite.java
+++ b/Mage.Sets/src/mage/sets/shadowmoor/Tatterkite.java
@@ -32,7 +32,6 @@ import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
-import mage.abilities.effects.common.ruleModifying.CantRegenerateTargetEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
@@ -59,10 +58,10 @@ public class Tatterkite extends CardImpl {
// Flying
this.addAbility(FlyingAbility.getInstance());
-
+
// Tatterkite can't have counters placed on it.
- this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantHaveCountersSourceEffect(Duration.WhileOnBattlefield, "it")));
-
+ this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantHaveCountersSourceEffect(Duration.WhileOnBattlefield)));
+
}
public Tatterkite(final Tatterkite card) {
@@ -77,7 +76,7 @@ public class Tatterkite extends CardImpl {
class CantHaveCountersSourceEffect extends ContinuousRuleModifyingEffectImpl {
- public CantHaveCountersSourceEffect(Duration duration, String objectText) {
+ public CantHaveCountersSourceEffect(Duration duration) {
super(duration, Outcome.Detriment);
staticText = "{this} can't have counters placed on it";
}
@@ -91,14 +90,9 @@ class CantHaveCountersSourceEffect extends ContinuousRuleModifyingEffectImpl {
return new CantHaveCountersSourceEffect(this);
}
- @Override
- public boolean apply(Game game, Ability source) {
- return true;
- }
-
@Override
public boolean checksEventType(GameEvent event, Game game) {
- return event.getType() == EventType.ADD_COUNTER;
+ return event.getType() == EventType.ADD_COUNTERS;
}
@Override
@@ -109,4 +103,4 @@ class CantHaveCountersSourceEffect extends ContinuousRuleModifyingEffectImpl {
}
return false;
}
-}
\ No newline at end of file
+}
diff --git a/Mage.Sets/src/mage/sets/shadowmoor/WheelOfSunAndMoon.java b/Mage.Sets/src/mage/sets/shadowmoor/WheelOfSunAndMoon.java
index e41ad1b2148..e67788dccc8 100644
--- a/Mage.Sets/src/mage/sets/shadowmoor/WheelOfSunAndMoon.java
+++ b/Mage.Sets/src/mage/sets/shadowmoor/WheelOfSunAndMoon.java
@@ -85,7 +85,7 @@ public class WheelOfSunAndMoon extends CardImpl {
class WheelOfSunAndMoonEffect extends ReplacementEffectImpl {
public WheelOfSunAndMoonEffect() {
- super(Duration.WhileOnBattlefield, Outcome.Damage);
+ super(Duration.WhileOnBattlefield, Outcome.Detriment);
staticText = "If a card would be put into enchanted player's graveyard from anywhere, instead that card is revealed and put on the bottom of that player's library";
}
@@ -126,10 +126,9 @@ class WheelOfSunAndMoonEffect extends ReplacementEffectImpl {
if (controller != null && sourceObject != null) {
Card card = game.getCard(event.getTargetId());
if (card != null) {
- ZoneChangeEvent zEvent = (ZoneChangeEvent) event;
Cards cards = new CardsImpl(card);
controller.revealCards(sourceObject.getIdName(), cards, game);
- controller.moveCardToLibraryWithInfo(card, source.getSourceId(), game, zEvent.getFromZone(), false, true);
+ controller.putCardsOnBottomOfLibrary(cards, game, source, false);
return true;
}
}
diff --git a/Mage.Sets/src/mage/sets/shadowmoor/WildSwing.java b/Mage.Sets/src/mage/sets/shadowmoor/WildSwing.java
index b7737a78b8a..260029f8b84 100644
--- a/Mage.Sets/src/mage/sets/shadowmoor/WildSwing.java
+++ b/Mage.Sets/src/mage/sets/shadowmoor/WildSwing.java
@@ -27,7 +27,9 @@
*/
package mage.sets.shadowmoor;
+import java.util.Random;
import java.util.UUID;
+import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.cards.CardImpl;
@@ -39,6 +41,7 @@ import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.CardTypePredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
+import mage.target.Target;
import mage.target.TargetPermanent;
/**
@@ -46,9 +49,9 @@ import mage.target.TargetPermanent;
* @author jeffwadsworth
*/
public class WildSwing extends CardImpl {
-
+
private static final FilterPermanent filter = new FilterPermanent("target nonenchantment permanents");
-
+
static {
filter.add(Predicates.not(new CardTypePredicate(CardType.ENCHANTMENT)));
}
@@ -57,11 +60,10 @@ public class WildSwing extends CardImpl {
super(ownerId, 108, "Wild Swing", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{3}{R}");
this.expansionSetCode = "SHM";
-
// Choose three target nonenchantment permanents. Destroy one of them at random.
this.getSpellAbility().addEffect(new WildSwingEffect());
this.getSpellAbility().addTarget(new TargetPermanent(3, filter));
-
+
}
public WildSwing(final WildSwing card) {
@@ -92,11 +94,18 @@ class WildSwingEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- int randomNumber = (int)(Math.random() * 3);
- Permanent target = game.getPermanent(source.getTargets().get(randomNumber).getFirstTarget());
- if (target != null) {
- game.informPlayers("Wild Swing: The randomly chosen target to destroy is " + target.getName());
- return target.destroy(source.getSourceId(), game, false);
+ MageObject sourceObject = source.getSourceObject(game);
+ if (!source.getTargets().isEmpty() && sourceObject != null) {
+ Target target = source.getTargets().get(0);
+ if (target != null && !target.getTargets().isEmpty()) {
+ Random rnd = new Random();
+ Permanent targetPermanent = game.getPermanent(target.getTargets().get(rnd.nextInt(target.getTargets().size())));
+ if (targetPermanent != null) {
+ game.informPlayers(sourceObject.getLogName() + ": The randomly chosen target to destroy is " + targetPermanent.getLogName());
+ targetPermanent.destroy(source.getSourceId(), game, false);
+ }
+ return true;
+ }
}
return false;
}
diff --git a/Mage.Sets/src/mage/sets/shardsofalara/FeralHydra.java b/Mage.Sets/src/mage/sets/shardsofalara/FeralHydra.java
index c79740b735f..a6d8eeda839 100644
--- a/Mage.Sets/src/mage/sets/shardsofalara/FeralHydra.java
+++ b/Mage.Sets/src/mage/sets/shardsofalara/FeralHydra.java
@@ -34,6 +34,7 @@ import mage.abilities.SpellAbility;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.EntersBattlefieldEffect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.InfoEffect;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
@@ -96,10 +97,11 @@ class FeralHydraEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null) {
- Object obj = getValue(mage.abilities.effects.EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
- if (obj != null && obj instanceof SpellAbility
- && permanent.getZoneChangeCounter(game) - 1 == ((SpellAbility) obj).getSourceObjectZoneChangeCounter()) {
- int amount = ((SpellAbility) obj).getManaCostsToPay().getX();
+ SpellAbility spellAbility = (SpellAbility) getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
+ if (spellAbility != null
+ && spellAbility.getSourceId().equals(source.getSourceId())
+ && permanent.getZoneChangeCounter(game) - 1 == spellAbility.getSourceObjectZoneChangeCounter()) {
+ int amount = spellAbility.getManaCostsToPay().getX();
if (amount > 0) {
permanent.addCounters(CounterType.P1P1.createInstance(amount), game);
}
diff --git a/Mage.Sets/src/mage/sets/shardsofalara/ImmortalCoil.java b/Mage.Sets/src/mage/sets/shardsofalara/ImmortalCoil.java
index 1b3d3fb54a6..b8307e5cc7b 100644
--- a/Mage.Sets/src/mage/sets/shardsofalara/ImmortalCoil.java
+++ b/Mage.Sets/src/mage/sets/shardsofalara/ImmortalCoil.java
@@ -28,8 +28,6 @@
package mage.sets.shardsofalara;
import java.util.UUID;
-
-import mage.constants.*;
import mage.abilities.Ability;
import mage.abilities.StateTriggeredAbility;
import mage.abilities.common.SimpleActivatedAbility;
@@ -42,6 +40,11 @@ import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.SacrificeSourceEffect;
import mage.cards.Card;
import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
import mage.filter.FilterCard;
import mage.game.Game;
import mage.game.events.GameEvent;
@@ -58,7 +61,6 @@ public class ImmortalCoil extends CardImpl {
super(ownerId, 79, "Immortal Coil", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{2}{B}{B}");
this.expansionSetCode = "ALA";
-
// {tap}, Exile two cards from your graveyard: Draw a card.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(1), new TapSourceCost());
ability.addCost(new ExileFromGraveCost(new TargetCardInYourGraveyard(2, new FilterCard("cards from your graveyard"))));
@@ -98,10 +100,7 @@ class ImmortalCoilAbility extends StateTriggeredAbility {
@Override
public boolean checkTrigger(GameEvent event, Game game) {
Player player = game.getPlayer(this.getControllerId());
- if(player != null && player.getGraveyard().size() == 0){
- return true;
- }
- return false;
+ return player != null && player.getGraveyard().size() == 0;
}
@Override
@@ -130,7 +129,7 @@ class LoseGameEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
- if (player != null) {
+ if (player != null) {
player.lost(game);
return true;
}
@@ -140,7 +139,6 @@ class LoseGameEffect extends OneShotEffect {
class PreventAllDamageToControllerEffect extends PreventionEffectImpl {
-
public PreventAllDamageToControllerEffect() {
super(Duration.WhileOnBattlefield);
staticText = "If damage would be dealt to you, prevent that damage. Exile a card from your graveyard for each 1 damage prevented this way";
@@ -166,10 +164,10 @@ class PreventAllDamageToControllerEffect extends PreventionEffectImpl {
if (!game.replaceEvent(preventEvent)) {
int damage = event.getAmount();
Player player = game.getPlayer(source.getControllerId());
- if(player != null){
- TargetCardInYourGraveyard target = new TargetCardInYourGraveyard(Math.min(damage, player.getGraveyard().size()), new FilterCard());
+ if (player != null) {
+ TargetCardInYourGraveyard target = new TargetCardInYourGraveyard(Math.min(damage, player.getGraveyard().size()), new FilterCard());
if (target.choose(Outcome.Exile, source.getControllerId(), source.getSourceId(), game)) {
- for (UUID targetId: target.getTargets()) {
+ for (UUID targetId : target.getTargets()) {
Card card = player.getGraveyard().get(targetId, game);
if (card != null) {
card.moveToZone(Zone.EXILED, source.getSourceId(), game, false);
@@ -186,7 +184,7 @@ class PreventAllDamageToControllerEffect extends PreventionEffectImpl {
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
if (super.applies(event, source, game)) {
- if (event.getTargetId().equals(source.getControllerId())){
+ if (event.getTargetId().equals(source.getControllerId())) {
return true;
}
diff --git a/Mage.Sets/src/mage/sets/shardsofalara/SigilOfDistinction.java b/Mage.Sets/src/mage/sets/shardsofalara/SigilOfDistinction.java
index a5c433e5948..dc7aa39b6e6 100644
--- a/Mage.Sets/src/mage/sets/shardsofalara/SigilOfDistinction.java
+++ b/Mage.Sets/src/mage/sets/shardsofalara/SigilOfDistinction.java
@@ -93,10 +93,11 @@ class SigilOfDistinctionEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null) {
- Object obj = getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
- if (obj != null && obj instanceof SpellAbility
- && permanent.getZoneChangeCounter(game) - 1 == ((SpellAbility) obj).getSourceObjectZoneChangeCounter()) {
- int amount = ((SpellAbility) obj).getManaCostsToPay().getX();
+ SpellAbility spellAbility = (SpellAbility) getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
+ if (spellAbility != null
+ && spellAbility.getSourceId().equals(source.getSourceId())
+ && permanent.getZoneChangeCounter(game) - 1 == spellAbility.getSourceObjectZoneChangeCounter()) {
+ int amount = spellAbility.getManaCostsToPay().getX();
if (amount > 0) {
permanent.addCounters(CounterType.CHARGE.createInstance(amount), game);
return true;
diff --git a/Mage.Sets/src/mage/sets/starter1999/DenizenOfTheDeep.java b/Mage.Sets/src/mage/sets/starter1999/DenizenOfTheDeep.java
new file mode 100644
index 00000000000..fe93c5366f6
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/starter1999/DenizenOfTheDeep.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.starter1999;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class DenizenOfTheDeep extends mage.sets.tenthedition.DenizenOfTheDeep {
+
+ public DenizenOfTheDeep(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 35;
+ this.expansionSetCode = "S99";
+ }
+
+ public DenizenOfTheDeep(final DenizenOfTheDeep card) {
+ super(card);
+ }
+
+ @Override
+ public DenizenOfTheDeep copy() {
+ return new DenizenOfTheDeep(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/starter1999/JaggedLightning.java b/Mage.Sets/src/mage/sets/starter1999/JaggedLightning.java
new file mode 100644
index 00000000000..26853ac7abd
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/starter1999/JaggedLightning.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.starter1999;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class JaggedLightning extends mage.sets.urzassaga.JaggedLightning {
+
+ public JaggedLightning(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 109;
+ this.expansionSetCode = "S99";
+ }
+
+ public JaggedLightning(final JaggedLightning card) {
+ super(card);
+ }
+
+ @Override
+ public JaggedLightning copy() {
+ return new JaggedLightning(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/starter1999/WickedPact.java b/Mage.Sets/src/mage/sets/starter1999/WickedPact.java
new file mode 100644
index 00000000000..0812593a4eb
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/starter1999/WickedPact.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.starter1999;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class WickedPact extends mage.sets.portal.WickedPact {
+
+ public WickedPact(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 92;
+ this.expansionSetCode = "S99";
+ }
+
+ public WickedPact(final WickedPact card) {
+ super(card);
+ }
+
+ @Override
+ public WickedPact copy() {
+ return new WickedPact(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/stronghold/ThalakosDeceiver.java b/Mage.Sets/src/mage/sets/stronghold/ThalakosDeceiver.java
new file mode 100644
index 00000000000..bc0506ebca0
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/stronghold/ThalakosDeceiver.java
@@ -0,0 +1,74 @@
+/*
+ * 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.sets.stronghold;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.AttacksAndIsNotBlockedTriggeredAbility;
+import mage.abilities.costs.common.SacrificeSourceCost;
+import mage.abilities.effects.common.DoIfCostPaid;
+import mage.abilities.effects.common.continuous.GainControlTargetEffect;
+import mage.abilities.keyword.ShadowAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class ThalakosDeceiver extends CardImpl {
+
+ public ThalakosDeceiver(UUID ownerId) {
+ super(ownerId, 45, "Thalakos Deceiver", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{U}");
+ this.expansionSetCode = "STH";
+ this.subtype.add("Thalakos");
+ this.subtype.add("Wizard");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // Shadow
+ this.addAbility(ShadowAbility.getInstance());
+ // Whenever Thalakos Deceiver attacks and isn't blocked, you may sacrifice it. If you do, gain control of target creature.
+ Ability ability = new AttacksAndIsNotBlockedTriggeredAbility(new DoIfCostPaid(new GainControlTargetEffect(Duration.EndOfGame), new SacrificeSourceCost()));
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+ }
+
+ public ThalakosDeceiver(final ThalakosDeceiver card) {
+ super(card);
+ }
+
+ @Override
+ public ThalakosDeceiver copy() {
+ return new ThalakosDeceiver(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/tempest/DauthiMindripper.java b/Mage.Sets/src/mage/sets/tempest/DauthiMindripper.java
new file mode 100644
index 00000000000..f988e67daef
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/tempest/DauthiMindripper.java
@@ -0,0 +1,72 @@
+/*
+ * 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.sets.tempest;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.AttacksAndIsNotBlockedTriggeredAbility;
+import mage.abilities.costs.common.SacrificeSourceCost;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.DoIfCostPaid;
+import mage.abilities.effects.common.discard.DiscardTargetEffect;
+import mage.abilities.keyword.ShadowAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class DauthiMindripper extends CardImpl {
+
+ public DauthiMindripper(UUID ownerId) {
+ super(ownerId, 19, "Dauthi Mindripper", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{B}");
+ this.expansionSetCode = "TMP";
+ this.subtype.add("Dauthi");
+ this.subtype.add("Minion");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(1);
+
+ // Shadow
+ this.addAbility(ShadowAbility.getInstance());
+ // Whenever Dauthi Mindripper attacks and isn't blocked, you may sacrifice it. If you do, defending player discards three cards.
+ Effect effect = new DiscardTargetEffect(3);
+ effect.setText("defending player discards three cards");
+ this.addAbility(new AttacksAndIsNotBlockedTriggeredAbility(new DoIfCostPaid(effect, new SacrificeSourceCost()), false, true));
+ }
+
+ public DauthiMindripper(final DauthiMindripper card) {
+ super(card);
+ }
+
+ @Override
+ public DauthiMindripper copy() {
+ return new DauthiMindripper(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/tempest/DeathPitsOfRath.java b/Mage.Sets/src/mage/sets/tempest/DeathPitsOfRath.java
index 1af8d3cb656..897eed3c58b 100644
--- a/Mage.Sets/src/mage/sets/tempest/DeathPitsOfRath.java
+++ b/Mage.Sets/src/mage/sets/tempest/DeathPitsOfRath.java
@@ -28,13 +28,12 @@
package mage.sets.tempest;
import java.util.UUID;
-
-import mage.constants.CardType;
-import mage.constants.Rarity;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.events.GameEvent;
@@ -86,7 +85,7 @@ class DeathPitsOfRathTriggeredAbility extends TriggeredAbilityImpl {
@Override
public boolean checkTrigger(GameEvent event, Game game) {
- for(Effect effect : this.getEffects()) {
+ for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getTargetId()));
}
return true;
@@ -94,6 +93,6 @@ class DeathPitsOfRathTriggeredAbility extends TriggeredAbilityImpl {
@Override
public String getRule() {
- return "Whenever a creature is dealt damage, destroy it. It can't be regenerated";
+ return "Whenever a creature is dealt damage, destroy it. It can't be regenerated.";
}
-}
\ No newline at end of file
+}
diff --git a/Mage.Sets/src/mage/sets/tempest/KnightOfDawn.java b/Mage.Sets/src/mage/sets/tempest/KnightOfDawn.java
new file mode 100644
index 00000000000..d03181f9334
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/tempest/KnightOfDawn.java
@@ -0,0 +1,70 @@
+/*
+ * 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.sets.tempest;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.continuous.GainProtectionFromColorSourceEffect;
+import mage.abilities.keyword.FirstStrikeAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class KnightOfDawn extends CardImpl {
+
+ public KnightOfDawn(UUID ownerId) {
+ super(ownerId, 238, "Knight of Dawn", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{W}{W}");
+ this.expansionSetCode = "TMP";
+ this.subtype.add("Human");
+ this.subtype.add("Knight");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // First strike
+ this.addAbility(FirstStrikeAbility.getInstance());
+ // {W}{W}: Knight of Dawn gains protection from the color of your choice until end of turn.
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainProtectionFromColorSourceEffect(Duration.EndOfTurn), new ManaCostsImpl("{W}{W}")));
+ }
+
+ public KnightOfDawn(final KnightOfDawn card) {
+ super(card);
+ }
+
+ @Override
+ public KnightOfDawn copy() {
+ return new KnightOfDawn(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/tempest/Krakilin.java b/Mage.Sets/src/mage/sets/tempest/Krakilin.java
index 5b7ee1a1c49..55ac185a0ef 100644
--- a/Mage.Sets/src/mage/sets/tempest/Krakilin.java
+++ b/Mage.Sets/src/mage/sets/tempest/Krakilin.java
@@ -34,6 +34,7 @@ import mage.abilities.SpellAbility;
import mage.abilities.common.EntersBattlefieldAbility;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.EntersBattlefieldEffect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.RegenerateSourceEffect;
import mage.cards.CardImpl;
@@ -90,10 +91,11 @@ class KrakilinEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null) {
- Object obj = getValue(mage.abilities.effects.EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
- if (obj != null && obj instanceof SpellAbility
- && permanent.getZoneChangeCounter(game) - 1 == ((SpellAbility) obj).getSourceObjectZoneChangeCounter()) {
- int amount = ((SpellAbility) obj).getManaCostsToPay().getX();
+ SpellAbility spellAbility = (SpellAbility) getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
+ if (spellAbility != null
+ && spellAbility.getSourceId().equals(source.getSourceId())
+ && permanent.getZoneChangeCounter(game) - 1 == spellAbility.getSourceObjectZoneChangeCounter()) {
+ int amount = spellAbility.getManaCostsToPay().getX();
if (amount > 0) {
permanent.addCounters(CounterType.P1P1.createInstance(amount), game);
}
diff --git a/Mage.Sets/src/mage/sets/tenthedition/AngelsFeather.java b/Mage.Sets/src/mage/sets/tenthedition/AngelsFeather.java
index c518a21d95d..c9036a60213 100644
--- a/Mage.Sets/src/mage/sets/tenthedition/AngelsFeather.java
+++ b/Mage.Sets/src/mage/sets/tenthedition/AngelsFeather.java
@@ -25,20 +25,17 @@
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
-
package mage.sets.tenthedition;
import java.util.UUID;
-import mage.abilities.TriggeredAbilityImpl;
+import mage.ObjectColor;
+import mage.abilities.common.SpellCastAllTriggeredAbility;
import mage.abilities.effects.common.GainLifeEffect;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
-import mage.constants.Zone;
-import mage.game.Game;
-import mage.game.events.GameEvent;
-import mage.game.events.GameEvent.EventType;
-import mage.game.stack.Spell;
+import mage.filter.FilterSpell;
+import mage.filter.predicate.mageobject.ColorPredicate;
/**
*
@@ -46,10 +43,18 @@ import mage.game.stack.Spell;
*/
public class AngelsFeather extends CardImpl {
+ private final static FilterSpell filter = new FilterSpell("a white spell");
+
+ static {
+ filter.add(new ColorPredicate(ObjectColor.WHITE));
+ }
+
public AngelsFeather(UUID ownerId) {
super(ownerId, 311, "Angel's Feather", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{2}");
this.expansionSetCode = "10E";
- this.addAbility(new AngelsFeatherAbility());
+
+ // Whenever a player casts a white spell, you may gain 1 life.
+ this.addAbility(new SpellCastAllTriggeredAbility(new GainLifeEffect(1), filter, true));
}
public AngelsFeather(final AngelsFeather card) {
@@ -62,36 +67,3 @@ public class AngelsFeather extends CardImpl {
}
}
-
-class AngelsFeatherAbility extends TriggeredAbilityImpl {
-
- public AngelsFeatherAbility() {
- super(Zone.BATTLEFIELD, new GainLifeEffect(1), true);
- }
-
- public AngelsFeatherAbility(final AngelsFeatherAbility ability) {
- super(ability);
- }
-
- @Override
- public AngelsFeatherAbility copy() {
- return new AngelsFeatherAbility(this);
- }
-
- @Override
- public boolean checkEventType(GameEvent event, Game game) {
- return event.getType() == EventType.SPELL_CAST;
- }
-
- @Override
- public boolean checkTrigger(GameEvent event, Game game) {
- Spell spell = game.getStack().getSpell(event.getTargetId());
- return spell != null && spell.getColor(game).isWhite();
- }
-
- @Override
- public String getRule() {
- return "Whenever a player casts a white spell, you may gain 1 life.";
- }
-
-}
diff --git a/Mage.Sets/src/mage/sets/tenthedition/DenizenOfTheDeep.java b/Mage.Sets/src/mage/sets/tenthedition/DenizenOfTheDeep.java
new file mode 100644
index 00000000000..744f4560a1e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/tenthedition/DenizenOfTheDeep.java
@@ -0,0 +1,74 @@
+/*
+ * 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.sets.tenthedition;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.ReturnToHandFromBattlefieldAllEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterControlledCreaturePermanent;
+import mage.filter.predicate.permanent.AnotherPredicate;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class DenizenOfTheDeep extends CardImpl {
+
+ private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent();
+
+ static{
+ filter.add(new AnotherPredicate());
+ }
+
+ public DenizenOfTheDeep(UUID ownerId) {
+ super(ownerId, 80, "Denizen of the Deep", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{6}{U}{U}");
+ this.expansionSetCode = "10E";
+ this.subtype.add("Serpent");
+ this.power = new MageInt(11);
+ this.toughness = new MageInt(11);
+
+ // When Denizen of the Deep enters the battlefield, return each other creature you control to its owner's hand.
+ Effect effect = new ReturnToHandFromBattlefieldAllEffect(filter);
+ effect.setText("return each other creature you control to its owner's hand");
+ this.addAbility(new EntersBattlefieldTriggeredAbility(effect));
+ }
+
+ public DenizenOfTheDeep(final DenizenOfTheDeep card) {
+ super(card);
+ }
+
+ @Override
+ public DenizenOfTheDeep copy() {
+ return new DenizenOfTheDeep(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/tenthedition/HighGround.java b/Mage.Sets/src/mage/sets/tenthedition/HighGround.java
new file mode 100644
index 00000000000..dc2e0954cb2
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/tenthedition/HighGround.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.tenthedition;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class HighGround extends mage.sets.exodus.HighGround {
+
+ public HighGround(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 20;
+ this.expansionSetCode = "10E";
+ }
+
+ public HighGround(final HighGround card) {
+ super(card);
+ }
+
+ @Override
+ public HighGround copy() {
+ return new HighGround(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/tenthedition/NantukoHusk.java b/Mage.Sets/src/mage/sets/tenthedition/NantukoHusk.java
index 473cd6334dd..2f8364c56be 100644
--- a/Mage.Sets/src/mage/sets/tenthedition/NantukoHusk.java
+++ b/Mage.Sets/src/mage/sets/tenthedition/NantukoHusk.java
@@ -28,16 +28,16 @@
package mage.sets.tenthedition;
import java.util.UUID;
-
-import mage.constants.CardType;
-import mage.constants.Rarity;
import mage.MageInt;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.cards.CardImpl;
+import mage.constants.CardType;
import mage.constants.Duration;
+import mage.constants.Rarity;
import mage.constants.Zone;
+import mage.filter.common.FilterControlledCreaturePermanent;
import mage.target.common.TargetControlledCreaturePermanent;
/**
@@ -54,7 +54,10 @@ public class NantukoHusk extends CardImpl {
this.power = new MageInt(2);
this.toughness = new MageInt(2);
- this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(2, 2, Duration.EndOfTurn), new SacrificeTargetCost(new TargetControlledCreaturePermanent())));
+
+ // Sacrifice a creature: Nantuko Husk gets +2/+2 until end of turn.
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostSourceEffect(2, 2, Duration.EndOfTurn),
+ new SacrificeTargetCost(new TargetControlledCreaturePermanent(new FilterControlledCreaturePermanent("a creature")))));
}
public NantukoHusk(final NantukoHusk card) {
diff --git a/Mage.Sets/src/mage/sets/thedark/BrothersOfFire.java b/Mage.Sets/src/mage/sets/thedark/BrothersOfFire.java
new file mode 100644
index 00000000000..b13f81ea003
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/thedark/BrothersOfFire.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.thedark;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class BrothersOfFire extends mage.sets.fourthedition.BrothersOfFire {
+
+ public BrothersOfFire(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 58;
+ this.expansionSetCode = "DRK";
+ this.rarity = Rarity.UNCOMMON;
+ }
+
+ public BrothersOfFire(final BrothersOfFire card) {
+ super(card);
+ }
+
+ @Override
+ public BrothersOfFire copy() {
+ return new BrothersOfFire(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/thedark/MurkDwellers.java b/Mage.Sets/src/mage/sets/thedark/MurkDwellers.java
new file mode 100644
index 00000000000..e759ec1c3c6
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/thedark/MurkDwellers.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.thedark;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class MurkDwellers extends mage.sets.fifthedition.MurkDwellers {
+
+ public MurkDwellers(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 11;
+ this.expansionSetCode = "DRK";
+ }
+
+ public MurkDwellers(final MurkDwellers card) {
+ super(card);
+ }
+
+ @Override
+ public MurkDwellers copy() {
+ return new MurkDwellers(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/theros/ArtisanOfForms.java b/Mage.Sets/src/mage/sets/theros/ArtisanOfForms.java
index 87a97f0fdf8..928993b8dd2 100644
--- a/Mage.Sets/src/mage/sets/theros/ArtisanOfForms.java
+++ b/Mage.Sets/src/mage/sets/theros/ArtisanOfForms.java
@@ -29,6 +29,7 @@ package mage.sets.theros;
import java.util.UUID;
import mage.MageInt;
+import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.CopyPermanentEffect;
@@ -77,6 +78,14 @@ public class ArtisanOfForms extends CardImpl {
class ArtisanOfFormsApplyToPermanent extends ApplyToPermanent {
+ @Override
+ public Boolean apply(Game game, MageObject mageObject) {
+ Effect effect = new CopyPermanentEffect(new ArtisanOfFormsApplyToPermanent());
+ effect.setText("have {this} become a copy of target creature and gain this ability");
+ mageObject.getAbilities().add(new HeroicAbility(effect, true));
+ return true;
+ }
+
@Override
public Boolean apply(Game game, Permanent permanent) {
Effect effect = new CopyPermanentEffect(new ArtisanOfFormsApplyToPermanent());
@@ -84,4 +93,5 @@ class ArtisanOfFormsApplyToPermanent extends ApplyToPermanent {
permanent.addAbility(new HeroicAbility(effect, true), game);
return true;
}
+
}
diff --git a/Mage.Sets/src/mage/sets/theros/DeathbellowRaider.java b/Mage.Sets/src/mage/sets/theros/DeathbellowRaider.java
index f239c663691..a9851f4fe18 100644
--- a/Mage.Sets/src/mage/sets/theros/DeathbellowRaider.java
+++ b/Mage.Sets/src/mage/sets/theros/DeathbellowRaider.java
@@ -29,14 +29,12 @@ package mage.sets.theros;
import java.util.UUID;
import mage.MageInt;
+import mage.abilities.common.AttacksEachTurnStaticAbility;
import mage.abilities.common.SimpleActivatedAbility;
-import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
-import mage.abilities.effects.common.combat.AttacksIfAbleSourceEffect;
import mage.abilities.effects.common.RegenerateSourceEffect;
import mage.cards.CardImpl;
import mage.constants.CardType;
-import mage.constants.Duration;
import mage.constants.Rarity;
import mage.constants.Zone;
@@ -56,7 +54,8 @@ public class DeathbellowRaider extends CardImpl {
this.toughness = new MageInt(3);
// Deathbellow Raider attacks each turn if able.
- this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new AttacksIfAbleSourceEffect(Duration.WhileOnBattlefield)));
+ this.addAbility(new AttacksEachTurnStaticAbility());
+
// {2}{B}: Regenerate Deathbellow Raider.
this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateSourceEffect(), new ManaCostsImpl("{2}{B}")));
}
diff --git a/Mage.Sets/src/mage/sets/theros/MistcutterHydra.java b/Mage.Sets/src/mage/sets/theros/MistcutterHydra.java
index 501b8084e9a..7fa563f6761 100644
--- a/Mage.Sets/src/mage/sets/theros/MistcutterHydra.java
+++ b/Mage.Sets/src/mage/sets/theros/MistcutterHydra.java
@@ -34,6 +34,7 @@ import mage.abilities.Ability;
import mage.abilities.SpellAbility;
import mage.abilities.common.CantBeCounteredAbility;
import mage.abilities.common.EntersBattlefieldAbility;
+import mage.abilities.effects.EntersBattlefieldEffect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.keyword.HasteAbility;
import mage.abilities.keyword.ProtectionAbility;
@@ -102,10 +103,11 @@ class MistcutterHydraEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null) {
- Object obj = getValue(mage.abilities.effects.EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
- if (obj != null && obj instanceof SpellAbility
- && permanent.getZoneChangeCounter(game) - 1 == ((SpellAbility) obj).getSourceObjectZoneChangeCounter()) {
- int amount = ((SpellAbility) obj).getManaCostsToPay().getX();
+ SpellAbility spellAbility = (SpellAbility) getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
+ if (spellAbility != null
+ && spellAbility.getSourceId().equals(source.getSourceId())
+ && permanent.getZoneChangeCounter(game) - 1 == spellAbility.getSourceObjectZoneChangeCounter()) {
+ int amount = spellAbility.getManaCostsToPay().getX();
if (amount > 0) {
permanent.addCounters(CounterType.P1P1.createInstance(amount), game);
}
diff --git a/Mage.Sets/src/mage/sets/timeshifted/CrawGiant.java b/Mage.Sets/src/mage/sets/timeshifted/CrawGiant.java
new file mode 100644
index 00000000000..9887bfc3b09
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/timeshifted/CrawGiant.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.timeshifted;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class CrawGiant extends mage.sets.legends.CrawGiant {
+
+ public CrawGiant(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 76;
+ this.expansionSetCode = "TSB";
+ this.rarity = Rarity.SPECIAL;
+ }
+
+ public CrawGiant(final CrawGiant card) {
+ super(card);
+ }
+
+ @Override
+ public CrawGiant copy() {
+ return new CrawGiant(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/timeshifted/MeriekeRiBerit.java b/Mage.Sets/src/mage/sets/timeshifted/MeriekeRiBerit.java
new file mode 100644
index 00000000000..a97d6ac8e5c
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/timeshifted/MeriekeRiBerit.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.timeshifted;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class MeriekeRiBerit extends mage.sets.iceage.MeriekeRiBerit {
+
+ public MeriekeRiBerit(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 95;
+ this.expansionSetCode = "TSB";
+ this.rarity = Rarity.SPECIAL;
+ }
+
+ public MeriekeRiBerit(final MeriekeRiBerit card) {
+ super(card);
+ }
+
+ @Override
+ public MeriekeRiBerit copy() {
+ return new MeriekeRiBerit(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/timeshifted/SwampMosquito.java b/Mage.Sets/src/mage/sets/timeshifted/SwampMosquito.java
new file mode 100644
index 00000000000..93773da7604
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/timeshifted/SwampMosquito.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.timeshifted;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class SwampMosquito extends mage.sets.alliances.SwampMosquito1 {
+
+ public SwampMosquito(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 49;
+ this.expansionSetCode = "TSB";
+ this.rarity = Rarity.SPECIAL;
+ }
+
+ public SwampMosquito(final SwampMosquito card) {
+ super(card);
+ }
+
+ @Override
+ public SwampMosquito copy() {
+ return new SwampMosquito(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/timespiral/LimDulTheNecromancer.java b/Mage.Sets/src/mage/sets/timespiral/LimDulTheNecromancer.java
new file mode 100644
index 00000000000..4e1f91ddda7
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/timespiral/LimDulTheNecromancer.java
@@ -0,0 +1,183 @@
+/*
+ * 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.sets.timespiral;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.DiesCreatureTriggeredAbility;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.ContinuousEffect;
+import mage.abilities.effects.ContinuousEffectImpl;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.DoIfCostPaid;
+import mage.abilities.effects.common.RegenerateTargetEffect;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Layer;
+import static mage.constants.Layer.TypeChangingEffects_4;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.SubLayer;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.filter.FilterPermanent;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+import mage.filter.predicate.permanent.ControllerPredicate;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.target.TargetPermanent;
+import mage.target.targetpointer.FixedTarget;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class LimDulTheNecromancer extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature an opponent controls");
+ private static final FilterPermanent filter2 = new FilterPermanent("Zombie");
+
+ static {
+ filter.add(new ControllerPredicate(TargetController.OPPONENT));
+ filter2.add(new SubtypePredicate("Zombie"));
+ }
+
+ public LimDulTheNecromancer(UUID ownerId) {
+ super(ownerId, 114, "Lim-Dul the Necromancer", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{5}{B}{B}");
+ this.expansionSetCode = "TSP";
+ this.supertype.add("Legendary");
+ this.subtype.add("Human");
+ this.subtype.add("Wizard");
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(4);
+
+ // Whenever a creature an opponent controls dies, you may pay {1}{B}. If you do, return that card to the battlefield under your control. If it's a creature, it's a Zombie in addition to its other creature types.
+ this.addAbility(new DiesCreatureTriggeredAbility(new DoIfCostPaid(new LimDulTheNecromancerEffect(), new ManaCostsImpl("{1}{B}")), true, filter, true));
+
+ // {1}{B}: Regenerate target Zombie.
+ Ability ability2 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateTargetEffect(), new ManaCostsImpl("{1}{B}"));
+ ability2.addTarget(new TargetPermanent(filter2));
+ this.addAbility(ability2);
+
+ }
+
+ public LimDulTheNecromancer(final LimDulTheNecromancer card) {
+ super(card);
+ }
+
+ @Override
+ public LimDulTheNecromancer copy() {
+ return new LimDulTheNecromancer(this);
+ }
+}
+
+class LimDulTheNecromancerEffect extends OneShotEffect {
+
+ public LimDulTheNecromancerEffect() {
+ super(Outcome.PutCreatureInPlay);
+ staticText = " return that card to the battlefield under your control. If it's a creature, it's a Zombie in addition to its other creature types";
+ }
+
+ public LimDulTheNecromancerEffect(final LimDulTheNecromancerEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public LimDulTheNecromancerEffect copy() {
+ return new LimDulTheNecromancerEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Card card = game.getCard(targetPointer.getFirst(game, source));
+ if (card != null) {
+ Zone currentZone = game.getState().getZone(card.getId());
+ if (card.putOntoBattlefield(game, currentZone, source.getSourceId(), source.getControllerId())) {
+ Permanent creature = game.getPermanent(card.getId());
+ ContinuousEffect effect = new LimDulTheNecromancerContiniousEffect();
+ effect.setTargetPointer(new FixedTarget(creature.getId()));
+ game.addEffect(effect, source);
+ return true;
+ }
+ }
+ return false;
+ }
+
+}
+
+class LimDulTheNecromancerContiniousEffect extends ContinuousEffectImpl {
+
+ public LimDulTheNecromancerContiniousEffect() {
+ super(Duration.Custom, Outcome.Neutral);
+ staticText = "If it's a creature, it's a Zombie in addition to its other creature types";
+ }
+
+ public LimDulTheNecromancerContiniousEffect(final LimDulTheNecromancerContiniousEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public LimDulTheNecromancerContiniousEffect copy() {
+ return new LimDulTheNecromancerContiniousEffect(this);
+ }
+
+ @Override
+ public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) {
+ Permanent permanent = game.getPermanent(targetPointer.getFirst(game, source));
+ if (permanent != null
+ && permanent.getCardType().contains(CardType.CREATURE)) {
+ switch (layer) {
+ case TypeChangingEffects_4:
+ if (sublayer == SubLayer.NA) {
+ permanent.getSubtype().add("Zombie");
+ }
+ break;
+ }
+ return true;
+ } else {
+ this.used = true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ return false;
+ }
+
+ @Override
+ public boolean hasLayer(Layer layer) {
+ return layer == Layer.TypeChangingEffects_4;
+ }
+
+}
diff --git a/Mage.Sets/src/mage/sets/timespiral/MishraArtificerProdigy.java b/Mage.Sets/src/mage/sets/timespiral/MishraArtificerProdigy.java
index 28488d56754..0ef45b5d50b 100644
--- a/Mage.Sets/src/mage/sets/timespiral/MishraArtificerProdigy.java
+++ b/Mage.Sets/src/mage/sets/timespiral/MishraArtificerProdigy.java
@@ -142,15 +142,12 @@ class MishraArtificerProdigyEffect extends OneShotEffect {
FilterCard filter = new FilterCard("card named " + this.cardName);
filter.add(new NamePredicate(cardName));
Card card = null;
- Zone zone = null;
// Graveyard
if (controller.chooseUse(Outcome.Neutral, "Search your graveyard?", source, game)) {
- TargetCardInYourGraveyard target = new TargetCardInYourGraveyard(0, 1, filter);
+ // You can't fail to find the card in your graveyard because it's not hidden
+ TargetCardInYourGraveyard target = new TargetCardInYourGraveyard(1, 1, filter);
if (controller.choose(Outcome.PutCardInPlay, controller.getGraveyard(), target, game)) {
card = game.getCard(target.getFirstTarget());
- if (card != null) {
- zone = Zone.GRAVEYARD;
- }
}
}
// Hand
@@ -158,9 +155,6 @@ class MishraArtificerProdigyEffect extends OneShotEffect {
TargetCardInHand target = new TargetCardInHand(0, 1, filter);
if (controller.choose(Outcome.PutCardInPlay, controller.getHand(), target, game)) {
card = game.getCard(target.getFirstTarget());
- if (card != null) {
- zone = Zone.HAND;
- }
}
}
// Library
@@ -168,15 +162,12 @@ class MishraArtificerProdigyEffect extends OneShotEffect {
TargetCardInLibrary target = new TargetCardInLibrary(0, 1, filter);
if (controller.searchLibrary(target, game)) {
card = game.getCard(target.getFirstTarget());
- if (card != null) {
- zone = Zone.LIBRARY;
- }
}
controller.shuffleLibrary(game);
}
// Put on battlefield
if (card != null) {
- controller.moveCards(card, zone, Zone.BATTLEFIELD, source, game);
+ controller.moveCards(card, null, Zone.BATTLEFIELD, source, game);
}
return true;
}
diff --git a/Mage.Sets/src/mage/sets/timespiral/RiftwingCloudskate.java b/Mage.Sets/src/mage/sets/timespiral/RiftwingCloudskate.java
index 221faa6eb4d..c0fd5c60bc7 100644
--- a/Mage.Sets/src/mage/sets/timespiral/RiftwingCloudskate.java
+++ b/Mage.Sets/src/mage/sets/timespiral/RiftwingCloudskate.java
@@ -28,8 +28,6 @@
package mage.sets.timespiral;
import java.util.UUID;
-import mage.constants.CardType;
-import mage.constants.Rarity;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
@@ -38,6 +36,8 @@ import mage.abilities.effects.common.ReturnToHandTargetEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.abilities.keyword.SuspendAbility;
import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
import mage.target.TargetPermanent;
/**
@@ -62,7 +62,7 @@ public class RiftwingCloudskate extends CardImpl {
this.addAbility(ability);
// Suspend 3-{1}{U}
- this.addAbility(new SuspendAbility(3, new ManaCostsImpl("{1}{U}"),this));
+ this.addAbility(new SuspendAbility(3, new ManaCostsImpl("{1}{U}"), this));
}
public RiftwingCloudskate(final RiftwingCloudskate card) {
diff --git a/Mage.Sets/src/mage/sets/timespiral/ZealotIlVec.java b/Mage.Sets/src/mage/sets/timespiral/ZealotIlVec.java
new file mode 100644
index 00000000000..47fa6319572
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/timespiral/ZealotIlVec.java
@@ -0,0 +1,78 @@
+/*
+ * 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.sets.timespiral;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.AttacksAndIsNotBlockedTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.effects.common.PreventCombatDamageBySourceEffect;
+import mage.abilities.keyword.ShadowAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class ZealotIlVec extends CardImpl {
+
+ public ZealotIlVec(UUID ownerId) {
+ super(ownerId, 47, "Zealot il-Vec", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{W}");
+ this.expansionSetCode = "TSP";
+ this.subtype.add("Human");
+ this.subtype.add("Rebel");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // Shadow
+ this.addAbility(ShadowAbility.getInstance());
+ // Whenever Zealot il-Vec attacks and isn't blocked, you may have it deal 1 damage to target creature. If you do, prevent all combat damage Zealot il-Vec would deal this turn.
+ Ability ability = new AttacksAndIsNotBlockedTriggeredAbility(new DamageTargetEffect(1), true);
+ Effect effect = new PreventCombatDamageBySourceEffect(Duration.EndOfTurn);
+ effect.setText("if you do, prevent all combat damage {this} would deal this turn");
+ ability.addEffect(effect);
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+
+ }
+
+ public ZealotIlVec(final ZealotIlVec card) {
+ super(card);
+ }
+
+ @Override
+ public ZealotIlVec copy() {
+ return new ZealotIlVec(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/torment/DwellOnThePast.java b/Mage.Sets/src/mage/sets/torment/DwellOnThePast.java
new file mode 100644
index 00000000000..e1c8774608a
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/torment/DwellOnThePast.java
@@ -0,0 +1,140 @@
+/*
+ * 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.sets.torment;
+
+import java.util.List;
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.effects.OneShotEffect;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.FilterCard;
+import mage.game.Game;
+import mage.players.Player;
+import mage.target.TargetCard;
+import mage.target.TargetPlayer;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class DwellOnThePast extends CardImpl {
+
+ public DwellOnThePast(UUID ownerId) {
+ super(ownerId, 124, "Dwell on the Past", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{G}");
+ this.expansionSetCode = "TOR";
+
+ // Target player shuffles up to four target cards from his or her graveyard into his or her library.
+ this.getSpellAbility().addEffect(new DwellOnThePastEffect());
+ this.getSpellAbility().addTarget(new TargetPlayer());
+ this.getSpellAbility().addTarget(new DwellOnThePastTarget());
+
+ }
+
+ public DwellOnThePast(final DwellOnThePast card) {
+ super(card);
+ }
+
+ @Override
+ public DwellOnThePast copy() {
+ return new DwellOnThePast(this);
+ }
+}
+
+class DwellOnThePastEffect extends OneShotEffect {
+
+ public DwellOnThePastEffect() {
+ super(Outcome.Neutral);
+ this.staticText = "Target player shuffles up to four target cards from his or her graveyard into his or her library";
+ }
+
+ public DwellOnThePastEffect(final DwellOnThePastEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public DwellOnThePastEffect copy() {
+ return new DwellOnThePastEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player player = game.getPlayer(source.getFirstTarget());
+ if (player != null) {
+ List targets = source.getTargets().get(1).getTargets();
+ boolean shuffle = false;
+ for (UUID targetId : targets) {
+ Card card = game.getCard(targetId);
+ if (card != null) {
+ if (player.getGraveyard().contains(card.getId())) {
+ player.getGraveyard().remove(card);
+ card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true);
+ shuffle = true;
+ }
+ }
+ }
+ if (shuffle) {
+ player.shuffleLibrary(game);
+ }
+ return true;
+ }
+ return false;
+ }
+}
+
+class DwellOnThePastTarget extends TargetCard {
+
+ public DwellOnThePastTarget() {
+ super(0, 4, Zone.GRAVEYARD, new FilterCard("cards from target player's graveyard"));
+ }
+
+ public DwellOnThePastTarget(final DwellOnThePastTarget target) {
+ super(target);
+ }
+
+ @Override
+ public boolean canTarget(UUID id, Ability source, Game game) {
+ Card card = game.getCard(id);
+ if (card != null && game.getState().getZone(card.getId()) == Zone.GRAVEYARD) {
+ UUID firstTarget = source.getFirstTarget();
+ if (firstTarget != null && game.getPlayer(firstTarget).getGraveyard().contains(id)) {
+ return filter.match(card, game);
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public DwellOnThePastTarget copy() {
+ return new DwellOnThePastTarget(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/unlimitededition/Conversion.java b/Mage.Sets/src/mage/sets/unlimitededition/Conversion.java
new file mode 100644
index 00000000000..5f61f2899cd
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/unlimitededition/Conversion.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.unlimitededition;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class Conversion extends mage.sets.limitedalpha.Conversion {
+
+ public Conversion(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 200;
+ this.expansionSetCode = "2ED";
+ }
+
+ public Conversion(final Conversion card) {
+ super(card);
+ }
+
+ @Override
+ public Conversion copy() {
+ return new Conversion(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/unlimitededition/CursedLand.java b/Mage.Sets/src/mage/sets/unlimitededition/CursedLand.java
new file mode 100644
index 00000000000..7ee2487d278
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/unlimitededition/CursedLand.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.unlimitededition;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class CursedLand extends mage.sets.fourthedition.CursedLand {
+
+ public CursedLand(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 6;
+ this.expansionSetCode = "2ED";
+ }
+
+ public CursedLand(final CursedLand card) {
+ super(card);
+ }
+
+ @Override
+ public CursedLand copy() {
+ return new CursedLand(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/unlimitededition/Feedback.java b/Mage.Sets/src/mage/sets/unlimitededition/Feedback.java
new file mode 100644
index 00000000000..0d7fd8ae9f9
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/unlimitededition/Feedback.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.unlimitededition;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Feedback extends mage.sets.limitedalpha.Feedback {
+
+ public Feedback(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 58;
+ this.expansionSetCode = "2ED";
+ }
+
+ public Feedback(final Feedback card) {
+ super(card);
+ }
+
+ @Override
+ public Feedback copy() {
+ return new Feedback(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/unlimitededition/GraniteGargoyle.java b/Mage.Sets/src/mage/sets/unlimitededition/GraniteGargoyle.java
new file mode 100644
index 00000000000..dafb05335a8
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/unlimitededition/GraniteGargoyle.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.unlimitededition;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class GraniteGargoyle extends mage.sets.revisededition.GraniteGargoyle {
+
+ public GraniteGargoyle(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 156;
+ this.expansionSetCode = "2ED";
+ }
+
+ public GraniteGargoyle(final GraniteGargoyle card) {
+ super(card);
+ }
+
+ @Override
+ public GraniteGargoyle copy() {
+ return new GraniteGargoyle(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/unlimitededition/LivingArtifact.java b/Mage.Sets/src/mage/sets/unlimitededition/LivingArtifact.java
new file mode 100644
index 00000000000..f1f32f10467
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/unlimitededition/LivingArtifact.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.unlimitededition;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class LivingArtifact extends mage.sets.fifthedition.LivingArtifact {
+
+ public LivingArtifact(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 117;
+ this.expansionSetCode = "2ED";
+ }
+
+ public LivingArtifact(final LivingArtifact card) {
+ super(card);
+ }
+
+ @Override
+ public LivingArtifact copy() {
+ return new LivingArtifact(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/unlimitededition/Sacrifice.java b/Mage.Sets/src/mage/sets/unlimitededition/Sacrifice.java
new file mode 100644
index 00000000000..b62d1a7e564
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/unlimitededition/Sacrifice.java
@@ -0,0 +1,65 @@
+/*
+ * 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.sets.unlimitededition;
+
+import java.util.UUID;
+import mage.Mana;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.dynamicvalue.common.SacrificeCostConvertedMana;
+import mage.abilities.effects.common.DynamicManaEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.target.common.TargetControlledCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Sacrifice extends CardImpl {
+
+ public Sacrifice(UUID ownerId) {
+ super(ownerId, 33, "Sacrifice", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{B}");
+ this.expansionSetCode = "2ED";
+
+ // As an additional cost to cast Sacrifice, sacrifice a creature.
+ this.getSpellAbility().addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent()));
+ // Add to your mana pool an amount of {B} equal to the sacrificed creature's converted mana cost.
+ this.getSpellAbility().addEffect(new DynamicManaEffect(Mana.BlackMana, new SacrificeCostConvertedMana("creature"),
+ "add to your mana pool an amount of {B} equal to the sacrificed creature's converted mana cost"));
+ }
+
+ public Sacrifice(final Sacrifice card) {
+ super(card);
+ }
+
+ @Override
+ public Sacrifice copy() {
+ return new Sacrifice(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/unlimitededition/TwoHeadedGiantOfForiys.java b/Mage.Sets/src/mage/sets/unlimitededition/TwoHeadedGiantOfForiys.java
new file mode 100644
index 00000000000..5ae29d3df23
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/unlimitededition/TwoHeadedGiantOfForiys.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sets.unlimitededition;
+
+import java.util.UUID;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class TwoHeadedGiantOfForiys extends mage.sets.masterseditioniv.TwoHeadedGiantOfForiys {
+
+ public TwoHeadedGiantOfForiys(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 180;
+ this.expansionSetCode = "2ED";
+ this.rarity = Rarity.RARE;
+ }
+
+ public TwoHeadedGiantOfForiys(final TwoHeadedGiantOfForiys card) {
+ super(card);
+ }
+
+ @Override
+ public TwoHeadedGiantOfForiys copy() {
+ return new TwoHeadedGiantOfForiys(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/unlimitededition/VesuvanDoppelganger.java b/Mage.Sets/src/mage/sets/unlimitededition/VesuvanDoppelganger.java
new file mode 100644
index 00000000000..09cc3484c95
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/unlimitededition/VesuvanDoppelganger.java
@@ -0,0 +1,140 @@
+/*
+ * 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.sets.unlimitededition;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.MageObject;
+import mage.abilities.Ability;
+import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.EntersBattlefieldEffect;
+import mage.abilities.effects.OneShotEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+import mage.target.Target;
+import mage.target.TargetPermanent;
+import mage.util.functions.ApplyToPermanent;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class VesuvanDoppelganger extends CardImpl {
+
+ private static final String rule = "You may have {this} enter the battlefield as a copy of any creature on the battlefield except it doesn't copy that creature's color and it gains \"At the beginning of your upkeep, you may have this creature become a copy of target creature except it doesn't copy that creature's color. If you do, this creature gains this ability.\"";
+
+ public VesuvanDoppelganger(UUID ownerId) {
+ super(ownerId, 88, "Vesuvan Doppelganger", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{U}{U}");
+ this.expansionSetCode = "2ED";
+ this.subtype.add("Shapeshifter");
+ this.power = new MageInt(0);
+ this.toughness = new MageInt(0);
+
+ // You may have Vesuvan Doppelganger enter the battlefield as a copy of any creature on the battlefield except it doesn't copy that creature's color and it gains "At the beginning of your upkeep, you may have this creature become a copy of target creature except it doesn't copy that creature's color. If you do, this creature gains this ability."
+ Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new EntersBattlefieldEffect(new VesuvanDoppelgangerCopyEffect(), rule, true));
+ this.addAbility(ability);
+
+ }
+
+ public VesuvanDoppelganger(final VesuvanDoppelganger card) {
+ super(card);
+ }
+
+ @Override
+ public VesuvanDoppelganger copy() {
+ return new VesuvanDoppelganger(this);
+ }
+}
+
+class VesuvanDoppelgangerCopyEffect extends OneShotEffect {
+
+ private static final String rule2 = "At the beginning of your upkeep, you may have this creature become a copy of target creature except it doesn't copy that creature's color. If you do, this creature gains this ability.";
+
+ public VesuvanDoppelgangerCopyEffect() {
+ super(Outcome.Copy);
+ }
+
+ public VesuvanDoppelgangerCopyEffect(final VesuvanDoppelgangerCopyEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ final Permanent sourcePermanent = game.getPermanent(source.getSourceId());
+ if (controller != null && sourcePermanent != null) {
+ Target target = new TargetPermanent(new FilterCreaturePermanent("target creature (you copy from)"));
+ target.setRequired(true);
+ if (source instanceof SimpleStaticAbility) {
+ target = new TargetPermanent(new FilterCreaturePermanent("creature (you copy from)"));
+ target.setRequired(false);
+ target.setNotTarget(true);
+ }
+ if (target.canChoose(source.getSourceId(), source.getControllerId(), game)) {
+ controller.choose(Outcome.Copy, target, source.getSourceId(), game);
+ Permanent copyFromPermanent = game.getPermanent(target.getFirstTarget());
+ if (copyFromPermanent != null) {
+ game.copyPermanent(copyFromPermanent, sourcePermanent, source, new ApplyToPermanent() {
+ @Override
+ public Boolean apply(Game game, Permanent permanent) {
+ permanent.getColor(game).setColor(sourcePermanent.getColor(game));
+ permanent.getAbilities().add(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD,
+ new VesuvanDoppelgangerCopyEffect(), TargetController.YOU, true, false, rule2));
+ return true;
+ }
+
+ @Override
+ public Boolean apply(Game game, MageObject mageObject) {
+ mageObject.getColor(game).setColor(sourcePermanent.getColor(game));
+ mageObject.getAbilities().add(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD,
+ new VesuvanDoppelgangerCopyEffect(), TargetController.YOU, true, false, rule2));
+ return true;
+ }
+
+ });
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public VesuvanDoppelgangerCopyEffect copy() {
+ return new VesuvanDoppelgangerCopyEffect(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/unlimitededition/Wanderlust.java b/Mage.Sets/src/mage/sets/unlimitededition/Wanderlust.java
new file mode 100644
index 00000000000..be640016ad2
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/unlimitededition/Wanderlust.java
@@ -0,0 +1,76 @@
+/*
+ * 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.sets.unlimitededition;
+
+import java.util.UUID;
+import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.AttachEffect;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.keyword.EnchantAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.constants.Zone;
+import mage.target.TargetPermanent;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Wanderlust extends CardImpl {
+
+ public Wanderlust(UUID ownerId) {
+ super(ownerId, 135, "Wanderlust", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{2}{G}");
+ this.expansionSetCode = "2ED";
+ this.subtype.add("Aura");
+
+ // Enchant creature
+ TargetPermanent auraTarget = new TargetCreaturePermanent();
+ this.getSpellAbility().addTarget(auraTarget);
+ this.getSpellAbility().addEffect(new AttachEffect(Outcome.Detriment));
+ this.addAbility(new EnchantAbility(auraTarget.getTargetName()));
+ // At the beginning of the upkeep of enchanted creature's controller, Wanderlust deals 1 damage to that player.
+ Effect effect = new DamageTargetEffect(1);
+ effect.setText("{this} deals 1 damage to that player");
+ this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, effect,
+ TargetController.CONTROLLER_ATTACHED_TO, false, true));
+ }
+
+ public Wanderlust(final Wanderlust card) {
+ super(card);
+ }
+
+ @Override
+ public Wanderlust copy() {
+ return new Wanderlust(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/unlimitededition/WarpArtifact.java b/Mage.Sets/src/mage/sets/unlimitededition/WarpArtifact.java
new file mode 100644
index 00000000000..0afbd74f63b
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/unlimitededition/WarpArtifact.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.unlimitededition;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class WarpArtifact extends mage.sets.fifthedition.WarpArtifact {
+
+ public WarpArtifact(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 42;
+ this.expansionSetCode = "2ED";
+ }
+
+ public WarpArtifact(final WarpArtifact card) {
+ super(card);
+ }
+
+ @Override
+ public WarpArtifact copy() {
+ return new WarpArtifact(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/urzasdestiny/BloodshotCyclops.java b/Mage.Sets/src/mage/sets/urzasdestiny/BloodshotCyclops.java
index 1fa8d58f38f..b760233b1b6 100644
--- a/Mage.Sets/src/mage/sets/urzasdestiny/BloodshotCyclops.java
+++ b/Mage.Sets/src/mage/sets/urzasdestiny/BloodshotCyclops.java
@@ -1,121 +1,77 @@
-/*
- * 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.sets.urzasdestiny;
-
-import java.util.UUID;
-import mage.constants.CardType;
-import mage.constants.Outcome;
-import mage.constants.Rarity;
-import mage.constants.Zone;
-import mage.MageInt;
-import mage.abilities.Ability;
-import mage.abilities.common.SimpleActivatedAbility;
-import mage.abilities.costs.Cost;
-import mage.abilities.costs.common.SacrificeTargetCost;
-import mage.abilities.costs.common.TapSourceCost;
-import mage.abilities.effects.OneShotEffect;
-import mage.cards.CardImpl;
-import mage.game.Game;
-import mage.game.permanent.Permanent;
-import mage.players.Player;
-import mage.target.common.TargetControlledCreaturePermanent;
-import mage.target.common.TargetCreatureOrPlayer;
-
-/**
- *
- * @author Backfir3
- */
-public class BloodshotCyclops extends CardImpl {
-
- public BloodshotCyclops(UUID ownerId) {
- super(ownerId, 77, "Bloodshot Cyclops", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{5}{R}");
- this.expansionSetCode = "UDS";
- this.subtype.add("Cyclops");
- this.subtype.add("Giant");
-
- this.power = new MageInt(4);
- this.toughness = new MageInt(4);
-
- // {T}, Sacrifice a creature: Bloodshot Cyclops deals damage equal to the sacrificed
- // creature's power to target creature or player.
- SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BloodshotCyclopsEffect(), new TapSourceCost());
- ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent()));
- ability.addTarget(new TargetCreatureOrPlayer());
- this.addAbility(ability);
- }
-
- public BloodshotCyclops(final BloodshotCyclops card) {
- super(card);
- }
-
- @Override
- public BloodshotCyclops copy() {
- return new BloodshotCyclops(this);
- }
-}
-
-class BloodshotCyclopsEffect extends OneShotEffect {
-
- public BloodshotCyclopsEffect() {
- super(Outcome.Damage);
- staticText = "{this} deals damage equal to the sacrificed creature's power to target creature or player";
- }
-
- public BloodshotCyclopsEffect(final BloodshotCyclopsEffect effect) {
- super(effect);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- int amount = 0;
- for (Cost cost : source.getCosts()) {
- if (cost instanceof SacrificeTargetCost && ((SacrificeTargetCost) cost).getPermanents().size() > 0) {
- amount = ((SacrificeTargetCost) cost).getPermanents().get(0).getPower().getValue();
- break;
- }
- }
- if (amount > 0) {
- Permanent permanent = game.getPermanent(source.getFirstTarget());
- if (permanent != null) {
- permanent.damage(amount, source.getSourceId(), game, false, true);
- return true;
- }
- Player player = game.getPlayer(source.getFirstTarget());
- if (player != null) {
- player.damage(amount, source.getSourceId(), game, false, true);
- return true;
- }
- }
- return false;
- }
-
- @Override
- public BloodshotCyclopsEffect copy() {
- return new BloodshotCyclopsEffect(this);
- }
-}
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.urzasdestiny;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.dynamicvalue.common.SacrificeCostCreaturesPower;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.target.common.TargetControlledCreaturePermanent;
+import mage.target.common.TargetCreatureOrPlayer;
+
+/**
+ *
+ * @author Backfir3
+ */
+public class BloodshotCyclops extends CardImpl {
+
+ public BloodshotCyclops(UUID ownerId) {
+ super(ownerId, 77, "Bloodshot Cyclops", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{5}{R}");
+ this.expansionSetCode = "UDS";
+ this.subtype.add("Cyclops");
+ this.subtype.add("Giant");
+
+ this.power = new MageInt(4);
+ this.toughness = new MageInt(4);
+
+ // {T}, Sacrifice a creature: Bloodshot Cyclops deals damage equal to the sacrificed
+ // creature's power to target creature or player.
+ SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD,
+ new DamageTargetEffect(new SacrificeCostCreaturesPower()),
+ new TapSourceCost());
+ ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent()));
+ ability.addTarget(new TargetCreatureOrPlayer());
+ this.addAbility(ability);
+ }
+
+ public BloodshotCyclops(final BloodshotCyclops card) {
+ super(card);
+ }
+
+ @Override
+ public BloodshotCyclops copy() {
+ return new BloodshotCyclops(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/urzasdestiny/Metalworker.java b/Mage.Sets/src/mage/sets/urzasdestiny/Metalworker.java
index 14bb54ff872..a06535181fc 100644
--- a/Mage.Sets/src/mage/sets/urzasdestiny/Metalworker.java
+++ b/Mage.Sets/src/mage/sets/urzasdestiny/Metalworker.java
@@ -28,11 +28,8 @@
package mage.sets.urzasdestiny;
import java.util.UUID;
-
-import mage.constants.CardType;
-import mage.constants.Outcome;
-import mage.constants.Rarity;
import mage.MageInt;
+import mage.MageObject;
import mage.Mana;
import mage.abilities.Ability;
import mage.abilities.costs.common.TapSourceCost;
@@ -41,6 +38,9 @@ import mage.abilities.mana.SimpleManaAbility;
import mage.cards.CardImpl;
import mage.cards.Cards;
import mage.cards.CardsImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
import mage.constants.Zone;
import mage.filter.FilterCard;
import mage.filter.common.FilterArtifactCard;
@@ -76,19 +76,15 @@ public class Metalworker extends CardImpl {
}
}
-
class MetalworkerManaEffect extends ManaEffect {
-
private static final FilterCard filter = new FilterArtifactCard();
-
+
public MetalworkerManaEffect() {
super();
staticText = "Reveal any number of artifact cards in your hand. Add {2} to your mana pool for each card revealed this way";
}
-
-
public MetalworkerManaEffect(final MetalworkerManaEffect effect) {
super(effect);
}
@@ -100,35 +96,35 @@ class MetalworkerManaEffect extends ManaEffect {
@Override
public boolean apply(Game game, Ability source) {
-
- Player player = game.getPlayer(source.getControllerId());
- if (player == null) {
+ Player controller = game.getPlayer(source.getControllerId());
+ MageObject sourceObject = source.getSourceObject(game);
+ if (controller == null || sourceObject == null) {
return false;
}
- Cards cards = new CardsImpl();
- if (player.getHand().count(filter, game) > 0) {
+ if (controller.getHand().count(filter, game) > 0) {
TargetCardInHand target = new TargetCardInHand(0, Integer.MAX_VALUE, filter);
- if (player.choose(Outcome.Benefit, target, source.getSourceId(), game)) {
- for(UUID uuid : target.getTargets()){
- cards.add(player.getHand().get(uuid, game));
- }
- player.revealCards("Revealed card", cards, game);
- Mana mana = Mana.ColorlessMana(target.getTargets().size()*2);
+ if (controller.choose(Outcome.Benefit, target, source.getSourceId(), game)) {
+ Cards cards = new CardsImpl(target.getTargets());
+ controller.revealCards(sourceObject.getIdName(), cards, game);
+ Mana mana = Mana.ColorlessMana(target.getTargets().size() * 2);
checkToFirePossibleEvents(mana, game, source);
- player.getManaPool().addMana(mana, game, source);
-
+ controller.getManaPool().addMana(mana, game, source);
}
- }
-
-
+ }
return true;
}
@Override
public Mana getMana(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller != null) {
+ int artifactsHand = controller.getHand().count(filter, game);
+ if (artifactsHand > 0) {
+ return Mana.ColorlessMana(artifactsHand * 2);
+ }
+ }
return null;
}
-
}
diff --git a/Mage.Sets/src/mage/sets/urzasdestiny/Opalescence.java b/Mage.Sets/src/mage/sets/urzasdestiny/Opalescence.java
index 977547a474a..cd11bb83449 100644
--- a/Mage.Sets/src/mage/sets/urzasdestiny/Opalescence.java
+++ b/Mage.Sets/src/mage/sets/urzasdestiny/Opalescence.java
@@ -27,9 +27,13 @@
*/
package mage.sets.urzasdestiny;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
+import mage.abilities.effects.ContinuousEffect;
import mage.abilities.effects.ContinuousEffectImpl;
import mage.cards.CardImpl;
import mage.constants.CardType;
@@ -47,6 +51,7 @@ import mage.filter.predicate.mageobject.SubtypePredicate;
import mage.filter.predicate.permanent.AnotherPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
+import mage.sets.shadowmoor.EnchantedEvening;
/**
*
@@ -58,7 +63,6 @@ public class Opalescence extends CardImpl {
super(ownerId, 13, "Opalescence", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{2}{W}{W}");
this.expansionSetCode = "UDS";
-
// Each other non-Aura enchantment is a creature with power and toughness each equal to its converted mana cost. It's still an enchantment.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new OpalescenceEffect()));
@@ -72,19 +76,21 @@ public class Opalescence extends CardImpl {
public Opalescence copy() {
return new Opalescence(this);
}
+
}
class OpalescenceEffect extends ContinuousEffectImpl {
private static final FilterEnchantmentPermanent filter = new FilterEnchantmentPermanent("Each other non-Aura enchantment");
+
static {
filter.add(Predicates.not(new SubtypePredicate("Aura")));
filter.add(new AnotherPredicate());
}
-
+
public OpalescenceEffect() {
super(Duration.WhileOnBattlefield, Outcome.BecomeCreature);
- staticText = "Each other non-Aura enchantment is a creature with power and toughness each equal to its converted mana cost";
+ staticText = "Each other non-Aura enchantment is a creature in addition to its other types and has base power and base toughness each equal to its converted mana cost";
}
public OpalescenceEffect(final OpalescenceEffect effect) {
@@ -125,10 +131,22 @@ class OpalescenceEffect extends ContinuousEffectImpl {
return false;
}
-
@Override
public boolean hasLayer(Layer layer) {
return layer == Layer.PTChangingEffects_7 || layer == Layer.TypeChangingEffects_4;
}
+ @Override
+ public Set isDependentTo(List allEffectsInLayer) {
+ Set dependentTo = null;
+ for (ContinuousEffect effect : allEffectsInLayer) {
+ if (EnchantedEvening.class.equals(effect.getClass().getEnclosingClass())) {
+ if (dependentTo == null) {
+ dependentTo = new HashSet<>();
+ }
+ dependentTo.add(effect.getId());
+ }
+ }
+ return dependentTo;
+ }
}
diff --git a/Mage.Sets/src/mage/sets/urzassaga/ElvishHerder.java b/Mage.Sets/src/mage/sets/urzassaga/ElvishHerder.java
new file mode 100644
index 00000000000..5733f999c64
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/urzassaga/ElvishHerder.java
@@ -0,0 +1,72 @@
+/*
+ * 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.sets.urzassaga;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
+import mage.abilities.keyword.TrampleAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class ElvishHerder extends CardImpl {
+
+ public ElvishHerder(UUID ownerId) {
+ super(ownerId, 247, "Elvish Herder", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{G}");
+ this.expansionSetCode = "USG";
+ this.subtype.add("Elf");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // {G}: Target creature gains trample until end of turn.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainAbilityTargetEffect(
+ TrampleAbility.getInstance(), Duration.EndOfTurn), new ManaCostsImpl("{G}"));
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+ }
+
+ public ElvishHerder(final ElvishHerder card) {
+ super(card);
+ }
+
+ @Override
+ public ElvishHerder copy() {
+ return new ElvishHerder(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/urzassaga/Endoskeleton.java b/Mage.Sets/src/mage/sets/urzassaga/Endoskeleton.java
new file mode 100644
index 00000000000..59e3240ae18
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/urzassaga/Endoskeleton.java
@@ -0,0 +1,75 @@
+/*
+ * 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.sets.urzassaga;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.common.SkipUntapOptionalAbility;
+import mage.abilities.condition.common.SourceTappedCondition;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.decorator.ConditionalContinuousEffect;
+import mage.abilities.effects.common.continuous.BoostTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Endoskeleton extends CardImpl {
+
+ public Endoskeleton(UUID ownerId) {
+ super(ownerId, 294, "Endoskeleton", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{2}");
+ this.expansionSetCode = "USG";
+
+ // You may choose not to untap Endoskeleton during your untap step.
+ this.addAbility(new SkipUntapOptionalAbility());
+ // {2}, {tap}: Target creature gets +0/+3 for as long as Endoskeleton remains tapped.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ConditionalContinuousEffect(
+ new BoostTargetEffect(0, 3, Duration.Custom), SourceTappedCondition.getInstance(),
+ "target creature gets +0/+3 for as long as {this} remains tapped"), new ManaCostsImpl("{2}"));
+ ability.addCost(new TapSourceCost());
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+ }
+
+ public Endoskeleton(final Endoskeleton card) {
+ super(card);
+ }
+
+ @Override
+ public Endoskeleton copy() {
+ return new Endoskeleton(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/urzassaga/FaithHealer.java b/Mage.Sets/src/mage/sets/urzassaga/FaithHealer.java
new file mode 100644
index 00000000000..37a52580727
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/urzassaga/FaithHealer.java
@@ -0,0 +1,70 @@
+/*
+ * 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.sets.urzassaga;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.dynamicvalue.common.SacrificeCostConvertedMana;
+import mage.abilities.effects.common.GainLifeEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterControlledEnchantmentPermanent;
+import mage.target.common.TargetControlledPermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class FaithHealer extends CardImpl {
+
+ public FaithHealer(UUID ownerId) {
+ super(ownerId, 14, "Faith Healer", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{W}");
+ this.expansionSetCode = "USG";
+ this.subtype.add("Human");
+ this.subtype.add("Cleric");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // Sacrifice an enchantment: You gain life equal to the sacrificed enchantment's converted mana cost.
+ this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainLifeEffect(new SacrificeCostConvertedMana("enchantment")),
+ new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledEnchantmentPermanent()))));
+ }
+
+ public FaithHealer(final FaithHealer card) {
+ super(card);
+ }
+
+ @Override
+ public FaithHealer copy() {
+ return new FaithHealer(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/urzassaga/JaggedLightning.java b/Mage.Sets/src/mage/sets/urzassaga/JaggedLightning.java
new file mode 100644
index 00000000000..c164794333d
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/urzassaga/JaggedLightning.java
@@ -0,0 +1,61 @@
+/*
+ * 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.sets.urzassaga;
+
+import java.util.UUID;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class JaggedLightning extends CardImpl {
+
+ public JaggedLightning(UUID ownerId) {
+ super(ownerId, 200, "Jagged Lightning", Rarity.UNCOMMON, new CardType[]{CardType.SORCERY}, "{3}{R}{R}");
+ this.expansionSetCode = "USG";
+
+ // Jagged Lightning deals 3 damage to each of two target creatures.
+ this.getSpellAbility().addEffect(new DamageTargetEffect(3, true, "each of two target creatures"));
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent(2, 2, new FilterCreaturePermanent(), false));
+ }
+
+ public JaggedLightning(final JaggedLightning card) {
+ super(card);
+ }
+
+ @Override
+ public JaggedLightning copy() {
+ return new JaggedLightning(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/urzassaga/ShowAndTell.java b/Mage.Sets/src/mage/sets/urzassaga/ShowAndTell.java
index 21b6a651688..856e29d1943 100644
--- a/Mage.Sets/src/mage/sets/urzassaga/ShowAndTell.java
+++ b/Mage.Sets/src/mage/sets/urzassaga/ShowAndTell.java
@@ -55,7 +55,6 @@ public class ShowAndTell extends CardImpl {
super(ownerId, 96, "Show and Tell", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{2}{U}");
this.expansionSetCode = "USG";
-
// Each player may put an artifact, creature, enchantment, or land card from his or her hand onto the battlefield.
this.getSpellAbility().addEffect(new ShowAndTellEffect());
}
@@ -105,8 +104,8 @@ class ShowAndTellEffect extends OneShotEffect {
}
List cardsToPutIntoPlay = new ArrayList<>();
TargetCardInHand target = new TargetCardInHand(filter);
-
- for(UUID playerId: game.getState().getPlayersInRange(controller.getId(), game)) {
+
+ for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) {
Player player = game.getPlayer(playerId);
if (player != null) {
if (player.chooseUse(outcome, "Put an artifact, creature, enchantment, or land card from hand onto the battlefield?", source, game)) {
@@ -117,10 +116,10 @@ class ShowAndTellEffect extends OneShotEffect {
cardsToPutIntoPlay.add(card);
}
}
- }
+ }
}
}
- for (Card card: cardsToPutIntoPlay) {
+ for (Card card : cardsToPutIntoPlay) {
Player player = game.getPlayer(card.getOwnerId());
if (player != null) {
player.putOntoBattlefieldWithInfo(card, game, Zone.HAND, source.getSourceId());
diff --git a/Mage.Sets/src/mage/sets/urzassaga/SpireOwl.java b/Mage.Sets/src/mage/sets/urzassaga/SpireOwl.java
new file mode 100644
index 00000000000..1e30546bfad
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/urzassaga/SpireOwl.java
@@ -0,0 +1,66 @@
+/*
+ * 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.sets.urzassaga;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.common.LookLibraryControllerEffect;
+import mage.abilities.keyword.FlyingAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class SpireOwl extends CardImpl {
+
+ public SpireOwl(UUID ownerId) {
+ super(ownerId, 98, "Spire Owl", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{U}");
+ this.expansionSetCode = "USG";
+ this.subtype.add("Bird");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // Flying
+ this.addAbility(FlyingAbility.getInstance());
+ // When Spire Owl enters the battlefield, look at the top four cards of your library, then put them back in any order.
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new LookLibraryControllerEffect(4)));
+ }
+
+ public SpireOwl(final SpireOwl card) {
+ super(card);
+ }
+
+ @Override
+ public SpireOwl copy() {
+ return new SpireOwl(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/venservskoth/CoralFighters.java b/Mage.Sets/src/mage/sets/venservskoth/CoralFighters.java
new file mode 100644
index 00000000000..451fe869337
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/venservskoth/CoralFighters.java
@@ -0,0 +1,111 @@
+/*
+ * 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.sets.venservskoth;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.AttacksAndIsNotBlockedTriggeredAbility;
+import mage.abilities.effects.OneShotEffect;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.cards.Cards;
+import mage.cards.CardsImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.players.Player;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class CoralFighters extends CardImpl {
+
+ public CoralFighters(UUID ownerId) {
+ super(ownerId, 4, "Coral Fighters", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{U}");
+ this.expansionSetCode = "DDI";
+ this.subtype.add("Merfolk");
+ this.subtype.add("Soldier");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // Whenever Coral Fighters attacks and isn't blocked, look at the top card of defending player's library. You may put that card on the bottom of that player's library.
+ this.addAbility(new AttacksAndIsNotBlockedTriggeredAbility(new CoralFightersEffect(), false, true));
+ }
+
+ public CoralFighters(final CoralFighters card) {
+ super(card);
+ }
+
+ @Override
+ public CoralFighters copy() {
+ return new CoralFighters(this);
+ }
+}
+
+class CoralFightersEffect extends OneShotEffect {
+
+ public CoralFightersEffect() {
+ super(Outcome.Detriment);
+ staticText = "look at the top card of defending player's library. You may put that card on the bottom of that player's library";
+ }
+
+ public CoralFightersEffect(final CoralFightersEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public CoralFightersEffect copy() {
+ return new CoralFightersEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ Player defendingPlayer = game.getPlayer(targetPointer.getFirst(game, source));
+ if(controller != null && defendingPlayer != null) {
+ Card card = defendingPlayer.getLibrary().getFromTop(game);
+ if(card != null) {
+ Cards cards = new CardsImpl();
+ cards.add(card);
+ controller.lookAtCards("Coral Fighters", cards, game);
+ if (controller.chooseUse(outcome, "Do you wish to put card on the bottom of player's library?", source, game)) {
+ controller.moveCardToLibraryWithInfo(card, source.getSourceId(), game, Zone.LIBRARY, false, false);
+ }
+ else {
+ game.informPlayers(controller.getLogName() + " puts the card back on top of the library.");
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/vintagemasters/DacksDuplicate.java b/Mage.Sets/src/mage/sets/vintagemasters/DacksDuplicate.java
index 7c2e0602262..467c548ca54 100644
--- a/Mage.Sets/src/mage/sets/vintagemasters/DacksDuplicate.java
+++ b/Mage.Sets/src/mage/sets/vintagemasters/DacksDuplicate.java
@@ -29,6 +29,7 @@ package mage.sets.vintagemasters;
import java.util.UUID;
import mage.MageInt;
+import mage.MageObject;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.EntersBattlefieldEffect;
import mage.abilities.effects.common.CopyPermanentEffect;
@@ -86,4 +87,12 @@ class DacksDuplicateApplyToPermanent extends ApplyToPermanent {
permanent.addAbility(HasteAbility.getInstance(), game);
return true;
}
+
+ @Override
+ public Boolean apply(Game game, MageObject mageObject) {
+ mageObject.getAbilities().add(new DethroneAbility());
+ mageObject.getAbilities().add(HasteAbility.getInstance());
+ return true;
+ }
+
}
diff --git a/Mage.Sets/src/mage/sets/vintagemasters/ManaDrain.java b/Mage.Sets/src/mage/sets/vintagemasters/ManaDrain.java
index 16cc9baccb3..ac4ba8c8c7f 100644
--- a/Mage.Sets/src/mage/sets/vintagemasters/ManaDrain.java
+++ b/Mage.Sets/src/mage/sets/vintagemasters/ManaDrain.java
@@ -1,109 +1,109 @@
-/*
- * 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.sets.vintagemasters;
-
-import java.util.UUID;
-import mage.Mana;
-import mage.abilities.Ability;
-import mage.abilities.common.delayed.AtTheBeginOMainPhaseDelayedTriggeredAbility;
-import mage.abilities.common.delayed.AtTheBeginOMainPhaseDelayedTriggeredAbility.PhaseSelection;
-import mage.abilities.effects.Effect;
-import mage.abilities.effects.OneShotEffect;
-import mage.abilities.effects.common.AddManaToManaPoolTargetControllerEffect;
-import mage.cards.CardImpl;
-import mage.constants.CardType;
-import mage.constants.Outcome;
-import mage.constants.Rarity;
-import mage.constants.TargetController;
-import mage.game.Game;
-import mage.game.stack.Spell;
-import mage.target.TargetSpell;
-import mage.target.targetpointer.FixedTarget;
-
-/**
- *
- * @author LevelX2
- */
-public class ManaDrain extends CardImpl {
-
- public ManaDrain(UUID ownerId) {
- super(ownerId, 78, "Mana Drain", Rarity.MYTHIC, new CardType[]{CardType.INSTANT}, "{U}{U}");
- this.expansionSetCode = "VMA";
-
-
- // Counter target spell. At the beginning of your next main phase, add {X} to your mana pool, where X is that spell's converted mana cost.
- this.getSpellAbility().addTarget(new TargetSpell());
- this.getSpellAbility().addEffect(new ManaDrainCounterEffect());
- }
-
- public ManaDrain(final ManaDrain card) {
- super(card);
- }
-
- @Override
- public ManaDrain copy() {
- return new ManaDrain(this);
- }
-}
-
-class ManaDrainCounterEffect extends OneShotEffect {
-
- public ManaDrainCounterEffect() {
- super(Outcome.Benefit);
- this.staticText = "Counter target spell. At the beginning of your next main phase, add {X} to your mana pool, where X is that spell's converted mana cost";
- }
-
- public ManaDrainCounterEffect(final ManaDrainCounterEffect effect) {
- super(effect);
- }
-
- @Override
- public ManaDrainCounterEffect copy() {
- return new ManaDrainCounterEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Spell spell = game.getStack().getSpell(getTargetPointer().getFirst(game, source));
- if (spell != null) {
- game.getStack().counter(getTargetPointer().getFirst(game, source), source.getSourceId(), game);
- // mana gets added also if counter is not successful
- int cmc = spell.getConvertedManaCost();
- Effect effect = new AddManaToManaPoolTargetControllerEffect(new Mana(0,0,0,0,0,cmc,0), "your");
- effect.setTargetPointer(new FixedTarget(source.getControllerId()));
- AtTheBeginOMainPhaseDelayedTriggeredAbility delayedAbility =
- new AtTheBeginOMainPhaseDelayedTriggeredAbility(effect, false, TargetController.YOU, PhaseSelection.NEXT_MAIN);
- delayedAbility.setSourceId(source.getSourceId());
- delayedAbility.setControllerId(source.getControllerId());
- delayedAbility.setSourceObject(source.getSourceObject(game), game);
- game.addDelayedTriggeredAbility(delayedAbility);
- return true;
- }
- return false;
- }
-}
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.vintagemasters;
+
+import java.util.UUID;
+import mage.Mana;
+import mage.abilities.Ability;
+import mage.abilities.common.delayed.AtTheBeginOfMainPhaseDelayedTriggeredAbility;
+import mage.abilities.common.delayed.AtTheBeginOfMainPhaseDelayedTriggeredAbility.PhaseSelection;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.AddManaToManaPoolTargetControllerEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.game.Game;
+import mage.game.stack.Spell;
+import mage.target.TargetSpell;
+import mage.target.targetpointer.FixedTarget;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class ManaDrain extends CardImpl {
+
+ public ManaDrain(UUID ownerId) {
+ super(ownerId, 78, "Mana Drain", Rarity.MYTHIC, new CardType[]{CardType.INSTANT}, "{U}{U}");
+ this.expansionSetCode = "VMA";
+
+
+ // Counter target spell. At the beginning of your next main phase, add {X} to your mana pool, where X is that spell's converted mana cost.
+ this.getSpellAbility().addTarget(new TargetSpell());
+ this.getSpellAbility().addEffect(new ManaDrainCounterEffect());
+ }
+
+ public ManaDrain(final ManaDrain card) {
+ super(card);
+ }
+
+ @Override
+ public ManaDrain copy() {
+ return new ManaDrain(this);
+ }
+}
+
+class ManaDrainCounterEffect extends OneShotEffect {
+
+ public ManaDrainCounterEffect() {
+ super(Outcome.Benefit);
+ this.staticText = "Counter target spell. At the beginning of your next main phase, add {X} to your mana pool, where X is that spell's converted mana cost";
+ }
+
+ public ManaDrainCounterEffect(final ManaDrainCounterEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public ManaDrainCounterEffect copy() {
+ return new ManaDrainCounterEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Spell spell = game.getStack().getSpell(getTargetPointer().getFirst(game, source));
+ if (spell != null) {
+ game.getStack().counter(getTargetPointer().getFirst(game, source), source.getSourceId(), game);
+ // mana gets added also if counter is not successful
+ int cmc = spell.getConvertedManaCost();
+ Effect effect = new AddManaToManaPoolTargetControllerEffect(new Mana(0,0,0,0,0,cmc,0), "your");
+ effect.setTargetPointer(new FixedTarget(source.getControllerId()));
+ AtTheBeginOfMainPhaseDelayedTriggeredAbility delayedAbility =
+ new AtTheBeginOfMainPhaseDelayedTriggeredAbility(effect, false, TargetController.YOU, PhaseSelection.NEXT_MAIN);
+ delayedAbility.setSourceId(source.getSourceId());
+ delayedAbility.setControllerId(source.getControllerId());
+ delayedAbility.setSourceObject(source.getSourceObject(game), game);
+ game.addDelayedTriggeredAbility(delayedAbility);
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/vintagemasters/Ophidian.java b/Mage.Sets/src/mage/sets/vintagemasters/Ophidian.java
new file mode 100644
index 00000000000..4061bbe1385
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/vintagemasters/Ophidian.java
@@ -0,0 +1,68 @@
+/*
+ * 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.sets.vintagemasters;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.AttacksAndIsNotBlockedTriggeredAbility;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.abilities.effects.common.continuous.AssignNoCombatDamageSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Ophidian extends CardImpl {
+
+ public Ophidian(UUID ownerId) {
+ super(ownerId, 84, "Ophidian", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{U}");
+ this.expansionSetCode = "VMA";
+ this.subtype.add("Snake");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(3);
+
+ // Whenever Ophidian attacks and isn't blocked, you may draw a card. If you do, Ophidian assigns no combat damage this turn.
+ Ability ability = new AttacksAndIsNotBlockedTriggeredAbility(new DrawCardSourceControllerEffect(1), true);
+ ability.addEffect(new AssignNoCombatDamageSourceEffect(Duration.EndOfTurn, true));
+ this.addAbility(ability);
+ }
+
+ public Ophidian(final Ophidian card) {
+ super(card);
+ }
+
+ @Override
+ public Ophidian copy() {
+ return new Ophidian(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/visions/DwarvenVigilantes.java b/Mage.Sets/src/mage/sets/visions/DwarvenVigilantes.java
new file mode 100644
index 00000000000..a82414a6a7e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/visions/DwarvenVigilantes.java
@@ -0,0 +1,74 @@
+/*
+ * 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.sets.visions;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.AttacksAndIsNotBlockedTriggeredAbility;
+import mage.abilities.dynamicvalue.common.SourcePermanentPowerCount;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.effects.common.continuous.AssignNoCombatDamageSourceEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class DwarvenVigilantes extends CardImpl {
+
+ public DwarvenVigilantes(UUID ownerId) {
+ super(ownerId, 77, "Dwarven Vigilantes", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{R}");
+ this.expansionSetCode = "VIS";
+ this.subtype.add("Dwarf");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Whenever Dwarven Vigilantes attacks and isn't blocked, you may have it deal damage equal to its power to target creature. If you do, Dwarven Vigilantes assigns no combat damage this turn.
+ Effect effect = new DamageTargetEffect(new SourcePermanentPowerCount());
+ effect.setText("it deal damage equal to its power to target creature");
+ Ability ability = new AttacksAndIsNotBlockedTriggeredAbility(effect, true);
+ ability.addEffect(new AssignNoCombatDamageSourceEffect(Duration.EndOfTurn, true));
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+ }
+
+ public DwarvenVigilantes(final DwarvenVigilantes card) {
+ super(card);
+ }
+
+ @Override
+ public DwarvenVigilantes copy() {
+ return new DwarvenVigilantes(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/visions/GoblinRecruiter.java b/Mage.Sets/src/mage/sets/visions/GoblinRecruiter.java
index b2951b39274..9d574f3020b 100644
--- a/Mage.Sets/src/mage/sets/visions/GoblinRecruiter.java
+++ b/Mage.Sets/src/mage/sets/visions/GoblinRecruiter.java
@@ -32,19 +32,16 @@ import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
-import mage.cards.Card;
import mage.cards.CardImpl;
import mage.cards.Cards;
import mage.cards.CardsImpl;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Rarity;
-import mage.constants.Zone;
import mage.filter.FilterCard;
import mage.filter.predicate.mageobject.SubtypePredicate;
import mage.game.Game;
import mage.players.Player;
-import mage.target.TargetCard;
import mage.target.common.TargetCardInLibrary;
/**
@@ -78,18 +75,16 @@ public class GoblinRecruiter extends CardImpl {
class GoblinRecruiterEffect extends OneShotEffect {
private static final FilterCard goblinFilter = new FilterCard("Goblin cards");
-
- private static final FilterCard putOnTopOfLibraryFilter = new FilterCard("card to put on the top of your library (last chosen will be on top)");
-
+
static {
goblinFilter.add(new SubtypePredicate("Goblin"));
}
-
+
public GoblinRecruiterEffect() {
super(Outcome.Benefit);
this.staticText = "search your library for any number of Goblin cards and reveal those cards. Shuffle your library, then put them on top of it in any order.";
}
-
+
public GoblinRecruiterEffect(final GoblinRecruiterEffect effect) {
super(effect);
}
@@ -98,54 +93,26 @@ class GoblinRecruiterEffect extends OneShotEffect {
public GoblinRecruiterEffect copy() {
return new GoblinRecruiterEffect(this);
}
-
+
@Override
public boolean apply(Game game, Ability source) {
- Player player = game.getPlayer(source.getControllerId());
- if (player != null) {
+ Player controller = game.getPlayer(source.getControllerId());
+ if (controller != null) {
TargetCardInLibrary targetGoblins = new TargetCardInLibrary(0, Integer.MAX_VALUE, goblinFilter);
Cards cards = new CardsImpl();
- if (player.searchLibrary(targetGoblins, game)) {
- for (UUID targetId : targetGoblins.getTargets()) {
- Card card = player.getLibrary().remove(targetId, game);
- if (card != null) {
- cards.add(card);
- }
- }
+ if (controller.searchLibrary(targetGoblins, game)) {
+ cards.addAll(targetGoblins.getTargets());
}
-
- player.shuffleLibrary(game);
-
+ controller.revealCards(staticText, cards, game);
+ controller.shuffleLibrary(game);
+
int numberOfGoblins = cards.size();
if (numberOfGoblins > 0) {
- if (cards.size() > 1) {
- TargetCard targetCard = new TargetCard(Zone.LIBRARY, putOnTopOfLibraryFilter);
- while (player.canRespond() && cards.size() > 1) {
- player.choose(Outcome.Benefit, cards, targetCard, game);
- Card card = cards.get(targetCard.getFirstTarget(), game);
- if (card != null) {
- cards.remove(card);
- card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true);
- }
- targetCard.clearChosen();
- }
- }
- if (cards.size() == 1) {
- Card card = cards.get(cards.iterator().next(), game);
- if (card != null) {
- cards.remove(card);
- card.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true);
- }
- }
+ controller.putCardsOnTopOfLibrary(cards, game, source, true);
}
-
- game.informPlayers(new StringBuilder(player.getLogName()).append(" puts ")
- .append(numberOfGoblins).append(" Goblin").append(numberOfGoblins == 1 ? " card" : " cards")
- .append(" on top of his library").toString());
-
return true;
}
return false;
}
-
+
}
diff --git a/Mage.Sets/src/mage/sets/visions/JamuraanLion.java b/Mage.Sets/src/mage/sets/visions/JamuraanLion.java
new file mode 100644
index 00000000000..4570f07eee4
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/visions/JamuraanLion.java
@@ -0,0 +1,72 @@
+/*
+ * 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.sets.visions;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.common.TapSourceCost;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.common.combat.CantBlockTargetEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class JamuraanLion extends CardImpl {
+
+ public JamuraanLion(UUID ownerId) {
+ super(ownerId, 110, "Jamuraan Lion", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{W}");
+ this.expansionSetCode = "VIS";
+ this.subtype.add("Cat");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(1);
+
+ // {W}, {tap}: Target creature can't block this turn.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CantBlockTargetEffect(Duration.EndOfTurn), new ManaCostsImpl("{W}"));
+ ability.addCost(new TapSourceCost());
+ ability.addTarget(new TargetCreaturePermanent());
+ this.addAbility(ability);
+ }
+
+ public JamuraanLion(final JamuraanLion card) {
+ super(card);
+ }
+
+ @Override
+ public JamuraanLion copy() {
+ return new JamuraanLion(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/visions/PhyrexianMarauder.java b/Mage.Sets/src/mage/sets/visions/PhyrexianMarauder.java
index 96c5998fc59..e06229d3abb 100644
--- a/Mage.Sets/src/mage/sets/visions/PhyrexianMarauder.java
+++ b/Mage.Sets/src/mage/sets/visions/PhyrexianMarauder.java
@@ -96,10 +96,11 @@ class PhyrexianMarauderEntersEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Permanent permanent = game.getPermanent(source.getSourceId());
if (permanent != null && !permanent.isFaceDown(game)) {
- Object obj = getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
- if (obj != null && obj instanceof SpellAbility
- && permanent.getZoneChangeCounter(game) - 1 == ((SpellAbility) obj).getSourceObjectZoneChangeCounter()) {
- int amount = ((Ability) obj).getManaCostsToPay().getX();
+ SpellAbility spellAbility = (SpellAbility) getValue(EntersBattlefieldEffect.SOURCE_CAST_SPELL_ABILITY);
+ if (spellAbility != null
+ && spellAbility.getSourceId().equals(source.getSourceId())
+ && permanent.getZoneChangeCounter(game) - 1 == spellAbility.getSourceObjectZoneChangeCounter()) {
+ int amount = spellAbility.getManaCostsToPay().getX();
if (amount > 0) {
permanent.addCounters(CounterType.P1P1.createInstance(amount), game);
}
diff --git a/Mage.Sets/src/mage/sets/visions/SuqAtaAssassin.java b/Mage.Sets/src/mage/sets/visions/SuqAtaAssassin.java
new file mode 100644
index 00000000000..b011b65da73
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/visions/SuqAtaAssassin.java
@@ -0,0 +1,70 @@
+/*
+ * 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.sets.visions;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.AttacksAndIsNotBlockedTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.counter.AddPoisonCounterTargetEffect;
+import mage.abilities.keyword.FearAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class SuqAtaAssassin extends CardImpl {
+
+ public SuqAtaAssassin(UUID ownerId) {
+ super(ownerId, 19, "Suq'Ata Assassin", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{B}{B}");
+ this.expansionSetCode = "VIS";
+ this.subtype.add("Human");
+ this.subtype.add("Assassin");
+ this.power = new MageInt(1);
+ this.toughness = new MageInt(1);
+
+ // Fear
+ this.addAbility(FearAbility.getInstance());
+ // Whenever Suq'Ata Assassin attacks and isn't blocked, defending player gets a poison counter.
+ Effect effect = new AddPoisonCounterTargetEffect(1);
+ effect.setText("defending player gets a poison counter");
+ this.addAbility(new AttacksAndIsNotBlockedTriggeredAbility(effect, false, true));
+ }
+
+ public SuqAtaAssassin(final SuqAtaAssassin card) {
+ super(card);
+ }
+
+ @Override
+ public SuqAtaAssassin copy() {
+ return new SuqAtaAssassin(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/weatherlight/AlabasterDragon.java b/Mage.Sets/src/mage/sets/weatherlight/AlabasterDragon.java
new file mode 100644
index 00000000000..ce9dcfe7c49
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/weatherlight/AlabasterDragon.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.weatherlight;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class AlabasterDragon extends mage.sets.portal.AlabasterDragon {
+
+ public AlabasterDragon(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 118;
+ this.expansionSetCode = "WTH";
+ }
+
+ public AlabasterDragon(final AlabasterDragon card) {
+ super(card);
+ }
+
+ @Override
+ public AlabasterDragon copy() {
+ return new AlabasterDragon(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/weatherlight/BoneDancer.java b/Mage.Sets/src/mage/sets/weatherlight/BoneDancer.java
new file mode 100644
index 00000000000..85d29071310
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/weatherlight/BoneDancer.java
@@ -0,0 +1,109 @@
+/*
+ * 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.sets.weatherlight;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.AttacksAndIsNotBlockedTriggeredAbility;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.continuous.AssignNoCombatDamageSourceEffect;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.players.Player;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class BoneDancer extends CardImpl {
+
+ public BoneDancer(UUID ownerId) {
+ super(ownerId, 4, "Bone Dancer", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{B}{B}");
+ this.expansionSetCode = "WTH";
+ this.subtype.add("Zombie");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Whenever Bone Dancer attacks and isn't blocked, you may put the top creature card of defending player's graveyard onto the battlefield under your control. If you do, Bone Dancer assigns no combat damage this turn.
+ Ability ability = new AttacksAndIsNotBlockedTriggeredAbility(new BoneDancerEffect(), true, true);
+ ability.addEffect(new AssignNoCombatDamageSourceEffect(Duration.EndOfTurn, true));
+ this.addAbility(ability);
+ }
+
+ public BoneDancer(final BoneDancer card) {
+ super(card);
+ }
+
+ @Override
+ public BoneDancer copy() {
+ return new BoneDancer(this);
+ }
+}
+
+class BoneDancerEffect extends OneShotEffect {
+
+ public BoneDancerEffect() {
+ super(Outcome.Benefit);
+ this.staticText = "put the top creature card of defending player's graveyard onto the battlefield under your control";
+ }
+
+ public BoneDancerEffect(final BoneDancerEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public BoneDancerEffect copy() {
+ return new BoneDancerEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player controller = game.getPlayer(source.getControllerId());
+ Player defendingPlayer = game.getPlayer(targetPointer.getFirst(game, source));
+ if(controller != null && defendingPlayer != null) {
+ Card lastCreatureCard = null;
+ for(Card card : defendingPlayer.getGraveyard().getCards(game)) {
+ if(card.getCardType().contains(CardType.CREATURE)) {
+ lastCreatureCard = card;
+ }
+ }
+ if(lastCreatureCard != null) {
+ return controller.putOntoBattlefieldWithInfo(lastCreatureCard, game, Zone.GRAVEYARD, source.getSourceId());
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/weatherlight/GoblinGrenadiers.java b/Mage.Sets/src/mage/sets/weatherlight/GoblinGrenadiers.java
new file mode 100644
index 00000000000..ed5891a9222
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/weatherlight/GoblinGrenadiers.java
@@ -0,0 +1,74 @@
+/*
+ * 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.sets.weatherlight;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.AttacksAndIsNotBlockedTriggeredAbility;
+import mage.abilities.costs.common.SacrificeSourceCost;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.DestroyTargetEffect;
+import mage.abilities.effects.common.DoIfCostPaid;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.target.common.TargetCreaturePermanent;
+import mage.target.common.TargetLandPermanent;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class GoblinGrenadiers extends CardImpl {
+
+ public GoblinGrenadiers(UUID ownerId) {
+ super(ownerId, 104, "Goblin Grenadiers", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{R}");
+ this.expansionSetCode = "WTH";
+ this.subtype.add("Goblin");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Whenever Goblin Grenadiers attacks and isn't blocked, you may sacrifice it. If you do, destroy target creature and target land.
+ Effect effect = new DoIfCostPaid(new DestroyTargetEffect(false, true), new SacrificeSourceCost(), "Sacrifice {this} to destroy target creature and target land?");
+ effect.setText("you may sacrifice it. If you do, destroy target creature and target land");
+ Ability ability = new AttacksAndIsNotBlockedTriggeredAbility(effect);
+ ability.addTarget(new TargetCreaturePermanent());
+ ability.addTarget(new TargetLandPermanent());
+ this.addAbility(ability);
+ }
+
+ public GoblinGrenadiers(final GoblinGrenadiers card) {
+ super(card);
+ }
+
+ @Override
+ public GoblinGrenadiers copy() {
+ return new GoblinGrenadiers(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/weatherlight/Ophidian.java b/Mage.Sets/src/mage/sets/weatherlight/Ophidian.java
new file mode 100644
index 00000000000..02ac97ce9ce
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/weatherlight/Ophidian.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.weatherlight;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class Ophidian extends mage.sets.vintagemasters.Ophidian {
+
+ public Ophidian(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 45;
+ this.expansionSetCode = "WTH";
+ }
+
+ public Ophidian(final Ophidian card) {
+ super(card);
+ }
+
+ @Override
+ public Ophidian copy() {
+ return new Ophidian(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/weatherlight/StripedBears.java b/Mage.Sets/src/mage/sets/weatherlight/StripedBears.java
new file mode 100644
index 00000000000..063c15a260d
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/weatherlight/StripedBears.java
@@ -0,0 +1,63 @@
+/*
+ * 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.sets.weatherlight;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.EntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.common.DrawCardSourceControllerEffect;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class StripedBears extends CardImpl {
+
+ public StripedBears(UUID ownerId) {
+ super(ownerId, 82, "Striped Bears", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{G}");
+ this.expansionSetCode = "WTH";
+ this.subtype.add("Bear");
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // When Striped Bears enters the battlefield, draw a card.
+ this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1)));
+ }
+
+ public StripedBears(final StripedBears card) {
+ super(card);
+ }
+
+ @Override
+ public StripedBears copy() {
+ return new StripedBears(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/worldwake/RoilingTerrain.java b/Mage.Sets/src/mage/sets/worldwake/RoilingTerrain.java
index 6a709b65662..d60e58b151a 100644
--- a/Mage.Sets/src/mage/sets/worldwake/RoilingTerrain.java
+++ b/Mage.Sets/src/mage/sets/worldwake/RoilingTerrain.java
@@ -28,15 +28,13 @@
package mage.sets.worldwake;
import java.util.UUID;
-
-import mage.constants.CardType;
-import mage.constants.Rarity;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
import mage.cards.CardImpl;
+import mage.constants.CardType;
import mage.constants.Outcome;
-import mage.filter.FilterCard;
-import mage.filter.predicate.mageobject.CardTypePredicate;
+import mage.constants.Rarity;
+import mage.filter.common.FilterLandCard;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
@@ -52,7 +50,6 @@ public class RoilingTerrain extends CardImpl {
super(ownerId, 88, "Roiling Terrain", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{2}{R}{R}");
this.expansionSetCode = "WWK";
-
// Destroy target land, then Roiling Terrain deals damage to that land's controller equal to the number of land cards in that player's graveyard.
this.getSpellAbility().addEffect(new RoilingTerrainEffect());
this.getSpellAbility().addTarget(new TargetLandPermanent());
@@ -69,12 +66,6 @@ public class RoilingTerrain extends CardImpl {
}
class RoilingTerrainEffect extends OneShotEffect {
-
- private static final FilterCard filter = new FilterCard("lands in graveyard");
-
- static {
- filter.add(new CardTypePredicate(CardType.LAND));
- }
public RoilingTerrainEffect() {
super(Outcome.Sacrifice);
@@ -92,14 +83,16 @@ class RoilingTerrainEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- Permanent targetedLand = game.getPermanent(source.getFirstTarget());
+ Permanent targetedLand = game.getPermanent(getTargetPointer().getFirst(game, source));
if (targetedLand != null) {
- Player controller = game.getPlayer(targetedLand.getControllerId());
- targetedLand.destroy(id, game, true);
- int landsInGraveyard = controller.getGraveyard().count(filter, game);
- controller.damage(landsInGraveyard, id, game, false, true);
+ targetedLand.destroy(source.getSourceId(), game, true);
+ Player targetController = game.getPlayer(targetedLand.getControllerId());
+ if (targetController != null) {
+ int landsInGraveyard = targetController.getGraveyard().count(new FilterLandCard(), game);
+ targetController.damage(landsInGraveyard, source.getSourceId(), game, false, true);
+ }
return true;
}
return false;
}
-}
\ No newline at end of file
+}
diff --git a/Mage.Sets/src/mage/sets/worldwake/SearingBlaze.java b/Mage.Sets/src/mage/sets/worldwake/SearingBlaze.java
index 2cccea80098..dd13eb7b80d 100644
--- a/Mage.Sets/src/mage/sets/worldwake/SearingBlaze.java
+++ b/Mage.Sets/src/mage/sets/worldwake/SearingBlaze.java
@@ -1,16 +1,16 @@
/*
* 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
@@ -20,12 +20,11 @@
* 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.sets.worldwake;
import java.util.HashSet;
@@ -45,7 +44,6 @@ import mage.game.stack.StackObject;
import mage.players.Player;
import mage.target.TargetPermanent;
import mage.target.TargetPlayer;
-import mage.watchers.Watcher;
import mage.watchers.common.LandfallWatcher;
/**
@@ -140,10 +138,10 @@ class SearingBlazeTarget extends TargetPermanent {
Set possibleTargets = new HashSet<>();
MageObject object = game.getObject(sourceId);
if (object instanceof StackObject) {
- UUID playerId = ((StackObject)object).getStackAbility().getFirstTarget();
+ UUID playerId = ((StackObject) object).getStackAbility().getFirstTarget();
for (UUID targetId : availablePossibleTargets) {
Permanent permanent = game.getPermanent(targetId);
- if(permanent != null && permanent.getControllerId().equals(playerId)){
+ if (permanent != null && permanent.getControllerId().equals(playerId)) {
possibleTargets.add(targetId);
}
}
@@ -155,4 +153,4 @@ class SearingBlazeTarget extends TargetPermanent {
public SearingBlazeTarget copy() {
return new SearingBlazeTarget(this);
}
-}
\ No newline at end of file
+}
diff --git a/Mage.Sets/src/mage/sets/worldwake/Terastodon.java b/Mage.Sets/src/mage/sets/worldwake/Terastodon.java
index 3192537315c..9999b33da28 100644
--- a/Mage.Sets/src/mage/sets/worldwake/Terastodon.java
+++ b/Mage.Sets/src/mage/sets/worldwake/Terastodon.java
@@ -28,15 +28,15 @@
package mage.sets.worldwake;
import java.util.UUID;
-import mage.constants.CardType;
-import mage.constants.Outcome;
-import mage.constants.Rarity;
-import mage.constants.Zone;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
import mage.filter.FilterPermanent;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.CardTypePredicate;
@@ -68,7 +68,7 @@ public class Terastodon extends CardImpl {
// When Terastodon enters the battlefield, you may destroy up to three target noncreature permanents. For each permanent put into a graveyard this way, its controller puts a 3/3 green Elephant creature token onto the battlefield.
Ability ability = new EntersBattlefieldTriggeredAbility(new TerastodonEffect(), true);
- ability.addTarget(new TargetPermanent(0, 3, filter, true));
+ ability.addTarget(new TargetPermanent(0, 3, filter, false));
this.addAbility(ability);
}
diff --git a/Mage.Sets/src/mage/sets/zendikar/BalaGedThief.java b/Mage.Sets/src/mage/sets/zendikar/BalaGedThief.java
index 36129e4800a..eb1ad19cc5c 100644
--- a/Mage.Sets/src/mage/sets/zendikar/BalaGedThief.java
+++ b/Mage.Sets/src/mage/sets/zendikar/BalaGedThief.java
@@ -1,156 +1,146 @@
-/*
- * 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.sets.zendikar;
-
-import java.util.List;
-import java.util.UUID;
-
-import mage.constants.CardType;
-import mage.constants.Rarity;
-import mage.MageInt;
-import mage.abilities.Ability;
-import mage.abilities.common.EntersBattlefieldAllTriggeredAbility;
-import mage.abilities.effects.OneShotEffect;
-import mage.cards.Card;
-import mage.cards.CardImpl;
-import mage.cards.Cards;
-import mage.cards.CardsImpl;
-import mage.constants.Outcome;
-import mage.constants.Zone;
-import mage.filter.FilterCard;
-import mage.filter.FilterPermanent;
-import mage.filter.common.FilterControlledPermanent;
-import mage.filter.predicate.Predicates;
-import mage.filter.predicate.mageobject.CardIdPredicate;
-import mage.filter.predicate.mageobject.SubtypePredicate;
-import mage.game.Game;
-import mage.players.Player;
-import mage.target.TargetCard;
-import mage.target.TargetPlayer;
-
-/**
- *
- * @author jeffwadsworth
- */
-public class BalaGedThief extends CardImpl {
-
- public BalaGedThief(UUID ownerId) {
- super(ownerId, 79, "Bala Ged Thief", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{B}");
- this.expansionSetCode = "ZEN";
- this.subtype.add("Human");
- this.subtype.add("Rogue");
- this.subtype.add("Ally");
-
- this.power = new MageInt(2);
- this.toughness = new MageInt(2);
-
- FilterPermanent filter = new FilterPermanent("Bala Ged Thief or another Ally");
- filter.add(Predicates.or(
- new CardIdPredicate(this.getId()),
- new SubtypePredicate("Ally")));
-
- // Whenever Bala Ged Thief or another Ally enters the battlefield under your control, target player reveals a number of cards from his or her hand equal to the number of Allies you control. You choose one of them. That player discards that card.
- Ability ability = new EntersBattlefieldAllTriggeredAbility(Zone.BATTLEFIELD, new BalaGedThiefEffect(), filter, false);
- TargetPlayer target = new TargetPlayer();
- ability.addTarget(target);
- this.addAbility(ability);
- }
-
- public BalaGedThief(final BalaGedThief card) {
- super(card);
- }
-
- @Override
- public BalaGedThief copy() {
- return new BalaGedThief(this);
- }
-}
-
-class BalaGedThiefEffect extends OneShotEffect {
-
- public BalaGedThiefEffect() {
- super(Outcome.Discard);
- this.staticText = "target player reveals a number of cards from his or her hand equal to the number of Allies you control. You choose one of them. That player discards that card";
- }
-
- public BalaGedThiefEffect(final BalaGedThiefEffect effect) {
- super(effect);
- }
-
- @Override
- public BalaGedThiefEffect copy() {
- return new BalaGedThiefEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Player targetPlayer = game.getPlayer(source.getFirstTarget());
-
- if (targetPlayer == null) {
- return false;
- }
-
- Player you = game.getPlayer(source.getControllerId());
-
- FilterControlledPermanent filter = new FilterControlledPermanent();
- filter.add(new SubtypePredicate("Ally"));
-
- int numberOfAllies = game.getBattlefield().countAll(filter, you.getId(), game);
-
- Cards cardsInHand = new CardsImpl(Zone.PICK);
- cardsInHand.addAll(targetPlayer.getHand());
-
- int count = Math.min(cardsInHand.size(), numberOfAllies);
-
- TargetCard target = new TargetCard(count, Zone.PICK, new FilterCard());
- Cards revealedCards = new CardsImpl();
-
- if (targetPlayer.choose(Outcome.DrawCard, cardsInHand, target, game)) {
- List targets = target.getTargets();
- for (UUID targetId : targets) {
- Card card = game.getCard(targetId);
- if (card != null) {
- revealedCards.add(card);
- }
- }
- }
-
- TargetCard targetInHand = new TargetCard(Zone.PICK, new FilterCard("card to discard"));
-
- if (!revealedCards.isEmpty()) {
- targetPlayer.revealCards("Bala Ged Thief", revealedCards, game);
- you.choose(Outcome.Neutral, revealedCards, targetInHand, game);
- Card card = revealedCards.get(targetInHand.getFirstTarget(), game);
- if (card != null) {
- targetPlayer.discard(card, source, game);
- game.informPlayers(new StringBuilder("Bala Ged Thief: ").append(targetPlayer.getLogName()).append(" discarded ").append(card.getName()).toString());
- }
- }
- return true;
- }
-}
+/*
+ * 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.sets.zendikar;
+
+import java.util.List;
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.AllyEntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.OneShotEffect;
+import mage.cards.Card;
+import mage.cards.CardImpl;
+import mage.cards.Cards;
+import mage.cards.CardsImpl;
+import mage.constants.CardType;
+import mage.constants.Outcome;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.FilterCard;
+import mage.filter.common.FilterControlledPermanent;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+import mage.game.Game;
+import mage.players.Player;
+import mage.target.TargetCard;
+import mage.target.TargetPlayer;
+
+/**
+ *
+ * @author jeffwadsworth
+ */
+public class BalaGedThief extends CardImpl {
+
+ public BalaGedThief(UUID ownerId) {
+ super(ownerId, 79, "Bala Ged Thief", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{B}");
+ this.expansionSetCode = "ZEN";
+ this.subtype.add("Human");
+ this.subtype.add("Rogue");
+ this.subtype.add("Ally");
+
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(2);
+
+ // Whenever Bala Ged Thief or another Ally enters the battlefield under your control, target player reveals a number of cards from his or her hand equal to the number of Allies you control. You choose one of them. That player discards that card.
+ Ability ability = new AllyEntersBattlefieldTriggeredAbility(new BalaGedThiefEffect(), false);
+ ability.addTarget(new TargetPlayer());
+ this.addAbility(ability);
+ }
+
+ public BalaGedThief(final BalaGedThief card) {
+ super(card);
+ }
+
+ @Override
+ public BalaGedThief copy() {
+ return new BalaGedThief(this);
+ }
+}
+
+class BalaGedThiefEffect extends OneShotEffect {
+
+ public BalaGedThiefEffect() {
+ super(Outcome.Discard);
+ this.staticText = "target player reveals a number of cards from his or her hand equal to the number of Allies you control. You choose one of them. That player discards that card";
+ }
+
+ public BalaGedThiefEffect(final BalaGedThiefEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public BalaGedThiefEffect copy() {
+ return new BalaGedThiefEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player targetPlayer = game.getPlayer(source.getFirstTarget());
+
+ if (targetPlayer == null) {
+ return false;
+ }
+
+ Player you = game.getPlayer(source.getControllerId());
+
+ FilterControlledPermanent filter = new FilterControlledPermanent();
+ filter.add(new SubtypePredicate("Ally"));
+
+ int numberOfAllies = game.getBattlefield().countAll(filter, you.getId(), game);
+
+ Cards cardsInHand = new CardsImpl(Zone.PICK);
+ cardsInHand.addAll(targetPlayer.getHand());
+
+ int count = Math.min(cardsInHand.size(), numberOfAllies);
+
+ TargetCard target = new TargetCard(count, Zone.PICK, new FilterCard());
+ Cards revealedCards = new CardsImpl();
+
+ if (targetPlayer.choose(Outcome.DrawCard, cardsInHand, target, game)) {
+ List targets = target.getTargets();
+ for (UUID targetId : targets) {
+ Card card = game.getCard(targetId);
+ if (card != null) {
+ revealedCards.add(card);
+ }
+ }
+ }
+
+ TargetCard targetInHand = new TargetCard(Zone.PICK, new FilterCard("card to discard"));
+
+ if (!revealedCards.isEmpty()) {
+ targetPlayer.revealCards("Bala Ged Thief", revealedCards, game);
+ you.choose(Outcome.Neutral, revealedCards, targetInHand, game);
+ Card card = revealedCards.get(targetInHand.getFirstTarget(), game);
+ if (card != null) {
+ targetPlayer.discard(card, source, game);
+ game.informPlayers(new StringBuilder("Bala Ged Thief: ").append(targetPlayer.getLogName()).append(" discarded ").append(card.getName()).toString());
+ }
+ }
+ return true;
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/zendikar/HighlandBerserker.java b/Mage.Sets/src/mage/sets/zendikar/HighlandBerserker.java
index 3ed316b0b69..8e911bc145d 100644
--- a/Mage.Sets/src/mage/sets/zendikar/HighlandBerserker.java
+++ b/Mage.Sets/src/mage/sets/zendikar/HighlandBerserker.java
@@ -1,79 +1,82 @@
-/*
- * 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.sets.zendikar;
-
-import java.util.UUID;
-
-import mage.constants.CardType;
-import mage.constants.Duration;
-import mage.constants.Rarity;
-import mage.MageInt;
-import mage.abilities.common.AllyEntersBattlefieldTriggeredAbility;
-import mage.abilities.effects.common.continuous.GainAbilityAllEffect;
-import mage.abilities.keyword.FirstStrikeAbility;
-import mage.cards.CardImpl;
-import mage.constants.TargetController;
-import mage.filter.common.FilterCreaturePermanent;
-import mage.filter.predicate.mageobject.SubtypePredicate;
-import mage.filter.predicate.permanent.ControllerPredicate;
-
-/**
- *
- * @author North
- */
-public class HighlandBerserker extends CardImpl {
-
- private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Ally creatures you control");
-
- static {
- filter.add(new SubtypePredicate("Ally"));
- filter.add(new ControllerPredicate(TargetController.YOU));
- }
-
- public HighlandBerserker(UUID ownerId) {
- super(ownerId, 132, "Highland Berserker", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{R}");
- this.expansionSetCode = "ZEN";
- this.subtype.add("Human");
- this.subtype.add("Berserker");
- this.subtype.add("Ally");
-
- this.power = new MageInt(2);
- this.toughness = new MageInt(1);
-
- this.addAbility(new AllyEntersBattlefieldTriggeredAbility(new GainAbilityAllEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn, filter), true));
- }
-
- public HighlandBerserker(final HighlandBerserker card) {
- super(card);
- }
-
- @Override
- public HighlandBerserker copy() {
- return new HighlandBerserker(this);
- }
-}
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.sets.zendikar;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.common.AllyEntersBattlefieldTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.continuous.GainAbilityAllEffect;
+import mage.abilities.keyword.FirstStrikeAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.TargetController;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.SubtypePredicate;
+import mage.filter.predicate.permanent.ControllerPredicate;
+
+/**
+ *
+ * @author North
+ */
+public class HighlandBerserker extends CardImpl {
+
+ private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Ally creatures you control");
+
+ static {
+ filter.add(new SubtypePredicate("Ally"));
+ filter.add(new ControllerPredicate(TargetController.YOU));
+ }
+
+ public HighlandBerserker(UUID ownerId) {
+ super(ownerId, 132, "Highland Berserker", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{1}{R}");
+ this.expansionSetCode = "ZEN";
+ this.subtype.add("Human");
+ this.subtype.add("Berserker");
+ this.subtype.add("Ally");
+
+ this.power = new MageInt(2);
+ this.toughness = new MageInt(1);
+
+ // Whenever Highland Berserker or another Ally enters the battlefield under your control, you may have Ally creatures you control gain first strike until end of turn.
+ Effect effect = new GainAbilityAllEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn, filter);
+ effect.setText("you may have Ally creatures you control gain first strike until end of turn");
+ this.addAbility(new AllyEntersBattlefieldTriggeredAbility(effect, true));
+ }
+
+ public HighlandBerserker(final HighlandBerserker card) {
+ super(card);
+ }
+
+ @Override
+ public HighlandBerserker copy() {
+ return new HighlandBerserker(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/zendikar/RelicCrush.java b/Mage.Sets/src/mage/sets/zendikar/RelicCrush.java
index 150a3c4c73d..4f306bf163a 100644
--- a/Mage.Sets/src/mage/sets/zendikar/RelicCrush.java
+++ b/Mage.Sets/src/mage/sets/zendikar/RelicCrush.java
@@ -29,15 +29,12 @@ package mage.sets.zendikar;
import java.util.UUID;
import mage.constants.CardType;
-import mage.constants.Outcome;
import mage.constants.Rarity;
-import mage.abilities.Ability;
-import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.DestroyTargetEffect;
import mage.cards.CardImpl;
import mage.filter.FilterPermanent;
import mage.filter.common.FilterArtifactOrEnchantmentPermanent;
-import mage.game.Game;
-import mage.game.permanent.Permanent;
import mage.target.TargetPermanent;
/**
@@ -45,14 +42,16 @@ import mage.target.TargetPermanent;
* @author jeffwadsworth
*/
public class RelicCrush extends CardImpl {
-
+
public RelicCrush(UUID ownerId) {
super(ownerId, 179, "Relic Crush", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{4}{G}");
this.expansionSetCode = "ZEN";
// Destroy target artifact or enchantment and up to one other target artifact or enchantment.
FilterPermanent filter = new FilterArtifactOrEnchantmentPermanent();
- this.getSpellAbility().addEffect(new RelicCrushEffect());
+ Effect effect = new DestroyTargetEffect(false, true);
+ effect.setText("Destroy target artifact or enchantment and up to one other target artifact or enchantment");
+ this.getSpellAbility().addEffect(effect);
this.getSpellAbility().addTarget(new TargetPermanent(filter));
this.getSpellAbility().addTarget(new TargetPermanent(0, 1, filter, false));
}
@@ -66,33 +65,3 @@ public class RelicCrush extends CardImpl {
return new RelicCrush(this);
}
}
-
-class RelicCrushEffect extends OneShotEffect {
-
- public RelicCrushEffect() {
- super(Outcome.DestroyPermanent);
- this.staticText = "Destroy target artifact or enchantment and up to one other target artifact or enchantment";
- }
-
- public RelicCrushEffect(final RelicCrushEffect effect) {
- super(effect);
- }
-
- @Override
- public RelicCrushEffect copy() {
- return new RelicCrushEffect(this);
- }
-
- @Override
- public boolean apply(Game game, Ability source) {
- Permanent firstTarget = game.getPermanent(source.getFirstTarget());
- Permanent secondTarget = game.getPermanent(source.getTargets().get(1).getFirstTarget());
- if (firstTarget != null) {
- firstTarget.destroy(id, game, false);
- }
- if (secondTarget != null) {
- return secondTarget.destroy(id, game, false);
- }
- return true;
- }
-}
diff --git a/Mage.Sets/src/mage/sets/zendikar/ValakutTheMoltenPinnacle.java b/Mage.Sets/src/mage/sets/zendikar/ValakutTheMoltenPinnacle.java
index a689e538717..14f9ac96dcb 100644
--- a/Mage.Sets/src/mage/sets/zendikar/ValakutTheMoltenPinnacle.java
+++ b/Mage.Sets/src/mage/sets/zendikar/ValakutTheMoltenPinnacle.java
@@ -1,16 +1,16 @@
/*
* 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
@@ -20,7 +20,7 @@
* 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.
@@ -106,7 +106,7 @@ class ValakutTheMoltenPinnacleTriggeredAbility extends TriggeredAbilityImpl {
@Override
public boolean checkTrigger(GameEvent event, Game game) {
Permanent permanent = game.getPermanent(event.getTargetId());
- if (permanent.getCardType().contains(CardType.LAND) && permanent.getControllerId().equals(this.getControllerId())) {
+ if (permanent != null && permanent.getCardType().contains(CardType.LAND) && permanent.getControllerId().equals(this.getControllerId())) {
if (permanent.hasSubtype("Mountain")) {
return true;
}
diff --git a/Mage.Sets/src/mage/sets/zendikarvseldrazi/DominatorDrone.java b/Mage.Sets/src/mage/sets/zendikarvseldrazi/DominatorDrone.java
new file mode 100644
index 00000000000..99555127b42
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/zendikarvseldrazi/DominatorDrone.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.zendikarvseldrazi;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class DominatorDrone extends mage.sets.battleforzendikar.DominatorDrone {
+
+ public DominatorDrone(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 51;
+ this.expansionSetCode = "DDP";
+ }
+
+ public DominatorDrone(final DominatorDrone card) {
+ super(card);
+ }
+
+ @Override
+ public DominatorDrone copy() {
+ return new DominatorDrone(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/zendikarvseldrazi/ForerunnerOfSlaughter.java b/Mage.Sets/src/mage/sets/zendikarvseldrazi/ForerunnerOfSlaughter.java
new file mode 100644
index 00000000000..4a411beb283
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/zendikarvseldrazi/ForerunnerOfSlaughter.java
@@ -0,0 +1,84 @@
+/*
+ * 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.sets.zendikarvseldrazi;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.common.SimpleActivatedAbility;
+import mage.abilities.costs.mana.GenericManaCost;
+import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
+import mage.abilities.keyword.DevoidAbility;
+import mage.abilities.keyword.HasteAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Rarity;
+import mage.constants.Zone;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.mageobject.ColorlessPredicate;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class ForerunnerOfSlaughter extends CardImpl {
+
+ private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("colorless creature");
+
+ static {
+ filter.add(new ColorlessPredicate());
+ }
+
+ public ForerunnerOfSlaughter(UUID ownerId) {
+ super(ownerId, 64, "Forerunner of Slaughter", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{B}{R}");
+ this.expansionSetCode = "DDP";
+ this.subtype.add("Eldrazi");
+ this.subtype.add("Drone");
+ this.power = new MageInt(3);
+ this.toughness = new MageInt(2);
+
+ // Devoid (This card has no color.)
+ this.addAbility(new DevoidAbility(this.color));
+
+ // {1}: Target colorless creature gains haste until end of turn.
+ Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.EndOfTurn), new GenericManaCost(1));
+ ability.addTarget(new TargetCreaturePermanent(filter));
+ this.addAbility(ability);
+ }
+
+ public ForerunnerOfSlaughter(final ForerunnerOfSlaughter card) {
+ super(card);
+ }
+
+ @Override
+ public ForerunnerOfSlaughter copy() {
+ return new ForerunnerOfSlaughter(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/zendikarvseldrazi/OblivionSower.java b/Mage.Sets/src/mage/sets/zendikarvseldrazi/OblivionSower.java
new file mode 100644
index 00000000000..875ff61ef2e
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/zendikarvseldrazi/OblivionSower.java
@@ -0,0 +1,52 @@
+/*
+ * 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.sets.zendikarvseldrazi;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class OblivionSower extends mage.sets.battleforzendikar.OblivionSower {
+
+ public OblivionSower(UUID ownerId) {
+ super(ownerId);
+ this.cardNumber = 41;
+ this.expansionSetCode = "DDP";
+ }
+
+ public OblivionSower(final OblivionSower card) {
+ super(card);
+ }
+
+ @Override
+ public OblivionSower copy() {
+ return new OblivionSower(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/zendikarvseldrazi/SheerDrop.java b/Mage.Sets/src/mage/sets/zendikarvseldrazi/SheerDrop.java
new file mode 100644
index 00000000000..69decb3a8de
--- /dev/null
+++ b/Mage.Sets/src/mage/sets/zendikarvseldrazi/SheerDrop.java
@@ -0,0 +1,72 @@
+/*
+ * 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.sets.zendikarvseldrazi;
+
+import java.util.UUID;
+import mage.abilities.effects.common.DestroyTargetEffect;
+import mage.abilities.keyword.AwakenAbility;
+import mage.cards.CardImpl;
+import mage.constants.CardType;
+import mage.constants.Rarity;
+import mage.filter.common.FilterCreaturePermanent;
+import mage.filter.predicate.permanent.TappedPredicate;
+import mage.target.common.TargetCreaturePermanent;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class SheerDrop extends CardImpl {
+
+ private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("tapped creature");
+
+ static {
+ filter.add(new TappedPredicate());
+ }
+
+ public SheerDrop(UUID ownerId) {
+ super(ownerId, 9, "Sheer Drop", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{2}{W}");
+ this.expansionSetCode = "DDP";
+
+ // Destroy target tapped creature.
+ this.getSpellAbility().addEffect(new DestroyTargetEffect());
+ this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter));
+
+ // Awaken 3-{5}{W} (If you cast this spell for {5}{W}, also put three +1/+1 counters on target land you control and it becomes a 0/0 Elemental creature with haste. It's still a land.)
+ this.addAbility(new AwakenAbility(this, 3, "{5}{W}"));
+ }
+
+ public SheerDrop(final SheerDrop card) {
+ super(card);
+ }
+
+ @Override
+ public SheerDrop copy() {
+ return new SheerDrop(this);
+ }
+}
diff --git a/Mage.Stats/pom.xml b/Mage.Stats/pom.xml
index 91da9f71b06..e163c6b55fc 100644
--- a/Mage.Stats/pom.xml
+++ b/Mage.Stats/pom.xml
@@ -6,7 +6,7 @@
org.mage
mage-root
- 1.4.3
+ 1.4.4
org.mage
diff --git a/Mage.Tests/CommanderAnafenza_WBG.dck b/Mage.Tests/CommanderAnafenza_WBG.dck
new file mode 100644
index 00000000000..0c8db1eb734
--- /dev/null
+++ b/Mage.Tests/CommanderAnafenza_WBG.dck
@@ -0,0 +1,88 @@
+1 [RTR:71] Necropolis Regent
+1 [FUT:171] Llanowar Reborn
+1 [RAV:158] Doubling Season
+1 [RAV:33] Twilight Drover
+1 [RAV:278] Golgari Rot Farm
+1 [8ED:247] Fecundity
+1 [M11:221] Whispersilk Cloak
+1 [6ED:274] Ashnod's Altar
+1 [ZEN:182] Scute Mob
+1 [RTR:152] Corpsejack Menace
+1 [ALA:140] Mycoloth
+1 [RTR:150] Collective Blessing
+1 [RTR:194] Selesnya Charm
+1 [M13:170] Farseek
+1 [BNG:148] Karametra, God of Harvests
+7 [BFZ:270] Forest
+1 [FUT:138] Sprout Swarm
+1 [DKA:76] Tragic Slip
+1 [DGM:149] Golgari Guildgate
+1 [GTC:123] Gyre Sage
+1 [DGM:93] Putrefy
+1 [GTC:242] Godless Shrine
+1 [AVR:10] Cathars' Crusade
+1 [AVR:171] Champion of Lambholt
+1 [M14:1] Ajani, Caller of the Pride
+1 [THS:153] Bow of Nylea
+1 [INV:233] Aura Shards
+1 [RTR:63] Desecration Demon
+1 [MOR:72] Oona's Blackguard
+1 [KTK:215] Abzan Banner
+1 [KTK:79] Mer-Ek Nightblade
+1 [KTK:179] Ivorytusk Fortress
+1 [M15:177] Hornet Nest
+1 [DGM:153] Orzhov Guildgate
+1 [KTK:133] Hardened Scales
+1 [KTK:210] Utter End
+1 [DGM:155] Selesnya Guildgate
+1 [RTR:176] Korozda Guildmage
+1 [VMA:255] Magister of Worth
+1 [ISD:199] Parallel Lives
+4 [BFZ:260] Swamp
+1 [M12:190] Rampant Growth
+1 [KTK:85] Retribution of the Ancients
+1 [DGM:63] Deadbridge Chant
+1 [CHK:239] Sakura-Tribe Elder
+1 [ISD:239] Gavony Township
+1 [DGM:114] Voice of Resurgence
+1 [VMA:250] Deathreap Ritual
+1 [CHK:225] Kodama's Reach
+1 [M13:229] Sunpetal Grove
+1 [M13:227] Reliquary Tower
+1 [SCG:25] Wing Shards
+1 [KTK:1] Abzan Battle Priest
+1 [M11:120] Viscera Seer
+1 [THS:227] Temple of Silence
+1 [RTR:174] Jarad, Golgari Lich Lord
+1 [RAV:251] Privileged Position
+1 [KTK:3] Ainok Bond-Kin
+1 [NPH:73] Sheoldred, Whispering One
+1 [KTK:2] Abzan Falconer
+1 [GTC:182] Obzedat, Ghost Council
+1 [KTK:241] Sandsteppe Citadel
+1 [RTR:121] Death's Presence
+4 [BFZ:250] Plains
+1 [KTK:161] Abzan Charm
+1 [ISD:242] Isolated Chapel
+1 [RTR:248] Temple Garden
+1 [KTK:160] Abzan Ascendancy
+1 [JOU:65] Dictate of Erebos
+1 [TMP:36] Living Death
+1 [M11:11] Condemn
+1 [ORI:246] Evolving Wilds
+1 [RAV:218] Phytohydra
+1 [ISD:249] Woodland Cemetery
+1 [M15:93] Cruel Sadist
+1 [CSP:130] Juniper Order Ranger
+1 [WWK:132] Bojuka Bog
+1 [FUT:169] Dakmor Salvage
+1 [CMD:200] Ghave, Guru of Spores
+1 [DIS:95] Sprouting Phytohydra
+1 [RAV:281] Selesnya Sanctuary
+1 [KTK:156] Tuskguard Captain
+1 [DKA:156] Grim Backwoods
+1 [GPT:122] Mortify
+1 [GPT:161] Orzhov Basilica
+1 [C13:281] Command Tower
+1 [RAV:207] Glare of Subdual
+SB: 1 [KTK:163] Anafenza, the Foremost
diff --git a/Mage.Tests/pom.xml b/Mage.Tests/pom.xml
index 94b1da2ba9d..d886daccf25 100644
--- a/Mage.Tests/pom.xml
+++ b/Mage.Tests/pom.xml
@@ -6,7 +6,7 @@
org.mage
mage-root
- 1.4.3
+ 1.4.4
mage-tests
diff --git a/Mage.Tests/src/test/java/org/mage/test/AI/basic/CastCreaturesTest.java b/Mage.Tests/src/test/java/org/mage/test/AI/basic/CastCreaturesTest.java
index d14393676f2..7ec428ccede 100644
--- a/Mage.Tests/src/test/java/org/mage/test/AI/basic/CastCreaturesTest.java
+++ b/Mage.Tests/src/test/java/org/mage/test/AI/basic/CastCreaturesTest.java
@@ -52,6 +52,10 @@ public class CastCreaturesTest extends CardTestPlayerBaseAI {
assertPermanentCount(playerA, "Silvercoat Lion", 1);
}
+ /**
+ * This test fails sometimes, probably because two plains are tapped for the
+ * first creature
+ */
@Test
public void testSimpleCast2() {
addCard(Zone.HAND, playerA, "Silvercoat Lion");
@@ -100,6 +104,35 @@ public class CastCreaturesTest extends CardTestPlayerBaseAI {
assertPermanentCount(playerA, "Blazing Specter", 1);
}
+ @Test
+ public void testSimpleCast5() {
+ addCard(Zone.HAND, playerA, "Plains", 2);
+ addCard(Zone.HAND, playerA, "Mountain", 1);
+ addCard(Zone.HAND, playerA, "Silvercoat Lion", 3);
+ addCard(Zone.HAND, playerA, "Soul Warden");
+
+ setStopAt(1, PhaseStep.BEGIN_COMBAT);
+ execute();
+
+ assertPermanentCount(playerA, "Plains", 1);
+ assertPermanentCount(playerA, "Soul Warden", 1);
+ }
+
+ @Test
+ public void testSimpleCast6() {
+ addCard(Zone.BATTLEFIELD, playerA, "Mountain", 1);
+ addCard(Zone.HAND, playerA, "Plains", 2);
+ addCard(Zone.HAND, playerA, "Mountain", 2);
+ addCard(Zone.HAND, playerA, "Silvercoat Lion", 1);
+ addCard(Zone.HAND, playerA, "Pillarfield Ox", 1);
+
+ setStopAt(1, PhaseStep.BEGIN_COMBAT);
+ execute();
+
+ assertPermanentCount(playerA, "Plains", 1);
+ assertPermanentCount(playerA, "Silvercoat Lion", 1);
+ }
+
@Test
public void testCast4Creature() {
addCard(Zone.LIBRARY, playerA, "Swamp", 1);
diff --git a/Mage.Tests/src/test/java/org/mage/test/AI/basic/TargetsAreChosenTest.java b/Mage.Tests/src/test/java/org/mage/test/AI/basic/TargetsAreChosenTest.java
index 31a037b721b..4859e3af03f 100644
--- a/Mage.Tests/src/test/java/org/mage/test/AI/basic/TargetsAreChosenTest.java
+++ b/Mage.Tests/src/test/java/org/mage/test/AI/basic/TargetsAreChosenTest.java
@@ -63,7 +63,7 @@ public class TargetsAreChosenTest extends CardTestPlayerBaseAI {
/**
* Check that the AI does not cast Rack and Ruin if it would destroy the
- * owly creature on the battlefield owned by the AI
+ * only creature on the battlefield owned by the AI
*/
@Test
public void testRackAndRuin2() {
@@ -196,7 +196,7 @@ public class TargetsAreChosenTest extends CardTestPlayerBaseAI {
}
/**
- * Test that AI counters creatire spell
+ * Test that AI counters creature spell
*/
@Test
@Ignore // counter spells don't seem to be cast by AI
@@ -222,4 +222,13 @@ public class TargetsAreChosenTest extends CardTestPlayerBaseAI {
}
+ /**
+ * Target selection from EntersTheBattlefield is not varied in the AI
+ * calculation, so value is only calculated for the one selected target set.
+ *
+ * E.g. If AI casts an Eyeblight Assassin and opponent has a 3/1 and a 2/2,
+ * the AI should target the 3/1.
+ *
+ * Add test to check such situations
+ */
}
diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/abilitywords/ConvergeTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/abilitywords/ConvergeTest.java
new file mode 100644
index 00000000000..d374c691c5e
--- /dev/null
+++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/abilitywords/ConvergeTest.java
@@ -0,0 +1,89 @@
+/*
+ * 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 org.mage.test.cards.abilities.abilitywords;
+
+import mage.constants.PhaseStep;
+import mage.constants.Zone;
+import org.junit.Test;
+import org.mage.test.serverside.base.CardTestPlayerBase;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class ConvergeTest extends CardTestPlayerBase {
+
+ /**
+ * Test with only red mana
+ */
+ @Test
+ public void testOnlyOneColor() {
+ // Converge — Radiant Flames deals X damage to each creature, where X is the number of colors of mana spent to cast Radiant Flames.
+ addCard(Zone.HAND, playerA, "Radiant Flames", 1);
+ addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3);
+ addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion", 1);
+ addCard(Zone.BATTLEFIELD, playerA, "Akroan Jailer", 1); // 1/1
+
+ addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1);
+ addCard(Zone.BATTLEFIELD, playerB, "Akroan Jailer", 1); // 1/1
+
+ castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Radiant Flames");
+
+ setStopAt(1, PhaseStep.BEGIN_COMBAT);
+ execute();
+
+ assertGraveyardCount(playerA, "Akroan Jailer", 1);
+ assertPermanentCount(playerA, "Silvercoat Lion", 1);
+ assertGraveyardCount(playerB, "Akroan Jailer", 1);
+ assertPermanentCount(playerB, "Silvercoat Lion", 1);
+ }
+
+ @Test
+ public void testWithTwoColors() {
+ // Converge — Radiant Flames deals X damage to each creature, where X is the number of colors of mana spent to cast Radiant Flames.
+ addCard(Zone.HAND, playerA, "Radiant Flames", 1);
+ addCard(Zone.BATTLEFIELD, playerA, "Mountain", 2);
+ addCard(Zone.BATTLEFIELD, playerA, "Forest", 1);
+ addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion", 1);
+ addCard(Zone.BATTLEFIELD, playerA, "Akroan Jailer", 1); // 1/1
+
+ addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1);
+ addCard(Zone.BATTLEFIELD, playerB, "Akroan Jailer", 1); // 1/1
+
+ castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Radiant Flames");
+
+ setStopAt(1, PhaseStep.BEGIN_COMBAT);
+ execute();
+
+ assertGraveyardCount(playerA, "Akroan Jailer", 1);
+ assertGraveyardCount(playerA, "Silvercoat Lion", 1);
+ assertGraveyardCount(playerB, "Akroan Jailer", 1);
+ assertGraveyardCount(playerB, "Silvercoat Lion", 1);
+ }
+
+}
diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/AwakenTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/AwakenTest.java
new file mode 100644
index 00000000000..e1692db1808
--- /dev/null
+++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/AwakenTest.java
@@ -0,0 +1,61 @@
+/*
+ * 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 org.mage.test.cards.abilities.keywords;
+
+import mage.constants.PhaseStep;
+import mage.constants.Zone;
+import org.junit.Test;
+import org.mage.test.serverside.base.CardTestPlayerBase;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class AwakenTest extends CardTestPlayerBase {
+
+ @Test
+ public void testCastWithAwaken() {
+ addCard(Zone.BATTLEFIELD, playerA, "Swamp", 6);
+ addCard(Zone.BATTLEFIELD, playerA, "Plains", 1);
+ // Destroy target creature or planeswalker.
+ // Awaken 4-{5}{B}{B}
+ addCard(Zone.HAND, playerA, "Ruinous Path", 1);
+
+ addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1);
+
+ castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Ruinous Path with awaken", "Silvercoat Lion");
+ addTarget(playerA, "Plains");
+
+ setStopAt(1, PhaseStep.BEGIN_COMBAT);
+ execute();
+
+ assertPowerToughness(playerA, "Plains", 4, 4);
+ assertGraveyardCount(playerB, "Silvercoat Lion", 1);
+ }
+
+}
diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/InfectTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/InfectTest.java
index 4b8729e65f1..d1f5ab38482 100644
--- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/InfectTest.java
+++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/InfectTest.java
@@ -37,21 +37,23 @@ import org.mage.test.serverside.base.CardTestPlayerBase;
*
* @author LevelX2
*/
-
public class InfectTest extends CardTestPlayerBase {
/**
-
- 702.89. Infect
- 702.89a Infect is a static ability.
- 702.89b Damage dealt to a player by a source with infect doesn’t cause that player to lose life. Rather, it causes the player to get that many poison counters. See rule 119.3.
- 702.89c Damage dealt to a creature by a source with infect isn’t marked on that creature. Rather, it causes that many -1/-1 counters to be put on that creature. See rule 119.3.
- 702.89d If a permanent leaves the battlefield before an effect causes it to deal damage, its last known information is used to determine whether it had infect.
- 702.89e The infect rules function no matter what zone an object with infect deals damage from.
- 702.89f Multiple instances of infect on the same object are redundant.
-
+ *
+ * 702.89. Infect 702.89a Infect is a static ability. 702.89b Damage dealt
+ * to a player by a source with infect doesn’t cause that player to lose
+ * life. Rather, it causes the player to get that many poison counters. See
+ * rule 119.3. 702.89c Damage dealt to a creature by a source with infect
+ * isn’t marked on that creature. Rather, it causes that many -1/-1 counters
+ * to be put on that creature. See rule 119.3. 702.89d If a permanent leaves
+ * the battlefield before an effect causes it to deal damage, its last known
+ * information is used to determine whether it had infect. 702.89e The
+ * infect rules function no matter what zone an object with infect deals
+ * damage from. 702.89f Multiple instances of infect on the same object are
+ * redundant.
+ *
*/
-
@Test
public void testNormalUse() {
addCard(Zone.BATTLEFIELD, playerB, "Tine Shrike"); // 2/1 Infect
@@ -64,16 +66,15 @@ public class InfectTest extends CardTestPlayerBase {
assertCounterCount(playerA, CounterType.POISON, 2);
assertLife(playerA, 20);
- assertLife(playerB, 20);
-
+ assertLife(playerB, 20);
+
}
-
@Test
public void testLoseInfectUse() {
- // Creatures your opponents control lose infect.
- addCard(Zone.BATTLEFIELD, playerA, "Melira, Sylvok Outcast");
-
+ // Creatures your opponents control lose infect.
+ addCard(Zone.BATTLEFIELD, playerA, "Melira, Sylvok Outcast");
+
addCard(Zone.BATTLEFIELD, playerB, "Tine Shrike"); // 2/1 Infect
attack(2, playerB, "Tine Shrike");
@@ -84,23 +85,29 @@ public class InfectTest extends CardTestPlayerBase {
assertCounterCount(playerA, CounterType.POISON, 0);
assertLife(playerA, 18);
- assertLife(playerB, 20);
-
- }
-
+ assertLife(playerB, 20);
+
+ }
+
/**
- * Inkmoth Nexus has no effect it he attacks becaus it has infect but there are no counters added
+ * Inkmoth Nexus has no effect it he attacks becaus it has infect but there
+ * are no counters added
* http://www.mtgsalvation.com/forums/magic-fundamentals/magic-rulings/magic-rulings-archives/296553-melira-sylvok-outcast-vs-inkmoth-nexus
*/
@Test
public void testInkmothNexusLoseInfect() {
- // Creatures your opponents control lose infect.
- addCard(Zone.BATTLEFIELD, playerA, "Melira, Sylvok Outcast");
-
- addCard(Zone.BATTLEFIELD, playerB, "Plains", 1);
- addCard(Zone.BATTLEFIELD, playerB, "Inkmoth Nexus");
+ // Creatures your opponents control lose infect.
+ // Creatures you control can't have -1/-1 counters placed on them.
+ addCard(Zone.BATTLEFIELD, playerA, "Melira, Sylvok Outcast");
+ // Put a -1/-1 counter on target creature. When that creature dies this turn, its controller gets a poison counter.
+ addCard(Zone.HAND, playerA, "Virulent Wound"); // Instant {B}
+ addCard(Zone.BATTLEFIELD, playerA, "Swamp", 1);
- // {1}: Inkmoth Nexus becomes a 1/1 Blinkmoth artifact creature with flying and infect until end of turn. It's still a land.
+ addCard(Zone.BATTLEFIELD, playerB, "Plains", 1);
+ addCard(Zone.BATTLEFIELD, playerB, "Inkmoth Nexus");
+
+ castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Virulent Wound", "Melira, Sylvok Outcast");
+ // {1}: Inkmoth Nexus becomes a 1/1 Blinkmoth artifact creature with flying and infect until end of turn. It's still a land.
// (It deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.)
activateAbility(2, PhaseStep.PRECOMBAT_MAIN, playerB, "{1}: {this} becomes");
attack(2, playerB, "Inkmoth Nexus");
@@ -108,13 +115,15 @@ public class InfectTest extends CardTestPlayerBase {
setStopAt(2, PhaseStep.POSTCOMBAT_MAIN);
execute();
+ assertGraveyardCount(playerA, "Virulent Wound", 1);
+ assertPowerToughness(playerA, "Melira, Sylvok Outcast", 2, 2);
assertTapped("Plains", true);
assertTapped("Inkmoth Nexus", true);
assertCounterCount(playerA, CounterType.POISON, 0);
assertLife(playerA, 20);
- assertLife(playerB, 20);
-
- }
-
+ assertLife(playerB, 20);
+
+ }
+
}
diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/ManifestTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/ManifestTest.java
index f980b8be196..7c63a8447f1 100644
--- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/ManifestTest.java
+++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/ManifestTest.java
@@ -27,7 +27,6 @@
*/
package org.mage.test.cards.abilities.keywords;
-
import mage.cards.Card;
import mage.constants.PhaseStep;
import mage.constants.Zone;
@@ -39,7 +38,6 @@ import org.mage.test.serverside.base.CardTestPlayerBase;
*
* @author LevelX2
*/
-
public class ManifestTest extends CardTestPlayerBase {
/**
@@ -73,7 +71,8 @@ public class ManifestTest extends CardTestPlayerBase {
}
/**
- * If Doomwake Giant gets manifested, it's Constellation trigger may not trigger
+ * If Doomwake Giant gets manifested, it's Constellation trigger may not
+ * trigger
*/
@Test
public void testETBTriggeredAbilities2() {
@@ -103,8 +102,10 @@ public class ManifestTest extends CardTestPlayerBase {
assertPermanentCount(playerB, "Silvercoat Lion", 1);
assertPowerToughness(playerB, "Silvercoat Lion", 2, 2);
}
+
/**
- * If Doomwake Giant gets manifested, it's Constellation trigger may not trigger
+ * If Doomwake Giant gets manifested, it's Constellation trigger may not
+ * trigger
*/
@Test
public void testETBTriggeredAbilities3() {
@@ -115,10 +116,10 @@ public class ManifestTest extends CardTestPlayerBase {
// Constellation - When Doomwake Giant or another enchantment enters the battlefield
// under your control, creatures your opponents control get -1/-1 until end of turn.
addCard(Zone.LIBRARY, playerA, "Doomwake Giant");
-
- addCard(Zone.BATTLEFIELD, playerB, "Pillarfield Ox");
+
+ addCard(Zone.BATTLEFIELD, playerB, "Pillarfield Ox");
addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion");
-
+
skipInitShuffling();
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Reality Shift", "Silvercoat Lion");
@@ -130,7 +131,7 @@ public class ManifestTest extends CardTestPlayerBase {
assertLife(playerA, 20);
assertLife(playerB, 20);
assertGraveyardCount(playerB, "Reality Shift", 1);
- assertExileCount("Silvercoat Lion" , 1);
+ assertExileCount("Silvercoat Lion", 1);
// a facedown creature is on the battlefield
assertPermanentCount(playerA, "", 1);
assertPowerToughness(playerA, "", 2, 2);
@@ -138,8 +139,10 @@ public class ManifestTest extends CardTestPlayerBase {
assertPermanentCount(playerB, "Pillarfield Ox", 1);
assertPowerToughness(playerB, "Pillarfield Ox", 2, 4);
}
+
/**
- * If Doomwake Giant gets manifested, it's Constellation trigger may not trigger
+ * If Doomwake Giant gets manifested, it's Constellation trigger may not
+ * trigger
*/
@Test
public void testNylea() {
@@ -150,7 +153,7 @@ public class ManifestTest extends CardTestPlayerBase {
// As long as your devotion to white is less than five, Nylea isn't a creature.
// (Each {G} in the mana costs of permanents you control counts towards your devotion to green.)
addCard(Zone.LIBRARY, playerA, "Nylea, God of the Hunt");
-
+
addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion");
skipInitShuffling();
@@ -164,17 +167,17 @@ public class ManifestTest extends CardTestPlayerBase {
assertLife(playerA, 20);
assertLife(playerB, 20);
assertGraveyardCount(playerB, "Reality Shift", 1);
- assertExileCount("Silvercoat Lion" , 1);
+ assertExileCount("Silvercoat Lion", 1);
// a facedown creature is on the battlefield
assertPermanentCount(playerA, "", 1);
assertPowerToughness(playerA, "", 2, 2);
}
-
+
/*
- Had a Foundry Street Denizen and another creature out.
- Opponent Reality Shift'ed the other creature, manifested card was a red creature. This pumped the foundry street denizen even though it shouldn't.
- */
+ Had a Foundry Street Denizen and another creature out.
+ Opponent Reality Shift'ed the other creature, manifested card was a red creature. This pumped the foundry street denizen even though it shouldn't.
+ */
@Test
public void testColorOfManifestedCardDoesNotCount() {
addCard(Zone.BATTLEFIELD, playerB, "Island", 2);
@@ -184,7 +187,7 @@ public class ManifestTest extends CardTestPlayerBase {
// Gore Swine {2}{R}
// 4/1
addCard(Zone.LIBRARY, playerA, "Gore Swine");
-
+
// Whenever another red creature enters the battlefield under your control, Foundry Street Denizen gets +1/+0 until end of turn.
addCard(Zone.BATTLEFIELD, playerA, "Foundry Street Denizen");
addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion");
@@ -200,16 +203,17 @@ public class ManifestTest extends CardTestPlayerBase {
assertLife(playerA, 20);
assertLife(playerB, 20);
assertGraveyardCount(playerB, "Reality Shift", 1);
- assertExileCount("Silvercoat Lion" , 1);
+ assertExileCount("Silvercoat Lion", 1);
// a facedown creature is on the battlefield
assertPermanentCount(playerA, "", 1);
assertPowerToughness(playerA, "", 2, 2);
assertPowerToughness(playerA, "Foundry Street Denizen", 1, 1);
- }
+ }
/*
- I casted a Silence the Believers on a manifested card. It moved to the exile zone face-down.
- */
+ I casted a Silence the Believers on a manifested card. It moved to the exile zone face-down.
+ */
+
@Test
public void testCardGetsExiledFaceUp() {
addCard(Zone.BATTLEFIELD, playerB, "Island", 2);
@@ -224,7 +228,7 @@ public class ManifestTest extends CardTestPlayerBase {
// Gore Swine {2}{R}
// 4/1
addCard(Zone.LIBRARY, playerA, "Gore Swine");
-
+
// Whenever another red creature enters the battlefield under your control, Foundry Street Denizen gets +1/+0 until end of turn.
addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion");
@@ -240,12 +244,12 @@ public class ManifestTest extends CardTestPlayerBase {
assertLife(playerA, 20);
assertLife(playerB, 20);
assertGraveyardCount(playerB, "Reality Shift", 1);
- assertExileCount("Silvercoat Lion" , 1);
- assertExileCount("Gore Swine" , 1);
+ assertExileCount("Silvercoat Lion", 1);
+ assertExileCount("Gore Swine", 1);
// no facedown creature is on the battlefield
assertPermanentCount(playerA, "", 0);
-
- for (Card card :currentGame.getExile().getAllCards(currentGame)){
+
+ for (Card card : currentGame.getExile().getAllCards(currentGame)) {
if (card.getName().equals("Gore Swine")) {
Assert.assertTrue("Gore Swine may not be face down in exile", !card.isFaceDown(currentGame));
}
@@ -255,7 +259,6 @@ public class ManifestTest extends CardTestPlayerBase {
// Qarsi High Priest went to manifest Illusory Gains,
// but it made me choose a target for gains, then enchanted the card to that creature.
-
@Test
public void testManifestAura() {
@@ -282,15 +285,13 @@ public class ManifestTest extends CardTestPlayerBase {
assertGraveyardCount(playerB, "Illusory Gains", 0);
assertGraveyardCount(playerB, "Silvercoat Lion", 1);
-
// a facedown creature is on the battlefield
assertPermanentCount(playerB, "", 1);
}
- // Check if a Megamorph card is manifested and truned by their megamorph ability
+ // Check if a Megamorph card is manifested and turned face up by their megamorph ability
// it gets the +1/+1 counter.
-
@Test
public void testManifestMegamorph() {
@@ -300,6 +301,8 @@ public class ManifestTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerB, "Qarsi High Priest", 1);
addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1);
+ // Reach (This creature can block creatures with flying.)
+ // Megamorph {5}{G}
addCard(Zone.LIBRARY, playerB, "Aerie Bowmasters", 1);
addCard(Zone.LIBRARY, playerB, "Mountain", 1);
@@ -324,10 +327,11 @@ public class ManifestTest extends CardTestPlayerBase {
assertPowerToughness(playerB, "Aerie Bowmasters", 4, 5); // 3/4 and the +1/+1 counter from Megamorph
}
-
+
/**
- * When a Forest came manifested into play my Courser of Kruphix gained me a life.
- *
+ * When a Forest came manifested into play my Courser of Kruphix gained me a
+ * life.
+ *
*/
@Test
public void testManifestForest() {
@@ -349,7 +353,6 @@ public class ManifestTest extends CardTestPlayerBase {
activateAbility(2, PhaseStep.PRECOMBAT_MAIN, playerB, "{1}{B},{T}, Sacrifice another creature");
addTarget(playerB, "Silvercoat Lion");
-
setStopAt(2, PhaseStep.END_TURN);
execute();
@@ -361,41 +364,40 @@ public class ManifestTest extends CardTestPlayerBase {
assertPermanentCount(playerB, "", 1);
- }
-
- /**
+ }
+
+ /**
* Whisperwood Elemental - Its sacrifice ability doesn't work..
- *
+ *
*/
@Test
public void testWhisperwoodElemental() {
- addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3);
+ addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3);
// Seismic Rupture deals 2 damage to each creature without flying.
addCard(Zone.HAND, playerA, "Seismic Rupture", 1);
-
+
// At the beginning of your end step, manifest the top card of your library.
// Sacrifice Whisperwood Elemental: Until end of turn, face-up, nontoken creatures you control gain "When this creature dies, manifest the top card of your library."
addCard(Zone.BATTLEFIELD, playerB, "Whisperwood Elemental", 1);
addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 2);
-
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Sacrifice");
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Seismic Rupture");
-
+
setStopAt(1, PhaseStep.END_TURN);
execute();
// no life gain
assertLife(playerA, 20);
assertLife(playerB, 20);
-
+
assertGraveyardCount(playerA, "Seismic Rupture", 1);
assertGraveyardCount(playerB, "Whisperwood Elemental", 1);
assertGraveyardCount(playerB, "Silvercoat Lion", 2);
assertPermanentCount(playerB, "", 2);
- }
+ }
}
diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/PersistTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/PersistTest.java
index a5c8ac00991..f7768675288 100644
--- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/PersistTest.java
+++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/PersistTest.java
@@ -198,4 +198,34 @@ public class PersistTest extends CardTestPlayerBase {
assertPermanentCount(playerA, "Glen Elendra Archmage", 1);
assertPowerToughness(playerA, "Glen Elendra Archmage", 1, 1);
}
+
+ @Test
+ public void testMeliraSylvokOutcast() {
+
+ // You can't get poison counters.
+ // Creatures you control can't have -1/-1 counters placed on them.
+ // Creatures your opponents control lose infect.
+ addCard(Zone.BATTLEFIELD, playerA, "Melira, Sylvok Outcast", 1); // 2/2
+ // When Murderous Redcap enters the battlefield, it deals damage equal to its power to target creature or player.
+ // Persist
+ addCard(Zone.HAND, playerA, "Murderous Redcap", 1); // 2/2
+ addCard(Zone.BATTLEFIELD, playerA, "Mountain", 4);
+
+ addCard(Zone.BATTLEFIELD, playerB, "Mountain", 1);
+ addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 2);
+ addCard(Zone.HAND, playerB, "Lightning Bolt", 1);
+
+ castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Murderous Redcap");
+ addTarget(playerA, "Silvercoat Lion");
+
+ castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerB, "Lightning Bolt", "Murderous Redcap");
+ addTarget(playerA, "Silvercoat Lion");
+
+ setStopAt(1, PhaseStep.END_TURN);
+ execute();
+
+ assertGraveyardCount(playerB, "Lightning Bolt", 1);
+ assertGraveyardCount(playerB, "Silvercoat Lion", 2);
+ assertPowerToughness(playerA, "Murderous Redcap", 2, 2); // Got no -1/-1 after returning because of Melira in play
+ }
}
diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/SoulbondKeywordTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/SoulbondKeywordTest.java
index 4a7dc293243..1770b99e8cd 100644
--- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/SoulbondKeywordTest.java
+++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/SoulbondKeywordTest.java
@@ -88,14 +88,18 @@ public class SoulbondKeywordTest extends CardTestPlayerBase {
}
/**
- * Tests Soulbond effect disabling whenever Soulbond creature changes its controller
+ * Tests Soulbond effect disabling whenever Soulbond creature changes its
+ * controller
*/
@Test
public void testChangeControllerForSoulbondCreature() {
addCard(Zone.BATTLEFIELD, playerA, "Elite Vanguard");
+ // Soulbond (You may pair this creature with another unpaired creature when either enters the battlefield. They remain paired for as long as you control both of them.)
+ // As long as Trusted Forcemage is paired with another creature, each of those creatures gets +1/+1.
addCard(Zone.HAND, playerA, "Trusted Forcemage");
addCard(Zone.BATTLEFIELD, playerA, "Forest", 3);
+ // Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. (It can attack and Tap this turn.)
addCard(Zone.HAND, playerB, "Act of Treason");
addCard(Zone.BATTLEFIELD, playerB, "Mountain", 3);
@@ -115,12 +119,15 @@ public class SoulbondKeywordTest extends CardTestPlayerBase {
}
/**
- * Tests Soulbond effect disabling when paired creture changes its controller
+ * Tests Soulbond effect disabling when paired creture changes its
+ * controller
*/
@Test
public void testChangeControllerForAnotherCreature() {
- addCard(Zone.BATTLEFIELD, playerA, "Elite Vanguard");
- addCard(Zone.HAND, playerA, "Trusted Forcemage");
+ addCard(Zone.BATTLEFIELD, playerA, "Elite Vanguard"); // 2,1
+ // Soulbond (You may pair this creature with another unpaired creature when either enters the battlefield. They remain paired for as long as you control both of them.)
+ // As long as Trusted Forcemage is paired with another creature, each of those creatures gets +1/+1.
+ addCard(Zone.HAND, playerA, "Trusted Forcemage"); // 2/2
addCard(Zone.BATTLEFIELD, playerA, "Forest", 3);
addCard(Zone.HAND, playerB, "Act of Treason");
@@ -141,8 +148,8 @@ public class SoulbondKeywordTest extends CardTestPlayerBase {
}
/**
- * Tests Soulbond effect disabling when Soulbond creature changes its controller and then returns back.
- * Effect should not be restored.
+ * Tests Soulbond effect disabling when Soulbond creature changes its
+ * controller and then returns back. Effect should not be restored.
*/
@Test
public void testChangeControllerAndGettingBack() {
@@ -166,7 +173,8 @@ public class SoulbondKeywordTest extends CardTestPlayerBase {
}
/**
- * Tests that stealing creature will allow to use Soulbond ability on controller's creature
+ * Tests that stealing creature will allow to use Soulbond ability on
+ * controller's creature
*/
@Test
public void testSoulbondWorksOnControllerSide() {
@@ -243,7 +251,8 @@ public class SoulbondKeywordTest extends CardTestPlayerBase {
}
/**
- * Tests that it is possible to animate land and pair it on next coming Soulbond creature
+ * Tests that it is possible to animate land and pair it on next coming
+ * Soulbond creature
*/
@Test
public void testPairOnAnimatedLand() {
@@ -263,7 +272,8 @@ public class SoulbondKeywordTest extends CardTestPlayerBase {
}
/**
- * Tests no effect whether land was animated after Soulbond creature has entered the battlefield
+ * Tests no effect whether land was animated after Soulbond creature has
+ * entered the battlefield
*/
@Test
public void testPairOnPostAnimatedLand() {
@@ -302,7 +312,8 @@ public class SoulbondKeywordTest extends CardTestPlayerBase {
}
/**
- * Tests that after loosing first pair it is possible to pair creature with another one
+ * Tests that after loosing first pair it is possible to pair creature with
+ * another one
*/
@Test
public void testRebondOnNextCreature() {
@@ -357,6 +368,8 @@ public class SoulbondKeywordTest extends CardTestPlayerBase {
public void testExileAndReturnBack() {
addCard(Zone.HAND, playerA, "Elite Vanguard");
addCard(Zone.HAND, playerA, "Cloudshift");
+ // Soulbond (You may pair this creature with another unpaired creature when either enters the battlefield. They remain paired for as long as you control both of them.)
+ // As long as Trusted Forcemage is paired with another creature, each of those creatures gets +1/+1.
addCard(Zone.BATTLEFIELD, playerA, "Trusted Forcemage");
addCard(Zone.BATTLEFIELD, playerA, "Plains", 2);
@@ -375,6 +388,6 @@ public class SoulbondKeywordTest extends CardTestPlayerBase {
Permanent trustedForcemange = getPermanent("Trusted Forcemage", playerA.getId());
Permanent eliteVanguard = getPermanent("Elite Vanguard", playerA.getId());
Assert.assertEquals(trustedForcemange.getPairedCard(), null);
- Assert.assertEquals(eliteVanguard.getPairedCard(),null);
+ Assert.assertEquals(eliteVanguard.getPairedCard(), null);
}
}
diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/SuspendTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/SuspendTest.java
index 16de1ce5615..98e3294b084 100644
--- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/SuspendTest.java
+++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/SuspendTest.java
@@ -27,6 +27,7 @@
*/
package org.mage.test.cards.abilities.keywords;
+import mage.abilities.keyword.HasteAbility;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import mage.counters.CounterType;
@@ -40,16 +41,16 @@ import org.mage.test.serverside.base.CardTestPlayerBase;
public class SuspendTest extends CardTestPlayerBase {
/**
- * Tests Epochrasite works (give suspend to a exiled card)
- * When Epochrasite dies, exile it with three time counters on it and it gains suspend.
+ * Tests Epochrasite works (give suspend to a exiled card) When Epochrasite
+ * dies, exile it with three time counters on it and it gains suspend.
*
*/
@Test
public void testEpochrasite() {
-
+
addCard(Zone.BATTLEFIELD, playerA, "Plains", 2);
- addCard(Zone.HAND, playerA, "Epochrasite",1);
- addCard(Zone.HAND, playerB, "Lightning Bolt",1);
+ addCard(Zone.HAND, playerA, "Epochrasite", 1);
+ addCard(Zone.HAND, playerB, "Lightning Bolt", 1);
addCard(Zone.BATTLEFIELD, playerB, "Mountain", 1);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Epochrasite");
@@ -61,11 +62,14 @@ public class SuspendTest extends CardTestPlayerBase {
assertGraveyardCount(playerB, "Lightning Bolt", 1);
assertPermanentCount(playerA, "Epochrasite", 1); // returned on turn 7 with 3 +1/+1 Counter
assertPowerToughness(playerA, "Epochrasite", 4, 4);
+ assertAbility(playerA, "Epochrasite", HasteAbility.getInstance(), true);
}
+
/**
- * Tests Jhoira of the Ghitu works (give suspend to a exiled card)
- * {2}, Exile a nonland card from your hand: Put four time counters on the exiled card. If it doesn't have suspend, it gains suspend.
+ * Tests Jhoira of the Ghitu works (give suspend to a exiled card) {2},
+ * Exile a nonland card from your hand: Put four time counters on the exiled
+ * card. If it doesn't have suspend, it gains suspend.
*
*/
@Test
@@ -73,7 +77,7 @@ public class SuspendTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 2);
- addCard(Zone.HAND, playerA, "Silvercoat Lion",1);
+ addCard(Zone.HAND, playerA, "Silvercoat Lion", 1);
addCard(Zone.BATTLEFIELD, playerA, "Jhoira of the Ghitu", 1);
activateAbility(3, PhaseStep.PRECOMBAT_MAIN, playerA, "{2},Exile a nonland card from your hand: Put four time counters on the exiled card. If it doesn't have suspend, it gains suspend (At the beginning of your upkeep, remove a time counter from that card. When the last is removed, cast it without paying its mana cost. If it's a creature, it has haste.).");
@@ -85,11 +89,12 @@ public class SuspendTest extends CardTestPlayerBase {
assertPermanentCount(playerA, "Jhoira of the Ghitu", 1);
assertHandCount(playerA, "Silvercoat Lion", 0);
assertPermanentCount(playerA, "Silvercoat Lion", 1);
-
+
}
+
/**
- * Tests that a spell countered with delay goes to exile with 3 time counters
- * and can be cast after the 3 counters are removed
+ * Tests that a spell countered with delay goes to exile with 3 time
+ * counters and can be cast after the 3 counters are removed
*
*/
@Test
@@ -97,13 +102,13 @@ public class SuspendTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerA, "Plains", 2);
- addCard(Zone.HAND, playerA, "Silvercoat Lion",1);
+ addCard(Zone.HAND, playerA, "Silvercoat Lion", 1);
// Instant {1}{U}
// Counter target spell. If the spell is countered this way, exile it with three time counters on it instead of putting it into its owner's graveyard. If it doesn't have suspend, it gains suspend. (At the beginning of its owner's upkeep, remove a counter from that card. When the last is removed, the player plays it without paying its mana cost. If it's a creature, it has haste.)
- addCard(Zone.HAND, playerB, "Delay",1);
+ addCard(Zone.HAND, playerB, "Delay", 1);
addCard(Zone.BATTLEFIELD, playerB, "Island", 2);
-
+
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Silvercoat Lion");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Delay", "Silvercoat Lion");
setChoice(playerA, "Silvercoat Lion");
@@ -113,20 +118,21 @@ public class SuspendTest extends CardTestPlayerBase {
assertGraveyardCount(playerB, "Delay", 1);
assertPermanentCount(playerA, "Silvercoat Lion", 1);
-
- }
+
+ }
+
@Test
public void testDeepSeaKraken() {
addCard(Zone.BATTLEFIELD, playerA, "Island", 3);
// Suspend 9-{2}{U}
// Whenever an opponent casts a spell, if Deep-Sea Kraken is suspended, remove a time counter from it.
- addCard(Zone.HAND, playerA, "Deep-Sea Kraken",1);
+ addCard(Zone.HAND, playerA, "Deep-Sea Kraken", 1);
// Instant {1}{U}
// Counter target spell. If the spell is countered this way, exile it with three time counters on it instead of putting it into its owner's graveyard. If it doesn't have suspend, it gains suspend. (At the beginning of its owner's upkeep, remove a counter from that card. When the last is removed, the player plays it without paying its mana cost. If it's a creature, it has haste.)
- addCard(Zone.HAND, playerB, "Lightning Bolt",1);
+ addCard(Zone.HAND, playerB, "Lightning Bolt", 1);
addCard(Zone.BATTLEFIELD, playerB, "Mountain", 1);
-
+
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Suspend");
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerB, "Lightning Bolt", playerA);
@@ -135,8 +141,8 @@ public class SuspendTest extends CardTestPlayerBase {
assertGraveyardCount(playerB, "Lightning Bolt", 1);
assertExileCount("Deep-Sea Kraken", 1);
-
+
assertCounterOnExiledCardCount("Deep-Sea Kraken", CounterType.TIME, 8); // -1 from spell of player B
-
- }
+
+ }
}
diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/UndyingTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/UndyingTest.java
index eca34b84cd3..31fc57868bf 100644
--- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/UndyingTest.java
+++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/UndyingTest.java
@@ -11,7 +11,8 @@ import org.mage.test.serverside.base.CardTestPlayerBase;
public class UndyingTest extends CardTestPlayerBase {
/**
- * Tests boost weren't be applied second time when creature back to battlefield
+ * Tests boost weren't be applied second time when creature back to
+ * battlefield
*/
@Test
public void testWithBoost() {
@@ -29,7 +30,8 @@ public class UndyingTest extends CardTestPlayerBase {
}
/**
- * Tests boost weren't be applied second time when creature back to battlefield
+ * Tests boost weren't be applied second time when creature back to
+ * battlefield
*/
@Test
public void testWithMassBoost() {
@@ -62,7 +64,7 @@ public class UndyingTest extends CardTestPlayerBase {
// Target creature gets -3/-3 until end of turn.
addCard(Zone.HAND, playerA, "Last Gasp");
// Undying Evil
- // Target creature gains undying until end of turn.
+ // Target creature gains undying until end of turn.
// When it dies, if it had no +1/+1 counters on it, return it to the battlefield under its owner's control with a +1/+1 counter on it.)
addCard(Zone.HAND, playerA, "Undying Evil");
@@ -76,9 +78,9 @@ public class UndyingTest extends CardTestPlayerBase {
assertPowerToughness(playerA, "Elite Vanguard", 3, 2);
}
-
/**
- * Tests "Threads of Disloyalty enchanting Strangleroot Geist: after geist died it returns to the bf under opponent's control."
+ * Tests "Threads of Disloyalty enchanting Strangleroot Geist: after geist
+ * died it returns to the bf under opponent's control."
*/
@Test
public void testUndyingControlledReturnsToOwner() {
@@ -105,18 +107,20 @@ public class UndyingTest extends CardTestPlayerBase {
setStopAt(2, PhaseStep.END_TURN);
execute();
- assertGraveyardCount(playerB, "Threads of Disloyalty", 1);
- assertGraveyardCount(playerA, "Lightning Bolt",1);
+ assertGraveyardCount(playerB, "Threads of Disloyalty", 1);
+ assertGraveyardCount(playerA, "Lightning Bolt", 1);
assertPermanentCount(playerB, "Strangleroot Geist", 0);
assertPermanentCount(playerA, "Strangleroot Geist", 1);
assertPowerToughness(playerA, "Strangleroot Geist", 3, 2);
}
/**
- * Tests "Target creature with Undying will be exiled by Anafenza before it returns to battlefield
- *
- * Anafenza the foremost doesn't exile an undying creature when dying at the same time as
- * that undying one. The undying comes back to the field when he shouldn't.
+ * Tests "Target creature with Undying will be exiled by Anafenza before it
+ * returns to battlefield
+ *
+ * Anafenza the foremost doesn't exile an undying creature when dying at the
+ * same time as that undying one. The undying comes back to the field when
+ * he shouldn't.
*/
@Test
public void testReplacementEffectPreventsReturnOfUndying() {
@@ -125,7 +129,7 @@ public class UndyingTest extends CardTestPlayerBase {
// Creature - Zombie, 1/1 {1}{B}
// Undying (When this creature dies, if it had no +1/+1 counters on it, return it to the battlefield under its owner's control with a +1/+1 counter on it.)
addCard(Zone.HAND, playerA, "Butcher Ghoul");
-
+
addCard(Zone.BATTLEFIELD, playerB, "Mountain", 1);
addCard(Zone.HAND, playerB, "Lightning Bolt");
// Anafenza, the Foremost
@@ -141,17 +145,18 @@ public class UndyingTest extends CardTestPlayerBase {
assertPermanentCount(playerB, "Anafenza, the Foremost", 1);
assertGraveyardCount(playerB, "Lightning Bolt", 1);
-
+
assertPermanentCount(playerA, "Butcher Ghoul", 0);
assertExileCount("Butcher Ghoul", 1);
}
/**
- * Tests "Target creature with Undying will be exiled by Anafenza before it returns to battlefield
- * if both leave the battlefield at the same time
+ * Tests "Target creature with Undying will be exiled by Anafenza before it
+ * returns to battlefield if both leave the battlefield at the same time
*
- * Anafenza the foremost doesn't exile an undying creature when dying at the same time as
- * that undying one. The undying comes back to the field when he shouldn't.
+ * Anafenza the foremost doesn't exile an undying creature when dying at the
+ * same time as that undying one. The undying comes back to the field when
+ * he shouldn't.
*/
@Test
public void testReplacementEffectPreventsReturnOfUndyingWrath() {
@@ -208,4 +213,33 @@ public class UndyingTest extends CardTestPlayerBase {
assertPowerToughness(playerA, "Silvercoat Lion", 4, 4);
}
+
+ /**
+ * Tatterkite is getting counters on it, i have him in a edh deck with
+ * Mikaeus, the Lunarch and when Tatterkite dies it triggers the undying and
+ * he gets the +1/+1 counters
+ */
+ @Test
+ public void testUndyingMikaeusAndTatterkite() {
+ addCard(Zone.HAND, playerA, "Lightning Bolt", 1);
+ addCard(Zone.BATTLEFIELD, playerA, "Mountain", 1);
+ // Whenever a Human deals damage to you, destroy it.
+ // Other non-Human creatures you control get +1/+1 and have undying.
+ addCard(Zone.BATTLEFIELD, playerA, "Mikaeus, the Unhallowed", 1);
+
+ addCard(Zone.BATTLEFIELD, playerA, "Tatterkite", 1); // Artifact Creature - Scarecrow 2/1
+
+ castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", "Tatterkite");
+
+ setStopAt(1, PhaseStep.BEGIN_COMBAT);
+ execute();
+
+ assertGraveyardCount(playerA, "Lightning Bolt", 1);
+
+ assertPermanentCount(playerA, "Tatterkite", 1);
+ assertPermanentCount(playerA, "Mikaeus, the Unhallowed", 1);
+ assertPowerToughness(playerA, "Tatterkite", 3, 2);
+
+ }
+
}
diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/oneshot/counter/AddingCountersToPermanentsTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/oneshot/counter/AddingCountersToPermanentsTest.java
index ecd169b3272..599b9f7f0aa 100644
--- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/oneshot/counter/AddingCountersToPermanentsTest.java
+++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/oneshot/counter/AddingCountersToPermanentsTest.java
@@ -36,7 +36,6 @@ import org.mage.test.serverside.base.CardTestPlayerBase;
*
* @author LevelX2
*/
-
public class AddingCountersToPermanentsTest extends CardTestPlayerBase {
@Test
@@ -47,7 +46,7 @@ public class AddingCountersToPermanentsTest extends CardTestPlayerBase {
// Put X -1/-1 counters on each creature. Shuffle Black Sun's Zenith into its owner's library.
addCard(Zone.HAND, playerA, "Black Sun's Zenith", 1);
-
+
addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1);
addCard(Zone.BATTLEFIELD, playerB, "Witch's Familiar", 1);
@@ -59,14 +58,13 @@ public class AddingCountersToPermanentsTest extends CardTestPlayerBase {
assertGraveyardCount(playerA, "Silvercoat Lion", 1);
assertGraveyardCount(playerB, "Silvercoat Lion", 1);
-
- assertPermanentCount(playerA, "Witch's Familiar", 1);
+
+ assertPermanentCount(playerA, "Witch's Familiar", 1);
assertPowerToughness(playerA, "Witch's Familiar", 0, 1);
- assertPermanentCount(playerB, "Witch's Familiar", 1);
+ assertPermanentCount(playerB, "Witch's Familiar", 1);
assertPowerToughness(playerB, "Witch's Familiar", 0, 1);
-
}
-}
\ No newline at end of file
+}
diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/oneshot/destroy/BoilTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/oneshot/destroy/BoilTest.java
new file mode 100644
index 00000000000..c7eabd0ac60
--- /dev/null
+++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/oneshot/destroy/BoilTest.java
@@ -0,0 +1,66 @@
+/*
+ * 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 org.mage.test.cards.abilities.oneshot.destroy;
+
+import mage.constants.PhaseStep;
+import mage.constants.Zone;
+import org.junit.Test;
+import org.mage.test.serverside.base.CardTestPlayerBase;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class BoilTest extends CardTestPlayerBase {
+
+ @Test
+ public void testDestroy() {
+ addCard(Zone.BATTLEFIELD, playerA, "Island", 1);
+ addCard(Zone.BATTLEFIELD, playerA, "Breeding Pool");
+ addCard(Zone.BATTLEFIELD, playerA, "Mountain", 2);
+ // Destroy all Islands.
+ addCard(Zone.HAND, playerA, "Boil"); // {3}{R}
+
+ addCard(Zone.BATTLEFIELD, playerB, "Island", 1);
+ addCard(Zone.BATTLEFIELD, playerB, "Breeding Pool");
+ addCard(Zone.BATTLEFIELD, playerB, "Mountain", 2);
+
+ castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Boil");
+
+ setStopAt(1, PhaseStep.BEGIN_COMBAT);
+ execute();
+
+ assertPermanentCount(playerA, "Island", 0);
+ assertPermanentCount(playerA, "Breeding Pool", 0);
+ assertPermanentCount(playerA, "Mountain", 2);
+
+ assertPermanentCount(playerB, "Island", 0);
+ assertPermanentCount(playerB, "Breeding Pool", 0);
+ assertPermanentCount(playerB, "Mountain", 2);
+ }
+}
diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/asthough/PlayFromNonHandZoneTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/asthough/PlayFromNonHandZoneTest.java
index 0c2a6912486..395b217c589 100644
--- a/Mage.Tests/src/test/java/org/mage/test/cards/asthough/PlayFromNonHandZoneTest.java
+++ b/Mage.Tests/src/test/java/org/mage/test/cards/asthough/PlayFromNonHandZoneTest.java
@@ -36,14 +36,31 @@ import org.mage.test.serverside.base.CardTestPlayerBase;
*
* @author LevelX2
*/
-
public class PlayFromNonHandZoneTest extends CardTestPlayerBase {
+ @Test
+ public void testWorldheartPhoenixNormal() {
+ // Creature - Phoenix {3}{R}
+ // Flying
+ // You may cast Worldheart Phoenix from your graveyard by paying {W}{U}{B}{R}{G} rather than paying its mana cost.
+ // If you do, it enters the battlefield with two +1/+1 counters on it.
+ addCard(Zone.HAND, playerA, "Worldheart Phoenix");
+ addCard(Zone.BATTLEFIELD, playerA, "Mountain", 4);
+
+ castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Worldheart Phoenix"); // can only be cast by {W}{U}{B}{R}{G}
+
+ setStopAt(1, PhaseStep.END_COMBAT);
+ execute();
+
+ assertPowerToughness(playerA, "Worldheart Phoenix", 2, 2);
+
+ }
+
@Test
public void testWorldheartPhoenixNoMana() {
// Creature - Phoenix {3}{R}
- // Flying
- // You may cast Worldheart Phoenix from your graveyard by paying {W}{U}{B}{R}{G} rather than paying its mana cost.
+ // Flying
+ // You may cast Worldheart Phoenix from your graveyard by paying {W}{U}{B}{R}{G} rather than paying its mana cost.
// If you do, it enters the battlefield with two +1/+1 counters on it.
addCard(Zone.GRAVEYARD, playerA, "Worldheart Phoenix");
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 4);
@@ -53,16 +70,15 @@ public class PlayFromNonHandZoneTest extends CardTestPlayerBase {
setStopAt(1, PhaseStep.END_COMBAT);
execute();
- assertPermanentCount(playerA, "Worldheart Phoenix", 0);
-
- }
+ assertPermanentCount(playerA, "Worldheart Phoenix", 0);
+ }
@Test
public void testWorldheartPhoenix() {
// Creature - Phoenix {3}{R}
- // Flying
- // You may cast Worldheart Phoenix from your graveyard by paying {W}{U}{B}{R}{G} rather than paying its mana cost.
+ // Flying
+ // You may cast Worldheart Phoenix from your graveyard by paying {W}{U}{B}{R}{G} rather than paying its mana cost.
// If you do, it enters the battlefield with two +1/+1 counters on it.
addCard(Zone.GRAVEYARD, playerA, "Worldheart Phoenix");
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 1);
@@ -76,11 +92,10 @@ public class PlayFromNonHandZoneTest extends CardTestPlayerBase {
setStopAt(1, PhaseStep.END_COMBAT);
execute();
- assertPermanentCount(playerA, "Worldheart Phoenix", 1);
-
- }
-
-
+ assertPermanentCount(playerA, "Worldheart Phoenix", 1);
+
+ }
+
@Test
public void testNarsetEnlightenedMaster() {
// First strike
@@ -90,38 +105,36 @@ public class PlayFromNonHandZoneTest extends CardTestPlayerBase {
skipInitShuffling();
addCard(Zone.LIBRARY, playerB, "Silvercoat Lion");
- addCard(Zone.LIBRARY, playerB, "Abzan Banner");
+ addCard(Zone.LIBRARY, playerB, "Abzan Banner");
// Ferocious - If you control a creature with power 4 or greater, you may cast Dragon Grip as though it had flash. (You may cast it any time you could cast an instant.)
// Enchant creature
// Enchanted creature gets +2/+0 and has first strike.
- addCard(Zone.LIBRARY, playerB, "Dragon Grip");
+ addCard(Zone.LIBRARY, playerB, "Dragon Grip");
// You gain 2 life for each creature you control.
- addCard(Zone.LIBRARY, playerB, "Peach Garden Oath");
- addCard(Zone.LIBRARY, playerB, "Plains");
-
+ addCard(Zone.LIBRARY, playerB, "Peach Garden Oath");
+ addCard(Zone.LIBRARY, playerB, "Plains");
+
attack(2, playerB, "Narset, Enlightened Master");
castSpell(2, PhaseStep.POSTCOMBAT_MAIN, playerB, "Silvercoat Lion"); // can't be cast from exile
castSpell(2, PhaseStep.POSTCOMBAT_MAIN, playerB, "Abzan Banner"); // can be cast from exile
castSpell(2, PhaseStep.POSTCOMBAT_MAIN, playerB, "Dragon Grip", "Narset, Enlightened Master"); // can be cast from exile
castSpell(2, PhaseStep.POSTCOMBAT_MAIN, playerB, "Peach Garden Oath"); // can be cast from exile
-
+
setStopAt(2, PhaseStep.END_TURN);
execute();
assertExileCount("Silvercoat Lion", 1);
- assertPermanentCount(playerB, "Abzan Banner", 1);
- assertPermanentCount(playerB, "Dragon Grip", 1);
+ assertPermanentCount(playerB, "Abzan Banner", 1);
+ assertPermanentCount(playerB, "Dragon Grip", 1);
assertGraveyardCount(playerB, "Peach Garden Oath", 1);
-
+
assertPowerToughness(playerB, "Narset, Enlightened Master", 5, 2);
-
+
assertHandCount(playerB, "Plains", 1);
assertLife(playerA, 17);
assertLife(playerB, 22);
-
-
- }
-
-
+
+ }
+
}
diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/continuous/DependentEffectsTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/continuous/DependentEffectsTest.java
new file mode 100644
index 00000000000..e844aacf1f8
--- /dev/null
+++ b/Mage.Tests/src/test/java/org/mage/test/cards/continuous/DependentEffectsTest.java
@@ -0,0 +1,176 @@
+/*
+ * 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 org.mage.test.cards.continuous;
+
+import mage.abilities.Ability;
+import mage.constants.AbilityType;
+import mage.constants.PhaseStep;
+import mage.constants.Zone;
+import mage.game.permanent.Permanent;
+import org.junit.Assert;
+import org.junit.Test;
+import org.mage.test.serverside.base.CardTestPlayerBase;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class DependentEffectsTest extends CardTestPlayerBase {
+
+ /**
+ * Opalescence plus Enchanted Evening are still not wiping any lands.
+ */
+ @Test
+ public void testLandsAreDestroyed() {
+ // Each other non-Aura enchantment is a creature in addition to its other types and has base power and base toughness each equal to its converted mana cost.
+ addCard(Zone.HAND, playerA, "Opalescence", 1); // {2}{W}{W}
+
+ addCard(Zone.BATTLEFIELD, playerA, "Plains", 9);
+ addCard(Zone.BATTLEFIELD, playerA, "War Horn", 1);
+
+ // All permanents are enchantments in addition to their other types.
+ addCard(Zone.HAND, playerA, "Enchanted Evening"); // {3}{W/U}{W/U}
+
+ addCard(Zone.BATTLEFIELD, playerB, "Plains", 2);
+
+ castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Opalescence");
+ castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Enchanted Evening");
+
+ setStopAt(1, PhaseStep.BEGIN_COMBAT);
+ execute();
+
+ assertPowerToughness(playerA, "Enchanted Evening", 5, 5);
+ assertPowerToughness(playerA, "War Horn", 3, 3);
+
+ assertPermanentCount(playerA, "Island", 0);
+ assertPermanentCount(playerB, "Plains", 0);
+ }
+
+ /**
+ * Opalescense is dependent on Enchanted Evening, so it will be applied
+ * after it regardless of timestamp.
+ *
+ * Tokens can also have mana costs, and as a consequence of that, converted
+ * mana costs. A token created with Rite of Replication would have the mana
+ * cost of the creature it targeted. Most tokens do not have mana costs
+ * though.
+ *
+ * Tokens with no mana costs would be 0/0, as you said, and would indeed be
+ * put into owner's graveyard next time State Based Actionas are performed.
+ * Tokens with mana costs would naturally have whatever power and toughness
+ * their CMC indicated.
+ */
+ @Test
+ public void testTokensAreDestroyed() {
+ // Each other non-Aura enchantment is a creature in addition to its other types and has base power and base toughness each equal to its converted mana cost.
+ addCard(Zone.BATTLEFIELD, playerA, "Opalescence", 1);
+ addCard(Zone.BATTLEFIELD, playerA, "Island", 9);
+ // Kicker {5}
+ // Put a token that's a copy of target creature onto the battlefield. If Rite of Replication was kicked, put five of those tokens onto the battlefield instead.
+ addCard(Zone.HAND, playerA, "Rite of Replication", 1); // This token can have a cmc
+ // All permanents are enchantments in addition to their other types.
+ addCard(Zone.HAND, playerA, "Enchanted Evening"); // {3}{W/U}{W/U}
+
+ addCard(Zone.BATTLEFIELD, playerB, "Cobblebrute", 1); // 5/2 cmc = 4
+ addCard(Zone.BATTLEFIELD, playerB, "Plains", 2);
+ // Put two 1/1 white Soldier creature tokens onto the battlefield.
+ addCard(Zone.HAND, playerB, "Raise the Alarm"); // Instant {1}{W}
+
+ castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Rite of Replication", "Cobblebrute");
+ setChoice(playerA, "No"); // no kicker
+ castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Raise the Alarm");
+ castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Enchanted Evening");
+ setStopAt(1, PhaseStep.END_TURN);
+ execute();
+
+ assertGraveyardCount(playerA, "Rite of Replication", 1);
+ assertGraveyardCount(playerB, "Raise the Alarm", 1);
+
+ assertPowerToughness(playerA, "Enchanted Evening", 5, 5);
+
+ assertPowerToughness(playerB, "Cobblebrute", 4, 4);
+ assertPowerToughness(playerA, "Cobblebrute", 4, 4);
+
+ assertPermanentCount(playerB, "Soldier", 0);
+ assertPermanentCount(playerA, "Island", 0);
+ assertPermanentCount(playerB, "Plains", 0);
+ }
+
+ @Test
+ public void testYixlidJailerAndNecroticOozeBasic() {
+ addCard(Zone.BATTLEFIELD, playerA, "Swamp", 2);
+ // As long as Necrotic Ooze is on the battlefield, it has all activated abilities of all creature cards in all graveyards
+ addCard(Zone.BATTLEFIELD, playerA, "Necrotic Ooze", 1);
+ // {2}{1},{T}: Tap target creature.
+ addCard(Zone.GRAVEYARD, playerA, "Akroan Jailer", 1);
+ // {T}: Target attacking creature gets +1/+1 until end of turn.
+ addCard(Zone.GRAVEYARD, playerB, "Anointer of Champions", 1);
+
+ setStopAt(1, PhaseStep.BEGIN_COMBAT);
+ execute();
+
+ Permanent necroticOoze = getPermanent("Necrotic Ooze", playerA);
+ int numberOfActivatedAbilities = 0;
+ for (Ability ability : necroticOoze.getAbilities(currentGame)) {
+ if (ability.getAbilityType().equals(AbilityType.ACTIVATED)) {
+ numberOfActivatedAbilities++;
+ }
+ }
+ Assert.assertEquals("Two abilities for Necrotic Ooze", 2, numberOfActivatedAbilities);
+ }
+
+ @Test
+ public void testYixlidJailerAndNecroticOozeLooseAll() {
+ addCard(Zone.BATTLEFIELD, playerA, "Swamp", 2);
+ // As long as Necrotic Ooze is on the battlefield, it has all activated abilities of all creature cards in all graveyards
+ addCard(Zone.BATTLEFIELD, playerA, "Necrotic Ooze", 1);
+ // {2}{1},{T}: Tap target creature.
+ addCard(Zone.GRAVEYARD, playerA, "Akroan Jailer", 1);
+ // {T}: Target attacking creature gets +1/+1 until end of turn.
+ addCard(Zone.GRAVEYARD, playerB, "Anointer of Champions", 1);
+
+ // Cards in graveyards lose all abilities.
+ addCard(Zone.HAND, playerA, "Yixlid Jailer", 1); // Creature - {1}{B}
+
+ castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Yixlid Jailer");
+ setStopAt(1, PhaseStep.BEGIN_COMBAT);
+ execute();
+
+ assertPermanentCount(playerA, "Yixlid Jailer", 1);
+
+ Permanent necroticOoze = getPermanent("Necrotic Ooze", playerA);
+ int numberOfActivatedAbilities = 0;
+ for (Ability ability : necroticOoze.getAbilities(currentGame)) {
+ if (ability.getAbilityType().equals(AbilityType.ACTIVATED)) {
+ numberOfActivatedAbilities++;
+ }
+ }
+ Assert.assertEquals("All abilities from cards in graveyard are removed - so no abilities for Necrotic Ooze", 0, numberOfActivatedAbilities);
+ }
+
+}
diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/copy/ArtisanOfFormsTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/copy/ArtisanOfFormsTest.java
index 75a884fc286..e4304f68480 100644
--- a/Mage.Tests/src/test/java/org/mage/test/cards/copy/ArtisanOfFormsTest.java
+++ b/Mage.Tests/src/test/java/org/mage/test/cards/copy/ArtisanOfFormsTest.java
@@ -38,28 +38,28 @@ import org.mage.test.serverside.base.CardTestPlayerBase;
*
* @author LevelX2
*/
-
public class ArtisanOfFormsTest extends CardTestPlayerBase {
/**
- * Targeting a Artisan of Forms triggers it Heroic ability. So it can copy a target creature.
- * If Cackling Counterpart later resolves, it should copy the creature that Artisan of Forms copies, not
- * the Artisan itself.
+ * Targeting a Artisan of Forms triggers it Heroic ability. So it can copy a
+ * target creature. If Cackling Counterpart later resolves, it should copy
+ * the creature that Artisan of Forms copies, not the Artisan itself.
*/
@Test
public void testCopyTriggeredByCracklingCounterpart() {
// Heroic - Whenever you cast a spell that targets Artisan of Forms, you may have Artisan of Forms become a copy of target creature and gain this ability.
- addCard(Zone.BATTLEFIELD, playerA, "Artisan of Forms");
+ addCard(Zone.HAND, playerA, "Artisan of Forms"); // {1}{U}
// {1}{U}{U} Put a token onto the battlefield that's a copy of target creature you control.
addCard(Zone.HAND, playerA, "Cackling Counterpart");
- addCard(Zone.BATTLEFIELD, playerA, "Island",3);
+ addCard(Zone.BATTLEFIELD, playerA, "Island", 5);
addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1);
- castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cackling Counterpart", "Artisan of Forms");
+ castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Artisan of Forms");
+ castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Cackling Counterpart", "Artisan of Forms");
addTarget(playerA, "Silvercoat Lion");
- setStopAt(1, PhaseStep.BEGIN_COMBAT);
+ setStopAt(1, PhaseStep.END_TURN);
execute();
assertLife(playerA, 20);
@@ -70,18 +70,18 @@ public class ArtisanOfFormsTest extends CardTestPlayerBase {
assertPermanentCount(playerB, "Silvercoat Lion", 1);
// 1 + 2 Silvercoat Lion at the end
assertPermanentCount(playerA, "Silvercoat Lion", 2);
-
- for (Permanent permanent :currentGame.getBattlefield().getAllActivePermanents(playerA.getId())) {
+
+ for (Permanent permanent : currentGame.getBattlefield().getAllActivePermanents(playerA.getId())) {
if (permanent.getName().equals("Silvercoat Lion")) {
Assert.assertEquals("Creature has to have Cast + Heroic ability", 2, permanent.getAbilities().size());
}
}
}
-
-/**
- * Targeting a Artisan of Forms triggers it Heroic ability. So it can copy a target creature.
- * If populate spell later resolves, it should copy the creature that Artisan of Forms copies, not
- * the Artisan itself.
+
+ /**
+ * Targeting a Artisan of Forms triggers it Heroic ability. So it can copy a
+ * target creature. If populate spell later resolves, it should copy the
+ * creature that Artisan of Forms copies, not the Artisan itself.
*/
@Test
public void testCopyTriggeredByPopulate() {
@@ -90,17 +90,17 @@ public class ArtisanOfFormsTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerA, "Artisan of Forms");
// {1}{U}{U} Put a token onto the battlefield that's a copy of target creature you control.
addCard(Zone.HAND, playerA, "Cackling Counterpart");
- addCard(Zone.BATTLEFIELD, playerA, "Island",3);
+ addCard(Zone.BATTLEFIELD, playerA, "Island", 3);
addCard(Zone.HAND, playerA, "Eyes in the Skies");
- addCard(Zone.BATTLEFIELD, playerA, "Plains",4);
+ addCard(Zone.BATTLEFIELD, playerA, "Plains", 4);
addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cackling Counterpart", "Artisan of Forms");
addTarget(playerA, "Silvercoat Lion");
- castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Eyes in the Skies");
+ castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Eyes in the Skies");
addTarget(playerA, "Silvercoat Lion");
-
+
setStopAt(1, PhaseStep.END_TURN);
execute();
@@ -113,12 +113,12 @@ public class ArtisanOfFormsTest extends CardTestPlayerBase {
assertPermanentCount(playerA, "Bird", 1);
// 3 Silvercoat Lion at the end
assertPermanentCount(playerA, "Silvercoat Lion", 3);
-
- for (Permanent permanent :currentGame.getBattlefield().getAllActivePermanents(playerA.getId())) {
+
+ for (Permanent permanent : currentGame.getBattlefield().getAllActivePermanents(playerA.getId())) {
if (permanent.getName().equals("Silvercoat Lion")) {
Assert.assertEquals("Creature has to have Cast + Heroic ability", 2, permanent.getAbilities().size());
}
}
- }
-
+ }
+
}
diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/copy/CopySpellTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/copy/CopySpellTest.java
new file mode 100644
index 00000000000..c9736f2aa00
--- /dev/null
+++ b/Mage.Tests/src/test/java/org/mage/test/cards/copy/CopySpellTest.java
@@ -0,0 +1,64 @@
+/*
+ * 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 org.mage.test.cards.copy;
+
+import mage.constants.PhaseStep;
+import mage.constants.Zone;
+import org.junit.Test;
+import org.mage.test.serverside.base.CardTestPlayerBase;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class CopySpellTest extends CardTestPlayerBase {
+
+ @Test
+ public void copyChainOfVapor() {
+ // Return target nonland permanent to its owner's hand. Then that permanent's controller may sacrifice a land. If the player does, he or she may copy this spell and may choose a new target for that copy.
+ addCard(Zone.HAND, playerA, "Chain of Vapor", 1);
+ addCard(Zone.BATTLEFIELD, playerA, "Island", 1);
+
+ addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion", 1);
+
+ addCard(Zone.BATTLEFIELD, playerB, "Pillarfield Ox", 1);
+ addCard(Zone.BATTLEFIELD, playerB, "Island", 1);
+
+ castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Chain of Vapor", "Pillarfield Ox");
+ setChoice(playerB, "Yes");
+ addTarget(playerB, "Silvercoat Lion");
+
+ setStopAt(1, PhaseStep.BEGIN_COMBAT);
+ execute();
+
+ assertGraveyardCount(playerB, "Island", 1);
+ assertHandCount(playerB, "Pillarfield Ox", 1);
+ assertHandCount(playerA, "Silvercoat Lion", 1);
+ }
+
+}
diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/copy/CryptoplasmTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/copy/CryptoplasmTest.java
index 1242402d45e..f57e5f93424 100644
--- a/Mage.Tests/src/test/java/org/mage/test/cards/copy/CryptoplasmTest.java
+++ b/Mage.Tests/src/test/java/org/mage/test/cards/copy/CryptoplasmTest.java
@@ -19,4 +19,99 @@ public class CryptoplasmTest extends CardTestPlayerBase {
assertLife(playerB, 20);
assertPermanentCount(playerA, "Craw Wurm", 2);
}
+
+ /**
+ * I have a Cryptoplasm in play, currently copying a Sigiled Paladin, and I
+ * enchant it with a Followed Footsteps. Next turn the aura triggers (the
+ * Crypto is still copying the same creature) and places a token on the
+ * battlefield, except the token is an untransformed Cryptoplasm, when it
+ * should be a Sigiled Paladin with Cryptoplasm's ability (as per rule
+ * 706.3), since that's what the enchanted creature currently is.
+ *
+ * 6/1/2011 If another creature becomes a copy of Cryptoplasm, it will
+ * become a copy of whatever Cryptoplasm is currently copying (if anything),
+ * plus it will have Cryptoplasm's triggered ability.
+ */
+ @Test
+ public void testFollowedFootsteps() {
+ // First strike
+ // Exalted (Whenever a creature you control attacks alone, that creature gets +1/+1 until end of turn.)
+ addCard(Zone.BATTLEFIELD, playerA, "Sigiled Paladin", 1); // {W}{W}
+
+ addCard(Zone.BATTLEFIELD, playerB, "Island", 5);
+ // Enchant creature
+ // At the beginning of your upkeep, put a token that's a copy of enchanted creature onto the battlefield.
+ addCard(Zone.HAND, playerB, "Followed Footsteps", 1); // {3}{U}{U}
+ // At the beginning of your upkeep, you may have Cryptoplasm become a copy of another target creature. If you do, Cryptoplasm gains this ability.
+ addCard(Zone.BATTLEFIELD, playerB, "Cryptoplasm", 1); // {1}{U}{U}
+
+ castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Followed Footsteps");
+ addTarget(playerB, "Sigiled Paladin[only copy]");
+
+ setStopAt(4, PhaseStep.END_TURN);
+ execute();
+
+ assertPermanentCount(playerB, "Followed Footsteps", 1);
+ assertPermanentCount(playerB, "Cryptoplasm", 0);
+ assertPermanentCount(playerB, "Sigiled Paladin", 2);
+ }
+
+ /**
+ * I'm at 8 life, opponent (AI) is at 21. I have a Cryptoplasm currently
+ * copying my opponent's Divinity of Pride, the Crypto also has my Followed
+ * Footsteps attached to it. Additionally, I have another Cryptoplasm on the
+ * battlefield also copying the same Divinity, and a Clever Impersonator
+ * that ETB copying the first Cryptoplasm and is currently also a copy of
+ * the Divinity.
+ *
+ * Opponent attacks with his only Divinity of Pride (4/4) and a Serra
+ * Avenger (3/3). I block the Divinity with two of my Divinity copies (the
+ * Clever Impersonator and unenchanted Cryptoplasm) and the Avenger with the
+ * enchanted Divinity (originally a Cryptoplasm). My opponent's Divinity
+ * kills my two copies and dies, and then his Avenger dies and kills the
+ * Divinity blocking it, also sending my Followed Footsteps down with it.
+ *
+ * How does any of that add up? Not only should his Divinity only kill one
+ * of mine since it was a 4/4 and only becomes an 8/8 after dealing its
+ * damage (at which point it should be too late to go back and say the 4
+ * damage are now 8, since it was that exact damage that put him at 25
+ * life), but even more confusing is how the Serra Avenger, which is a 3/3,
+ * somehow kills my 4/4 that had suffered no other damage that turn.
+ *
+ * No other permanents in play at that moment had any influence in this
+ * either, they were only basic lands and a couple of creatures with no
+ * relevant abilities.
+ *
+ * I won't put aside me completely missing something here, but I really
+ * can't see any other explanation to this other than a game bug.
+ */
+ @Test
+ public void testDamageLifelink() {
+ setLife(playerA, 21);
+ setLife(playerB, 8);
+ // First strike
+ // Exalted (Whenever a creature you control attacks alone, that creature gets +1/+1 until end of turn.)
+ addCard(Zone.BATTLEFIELD, playerA, "Divinity of Pride", 1); // {W}{W}
+
+ addCard(Zone.BATTLEFIELD, playerB, "Island", 5);
+ // At the beginning of your upkeep, you may have Cryptoplasm become a copy of another target creature. If you do, Cryptoplasm gains this ability.
+ addCard(Zone.BATTLEFIELD, playerB, "Cryptoplasm", 2); // {1}{U}{U}
+ addTarget(playerB, "Divinity of Pride");
+ addTarget(playerB, "Divinity of Pride");
+
+ attack(3, playerA, "Divinity of Pride");
+ block(3, playerB, "Divinity of Pride", "Divinity of Pride");
+ block(3, playerB, "Divinity of Pride", "Divinity of Pride");
+
+ setStopAt(3, PhaseStep.POSTCOMBAT_MAIN);
+ execute();
+
+ assertPermanentCount(playerB, "Cryptoplasm", 0);
+
+ assertPermanentCount(playerA, "Divinity of Pride", 0);
+ assertPermanentCount(playerB, "Divinity of Pride", 1);
+
+ assertLife(playerB, 16);
+ assertLife(playerA, 25);
+ }
}
diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/copy/FelhideSpiritbinderTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/copy/FelhideSpiritbinderTest.java
index 341d497d74a..97b7f57c8d9 100644
--- a/Mage.Tests/src/test/java/org/mage/test/cards/copy/FelhideSpiritbinderTest.java
+++ b/Mage.Tests/src/test/java/org/mage/test/cards/copy/FelhideSpiritbinderTest.java
@@ -94,4 +94,35 @@ public class FelhideSpiritbinderTest extends CardTestPlayerBase {
assertLife(playerB, 20);
}
+
+ @Test
+ public void testCopyATokenCreature() {
+
+ addCard(Zone.BATTLEFIELD, playerA, "Forest", 3);
+ addCard(Zone.HAND, playerA, "Call of the Herd", 1);
+
+ // Inspired - Whenever Felhide Spiritbinder becomes untapped, you may pay {1}{R}.
+ // If you do, put a token onto the battlefield that's a copy of another target creature
+ // except it's an enchantment in addition to its other types. It gains haste. Exile it at the beginning of the next end step.
+ addCard(Zone.BATTLEFIELD, playerB, "Felhide Spiritbinder", 1);
+ addCard(Zone.BATTLEFIELD, playerB, "Mountain", 2);
+
+ castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Call of the Herd");
+
+ attack(2, playerB, "Felhide Spiritbinder");
+
+ setStopAt(4, PhaseStep.PRECOMBAT_MAIN);
+ execute();
+
+ assertPermanentCount(playerA, "Elephant", 1);
+ assertPermanentCount(playerB, "Elephant", 1);
+ assertAbility(playerB, "Elephant", HasteAbility.getInstance(), true);
+
+ Permanent copiedTokenElephant = getPermanent("Elephant", playerB);
+ Assert.assertEquals("Elephant has Enchantment card type", true, copiedTokenElephant.getCardType().contains(CardType.ENCHANTMENT));
+
+ assertLife(playerA, 17);
+ assertLife(playerB, 20);
+
+ }
}
diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/copy/FlameshadowConjuringTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/copy/FlameshadowConjuringTest.java
index 423ac6c2084..7b8b1dc02c6 100644
--- a/Mage.Tests/src/test/java/org/mage/test/cards/copy/FlameshadowConjuringTest.java
+++ b/Mage.Tests/src/test/java/org/mage/test/cards/copy/FlameshadowConjuringTest.java
@@ -72,4 +72,41 @@ public class FlameshadowConjuringTest extends CardTestPlayerBase {
assertLife(playerA, 18);
}
+ /**
+ * I created a token copy of Wurmcoil Engine and sacrificed it. This gave me
+ * 4 tokens
+ */
+ @Test
+ public void testWurmcoilEngine() {
+ addCard(Zone.BATTLEFIELD, playerA, "Mountain", 7);
+ // Whenever a nontoken creature enters the battlefield under your control, you may pay {R}. If you do, put a token onto the battlefield that's a copy of that creature.
+ // That token gains haste. Exile it at the beginning of the next end step.
+ addCard(Zone.BATTLEFIELD, playerA, "Flameshadow Conjuring", 1);
+ // Deathtouch, lifelink
+ // When Wurmcoil Engine dies, put a 3/3 colorless Wurm artifact creature token with deathtouch and a 3/3 colorless Wurm artifact creature token with lifelink onto the battlefield.
+ addCard(Zone.HAND, playerA, "Wurmcoil Engine", 1); // 6/6 - {6}
+
+ addCard(Zone.BATTLEFIELD, playerB, "Plains", 3);
+ // Destroy target attacking creature.
+ addCard(Zone.HAND, playerB, "Kill Shot", 1); // {2}{U}
+
+ castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Wurmcoil Engine");
+ setChoice(playerA, "Yes");
+
+ attack(1, playerA, "Wurmcoil Engine");
+
+ castSpell(1, PhaseStep.END_COMBAT, playerB, "Kill Shot", "Wurmcoil Engine");
+
+ setStopAt(1, PhaseStep.END_TURN);
+ execute();
+
+ assertGraveyardCount(playerB, "Kill Shot", 1);
+ assertPermanentCount(playerA, "Wurmcoil Engine", 1);
+ assertLife(playerB, 14);
+ assertLife(playerA, 26);
+
+ assertPermanentCount(playerA, "Wurm", 2);
+
+ }
+
}
diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/emblems/EmblemsTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/emblems/EmblemsTest.java
index 0c211862d2c..103cd628814 100644
--- a/Mage.Tests/src/test/java/org/mage/test/cards/emblems/EmblemsTest.java
+++ b/Mage.Tests/src/test/java/org/mage/test/cards/emblems/EmblemsTest.java
@@ -125,11 +125,11 @@ public class EmblemsTest extends CardTestPlayerBase {
/**
* Liliana, Defiant Necromancer: -8: You get an emblem with "Whenever a
- * creature you control dies, return it to the battlefield under your
- * control at the beginning of the next end step.";
+ * creature dies, return it to the battlefield under your control at the
+ * beginning of the next end step.";
*
- * Tests "Whenever a creature you control dies, return it to the battlefield
- * under your control at the beginning of the next end step."
+ * Tests "Whenever a creature dies, return it to the battlefield under your
+ * control at the beginning of the next end step."
*/
@Test
public void testLilianaDefiantNecromancer() {
@@ -152,7 +152,7 @@ public class EmblemsTest extends CardTestPlayerBase {
assertPermanentCount(playerA, "Liliana, Defiant Necromancer", 1);
assertPermanentCount(playerA, "Elite Vanguard", 1);
- assertGraveyardCount(playerB, "Silvercoat Lion", 1);
+ assertPermanentCount(playerA, "Silvercoat Lion", 1);
assertHandCount(playerA, 0);
diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/protection/ProtectionTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/protection/ProtectionTest.java
new file mode 100644
index 00000000000..fff79b5cca9
--- /dev/null
+++ b/Mage.Tests/src/test/java/org/mage/test/cards/protection/ProtectionTest.java
@@ -0,0 +1,63 @@
+/*
+ * 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 org.mage.test.cards.protection;
+
+import mage.constants.PhaseStep;
+import mage.constants.Zone;
+import org.junit.Test;
+import org.mage.test.serverside.base.CardTestPlayerBase;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class ProtectionTest extends CardTestPlayerBase {
+
+ @Test
+ public void testProtectionFromColoredSpells() {
+ addCard(Zone.BATTLEFIELD, playerA, "Swamp", 5);
+ // Delve
+ // Destroy target creature.
+ addCard(Zone.HAND, playerA, "Murderous Cut"); // {4}{B}
+
+ // Emrakul, the Aeons Torn can't be countered.
+ // When you cast Emrakul, take an extra turn after this one.
+ // Flying, protection from colored spells, annihilator 6
+ // When Emrakul is put into a graveyard from anywhere, its owner shuffles his or her graveyard into his or her library.
+ addCard(Zone.BATTLEFIELD, playerB, "Emrakul, the Aeons Torn");
+
+ castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Murderous Cut", "Emrakul, the Aeons Torn");
+
+ setStopAt(1, PhaseStep.BEGIN_COMBAT);
+ execute();
+
+ assertPermanentCount(playerB, "Emrakul, the Aeons Torn", 1);
+ assertHandCount(playerA, "Murderous Cut", 1);
+ }
+
+}
diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/protection/gain/GainProtectionTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/protection/gain/GainProtectionTest.java
index 945d61b8325..d3bb9c3eea8 100644
--- a/Mage.Tests/src/test/java/org/mage/test/cards/protection/gain/GainProtectionTest.java
+++ b/Mage.Tests/src/test/java/org/mage/test/cards/protection/gain/GainProtectionTest.java
@@ -70,4 +70,64 @@ public class GainProtectionTest extends CardTestPlayerBase {
assertPowerToughness(playerA, "Elite Vanguard", 6, 5);
}
+ @Test
+ public void testGainProtectionByEnchantment() {
+ addCard(Zone.BATTLEFIELD, playerB, "Plains", 5);
+ // Flying
+ // When Brago, King Eternal deals combat damage to a player, exile any number of target nonland permanents you control, then return those cards to the battlefield under their owner's control.
+ addCard(Zone.BATTLEFIELD, playerB, "Brago, King Eternal");
+ // Enchant creature
+ // When Pentarch Ward enters the battlefield, draw a card.
+ // As Pentarch Ward enters the battlefield, choose a color.
+ // Enchanted creature has protection from the chosen color. This effect doesn't remove Pentarch Ward.
+ addCard(Zone.HAND, playerB, "Pentarch Ward");// "{2}{W}"
+ // Enchant creature
+ // Enchanted creature gets +1/+1 and has "Whenever this creature attacks, tap target creature defending player controls."
+ addCard(Zone.HAND, playerB, "Grasp of the Hieromancer");
+
+ castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Pentarch Ward", "Brago, King Eternal");
+ setChoice(playerB, "White");
+
+ castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Grasp of the Hieromancer", "Brago, King Eternal");
+
+ setStopAt(2, PhaseStep.BEGIN_COMBAT);
+ execute();
+
+ assertPermanentCount(playerB, "Pentarch Ward", 1);
+ assertHandCount(playerB, "Grasp of the Hieromancer", 1);
+ assertHandCount(playerB, 3);
+ }
+
+ /**
+ * Pentarch Ward on Brago naming white. Brago combat trigger resolves
+ * blinking Pentarch Ward. Brago retains protection from white even though
+ * Pentarch Ward is now exiled, making him unable to be re-enchanted by
+ * Pentarch Ward.
+ */
+ @Test
+ public void testGainLooseProtectionByEnchantment() {
+ addCard(Zone.BATTLEFIELD, playerB, "Plains", 3);
+ // Flying
+ // When Brago, King Eternal deals combat damage to a player, exile any number of target nonland permanents you control, then return those cards to the battlefield under their owner's control.
+ addCard(Zone.BATTLEFIELD, playerB, "Brago, King Eternal");
+ // Enchant creature
+ // When Pentarch Ward enters the battlefield, draw a card.
+ // As Pentarch Ward enters the battlefield, choose a color.
+ // Enchanted creature has protection from the chosen color. This effect doesn't remove Pentarch Ward.
+ addCard(Zone.HAND, playerB, "Pentarch Ward");// "{2}{W}"
+
+ castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Pentarch Ward", "Brago, King Eternal");
+ setChoice(playerB, "White");
+
+ attack(2, playerB, "Brago, King Eternal");
+ addTarget(playerB, "Pentarch Ward");
+ addTarget(playerB, "Brago, King Eternal");
+
+ setStopAt(2, PhaseStep.END_COMBAT);
+ execute();
+
+ assertLife(playerA, 18);
+ assertPermanentCount(playerB, "Pentarch Ward", 1);
+ assertHandCount(playerB, 3);
+ }
}
diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/replacement/ZoneChangeReplacementTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/replacement/ZoneChangeReplacementTest.java
index b2f712686de..b113e20ba6a 100644
--- a/Mage.Tests/src/test/java/org/mage/test/cards/replacement/ZoneChangeReplacementTest.java
+++ b/Mage.Tests/src/test/java/org/mage/test/cards/replacement/ZoneChangeReplacementTest.java
@@ -382,4 +382,39 @@ public class ZoneChangeReplacementTest extends CardTestPlayerBase {
}
+ /**
+ * I was using Anafenza, the Foremost as Commander. She attacked and traded
+ * with two creatures. I moved Anafenza to the Command Zone, but the
+ * opponent's creatures "when {this} dies" abilities triggered. Since
+ * Anafenza and those creatures all received lethal damage at the same time,
+ * the creatures should have been exiled due to Anafenza's replacement
+ * effect, but I guess since the logic asks if you want to use the Command
+ * Zone replacement effect first, that it doesn't see her leaving the
+ * battlefield at the same time as the other creatures.
+ *
+ * http://blogs.magicjudges.org/rulestips/2015/05/anafenza-vs-deathmist-raptor/
+ */
+ @Test
+ public void testAnafenzaExileInCombat() {
+ // Whenever Anafenza, the Foremost attacks, put a +1/+1 counter on another target tapped creature you control.
+ // If a creature card would be put into an opponent's graveyard from anywhere, exile it instead.
+ addCard(Zone.BATTLEFIELD, playerA, "Anafenza, the Foremost"); // 4/4
+
+ // Reach (This creature can block creatures with flying.)
+ addCard(Zone.BATTLEFIELD, playerB, "Skyraker Giant"); // 4/3
+
+ attack(2, playerB, "Skyraker Giant");
+ block(2, playerA, "Anafenza, the Foremost", "Skyraker Giant");
+
+ setStopAt(2, PhaseStep.POSTCOMBAT_MAIN);
+ execute();
+
+ assertLife(playerA, 20);
+ assertLife(playerB, 20);
+
+ assertExileCount("Skyraker Giant", 1);
+ assertPermanentCount(playerA, "Anafenza, the Foremost", 0);
+ assertGraveyardCount(playerA, "Anafenza, the Foremost", 1);
+
+ }
}
diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/TargetedTriggeredTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/TargetedTriggeredTest.java
new file mode 100644
index 00000000000..e0056f8638c
--- /dev/null
+++ b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/TargetedTriggeredTest.java
@@ -0,0 +1,67 @@
+/*
+ * 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 org.mage.test.cards.triggers;
+
+import mage.constants.PhaseStep;
+import mage.constants.Zone;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.mage.test.serverside.base.CardTestPlayerBase;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class TargetedTriggeredTest extends CardTestPlayerBase {
+
+ /**
+ * Tests that the first spell that targets Kira, Great Glass-Spinner is
+ * countered.
+ *
+ */
+ @Test
+ @Ignore
+ // this does currently not work in test, because the target event will be fired earlier during tests,
+ // so the zone change counter for the fixed target of the counterspell will not work
+ public void testKiraGreatGlassSpinnerFirstSpellTurn() {
+ addCard(Zone.BATTLEFIELD, playerA, "Mountain", 1);
+ addCard(Zone.HAND, playerA, "Lightning Bolt");
+
+ addCard(Zone.BATTLEFIELD, playerB, "Kira, Great Glass-Spinner", 1);
+
+ castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", "Kira, Great Glass-Spinner");
+
+ setStopAt(1, PhaseStep.BEGIN_COMBAT);
+ execute();
+
+ assertGraveyardCount(playerA, "Lightning Bolt", 1);
+
+ assertPermanentCount(playerB, "Kira, Great Glass-Spinner", 1);
+ }
+
+}
diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/state/PhyrexianDevourerTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/state/PhyrexianDevourerTest.java
new file mode 100644
index 00000000000..8b62413c146
--- /dev/null
+++ b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/state/PhyrexianDevourerTest.java
@@ -0,0 +1,71 @@
+/*
+ * 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 org.mage.test.cards.triggers.state;
+
+import mage.constants.PhaseStep;
+import mage.constants.Zone;
+import org.junit.Test;
+import org.mage.test.serverside.base.CardTestPlayerBase;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class PhyrexianDevourerTest extends CardTestPlayerBase {
+
+ /**
+ * Check that Phyrexian Devourer is sacrifriced as soon as the counters are
+ * added
+ *
+ */
+ @Test
+ public void testBoostChecked() {
+ // When Phyrexian Devourer's power is 7 or greater, sacrifice it.
+ // Exile the top card of your library: Put X +1/+1 counters on Phyrexian Devourer, where X is the exiled card's converted mana cost.
+ addCard(Zone.BATTLEFIELD, playerA, "Phyrexian Devourer");
+ addCard(Zone.LIBRARY, playerA, "Phyrexian Devourer");
+ skipInitShuffling();
+
+ addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion");
+
+ attack(2, playerB, "Silvercoat Lion");
+ block(2, playerA, "Phyrexian Devourer", "Silvercoat Lion");
+
+ activateAbility(2, PhaseStep.DECLARE_BLOCKERS, playerA, "Exile the top card of your library");
+
+ setStopAt(2, PhaseStep.POSTCOMBAT_MAIN);
+ execute();
+
+ assertGraveyardCount(playerA, "Phyrexian Devourer", 1);
+ assertExileCount("Phyrexian Devourer", 1);
+
+ assertPermanentCount(playerB, "Silvercoat Lion", 1);
+
+ }
+
+}
diff --git a/Mage.Tests/src/test/java/org/mage/test/commander/duel/AnafenzaTest.java b/Mage.Tests/src/test/java/org/mage/test/commander/duel/AnafenzaTest.java
new file mode 100644
index 00000000000..109b704982e
--- /dev/null
+++ b/Mage.Tests/src/test/java/org/mage/test/commander/duel/AnafenzaTest.java
@@ -0,0 +1,142 @@
+/*
+ * 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 org.mage.test.commander.duel;
+
+import java.io.FileNotFoundException;
+import mage.constants.PhaseStep;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.GameException;
+import org.junit.Test;
+import org.mage.test.serverside.base.CardTestCommanderDuelBase;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class AnafenzaTest extends CardTestCommanderDuelBase {
+
+ @Override
+ protected Game createNewGameAndPlayers() throws GameException, FileNotFoundException {
+ setDecknamePlayerA("CommanderAnafenza_WBG.dck"); // Commander = Anafenza, the Foremost
+ return super.createNewGameAndPlayers();
+ }
+
+ /**
+ * I was using Anafenza, the Foremost as Commander. She attacked and traded
+ * with two creatures. I moved Anafenza to the Command Zone, but the
+ * opponent's creatures "when {this} dies" abilities triggered. Since
+ * Anafenza and those creatures all received lethal damage at the same time,
+ * the creatures should have been exiled due to Anafenza's replacement
+ * effect, but I guess since the logic asks if you want to use the Command
+ * Zone replacement effect first, that it doesn't see her leaving the
+ * battlefield at the same time as the other creatures.
+ *
+ * http://blogs.magicjudges.org/rulestips/2015/05/anafenza-vs-deathmist-raptor/
+ */
+ @Test
+ public void testAnafenzaExileInCombat() {
+ addCard(Zone.BATTLEFIELD, playerA, "Plains", 1);
+ addCard(Zone.BATTLEFIELD, playerA, "Swamp", 1);
+ addCard(Zone.BATTLEFIELD, playerA, "Forest", 1);
+
+ // When Runed Servitor dies, each player draws a card.
+ addCard(Zone.BATTLEFIELD, playerB, "Runed Servitor", 2);
+
+ // Whenever Anafenza, the Foremost attacks, put a +1/+1 counter on another target tapped creature you control.
+ // If a creature card would be put into an opponent's graveyard from anywhere, exile it instead.
+ castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Anafenza, the Foremost");
+
+ attack(3, playerA, "Anafenza, the Foremost");
+ block(3, playerB, "Runed Servitor", "Anafenza, the Foremost");
+ block(3, playerB, "Runed Servitor", "Anafenza, the Foremost");
+
+ setStopAt(3, PhaseStep.POSTCOMBAT_MAIN);
+ execute();
+
+ assertLife(playerA, 40);
+ assertLife(playerB, 40);
+
+ assertExileCount("Runed Servitor", 2);
+
+ assertCommandZoneCount(playerA, "Anafenza, the Foremost", 1);
+ assertGraveyardCount(playerA, "Anafenza, the Foremost", 0);
+
+ assertHandCount(playerA, 1); // turn 3 draw
+ assertHandCount(playerB, 1); // turn 2 draw
+
+ }
+
+ /**
+ * Token don't go to exile because they are no creature cards
+ */
+ @Test
+ public void testAnafenzaExileInCombatOmnathToken() {
+ addCard(Zone.BATTLEFIELD, playerA, "Plains", 1);
+ addCard(Zone.BATTLEFIELD, playerA, "Swamp", 1);
+ addCard(Zone.BATTLEFIELD, playerA, "Forest", 1);
+ addCard(Zone.BATTLEFIELD, playerA, "Acidic Slime", 1);
+
+ addCard(Zone.HAND, playerB, "Forest", 2);
+ // Landfall - Whenever a land enters the battlefield under your control, put a 5/5 red and green Elemental creature token onto the battlefield.
+ // Whenever Omnath, Locus of Rage or another Elemental you control dies, Omnath deals 3 damage to target creature or player.
+ addCard(Zone.BATTLEFIELD, playerB, "Omnath, Locus of Rage", 1);
+
+ // Whenever Anafenza, the Foremost attacks, put a +1/+1 counter on another target tapped creature you control.
+ // If a creature card would be put into an opponent's graveyard from anywhere, exile it instead.
+ castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Anafenza, the Foremost");
+
+ playLand(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Forest");
+ playLand(4, PhaseStep.PRECOMBAT_MAIN, playerB, "Forest");
+
+ attack(5, playerA, "Acidic Slime");
+ block(5, playerB, "Elemental", "Acidic Slime");
+ attack(5, playerA, "Anafenza, the Foremost");
+ block(5, playerB, "Elemental", "Anafenza, the Foremost");
+ addTarget(playerB, playerA);
+
+ setStopAt(5, PhaseStep.POSTCOMBAT_MAIN);
+ execute();
+
+ assertExileCount(playerA, 0);
+ assertExileCount(playerB, 0);
+
+ assertPermanentCount(playerB, "Elemental", 1);
+
+ assertGraveyardCount(playerA, "Acidic Slime", 1);
+ assertGraveyardCount(playerA, "Anafenza, the Foremost", 0);
+ assertCommandZoneCount(playerA, "Anafenza, the Foremost", 1);
+
+ assertHandCount(playerA, 2); // turn 3 + 5 draw
+ assertHandCount(playerB, 2); // turn 2 + 4 draw
+
+ assertLife(playerA, 37);
+ assertLife(playerB, 40);
+ }
+
+}
diff --git a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java
index eb098ea1829..51027f1e2f9 100644
--- a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java
+++ b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java
@@ -53,6 +53,7 @@ import mage.cards.Card;
import mage.cards.Cards;
import mage.cards.decks.Deck;
import mage.choices.Choice;
+import mage.constants.AbilityType;
import mage.constants.ManaType;
import mage.constants.Outcome;
import mage.constants.PhaseStep;
@@ -70,6 +71,7 @@ import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.NamePredicate;
import mage.filter.predicate.permanent.AttackingPredicate;
import mage.filter.predicate.permanent.BlockingPredicate;
+import mage.filter.predicate.permanent.SummoningSicknessPredicate;
import mage.game.Game;
import mage.game.Graveyard;
import mage.game.Table;
@@ -97,6 +99,7 @@ import mage.target.common.TargetCardInHand;
import mage.target.common.TargetCardInLibrary;
import mage.target.common.TargetCreaturePermanentAmount;
import mage.target.common.TargetPermanentOrPlayer;
+import mage.util.MessageToClient;
import org.junit.Ignore;
/**
@@ -476,6 +479,7 @@ public class TestPlayer implements Player {
FilterCreatureForCombat filter = new FilterCreatureForCombat();
filter.add(new NamePredicate(groups[0]));
filter.add(Predicates.not(new AttackingPredicate()));
+ filter.add(Predicates.not(new SummoningSicknessPredicate()));
Permanent attacker = findPermanent(filter, computerPlayer.getId(), game);
if (attacker != null && attacker.canAttack(defenderId, game)) {
computerPlayer.declareAttacker(attacker.getId(), defenderId, game, false);
@@ -569,21 +573,37 @@ public class TestPlayer implements Player {
String[] targetList = choose2.split("\\^");
boolean targetFound = false;
for (String targetName : targetList) {
+ boolean originOnly = false;
+ boolean copyOnly = false;
+ if (targetName.endsWith("]")) {
+ if (targetName.endsWith("[no copy]")) {
+ originOnly = true;
+ targetName = targetName.substring(0, targetName.length() - 9);
+ }
+ if (targetName.endsWith("[only copy]")) {
+ copyOnly = true;
+ targetName = targetName.substring(0, targetName.length() - 11);
+ }
+ }
for (Permanent permanent : game.getBattlefield().getAllActivePermanents(filterPermanent, game)) {
if (target.getTargets().contains(permanent.getId())) {
continue;
}
if (permanent.getName().equals(targetName)) {
if (target.isNotTarget() || ((TargetPermanent) target).canTarget(computerPlayer.getId(), permanent.getId(), null, game)) {
- target.add(permanent.getId(), game);
- targetFound = true;
- break;
+ if ((permanent.isCopy() && !originOnly) || (!permanent.isCopy() && !copyOnly)) {
+ target.add(permanent.getId(), game);
+ targetFound = true;
+ break;
+ }
}
} else if ((permanent.getName() + "-" + permanent.getExpansionSetCode()).equals(targetName)) {
if (target.isNotTarget() || ((TargetPermanent) target).canTarget(computerPlayer.getId(), permanent.getId(), null, game)) {
- target.add(permanent.getId(), game);
- targetFound = true;
- break;
+ if ((permanent.isCopy() && !originOnly) || (!permanent.isCopy() && !copyOnly)) {
+ target.add(permanent.getId(), game);
+ targetFound = true;
+ break;
+ }
}
}
}
@@ -797,6 +817,14 @@ public class TestPlayer implements Player {
@Override
public boolean chooseUse(Outcome outcome, String message, Ability source, Game game) {
+ return this.chooseUse(outcome, new MessageToClient(message), source, game);
+ }
+
+ @Override
+ public boolean chooseUse(Outcome outcome, MessageToClient message, Ability source, Game game) {
+ if (message.getMessage().equals("Scry 1?")) {
+ return false;
+ }
if (!choices.isEmpty()) {
if (choices.get(0).equals("No")) {
choices.remove(0);
@@ -807,7 +835,7 @@ public class TestPlayer implements Player {
return true;
}
}
- return true;
+ return computerPlayer.chooseUse(outcome, message, source, game);
}
@Override
@@ -1816,6 +1844,16 @@ public class TestPlayer implements Player {
return computerPlayer.getMatchPlayer();
}
+ @Override
+ public AbilityType getJustActivatedType() {
+ return computerPlayer.getJustActivatedType();
+ }
+
+ @Override
+ public void setJustActivatedType(AbilityType justActivatedType) {
+ computerPlayer.setJustActivatedType(justActivatedType);
+ }
+
@Override
public void cleanUpOnMatchEnd() {
computerPlayer.cleanUpOnMatchEnd();
@@ -1897,6 +1935,11 @@ public class TestPlayer implements Player {
computerPlayer.pickCard(cards, deck, draft);
}
+ @Override
+ public boolean scry(int value, Ability source, Game game) {
+ return computerPlayer.scry(value, source, game);
+ }
+
public void setAIPlayer(boolean AIPlayer) {
this.AIPlayer = AIPlayer;
}
diff --git a/Mage.Tests/src/test/java/org/mage/test/serverside/base/CardTestAPI.java b/Mage.Tests/src/test/java/org/mage/test/serverside/base/CardTestAPI.java
index 67cf6484b5f..08b16ef8861 100644
--- a/Mage.Tests/src/test/java/org/mage/test/serverside/base/CardTestAPI.java
+++ b/Mage.Tests/src/test/java/org/mage/test/serverside/base/CardTestAPI.java
@@ -8,8 +8,6 @@ import mage.filter.Filter;
import mage.players.Player;
import org.mage.test.player.TestPlayer;
-
-
/**
* Interface for all test initialization and assertion operations.
*/
@@ -19,21 +17,23 @@ public interface CardTestAPI {
* Types of game result.
*/
public enum GameResult {
+
WON,
LOST,
DRAW
}
//******* INITIALIZATION METHODS *******/
-
/**
- * Default game initialization params for red player (that plays with Mountains)
+ * Default game initialization params for red player (that plays with
+ * Mountains)
*/
void useRedDefault();
/**
- * Removes all cards from player's library from the game.
- * Usually this should be used once before initialization to form the library in certain order.
+ * Removes all cards from player's library from the game. Usually this
+ * should be used once before initialization to form the library in certain
+ * order.
*
* @param player {@link Player} to remove all library cards from.
*/
@@ -43,7 +43,8 @@ public interface CardTestAPI {
* Add a card to specified zone of specified player.
*
* @param gameZone {@link mage.constants.Zone} to add cards to.
- * @param player {@link Player} to add cards for. Use either playerA or playerB.
+ * @param player {@link Player} to add cards for. Use either playerA or
+ * playerB.
* @param cardName Card name in string format.
*/
void addCard(Zone gameZone, TestPlayer player, String cardName);
@@ -52,9 +53,10 @@ public interface CardTestAPI {
* Add any amount of cards to specified zone of specified player.
*
* @param gameZone {@link mage.constants.Zone} to add cards to.
- * @param player {@link Player} to add cards for. Use either playerA or playerB.
+ * @param player {@link Player} to add cards for. Use either playerA or
+ * playerB.
* @param cardName Card name in string format.
- * @param count Amount of cards to be added.
+ * @param count Amount of cards to be added.
*/
void addCard(Zone gameZone, TestPlayer player, String cardName, int count);
@@ -62,11 +64,13 @@ public interface CardTestAPI {
* Add any amount of cards to specified zone of specified player.
*
* @param gameZone {@link mage.constants.Zone} to add cards to.
- * @param player {@link Player} to add cards for. Use either playerA or playerB.
+ * @param player {@link Player} to add cards for. Use either playerA or
+ * playerB.
* @param cardName Card name in string format.
- * @param count Amount of cards to be added.
- * @param tapped In case gameZone is Battlefield, determines whether permanent should be tapped.
- * In case gameZone is other than Battlefield, {@link IllegalArgumentException} is thrown
+ * @param count Amount of cards to be added.
+ * @param tapped In case gameZone is Battlefield, determines whether
+ * permanent should be tapped. In case gameZone is other than Battlefield,
+ * {@link IllegalArgumentException} is thrown
*/
void addCard(Zone gameZone, TestPlayer player, String cardName, int count, boolean tapped);
@@ -74,27 +78,27 @@ public interface CardTestAPI {
* Set player's initial life count.
*
* @param player {@link Player} to set life count for.
- * @param life Life count to set.
+ * @param life Life count to set.
*/
void setLife(TestPlayer player, int life);
//******* GAME OPTIONS *******/
-
/**
* Define turn number to stop the game on.
+ *
* @param turn
*/
void setStopOnTurn(int turn);
/**
* Define the turn number and step to stop the game on.
+ *
* @param turn
* @param step
*/
void setStopAt(int turn, PhaseStep step);
//******* ASSERT METHODS *******/
-
/**
* Assert turn number after test execution.
*
@@ -114,26 +118,26 @@ public interface CardTestAPI {
* Assert player's life count after test execution.
*
* @param player {@link Player} to get life for comparison.
- * @param life Expected player's life to compare with.
+ * @param life Expected player's life to compare with.
*/
void assertLife(Player player, int life) throws AssertionError;
/**
* Assert creature's power and toughness by card name.
*
- * Throws {@link AssertionError} in the following cases:
- * 1. no such player
- * 2. no such creature under player's control
- * 3. depending on comparison scope:
- * 3a. any: no creature under player's control with the specified p\t params
- * 3b. all: there is at least one creature with the cardName with the different p\t params
+ * Throws {@link AssertionError} in the following cases: 1. no such player
+ * 2. no such creature under player's control 3. depending on comparison
+ * scope: 3a. any: no creature under player's control with the specified p\t
+ * params 3b. all: there is at least one creature with the cardName with the
+ * different p\t params
*
- * @param player {@link Player} to get creatures for comparison.
- * @param cardName Card name to compare with.
- * @param power Expected power to compare with.
+ * @param player {@link Player} to get creatures for comparison.
+ * @param cardName Card name to compare with.
+ * @param power Expected power to compare with.
* @param toughness Expected toughness to compare with.
- * @param scope {@link Filter.ComparisonScope} Use ANY, if you want "at least one creature with given name should have specified p\t"
- * Use ALL, if you want "all creature with gived name should have specified p\t"
+ * @param scope {@link Filter.ComparisonScope} Use ANY, if you want "at
+ * least one creature with given name should have specified p\t" Use ALL, if
+ * you want "all creature with gived name should have specified p\t"
*/
void assertPowerToughness(Player player, String cardName, int power, int toughness, Filter.ComparisonScope scope)
throws AssertionError;
@@ -141,13 +145,12 @@ public interface CardTestAPI {
/**
* Assert creature's abilities.
*
- * Throws {@link AssertionError} in the following cases:
- * 1. no such player
- * 2. no such creature under player's control
- * 3. there is more than one creature with such name
+ * Throws {@link AssertionError} in the following cases: 1. no such player
+ * 2. no such creature under player's control 3. there is more than one
+ * creature with such name
*
- * @param player {@link Player} to get creatures for comparison.
- * @param cardName Card name to compare with.
+ * @param player {@link Player} to get creatures for comparison.
+ * @param cardName Card name to compare with.
* @param abilities Expected abilities
*/
void assertAbilities(Player player, String cardName, List abilities)
@@ -157,7 +160,7 @@ public interface CardTestAPI {
* Assert permanent count under player's control.
*
* @param player {@link Player} which permanents should be counted.
- * @param count Expected count.
+ * @param count Expected count.
*/
void assertPermanentCount(Player player, int count) throws AssertionError;
@@ -166,7 +169,26 @@ public interface CardTestAPI {
*
* @param player {@link Player} which permanents should be counted.
* @param cardName Name of the cards that should be counted.
- * @param count Expected count.
+ * @param count Expected count.
*/
void assertPermanentCount(Player player, String cardName, int count) throws AssertionError;
+
+ /**
+ * Assert command zone object count in player's command zone
+ *
+ * @param player {@link Player} which permanents should be counted.
+ * @param commandZoneObjectName Name of the commander or emblem that should
+ * be counted.
+ * @param count Expected count.
+ */
+ void assertCommandZoneCount(Player player, String commandZoneObjectName, int count) throws AssertionError;
+
+ /**
+ * Assert emblem count under player's control
+ *
+ * @param player
+ * @param count
+ * @throws AssertionError
+ */
+ void assertEmblemCount(Player player, int count) throws AssertionError;
}
diff --git a/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java b/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java
index d40b5113bff..1114d2d0732 100644
--- a/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java
+++ b/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java
@@ -577,6 +577,17 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement
Assert.assertEquals("(Battlefield) Card counts are not equal (" + cardName + ")", count, actualCount);
}
+ @Override
+ public void assertCommandZoneCount(Player player, String commandZoneObjectName, int count) throws AssertionError {
+ int actualCount = 0;
+ for (CommandObject commandObject : currentGame.getState().getCommand()) {
+ if (commandObject.getControllerId().equals(player.getId()) && commandObject.getName().equals(commandZoneObjectName)) {
+ actualCount++;
+ }
+ }
+ Assert.assertEquals("(Command Zone) Card counts are not equal (" + commandZoneObjectName + ")", count, actualCount);
+ }
+
/**
* Assert emblem count under player's control
*
@@ -584,6 +595,7 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement
* @param count
* @throws AssertionError
*/
+ @Override
public void assertEmblemCount(Player player, int count) throws AssertionError {
int actualCount = 0;
for (CommandObject commandObject : currentGame.getState().getCommand()) {
@@ -765,7 +777,7 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement
*/
public void assertHandCount(Player player, int count) throws AssertionError {
int actual = currentGame.getPlayer(player.getId()).getHand().size();
- Assert.assertEquals("(Hand) Card counts are not equal ", count, actual);
+ Assert.assertEquals("(Hand " + player.getName() + ") Card counts are not equal ", count, actual);
}
/**
@@ -779,7 +791,7 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement
FilterCard filter = new FilterCard();
filter.add(new NamePredicate(cardName));
int actual = currentGame.getPlayer(player.getId()).getHand().count(filter, player.getId(), currentGame);
- Assert.assertEquals("(Hand) Card counts for card " + cardName + " are not equal ", count, actual);
+ Assert.assertEquals("(Hand) Card counts for card " + cardName + " for " + player.getName() + " are not equal ", count, actual);
}
/**
diff --git a/Mage.Updater/pom.xml b/Mage.Updater/pom.xml
index 90d4db3a1a6..97c617af46e 100644
--- a/Mage.Updater/pom.xml
+++ b/Mage.Updater/pom.xml
@@ -5,7 +5,7 @@
mage-root
org.mage
- 1.4.3
+ 1.4.4
4.0.0
diff --git a/Mage/pom.xml b/Mage/pom.xml
index c13b047036a..bd275a8c4b7 100644
--- a/Mage/pom.xml
+++ b/Mage/pom.xml
@@ -7,7 +7,7 @@
org.mage
mage-root
- 1.4.3
+ 1.4.4
mage
diff --git a/Mage/src/mage/abilities/AbilityImpl.java b/Mage/src/mage/abilities/AbilityImpl.java
index d9723850a2e..7006eeebdc2 100644
--- a/Mage/src/mage/abilities/AbilityImpl.java
+++ b/Mage/src/mage/abilities/AbilityImpl.java
@@ -237,6 +237,7 @@ public abstract class AbilityImpl implements Ability {
*/
if (effect.applyEffectsAfter()) {
game.applyEffects();
+ game.getState().getTriggers().checkStateTriggers(game);
}
}
}
diff --git a/Mage/src/mage/abilities/StateTriggeredAbility.java b/Mage/src/mage/abilities/StateTriggeredAbility.java
index 1c8cfadfb37..45425d8b32c 100644
--- a/Mage/src/mage/abilities/StateTriggeredAbility.java
+++ b/Mage/src/mage/abilities/StateTriggeredAbility.java
@@ -1,16 +1,16 @@
/*
* 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
@@ -20,12 +20,11 @@
* 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.abilities;
import java.util.UUID;
@@ -48,8 +47,7 @@ public abstract class StateTriggeredAbility extends TriggeredAbilityImpl {
super(ability);
}
- @Override
- public final boolean checkEventType(GameEvent event, Game game) {
+ public boolean canTrigger(Game game) {
//20100716 - 603.8
Boolean triggered = (Boolean) game.getState().getValue(getSourceId().toString() + "triggered");
if (triggered == null) {
@@ -58,7 +56,11 @@ public abstract class StateTriggeredAbility extends TriggeredAbilityImpl {
return !triggered;
}
-
+ @Override
+ public final boolean checkEventType(GameEvent event, Game game) {
+ return false;
+ }
+
@Override
public void trigger(Game game, UUID controllerId) {
//20100716 - 603.8
@@ -71,7 +73,7 @@ public abstract class StateTriggeredAbility extends TriggeredAbilityImpl {
//20100716 - 603.8
boolean result = super.resolve(game);
game.getState().setValue(this.getSourceId().toString() + "triggered", Boolean.FALSE);
- return result;
+ return result;
}
public void counter(Game game) {
diff --git a/Mage/src/mage/abilities/TriggeredAbilities.java b/Mage/src/mage/abilities/TriggeredAbilities.java
index 969e3cb78fa..599e44068c0 100644
--- a/Mage/src/mage/abilities/TriggeredAbilities.java
+++ b/Mage/src/mage/abilities/TriggeredAbilities.java
@@ -69,45 +69,57 @@ public class TriggeredAbilities extends ConcurrentHashMap it = this.values().iterator(); it.hasNext();) {
+ TriggeredAbility ability = it.next();
+ if (ability instanceof StateTriggeredAbility && ((StateTriggeredAbility) ability).canTrigger(game)) {
+ checkTrigger(ability, null, game);
+ }
+ }
+ }
+
public void checkTriggers(GameEvent event, Game game) {
for (Iterator it = this.values().iterator(); it.hasNext();) {
TriggeredAbility ability = it.next();
- if (!ability.checkEventType(event, game)) {
- continue;
+ if (ability.checkEventType(event, game)) {
+ checkTrigger(ability, event, game);
}
- // for effects like when leaves battlefield or destroyed use ShortLKI to check if permanent was in the correct zone before (e.g. Oblivion Ring or Karmic Justice)
- MageObject object = game.getObject(ability.getSourceId());
- if (ability.isInUseableZone(game, object, event)) {
- if (!game.getContinuousEffects().preventedByRuleModification(event, ability, game, false)) {
- if (object != null) {
- boolean controllerSet = false;
- if (!ability.getZone().equals(Zone.COMMAND) && event.getTargetId() != null && event.getTargetId().equals(ability.getSourceId())
- && (event.getType().equals(EventType.ZONE_CHANGE) || event.getType().equals(EventType.DESTROYED_PERMANENT))) {
- // need to check if object was face down for dies and destroy events because the ability triggers in the new zone, zone counter -1 is used
- Permanent permanent = (Permanent) game.getLastKnownInformation(ability.getSourceId(), Zone.BATTLEFIELD, ability.getSourceObjectZoneChangeCounter() - 1);
- if (permanent != null) {
- if (!ability.getWorksFaceDown() && permanent.isFaceDown(game)) {
- continue;
- }
- controllerSet = true;
- ability.setControllerId(permanent.getControllerId());
- }
- }
- if (!controllerSet) {
- if (object instanceof Permanent) {
- ability.setControllerId(((Permanent) object).getControllerId());
- } else if (object instanceof Spell) {
- // needed so that cast triggered abilities have to correct controller (e.g. Ulamog, the Infinite Gyre).
- ability.setControllerId(((Spell) object).getControllerId());
- } else if (object instanceof Card) {
- ability.setControllerId(((Card) object).getOwnerId());
- }
- }
- }
+ }
+ }
- if (ability.checkTrigger(event, game)) {
- ability.trigger(game, ability.getControllerId());
+ private void checkTrigger(TriggeredAbility ability, GameEvent event, Game game) {
+ // for effects like when leaves battlefield or destroyed use ShortLKI to check if permanent was in the correct zone before (e.g. Oblivion Ring or Karmic Justice)
+ MageObject object = game.getObject(ability.getSourceId());
+ if (ability.isInUseableZone(game, object, event)) {
+ if (event == null || !game.getContinuousEffects().preventedByRuleModification(event, ability, game, false)) {
+ if (object != null) {
+ boolean controllerSet = false;
+ if (!ability.getZone().equals(Zone.COMMAND) && event != null && event.getTargetId() != null && event.getTargetId().equals(ability.getSourceId())
+ && (event.getType().equals(EventType.ZONE_CHANGE) || event.getType().equals(EventType.DESTROYED_PERMANENT))) {
+ // need to check if object was face down for dies and destroy events because the ability triggers in the new zone, zone counter -1 is used
+ Permanent permanent = (Permanent) game.getLastKnownInformation(ability.getSourceId(), Zone.BATTLEFIELD, ability.getSourceObjectZoneChangeCounter() - 1);
+ if (permanent != null) {
+ if (!ability.getWorksFaceDown() && permanent.isFaceDown(game)) {
+ return;
+ }
+ controllerSet = true;
+ ability.setControllerId(permanent.getControllerId());
+ }
}
+ if (!controllerSet) {
+ if (object instanceof Permanent) {
+ ability.setControllerId(((Permanent) object).getControllerId());
+ } else if (object instanceof Spell) {
+ // needed so that cast triggered abilities have to correct controller (e.g. Ulamog, the Infinite Gyre).
+ ability.setControllerId(((Spell) object).getControllerId());
+ } else if (object instanceof Card) {
+ ability.setControllerId(((Card) object).getOwnerId());
+ }
+ }
+ }
+
+ if (ability.checkTrigger(event, game)) {
+ ability.trigger(game, ability.getControllerId());
}
}
}
diff --git a/Mage/src/mage/abilities/common/AllyEntersBattlefieldTriggeredAbility.java b/Mage/src/mage/abilities/common/AllyEntersBattlefieldTriggeredAbility.java
index 341e1161952..9252d5d9e0d 100644
--- a/Mage/src/mage/abilities/common/AllyEntersBattlefieldTriggeredAbility.java
+++ b/Mage/src/mage/abilities/common/AllyEntersBattlefieldTriggeredAbility.java
@@ -27,14 +27,12 @@
*/
package mage.abilities.common;
-import java.util.UUID;
-import mage.constants.Zone;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.effects.Effect;
+import mage.constants.Zone;
import mage.game.Game;
+import mage.game.events.EntersTheBattlefieldEvent;
import mage.game.events.GameEvent;
-import mage.game.events.GameEvent.EventType;
-import mage.game.permanent.Permanent;
/**
*
@@ -57,11 +55,10 @@ public class AllyEntersBattlefieldTriggeredAbility extends TriggeredAbilityImpl
@Override
public boolean checkTrigger(GameEvent event, Game game) {
- UUID targetId = event.getTargetId();
- Permanent permanent = game.getPermanent(targetId);
- if (permanent.getControllerId().equals(this.controllerId)
- && (targetId.equals(this.getSourceId())
- || (permanent.hasSubtype("Ally") && !targetId.equals(this.getSourceId())))) {
+ EntersTheBattlefieldEvent ebe = (EntersTheBattlefieldEvent) event;
+ if (ebe.getTarget().getControllerId().equals(this.controllerId)
+ && (event.getTargetId().equals(this.getSourceId())
+ || (ebe.getTarget().hasSubtype("Ally") && !event.getTargetId().equals(this.getSourceId())))) {
return true;
}
return false;
@@ -69,7 +66,7 @@ public class AllyEntersBattlefieldTriggeredAbility extends TriggeredAbilityImpl
@Override
public String getRule() {
- return "Whenever {this} or another Ally enters the battlefield under your control, " + super.getRule();
+ return "Rally — Whenever {this} or another Ally enters the battlefield under your control, " + super.getRule();
}
@Override
diff --git a/Mage/src/mage/abilities/common/AttacksAloneTriggeredAbility.java b/Mage/src/mage/abilities/common/AttacksAloneTriggeredAbility.java
new file mode 100644
index 00000000000..bcbf272c1ec
--- /dev/null
+++ b/Mage/src/mage/abilities/common/AttacksAloneTriggeredAbility.java
@@ -0,0 +1,86 @@
+/*
+ * 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.abilities.common;
+
+import java.util.UUID;
+import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.effects.Effect;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.events.GameEvent.EventType;
+import mage.game.events.GameEvent;
+import mage.target.targetpointer.FixedTarget;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class AttacksAloneTriggeredAbility extends TriggeredAbilityImpl {
+
+ public AttacksAloneTriggeredAbility(Effect effect) {
+ super(Zone.BATTLEFIELD, effect);
+ }
+
+ public AttacksAloneTriggeredAbility(final AttacksAloneTriggeredAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public AttacksAloneTriggeredAbility copy() {
+ return new AttacksAloneTriggeredAbility(this);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == EventType.DECLARED_ATTACKERS;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ if(game.getActivePlayerId().equals(this.controllerId) ) {
+ UUID creatureId = this.getSourceId();
+ if(creatureId != null) {
+ if(game.getCombat().attacksAlone() && creatureId == game.getCombat().getAttackers().get(0)) {
+ UUID defender = game.getCombat().getDefenderId(creatureId);
+ if(defender != null) {
+ for(Effect effect: getEffects()) {
+ effect.setTargetPointer(new FixedTarget(defender));
+ }
+ }
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public String getRule() {
+ return "Whenever {this} attacks alone, " + super.getRule();
+ }
+}
diff --git a/Mage/src/mage/abilities/common/AttacksAndIsNotBlockedTriggeredAbility.java b/Mage/src/mage/abilities/common/AttacksAndIsNotBlockedTriggeredAbility.java
new file mode 100644
index 00000000000..d03ae849027
--- /dev/null
+++ b/Mage/src/mage/abilities/common/AttacksAndIsNotBlockedTriggeredAbility.java
@@ -0,0 +1,96 @@
+/*
+ * 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.abilities.common;
+
+import mage.abilities.TriggeredAbilityImpl;
+import mage.abilities.effects.Effect;
+import mage.constants.Duration;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.combat.CombatGroup;
+import mage.game.events.GameEvent.EventType;
+import mage.game.events.GameEvent;
+import mage.game.permanent.Permanent;
+import mage.target.targetpointer.FixedTarget;
+
+public class AttacksAndIsNotBlockedTriggeredAbility extends TriggeredAbilityImpl {
+
+ private boolean setTargetPointer;
+
+ public AttacksAndIsNotBlockedTriggeredAbility(Effect effect) {
+ this(effect, false, false);
+ }
+
+ public AttacksAndIsNotBlockedTriggeredAbility(Effect effect, boolean optional) {
+ this(effect, optional, false);
+ }
+
+ public AttacksAndIsNotBlockedTriggeredAbility(Effect effect, boolean optional, boolean setTargetPointer) {
+ super(Zone.BATTLEFIELD, effect, optional);
+ this.setTargetPointer = setTargetPointer;
+ }
+
+ public AttacksAndIsNotBlockedTriggeredAbility(final AttacksAndIsNotBlockedTriggeredAbility ability) {
+ super(ability);
+ this.setTargetPointer = ability.setTargetPointer;
+ }
+
+ @Override
+ public AttacksAndIsNotBlockedTriggeredAbility copy() {
+ return new AttacksAndIsNotBlockedTriggeredAbility(this);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return event.getType() == EventType.DECLARED_BLOCKERS;
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ Permanent sourcePermanent = game.getPermanent(getSourceId());
+ if(sourcePermanent.isAttacking()) {
+ for(CombatGroup combatGroup: game.getCombat().getGroups()) {
+ if(combatGroup.getBlockers().isEmpty() && combatGroup.getAttackers().contains(getSourceId())) {
+ if(setTargetPointer) {
+ for(Effect effect : this.getEffects()) {
+ effect.setTargetPointer(new FixedTarget(game.getCombat().getDefendingPlayerId(getSourceId(), game)));
+ }
+ }
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public String getRule() {
+ return "Whenever {this} attacks and isn't blocked, " + super.getRule();
+ }
+}
diff --git a/Mage/src/mage/abilities/common/AttacksEachCombatStaticAbility.java b/Mage/src/mage/abilities/common/AttacksEachCombatStaticAbility.java
index adb4be894b1..9f520471526 100644
--- a/Mage/src/mage/abilities/common/AttacksEachCombatStaticAbility.java
+++ b/Mage/src/mage/abilities/common/AttacksEachCombatStaticAbility.java
@@ -14,7 +14,6 @@ import mage.constants.Zone;
*
* @author LevelX2
*/
-
public class AttacksEachCombatStaticAbility extends StaticAbility {
public AttacksEachCombatStaticAbility() {
diff --git a/Mage/src/mage/abilities/common/DealsDamageToAPlayerAllTriggeredAbility.java b/Mage/src/mage/abilities/common/DealsDamageToAPlayerAllTriggeredAbility.java
index 69ac883329d..a06bfef568d 100644
--- a/Mage/src/mage/abilities/common/DealsDamageToAPlayerAllTriggeredAbility.java
+++ b/Mage/src/mage/abilities/common/DealsDamageToAPlayerAllTriggeredAbility.java
@@ -1,16 +1,16 @@
/*
* 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
@@ -20,12 +20,11 @@
* 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.abilities.common;
import mage.abilities.TriggeredAbilityImpl;
@@ -43,8 +42,8 @@ import mage.target.targetpointer.FixedTarget;
*
* @author LevelX2
*/
-
public class DealsDamageToAPlayerAllTriggeredAbility extends TriggeredAbilityImpl {
+
private final FilterPermanent filter;
private final SetTargetPointer setTargetPointer;
private final boolean onlyCombat;
@@ -81,12 +80,12 @@ public class DealsDamageToAPlayerAllTriggeredAbility extends TriggeredAbilityImp
if (!setTargetPointer.equals(SetTargetPointer.NONE)) {
for (Effect effect : this.getEffects()) {
effect.setValue("damage", event.getAmount());
- switch(setTargetPointer) {
+ switch (setTargetPointer) {
case PLAYER:
effect.setTargetPointer(new FixedTarget(permanent.getControllerId()));
break;
case PERMANENT:
- effect.setTargetPointer(new FixedTarget(permanent.getId()));
+ effect.setTargetPointer(new FixedTarget(permanent.getId(), permanent.getZoneChangeCounter(game)));
break;
}
@@ -100,7 +99,7 @@ public class DealsDamageToAPlayerAllTriggeredAbility extends TriggeredAbilityImp
@Override
public String getRule() {
- return "Whenever " + filter.getMessage() + " deals "+(onlyCombat ? "combat ":"") + "damage to a player, " + super.getRule();
+ return "Whenever " + filter.getMessage() + " deals " + (onlyCombat ? "combat " : "") + "damage to a player, " + super.getRule();
}
}
diff --git a/Mage/src/mage/abilities/common/DiesThisOrAnotherCreatureTriggeredAbility.java b/Mage/src/mage/abilities/common/DiesThisOrAnotherCreatureTriggeredAbility.java
index 2e8aefd917d..494c05fa7bd 100644
--- a/Mage/src/mage/abilities/common/DiesThisOrAnotherCreatureTriggeredAbility.java
+++ b/Mage/src/mage/abilities/common/DiesThisOrAnotherCreatureTriggeredAbility.java
@@ -28,9 +28,9 @@
package mage.abilities.common;
import mage.MageObject;
-import mage.constants.Zone;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.effects.Effect;
+import mage.constants.Zone;
import mage.filter.common.FilterCreaturePermanent;
import mage.game.Game;
import mage.game.events.GameEvent;
@@ -67,7 +67,7 @@ public class DiesThisOrAnotherCreatureTriggeredAbility extends TriggeredAbilityI
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.ZONE_CHANGE;
}
-
+
@Override
public boolean isInUseableZone(Game game, MageObject source, GameEvent event) {
Permanent sourcePermanent;
@@ -81,24 +81,21 @@ public class DiesThisOrAnotherCreatureTriggeredAbility extends TriggeredAbilityI
}
return hasSourceObjectAbility(game, sourcePermanent, event);
}
-
+
@Override
public boolean checkTrigger(GameEvent event, Game game) {
ZoneChangeEvent zEvent = (ZoneChangeEvent) event;
- if (game.getPermanent(sourceId) == null) {
- if (game.getLastKnownInformation(sourceId, Zone.BATTLEFIELD) == null) {
- return false;
- }
+ if (game.getPermanentOrLKIBattlefield(getSourceId()) == null) {
+ return false;
}
if (zEvent.getFromZone() == Zone.BATTLEFIELD && zEvent.getToZone() == Zone.GRAVEYARD) {
- Permanent permanent = (Permanent) game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD);
- if (permanent != null) {
- if (permanent.getId().equals(this.getSourceId())) {
+ if (zEvent.getTarget() != null) {
+ if (zEvent.getTarget().getId().equals(this.getSourceId())) {
return true;
} else {
- if (filter.match(permanent, sourceId, controllerId, game)) {
+ if (filter.match(zEvent.getTarget(), sourceId, controllerId, game)) {
return true;
}
}
diff --git a/Mage/src/mage/abilities/common/DiscardsACardOpponentTriggeredAbility.java b/Mage/src/mage/abilities/common/DiscardsACardOpponentTriggeredAbility.java
index f922f325ee7..d6dc5bfc459 100644
--- a/Mage/src/mage/abilities/common/DiscardsACardOpponentTriggeredAbility.java
+++ b/Mage/src/mage/abilities/common/DiscardsACardOpponentTriggeredAbility.java
@@ -53,6 +53,8 @@ public class DiscardsACardOpponentTriggeredAbility extends TriggeredAbilityImpl
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
break;
+ case NONE:
+ break;
default:
throw new UnsupportedOperationException(setTargetPointer.toString() + " not supported for this ability.");
}
diff --git a/Mage/src/mage/abilities/common/PayMoreToCastAsThoughtItHadFlashAbility.java b/Mage/src/mage/abilities/common/PayMoreToCastAsThoughtItHadFlashAbility.java
index 7045c08433b..d36f220ea0a 100644
--- a/Mage/src/mage/abilities/common/PayMoreToCastAsThoughtItHadFlashAbility.java
+++ b/Mage/src/mage/abilities/common/PayMoreToCastAsThoughtItHadFlashAbility.java
@@ -6,6 +6,7 @@
package mage.abilities.common;
import mage.abilities.SpellAbility;
+import mage.abilities.costs.mana.ManaCost;
import mage.abilities.costs.mana.ManaCosts;
import mage.cards.Card;
import mage.constants.SpellAbilityType;
@@ -21,7 +22,7 @@ public class PayMoreToCastAsThoughtItHadFlashAbility extends SpellAbility {
private final ManaCosts costsToAdd;
- public PayMoreToCastAsThoughtItHadFlashAbility(Card card, ManaCosts costsToAdd) {
+ public PayMoreToCastAsThoughtItHadFlashAbility(Card card, ManaCosts costsToAdd) {
super(card.getSpellAbility().getManaCosts().copy(), card.getName() + " as though it had flash", Zone.HAND, SpellAbilityType.BASE_ALTERNATE);
this.costsToAdd = costsToAdd;
this.timing = TimingRule.INSTANT;
diff --git a/Mage/src/mage/abilities/common/delayed/AtTheBeginOMainPhaseDelayedTriggeredAbility.java b/Mage/src/mage/abilities/common/delayed/AtTheBeginOfMainPhaseDelayedTriggeredAbility.java
similarity index 89%
rename from Mage/src/mage/abilities/common/delayed/AtTheBeginOMainPhaseDelayedTriggeredAbility.java
rename to Mage/src/mage/abilities/common/delayed/AtTheBeginOfMainPhaseDelayedTriggeredAbility.java
index 4017e25c576..d1cd7427c41 100644
--- a/Mage/src/mage/abilities/common/delayed/AtTheBeginOMainPhaseDelayedTriggeredAbility.java
+++ b/Mage/src/mage/abilities/common/delayed/AtTheBeginOfMainPhaseDelayedTriggeredAbility.java
@@ -1,149 +1,149 @@
-/*
- * 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.abilities.common.delayed;
-
-import mage.constants.TargetController;
-import mage.abilities.DelayedTriggeredAbility;
-import mage.abilities.effects.Effect;
-import mage.constants.Duration;
-import mage.game.Game;
-import mage.game.events.GameEvent;
-import mage.game.events.GameEvent.EventType;
-import mage.game.permanent.Permanent;
-
-/**
- *
- * @author LevelX2
- */
-public class AtTheBeginOMainPhaseDelayedTriggeredAbility extends DelayedTriggeredAbility {
-
- public enum PhaseSelection {
-
- NEXT_PRECOMBAT_MAIN("next precombat"),
- NEXT_POSTCOMAT_MAIN("next postcombat"),
- NEXT_MAIN("next");
-
- private final String text;
-
- PhaseSelection(String text) {
- this.text = text;
- }
-
- @Override
- public String toString() {
- return text;
- }
- }
-
- private final TargetController targetController;
- private final PhaseSelection phaseSelection;
-
-
- public AtTheBeginOMainPhaseDelayedTriggeredAbility(Effect effect, boolean optional, TargetController targetController, PhaseSelection phaseSelection) {
- super(effect, Duration.EndOfGame, true, optional);
- this.targetController = targetController;
- this.phaseSelection = phaseSelection;
-
- }
-
- public AtTheBeginOMainPhaseDelayedTriggeredAbility(final AtTheBeginOMainPhaseDelayedTriggeredAbility ability) {
- super(ability);
- this.targetController = ability.targetController;
- this.phaseSelection = ability.phaseSelection;
- }
-
- @Override
- public AtTheBeginOMainPhaseDelayedTriggeredAbility copy() {
- return new AtTheBeginOMainPhaseDelayedTriggeredAbility(this);
- }
-
- @Override
- public boolean checkEventType(GameEvent event, Game game) {
- return checkPhase(event.getType());
- }
-
- @Override
- public boolean checkTrigger(GameEvent event, Game game) {
- switch (targetController) {
- case ANY:
- return true;
- case YOU:
- boolean yours = event.getPlayerId().equals(this.controllerId);
- return yours;
- case OPPONENT:
- if (game.getPlayer(this.getControllerId()).hasOpponent(event.getPlayerId(), game)) {
- return true;
- }
- break;
-
- case CONTROLLER_ATTACHED_TO:
- Permanent attachment = game.getPermanent(sourceId);
- if (attachment != null && attachment.getAttachedTo() != null) {
- Permanent attachedTo = game.getPermanent(attachment.getAttachedTo());
- if (attachedTo != null && attachedTo.getControllerId().equals(event.getPlayerId())) {
- return true;
- }
- }
- }
- return false;
- }
-
- private boolean checkPhase(EventType eventType) {
- switch (phaseSelection) {
- case NEXT_MAIN:
- return EventType.PRECOMBAT_MAIN_PHASE_PRE.equals(eventType) || EventType.POSTCOMBAT_MAIN_PHASE_PRE.equals(eventType);
- case NEXT_POSTCOMAT_MAIN:
- return EventType.POSTCOMBAT_MAIN_PHASE_PRE.equals(eventType);
- case NEXT_PRECOMBAT_MAIN:
- return EventType.PRECOMBAT_MAIN_PHASE_PRE.equals(eventType);
- default:
- return false;
- }
- }
-
- @Override
- public String getRule() {
- StringBuilder sb = new StringBuilder();
- switch (targetController) {
- case YOU:
- sb.append("At the beginning of your ").append(phaseSelection.toString()).append(" main phase, ");
- break;
- case OPPONENT:
- sb.append("At the beginning of an opponent's ").append(phaseSelection.toString()).append(" main phase, ");
- break;
- case ANY:
- sb.append("At the beginning of the ").append(phaseSelection.toString()).append(" main phase, ");
- break;
- case CONTROLLER_ATTACHED_TO:
- sb.append("At the beginning of the ").append(phaseSelection.toString()).append(" main phase of enchanted creature's controller, ");
- break;
- }
- sb.append(getEffects().getText(modes.getMode()));
- return sb.toString();
- }
-}
+/*
+ * 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.abilities.common.delayed;
+
+import mage.constants.TargetController;
+import mage.abilities.DelayedTriggeredAbility;
+import mage.abilities.effects.Effect;
+import mage.constants.Duration;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.events.GameEvent.EventType;
+import mage.game.permanent.Permanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class AtTheBeginOfMainPhaseDelayedTriggeredAbility extends DelayedTriggeredAbility {
+
+ public enum PhaseSelection {
+
+ NEXT_PRECOMBAT_MAIN("next precombat"),
+ NEXT_POSTCOMAT_MAIN("next postcombat"),
+ NEXT_MAIN("next");
+
+ private final String text;
+
+ PhaseSelection(String text) {
+ this.text = text;
+ }
+
+ @Override
+ public String toString() {
+ return text;
+ }
+ }
+
+ private final TargetController targetController;
+ private final PhaseSelection phaseSelection;
+
+
+ public AtTheBeginOfMainPhaseDelayedTriggeredAbility(Effect effect, boolean optional, TargetController targetController, PhaseSelection phaseSelection) {
+ super(effect, Duration.EndOfGame, true, optional);
+ this.targetController = targetController;
+ this.phaseSelection = phaseSelection;
+
+ }
+
+ public AtTheBeginOfMainPhaseDelayedTriggeredAbility(final AtTheBeginOfMainPhaseDelayedTriggeredAbility ability) {
+ super(ability);
+ this.targetController = ability.targetController;
+ this.phaseSelection = ability.phaseSelection;
+ }
+
+ @Override
+ public AtTheBeginOfMainPhaseDelayedTriggeredAbility copy() {
+ return new AtTheBeginOfMainPhaseDelayedTriggeredAbility(this);
+ }
+
+ @Override
+ public boolean checkEventType(GameEvent event, Game game) {
+ return checkPhase(event.getType());
+ }
+
+ @Override
+ public boolean checkTrigger(GameEvent event, Game game) {
+ switch (targetController) {
+ case ANY:
+ return true;
+ case YOU:
+ boolean yours = event.getPlayerId().equals(this.controllerId);
+ return yours;
+ case OPPONENT:
+ if (game.getPlayer(this.getControllerId()).hasOpponent(event.getPlayerId(), game)) {
+ return true;
+ }
+ break;
+
+ case CONTROLLER_ATTACHED_TO:
+ Permanent attachment = game.getPermanent(sourceId);
+ if (attachment != null && attachment.getAttachedTo() != null) {
+ Permanent attachedTo = game.getPermanent(attachment.getAttachedTo());
+ if (attachedTo != null && attachedTo.getControllerId().equals(event.getPlayerId())) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ private boolean checkPhase(EventType eventType) {
+ switch (phaseSelection) {
+ case NEXT_MAIN:
+ return EventType.PRECOMBAT_MAIN_PHASE_PRE.equals(eventType) || EventType.POSTCOMBAT_MAIN_PHASE_PRE.equals(eventType);
+ case NEXT_POSTCOMAT_MAIN:
+ return EventType.POSTCOMBAT_MAIN_PHASE_PRE.equals(eventType);
+ case NEXT_PRECOMBAT_MAIN:
+ return EventType.PRECOMBAT_MAIN_PHASE_PRE.equals(eventType);
+ default:
+ return false;
+ }
+ }
+
+ @Override
+ public String getRule() {
+ StringBuilder sb = new StringBuilder();
+ switch (targetController) {
+ case YOU:
+ sb.append("At the beginning of your ").append(phaseSelection.toString()).append(" main phase, ");
+ break;
+ case OPPONENT:
+ sb.append("At the beginning of an opponent's ").append(phaseSelection.toString()).append(" main phase, ");
+ break;
+ case ANY:
+ sb.append("At the beginning of the ").append(phaseSelection.toString()).append(" main phase, ");
+ break;
+ case CONTROLLER_ATTACHED_TO:
+ sb.append("At the beginning of the ").append(phaseSelection.toString()).append(" main phase of enchanted creature's controller, ");
+ break;
+ }
+ sb.append(getEffects().getText(modes.getMode()));
+ return sb.toString();
+ }
+}
diff --git a/Mage/src/mage/abilities/condition/common/CommanderInPlayCondition.java b/Mage/src/mage/abilities/condition/common/CommanderInPlayCondition.java
index 26196743f86..1a7e9fc3938 100644
--- a/Mage/src/mage/abilities/condition/common/CommanderInPlayCondition.java
+++ b/Mage/src/mage/abilities/condition/common/CommanderInPlayCondition.java
@@ -30,11 +30,11 @@ package mage.abilities.condition.common;
import mage.abilities.Ability;
import mage.abilities.condition.Condition;
import mage.game.Game;
+import mage.game.permanent.Permanent;
import mage.players.Player;
-
/**
- * Checks if the player has its commander in play
+ * Checks if the player has its commander in play and controls it
*
* @author LevelX2
*/
@@ -42,7 +42,8 @@ public class CommanderInPlayCondition implements Condition {
private static CommanderInPlayCondition fInstance = null;
- private CommanderInPlayCondition() {}
+ private CommanderInPlayCondition() {
+ }
public static Condition getInstance() {
if (fInstance == null) {
@@ -55,7 +56,8 @@ public class CommanderInPlayCondition implements Condition {
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
- return game.getPermanent(controller.getCommanderId()) != null;
+ Permanent commander = game.getPermanent(controller.getCommanderId());
+ return commander != null && commander.getControllerId().equals(source.getControllerId());
}
return false;
}
@@ -65,4 +67,4 @@ public class CommanderInPlayCondition implements Condition {
return "As long as you control your commander";
}
-}
\ No newline at end of file
+}
diff --git a/Mage/src/mage/abilities/costs/common/RevealTargetFromHandCost.java b/Mage/src/mage/abilities/costs/common/RevealTargetFromHandCost.java
index 492a07fff12..a5ef7e33cba 100644
--- a/Mage/src/mage/abilities/costs/common/RevealTargetFromHandCost.java
+++ b/Mage/src/mage/abilities/costs/common/RevealTargetFromHandCost.java
@@ -28,6 +28,8 @@
// author jeffwadsworth
package mage.abilities.costs.common;
+import java.util.ArrayList;
+import java.util.List;
import java.util.UUID;
import mage.MageObject;
import mage.abilities.Ability;
@@ -44,16 +46,19 @@ public class RevealTargetFromHandCost extends CostImpl {
public int convertedManaCosts = 0;
protected int numberCardsRevealed = 0;
+ protected List revealedCards;
public RevealTargetFromHandCost(TargetCardInHand target) {
this.addTarget(target);
this.text = (target.getNumberOfTargets() == 0 ? "you may " : "") + "reveal " + target.getTargetName();
+ this.revealedCards = new ArrayList<>();
}
public RevealTargetFromHandCost(final RevealTargetFromHandCost cost) {
super(cost);
this.convertedManaCosts = cost.convertedManaCosts;
this.numberCardsRevealed = cost.numberCardsRevealed;
+ this.revealedCards = new ArrayList<>(cost.revealedCards);
}
@Override
@@ -69,6 +74,7 @@ public class RevealTargetFromHandCost extends CostImpl {
convertedManaCosts += card.getManaCost().convertedManaCost();
numberCardsRevealed++;
cards.add(card);
+ revealedCards.add(card);
}
}
if (numberCardsRevealed > 0) {
@@ -92,6 +98,10 @@ public class RevealTargetFromHandCost extends CostImpl {
return numberCardsRevealed;
}
+ public List getRevealedCards() {
+ return revealedCards;
+ }
+
@Override
public boolean canPay(Ability ability, UUID sourceId, UUID controllerId, Game game) {
return targets.canChoose(controllerId, game);
diff --git a/Mage/src/mage/abilities/dynamicvalue/common/CardsInTargetPlayersGraveyardCount.java b/Mage/src/mage/abilities/dynamicvalue/common/CardsInTargetPlayersGraveyardCount.java
new file mode 100644
index 00000000000..b5f39f1276c
--- /dev/null
+++ b/Mage/src/mage/abilities/dynamicvalue/common/CardsInTargetPlayersGraveyardCount.java
@@ -0,0 +1,61 @@
+/*
+ * 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.abilities.dynamicvalue.common;
+
+import mage.abilities.Ability;
+import mage.abilities.dynamicvalue.DynamicValue;
+import mage.abilities.effects.Effect;
+import mage.game.Game;
+import mage.players.Player;
+
+/**
+ *
+ * @author LoneFox
+ */
+public class CardsInTargetPlayersGraveyardCount implements DynamicValue {
+
+ @Override
+ public int calculate(Game game, Ability sourceAbility, Effect effect) {
+ Player player = game.getPlayer(effect.getTargetPointer().getFirst(game, sourceAbility));
+ if (player != null) {
+ return player.getGraveyard().size();
+ }
+ return 0;
+ }
+
+ @Override
+ public CardsInTargetPlayersGraveyardCount copy() {
+ return new CardsInTargetPlayersGraveyardCount();
+ }
+
+ @Override
+ public String getMessage() {
+ return "cards in target player's graveyard";
+ }
+
+}
diff --git a/Mage/src/mage/abilities/dynamicvalue/common/ColorsOfManaSpentToCastCount.java b/Mage/src/mage/abilities/dynamicvalue/common/ColorsOfManaSpentToCastCount.java
new file mode 100644
index 00000000000..88c54fd7fb8
--- /dev/null
+++ b/Mage/src/mage/abilities/dynamicvalue/common/ColorsOfManaSpentToCastCount.java
@@ -0,0 +1,81 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package mage.abilities.dynamicvalue.common;
+
+import java.io.ObjectStreamException;
+import mage.MageObject;
+import mage.Mana;
+import mage.abilities.Ability;
+import mage.abilities.dynamicvalue.DynamicValue;
+import mage.abilities.effects.Effect;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.game.stack.Spell;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class ColorsOfManaSpentToCastCount implements DynamicValue {
+
+ private static final ColorsOfManaSpentToCastCount fINSTANCE = new ColorsOfManaSpentToCastCount();
+
+ private Object readResolve() throws ObjectStreamException {
+ return fINSTANCE;
+ }
+
+ public static ColorsOfManaSpentToCastCount getInstance() {
+ return fINSTANCE;
+ }
+
+ @Override
+ public int calculate(Game game, Ability source, Effect effect) {
+ int count = 0;
+ Spell spell = game.getStack().getSpell(source.getSourceId());
+ if (spell == null) {
+ MageObject mageObject = game.getLastKnownInformation(source.getSourceId(), Zone.STACK);
+ if (mageObject instanceof Spell) {
+ spell = (Spell) mageObject;
+ }
+ }
+ if (spell != null) {
+ // NOT the cmc of the spell on the stack
+ Mana mana = spell.getSpellAbility().getManaCostsToPay().getPayment();
+ if (mana.getBlack() > 0) {
+ count++;
+ }
+ if (mana.getBlue() > 0) {
+ count++;
+ }
+ if (mana.getGreen() > 0) {
+ count++;
+ }
+ if (mana.getRed() > 0) {
+ count++;
+ }
+ if (mana.getWhite() > 0) {
+ count++;
+ }
+ }
+ return count;
+ }
+
+ @Override
+ public ColorsOfManaSpentToCastCount copy() {
+ return new ColorsOfManaSpentToCastCount();
+ }
+
+ @Override
+ public String toString() {
+ return "X";
+ }
+
+ @Override
+ public String getMessage() {
+ return "the number of colors of mana spent to cast {this}";
+ }
+
+}
diff --git a/Mage/src/mage/abilities/dynamicvalue/common/SacrificeCostConvertedMana.java b/Mage/src/mage/abilities/dynamicvalue/common/SacrificeCostConvertedMana.java
new file mode 100644
index 00000000000..5de2bff16dc
--- /dev/null
+++ b/Mage/src/mage/abilities/dynamicvalue/common/SacrificeCostConvertedMana.java
@@ -0,0 +1,82 @@
+/*
+ * 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.abilities.dynamicvalue.common;
+
+import mage.abilities.Ability;
+import mage.abilities.costs.Cost;
+import mage.abilities.costs.common.SacrificeTargetCost;
+import mage.abilities.dynamicvalue.DynamicValue;
+import mage.abilities.effects.Effect;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+
+/**
+ * @author LoneFox
+ */
+public class SacrificeCostConvertedMana implements DynamicValue {
+
+ private final String type;
+
+ public SacrificeCostConvertedMana(String type) {
+ this.type = type;
+ }
+
+ public SacrificeCostConvertedMana(SacrificeCostConvertedMana value) {
+ this.type = value.type;
+ }
+
+ @Override
+ public int calculate(Game game, Ability sourceAbility, Effect effect) {
+ for(Cost cost : sourceAbility.getCosts()) {
+ if(cost instanceof SacrificeTargetCost) {
+ SacrificeTargetCost sacrificeCost = (SacrificeTargetCost) cost;
+ int totalCMC = 0;
+ for(Permanent permanent : sacrificeCost.getPermanents()) {
+ totalCMC += permanent.getManaCost().convertedManaCost();
+ }
+ return totalCMC;
+ }
+ }
+ return 0;
+ }
+
+ @Override
+ public SacrificeCostConvertedMana copy() {
+ return new SacrificeCostConvertedMana(this);
+ }
+
+ @Override
+ public String toString() {
+ return "X";
+ }
+
+ @Override
+ public String getMessage() {
+ return "the sacrificed " + type + "'s converted mana cost";
+ }
+}
diff --git a/Mage/src/mage/abilities/effects/AuraReplacementEffect.java b/Mage/src/mage/abilities/effects/AuraReplacementEffect.java
index 8c4a0e063e9..1a47387a473 100644
--- a/Mage/src/mage/abilities/effects/AuraReplacementEffect.java
+++ b/Mage/src/mage/abilities/effects/AuraReplacementEffect.java
@@ -116,6 +116,7 @@ public class AuraReplacementEffect extends ReplacementEffectImpl {
}
}
+ game.applyEffects(); // So continuousEffects are removed if previous effect of the same ability did move objects that cuase continuous effects
if (targetId == null) {
Target target = card.getSpellAbility().getTargets().get(0);
enchantCardInGraveyard = target instanceof TargetCardInGraveyard;
@@ -169,7 +170,6 @@ public class AuraReplacementEffect extends ReplacementEffectImpl {
PermanentCard permanent = new PermanentCard(card, card.getOwnerId(), game);
game.getBattlefield().addPermanent(permanent);
card.setZone(Zone.BATTLEFIELD, game);
- game.applyEffects();
boolean entered = permanent.entersBattlefield(event.getSourceId(), game, fromZone, true);
game.applyEffects();
if (!entered) {
diff --git a/Mage/src/mage/abilities/effects/ContinuousEffect.java b/Mage/src/mage/abilities/effects/ContinuousEffect.java
index 5f6987ab47c..355ff4347a5 100644
--- a/Mage/src/mage/abilities/effects/ContinuousEffect.java
+++ b/Mage/src/mage/abilities/effects/ContinuousEffect.java
@@ -1,34 +1,35 @@
/*
-* 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.
-*/
-
+ * 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.abilities.effects;
import java.util.List;
+import java.util.Set;
+import java.util.UUID;
import mage.MageObjectReference;
import mage.abilities.Ability;
import mage.constants.Duration;
@@ -43,25 +44,42 @@ import mage.game.Game;
public interface ContinuousEffect extends Effect {
boolean isUsed();
+
boolean isDiscarded();
+
void discard();
+
Duration getDuration();
+
long getOrder();
+
void setOrder(long order);
+
boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game);
+
boolean hasLayer(Layer layer);
+
boolean isInactive(Ability source, Game game);
+
void init(Ability source, Game game);
+
Layer getLayer();
+
SubLayer getSublayer();
+
void overrideRuleText(String text);
+
List getAffectedObjects();
+ Set isDependentTo(List allEffectsInLayer);
+
@Override
void newId();
+
@Override
ContinuousEffect copy();
-
+
boolean isTemporary();
+
void setTemporary(boolean temporary);
}
diff --git a/Mage/src/mage/abilities/effects/ContinuousEffectImpl.java b/Mage/src/mage/abilities/effects/ContinuousEffectImpl.java
index e793058a81d..48bd0bf8a27 100644
--- a/Mage/src/mage/abilities/effects/ContinuousEffectImpl.java
+++ b/Mage/src/mage/abilities/effects/ContinuousEffectImpl.java
@@ -29,6 +29,7 @@ package mage.abilities.effects;
import java.util.ArrayList;
import java.util.List;
+import java.util.Set;
import java.util.UUID;
import mage.MageObjectReference;
import mage.abilities.Ability;
@@ -250,4 +251,9 @@ public abstract class ContinuousEffectImpl extends EffectImpl implements Continu
this.temporary = temporary;
}
+ @Override
+ public Set isDependentTo(List allEffectsInLayer) {
+ return null;
+ }
+
}
diff --git a/Mage/src/mage/abilities/effects/ContinuousEffects.java b/Mage/src/mage/abilities/effects/ContinuousEffects.java
index a6030dc051b..8871ea4658f 100644
--- a/Mage/src/mage/abilities/effects/ContinuousEffects.java
+++ b/Mage/src/mage/abilities/effects/ContinuousEffects.java
@@ -38,6 +38,7 @@ import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+import java.util.Map.Entry;
import java.util.Set;
import java.util.UUID;
import mage.MageObject;
@@ -851,8 +852,9 @@ public class ContinuousEffects implements Serializable {
//20091005 - 613
public void apply(Game game) {
removeInactiveEffects(game);
- List layerEffects = getLayeredEffects(game);
- List layer = filterLayeredEffects(layerEffects, Layer.CopyEffects_1);
+ List activeLayerEffects = getLayeredEffects(game);
+
+ List layer = filterLayeredEffects(activeLayerEffects, Layer.CopyEffects_1);
for (ContinuousEffect effect : layer) {
HashSet abilities = layeredEffects.getAbility(effect.getId());
for (Ability ability : abilities) {
@@ -861,10 +863,10 @@ public class ContinuousEffects implements Serializable {
}
//Reload layerEffect if copy effects were applied
if (layer.size() > 0) {
- layerEffects = getLayeredEffects(game);
+ activeLayerEffects = getLayeredEffects(game);
}
- layer = filterLayeredEffects(layerEffects, Layer.ControlChangingEffects_2);
+ layer = filterLayeredEffects(activeLayerEffects, Layer.ControlChangingEffects_2);
// apply control changing effects multiple times if it's needed
// for cases when control over permanents with change control abilities is changed
// e.g. Mind Control is controlled by Steal Enchantment
@@ -882,55 +884,72 @@ public class ContinuousEffects implements Serializable {
// reset control before reapplying control changing effects
game.getBattlefield().resetPermanentsControl();
}
- layer = filterLayeredEffects(layerEffects, Layer.TextChangingEffects_3);
- for (ContinuousEffect effect : layer) {
- HashSet abilities = layeredEffects.getAbility(effect.getId());
- for (Ability ability : abilities) {
- effect.apply(Layer.TextChangingEffects_3, SubLayer.NA, ability, game);
- }
- }
- layer = filterLayeredEffects(layerEffects, Layer.TypeChangingEffects_4);
- for (ContinuousEffect effect : layer) {
- HashSet abilities = layeredEffects.getAbility(effect.getId());
- for (Ability ability : abilities) {
- effect.apply(Layer.TypeChangingEffects_4, SubLayer.NA, ability, game);
- }
- }
- layer = filterLayeredEffects(layerEffects, Layer.ColorChangingEffects_5);
- for (ContinuousEffect effect : layer) {
- HashSet abilities = layeredEffects.getAbility(effect.getId());
- for (Ability ability : abilities) {
- effect.apply(Layer.ColorChangingEffects_5, SubLayer.NA, ability, game);
- }
- }
- Map> appliedEffects = new HashMap<>();
+ applyLayer(activeLayerEffects, Layer.TextChangingEffects_3, game);
+ applyLayer(activeLayerEffects, Layer.TypeChangingEffects_4, game);
+ applyLayer(activeLayerEffects, Layer.ColorChangingEffects_5, game);
+
+ Map> appliedEffectAbilities = new HashMap<>();
boolean done = false;
+ Map> waitingEffects = new LinkedHashMap<>();
+ Set appliedEffects = new HashSet<>();
while (!done) { // loop needed if a added effect adds again an effect (e.g. Level 5- of Joraga Treespeaker)
done = true;
- layer = filterLayeredEffects(layerEffects, Layer.AbilityAddingRemovingEffects_6);
+ layer = filterLayeredEffects(activeLayerEffects, Layer.AbilityAddingRemovingEffects_6);
for (ContinuousEffect effect : layer) {
- if (layerEffects.contains(effect)) {
- List appliedAbilities = appliedEffects.get(effect);
+ if (activeLayerEffects.contains(effect) && !appliedEffects.contains(effect.getId())) { // Effect does still exist and was not applied yet
+ Set dependentTo = effect.isDependentTo(layer);
+ if (dependentTo != null && !appliedEffects.containsAll(dependentTo)) {
+ waitingEffects.put(effect, dependentTo);
+ continue;
+ }
+ List appliedAbilities = appliedEffectAbilities.get(effect);
HashSet abilities = layeredEffects.getAbility(effect.getId());
for (Ability ability : abilities) {
if (appliedAbilities == null || !appliedAbilities.contains(ability)) {
if (appliedAbilities == null) {
appliedAbilities = new ArrayList<>();
- appliedEffects.put(effect, appliedAbilities);
+ appliedEffectAbilities.put(effect, appliedAbilities);
}
appliedAbilities.add(ability);
effect.apply(Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, ability, game);
done = false;
// list must be updated after each applied effect (eg. if "Turn to Frog" removes abilities)
- layerEffects = getLayeredEffects(game);
+ activeLayerEffects = getLayeredEffects(game);
+ }
+ }
+ appliedEffects.add(effect.getId());
+
+ if (!waitingEffects.isEmpty()) {
+ // check if waiting effects can be applied now
+ for (Iterator>> iterator = waitingEffects.entrySet().iterator(); iterator.hasNext();) {
+ Map.Entry> entry = iterator.next();
+ if (appliedEffects.containsAll(entry.getValue())) { // all dependent to effects are applied now so apply the effect itself
+ appliedAbilities = appliedEffectAbilities.get(entry.getKey());
+ abilities = layeredEffects.getAbility(entry.getKey().getId());
+ for (Ability ability : abilities) {
+ if (appliedAbilities == null || !appliedAbilities.contains(ability)) {
+ if (appliedAbilities == null) {
+ appliedAbilities = new ArrayList<>();
+ appliedEffectAbilities.put(entry.getKey(), appliedAbilities);
+ }
+ appliedAbilities.add(ability);
+ entry.getKey().apply(Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, ability, game);
+ done = false;
+ // list must be updated after each applied effect (eg. if "Turn to Frog" removes abilities)
+ activeLayerEffects = getLayeredEffects(game);
+ }
+ }
+ appliedEffects.add(entry.getKey().getId());
+ iterator.remove();
+ }
}
}
}
}
}
- layer = filterLayeredEffects(layerEffects, Layer.PTChangingEffects_7);
+ layer = filterLayeredEffects(activeLayerEffects, Layer.PTChangingEffects_7);
for (ContinuousEffect effect : layer) {
HashSet abilities = layeredEffects.getAbility(effect.getId());
for (Ability ability : abilities) {
@@ -952,14 +971,14 @@ public class ContinuousEffects implements Serializable {
effect.apply(Layer.PTChangingEffects_7, SubLayer.SwitchPT_e, ability, game);
}
}
- layer = filterLayeredEffects(layerEffects, Layer.PlayerEffects);
+ layer = filterLayeredEffects(activeLayerEffects, Layer.PlayerEffects);
for (ContinuousEffect effect : layer) {
HashSet abilities = layeredEffects.getAbility(effect.getId());
for (Ability ability : abilities) {
effect.apply(Layer.PlayerEffects, SubLayer.NA, ability, game);
}
}
- layer = filterLayeredEffects(layerEffects, Layer.RulesEffects);
+ layer = filterLayeredEffects(activeLayerEffects, Layer.RulesEffects);
for (ContinuousEffect effect : layer) {
HashSet abilities = layeredEffects.getAbility(effect.getId());
for (Ability ability : abilities) {
@@ -968,6 +987,42 @@ public class ContinuousEffects implements Serializable {
}
}
+ private void applyLayer(List activeLayerEffects, Layer currentLayer, Game game) {
+ List layer = filterLayeredEffects(activeLayerEffects, currentLayer);
+ if (!layer.isEmpty()) {
+ int numberOfEffects = layer.size();
+ Set appliedEffects = new HashSet<>();
+ Map> waitingEffects = new LinkedHashMap<>();
+ for (ContinuousEffect effect : layer) {
+ if (numberOfEffects > 1) { // If an effect is dependent to not applied effects yet of this layer, so wait to apply this effect
+ Set dependentTo = effect.isDependentTo(layer);
+ if (dependentTo != null && !appliedEffects.containsAll(dependentTo)) {
+ waitingEffects.put(effect, dependentTo);
+ continue;
+ }
+ }
+ applyContinuousEffect(effect, currentLayer, game);
+ appliedEffects.add(effect.getId());
+ if (!waitingEffects.isEmpty()) {
+ // check if waiting effects can be applied now
+ for (Entry> entry : waitingEffects.entrySet()) {
+ if (appliedEffects.containsAll(entry.getValue())) { // all dependent to effects are applied now so apply the effect itself
+ applyContinuousEffect(entry.getKey(), currentLayer, game);
+ appliedEffects.add(entry.getKey().getId());
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private void applyContinuousEffect(ContinuousEffect effect, Layer currentLayer, Game game) {
+ HashSet abilities = layeredEffects.getAbility(effect.getId());
+ for (Ability ability : abilities) {
+ effect.apply(currentLayer, SubLayer.NA, ability, game);
+ }
+ }
+
/**
* Adds a continuous ability with a reference to a sourceId. It's used for
* effects that cease to exist again So this effects were removed again
diff --git a/Mage/src/mage/abilities/effects/common/CipherEffect.java b/Mage/src/mage/abilities/effects/common/CipherEffect.java
index d4bbdb20a20..89e6b391124 100644
--- a/Mage/src/mage/abilities/effects/common/CipherEffect.java
+++ b/Mage/src/mage/abilities/effects/common/CipherEffect.java
@@ -28,8 +28,6 @@
package mage.abilities.effects.common;
import java.util.UUID;
-import mage.constants.Duration;
-import mage.constants.Outcome;
import mage.abilities.Ability;
import mage.abilities.SpellAbility;
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
@@ -38,6 +36,9 @@ import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.cards.Card;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.Zone;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
@@ -46,37 +47,37 @@ import mage.target.targetpointer.FixedTarget;
/**
* FAQ 2013/01/11
- *
+ *
* 702.97. Cipher
*
- * 702.97a Cipher appears on some instants and sorceries. It represents two static
- * abilities, one that functions while the spell is on the stack and one that functions
- * while the card with cipher is in the exile zone. "Cipher" means "If this spell is
- * represented by a card, you may exile this card encoded on a creature you control"
- * and "As long as this card is encoded on that creature, that creature has 'Whenever
- * this creature deals combat damage to a player, you may copy this card and you may
- * cast the copy without paying its mana cost.'"
+ * 702.97a Cipher appears on some instants and sorceries. It represents two
+ * static abilities, one that functions while the spell is on the stack and one
+ * that functions while the card with cipher is in the exile zone. "Cipher"
+ * means "If this spell is represented by a card, you may exile this card
+ * encoded on a creature you control" and "As long as this card is encoded on
+ * that creature, that creature has 'Whenever this creature deals combat damage
+ * to a player, you may copy this card and you may cast the copy without paying
+ * its mana cost.'"
*
- * 702.97b The term "encoded" describes the relationship between the card with cipher
- * while in the exile zone and the creature chosen when the spell represented by that
- * card resolves.
+ * 702.97b The term "encoded" describes the relationship between the card with
+ * cipher while in the exile zone and the creature chosen when the spell
+ * represented by that card resolves.
*
- * 702.97c The card with cipher remains encoded on the chosen creature as long as the
- * card with cipher remains exiled and the creature remains on the battlefield. The
- * card remains encoded on that object even if it changes controller or stops being
- * a creature, as long as it remains on the battlefield.
+ * 702.97c The card with cipher remains encoded on the chosen creature as long
+ * as the card with cipher remains exiled and the creature remains on the
+ * battlefield. The card remains encoded on that object even if it changes
+ * controller or stops being a creature, as long as it remains on the
+ * battlefield.
*
* TODO: Implement Cipher as two static abilities concerning the rules.
*
* @author LevelX2
*/
-
-
public class CipherEffect extends OneShotEffect {
public CipherEffect() {
super(Outcome.Copy);
- staticText ="
Cipher (Then you may exile this spell card encoded on a creature you control. Whenever that creature deals combat damage to a player, its controller may cast a copy of the encoded card without paying its mana cost.)";
+ staticText = "
Cipher (Then you may exile this spell card encoded on a creature you control. Whenever that creature deals combat damage to a player, its controller may cast a copy of the encoded card without paying its mana cost.)";
}
public CipherEffect(final CipherEffect effect) {
@@ -86,10 +87,11 @@ public class CipherEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
- TargetControlledCreaturePermanent target = new TargetControlledCreaturePermanent();
if (controller != null) {
+ TargetControlledCreaturePermanent target = new TargetControlledCreaturePermanent();
+ target.setNotTarget(true);
if (target.canChoose(source.getControllerId(), game)
- && controller.chooseUse(outcome, "Cipher this spell to a creature?", source, game)) {
+ && controller.chooseUse(outcome, "Cipher this spell to a creature?", source, game)) {
controller.chooseTarget(outcome, target, source, game);
Card sourceCard = game.getCard(source.getSourceId());
Permanent targetCreature = game.getPermanent(target.getFirstTarget());
@@ -99,9 +101,10 @@ public class CipherEffect extends OneShotEffect {
ContinuousEffect effect = new GainAbilityTargetEffect(ability, Duration.Custom);
effect.setTargetPointer(new FixedTarget(target.getFirstTarget()));
game.addEffect(effect, source);
- if (!game.isSimulation())
+ if (!game.isSimulation()) {
game.informPlayers(new StringBuilder(sourceCard.getLogName()).append(": Spell ciphered to ").append(targetCreature.getLogName()).toString());
- return sourceCard.moveToExile(null, "", source.getSourceId(), game);
+ }
+ return controller.moveCards(sourceCard, null, Zone.EXILED, source, game);
} else {
return false;
}
@@ -119,7 +122,7 @@ public class CipherEffect extends OneShotEffect {
class CipherStoreEffect extends OneShotEffect {
- private UUID cipherCardId;
+ private final UUID cipherCardId;
public CipherStoreEffect(UUID cipherCardId, String ruleText) {
super(Outcome.Copy);
@@ -141,13 +144,13 @@ class CipherStoreEffect extends OneShotEffect {
SpellAbility ability = copyCard.getSpellAbility();
// remove the cipher effect from the copy
Effect cipherEffect = null;
- for (Effect effect :ability.getEffects()) {
+ for (Effect effect : ability.getEffects()) {
if (effect instanceof CipherEffect) {
cipherEffect = effect;
}
}
ability.getEffects().remove(cipherEffect);
- if (ability != null && ability instanceof SpellAbility) {
+ if (ability instanceof SpellAbility) {
controller.cast(ability, game, true);
}
}
diff --git a/Mage/src/mage/abilities/effects/common/DamageAllEffect.java b/Mage/src/mage/abilities/effects/common/DamageAllEffect.java
index 7c2bb29618c..e537e7b304d 100644
--- a/Mage/src/mage/abilities/effects/common/DamageAllEffect.java
+++ b/Mage/src/mage/abilities/effects/common/DamageAllEffect.java
@@ -1,16 +1,16 @@
/*
* 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
@@ -20,20 +20,19 @@
* 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.abilities.effects.common;
import java.util.List;
-import mage.constants.Outcome;
import mage.abilities.Ability;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.dynamicvalue.common.StaticValue;
import mage.abilities.effects.OneShotEffect;
+import mage.constants.Outcome;
import mage.filter.FilterPermanent;
import mage.game.Game;
import mage.game.permanent.Permanent;
@@ -50,6 +49,7 @@ public class DamageAllEffect extends OneShotEffect {
public DamageAllEffect(int amount, FilterPermanent filter) {
this(new StaticValue(amount), filter);
}
+
public DamageAllEffect(DynamicValue amount, FilterPermanent filter) {
super(Outcome.Damage);
this.amount = amount;
@@ -71,7 +71,7 @@ public class DamageAllEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
List permanents = game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game);
- for (Permanent permanent: permanents) {
+ for (Permanent permanent : permanents) {
permanent.damage(amount.calculate(game, source, this), source.getSourceId(), game, false, true);
}
return true;
@@ -82,9 +82,13 @@ public class DamageAllEffect extends OneShotEffect {
sb.append("{source} deals ").append(amount.toString()).append(" damage to each ").append(filter.getMessage());
String message = amount.getMessage();
if (message.length() > 0) {
- sb.append(" for each ");
+ if (amount.toString().equals("X")) {
+ sb.append(", where X is ");
+ } else {
+ sb.append(" for each ");
+ }
+ sb.append(message);
}
- sb.append(message);
staticText = sb.toString();
}
diff --git a/Mage/src/mage/abilities/effects/common/DamageTargetControllerEffect.java b/Mage/src/mage/abilities/effects/common/DamageTargetControllerEffect.java
index d8d7216746f..47b57fb15dc 100644
--- a/Mage/src/mage/abilities/effects/common/DamageTargetControllerEffect.java
+++ b/Mage/src/mage/abilities/effects/common/DamageTargetControllerEffect.java
@@ -77,7 +77,7 @@ public class DamageTargetControllerEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
- Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source));
+ Permanent permanent = game.getPermanentOrLKIBattlefield(getTargetPointer().getFirst(game, source));
if(permanent != null) {
Player targetController = game.getPlayer(permanent.getControllerId());
if(targetController != null) {
diff --git a/Mage/src/mage/abilities/effects/common/DestroyAllEffect.java b/Mage/src/mage/abilities/effects/common/DestroyAllEffect.java
index f9199f93724..6546b17f8ae 100644
--- a/Mage/src/mage/abilities/effects/common/DestroyAllEffect.java
+++ b/Mage/src/mage/abilities/effects/common/DestroyAllEffect.java
@@ -1,31 +1,30 @@
/*
-* 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.
-*/
-
+ * 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.abilities.effects.common;
import mage.abilities.Ability;
@@ -49,8 +48,7 @@ public class DestroyAllEffect extends OneShotEffect {
this.noRegen = noRegen;
if (noRegen) {
staticText = "destroy all " + filter.getMessage() + ". They can't be regenerated";
- }
- else {
+ } else {
staticText = "destroy all " + filter.getMessage();
}
}
@@ -72,6 +70,7 @@ public class DestroyAllEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
+
for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game)) {
permanent.destroy(source.getSourceId(), game, noRegen);
}
diff --git a/Mage/src/mage/abilities/effects/common/DestroyTargetEffect.java b/Mage/src/mage/abilities/effects/common/DestroyTargetEffect.java
index 9339079cb1f..751ecc86e4a 100644
--- a/Mage/src/mage/abilities/effects/common/DestroyTargetEffect.java
+++ b/Mage/src/mage/abilities/effects/common/DestroyTargetEffect.java
@@ -46,6 +46,7 @@ import mage.util.CardUtil;
public class DestroyTargetEffect extends OneShotEffect {
protected boolean noRegen;
+ protected boolean multitargetHandling;
public DestroyTargetEffect() {
this(false);
@@ -57,13 +58,19 @@ public class DestroyTargetEffect extends OneShotEffect {
}
public DestroyTargetEffect(boolean noRegen) {
+ this(noRegen, false);
+ }
+
+ public DestroyTargetEffect(boolean noRegen, boolean multitargetHandling) {
super(Outcome.DestroyPermanent);
this.noRegen = noRegen;
+ this.multitargetHandling = multitargetHandling;
}
public DestroyTargetEffect(final DestroyTargetEffect effect) {
super(effect);
this.noRegen = effect.noRegen;
+ this.multitargetHandling = effect.multitargetHandling;
}
@Override
@@ -74,7 +81,7 @@ public class DestroyTargetEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
int affectedTargets = 0;
- if (source.getTargets().size() > 1 && targetPointer instanceof FirstTargetPointer) { // for Rain of Thorns
+ if (multitargetHandling && source.getTargets().size() > 1 && targetPointer instanceof FirstTargetPointer) { // Decimate
for (Target target : source.getTargets()) {
for (UUID permanentId : target.getTargets()) {
Permanent permanent = game.getPermanent(permanentId);
@@ -84,7 +91,7 @@ public class DestroyTargetEffect extends OneShotEffect {
}
}
}
- } else if (targetPointer.getTargets(game, source).size() > 0) {
+ } else {
for (UUID permanentId : targetPointer.getTargets(game, source)) {
Permanent permanent = game.getPermanent(permanentId);
if (permanent != null) {
diff --git a/Mage/src/mage/abilities/effects/common/ExileCardsFromTopOfLibraryTargetEffect.java b/Mage/src/mage/abilities/effects/common/ExileCardsFromTopOfLibraryTargetEffect.java
new file mode 100644
index 00000000000..b0be1dd9fcc
--- /dev/null
+++ b/Mage/src/mage/abilities/effects/common/ExileCardsFromTopOfLibraryTargetEffect.java
@@ -0,0 +1,60 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package mage.abilities.effects.common;
+
+import mage.abilities.Ability;
+import mage.abilities.effects.OneShotEffect;
+import mage.cards.Cards;
+import mage.cards.CardsImpl;
+import mage.constants.Outcome;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.players.Player;
+import mage.util.CardUtil;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class ExileCardsFromTopOfLibraryTargetEffect extends OneShotEffect {
+
+ int amount;
+ String targetName;
+
+ public ExileCardsFromTopOfLibraryTargetEffect(int amount) {
+ this(amount, null);
+ }
+
+ public ExileCardsFromTopOfLibraryTargetEffect(int amount, String targetName) {
+ super(Outcome.Exile);
+ this.amount = amount;
+ this.staticText = (targetName == null ? "that player" : targetName) + " exiles the top "
+ + CardUtil.numberToText(amount, "")
+ + (amount == 1 ? "card" : " cards") + " of his or her library";
+ }
+
+ public ExileCardsFromTopOfLibraryTargetEffect(final ExileCardsFromTopOfLibraryTargetEffect effect) {
+ super(effect);
+ this.amount = effect.amount;
+
+ }
+
+ @Override
+ public ExileCardsFromTopOfLibraryTargetEffect copy() {
+ return new ExileCardsFromTopOfLibraryTargetEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player targetPlayer = game.getPlayer(getTargetPointer().getFirst(game, source));
+ if (targetPlayer != null) {
+ Cards cards = new CardsImpl();
+ cards.addAll(targetPlayer.getLibrary().getTopCards(game, amount));
+ return targetPlayer.moveCards(cards, null, Zone.EXILED, source, game);
+ }
+ return false;
+ }
+}
diff --git a/Mage/src/mage/abilities/effects/common/HideawayPlayEffect.java b/Mage/src/mage/abilities/effects/common/HideawayPlayEffect.java
index b8333d2d39d..749f5214e5e 100644
--- a/Mage/src/mage/abilities/effects/common/HideawayPlayEffect.java
+++ b/Mage/src/mage/abilities/effects/common/HideawayPlayEffect.java
@@ -28,10 +28,12 @@
package mage.abilities.effects.common;
import mage.abilities.Ability;
+import mage.abilities.condition.common.MyMainPhaseCondition;
import mage.abilities.effects.OneShotEffect;
import mage.cards.Card;
import mage.constants.CardType;
import mage.constants.Outcome;
+import mage.constants.Zone;
import mage.game.ExileZone;
import mage.game.Game;
import mage.players.Player;
@@ -61,7 +63,7 @@ public class HideawayPlayEffect extends OneShotEffect {
@Override
public boolean apply(Game game, Ability source) {
ExileZone zone = game.getExile().getExileZone(CardUtil.getCardExileZoneId(game, source));
- if (zone ==null || zone.isEmpty()) {
+ if (zone == null || zone.isEmpty()) {
return false;
}
Card card = zone.getCards(game).iterator().next();
@@ -69,10 +71,11 @@ public class HideawayPlayEffect extends OneShotEffect {
if (card != null && controller != null) {
if (card.getCardType().contains(CardType.LAND)) {
// If the revealed card is a land, you can play it only if it's your turn and you haven't yet played a land this turn.
- if (game.getActivePlayerId().equals(source.getControllerId()) && controller.canPlayLand()) {
+ if (game.getActivePlayerId().equals(source.getControllerId()) && controller.canPlayLand() && MyMainPhaseCondition.getInstance().apply(game, source)) {
if (controller.chooseUse(Outcome.Benefit, "Play " + card.getLogName() + " from Exile?", source, game)) {
+ // normal player.playLand(card, game) can't be used because this abilit is on the stack
card.setFaceDown(false, game);
- return controller.playLand(card, game);
+ return controller.moveCards(card, Zone.EXILED, Zone.BATTLEFIELD, source, game);
}
} else if (!game.isSimulation()) {
game.informPlayer(controller, "You're not able to play the land now due to regular restrictions.");
@@ -82,7 +85,7 @@ public class HideawayPlayEffect extends OneShotEffect {
// The land's last ability allows you to play the removed card as part of the resolution of that ability.
// Timing restrictions based on the card's type are ignored (for instance, if it's a creature or sorcery).
// Other play restrictions are not (such as "Play [this card] only during combat").
- if (controller.chooseUse(Outcome.Benefit, "Cast "+ card.getLogName() + " without paying its mana cost?", source, game)) {
+ if (controller.chooseUse(Outcome.Benefit, "Cast " + card.getLogName() + " without paying its mana cost?", source, game)) {
card.setFaceDown(false, game);
return controller.cast(card.getSpellAbility(), game, true);
}
@@ -96,4 +99,3 @@ public class HideawayPlayEffect extends OneShotEffect {
return false;
}
}
-
diff --git a/Mage/src/mage/abilities/effects/common/PutTokenOntoBattlefieldCopyTargetEffect.java b/Mage/src/mage/abilities/effects/common/PutTokenOntoBattlefieldCopyTargetEffect.java
index 1d740f6f94c..ba01a9eef9d 100644
--- a/Mage/src/mage/abilities/effects/common/PutTokenOntoBattlefieldCopyTargetEffect.java
+++ b/Mage/src/mage/abilities/effects/common/PutTokenOntoBattlefieldCopyTargetEffect.java
@@ -33,19 +33,14 @@ import java.util.UUID;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.Mode;
-import mage.abilities.effects.ContinuousEffect;
import mage.abilities.effects.Effect;
import mage.abilities.effects.OneShotEffect;
-import mage.abilities.effects.common.continuous.AddCardTypeTargetEffect;
-import mage.abilities.effects.common.continuous.GainAbilityTargetEffect;
import mage.abilities.keyword.HasteAbility;
import mage.constants.CardType;
-import mage.constants.Duration;
import mage.constants.Outcome;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.game.permanent.token.EmptyToken;
-import mage.target.targetpointer.FixedTarget;
import mage.util.CardUtil;
import mage.util.functions.ApplyToPermanent;
import mage.util.functions.EmptyApplyToPermanent;
@@ -72,6 +67,13 @@ public class PutTokenOntoBattlefieldCopyTargetEffect extends OneShotEffect {
this(playerId, null, false);
}
+ /**
+ *
+ * @param playerId null the token is controlled/owned by the controller of
+ * the source ability
+ * @param additionalCardType the token gains tis card types in addition
+ * @param gainsHaste the token gains haste
+ */
public PutTokenOntoBattlefieldCopyTargetEffect(UUID playerId, CardType additionalCardType, boolean gainsHaste) {
super(Outcome.PutCreatureInPlay);
this.playerId = playerId;
@@ -113,28 +115,19 @@ public class PutTokenOntoBattlefieldCopyTargetEffect extends OneShotEffect {
EmptyToken token = new EmptyToken();
CardUtil.copyTo(token).from(copyFromPermanent); // needed so that entersBattlefied triggered abilities see the attributes (e.g. Master Biomancer)
+ applier.apply(game, token);
if (additionalCardType != null && !token.getCardType().contains(additionalCardType)) {
token.getCardType().add(additionalCardType);
}
if (gainsHaste) {
token.addAbility(HasteAbility.getInstance());
}
+
token.putOntoBattlefield(1, game, source.getSourceId(), playerId == null ? source.getControllerId() : playerId);
for (UUID tokenId : token.getLastAddedTokenIds()) { // by cards like Doubling Season multiple tokens can be added to the battlefield
Permanent tokenPermanent = game.getPermanent(tokenId);
if (tokenPermanent != null) {
addedTokenPermanents.add(tokenPermanent);
- game.copyPermanent(copyFromPermanent, tokenPermanent, source, applier);
- if (additionalCardType != null) {
- ContinuousEffect effect = new AddCardTypeTargetEffect(additionalCardType, Duration.Custom);
- effect.setTargetPointer(new FixedTarget(tokenPermanent, game));
- game.addEffect(effect, source);
- }
- if (gainsHaste) {
- ContinuousEffect effect = new GainAbilityTargetEffect(HasteAbility.getInstance(), Duration.Custom);
- effect.setTargetPointer(new FixedTarget(tokenPermanent, game));
- game.addEffect(effect, source);
- }
}
}
return true;
diff --git a/Mage/src/mage/abilities/effects/common/ReturnFromExileEffect.java b/Mage/src/mage/abilities/effects/common/ReturnFromExileEffect.java
index a3eeb0a2c13..58ebc6676bb 100644
--- a/Mage/src/mage/abilities/effects/common/ReturnFromExileEffect.java
+++ b/Mage/src/mage/abilities/effects/common/ReturnFromExileEffect.java
@@ -96,7 +96,7 @@ public class ReturnFromExileEffect extends OneShotEffect {
case BATTLEFIELD:
card.moveToZone(zone, source.getSourceId(), game, tapped);
if (!game.isSimulation()) {
- game.informPlayers(controller.getLogName() + " moves " + card.getName() + " to " + zone.toString().toLowerCase());
+ game.informPlayers(controller.getLogName() + " moves " + card.getLogName() + " to " + zone.toString().toLowerCase());
}
break;
case HAND:
@@ -111,7 +111,7 @@ public class ReturnFromExileEffect extends OneShotEffect {
default:
card.moveToZone(zone, source.getSourceId(), game, tapped);
if (!game.isSimulation()) {
- game.informPlayers(controller.getLogName() + " moves " + card.getName() + " to " + zone.toString().toLowerCase());
+ game.informPlayers(controller.getLogName() + " moves " + card.getLogName() + " to " + zone.toString().toLowerCase());
}
}
}
diff --git a/Mage/src/mage/abilities/effects/common/RevealTargetPlayerLibraryEffect.java b/Mage/src/mage/abilities/effects/common/RevealTargetPlayerLibraryEffect.java
index c2a40e79706..5fb44e58499 100644
--- a/Mage/src/mage/abilities/effects/common/RevealTargetPlayerLibraryEffect.java
+++ b/Mage/src/mage/abilities/effects/common/RevealTargetPlayerLibraryEffect.java
@@ -27,11 +27,11 @@
*/
package mage.abilities.effects.common;
+import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.dynamicvalue.common.StaticValue;
import mage.abilities.effects.OneShotEffect;
-import mage.cards.Card;
import mage.cards.Cards;
import mage.cards.CardsImpl;
import mage.constants.Outcome;
@@ -42,9 +42,8 @@ import mage.util.CardUtil;
/**
*
- * @author anonymous
+ * @author Luna Skyrise
*/
-
public class RevealTargetPlayerLibraryEffect extends OneShotEffect {
private DynamicValue amountCards;
@@ -73,28 +72,18 @@ public class RevealTargetPlayerLibraryEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
Player targetPlayer = game.getPlayer(source.getFirstTarget());
-
- if (player == null || targetPlayer == null) {
+ MageObject sourceObject = source.getSourceObject(game);
+ if (player == null || targetPlayer == null || sourceObject == null) {
return false;
}
Cards cards = new CardsImpl(Zone.LIBRARY);
- int count = Math.min(targetPlayer.getLibrary().size(), amountCards.calculate(game, source, this));
- for (int i = 0; i < count; i++) {
- Card card = targetPlayer.getLibrary().removeFromTop(game);
- if (card != null) {
- cards.add(card);
- }
- }
-
- player.lookAtCards("Top " + amountCards.toString() + "cards of " + targetPlayer.getName() + "\'s library", cards, game);
-
+ cards.addAll(player.getLibrary().getTopCards(game, amountCards.calculate(game, source, this)));
+ player.revealCards(sourceObject.getIdName() + " - Top " + amountCards.toString() + "cards of " + targetPlayer.getName() + "\'s library", cards, game);
return true;
}
private String setText() {
- StringBuilder sb = new StringBuilder("Reveal the top ");
- sb.append(CardUtil.numberToText(amountCards.toString())).append(" cards of target player's library.");
- return sb.toString();
+ return "Reveal the top " + CardUtil.numberToText(amountCards.toString()) + " cards of target player's library.";
}
}
diff --git a/Mage/src/mage/abilities/effects/common/SacrificeSourceUnlessPaysEffect.java b/Mage/src/mage/abilities/effects/common/SacrificeSourceUnlessPaysEffect.java
index e9f188f41e5..b36191ecbc3 100644
--- a/Mage/src/mage/abilities/effects/common/SacrificeSourceUnlessPaysEffect.java
+++ b/Mage/src/mage/abilities/effects/common/SacrificeSourceUnlessPaysEffect.java
@@ -39,7 +39,7 @@ public class SacrificeSourceUnlessPaysEffect extends OneShotEffect {
StringBuilder sb = new StringBuilder(cost.getText()).append("?");
if (!sb.toString().toLowerCase().startsWith("exile ") && !sb.toString().toLowerCase().startsWith("return ") ) {
sb.insert(0, "Pay ");
- }
+ }
String message = CardUtil.replaceSourceName(sb.toString(), sourceObject.getLogName());
message = Character.toUpperCase(message.charAt(0)) + message.substring(1);
if (player.chooseUse(Outcome.Benefit, message, source, game)) {
@@ -59,23 +59,26 @@ public class SacrificeSourceUnlessPaysEffect extends OneShotEffect {
return new SacrificeSourceUnlessPaysEffect(this);
}
- @Override
+ @Override
public String getText(Mode mode) {
- StringBuilder sb = new StringBuilder("sacrifice {this} unless you ");
- String costText = cost.getText();
- if (costText.toLowerCase().startsWith("discard")
- || costText.toLowerCase().startsWith("remove")
- || costText.toLowerCase().startsWith("return")
- || costText.toLowerCase().startsWith("exile")
- || costText.toLowerCase().startsWith("sacrifice")) {
- sb.append(costText.substring(0, 1).toLowerCase());
- sb.append(costText.substring(1));
- }
- else {
- sb.append("pay ").append(costText);
- }
+ if(staticText != null && !staticText.isEmpty()) {
+ return staticText;
+ }
- return sb.toString();
+ StringBuilder sb = new StringBuilder("sacrifice {this} unless you ");
+ String costText = cost.getText();
+ if (costText.toLowerCase().startsWith("discard")
+ || costText.toLowerCase().startsWith("remove")
+ || costText.toLowerCase().startsWith("return")
+ || costText.toLowerCase().startsWith("exile")
+ || costText.toLowerCase().startsWith("sacrifice")) {
+ sb.append(costText.substring(0, 1).toLowerCase());
+ sb.append(costText.substring(1));
+ }
+ else {
+ sb.append("pay ").append(costText);
+ }
+ return sb.toString();
}
}
diff --git a/Mage/src/mage/abilities/effects/common/continuous/AssignNoCombatDamageSourceEffect.java b/Mage/src/mage/abilities/effects/common/continuous/AssignNoCombatDamageSourceEffect.java
index f7615c0db32..7146608ba73 100644
--- a/Mage/src/mage/abilities/effects/common/continuous/AssignNoCombatDamageSourceEffect.java
+++ b/Mage/src/mage/abilities/effects/common/continuous/AssignNoCombatDamageSourceEffect.java
@@ -45,13 +45,21 @@ import static mage.game.events.GameEvent.EventType.DAMAGE_PLAYER;
public class AssignNoCombatDamageSourceEffect extends ReplacementEffectImpl {
+ private boolean partOfOptionalEffect;
+
public AssignNoCombatDamageSourceEffect(Duration duration) {
+ this(duration, false);
+ }
+
+ public AssignNoCombatDamageSourceEffect(Duration duration, boolean partOfOptionalEffect) {
super(duration, Outcome.PreventDamage);
+ this.partOfOptionalEffect = partOfOptionalEffect;
staticText = setText();
}
public AssignNoCombatDamageSourceEffect(final AssignNoCombatDamageSourceEffect effect) {
super(effect);
+ this.partOfOptionalEffect = effect.partOfOptionalEffect;
}
@Override
@@ -88,19 +96,23 @@ public class AssignNoCombatDamageSourceEffect extends ReplacementEffectImpl {
}
private String setText() {
- StringBuilder sb = new StringBuilder("{this} assigns no combat damage");
+ String text = "";
+ if(partOfOptionalEffect) {
+ text = "If you do, ";
+ }
+ text += "{this} assigns no combat damage";
switch(duration) {
case EndOfTurn:
- sb.append("this turn");
+ text += " this turn";
break;
case EndOfCombat:
- sb.append("this combat");
+ text += " this combat";
break;
default:
if (duration.toString().length() > 0) {
- sb.append(" ").append(duration.toString());
+ text += " " + duration.toString();
}
}
- return sb.toString();
+ return text;
}
}
diff --git a/Mage/src/mage/abilities/effects/common/continuous/CommanderReplacementEffect.java b/Mage/src/mage/abilities/effects/common/continuous/CommanderReplacementEffect.java
index daa86a6abea..c2cc74dd6e3 100644
--- a/Mage/src/mage/abilities/effects/common/continuous/CommanderReplacementEffect.java
+++ b/Mage/src/mage/abilities/effects/common/continuous/CommanderReplacementEffect.java
@@ -45,7 +45,6 @@ import mage.players.Player;
*
* @author Plopman
*/
-
//20130711
/*
* 903.11. If a commander would be put into its owner’s graveyard from anywhere, that player may put it into the command zone instead.
@@ -98,18 +97,18 @@ public class CommanderReplacementEffect extends ReplacementEffectImpl {
@Override
public boolean applies(GameEvent event, Ability source, Game game) {
- switch(((ZoneChangeEvent)event).getToZone()) {
+ switch (((ZoneChangeEvent) event).getToZone()) {
case HAND:
- if (!alsoHand && ((ZoneChangeEvent)event).getToZone() == Zone.HAND) {
+ if (!alsoHand && ((ZoneChangeEvent) event).getToZone() == Zone.HAND) {
return false;
}
case LIBRARY:
- if (!alsoLibrary && ((ZoneChangeEvent)event).getToZone() == Zone.LIBRARY) {
+ if (!alsoLibrary && ((ZoneChangeEvent) event).getToZone() == Zone.LIBRARY) {
return false;
}
case GRAVEYARD:
- case EXILED:
- if(commanderId.equals(event.getTargetId())){
+ case EXILED:
+ if (commanderId.equals(event.getTargetId())) {
return true;
}
break;
@@ -125,23 +124,24 @@ public class CommanderReplacementEffect extends ReplacementEffectImpl {
}
return false;
}
-
+
@Override
- public boolean replaceEvent(GameEvent event, Ability source, Game game) {
- if (((ZoneChangeEvent)event).getFromZone() == Zone.BATTLEFIELD) {
- Permanent permanent = ((ZoneChangeEvent)event).getTarget();
+ public boolean replaceEvent(GameEvent event, Ability source, Game game) {
+ if (((ZoneChangeEvent) event).getFromZone() == Zone.BATTLEFIELD) {
+ Permanent permanent = ((ZoneChangeEvent) event).getTarget();
if (permanent != null) {
Player player = game.getPlayer(permanent.getOwnerId());
- if (player != null && player.chooseUse(Outcome.Benefit, "Move commander to command zone?", source, game)){
+ if (player != null && player.chooseUse(Outcome.Benefit, "Move commander to command zone?", source, game)) {
boolean result = permanent.moveToZone(Zone.COMMAND, source.getSourceId(), game, false);
- if (!game.isSimulation())
+ if (!game.isSimulation()) {
game.informPlayers(player.getLogName() + " has moved his or her commander to the command zone");
+ }
return result;
}
}
} else {
Card card = null;
- if (((ZoneChangeEvent)event).getFromZone().equals(Zone.STACK)) {
+ if (((ZoneChangeEvent) event).getFromZone().equals(Zone.STACK)) {
Spell spell = game.getStack().getSpell(event.getTargetId());
if (spell != null) {
card = game.getCard(spell.getSourceId());
@@ -149,13 +149,14 @@ public class CommanderReplacementEffect extends ReplacementEffectImpl {
}
if (card == null) {
card = game.getCard(event.getTargetId());
- }
+ }
if (card != null) {
Player player = game.getPlayer(card.getOwnerId());
- if (player != null && player.chooseUse(Outcome.Benefit, "Move commander to command zone?", source, game)){
+ if (player != null && player.chooseUse(Outcome.Benefit, "Move commander to command zone?", source, game)) {
boolean result = card.moveToZone(Zone.COMMAND, source.getSourceId(), game, false);
- if (!game.isSimulation())
+ if (!game.isSimulation()) {
game.informPlayers(player.getLogName() + " has moved his or her commander to the command zone");
+ }
return result;
}
}
diff --git a/Mage/src/mage/abilities/effects/common/continuous/LoseAbilityAllEffect.java b/Mage/src/mage/abilities/effects/common/continuous/LoseAbilityAllEffect.java
new file mode 100644
index 00000000000..0ee881c3773
--- /dev/null
+++ b/Mage/src/mage/abilities/effects/common/continuous/LoseAbilityAllEffect.java
@@ -0,0 +1,57 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package mage.abilities.effects.common.continuous;
+
+import mage.abilities.Ability;
+import mage.abilities.effects.ContinuousEffectImpl;
+import mage.constants.Duration;
+import mage.constants.Layer;
+import mage.constants.Outcome;
+import mage.constants.SubLayer;
+import mage.filter.FilterPermanent;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class LoseAbilityAllEffect extends ContinuousEffectImpl {
+
+ protected final FilterPermanent filter;
+ protected final Ability ability;
+
+ public LoseAbilityAllEffect(FilterPermanent filter, Ability ability, Duration duration) {
+ super(duration, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility);
+ this.filter = filter;
+ this.ability = ability;
+ staticText = filter.getMessage() + " lose " + ability.toString() + (duration.toString().isEmpty() ? "" : " " + duration.toString());
+ }
+
+ public LoseAbilityAllEffect(final LoseAbilityAllEffect effect) {
+ super(effect);
+ this.filter = effect.filter.copy();
+ this.ability = effect.ability;
+ }
+
+ @Override
+ public LoseAbilityAllEffect copy() {
+ return new LoseAbilityAllEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game)) {
+ if (permanent != null) {
+ while (permanent.getAbilities().contains(ability)) {
+ permanent.getAbilities().remove(ability);
+ }
+ }
+ }
+ return true;
+ }
+
+}
diff --git a/Mage/src/mage/abilities/effects/common/continuous/LoseAllAbilitiesAllEffect.java b/Mage/src/mage/abilities/effects/common/continuous/LoseAllAbilitiesAllEffect.java
index 54115e932f1..2e2020eda6c 100644
--- a/Mage/src/mage/abilities/effects/common/continuous/LoseAllAbilitiesAllEffect.java
+++ b/Mage/src/mage/abilities/effects/common/continuous/LoseAllAbilitiesAllEffect.java
@@ -1,52 +1,50 @@
/*
-* 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.
-*/
-
+ * 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.abilities.effects.common.continuous;
+import mage.abilities.Ability;
+import mage.abilities.Mode;
+import mage.abilities.effects.ContinuousEffectImpl;
import mage.constants.Duration;
import mage.constants.Layer;
import mage.constants.Outcome;
import mage.constants.SubLayer;
-import mage.abilities.Ability;
-import mage.abilities.Mode;
-import mage.abilities.effects.ContinuousEffectImpl;
import mage.filter.FilterPermanent;
import mage.game.Game;
import mage.game.permanent.Permanent;
-
/**
*
* @author LevelX2
*/
public class LoseAllAbilitiesAllEffect extends ContinuousEffectImpl {
- private FilterPermanent filter;
+ private final FilterPermanent filter;
public LoseAllAbilitiesAllEffect(FilterPermanent filter, Duration duration) {
super(duration, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility);
@@ -65,7 +63,7 @@ public class LoseAllAbilitiesAllEffect extends ContinuousEffectImpl {
@Override
public boolean apply(Game game, Ability source) {
- for (Permanent permanent: game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game)) {
+ for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game)) {
if (permanent != null) {
permanent.removeAllAbilities(source.getSourceId(), game);
}
diff --git a/Mage/src/mage/abilities/effects/common/counter/AddPoisonCounterTargetEffect.java b/Mage/src/mage/abilities/effects/common/counter/AddPoisonCounterTargetEffect.java
index c8a68acd925..420d8dc4490 100644
--- a/Mage/src/mage/abilities/effects/common/counter/AddPoisonCounterTargetEffect.java
+++ b/Mage/src/mage/abilities/effects/common/counter/AddPoisonCounterTargetEffect.java
@@ -74,6 +74,9 @@ public class AddPoisonCounterTargetEffect extends OneShotEffect {
@Override
public String getText(Mode mode) {
+ if(staticText != null && !staticText.isEmpty()) {
+ return staticText;
+ }
return "Target " + mode.getTargets().get(0).getTargetName() + " gets " + Integer.toString(amount) + " poison counter(s).";
}
-}
\ No newline at end of file
+}
diff --git a/Mage/src/mage/abilities/effects/keyword/ScryEffect.java b/Mage/src/mage/abilities/effects/keyword/ScryEffect.java
index 0fc7e4ad760..dec42b05dae 100644
--- a/Mage/src/mage/abilities/effects/keyword/ScryEffect.java
+++ b/Mage/src/mage/abilities/effects/keyword/ScryEffect.java
@@ -1,16 +1,16 @@
/*
* 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
@@ -20,26 +20,19 @@
* 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.abilities.effects.keyword;
import mage.abilities.Ability;
import mage.abilities.effects.OneShotEffect;
-import mage.cards.Card;
-import mage.cards.Cards;
-import mage.cards.CardsImpl;
import mage.constants.Outcome;
-import mage.constants.Zone;
import mage.filter.FilterCard;
import mage.game.Game;
-import mage.game.events.GameEvent;
import mage.players.Player;
-import mage.target.TargetCard;
import mage.util.CardUtil;
/**
@@ -67,33 +60,7 @@ public class ScryEffect extends OneShotEffect {
public boolean apply(Game game, Ability source) {
Player player = game.getPlayer(source.getControllerId());
if (player != null) {
- boolean revealed = player.isTopCardRevealed(); // by looking at the cards with scry you have not to reveal the next card
- player.setTopCardRevealed(false);
- Cards cards = new CardsImpl();
- int count = Math.min(scryNumber, player.getLibrary().size());
- if (count == 0) {
- return true;
- }
- for (int i = 0; i < count; i++) {
- Card card = player.getLibrary().removeFromTop(game);
- cards.add(card);
- }
- TargetCard target1 = new TargetCard(Zone.LIBRARY, filter1);
- target1.setRequired(false);
- // move cards to the bottom of the library
- while (player.canRespond() && cards.size() > 0 && player.choose(Outcome.Detriment, cards, target1, game)) {
- Card card = cards.get(target1.getFirstTarget(), game);
- if (card != null) {
- cards.remove(card);
- player.moveCardToLibraryWithInfo(card, source.getSourceId(), game, Zone.LIBRARY, false, false);
- }
- target1.clearChosen();
- }
- // move cards to the top of the library
- player.putCardsOnTopOfLibrary(cards, game, source, true);
- game.fireEvent(new GameEvent(GameEvent.EventType.SCRY, source.getControllerId(), source.getSourceId(), source.getControllerId()));
- player.setTopCardRevealed(revealed);
- return true;
+ return player.scry(scryNumber, source, game);
}
return false;
}
diff --git a/Mage/src/mage/abilities/keyword/AwakenAbility.java b/Mage/src/mage/abilities/keyword/AwakenAbility.java
new file mode 100644
index 00000000000..0fbd77b142c
--- /dev/null
+++ b/Mage/src/mage/abilities/keyword/AwakenAbility.java
@@ -0,0 +1,155 @@
+/*
+ * 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.abilities.keyword;
+
+import java.util.UUID;
+import mage.MageInt;
+import mage.abilities.Ability;
+import mage.abilities.SpellAbility;
+import mage.abilities.costs.mana.ManaCostsImpl;
+import mage.abilities.effects.ContinuousEffect;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.OneShotEffect;
+import mage.abilities.effects.common.continuous.BecomesCreatureTargetEffect;
+import mage.abilities.effects.common.counter.AddCountersTargetEffect;
+import mage.cards.Card;
+import mage.constants.CardType;
+import mage.constants.Duration;
+import mage.constants.Outcome;
+import mage.constants.SpellAbilityType;
+import mage.constants.Zone;
+import mage.counters.CounterType;
+import mage.filter.common.FilterControlledLandPermanent;
+import mage.game.Game;
+import mage.game.permanent.token.Token;
+import mage.target.Target;
+import mage.target.common.TargetControlledPermanent;
+import mage.target.targetpointer.FixedTarget;
+import mage.util.CardUtil;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class AwakenAbility extends SpellAbility {
+
+ static private String filterMessage = "a land you control to awake";
+
+ private String rule;
+ private int awakenValue;
+
+ public AwakenAbility(Card card, int awakenValue, String awakenCosts) {
+ super(new ManaCostsImpl<>(awakenCosts), card.getName() + " with awaken", Zone.HAND, SpellAbilityType.BASE_ALTERNATE);
+ this.getCosts().addAll(card.getSpellAbility().getCosts().copy());
+ this.getEffects().addAll(card.getSpellAbility().getEffects().copy());
+ this.getTargets().addAll(card.getSpellAbility().getTargets().copy());
+ this.getChoices().addAll(card.getSpellAbility().getChoices().copy());
+ this.spellAbilityType = SpellAbilityType.BASE_ALTERNATE;
+ this.timing = card.getSpellAbility().getTiming();
+ this.addTarget(new TargetControlledPermanent(new FilterControlledLandPermanent(filterMessage)));
+ this.addEffect(new AwakenEffect());
+ this.awakenValue = awakenValue;
+ rule = "Awaken " + awakenValue + "—" + awakenCosts
+ + " (If you cast this spell for " + awakenCosts + ", also put "
+ + CardUtil.numberToText(awakenValue, "a")
+ + " +1/+1 counters on target land you control and it becomes a 0/0 Elemental creature with haste. It's still a land.)";
+
+ }
+
+ public AwakenAbility(final AwakenAbility ability) {
+ super(ability);
+ this.awakenValue = ability.awakenValue;
+ }
+
+ @Override
+ public AwakenAbility copy() {
+ return new AwakenAbility(this);
+ }
+
+ @Override
+ public String getRule(boolean all) {
+ return getRule();
+ }
+
+ @Override
+ public String getRule() {
+ return rule;
+ }
+
+ class AwakenEffect extends OneShotEffect {
+
+ private AwakenEffect() {
+ super(Outcome.BoostCreature);
+ this.staticText = "put " + CardUtil.numberToText(awakenValue, "a") + " +1/+1 counters on target land you control";
+ }
+
+ public AwakenEffect(final AwakenEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public AwakenEffect copy() {
+ return new AwakenEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ UUID targetId = null;
+ for (Target target : source.getTargets()) {
+ if (target.getFilter().getMessage().equals(filterMessage)) {
+ targetId = target.getFirstTarget();
+ }
+ }
+ if (targetId != null) {
+ FixedTarget fixedTarget = new FixedTarget(targetId);
+ ContinuousEffect continuousEffect = new BecomesCreatureTargetEffect(new AwakenElementalToken(), false, true, Duration.Custom);
+ continuousEffect.setTargetPointer(fixedTarget);
+ game.addEffect(continuousEffect, source);
+ Effect effect = new AddCountersTargetEffect(CounterType.P1P1.createInstance(awakenValue));
+ effect.setTargetPointer(fixedTarget);
+ return effect.apply(game, source);
+ }
+ return true;
+ }
+ }
+
+}
+
+class AwakenElementalToken extends Token {
+
+ public AwakenElementalToken() {
+ super("", "0/0 Elemental creature with haste");
+ this.cardType.add(CardType.CREATURE);
+
+ this.subtype.add("Elemental");
+ this.power = new MageInt(0);
+ this.toughness = new MageInt(0);
+
+ this.addAbility(HasteAbility.getInstance());
+ }
+}
diff --git a/Mage/src/mage/abilities/keyword/DevoidAbility.java b/Mage/src/mage/abilities/keyword/DevoidAbility.java
new file mode 100644
index 00000000000..ec25acc9727
--- /dev/null
+++ b/Mage/src/mage/abilities/keyword/DevoidAbility.java
@@ -0,0 +1,41 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package mage.abilities.keyword;
+
+import mage.ObjectColor;
+import mage.abilities.common.SimpleStaticAbility;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class DevoidAbility extends SimpleStaticAbility {
+
+ public DevoidAbility(ObjectColor color) {
+ super(Zone.ALL, null);
+ color.setBlack(false);
+ color.setWhite(false);
+ color.setGreen(false);
+ color.setBlue(false);
+ color.setRed(false);
+ }
+
+ public DevoidAbility(final DevoidAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public DevoidAbility copy() {
+ return new DevoidAbility(this);
+ }
+
+ @Override
+ public String getRule() {
+ return "Devoid (This card has no color.)";
+ }
+
+}
diff --git a/Mage/src/mage/abilities/keyword/IngestAbility.java b/Mage/src/mage/abilities/keyword/IngestAbility.java
new file mode 100644
index 00000000000..40f68dc4b8f
--- /dev/null
+++ b/Mage/src/mage/abilities/keyword/IngestAbility.java
@@ -0,0 +1,71 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package mage.abilities.keyword;
+
+import mage.abilities.Ability;
+import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility;
+import mage.abilities.effects.OneShotEffect;
+import mage.cards.Card;
+import mage.constants.Outcome;
+import mage.constants.Zone;
+import mage.game.Game;
+import mage.players.Player;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class IngestAbility extends DealsCombatDamageToAPlayerTriggeredAbility {
+
+ public IngestAbility() {
+ super(new IngestEffect(), false, true);
+
+ }
+
+ public IngestAbility(IngestAbility ability) {
+ super(ability);
+ }
+
+ @Override
+ public String getRule() {
+ return "Ingest (Whenever this creature deals combat damage to a player, that player exiles the top card of his or her library.)";
+ }
+
+ @Override
+ public IngestAbility copy() {
+ return new IngestAbility(this);
+ }
+}
+
+class IngestEffect extends OneShotEffect {
+
+ public IngestEffect() {
+ super(Outcome.Exile);
+ this.staticText = "that player exiles the top card of his or her library";
+ }
+
+ public IngestEffect(final IngestEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public IngestEffect copy() {
+ return new IngestEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ Player targetPlayer = game.getPlayer(getTargetPointer().getFirst(game, source));
+ if (targetPlayer != null) {
+ Card card = targetPlayer.getLibrary().getFromTop(game);
+ if (card != null) {
+ targetPlayer.moveCards(card, Zone.LIBRARY, Zone.EXILED, source, game);
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/Mage/src/mage/abilities/keyword/ProtectionAbility.java b/Mage/src/mage/abilities/keyword/ProtectionAbility.java
index 3cacac49811..ff234e4ae40 100644
--- a/Mage/src/mage/abilities/keyword/ProtectionAbility.java
+++ b/Mage/src/mage/abilities/keyword/ProtectionAbility.java
@@ -31,6 +31,7 @@ import java.util.UUID;
import mage.MageObject;
import mage.abilities.StaticAbility;
import mage.cards.Card;
+import mage.constants.CardType;
import mage.constants.Zone;
import mage.filter.Filter;
import mage.filter.FilterCard;
@@ -40,6 +41,7 @@ import mage.filter.FilterSpell;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.game.stack.Spell;
+import mage.game.stack.StackObject;
/**
*
@@ -83,18 +85,25 @@ public class ProtectionAbility extends StaticAbility {
}
return true;
}
- if (filter instanceof FilterSpell) {
- if (source instanceof Spell) {
- return !filter.match(source, game);
- }
- return true;
- }
+
if (filter instanceof FilterCard) {
if (source instanceof Card) {
return !filter.match(source, game);
}
return true;
}
+ if (filter instanceof FilterSpell) {
+ if (source instanceof Spell) {
+ return !filter.match(source, game);
+ }
+ // Problem here is that for the check if a player can play a Spell, the source
+ // object is still a card and not a spell yet. So retunr only if the source object can't be a spell
+ // otherwise the following FilterObject check will be appied
+ if (source instanceof StackObject
+ || (!source.getCardType().contains(CardType.INSTANT) && !source.getCardType().contains(CardType.SORCERY))) {
+ return true;
+ }
+ }
if (filter instanceof FilterObject) {
return !filter.match(source, game);
}
diff --git a/Mage/src/mage/abilities/keyword/RampageAbility.java b/Mage/src/mage/abilities/keyword/RampageAbility.java
new file mode 100644
index 00000000000..f399d80f7c3
--- /dev/null
+++ b/Mage/src/mage/abilities/keyword/RampageAbility.java
@@ -0,0 +1,106 @@
+/*
+ * 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.abilities.keyword;
+
+import mage.abilities.Ability;
+import mage.abilities.common.BecomesBlockedTriggeredAbility;
+import mage.abilities.dynamicvalue.DynamicValue;
+import mage.abilities.effects.Effect;
+import mage.abilities.effects.common.continuous.BoostSourceEffect;
+import mage.constants.Duration;
+import mage.game.Game;
+import mage.game.combat.CombatGroup;
+import mage.game.events.GameEvent;
+
+/**
+ *
+ * @author LoneFox
+ */
+
+public class RampageAbility extends BecomesBlockedTriggeredAbility {
+
+ private final String rule;
+
+ public RampageAbility(int amount) {
+ super(null, false);
+ rule = "rampage " + amount;
+ RampageValue rv = new RampageValue(amount);
+ this.addEffect(new BoostSourceEffect(rv, rv, Duration.EndOfTurn));
+ }
+
+ public RampageAbility(final RampageAbility ability) {
+ super(ability);
+ this.rule = ability.rule;
+ }
+
+ @Override
+ public RampageAbility copy() {
+ return new RampageAbility(this);
+ }
+
+ @Override
+ public String getRule() {
+ return rule;
+ }
+}
+
+
+class RampageValue implements DynamicValue {
+
+ private final int amount;
+
+ public RampageValue(int amount) {
+ this.amount = amount;
+ }
+
+ public RampageValue(final RampageValue value) {
+ this.amount = value.amount;
+ }
+
+ @Override
+ public RampageValue copy() {
+ return new RampageValue(this);
+ }
+
+ @Override
+ public int calculate(Game game, Ability sourceAbility, Effect effect) {
+ int count = 0;
+ for(CombatGroup combatGroup : game.getCombat().getGroups()) {
+ if(combatGroup.getAttackers().contains(sourceAbility.getSourceId())) {
+ int blockers = combatGroup.getBlockers().size();
+ return blockers > 1 ? (blockers - 1) * amount : 0;
+ }
+ }
+ return 0;
+ }
+
+ @Override
+ public String getMessage() {
+ return "Rampage " + amount;
+ }
+}
diff --git a/Mage/src/mage/abilities/keyword/RetraceAbility.java b/Mage/src/mage/abilities/keyword/RetraceAbility.java
index 4c26c31b6cd..2ce121fc255 100644
--- a/Mage/src/mage/abilities/keyword/RetraceAbility.java
+++ b/Mage/src/mage/abilities/keyword/RetraceAbility.java
@@ -39,7 +39,6 @@ import mage.target.common.TargetCardInHand;
*
* @author LevelX2
*/
-
public class RetraceAbility extends SpellAbility {
public RetraceAbility(Card card) {
@@ -51,7 +50,7 @@ public class RetraceAbility extends SpellAbility {
this.getChoices().addAll(card.getSpellAbility().getChoices().copy());
this.spellAbilityType = SpellAbilityType.BASE_ALTERNATE;
this.timing = card.getSpellAbility().getTiming();
-
+
}
public RetraceAbility(final RetraceAbility ability) {
diff --git a/Mage/src/mage/abilities/keyword/SuspendAbility.java b/Mage/src/mage/abilities/keyword/SuspendAbility.java
index 03b50951133..320f11979c4 100644
--- a/Mage/src/mage/abilities/keyword/SuspendAbility.java
+++ b/Mage/src/mage/abilities/keyword/SuspendAbility.java
@@ -40,6 +40,7 @@ import mage.abilities.costs.mana.ManaCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.costs.mana.VariableManaCost;
import mage.abilities.decorator.ConditionalTriggeredAbility;
+import mage.abilities.effects.ContinuousEffect;
import mage.abilities.effects.ContinuousEffectImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.counter.RemoveCounterSourceEffect;
@@ -57,6 +58,7 @@ import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.players.Player;
+import mage.target.targetpointer.FixedTarget;
/**
*
@@ -183,7 +185,7 @@ public class SuspendAbility extends ActivatedAbilityImpl {
setRuleAtTheTop(true);
}
addSubAbility(new SuspendBeginningOfUpkeepTriggeredAbility());
- addSubAbility(new SuspendPlayCardAbility(card.getCardType().contains(CardType.CREATURE)));
+ addSubAbility(new SuspendPlayCardAbility());
}
ruleText = sb.toString();
}
@@ -208,7 +210,7 @@ public class SuspendAbility extends ActivatedAbilityImpl {
game.getState().addOtherAbility(card, ability1);
game.getState().addAbility(ability1, source.getSourceId(), card);
- SuspendPlayCardAbility ability2 = new SuspendPlayCardAbility(card.getCardType().contains(CardType.CREATURE));
+ SuspendPlayCardAbility ability2 = new SuspendPlayCardAbility();
ability2.setSourceId(card.getId());
ability2.setControllerId(card.getOwnerId());
game.getState().addOtherAbility(card, ability2);
@@ -298,11 +300,8 @@ class SuspendExileEffect extends OneShotEffect {
class SuspendPlayCardAbility extends TriggeredAbilityImpl {
- public SuspendPlayCardAbility(boolean isCreature) {
- super(Zone.EXILED, new SuspendPlayCardEffect(isCreature));
- if (isCreature) {
- this.addEffect(new GainHasteEffect());
- }
+ public SuspendPlayCardAbility() {
+ super(Zone.EXILED, new SuspendPlayCardEffect());
setRuleVisible(false);
}
@@ -340,7 +339,7 @@ class SuspendPlayCardAbility extends TriggeredAbilityImpl {
class SuspendPlayCardEffect extends OneShotEffect {
- public SuspendPlayCardEffect(boolean isCreature) {
+ public SuspendPlayCardEffect() {
super(Outcome.PutCardInPlay);
this.staticText = "play it without paying its mana cost if able. If you can't, it remains removed from the game";
}
@@ -378,7 +377,14 @@ class SuspendPlayCardEffect extends OneShotEffect {
card.getAbilities().removeAll(abilitiesToRemove);
}
// cast the card for free
- return player.cast(card.getSpellAbility(), game, true);
+ if (player.cast(card.getSpellAbility(), game, true)) {
+ if (card.getCardType().contains(CardType.CREATURE)) {
+ ContinuousEffect effect = new GainHasteEffect();
+ effect.setTargetPointer(new FixedTarget(card.getId(), card.getZoneChangeCounter(game) + 1));
+ game.addEffect(effect, source);
+ }
+ return true;
+ }
}
return false;
}
@@ -408,14 +414,17 @@ class GainHasteEffect extends ContinuousEffectImpl {
if (suspendController == null) {
suspendController = source.getControllerId();
}
- Permanent permanent = game.getPermanent(source.getSourceId());
+ Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source));
if (permanent != null) {
if (suspendController.equals(source.getControllerId())) {
permanent.addAbility(HasteAbility.getInstance(), source.getSourceId(), game);
- return true;
} else {
this.discard();
}
+ return true;
+ }
+ if (game.getState().getZoneChangeCounter(((FixedTarget) getTargetPointer()).getTarget()) >= ((FixedTarget) getTargetPointer()).getZoneChangeCounter()) {
+ this.discard();
}
return false;
}
diff --git a/Mage/src/mage/cards/CardImpl.java b/Mage/src/mage/cards/CardImpl.java
index b72b534d449..ee05eb447bd 100644
--- a/Mage/src/mage/cards/CardImpl.java
+++ b/Mage/src/mage/cards/CardImpl.java
@@ -296,11 +296,9 @@ public abstract class CardImpl extends MageObjectImpl implements Card {
public SpellAbility getSpellAbility() {
if (spellAbility == null) {
for (Ability ability : abilities.getActivatedAbilities(Zone.HAND)) {
- // name check prevents that alternate casting methods (like "cast [card name] using bestow") are returned here
- // BUG #1024: Bestow bug
- //if (ability instanceof SpellAbility && ability.toString().endsWith(getName())) {
- if (ability instanceof SpellAbility) {
- spellAbility = (SpellAbility) ability;
+ if (ability instanceof SpellAbility
+ && !((SpellAbility) ability).getSpellAbilityType().equals(SpellAbilityType.BASE_ALTERNATE)) {
+ return spellAbility = (SpellAbility) ability;
}
}
}
@@ -365,13 +363,16 @@ public abstract class CardImpl extends MageObjectImpl implements Card {
game.getState().getCommand().remove((Commander) game.getObject(objectId));
break;
case STACK:
- StackObject stackObject = game.getStack().getSpell(getId());
- if (stackObject == null && (this instanceof SplitCard)) { // handle if half od Split cast is on the stack
+ StackObject stackObject = game.getStack().getSpell(getSpellAbility().getId());
+ if (stackObject == null && (this instanceof SplitCard)) { // handle if half of Split cast is on the stack
stackObject = game.getStack().getSpell(((SplitCard) this).getLeftHalfCard().getId());
if (stackObject == null) {
stackObject = game.getStack().getSpell(((SplitCard) this).getRightHalfCard().getId());
}
}
+ if (stackObject == null) {
+ stackObject = game.getStack().getSpell(getId());
+ }
if (stackObject != null) {
game.getStack().remove(stackObject);
}
@@ -602,10 +603,10 @@ public abstract class CardImpl extends MageObjectImpl implements Card {
PermanentCard permanent = new PermanentCard(this, event.getPlayerId(), game);
// make sure the controller of all continuous effects of this card are switched to the current controller
game.getContinuousEffects().setController(objectId, event.getPlayerId());
- // check if there are counters to add to the permanent (e.g. from non replacement effects like Persist)
- checkForCountersToAdd(permanent, game);
game.addPermanent(permanent);
setZone(Zone.BATTLEFIELD, game);
+ // check if there are counters to add to the permanent (e.g. from non replacement effects like Persist)
+ checkForCountersToAdd(permanent, game);
game.setScopeRelevant(true);
permanent.setTapped(tapped);
permanent.setFaceDown(facedown, game);
diff --git a/Mage/src/mage/cards/CardsImpl.java b/Mage/src/mage/cards/CardsImpl.java
index d7799289e23..ee177f0741e 100644
--- a/Mage/src/mage/cards/CardsImpl.java
+++ b/Mage/src/mage/cards/CardsImpl.java
@@ -169,10 +169,13 @@ public class CardsImpl extends LinkedHashSet implements Cards, Serializabl
@Override
public Set getCards(FilterCard filter, UUID sourceId, UUID playerId, Game game) {
Set cards = new LinkedHashSet<>();
- for (UUID card : this) {
- boolean match = filter.match(game.getCard(card), sourceId, playerId, game);
- if (match) {
- cards.add(game.getCard(card));
+ for (UUID cardId : this) {
+ Card card = game.getCard(cardId);
+ if (card != null) {
+ boolean match = filter.match(card, sourceId, playerId, game);
+ if (match) {
+ cards.add(game.getCard(cardId));
+ }
}
}
return cards;
diff --git a/Mage/src/mage/cards/SplitCard.java b/Mage/src/mage/cards/SplitCard.java
index 7aef9b2756d..27b093adee1 100644
--- a/Mage/src/mage/cards/SplitCard.java
+++ b/Mage/src/mage/cards/SplitCard.java
@@ -60,16 +60,32 @@ public abstract class SplitCard extends CardImpl {
public SplitCard(SplitCard card) {
super(card);
- this.leftHalfCard = card.leftHalfCard.copy();
+ this.leftHalfCard = card.getLeftHalfCard().copy();
+ ((SplitCardHalf) leftHalfCard).setParentCard(this);
this.rightHalfCard = card.rightHalfCard.copy();
+ ((SplitCardHalf) rightHalfCard).setParentCard(this);
}
- public Card getLeftHalfCard() {
- return leftHalfCard;
+ public SplitCardHalf getLeftHalfCard() {
+ return (SplitCardHalf) leftHalfCard;
}
- public Card getRightHalfCard() {
- return rightHalfCard;
+ public SplitCardHalf getRightHalfCard() {
+ return (SplitCardHalf) rightHalfCard;
+ }
+
+ @Override
+ public void assignNewId() {
+ super.assignNewId();
+ leftHalfCard.assignNewId();
+ rightHalfCard.assignNewId();
+ }
+
+ @Override
+ public void setCopy(boolean isCopy) {
+ super.setCopy(isCopy);
+ leftHalfCard.setCopy(isCopy);
+ rightHalfCard.setCopy(isCopy);
}
@Override
diff --git a/Mage/src/mage/cards/SplitCardHalf.java b/Mage/src/mage/cards/SplitCardHalf.java
index 52fa1086bb6..f1ec3976601 100644
--- a/Mage/src/mage/cards/SplitCardHalf.java
+++ b/Mage/src/mage/cards/SplitCardHalf.java
@@ -12,5 +12,7 @@ package mage.cards;
public interface SplitCardHalf extends Card {
@Override
- Card copy();
+ SplitCardHalf copy();
+
+ void setParentCard(SplitCard card);
}
diff --git a/Mage/src/mage/cards/SplitCardHalfImpl.java b/Mage/src/mage/cards/SplitCardHalfImpl.java
index af6cc3f6ab6..818d539c4af 100644
--- a/Mage/src/mage/cards/SplitCardHalfImpl.java
+++ b/Mage/src/mage/cards/SplitCardHalfImpl.java
@@ -62,7 +62,7 @@ public class SplitCardHalfImpl extends CardImpl implements SplitCardHalf {
}
@Override
- public Card getMainCard() {
+ public SplitCard getMainCard() {
return splitCardParent;
}
@@ -74,8 +74,13 @@ public class SplitCardHalfImpl extends CardImpl implements SplitCardHalf {
}
@Override
- public SplitCardHalfImpl copy() {
+ public SplitCardHalf copy() {
return new SplitCardHalfImpl(this);
}
+ @Override
+ public void setParentCard(SplitCard card) {
+ this.splitCardParent = card;
+ }
+
}
diff --git a/Mage/src/mage/cards/mock/MockSplitCard.java b/Mage/src/mage/cards/mock/MockSplitCard.java
index fd9e8a06181..e1c03601f41 100644
--- a/Mage/src/mage/cards/mock/MockSplitCard.java
+++ b/Mage/src/mage/cards/mock/MockSplitCard.java
@@ -50,13 +50,13 @@ public class MockSplitCard extends SplitCard {
}
CardInfo leftHalf = CardRepository.instance.findCard(getLeftHalfName(card));
- if(leftHalf != null) {
- this.leftHalfCard = new MockCard(leftHalf);
+ if (leftHalf != null) {
+ this.leftHalfCard = new MockSplitCardHalf(leftHalf);
}
CardInfo rightHalf = CardRepository.instance.findCard(getRightHalfName(card));
- if(rightHalf != null) {
- this.rightHalfCard = new MockCard(rightHalf);
+ if (rightHalf != null) {
+ this.rightHalfCard = new MockSplitCardHalf(rightHalf);
}
}
diff --git a/Mage/src/mage/cards/mock/MockSplitCardHalf.java b/Mage/src/mage/cards/mock/MockSplitCardHalf.java
new file mode 100644
index 00000000000..4eefd3d0b1a
--- /dev/null
+++ b/Mage/src/mage/cards/mock/MockSplitCardHalf.java
@@ -0,0 +1,58 @@
+/*
+ * 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.mock;
+
+import mage.cards.SplitCard;
+import mage.cards.SplitCardHalf;
+import mage.cards.repository.CardInfo;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class MockSplitCardHalf extends MockCard implements SplitCardHalf {
+
+ public MockSplitCardHalf(CardInfo card) {
+ super(card);
+ }
+
+ public MockSplitCardHalf(final MockSplitCardHalf card) {
+ super(card);
+ }
+
+ @Override
+ public MockSplitCardHalf copy() {
+ return new MockSplitCardHalf(this);
+ }
+
+ @Override
+ public void setParentCard(SplitCard card) {
+ throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ }
+
+}
diff --git a/Mage/src/mage/cards/repository/CardRepository.java b/Mage/src/mage/cards/repository/CardRepository.java
index de4ff55efde..d664e54805c 100644
--- a/Mage/src/mage/cards/repository/CardRepository.java
+++ b/Mage/src/mage/cards/repository/CardRepository.java
@@ -63,7 +63,7 @@ public enum CardRepository {
// raise this if db structure was changed
private static final long CARD_DB_VERSION = 41;
// raise this if new cards were added to the server
- private static final long CARD_CONTENT_VERSION = 34;
+ private static final long CARD_CONTENT_VERSION = 35;
private final Random random = new Random();
private Dao cardDao;
diff --git a/Mage/src/mage/constants/AbilityWord.java b/Mage/src/mage/constants/AbilityWord.java
index 1ef899c62fd..29088e89d1f 100644
--- a/Mage/src/mage/constants/AbilityWord.java
+++ b/Mage/src/mage/constants/AbilityWord.java
@@ -33,7 +33,9 @@ package mage.constants;
*/
public enum AbilityWord {
+ RALLY("Rally"),
BLOODRUSH("Bloodrush"),
+ CONVERGE("Converge"),
CONSTELLATION("Constellation"),
FEROCIOUS("Ferocious"),
FORMIDABLE("Formidable"),
diff --git a/Mage/src/mage/constants/PlayerAction.java b/Mage/src/mage/constants/PlayerAction.java
index e572a6f2b65..746db8f13ad 100644
--- a/Mage/src/mage/constants/PlayerAction.java
+++ b/Mage/src/mage/constants/PlayerAction.java
@@ -60,5 +60,11 @@ public enum PlayerAction {
ADD_PERMISSION_TO_ROLLBACK_TURN,
DENY_PERMISSON_TO_ROLLBACK_TURN,
PERMISSION_REQUESTS_ALLOWED_ON,
- PERMISSION_REQUESTS_ALLOWED_OFF
+ PERMISSION_REQUESTS_ALLOWED_OFF,
+ REQUEST_AUTO_ANSWER_ID_YES,
+ REQUEST_AUTO_ANSWER_ID_NO,
+ REQUEST_AUTO_ANSWER_TEXT_YES,
+ REQUEST_AUTO_ANSWER_TEXT_NO,
+ REQUEST_AUTO_ANSWER_RESET_ALL,
+
}
diff --git a/Mage/src/mage/counters/CounterType.java b/Mage/src/mage/counters/CounterType.java
index 15163732418..51f242d1034 100644
--- a/Mage/src/mage/counters/CounterType.java
+++ b/Mage/src/mage/counters/CounterType.java
@@ -93,6 +93,7 @@ public enum CounterType {
VELOCITY("velocity"),
VERSE("verse"),
VILE("vile"),
+ VITALITY("vitality"),
WISH("wish");
private final String name;
diff --git a/Mage/src/mage/filter/FilterCard.java b/Mage/src/mage/filter/FilterCard.java
index 97cb529a055..2995a693184 100644
--- a/Mage/src/mage/filter/FilterCard.java
+++ b/Mage/src/mage/filter/FilterCard.java
@@ -64,30 +64,29 @@ public class FilterCard extends FilterObject {
}
//20130711 708.6c
- /* If anything performs a comparison involving multiple characteristics or
- * values of one or more split cards in any zone other than the stack or
- * involving multiple characteristics or values of one or more fused split
- * spells, each characteristic or value is compared separately. If each of
- * the individual comparisons would return a “yes” answer, the whole
+ /* If anything performs a comparison involving multiple characteristics or
+ * values of one or more split cards in any zone other than the stack or
+ * involving multiple characteristics or values of one or more fused split
+ * spells, each characteristic or value is compared separately. If each of
+ * the individual comparisons would return a “yes” answer, the whole
* comparison returns a “yes” answer. The individual comparisons may involve
* different halves of the same split card.
*/
-
@Override
public boolean match(Card card, Game game) {
- if(card.isSplitCard()){
- return super.match(((SplitCard)card).getLeftHalfCard(), game) ||
- super.match(((SplitCard)card).getRightHalfCard(), game);
- }
- else{
- return super.match(card, game);
+ if (card.isSplitCard()) {
+ return super.match(((SplitCard) card).getLeftHalfCard(), game)
+ || super.match(((SplitCard) card).getRightHalfCard(), game);
+ } else {
+ return super.match(card, game);
}
}
+
public boolean match(Card card, UUID playerId, Game game) {
if (!this.match(card, game)) {
return false;
}
-
+
return Predicates.and(extraPredicates).apply(new ObjectPlayer(card, playerId), game);
}
@@ -111,7 +110,7 @@ public class FilterCard extends FilterObject {
}
return filtered;
}
-
+
public boolean hasPredicates() {
return predicates.size() > 0;
}
diff --git a/Mage/src/mage/filter/predicate/permanent/SummoningSicknessPredicate.java b/Mage/src/mage/filter/predicate/permanent/SummoningSicknessPredicate.java
new file mode 100644
index 00000000000..088e2791af5
--- /dev/null
+++ b/Mage/src/mage/filter/predicate/permanent/SummoningSicknessPredicate.java
@@ -0,0 +1,27 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package mage.filter.predicate.permanent;
+
+import mage.filter.predicate.Predicate;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class SummoningSicknessPredicate implements Predicate {
+
+ @Override
+ public boolean apply(Permanent input, Game game) {
+ return input.hasSummoningSickness();
+ }
+
+ @Override
+ public String toString() {
+ return "Summoning sickness";
+ }
+}
diff --git a/Mage/src/mage/game/Exile.java b/Mage/src/mage/game/Exile.java
index 688a2727586..42b513092f3 100644
--- a/Mage/src/mage/game/Exile.java
+++ b/Mage/src/mage/game/Exile.java
@@ -100,7 +100,7 @@ public class Exile implements Serializable, Copyable {
}
public List getAllCards(Game game) {
- List cards = new ArrayList();
+ List cards = new ArrayList<>();
for (ExileZone exile : exileZones.values()) {
cards.addAll(exile.getCards(game));
}
diff --git a/Mage/src/mage/game/Game.java b/Mage/src/mage/game/Game.java
index 0c10ca220a6..e558dc02ad7 100644
--- a/Mage/src/mage/game/Game.java
+++ b/Mage/src/mage/game/Game.java
@@ -73,6 +73,7 @@ import mage.game.turn.Turn;
import mage.players.Player;
import mage.players.PlayerList;
import mage.players.Players;
+import mage.util.MessageToClient;
import mage.util.functions.ApplyToPermanent;
public interface Game extends MageItem, Serializable {
@@ -221,13 +222,13 @@ public interface Game extends MageItem, Serializable {
void addPlayerQueryEventListener(Listener listener);
- void fireAskPlayerEvent(UUID playerId, String message);
+ void fireAskPlayerEvent(UUID playerId, MessageToClient message, Ability source);
void fireChooseChoiceEvent(UUID playerId, Choice choice);
- void fireSelectTargetEvent(UUID playerId, String message, Set targets, boolean required, Map options);
+ void fireSelectTargetEvent(UUID playerId, MessageToClient message, Set targets, boolean required, Map options);
- void fireSelectTargetEvent(UUID playerId, String message, Cards cards, boolean required, Map options);
+ void fireSelectTargetEvent(UUID playerId, MessageToClient message, Cards cards, boolean required, Map options);
void fireSelectTargetTriggeredAbilityEvent(UUID playerId, String message, List abilities);
diff --git a/Mage/src/mage/game/GameImpl.java b/Mage/src/mage/game/GameImpl.java
index bddd512b7bb..f1d6cf8b25d 100644
--- a/Mage/src/mage/game/GameImpl.java
+++ b/Mage/src/mage/game/GameImpl.java
@@ -67,6 +67,7 @@ import mage.cards.Card;
import mage.cards.Cards;
import mage.cards.CardsImpl;
import mage.cards.SplitCard;
+import mage.cards.SplitCardHalf;
import mage.cards.decks.Deck;
import mage.choices.Choice;
import mage.constants.CardType;
@@ -118,6 +119,7 @@ import mage.target.Target;
import mage.target.TargetPermanent;
import mage.target.TargetPlayer;
import mage.util.GameLog;
+import mage.util.MessageToClient;
import mage.util.functions.ApplyToPermanent;
import mage.watchers.Watchers;
import mage.watchers.common.BlockedAttackerWatcher;
@@ -873,13 +875,14 @@ public abstract class GameImpl implements Game, Serializable {
}
//20091005 - 103.3
+ int startingHandSize = 7;
for (UUID playerId : state.getPlayerList(startingPlayerId)) {
Player player = getPlayer(playerId);
if (!gameOptions.testMode || player.getLife() == 0) {
player.initLife(this.getLife());
}
if (!gameOptions.testMode) {
- player.drawCards(7, this);
+ player.drawCards(startingHandSize, this);
}
}
@@ -921,6 +924,15 @@ public abstract class GameImpl implements Game, Serializable {
}
saveState(false);
} while (!mulliganPlayers.isEmpty());
+ // new scry rule
+ for (UUID playerId : state.getPlayerList(startingPlayerId)) {
+ Player player = getPlayer(playerId);
+ if (player != null && player.getHand().size() < startingHandSize) {
+ if (player.chooseUse(Outcome.Benefit, new MessageToClient("Scry 1?", "Look at the top card of your library. You may put that card on the bottom of your library."), null, this)) {
+ player.scry(1, null, this);
+ }
+ }
+ }
getState().setChoosingPlayerId(null);
Watchers watchers = state.getWatchers();
// add default watchers
@@ -1083,15 +1095,6 @@ public abstract class GameImpl implements Game, Serializable {
player.drawCards(numCards - deduction, this);
}
-// @Override
-// public void quit(UUID playerId) {
-// if (state != null) {
-// Player player = state.getPlayer(playerId);
-// if (player != null && player.isInGame()) {
-// player.quit(this);
-// }
-// }
-// }
@Override
public synchronized void timerTimeout(UUID playerId) {
Player player = state.getPlayer(playerId);
@@ -1461,6 +1464,7 @@ public abstract class GameImpl implements Game, Serializable {
*/
public boolean checkTriggered() {
boolean played = false;
+ state.getTriggers().checkStateTriggers(this);
for (UUID playerId : state.getPlayerList(state.getActivePlayerId())) {
Player player = getPlayer(playerId);
while (player.isInGame()) { // player can die or win caused by triggered abilities or leave the game
@@ -1524,6 +1528,9 @@ public abstract class GameImpl implements Game, Serializable {
Iterator copiedCards = this.getState().getCopiedCards().iterator();
while (copiedCards.hasNext()) {
Card card = copiedCards.next();
+ if (card instanceof SplitCardHalf) {
+ continue; // only the main card is moves, not the halves
+ }
Zone zone = state.getZone(card.getId());
if (zone != Zone.BATTLEFIELD && zone != Zone.STACK) {
switch (zone) {
@@ -1886,11 +1893,11 @@ public abstract class GameImpl implements Game, Serializable {
}
@Override
- public void fireAskPlayerEvent(UUID playerId, String message) {
+ public void fireAskPlayerEvent(UUID playerId, MessageToClient message, Ability source) {
if (simulation) {
return;
}
- playerQueryEventSource.ask(playerId, message);
+ playerQueryEventSource.ask(playerId, message.getMessage(), source, addMessageToOptions(message, null));
}
@Override
@@ -1914,19 +1921,19 @@ public abstract class GameImpl implements Game, Serializable {
}
@Override
- public void fireSelectTargetEvent(UUID playerId, String message, Set targets, boolean required, Map options) {
+ public void fireSelectTargetEvent(UUID playerId, MessageToClient message, Set targets, boolean required, Map options) {
if (simulation) {
return;
}
- playerQueryEventSource.target(playerId, message, targets, required, options);
+ playerQueryEventSource.target(playerId, message.getMessage(), targets, required, addMessageToOptions(message, options));
}
@Override
- public void fireSelectTargetEvent(UUID playerId, String message, Cards cards, boolean required, Map options) {
+ public void fireSelectTargetEvent(UUID playerId, MessageToClient message, Cards cards, boolean required, Map options) {
if (simulation) {
return;
}
- playerQueryEventSource.target(playerId, message, cards, required, options);
+ playerQueryEventSource.target(playerId, message.getMessage(), cards, required, addMessageToOptions(message, options));
}
/**
@@ -2692,4 +2699,19 @@ public abstract class GameImpl implements Game, Serializable {
return enterWithCounters.get(sourceId);
}
+ private Map addMessageToOptions(MessageToClient message, Map options) {
+ if (message.getSecondMessage() != null) {
+ if (options == null) {
+ options = new HashMap<>();
+ }
+ options.put("secondMessage", message.getSecondMessage());
+ }
+ if (message.getHintText() != null) {
+ if (options == null) {
+ options = new HashMap<>();
+ }
+ options.put("hintText", message.getHintText());
+ }
+ return options;
+ }
}
diff --git a/Mage/src/mage/game/GameState.java b/Mage/src/mage/game/GameState.java
index 21824f7a41c..3b1bdd805ad 100644
--- a/Mage/src/mage/game/GameState.java
+++ b/Mage/src/mage/game/GameState.java
@@ -742,9 +742,11 @@ public class GameState implements Serializable, Copyable {
// TODO: add sources for triggers - the same way as in addEffect: sources
this.triggers.add((TriggeredAbility) ability, sourceId, attachedTo);
}
- for (Watcher watcher : ability.getWatchers()) {
- watcher.setControllerId(attachedTo.getOwnerId());
- watcher.setSourceId(attachedTo.getId());
+ List watcherList = new ArrayList<>(ability.getWatchers()); // Workaround to prevent ConcurrentModificationException, not clear to me why this is happening now
+ for (Watcher watcher : watcherList) {
+ // TODO: Check that watcher for commanderAbility (where attachedTo = null) also work correctly
+ watcher.setControllerId(attachedTo == null ? ability.getControllerId() : attachedTo.getOwnerId());
+ watcher.setSourceId(attachedTo == null ? ability.getSourceId() : attachedTo.getId());
watchers.add(watcher);
}
for (Ability sub : ability.getSubAbilities()) {
diff --git a/Mage/src/mage/game/events/PlayerQueryEvent.java b/Mage/src/mage/game/events/PlayerQueryEvent.java
index 6b299f2085e..ea9b9434512 100644
--- a/Mage/src/mage/game/events/PlayerQueryEvent.java
+++ b/Mage/src/mage/game/events/PlayerQueryEvent.java
@@ -149,8 +149,14 @@ public class PlayerQueryEvent extends EventObject implements ExternalEvent, Seri
this.playerId = playerId;
}
- public static PlayerQueryEvent askEvent(UUID playerId, String message) {
- return new PlayerQueryEvent(playerId, message, null, null, null, null, QueryType.ASK, 0, 0, false, null);
+ public static PlayerQueryEvent askEvent(UUID playerId, String message, Ability source, Map options) {
+ if (source != null) {
+ if (options == null) {
+ options = new HashMap<>();
+ }
+ options.put("originalId", source.getOriginalId());
+ }
+ return new PlayerQueryEvent(playerId, message, null, null, null, null, QueryType.ASK, 0, 0, false, options);
}
public static PlayerQueryEvent chooseAbilityEvent(UUID playerId, String message, String objectName, List extends ActivatedAbility> choices) {
diff --git a/Mage/src/mage/game/events/PlayerQueryEventSource.java b/Mage/src/mage/game/events/PlayerQueryEventSource.java
index 7620ed1657c..ea5f0aed97e 100644
--- a/Mage/src/mage/game/events/PlayerQueryEventSource.java
+++ b/Mage/src/mage/game/events/PlayerQueryEventSource.java
@@ -32,6 +32,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
+import mage.abilities.Ability;
import mage.abilities.ActivatedAbility;
import mage.abilities.TriggeredAbility;
import mage.cards.Card;
@@ -58,8 +59,8 @@ public class PlayerQueryEventSource implements EventSource, Se
dispatcher.removeAllListener();
}
- public void ask(UUID playerId, String message) {
- dispatcher.fireEvent(PlayerQueryEvent.askEvent(playerId, message));
+ public void ask(UUID playerId, String message, Ability source, Map options) {
+ dispatcher.fireEvent(PlayerQueryEvent.askEvent(playerId, message, source, options));
}
public void select(UUID playerId, String message) {
diff --git a/Mage/src/mage/game/permanent/token/EldraziScionToken.java b/Mage/src/mage/game/permanent/token/EldraziScionToken.java
new file mode 100644
index 00000000000..1b8e1cd6a74
--- /dev/null
+++ b/Mage/src/mage/game/permanent/token/EldraziScionToken.java
@@ -0,0 +1,55 @@
+/*
+ * 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.game.permanent.token;
+
+import mage.MageInt;
+import mage.Mana;
+import mage.abilities.costs.common.SacrificeSourceCost;
+import mage.abilities.mana.SimpleManaAbility;
+import mage.constants.CardType;
+import mage.constants.Zone;
+
+/**
+ *
+ * @author fireshoes
+ */
+public class EldraziScionToken extends Token {
+
+ public EldraziScionToken() {
+ super("Eldrazi Scion", "1/1 colorless Eldrazi Scion creature token with \"Sacrifice this creature: Add {1} to your mana pool.\"");
+ cardType.add(CardType.CREATURE);
+ subtype.add("Eldrazi");
+ subtype.add("Scion");
+ power = new MageInt(1);
+ toughness = new MageInt(1);
+ addAbility(new SimpleManaAbility(Zone.BATTLEFIELD, Mana.ColorlessMana, new SacrificeSourceCost()));
+ this.setOriginalExpansionSetCode("BFZ");
+ }
+
+}
diff --git a/Mage/src/mage/game/permanent/token/Token.java b/Mage/src/mage/game/permanent/token/Token.java
index 59d4727dbed..e60605b0892 100644
--- a/Mage/src/mage/game/permanent/token/Token.java
+++ b/Mage/src/mage/game/permanent/token/Token.java
@@ -137,7 +137,7 @@ public class Token extends MageObjectImpl {
return false;
}
lastAddedTokenIds.clear();
- // TODO: Check this setCode handling because it makes no sens if token put into play with e.g. "Feldon of the third Path"
+ // TODO: Check this setCode handling because it makes no sense if token put into play with e.g. "Feldon of the third Path"
Card source = game.getCard(sourceId);
String setCode;
if (this.getOriginalExpansionSetCode() != null && !this.getOriginalExpansionSetCode().isEmpty()) {
diff --git a/Mage/src/mage/game/permanent/token/ZombieToken.java b/Mage/src/mage/game/permanent/token/ZombieToken.java
index ab636da61fe..90b93810049 100644
--- a/Mage/src/mage/game/permanent/token/ZombieToken.java
+++ b/Mage/src/mage/game/permanent/token/ZombieToken.java
@@ -62,6 +62,9 @@ public class ZombieToken extends Token {
if (getOriginalExpansionSetCode().equals("ISD")) {
this.setTokenType(new Random().nextInt(3) + 1);
}
+ if (getOriginalExpansionSetCode().equals("C14")) {
+ this.setTokenType(2);
+ }
}
public ZombieToken(final ZombieToken token) {
diff --git a/Mage/src/mage/game/stack/Spell.java b/Mage/src/mage/game/stack/Spell.java
index 2adc38b5e2c..f51d8c3ed1c 100644
--- a/Mage/src/mage/game/stack/Spell.java
+++ b/Mage/src/mage/game/stack/Spell.java
@@ -197,9 +197,11 @@ public class Spell extends StackObjImpl implements Card {
}
}
if (game.getState().getZone(card.getMainCard().getId()) == Zone.STACK) {
- Player player = game.getPlayer(getControllerId());
- if (player != null) {
- player.moveCards(card, Zone.STACK, Zone.GRAVEYARD, ability, game);
+ if (isCopy() == card.isCopy()) {
+ Player player = game.getPlayer(getControllerId());
+ if (player != null) {
+ player.moveCards(card, Zone.STACK, Zone.GRAVEYARD, ability, game);
+ }
}
}
return result;
@@ -636,6 +638,10 @@ public class Spell extends StackObjImpl implements Card {
if (this.isCopiedSpell() && !zone.equals(Zone.STACK)) {
return true;
}
+ Card card = game.getCard(getSourceId());
+ if (card != null) {
+ return card.moveToZone(zone, sourceId, game, flag, appliedEffects);
+ }
throw new UnsupportedOperationException("Unsupported operation");
}
diff --git a/Mage/src/mage/players/Player.java b/Mage/src/mage/players/Player.java
index 5c960e650c2..eb3d7d70b2c 100644
--- a/Mage/src/mage/players/Player.java
+++ b/Mage/src/mage/players/Player.java
@@ -52,6 +52,7 @@ import mage.cards.Card;
import mage.cards.Cards;
import mage.cards.decks.Deck;
import mage.choices.Choice;
+import mage.constants.AbilityType;
import mage.constants.ManaType;
import mage.constants.Outcome;
import mage.constants.PlayerAction;
@@ -74,6 +75,7 @@ import mage.target.TargetAmount;
import mage.target.TargetCard;
import mage.target.common.TargetCardInLibrary;
import mage.util.Copyable;
+import mage.util.MessageToClient;
/**
*
@@ -191,6 +193,10 @@ public interface Player extends MageItem, Copyable {
boolean getPassedAllTurns();
+ AbilityType getJustActivatedType();
+
+ void setJustActivatedType(AbilityType abilityType);
+
boolean hasLost();
boolean hasWon();
@@ -451,6 +457,8 @@ public interface Player extends MageItem, Copyable {
boolean chooseUse(Outcome outcome, String message, Ability source, Game game);
+ boolean chooseUse(Outcome outcome, MessageToClient message, Ability source, Game game);
+
boolean choose(Outcome outcome, Choice choice, Game game);
boolean choosePile(Outcome outcome, String message, List extends Card> pile1, List extends Card> pile2, Game game);
@@ -661,6 +669,7 @@ public interface Player extends MageItem, Copyable {
* @param exileName name of exile zone (optional)
* @param sourceId
* @param game
+ * @param fromZone
* @param withName
* @return
*/
@@ -786,4 +795,6 @@ public interface Player extends MageItem, Copyable {
void setMatchPlayer(MatchPlayer matchPlayer);
MatchPlayer getMatchPlayer();
+
+ boolean scry(int value, Ability source, Game game);
}
diff --git a/Mage/src/mage/players/PlayerImpl.java b/Mage/src/mage/players/PlayerImpl.java
index 631b5614a3c..00d83fc7cfc 100644
--- a/Mage/src/mage/players/PlayerImpl.java
+++ b/Mage/src/mage/players/PlayerImpl.java
@@ -176,6 +176,7 @@ public abstract class PlayerImpl implements Player, Serializable {
* and abilities in the stack and will pass them as well.
*/
protected boolean passedAllTurns; // F9
+ protected AbilityType justActivatedType; // used to check if priority can be passed automatically
protected int turns;
protected int storedBookmark = -1;
@@ -317,6 +318,7 @@ public abstract class PlayerImpl implements Player, Serializable {
this.passedUntilStackResolved = player.passedUntilStackResolved;
this.dateLastAddedToStack = player.dateLastAddedToStack;
this.passedAllTurns = player.passedAllTurns;
+ this.justActivatedType = player.justActivatedType;
this.priorityTimeLeft = player.getPriorityTimeLeft();
this.reachedNextTurnAfterLeaving = player.reachedNextTurnAfterLeaving;
@@ -440,6 +442,7 @@ public abstract class PlayerImpl implements Player, Serializable {
this.skippedAtLeastOnce = false;
this.passedUntilStackResolved = false;
this.passedAllTurns = false;
+ this.justActivatedType = null;
this.canGainLife = true;
this.canLoseLife = true;
this.topCardRevealed = false;
@@ -841,7 +844,7 @@ public abstract class PlayerImpl implements Player, Serializable {
if (cards.size() != 0) {
if (!anyOrder) {
for (UUID objectId : cards) {
- moveObjectToLibrary(objectId, source.getSourceId(), game, false, false);
+ moveObjectToLibrary(objectId, source == null ? null : source.getSourceId(), game, false, false);
}
} else {
TargetCard target = new TargetCard(Zone.PICK, new FilterCard("card to put on the bottom of your library (last one chosen will be bottommost)"));
@@ -850,11 +853,11 @@ public abstract class PlayerImpl implements Player, Serializable {
this.choose(Outcome.Neutral, cards, target, game);
UUID targetObjectId = target.getFirstTarget();
cards.remove(targetObjectId);
- moveObjectToLibrary(targetObjectId, source.getSourceId(), game, false, false);
+ moveObjectToLibrary(targetObjectId, source == null ? null : source.getSourceId(), game, false, false);
target.clearChosen();
}
if (cards.size() == 1) {
- moveObjectToLibrary(cards.iterator().next(), source.getSourceId(), game, false, false);
+ moveObjectToLibrary(cards.iterator().next(), source == null ? null : source.getSourceId(), game, false, false);
}
}
}
@@ -875,9 +878,10 @@ public abstract class PlayerImpl implements Player, Serializable {
Cards cards = new CardsImpl(cardsToLibrary); // prevent possible ConcurrentModificationException
cards.addAll(cardsToLibrary);
if (cards.size() != 0) {
+ UUID sourceId = (source == null ? null : source.getSourceId());
if (!anyOrder) {
for (UUID cardId : cards) {
- moveObjectToLibrary(cardId, source.getSourceId(), game, true, false);
+ moveObjectToLibrary(cardId, sourceId, game, true, false);
}
} else {
TargetCard target = new TargetCard(Zone.PICK, new FilterCard("card to put on the top of your library (last one chosen will be topmost)"));
@@ -886,11 +890,11 @@ public abstract class PlayerImpl implements Player, Serializable {
this.choose(Outcome.Neutral, cards, target, game);
UUID targetObjectId = target.getFirstTarget();
cards.remove(targetObjectId);
- moveObjectToLibrary(targetObjectId, source.getSourceId(), game, true, false);
+ moveObjectToLibrary(targetObjectId, sourceId, game, true, false);
target.clearChosen();
}
if (cards.size() == 1) {
- moveObjectToLibrary(cards.iterator().next(), source.getSourceId(), game, true, false);
+ moveObjectToLibrary(cards.iterator().next(), sourceId, game, true, false);
}
}
}
@@ -1129,7 +1133,11 @@ public abstract class PlayerImpl implements Player, Serializable {
}
//if player has taken an action then reset all player passed flags
+ justActivatedType = null;
if (result) {
+ if (isHuman() && (ability.getAbilityType().equals(AbilityType.SPELL) || ability.getAbilityType().equals(AbilityType.ACTIVATED))) {
+ setJustActivatedType(ability.getAbilityType());
+ }
game.getPlayers().resetPassed();
}
return result;
@@ -2975,7 +2983,7 @@ public abstract class PlayerImpl implements Player, Serializable {
case BATTLEFIELD:
for (Card card : cards) {
fromZone = game.getState().getZone(card.getId());
- if (putOntoBattlefieldWithInfo(card, game, fromZone, source == null ? null : source.getSourceId(), false, !card.isFaceDown(game))) {
+ if (putOntoBattlefieldWithInfo(card, game, fromZone, source == null ? null : source.getSourceId(), false, card.isFaceDown(game))) {
successfulMovedCards.add(card);
}
}
@@ -2983,8 +2991,8 @@ public abstract class PlayerImpl implements Player, Serializable {
case LIBRARY:
for (Card card : cards) {
fromZone = game.getState().getZone(card.getId());
- boolean withName = fromZone.equals(Zone.BATTLEFIELD) || !card.isFaceDown(game);
- if (moveCardToLibraryWithInfo(card, source == null ? null : source.getSourceId(), game, fromZone, true, withName)) {
+ boolean hideCard = fromZone.equals(Zone.HAND) || fromZone.equals(Zone.LIBRARY);
+ if (moveCardToLibraryWithInfo(card, source == null ? null : source.getSourceId(), game, fromZone, true, !hideCard)) {
successfulMovedCards.add(card);
}
}
@@ -3245,6 +3253,16 @@ public abstract class PlayerImpl implements Player, Serializable {
return passedUntilStackResolved;
}
+ @Override
+ public AbilityType getJustActivatedType() {
+ return justActivatedType;
+ }
+
+ @Override
+ public void setJustActivatedType(AbilityType justActivatedType) {
+ this.justActivatedType = justActivatedType;
+ }
+
@Override
public void revokePermissionToSeeHandCards() {
usersAllowedToSeeHandCards.clear();
@@ -3284,4 +3302,27 @@ public abstract class PlayerImpl implements Player, Serializable {
public void abortReset() {
abort = false;
}
+
+ @Override
+ public boolean scry(int value, Ability source, Game game) {
+ game.informPlayers(getLogName() + " scries " + value);
+ Cards cards = new CardsImpl();
+ cards.addAll(getLibrary().getTopCards(game, value));
+ if (!cards.isEmpty()) {
+ String text;
+ if (cards.size() == 1) {
+ text = "card if you want to put it to the bottom of your library (Scry)";
+ } else {
+ text = "cards you want to put on the bottom of your library (Scry)";
+ }
+ TargetCard target = new TargetCard(0, cards.size(), Zone.LIBRARY, new FilterCard(text));
+ chooseTarget(Outcome.Benefit, cards, target, source, game);
+ putCardsOnBottomOfLibrary(new CardsImpl(target.getTargets()), game, source, true);
+ cards.removeAll(target.getTargets());
+ putCardsOnTopOfLibrary(cards, game, source, true);
+ }
+ game.fireEvent(new GameEvent(GameEvent.EventType.SCRY, getId(), source == null ? null : source.getSourceId(), getId(), value, true));
+ return true;
+ }
+
}
diff --git a/Mage/src/mage/players/net/UserData.java b/Mage/src/mage/players/net/UserData.java
index cb405e34dff..0e6e4017334 100644
--- a/Mage/src/mage/players/net/UserData.java
+++ b/Mage/src/mage/players/net/UserData.java
@@ -19,10 +19,14 @@ public class UserData implements Serializable {
protected boolean askMoveToGraveOrder;
protected boolean manaPoolAutomatic;
protected boolean manaPoolAutomaticRestricted;
+ protected boolean passPriorityCast;
+ protected boolean passPriorityActivation;
+ protected boolean autoOrderTrigger;
public UserData(UserGroup userGroup, int avatarId, boolean showAbilityPickerForced,
boolean allowRequestShowHandCards, boolean confirmEmptyManaPool, UserSkipPrioritySteps userSkipPrioritySteps,
- String flagName, boolean askMoveToGraveOrder, boolean manaPoolAutomatic, boolean manaPoolAutomaticRestricted) {
+ String flagName, boolean askMoveToGraveOrder, boolean manaPoolAutomatic, boolean manaPoolAutomaticRestricted,
+ boolean passPriorityCast, boolean passPriorityActivation, boolean autoOrderTrigger) {
this.groupId = userGroup.getGroupId();
this.avatarId = avatarId;
this.showAbilityPickerForced = showAbilityPickerForced;
@@ -33,6 +37,9 @@ public class UserData implements Serializable {
this.askMoveToGraveOrder = askMoveToGraveOrder;
this.manaPoolAutomatic = manaPoolAutomatic;
this.manaPoolAutomaticRestricted = manaPoolAutomaticRestricted;
+ this.passPriorityCast = passPriorityCast;
+ this.passPriorityActivation = passPriorityActivation;
+ this.autoOrderTrigger = autoOrderTrigger;
}
public void update(UserData userData) {
@@ -46,10 +53,13 @@ public class UserData implements Serializable {
this.askMoveToGraveOrder = userData.askMoveToGraveOrder;
this.manaPoolAutomatic = userData.manaPoolAutomatic;
this.manaPoolAutomaticRestricted = userData.manaPoolAutomaticRestricted;
+ this.passPriorityCast = userData.passPriorityCast;
+ this.passPriorityActivation = userData.passPriorityActivation;
+ this.autoOrderTrigger = userData.autoOrderTrigger;
}
public static UserData getDefaultUserDataView() {
- return new UserData(UserGroup.DEFAULT, 0, false, false, true, null, "world.png", false, true, true);
+ return new UserData(UserGroup.DEFAULT, 0, false, false, true, null, "world.png", false, true, true, false, false, false);
}
public void setGroupId(int groupId) {
@@ -132,4 +142,28 @@ public class UserData implements Serializable {
this.manaPoolAutomaticRestricted = manaPoolAutomaticRestricted;
}
+ public boolean isPassPriorityCast() {
+ return passPriorityCast;
+ }
+
+ public void setPassPriorityCast(boolean passPriorityCast) {
+ this.passPriorityCast = passPriorityCast;
+ }
+
+ public boolean isPassPriorityActivation() {
+ return passPriorityActivation;
+ }
+
+ public void setPassPriorityActivation(boolean passPriorityActivation) {
+ this.passPriorityActivation = passPriorityActivation;
+ }
+
+ public boolean isAutoOrderTrigger() {
+ return autoOrderTrigger;
+ }
+
+ public void setAutoOrderTrigger(boolean autoOrderTrigger) {
+ this.autoOrderTrigger = autoOrderTrigger;
+ }
+
}
diff --git a/Mage/src/mage/target/common/TargetCreatureOrPlayerAmount.java b/Mage/src/mage/target/common/TargetCreatureOrPlayerAmount.java
index c8f9eb2258c..33ea4c44808 100644
--- a/Mage/src/mage/target/common/TargetCreatureOrPlayerAmount.java
+++ b/Mage/src/mage/target/common/TargetCreatureOrPlayerAmount.java
@@ -1,41 +1,40 @@
/*
-* 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.
-*/
-
+ * 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.target.common;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
-import mage.constants.Zone;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.dynamicvalue.common.StaticValue;
+import mage.constants.Zone;
import mage.filter.Filter;
import mage.filter.common.FilterCreatureOrPlayer;
import mage.filter.common.FilterCreaturePermanent;
@@ -64,7 +63,7 @@ public class TargetCreatureOrPlayerAmount extends TargetAmount {
public TargetCreatureOrPlayerAmount(DynamicValue amount) {
super(amount);
this.zone = Zone.ALL;
- this.filter = new FilterCreatureOrPlayer();
+ this.filter = new FilterCreatureOrPlayer("creatures and/or players");
this.targetName = filter.getMessage();
}
@@ -124,7 +123,7 @@ public class TargetCreatureOrPlayerAmount extends TargetAmount {
public boolean canChoose(UUID sourceId, UUID sourceControllerId, Game game) {
int count = 0;
MageObject targetSource = game.getObject(sourceId);
- for (UUID playerId: game.getPlayer(sourceControllerId).getInRange()) {
+ for (UUID playerId : game.getPlayer(sourceControllerId).getInRange()) {
Player player = game.getPlayer(playerId);
if (player != null && player.canBeTargetedBy(targetSource, sourceControllerId, game) && filter.match(player, game)) {
count++;
@@ -133,7 +132,7 @@ public class TargetCreatureOrPlayerAmount extends TargetAmount {
}
}
}
- for (Permanent permanent: game.getBattlefield().getActivePermanents(new FilterCreaturePermanent(), sourceControllerId, game)) {
+ for (Permanent permanent : game.getBattlefield().getActivePermanents(new FilterCreaturePermanent(), sourceControllerId, game)) {
if (permanent.canBeTargetedBy(targetSource, sourceControllerId, game) && filter.match(permanent, sourceId, sourceControllerId, game)) {
count++;
if (count >= this.minNumberOfTargets) {
@@ -147,7 +146,7 @@ public class TargetCreatureOrPlayerAmount extends TargetAmount {
@Override
public boolean canChoose(UUID sourceControllerId, Game game) {
int count = 0;
- for (UUID playerId: game.getPlayer(sourceControllerId).getInRange()) {
+ for (UUID playerId : game.getPlayer(sourceControllerId).getInRange()) {
Player player = game.getPlayer(playerId);
if (player != null && filter.match(player, game)) {
count++;
@@ -156,7 +155,7 @@ public class TargetCreatureOrPlayerAmount extends TargetAmount {
}
}
}
- for (Permanent permanent: game.getBattlefield().getActivePermanents(new FilterCreaturePermanent(), sourceControllerId, game)) {
+ for (Permanent permanent : game.getBattlefield().getActivePermanents(new FilterCreaturePermanent(), sourceControllerId, game)) {
if (filter.match(permanent, null, sourceControllerId, game)) {
count++;
if (count >= this.minNumberOfTargets) {
@@ -171,13 +170,13 @@ public class TargetCreatureOrPlayerAmount extends TargetAmount {
public Set possibleTargets(UUID sourceId, UUID sourceControllerId, Game game) {
Set possibleTargets = new HashSet<>();
MageObject targetSource = game.getObject(sourceId);
- for (UUID playerId: game.getPlayer(sourceControllerId).getInRange()) {
+ for (UUID playerId : game.getPlayer(sourceControllerId).getInRange()) {
Player player = game.getPlayer(playerId);
if (player != null && player.canBeTargetedBy(targetSource, sourceControllerId, game) && filter.match(player, game)) {
possibleTargets.add(playerId);
}
}
- for (Permanent permanent: game.getBattlefield().getActivePermanents(new FilterCreaturePermanent(), sourceControllerId, game)) {
+ for (Permanent permanent : game.getBattlefield().getActivePermanents(new FilterCreaturePermanent(), sourceControllerId, game)) {
if (permanent.canBeTargetedBy(targetSource, sourceControllerId, game) && filter.match(permanent, sourceId, sourceControllerId, game)) {
possibleTargets.add(permanent.getId());
}
@@ -188,13 +187,13 @@ public class TargetCreatureOrPlayerAmount extends TargetAmount {
@Override
public Set possibleTargets(UUID sourceControllerId, Game game) {
Set possibleTargets = new HashSet<>();
- for (UUID playerId: game.getPlayer(sourceControllerId).getInRange()) {
+ for (UUID playerId : game.getPlayer(sourceControllerId).getInRange()) {
Player player = game.getPlayer(playerId);
if (player != null && filter.match(player, game)) {
possibleTargets.add(playerId);
}
}
- for (Permanent permanent: game.getBattlefield().getActivePermanents(new FilterCreaturePermanent(), sourceControllerId, game)) {
+ for (Permanent permanent : game.getBattlefield().getActivePermanents(new FilterCreaturePermanent(), sourceControllerId, game)) {
if (filter.match(permanent, null, sourceControllerId, game)) {
possibleTargets.add(permanent.getId());
}
@@ -205,12 +204,11 @@ public class TargetCreatureOrPlayerAmount extends TargetAmount {
@Override
public String getTargetedName(Game game) {
StringBuilder sb = new StringBuilder();
- for (UUID targetId: getTargets()) {
+ for (UUID targetId : getTargets()) {
Permanent permanent = game.getPermanent(targetId);
if (permanent != null) {
sb.append(permanent.getLogName()).append("(").append(getTargetAmount(targetId)).append(") ");
- }
- else {
+ } else {
Player player = game.getPlayer(targetId);
sb.append(player.getLogName()).append("(").append(getTargetAmount(targetId)).append(") ");
}
diff --git a/Mage/src/mage/util/MessageToClient.java b/Mage/src/mage/util/MessageToClient.java
new file mode 100644
index 00000000000..556bac450d4
--- /dev/null
+++ b/Mage/src/mage/util/MessageToClient.java
@@ -0,0 +1,56 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package mage.util;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class MessageToClient {
+
+ private String message;
+ private String secondMessage;
+ private String hintText;
+
+ public MessageToClient(String message) {
+ this(message, null);
+ }
+
+ public MessageToClient(String message, String secondMessage) {
+ this(message, secondMessage, null);
+ }
+
+ public MessageToClient(String message, String secondMessage, String hintText) {
+ this.message = message;
+ this.secondMessage = secondMessage;
+ this.hintText = hintText;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public String getSecondMessage() {
+ return secondMessage;
+ }
+
+ public String getHintText() {
+ return hintText;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public void setSecondMessage(String secondMessage) {
+ this.secondMessage = secondMessage;
+ }
+
+ public void setHintText(String hintText) {
+ this.hintText = hintText;
+ }
+
+}
diff --git a/Mage/src/mage/util/TreeNode.java b/Mage/src/mage/util/TreeNode.java
index 7463b7addc6..b9d4620629a 100644
--- a/Mage/src/mage/util/TreeNode.java
+++ b/Mage/src/mage/util/TreeNode.java
@@ -1,16 +1,16 @@
/*
* 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
@@ -20,12 +20,11 @@
* 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.util;
import java.util.ArrayList;
@@ -34,14 +33,16 @@ import java.util.List;
/**
*
* @author BetaSteward_at_googlemail.com
+ * @param
*/
public class TreeNode {
+
protected T data;
protected List> children;
public TreeNode() {
super();
- children = new ArrayList>();
+ children = new ArrayList<>();
}
public TreeNode(T data) {
@@ -70,7 +71,7 @@ public class TreeNode {
}
public void addChild(T child) {
- children.add(new TreeNode(child));
+ children.add(new TreeNode<>(child));
}
public void addChildAt(int index, TreeNode child) throws IndexOutOfBoundsException {
@@ -93,7 +94,7 @@ public class TreeNode {
return this.data;
}
- public void setData(T data) {
+ private void setData(T data) {
this.data = data;
}
@@ -116,10 +117,7 @@ public class TreeNode {
return false;
}
final TreeNode other = (TreeNode) obj;
- if (this.data != other.data && (this.data == null || !this.data.equals(other.data))) {
- return false;
- }
- return true;
+ return !(this.data != other.data && (this.data == null || !this.data.equals(other.data)));
}
}
diff --git a/Mage/src/mage/util/functions/AbilityApplier.java b/Mage/src/mage/util/functions/AbilityApplier.java
new file mode 100644
index 00000000000..9697b3d644f
--- /dev/null
+++ b/Mage/src/mage/util/functions/AbilityApplier.java
@@ -0,0 +1,59 @@
+/*
+ * 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.util.functions;
+
+import mage.MageObject;
+import mage.abilities.Ability;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class AbilityApplier extends ApplyToPermanent {
+
+ private final Ability ability;
+
+ public AbilityApplier(Ability ability) {
+ this.ability = ability;
+ }
+
+ @Override
+ public Boolean apply(Game game, Permanent permanent) {
+ permanent.addAbility(ability, game);
+ return true;
+ }
+
+ @Override
+ public Boolean apply(Game game, MageObject mageObject) {
+ mageObject.getAbilities().add(ability);
+ return true;
+ }
+
+}
diff --git a/Mage/src/mage/util/functions/ApplyToMageObject.java b/Mage/src/mage/util/functions/ApplyToMageObject.java
new file mode 100644
index 00000000000..0fc968079cb
--- /dev/null
+++ b/Mage/src/mage/util/functions/ApplyToMageObject.java
@@ -0,0 +1,40 @@
+/*
+ * 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.util.functions;
+
+import mage.MageObject;
+import mage.game.Game;
+
+/**
+ *
+ * @author LevelX2
+ */
+public abstract class ApplyToMageObject {
+
+ public abstract Boolean apply(Game game, MageObject mageObject);
+}
diff --git a/Mage/src/mage/util/functions/ApplyToPermanent.java b/Mage/src/mage/util/functions/ApplyToPermanent.java
index bd926f7a58f..6178a63f364 100644
--- a/Mage/src/mage/util/functions/ApplyToPermanent.java
+++ b/Mage/src/mage/util/functions/ApplyToPermanent.java
@@ -7,7 +7,7 @@ import mage.game.permanent.Permanent;
/**
* @author noxx
*/
-public abstract class ApplyToPermanent implements Serializable {
+public abstract class ApplyToPermanent extends ApplyToMageObject implements Serializable {
public abstract Boolean apply(Game game, Permanent permanent);
}
diff --git a/Mage/src/mage/util/functions/CardTypeApplier.java b/Mage/src/mage/util/functions/CardTypeApplier.java
new file mode 100644
index 00000000000..dcb8eeb8c33
--- /dev/null
+++ b/Mage/src/mage/util/functions/CardTypeApplier.java
@@ -0,0 +1,36 @@
+/*
+ * 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.util.functions;
+
+/**
+ *
+ * @author LevelX2
+ */
+public class CardTypeApplier {
+
+}
diff --git a/Mage/src/mage/util/functions/CopyTokenFunction.java b/Mage/src/mage/util/functions/CopyTokenFunction.java
index 001c8188202..d7b5496320e 100644
--- a/Mage/src/mage/util/functions/CopyTokenFunction.java
+++ b/Mage/src/mage/util/functions/CopyTokenFunction.java
@@ -61,24 +61,24 @@ public class CopyTokenFunction implements Function {
if (source instanceof PermanentToken) {
sourceObj = ((PermanentToken) source).getToken();
// to show the source image, the original values have to be used
- target.setOriginalExpansionSetCode(((Token)sourceObj).getOriginalExpansionSetCode());
- target.setOriginalCardNumber(((Token)sourceObj).getOriginalCardNumber());
- target.setCopySourceCard(((PermanentToken)source).getToken().getCopySourceCard());
+ target.setOriginalExpansionSetCode(((Token) sourceObj).getOriginalExpansionSetCode());
+ target.setOriginalCardNumber(((Token) sourceObj).getOriginalCardNumber());
+ target.setCopySourceCard(((PermanentToken) source).getToken().getCopySourceCard());
} else if (source instanceof PermanentCard) {
- if (((PermanentCard)source).isMorphed() || ((PermanentCard)source).isManifested()) {
+ if (((PermanentCard) source).isMorphed() || ((PermanentCard) source).isManifested()) {
MorphAbility.setPermanentToFaceDownCreature(target);
return target;
} else {
- sourceObj = ((PermanentCard) source).getCard();
- target.setOriginalExpansionSetCode(source.getExpansionSetCode());
- target.setOriginalCardNumber(source.getCardNumber());
- target.setCopySourceCard((Card)sourceObj);
+ sourceObj = ((PermanentCard) source).getCard();
+ target.setOriginalExpansionSetCode(source.getExpansionSetCode());
+ target.setOriginalCardNumber(source.getCardNumber());
+ target.setCopySourceCard((Card) sourceObj);
}
} else {
target.setOriginalExpansionSetCode(source.getExpansionSetCode());
target.setOriginalCardNumber(source.getCardNumber());
if (source instanceof Card) {
- target.setCopySourceCard((Card)source);
+ target.setCopySourceCard(source);
}
}
diff --git a/Mage/src/mage/util/functions/EmptyApplyToPermanent.java b/Mage/src/mage/util/functions/EmptyApplyToPermanent.java
index 08ef79f6292..6deffcc5601 100644
--- a/Mage/src/mage/util/functions/EmptyApplyToPermanent.java
+++ b/Mage/src/mage/util/functions/EmptyApplyToPermanent.java
@@ -1,5 +1,6 @@
package mage.util.functions;
+import mage.MageObject;
import mage.game.Game;
import mage.game.permanent.Permanent;
@@ -8,8 +9,15 @@ import mage.game.permanent.Permanent;
*/
public class EmptyApplyToPermanent extends ApplyToPermanent {
+ @Override
public Boolean apply(Game game, Permanent permanent) {
// do nothing
return true;
}
+
+ @Override
+ public Boolean apply(Game game, MageObject mageObject) {
+ return true;
+ }
+
}
diff --git a/Mage/src/mage/watchers/common/LandfallWatcher.java b/Mage/src/mage/watchers/common/LandfallWatcher.java
index f75d4c0d625..2b4df7a7a12 100644
--- a/Mage/src/mage/watchers/common/LandfallWatcher.java
+++ b/Mage/src/mage/watchers/common/LandfallWatcher.java
@@ -17,14 +17,14 @@ import mage.watchers.Watcher;
public class LandfallWatcher extends Watcher {
Set playerPlayedLand = new HashSet<>();
-
+
public LandfallWatcher() {
super("LandPlayed", WatcherScope.GAME);
}
public LandfallWatcher(final LandfallWatcher watcher) {
super(watcher);
- playerPlayedLand.addAll(playerPlayedLand);
+ playerPlayedLand.addAll(watcher.playerPlayedLand);
}
@Override
@@ -45,9 +45,9 @@ public class LandfallWatcher extends Watcher {
@Override
public void reset() {
playerPlayedLand.clear();
- super.reset();
+ super.reset();
}
-
+
public boolean landPlayed(UUID playerId) {
return playerPlayedLand.contains(playerId);
}
diff --git a/Mage/src/mage/watchers/common/ManaSpentToCastWatcher.java b/Mage/src/mage/watchers/common/ManaSpentToCastWatcher.java
index 608e809d930..197932e2daf 100644
--- a/Mage/src/mage/watchers/common/ManaSpentToCastWatcher.java
+++ b/Mage/src/mage/watchers/common/ManaSpentToCastWatcher.java
@@ -25,7 +25,6 @@
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
-
package mage.watchers.common;
import mage.Mana;
@@ -58,16 +57,16 @@ public class ManaSpentToCastWatcher extends Watcher {
@Override
public void watch(GameEvent event, Game game) {
- if (event.getType() == GameEvent.EventType.SPELL_CAST && event.getZone() == Zone.HAND) {
+ if (event.getType() == GameEvent.EventType.SPELL_CAST && event.getZone() == Zone.HAND) {
Spell spell = (Spell) game.getObject(event.getTargetId());
- if (this.getSourceId().equals(spell.getSourceId())) {
- payment = spell.getSpellAbility().getManaCostsToPay().getPayment();
+ if (spell != null && this.getSourceId().equals(spell.getSourceId())) {
+ payment = spell.getSpellAbility().getManaCostsToPay().getPayment();
}
}
if (event.getType() == GameEvent.EventType.ZONE_CHANGE && this.getSourceId().equals(event.getSourceId())) {
- if (((ZoneChangeEvent) event).getFromZone().equals(Zone.BATTLEFIELD)) {
- payment = null;
- }
+ if (((ZoneChangeEvent) event).getFromZone().equals(Zone.BATTLEFIELD)) {
+ payment = null;
+ }
}
}
diff --git a/Mage/src/mage/watchers/common/SoulbondWatcher.java b/Mage/src/mage/watchers/common/SoulbondWatcher.java
index 4806133c740..ffe63d93f6b 100644
--- a/Mage/src/mage/watchers/common/SoulbondWatcher.java
+++ b/Mage/src/mage/watchers/common/SoulbondWatcher.java
@@ -109,7 +109,7 @@ public class SoulbondWatcher extends Watcher {
Cards cards = new CardsImpl();
cards.add(chosen);
controller.lookAtCards("Soulbond", cards, game);
- if (controller.chooseUse(Outcome.Benefit, "Use Soulbond for recent " + permanent.getLogName() + "?", null, game)) {
+ if (controller.chooseUse(Outcome.Benefit, "Use Soulbond for recent " + permanent.getLogName() + "?", SoulbondAbility.getInstance(), game)) {
chosen.setPairedCard(permanent.getId());
permanent.setPairedCard(chosen.getId());
if (!game.isSimulation()) {
diff --git a/Utils/gen-card.pl b/Utils/gen-card.pl
index d18b670427a..880b8d13ab2 100755
--- a/Utils/gen-card.pl
+++ b/Utils/gen-card.pl
@@ -1,245 +1,247 @@
-#!/usr/bin/perl -w
-
-#author: North
-
-use Text::Template;
-use strict;
-
-
-my $authorFile = 'author.txt';
-my $dataFile = 'mtg-cards-data.txt';
-my $setsFile = 'mtg-sets-data.txt';
-my $knownSetsFile = 'known-sets.txt';
-my $keywordsFile = 'keywords.txt';
-
-
-my %cards;
-my %sets;
-my %knownSets;
-my %keywords;
-
-sub toCamelCase {
- my $string = $_[0];
- $string =~ s/\b([\w']+)\b/ucfirst($1)/ge;
- $string =~ s/[-,\s\']//g;
- $string;
-}
-
-sub fixCost {
- my $string = $_[0];
- $string =~ s/{([2BUGRW])([2BUGRW])}/{$1\/$2}/g;
- $string;
-}
-
-my $author;
-if (-e $authorFile) {
- open (DATA, $authorFile);
- $author = ;
- chomp $author;
- close(DATA);
-} else {
- $author = 'anonymous';
-}
-
-open (DATA, $dataFile) || die "can't open $dataFile";
-while(my $line = ) {
- my @data = split('\\|', $line);
- $cards{$data[0]}{$data[1]} = \@data;
-}
-close(DATA);
-
-open (DATA, $setsFile) || die "can't open $setsFile";
-while(my $line = ) {
- my @data = split('\\|', $line);
- $sets{$data[0]}= $data[1];
- #print "$data[0]--$data[1]\n"
-}
-close(DATA);
-
-open (DATA, $knownSetsFile) || die "can't open $knownSetsFile";
-while(my $line = ) {
- my @data = split('\\|', $line);
- $knownSets{$data[0]}= $data[1];
-}
-close(DATA);
-
-open (DATA, $keywordsFile) || die "can't open $keywordsFile";
-while(my $line = ) {
- my @data = split('\\|', $line);
- $keywords{toCamelCase($data[0])}= $data[1];
-}
-close(DATA);
-
-my %cardTypes;
-$cardTypes{'Artifact'} = 'CardType.ARTIFACT';
-$cardTypes{'Conspiracy'} = 'CardType.CONSPIRACY';
-$cardTypes{'Creature'} = 'CardType.CREATURE';
-$cardTypes{'Enchantment'} = 'CardType.ENCHANTMENT';
-$cardTypes{'Instant'} = 'CardType.INSTANT';
-$cardTypes{'Land'} = 'CardType.LAND';
-$cardTypes{'Sorcery'} = 'CardType.SORCERY';
-$cardTypes{'Planeswalker'} = 'CardType.PLANESWALKER';
-$cardTypes{'Tribal'} = 'CardType.TRIBAL';
-
-my %raritiesConversion;
-$raritiesConversion{'C'} = 'COMMON';
-$raritiesConversion{'U'} = 'UNCOMMON';
-$raritiesConversion{'R'} = 'RARE';
-$raritiesConversion{'M'} = 'MYTHIC';
-$raritiesConversion{'Special'} = 'SPECIAL';
-$raritiesConversion{'Bonus'} = 'BONUS';
-
-# Get card name
-my $cardName = $ARGV[0];
-if(!$cardName) {
- print 'Enter a card name: ';
- $cardName = ;
- chomp $cardName;
-}
-
-if (!exists $cards{$cardName}) {
- die "Card name doesn't exist: $cardName\n";
-}
-
-# Check if card is already implemented
-foreach my $setName (keys %{$cards{$cardName}}) {
- if (exists $knownSets{$setName}) {
- my $fileName = "../Mage.Sets/src/mage/sets/" . $knownSets{$setName} . "/" . toCamelCase($cardName) . ".java";
- if(-e $fileName) {
- die "$cardName is already implemented (set found in: $setName).\n";
- }
- }
-}
-
-# Generate the cards
-my $simpleOnly = $ARGV[1] || 'false';
-my $template = Text::Template->new(TYPE => 'FILE', SOURCE => 'cardClass.tmpl', DELIMITERS => [ '[=', '=]' ]);
-my $templateExtended = Text::Template->new(TYPE => 'FILE', SOURCE => 'cardExtendedClass.tmpl', DELIMITERS => [ '[=', '=]' ]);
-my %vars;
-
-$vars{'author'} = $author;
-$vars{'name'} = $cardName;
-$vars{'className'} = toCamelCase($cardName);
-
-if ($simpleOnly ne 'true') {
- print "Files generated:\n";
-}
-my $baseRarity = '';
-foreach my $setName (keys %{$cards{$cardName}}) {
- if (exists $knownSets{$setName}) {
- my $fileName = "../Mage.Sets/src/mage/sets/" . $knownSets{$setName} . "/" . toCamelCase($cardName) . ".java";
- my $result;
-
- $vars{'set'} = $knownSets{$setName};
- $vars{'expansionSetCode'} = $sets{$setName};
- $vars{'cardNumber'} = $cards{$cardName}{$setName}[2];
- $vars{'rarity'} = $raritiesConversion{$cards{$cardName}{$setName}[3]};
-
- if (!$baseRarity) {
- $baseRarity = $cards{$cardName}{$setName}[3];
-
- $vars{'manaCost'} = fixCost($cards{$cardName}{$setName}[4]);
- $vars{'power'} = $cards{$cardName}{$setName}[6];
- $vars{'toughness'} = $cards{$cardName}{$setName}[7];
-
- my @types;
- $vars{'subType'} = '';
- my $type = $cards{$cardName}{$setName}[5];
- while ($type =~ m/([a-zA-Z]+)( )*/g) {
- if (exists($cardTypes{$1})) {
- push(@types, $cardTypes{$1});
- } else {
- if (@types) {
- $vars{'subType'} .= "\n this.subtype.add(\"$1\");";
- } else {
- $vars{'subType'} .= "\n this.supertype.add(\"$1\");";
- }
- }
- }
- $vars{'type'} = join(', ', @types);
-
- $vars{'abilitiesImports'} = '';
- $vars{'abilities'} = '';
-
- my @abilities = split('\$', $cards{$cardName}{$setName}[8]);
- foreach my $ability (@abilities) {
- $ability =~ s/ .+?<\/i>//g;
-
- my $notKeyWord;
- foreach my $keyword (keys %keywords) {
- if (toCamelCase($ability) =~ m/^$keyword(?=[A-Z{\d]|$)/g) {
- $notKeyWord = 'false';
- my @ka = split(', ', $ability);
- foreach my $kw (@ka) {
- my $kwUnchanged = $kw;
- foreach my $kk (keys %keywords) {
- if (toCamelCase($kw) =~ m/^$kk(?=[A-Z{\d]|$)/g) {
- $kw = $kk;
- }
- }
- if ($keywords{$kw}) {
- $vars{'abilities'} .= "\n // " . ucfirst($kwUnchanged);
- if ($keywords{$kw} eq 'instance') {
- $vars{'abilities'} .= "\n this.addAbility(" . $kw . "Ability.getInstance());";
- } elsif ($keywords{$kw} eq 'new') {
- $vars{'abilities'} .= "\n this.addAbility(new " . $kw . "Ability());";
- } elsif ($keywords{$kw} eq 'number') {
- $ability =~ m/(\b\d+?\b)/g;
- $vars{'abilities'} .= "\n this.addAbility(new " . $kw . 'Ability(' . $1 . '));';
- } elsif ($keywords{$kw} eq 'cost') {
- $ability =~ m/({.*})/g;
- $vars{'abilities'} .= "\n this.addAbility(new " . $kw . 'Ability(new ManaCostsImpl("' . fixCost($1) . '")));';
- $vars{'abilitiesImports'} .= "\nimport mage.abilities.costs.mana.ManaCostsImpl;";
- } elsif ($keywords{$kw} eq 'card, manaString') {
- $ability =~ m/({.*})/g;
- $vars{'abilities'} .= "\n this.addAbility(new " . $kw . 'Ability(this, "' . fixCost($1) . '"));';
- } elsif ($keywords{$kw} eq 'card, cost') {
- $ability =~ m/({.*})/g;
- $vars{'abilities'} .= "\n this.addAbility(new " . $kw . 'Ability(this, new ManaCostsImpl("' . fixCost($1) . '")));';
- $vars{'abilitiesImports'} .= "\nimport mage.abilities.costs.mana.ManaCostsImpl;";
- }
-
-
- $vars{'abilitiesImports'} .= "\nimport mage.abilities.keyword." . $kw . "Ability;";
- } else {
- $vars{'abilities'} .= "\n // $kwUnchanged";
- if ($simpleOnly eq 'true') {
- exit 0;
- }
- }
- }
- }
- }
-
- if (!$notKeyWord) {
- $vars{'abilities'} .= "\n // $ability";
- if ($simpleOnly eq 'true') {
- exit 0;
- }
- }
- }
- if ($vars{'abilities'}) {
- $vars{'abilities'} = "\n" . $vars{'abilities'};
- }
-
- $vars{'baseSet'} = $vars{'set'};
- $vars{'baseClassName'} = $vars{'className'};
-
- $result = $template->fill_in(HASH => \%vars);
- } else {
- $vars{'rarityExtended'} = '';
- if ($baseRarity ne $cards{$cardName}{$setName}[3]) {
- $vars{'rarityExtended'} = "\n this.rarity = Rarity.$raritiesConversion{$cards{$cardName}{$setName}[3]};";
- }
- $result = $templateExtended->fill_in(HASH => \%vars);
- }
-
- open CARD, "> $fileName";
- print CARD $result;
- close CARD;
-
- print "$vars{'set'}.$vars{'className'}\n";
- } else {
- print "Set not found in known sets: $setName\n";
- }
-}
+#!/usr/bin/perl -w
+
+#author: North
+
+use Text::Template;
+use strict;
+
+
+my $authorFile = 'author.txt';
+my $dataFile = 'mtg-cards-data.txt';
+my $setsFile = 'mtg-sets-data.txt';
+my $knownSetsFile = 'known-sets.txt';
+my $keywordsFile = 'keywords.txt';
+
+
+my %cards;
+my %sets;
+my %knownSets;
+my %keywords;
+
+sub toCamelCase {
+ my $string = $_[0];
+ $string =~ s/\b([\w']+)\b/ucfirst($1)/ge;
+ $string =~ s/[-,\s\']//g;
+ $string;
+}
+
+sub fixCost {
+ my $string = $_[0];
+ $string =~ s/{([2BUGRW])([2BUGRW])}/{$1\/$2}/g;
+ $string;
+}
+
+my $author;
+if (-e $authorFile) {
+ open (DATA, $authorFile);
+ $author = ;
+ chomp $author;
+ close(DATA);
+} else {
+ $author = 'anonymous';
+}
+
+open (DATA, $dataFile) || die "can't open $dataFile";
+while(my $line = ) {
+ my @data = split('\\|', $line);
+ $cards{$data[0]}{$data[1]} = \@data;
+}
+close(DATA);
+
+open (DATA, $setsFile) || die "can't open $setsFile";
+while(my $line = ) {
+ my @data = split('\\|', $line);
+ $sets{$data[0]}= $data[1];
+ #print "$data[0]--$data[1]\n"
+}
+close(DATA);
+
+open (DATA, $knownSetsFile) || die "can't open $knownSetsFile";
+while(my $line = ) {
+ my @data = split('\\|', $line);
+ $knownSets{$data[0]}= $data[1];
+}
+close(DATA);
+
+open (DATA, $keywordsFile) || die "can't open $keywordsFile";
+while(my $line = ) {
+ my @data = split('\\|', $line);
+ $keywords{toCamelCase($data[0])}= $data[1];
+}
+close(DATA);
+
+my %cardTypes;
+$cardTypes{'Artifact'} = 'CardType.ARTIFACT';
+$cardTypes{'Conspiracy'} = 'CardType.CONSPIRACY';
+$cardTypes{'Creature'} = 'CardType.CREATURE';
+$cardTypes{'Enchantment'} = 'CardType.ENCHANTMENT';
+$cardTypes{'Instant'} = 'CardType.INSTANT';
+$cardTypes{'Land'} = 'CardType.LAND';
+$cardTypes{'Sorcery'} = 'CardType.SORCERY';
+$cardTypes{'Planeswalker'} = 'CardType.PLANESWALKER';
+$cardTypes{'Tribal'} = 'CardType.TRIBAL';
+
+my %raritiesConversion;
+$raritiesConversion{'C'} = 'COMMON';
+$raritiesConversion{'U'} = 'UNCOMMON';
+$raritiesConversion{'R'} = 'RARE';
+$raritiesConversion{'M'} = 'MYTHIC';
+$raritiesConversion{'Special'} = 'SPECIAL';
+$raritiesConversion{'Bonus'} = 'BONUS';
+
+# Get card name
+my $cardName = $ARGV[0];
+if(!$cardName) {
+ print 'Enter a card name: ';
+ $cardName = ;
+ chomp $cardName;
+}
+
+if (!exists $cards{$cardName}) {
+ die "Card name doesn't exist: $cardName\n";
+}
+
+# Check if card is already implemented
+foreach my $setName (keys %{$cards{$cardName}}) {
+ if (exists $knownSets{$setName}) {
+ my $fileName = "../Mage.Sets/src/mage/sets/" . $knownSets{$setName} . "/" . toCamelCase($cardName) . ".java";
+ if(-e $fileName) {
+ die "$cardName is already implemented (set found in: $setName).\n";
+ }
+ }
+}
+
+# Generate the cards
+my $simpleOnly = $ARGV[1] || 'false';
+my $template = Text::Template->new(TYPE => 'FILE', SOURCE => 'cardClass.tmpl', DELIMITERS => [ '[=', '=]' ]);
+my $templateExtended = Text::Template->new(TYPE => 'FILE', SOURCE => 'cardExtendedClass.tmpl', DELIMITERS => [ '[=', '=]' ]);
+my %vars;
+
+$vars{'author'} = $author;
+$vars{'name'} = $cardName;
+$vars{'className'} = toCamelCase($cardName);
+
+if ($simpleOnly ne 'true') {
+ print "Files generated:\n";
+}
+my $baseRarity = '';
+foreach my $setName (keys %{$cards{$cardName}}) {
+ if (exists $knownSets{$setName}) {
+ my $fileName = "../Mage.Sets/src/mage/sets/" . $knownSets{$setName} . "/" . toCamelCase($cardName) . ".java";
+ my $result;
+
+ $vars{'set'} = $knownSets{$setName};
+ $vars{'expansionSetCode'} = $sets{$setName};
+ $vars{'cardNumber'} = $cards{$cardName}{$setName}[2];
+ $vars{'rarity'} = $raritiesConversion{$cards{$cardName}{$setName}[3]};
+
+ if (!$baseRarity) {
+ $baseRarity = $cards{$cardName}{$setName}[3];
+
+ $vars{'manaCost'} = fixCost($cards{$cardName}{$setName}[4]);
+ $vars{'power'} = $cards{$cardName}{$setName}[6];
+ $vars{'toughness'} = $cards{$cardName}{$setName}[7];
+
+ my @types;
+ $vars{'subType'} = '';
+ my $type = $cards{$cardName}{$setName}[5];
+ while ($type =~ m/([a-zA-Z]+)( )*/g) {
+ if (exists($cardTypes{$1})) {
+ push(@types, $cardTypes{$1});
+ } else {
+ if (@types) {
+ $vars{'subType'} .= "\n this.subtype.add(\"$1\");";
+ } else {
+ $vars{'subType'} .= "\n this.supertype.add(\"$1\");";
+ }
+ }
+ }
+ $vars{'type'} = join(', ', @types);
+
+ $vars{'abilitiesImports'} = '';
+ $vars{'abilities'} = '';
+
+ my @abilities = split('\$', $cards{$cardName}{$setName}[8]);
+ foreach my $ability (@abilities) {
+ $ability =~ s/ .+?<\/i>//g;
+
+ my $notKeyWord;
+ foreach my $keyword (keys %keywords) {
+ if (toCamelCase($ability) =~ m/^$keyword(?=[A-Z{\d]|$)/g) {
+ $notKeyWord = 'false';
+ my @ka = split(', ', $ability);
+ foreach my $kw (@ka) {
+ my $kwUnchanged = $kw;
+ foreach my $kk (keys %keywords) {
+ if (toCamelCase($kw) =~ m/^$kk(?=[A-Z{\d]|$)/g) {
+ $kw = $kk;
+ }
+ }
+ if ($keywords{$kw}) {
+ $vars{'abilities'} .= "\n // " . ucfirst($kwUnchanged);
+ if ($keywords{$kw} eq 'instance') {
+ $vars{'abilities'} .= "\n this.addAbility(" . $kw . "Ability.getInstance());";
+ } elsif ($keywords{$kw} eq 'new') {
+ $vars{'abilities'} .= "\n this.addAbility(new " . $kw . "Ability());";
+ } elsif ($keywords{$kw} eq 'color') {
+ $vars{'abilities'} .= "\n this.addAbility(new " . $kw . "Ability(this.color));";
+ } elsif ($keywords{$kw} eq 'number') {
+ $ability =~ m/(\b\d+?\b)/g;
+ $vars{'abilities'} .= "\n this.addAbility(new " . $kw . 'Ability(' . $1 . '));';
+ } elsif ($keywords{$kw} eq 'cost') {
+ $ability =~ m/({.*})/g;
+ $vars{'abilities'} .= "\n this.addAbility(new " . $kw . 'Ability(new ManaCostsImpl("' . fixCost($1) . '")));';
+ $vars{'abilitiesImports'} .= "\nimport mage.abilities.costs.mana.ManaCostsImpl;";
+ } elsif ($keywords{$kw} eq 'card, manaString') {
+ $ability =~ m/({.*})/g;
+ $vars{'abilities'} .= "\n this.addAbility(new " . $kw . 'Ability(this, "' . fixCost($1) . '"));';
+ } elsif ($keywords{$kw} eq 'card, cost') {
+ $ability =~ m/({.*})/g;
+ $vars{'abilities'} .= "\n this.addAbility(new " . $kw . 'Ability(this, new ManaCostsImpl("' . fixCost($1) . '")));';
+ $vars{'abilitiesImports'} .= "\nimport mage.abilities.costs.mana.ManaCostsImpl;";
+ }
+
+
+ $vars{'abilitiesImports'} .= "\nimport mage.abilities.keyword." . $kw . "Ability;";
+ } else {
+ $vars{'abilities'} .= "\n // $kwUnchanged";
+ if ($simpleOnly eq 'true') {
+ exit 0;
+ }
+ }
+ }
+ }
+ }
+
+ if (!$notKeyWord) {
+ $vars{'abilities'} .= "\n // $ability";
+ if ($simpleOnly eq 'true') {
+ exit 0;
+ }
+ }
+ }
+ if ($vars{'abilities'}) {
+ $vars{'abilities'} = "\n" . $vars{'abilities'};
+ }
+
+ $vars{'baseSet'} = $vars{'set'};
+ $vars{'baseClassName'} = $vars{'className'};
+
+ $result = $template->fill_in(HASH => \%vars);
+ } else {
+ $vars{'rarityExtended'} = '';
+ if ($baseRarity ne $cards{$cardName}{$setName}[3]) {
+ $vars{'rarityExtended'} = "\n this.rarity = Rarity.$raritiesConversion{$cards{$cardName}{$setName}[3]};";
+ }
+ $result = $templateExtended->fill_in(HASH => \%vars);
+ }
+
+ open CARD, "> $fileName";
+ print CARD $result;
+ close CARD;
+
+ print "$vars{'set'}.$vars{'className'}\n";
+ } else {
+ print "Set not found in known sets: $setName\n";
+ }
+}
diff --git a/Utils/keywords.txt b/Utils/keywords.txt
index 0e7ad4bea2d..dd3fd7f5942 100644
--- a/Utils/keywords.txt
+++ b/Utils/keywords.txt
@@ -11,6 +11,7 @@ Dash|card, manaString|
Deathtouch|instance|
Delve|new|
Dethrone|new|
+Devoid|color|
Defender|instance|
Double Strike|instance|
Dredge|number|
@@ -32,6 +33,7 @@ Hexproof|instance|
Indestructible|instance|
Infect|instance|
Intimidate|instance|
+Ingest|new|
Islandcycling|cost|
Islandwalk|new|
Level up|cost|
diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt
index c170305f4a4..06fed5fb28b 100644
--- a/Utils/mtg-cards-data.txt
+++ b/Utils/mtg-cards-data.txt
@@ -5893,6 +5893,7 @@ Path to Exile|Friday Night Magic|182|U|{W}|Instant|||Exile target creature. Its
Serum Visions|Friday Night Magic|183|C|{U}|Sorcery|||Draw a card.$Scry 2. (To scry 2, look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.)|
Orator of Ojutai|Friday Night Magic|184|U|{1}{W}|Creature - Bird Monk|0|4|Defneder, flying$As an additional cost to cast Orator of Ojutai, you may reveal a Dragon card from your hand.$When Orator of Ojutai enters the battlefield, if you revealed a Dragon card or controlled a Dragon as you cast Orator of Ojutai, draw a card.|
Ultimate Price|Friday Night Magic|185|U|{1}{B}|Instant|||Destroy target monocolored creature.|
+Roast|Friday Night Magic|186|U|{1}{R}|Sorcery|||Roast deals 5 damage to target creature without flying.|
Angel of Salvation|Future Sight|1|R|{6}{W}{W}|Creature - Angel|5|5|Flash; convoke (Each creature you tap while casting this spell reduces its cost by {1} or by one mana of that creature's color.)$Flying$When Angel of Salvation enters the battlefield, prevent the next 5 damage that would be dealt this turn to any number of target creatures and/or players, divided as you choose.|
Knight of Sursi|Future Sight|10|C|{3}{W}|Creature - Human Knight|2|2|Flying; flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.)$Suspend 3-{W} (Rather than cast this card from your hand, you may pay {W} and exile it with three time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.)|
Haze of Rage|Future Sight|100|U|{1}{R}|Sorcery|||Buyback {2} (You may pay an additional {2} as you cast this spell. If you do, put this card into your hand as it resolves.)$Creatures you control get +1/+0 until end of turn.$Storm (When you cast this spell, copy it for each spell cast before it this turn.)|
@@ -6119,6 +6120,8 @@ Scaleguard Sentinels|Game Day|43|U|{G}{G}|Creature - Human Soldier|2|3|As an add
Thunderbreak Regent|Game Day|44|R|{2}{R}{R}|Creature - Dragon|4|4|Flying$Whenever a Dragon you control becomes the target of a spell or ability your opponent controls, Thunderbreak Regent deals 3 damage to that player.|
Conclave Naturalists|Game Day|45|U|{4}{G}|Creature - Dryad|4|4|When Conclave Naturalists enters the battlefield, you may destroy target artifact or enchantment.|
Languish|Game Day|46|R|{2}{B}{B}|Sorcery|||All creatures get -4/-4 until end of turn.|
+Stasis Snare|Game Day|47|U|{1}{W}{W}|Enchantment|||Flash$When Stasis Snare enters the battlefield, exile target creature an opponent controls until Stasis Snare leaves the battlefield.|
+Radiant Flames|Game Day|48|R|{2}{R}|Sorcery||Converge - Radiant Flames deals X damage to each creature, where X is the number of colors of mana spent to cast Radiant Flames.|
Aerial Maneuver|Gatecrash|1|C|{1}{W}|Instant|||Target creature gets +1/+1 and gains flying and first strike until end of turn.|
Debtor's Pulpit|Gatecrash|10|U|{4}{W}|Enchantment - Aura|||Enchant land$Enchanted land has "{tap}: Tap target creature."|
Massive Raid|Gatecrash|100|C|{1}{R}{R}|Instant|||Massive Raid deals damage to target creature or player equal to the number of creatures you control.|
@@ -7813,6 +7816,7 @@ Damnation|Judge Promo|94|R|{2}{B}{B}|Sorcery|||Destroy all creatures. They can't
Dualcaster Mage|Judge Promo|95|R|{1}{R}{R}|Creature - Human Wizard|2|2|Flash$When Dualcaster Mage enters the battlefield, copy target instant or sorcery spell. You may choose new targets for the copy.|
Feldon of the Third Path|Judge Promo|96|M|{1}{R}{R}|Legendary Creature - Human Artificer|2|3|{2}{R}, {tap}: Put a token onto the battlefield that's a copy of target creature card in your graveyard, except it's an artifact in addition to its other types. It gains haste. Sacrifice it at the beginning of the next end step.|
Ravages of War|Judge Promo|97|R|{3}{W}|Sorcery|||Destroy all lands.|
+Rishadan Port|Judge Promo|98|R||Land|||{tap}: Add {1} to your mana pool.$${1}, {tap}: Tap target land.|
Ancestor's Chosen|Judgment|1|U|{5}{W}{W}|Creature - Human Cleric|4|4|First strike (This creature deals combat damage before creatures without first strike.)$When Ancestor's Chosen enters the battlefield, you gain 1 life for each card in your graveyard.|
Funeral Pyre|Judgment|10|C|{W}|Instant|||Exile target card from a graveyard. Its owner puts a 1/1 white Spirit creature token with flying onto the battlefield.|
Spellgorger Barbarian|Judgment|100|C|{3}{R}|Creature - Human Nightmare Barbarian|3|1|When Spellgorger Barbarian enters the battlefield, discard a card at random.$When Spellgorger Barbarian leaves the battlefield, draw a card.|
@@ -24050,6 +24054,7 @@ In Garruk's Wake|Launch Party|28|R|{7}{B}{B}|Sorcery|||Destroy all creatures you
Sandsteppe Mastodon|Launch Party|29|R|{5}{G}{G}|Creature - Elephant|5|5|Reach$When Sandsteppe Mastodon enters the battlefield, bolster 5. (Choose a creature with the least toughness among creatures you control and put five +1/+1 counters on it.)|
Deathbringer Regent|Launch Party|30|R|{5}{B}{B}|Creature - Dragon|5|6|Flying$When Deathbringer Regent enters the battlefield, if you cast it from your hand and there are five or more other creatures on the battlefield, destroy all other creatures.|
Mizzium Meddler|Launch Party|31|R|{2}{U}|Creature - Vedalken Wizard|1|4|Flash (You may cast this spell any time you could cast an instant.)$When Mizzium Meddler enters the battlefield, you may change a target of target spell or ability to Mizzium Meddler.|
+Blight Herder|Launch Party|32|R|{5}|Creature - Eldrazi Processor|4|5|When you cast Blight Herder, you may put two cards your opponents own from exile into their owners' graveyards. If you do, put three 1/1 colorless Eldrazi Scion creature tokens onto the battlefield. They have "Sacrifice this creature: Add {1} to your mana pool."|
Ancestral Recall|Vintage Masters|1|Bonus|{U}|Instant|||Target player draws three cards.|
Afterlife|Vintage Masters|10|C|{2}{W}|Instant|||Destroy target creature. It can't be regenerated. Its controller puts a 1/1 white Spirit creature token with flying onto the battlefield.|
Upheaval|Vintage Masters|100|M|{4}{U}{U}|Sorcery|||Return all permanents to their owners' hands.|
@@ -25379,7 +25384,35 @@ Nissa, Worldwaker|Media Inserts|103|Special|{3}{G}{G}|Planeswalker - Nissa||3|+1
Garruk, Apex Predator|Media Inserts|104|Special|{5}{B}{G}|Planeswalker - Garruk||5|+1: Destroy another target planeswalker.$+1: Put a 3/3 black Beast creature token with deathtouch onto the battlefield.$-3: Destroy target creature. You gain life equal to its toughness.$-8: Target opponent gets an emblem with "Whenever a creature attacks you, it gets +5/+5 and gains trample until end of turn."|
Shamanic Revelation|Media Inserts|105|Special|{2}{G}{G}|Sorcery|||Draw a card for each creature you control.$Ferocious - You gain 4 life for each creature you control with power 4 or greater.|
Ojutai's Command|Media Inserts|106|Special|{2}{W}{U}|Instant|||Choose two - Return target creature card with converted mana cost 2 or less from your graveyard to the battlefield; or You gain 4 life; or Counter target creature spell; or Draw a card.|
-Relic Seeker|Media Inserts|107|Special|{1}{W}|Creature - Human Soldier|2|2|Renown 1 (When this creature deals combat damage to a player, if it isn't renowned, put a +1/+1 counter on it and it becomes renowned.)$When Relic Seeker becomes renowned, you may search your library for an Equipment card, reveal it, put it into your hand, then shuffle your library.|
+Dragonscale General|Media Inserts|107|Special|{3}{W}|Creature - Human Warrior|2|3|At the beginning of your end step, bolster X, where X is the number of tapped creatures you control. (Choose a creature with the least toughness among creatures you control and put X +1/+1 counters on it.)|
+Sage-Eye Avengers|Media Inserts|108|Special|{4}{U}{U}|Creature - Djinn Monk|4|5|Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.)$Whenever Sage-Eye Avengers attacks, you may return target creature to its owner's hand if its power is less than Sage-Eye Avengers's power.|
+Archfiend of Depravity|Media Inserts|109|Special|{3}{B}{B}|Creature - Demon|5|4|Flying$At the beginning of each opponent's end step, that player chooses up to two creatures he or she controls, then sacrifices the rest.|
+Flamerush Rider|Media Inserts|110|Special|{4}{R}|Creature - Human Warrior|3|3|Whenever Flamerush Rider attacks, put a token onto the battlefield tapped and attacking that's a copy of another target attacking creature. Exile the token at end of combat.$Dash {2}{R}{R} (You may cast this spell for its dash cost. If you do, it gains haste, and it's returned from the battlefield to its owner's hand at the beginning of the next end step.)|
+Temur War Shaman|Media Inserts|111|Special|{4}{G}{G}|Creature - Human Shaman|4|5|When Temur War Shaman enters the battlefield, manifest the top card of your library. (Put that card onto the battlefield face down as a 2/2 creature. Turn it face up any time for its mana cost if it's a creature card.)$Whenever a permanent you control is turned face up, if it's a creature, you may have it fight target creature you don't control.|
+Arashin Sovereign|Media Inserts|112|Special|{5}{G}{W}|Creature - Dragon|6|6|Flying$When Arashin Sovereign dies, you may put it on the top or bottom of its owner's library.|
+Pristine Skywise|Media Inserts|113|Special|{4}{W}{U}|Creature - Dragon|6|4|Flying$Whenever you cast a noncreature spell, untap Pristine Skywise. It gains protection from the color of your choice until the end of turn.|
+Necromaster Dragon|Media Inserts|114|Special|{3}{U}{B}|Creature - Dragon|4|4|Flying$Whenever Necromaster Dragon deals combat damage to a player, you may pay {2}. If you do, put a 2/2 black Zombie creature token onto the battlefield and each opponent puts the top two cards of his or her library into his or her graveyard.|
+Boltwing Marauder|Media Inserts|115|Special|{3}{B}{R}|Creature - Dragon|5|4|Flying$Whenever another creature enters the battlefield under your control, target creature gets +2/+0 until end of turn.|
+Harbinger of the Hunt|Media Inserts|116|Special|{3}{R}{G}|Creature - Dragon|5|3|Flying${2}{R}: Harbinger of the Hunt deals 1 damage to each creature without flying.${2}{G}: Harbinger of the Hunt deals 1 damage to each other creature with flying.|
+Sultai Charm|Media Inserts|117|Special|{B}{G}{U}|Instant|||Choose one -$ Destroy target monocolored creature.$ Destroy target artifact or enchantment.$ Draw two cards, then discard a card.|
+Aeronaut Tinkerer|Media Inserts|118|C|{2}{U}|Creature - Human Artificer|2|3|Aeronaut Tinkerer has flying as long as you control an artifact.|
+Dragon Fodder|Media Inserts|119|C|{1}{R}|Sorcery|||Put two 1/1 red Goblin creature tokens onto the battlefield.|
+Dragonlord's Servant|Media Inserts|120|Special|{1}{R}|Creature - Goblin Shaman|1|3|Dragon spells you cast cost {1} less to cast.|
+Evolving Wilds|Media Inserts|121|C||Land|||{tap}, Sacrifice Evolving Wilds: Search your library for a basic land card and put it onto the battlefield tapped. Then shuffle your library.|
+Foe-Razer Regent|Media Inserts|122|Special|{5}{G}{G}|Creature - Dragon|4|5|Flying$When Foe-Razer Regent enters the battlefield, you may have it fight target creature you don't control.$Whenever a creature you control fights, put two +1/+1 counters on it at the beginning of the next end step.|
+Relic Seeker|Media Inserts|123|Special|{1}{W}|Creature - Human Soldier|2|2|Renown 1 (When this creature deals combat damage to a player, if it isn't renowned, put a +1/+1 counter on it and it becomes renowned.)$When Relic Seeker becomes renowned, you may search your library for an Equipment card, reveal it, put it into your hand, then shuffle your library.|
+Kytheon, Hero of Akros|Media Inserts|124|Special|{W}|Legendary Creature - Human Soldier|2|1|At end of combat, if Kytheon, Hero of Akros and at least two other creatures attacked this combat, exile Kytheon, then return him to the battlefield transformed under his owner's control.${2}{W}: Kytheon gains indestructible until end of turn.|
+Gideon, Battle-Forged|Media Inserts|124|Special||Planeswalker - Gideon|3|+2: Up to one target creature an opponent controls attacks Gideon, Battle-Forged during its controller's next turn if able.$+1: Until your next turn, target creature gains indestructible. Untap that creature.$0: Until end of turn, Gideon, Battle-Forged becomes a 4/4 Human Soldier creature with indestructible that's still a planeswalker. Prevent all damage that would be dealt to him this turn.|
+Jace, Vryn's Prodigy|Media Inserts|125|Special|{1}{U}|Legendary Creature - Human Wizard|0|2|{T}: Draw a card, then discard a card. If there are five or more cards in your graveyard, exile Jace, Vryn''s Prodigy, then return him to the battefield transformed under his owner's control. |
+Jace, Telepath Unbound|Media Inserts|125|Special||Planeswalker - Jace|5|+1: Up to one target creature gets -2/-0 until your next turn.$-3: You may cast target instant or sorcery card from your graveyard this turn. If that card would be put into your graveyard this turn, exile it instead.$-9: You get an emblem with "Whenever you cast a spell, target opponent puts the top five cards of his or her library into his or her graveyard". |
+Liliana, Heretical Healer|Media Inserts|126|Special|{1}{B}{B}|Legendary Creature - Human Cleric|2|3|Lifelink$Whenever another nontoken creature you control dies, exile Liliana Heretical Healer, then return her to the battlefield transformed under her owner's control. If you do, put a 2/2 black Zombie creature token onto the battlefield.|
+Liliana, Defiant Necromancer|Media Inserts|126|Special||Planeswalker - Liliana|3|+2: Each player discards a card.$-X: Return target nonlegendary creature with converted mana cost X from your graveyard to the battlefield.$-8: You get an emblem with "Whenever a creature you control dies, return it to the battlefield under your control at the beginning of the next end step."|
+Chandra, Fire of Kaladesh|Media Inserts|127|Special|{1}{R}{R}|Legendary Creature - Human Shaman|2|2|Whenever you cast a red spell, untap Chandra, Fire of Kaladesh.${T}: Chandra, Fire of Kaladesh deals 1 damage to target player. If Chandra has dealt 3 or more damage this turn, exile her, then return her to the battlefield transformed under her owner's control.|
+Chandra, Roaring Flame|Media Inserts|127|Special||Planeswalker - Chandra|4|+1: Chandra, Roaring Flame deals 2 damage to target player.$-2: Chandra, Roaring Flame deals 2 damage to target creature.$-7: Chandra, Roaring Flame deals 6 damage to each opponent. Each player dealt damage this way gets an emblem with "At the beginning of your upkeep, this emblem deals 3 damage to you."|
+Nissa, Vastwood Seer|Media Inserts|128|Special|{2}{G}|Legendary Creature - Elf Scout|2|2|When Nissa, Vastwood Seer enters the battlefield, you may search your library for a basic Forest card, reveal it, put it into your hand, then shuffle your library.$Whenever a land enters the battlefield under your control, if you control seven or more lands, exile Nissa, then return her to the battlefield transformed under her owner's control.|
+Nissa, Sage Animist|Media Inserts|128|Special||Planeswalker - Nissa|3|+1: Reveal the top card of your library. If it's a land card, put it onto the battlefield. Otherwise, put it into your hand.$-2: Put a legendary 4/4 green Elemental creature token named Ashaya, the Awoken World onto the battlefield.$-7: Untap up to six target lands. They become 6/6 Elemental creatures. They're still lands.|
+Ruinous Path|Media Inserts|129|Special|{1}{B}{B}|Sorcery|||Destroy target creature or planeswalker.$Awaken 4-{5}{B}{B} (If you cast this spell for {5}{B}{B}, also put four +1/+1 counters on target land you control and it becomes a 0/0 Elemental creature with haste. It's still a land.)|
+Scythe Leopard|Media Inserts|130|Special|{G}|Creature - Cat|1|1|Landfall-Whenever a land enters the battlefield under your control, Scythe Leopard gets +1/+1 until end of turn.|
Sultai|Media Inserts|999|Special|{{U}{B}{G}|Legendary Creature - Placeholder|2|2||
Wood Elves|WPN Gateway|1|Special|{2}{G}|Creature — Elf Scout|1|1|When Wood Elves enters the battlefield, search your library for a Forest card and put that card onto the battlefield. Then shuffle your library.|
Icatian Javelineers|WPN Gateway|2|Special|{W}|Creature — Human Soldier|1|1|Icatian Javelineers enters the battlefield with a javelin counter on it.${T}, Remove a javelin counter from Icatian Javelineers: Icatian Javelineers deals 1 damage to target creature or player.|
@@ -27323,10 +27356,85 @@ Swamp|Duel Decks: Zendikar vs. Eldrazi|72|L||Basic Land - Swamp|||B|
Mountain|Duel Decks: Zendikar vs. Eldrazi|73|L||Basic Land - Mountain|||M|
Mountain|Duel Decks: Zendikar vs. Eldrazi|74|L||Basic Land - Mountain|||M|
Mountain|Duel Decks: Zendikar vs. Eldrazi|75|L||Basic Land - Mountain|||M|
-Sheer Drop|Battle for Zendikar|999|C|{2}{W}|Sorcery|||Destroy target tapped creature.$Awaken 3-{5}{W} (If you cast this spell for {5}{W}, also put three +1/+1 counters on target land you control and it becomes a 0/0 Elemental creature with haste. It's still a land.)|
-Dominator Drone|Battle for Zendikar|999|C|{2}{B}|Creature - Eldrazi Drone|3|2|Devoid (This card has no color.)$Ingest (Whenever this creature deals combat damage to a player, that player exiles the top card of his or her library.)$When Dominator Drone enters the battlefield, if you control another colorless creature, each opponent loses 2 life.|
-Retreat to Kazandu|Battle for Zendikar|999||U|{2}{G}|Enchantment|||Landfall-Whenever a land enters the battlefield under your control, choose one - Put a +1/+1 counter on target creature; or You gain 2 life.|
-Forerunner of Slaughter|Battle for Zendikar|999|U|{B}{R}|Creature - Eldrazi Drone|3|2|Devoid (This card has no color.)${1}: Target colorless creature gains haste until end of turn.|
-Veteran Warleader|Battle for Zendikar|999|R|{1}{G}{W}|Creature - Human Soldier Ally|0|0|Veteran Warleader's power and toughness are each equal to the number of creatures you control.$Tap another untapped Ally you control: Veteran Warleader gains your choice of first strike, vigilance, or trample until end of turn.|
-Oblivion Sower|Battle for Zendikar|999|M|{6}|Creature - Eldrazi|5|8|When you cast Oblivion Sower, target opponent exiles the top four cards of his or her library, then you may put any number of land cards that player owns from exile onto the battlefield under your control.|
-Evolving Wilds|Battle for Zendikar|236|C||Land|||{T}, Sacrifice Evolving Wilds: Search your library for a basic land card and put it onto the battlefield tapped. Then shuffle your library.|
\ No newline at end of file
+Blight Herder|Battle for Zendikar|2|R|{5}|Creature - Eldrazi Processor|4|5|When you cast Blight Herder, you may put two cards your opponents own from exile into their owners' graveyards. If you do, put three 1/1 colorless Eldrazi Scion creature tokens onto the battlefield. They have "Sacrifice this creature: Add {1} to your mana pool."|
+Breaker of Armies|Battle for Zendikar|3|U|{8}|Creature - Eldrazi|10|8|All creatures able to block Breaker of Armies do so.|
+Conduit of Ruin|Battle for Zendikar|4|R|{6}|Creature - Eldrazi|5|5|When you cast Conduit of Ruin, you may search your library for a colorless creature card with converted mana cost 7 or greater. If you do, shuffle your library, then put that card on top.|
+Deathless Behemoth|Battle for Zendikar|5|R|{6}|Creature - Eldrazi|6|6|Vigilance$Sacrifice two Eldrazi Scions: Return Deathless Behemoth from your graveyard to your hand. Activate this ability only any time you could cast a sorcery.|
+Desolation Twin|Battle for Zendikar|6|R|{10}|Creature - Eldrazi|10|10|When you cast Desolation Twin, put a 10/10 colorless Eldrazi creature token onto the battlefield.|
+Eldrazi Devastator|Battle for Zendikar|7|C|{8}|Creature - Eldrazi|8|9|Trample|
+Kozilek's Channeler|Battle for Zendikar|10|C|{5}|Creature - Eldrazi|4|4|{T}: Add {2} to your mana pool.|
+Oblivion Sower|Battle for Zendikar|11|M|{6}|Creature - Eldrazi|5|8|When you cast Oblivion Sower, target opponent exiles the top four cards of his or her library, then you may put any number of land cards that player owns from exile onto the battlefield under your control.|
+Titan's Presence|Battle for Zendikar|14|U|{3}|Instant|||As an additional cost to cast Titan's Presence, reveal a colorless creature card from your hand.$Exile target creature if its power is less than or equal to the revealed card's power.|
+Ulamog, the Ceaseless Hunger|Battle for Zendikar|15|M|{10}|Legendary Creature - Eldrazi|10|10|When you cast Ulamog, the Ceaseless Hunger, exile two target permanents.$Indestructible$Whenever Ulamog attacks, defending player exiles the top twenty cards of his or her library.|
+Felidar Cub|Battle for Zendikar|25|C|{1}{W}|Creature - Cat Beast|2|2|Sacrifice Felidar Cub: Destroy target enchantment.|
+Gideon, Ally of Zendikar|Battle for Zendikar|29|M|{2}{W}{W}|Planeswalker - Gideon|||+1: Until end of turn, Gideon, Ally of Zendikar becomes a 5/5 Human Soldier Ally creature with indestructible that's still a planeswalker. Prevent all damage that would be dealt to him this turn.$0: Put a 2/2 white Knight Ally creature token onto the battlefield.$-4: You get an emblem with "Creatures you control get +1/+1."|
+Gideon's Reproach|Battle for Zendikar|30|C|{1}{W}|Instant|||Gideon's Reproach deals 4 damage to target attacking or blocking creature.|
+Hero of Goma Fada|Battle for Zendikar|31|R|{4}{W}|Creature - Human Knight Ally|4|3|Rally - Whenever Hero of Goma Fada or another Ally enters the battlefield under your control, creatures you control gain indestructible until end of turn.|
+Lantern Scout|Battle for Zendikar|37|R|{2}{W}|Creature - Human Scout Ally|3|2|Rally - Whenever Lantern Scout or another Ally enters the battlefield under your control, creatures you control gain lifelink until end of turn.|
+Planar Outburst|Battle for Zendikar|42|R|{3}{W}{W}|Sorcery|||Destroy all nonland creatures.$Awaken 4-{5}{W}{W}{W} If you cast this spell for {5}{W}{W}{W}, also put four +1/+1 counters on target land you control and it becomes a 0/0 Elemental creature with haste. It's still a land.)|
+Retreat to Emeria|Battle for Zendikar|44|U|{3}{W}|Enchantment|||Landfall - Whenever a land enters the battlefield under you control, choose one - Put a 1/1 white Kor Ally creature token onto the battlefield; or Creatures you control get +1/+1 until end of turn.|
+Sheer Drop|Battle for Zendikar|48|C|{2}{W}|Sorcery|||Destroy target tapped creature.$Awaken 3-{5}{W} (If you cast this spell for {5}{W}, also put three +1/+1 counters on target land you control and it becomes a 0/0 Elemental creature with haste. It's still a land.)|
+Stasis Snare|Battle for Zendikar|50|U|{1}{W}{W}|Enchantment|||Flash$When Stasis Snare enters the battlefield, exile target creature an opponent controls until Stasis Snare leaves the battlefield.|
+Tandem Tactics|Battle for Zendikar|52|C|{1}{W}|Instant|||Up to two target creatures each get +1/+2 until end of turn. You gain 2 life.|
+Drowner of Hope|Battle for Zendikar|57|R|{5}{U}|Creature - Eldrazi|5|5|Devoid (This card has no color.)$When Drowner of Hope enters the battlefield, put two 1/1 colorless Eldrazi Scion creature tokens onto the battlefield. They have "Sacrifice this creature: Add {1} to your mana pool."$Sacrifice an Eldrazi Scion: Tap target creature.|
+Incubator Drone|Battle for Zendikar|60|C|{3}{U}|Creature - Eldrazi Drone|2|3|Devoid (This card has no color.)$Whenever Incubator Drone enters the battlefield, put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has "Sacrifice this creature: Add {1} to your mana pool."|
+Mist Intruder|Battle for Zendikar|61|C|{1}{U}|Creature - Eldrazi Drone|1|2|Devoid (This card has no color.)$Flying$Ingest (Whenever this creature deals combat damage to a player, that player exiles the top card of his or her library.)|
+Coastal Discovery|Battle for Zendikar|73|U|{3}{U}|Sorcery|||Draw two cards.$Awaken 4 - {5}U} If you cast this spell for {5}{U}, also put four +1/+1 counters on target land you control and it becomes a 0/0 Elemental creature with haste. It's still a land.)|
+Guardian of Tazeem|Battle for Zendikar|78|R|{3}{U}{U}|Creature - Sphinx|4|5|Flying$Landfall - Whenever a land enters the battlefield under your control, tap target creature an opponent controls. If that land is an Island, that creature doesn't untap during its controller's next untap step.|
+Dominator Drone|Battle for Zendikar|92|C|{2}{B}|Creature - Eldrazi Drone|3|2|Devoid (This card has no color.)$Ingest (Whenever this creature deals combat damage to a player, that player exiles the top card of his or her library.)$When Dominator Drone enters the battlefield, if you control another colorless creature, each opponent loses 2 life.|
+Skitterskin|Battle for Zendikar|97|U|{3}{B}|Creature - Eldrazi Drone|4|3|Devoid (This card has no color.)$Skitterskin can't block.${1}{B}: Regenerate Skitterskin. Activate this ability only if you control another colorless creature.|
+Smothering Abomination|Battle for Zendikar|99|R|{2}{B}{B}|Creature - Eldrazi|4|3|Devoid (This card has no color.)$Flying$At the beginning of your upkeep, sacrifice a creature.$Whenever you sacrifice a creature, draw a card.|
+Defiant Bloodlord|Battle for Zendikar|107|R|{5}{B}{B}|Creature - Vampire|4|5|Flying$Whenever you gain life, target opponent loses that much life.|
+Ob Nixilis Reignited|Battle for Zendikar|119|M|{3}{B}{B}|Planeswalker - Nixilis|||+1: You draw a card and you lose 1 life.$-3: Destroy target creature.$-8: Target opponent gets an emblem with "Whenever a player draws a card, you lose 2 life."|
+Ruinous Path|Battle for Zendikar|123|R|{1}{B}{B}|Sorcery|||Destroy target creature or planeswalker.$Awaken 4-{5}{B}{B} (If you cast this spell for {5}{B}{B}, also put four +1/+1 counters on target land you control and it becomes a 0/0 Elemental creature with haste. It's still a land.)|
+Barrage Tyrant|Battle for Zendikar|127|R|{4}{R}|Creature - Eldrazi|5|3|Devoid (This card has no color.)${2}{R}, Sacrifice another colorless creature: Barrage Tyrant deals damage equal to the sacrificed creature's power to target creature or player.|
+Radiant Flames|Battle for Zendikar|151|R|{2}{R}|Sorcery||Converge - Radiant Flames deals X damage to each creature, where X is the number of colors of mana spent to cast Radiant Flames.|
+Rolling Thunder|Battle for Zendikar|154|U|{X}{R}{R}|Sorcery|||Rolling Thunder deals X damage divided as you choose among any number of target creatures and/or players.|
+Zada, Hedron Grinder|Battle for Zendikar|162|R|{3}{R}|Legendary Creature - Goblin Ally|3|3|Whenever you cast an instant or sorcery spell that targets only Zada, Hedron Grinder, copy that spell for each other creature you control that the spell could target. Each copy targets a different one of those creatures.|
+Nissa's Renewal|Battle for Zendikar|180|R|{5}{G}|Sorcery|||Search your library for up to three basic land cards, put them onto the battlefield tapped, then shuffle your library. You gain 7 life.|
+Oran-Rief Hydra|Battle for Zendikar|181|R|{4}{G}{G}|Creature - Hydra|5|5|Trample$Landfall - Whenever a land enters the battlefield under your control, put a +1/+1 counter on Oran-Rief Hydra. If that land is a Forest, put two +1/+1 counters on Oran-Rief Hydra instead.|
+Retreat to Kazandu|Battle for Zendikar|186||U|{2}{G}|Enchantment|||Landfall-Whenever a land enters the battlefield under your control, choose one - Put a +1/+1 counter on target creature; or You gain 2 life.|
+Scythe Leopard|Battle for Zendikar|188|U|{G}|Creature - Cat|1|1|Landfall-Whenever a land enters the battlefield under your control, Scythe Leopard gets +1/+1 until end of turn.|
+Tajuru Warcaller|Battle for Zendikar|195|U|{3}{G}{G}|Creature - Elf Warrior Ally|2|1|Rally-Whenever Tajuru Warcaller or another Ally enters the battlefield under your control, creatures you control get +2/+2 until end of turn.|
+Undergrowth Champion|Battle for Zendikar|197|M|{1}{G}{G}|Creature - Elemental|2|2|If damage would be dealt to Undergrowth Champion while it has a +1/+1 counter on it, prevent that damage and remove a +1/+1 counter from Undergrowth Champion.$Landfall-Whenever a land enters the battlefield under your control, put a +1/+1 counter on Undergrowth Champion.|
+Brood Butcher|Battle for Zendikar|199|R|{3}{B}{G}|Creature - Eldrazi Drone|3|3|Devoid (This card has no color.)$When Brood Butcher enters the battlefield, put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has "Sacrifice this creature: Add {1} to your mana pool."${B}{G}, Sacrifice a creature: Target creature gets -2/-2 until end of turn.|
+Fathom Feeder|Battle for Zendikar|203|R|{U}{B}|Creature - Eldrazi Drone|1|1|Devoid (This card has no color.)$Deathtouch$Ingest Whenever this creature deals combat damage to a player, that player exiles the top card of his or her library.)${3}{U}{B}: Draw a card. Each opponent exiles the top card of his or her library.|
+Forerunner of Slaughter|Battle for Zendikar|204|U|{B}{R}|Creature - Eldrazi Drone|3|2|Devoid (This card has no color.)${1}: Target colorless creature gains haste until end of turn.|
+Bring to Light|Battle for Zendikar|209|R|{3}{G}{U}|Sorcery|||Converge-Search your library for a creature, instant, or sorcery card with converted mana cost less than or equal to the number of colors of mana spent to cast Bring to Light, exile that card, then shuffle your library. You may cast that card without paying its mana cost.|
+Kiora, Master of the Depths|Battle for Zendikar|213|M|{2}{G}{U}|Planeswalker - Kiora|||+1: Untap up to one target creature and up to one target land.$-2: Reveal the top four cards of your library. You may put a creature card and/or a land card from among them into your hand. Put the rest into your graveyard.$-8: You get an emblem with "Whenever a creature enters the battlefield under your control, you may have it fight target creature." Then put three 8/8 blue Octopus creature tokens onto the battlefield.|
+Omnath, Locus of Rage|Battle for Zendikar|217|M|{3}{R}{R}{G}{G}|Legendary Creature - Elemental|5|5|Landfall - Whenever a land enters the battlefield under your control, put a 5/5 red and green Elemental creature token onto the battlefield.$Whenever Omnath, Locus of Rage or another Elemental you control dies, Omnath deals 3 damage to target creature or player.|
+Veteran Warleader|Battle for Zendikar|221|R|{1}{G}{W}|Creature - Human Soldier Ally|0|0|Veteran Warleader's power and toughness are each equal to the number of creatures you control.$Tap another untapped Ally you control: Veteran Warleader gains your choice of first strike, vigilance, or trample until end of turn.|
+Hedron Archive|Battle for Zendikar|223|U|{4}|Artifact|||{T}: Add {2} to your mana pool.${2}, {T}, Sacrifice Hedron Archive: Draw two cards.|
+Canopy Vista|Battle for Zendikar|234|R||Land - Forest Plains|||Canopy Vista enters the battlefield tapped unless you control two or more basic lands.|
+Cinder Glade|Battle for Zendikar|235|R||Land - Mountain Forest|||Cinder Glade enters the battlefield tapped unless you control two or more basic lands.|
+Evolving Wilds|Battle for Zendikar|236|C||Land|||{T}, Sacrifice Evolving Wilds: Search your library for a basic land card and put it onto the battlefield tapped. Then shuffle your library.|
+Lumbering Falls|Battle for Zendikar|239|R||Land|||Lumbering Falls enters the battlefield tapped.${T}: Add {G} or {U} to your mana pool.${2}{G}{U}: Lumbering Falls becomes a 3/3 green and blue Elemental creature with hexproof until end of turn. It's still a land.|
+Prairie Stream|Battle for Zendikar|241|R||Land - Plains Island|||Prairie Stream enters the battlefield tapped unless you control two or more basic lands.|
+Shrine of the Forsaken Gods|Battle for Zendikar|245|R||Land|||{T}: Add {1} to your mana pool.${T}: Add {2} to your mana pool. Spend this mana only to cast colorless spells. Activate this ability only if you control seven or more lands.|
+Smoldering Marsh|Battle for Zendikar|247|R||Land - Swamp Mountain|||Smoldering Marsh enters the battlefield tapped unless you control two or more basic lands.|
+Sunken Hollow|Battle for Zendikar|248|R||Land - Island Swamp|||Sunken Hollow enters the battlefield tapped unless you control two or more basic lands.|
+Plains|Battle for Zendikar|250|L||Basic Land - Forest|||W|
+Plains|Battle for Zendikar|251|L||Basic Land - Forest|||W|
+Plains|Battle for Zendikar|252|L||Basic Land - Forest|||W|
+Plains|Battle for Zendikar|253|L||Basic Land - Forest|||W|
+Plains|Battle for Zendikar|254|L||Basic Land - Forest|||W|
+Island|Battle for Zendikar|255|L||Basic Land - Forest|||U|
+Island|Battle for Zendikar|256|L||Basic Land - Forest|||U|
+Island|Battle for Zendikar|257|L||Basic Land - Forest|||U|
+Island|Battle for Zendikar|258|L||Basic Land - Forest|||U|
+Island|Battle for Zendikar|259|L||Basic Land - Forest|||U|
+Swamp|Battle for Zendikar|260|L||Basic Land - Forest|||B|
+Swamp|Battle for Zendikar|261|L||Basic Land - Forest|||B|
+Swamp|Battle for Zendikar|262|L||Basic Land - Forest|||B|
+Swamp|Battle for Zendikar|263|L||Basic Land - Forest|||B|
+Swamp|Battle for Zendikar|264|L||Basic Land - Forest|||B|
+Mountain|Battle for Zendikar|265|L||Basic Land - Forest|||R|
+Mountain|Battle for Zendikar|266|L||Basic Land - Forest|||R|
+Mountain|Battle for Zendikar|267|L||Basic Land - Forest|||R|
+Mountain|Battle for Zendikar|268|L||Basic Land - Forest|||R|
+Mountain|Battle for Zendikar|269|L||Basic Land - Forest|||R|
+Forest|Battle for Zendikar|270|L||Basic Land - Forest|||G|
+Forest|Battle for Zendikar|271|L||Basic Land - Forest|||G|
+Forest|Battle for Zendikar|272|L||Basic Land - Forest|||G|
+Forest|Battle for Zendikar|273|L||Basic Land - Forest|||G|
+Forest|Battle for Zendikar|274|L||Basic Land - Forest|||G|
\ No newline at end of file
diff --git a/Utils/release/getting_implemented_cards.txt b/Utils/release/getting_implemented_cards.txt
index 98eacef81cd..8afd05edc21 100644
--- a/Utils/release/getting_implemented_cards.txt
+++ b/Utils/release/getting_implemented_cards.txt
@@ -20,8 +20,9 @@ git log 6d8378d5e49629a2fa126baf84340156a28f25db..HEAD --diff-filter=A --name-st
since 1.4.3.v3
git log 23039572f2206ade860f5835e9b85e82a9c4b2a1..HEAD --diff-filter=A --name-status | sed -ne "s/^A[^u]Mage.Sets\/src\/mage\/sets\///p" | sort > added_cards.txt
-since 1.4.3.v2
-git log 6d8378d5e49629a2fa126baf84340156a28f25db..23039572f2206ade860f5835e9b85e82a9c4b2a1 --diff-filter=A --name-status | sed -ne "s/^A[^u]Mage.Sets\/src\/mage\/sets\///p" | sort > added_cards.txt
+
+since 1.4.4.v0
+git log 0a458707ddaaa5e7e82ab06d17633084f67077c1..23039572f2206ade860f5835e9b85e82a9c4b2a1 --diff-filter=A --name-status | sed -ne "s/^A[^u]Mage.Sets\/src\/mage\/sets\///p" | sort > added_cards.txt
3. Copy added_cards.txt to trunk\Utils folder
diff --git a/pom.xml b/pom.xml
index 4cde514dc42..a61ec477f15 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
org.mage
mage-root
- 1.4.3
+ 1.4.4
pom
Mage Root
Mage Root POM
@@ -73,7 +73,7 @@
- 1.4.3
+ 1.4.4
UTF-8